text: Caterpillar Company Profile (NYSE:CAT) Analyst Ratings Earnings Estimates Dividends Insider Trades Headlines Social Company Profile Chart Analyst Ratings Consensus Ratings for Caterpillar (NYSE:CAT) (?) The ratings breakdown includes the most recent rating from each analyst that has rated the stock within the last twelve months. The ratings score is a calculation of the average number of sell, hold, buy and strong buy ratings (0-1.5 = Sell, 1.5-2.5 = Hold, 2.5-3.5 = Buy, >3.5 = Strong Buy). The consensus price target is a mean average of the most recent price target set by each analyst that has set a price target for the stock in the last twelve months.Ratings Breakdown: 4 Sell Rating(s), 13 Hold Rating(s), 7 Buy Rating(s)Consensus Rating:Hold (Score: 2.13)Consensus Price Target: $69.65 (12.26% downside) Analysts' Ratings History for Caterpillar (NYSE:CAT) Show: All Ratings For This Stock Only the Most Recent Rating From Each Brokerage DateFirmActionRatingPrice TargetActions7/13/2016Credit Suisse Group AGReiterated RatingBuy$87.00 6/21/2016Jefferies GroupReiterated RatingHold$69.00 5/31/2016Citigroup Inc.Reiterated RatingNeutral$75.00 5/23/2016Axiom SecuritiesReiterated RatingSell 4/27/2016Bank of America Corp.Reiterated RatingNeutral$81.00 4/26/2016ArgusUpgradeHold -> Buy$92.00 4/25/2016Royal Bank Of CanadaBoost Price TargetSell -> Sector Perform$68.00 -> $70.00 4/25/2016Goldman Sachs Group Inc.UpgradeSell -> Neutral$62.00 -> $78.00 4/15/2016Vertical GroupUpgradeBuy 4/15/2016Vertical ResearchUpgradeHold -> Buy 4/14/2016Barclays PLCReiterated RatingHold 4/10/2016MacquarieReiterated RatingSell$51.00 3/24/2016OTR GlobalUpgradeMixed -> Positive 3/22/2016BMO Capital MarketsBoost Price TargetMarket Perform$60.00 -> $68.00 3/18/2016JPMorgan Chase & Co.Reiterated RatingHold$60.00 2/20/2016William BlairReiterated RatingHold$60.00 1/29/2016Robert W. BairdLower Price TargetNeutral$72.00 -> $69.00 12/16/2015Deutsche Bank AGDowngradeBuy -> Hold$80.00 -> $60.00 11/23/2015Societe GeneraleBoost Price TargetBuy$81.00 -> $82.00 10/27/2015Raymond James Financial Inc.Reiterated Rating$70.00 10/23/2015S&P Equity ResearchDowngradeSell$72.00 -> $64.00 10/23/2015SusquehannaLower Price TargetNeutral$81.00 -> $71.00 9/25/2015Stifel NicolausLower Price TargetBuy$92.00 -> $86.00 7/27/2015Tigress FinancialDowngradeNeutral -> Underperform 5/26/2015Longbow ResearchReiterated RatingHold 1/28/2015Atlantic SecuritiesDowngradeNeutral -> Underweight 1/5/2015Evercore ISIDowngradeBuy -> Hold$112.00 -> $84.00 9/16/2014Morgan StanleyDowngradeEqual Weight$100.00 (Data available from 7/25/2014 forward) Earnings Earnings History for Caterpillar (NYSE:CAT)DateQuarterConsensus EstimateActual EPSRevenue EstimateActual RevenueRelease LinkConference CallActions7/26/2016Q216$0.97$10.06 billionListen 4/22/2016Q116$0.68$0.67$9.59 billion$9.46 billionViewListen 1/28/2016Q415$0.69$0.74$11.47 billion$11.00 billionViewListen 10/22/2015Q315$0.78$0.75$11.16 billion$11.00 billionViewListen 7/23/2015Q215$1.27$1.27$12.67 billion$12.30 billionViewListen 4/23/2015Q115$1.35$1.86$12.48 billion$12.70 billionViewListen 1/27/2015Q414$1.55$1.35$14.18 billion$14.24 billionViewListen 10/23/2014Q314$1.36$1.72$13.19 billion$13.55 billionViewListen 7/24/2014Q214$1.52$1.69$14.46 billion$14.15 billionViewListen 4/24/2014Q114$1.24$1.61$13.14 billion$13.24 billionViewListen 1/27/2014Q413$1.28$1.54$13.64 billion$13.61 billionViewListen 10/23/2013Q313$1.71$1.45$14.49 billion$13.42 billionViewListen 7/24/2013Q2 2013$1.71$1.45$15.03 billion$14.62 billionViewListen 4/22/2013Q1 2013$1.46$1.31$13.80 billion$13.20 billionViewListen 1/28/2013Q4 2012$1.71$1.91$16.16 billion$16.08 billionViewListen 10/22/2012$2.24$2.54ViewN/A 7/25/2012$2.30$2.54ViewN/A 4/25/2012$2.15$2.37ViewN/A 1/26/2012$1.77$2.32ViewN/A 10/24/2011$1.64$1.71ViewN/A 7/22/2011$1.78$1.52ViewN/A 4/29/2011$1.31$1.84ViewN/A 1/27/2011$1.27$1.47ViewN/A (Data available from 1/1/2011 forward) Estimates Earnings Estimates for Caterpillar (NYSE:CAT)QuarterNumber of EstimatesLow EstimateHigh EstimateAverage EstimateQ1 20164$0.65$0.95$0.78Q2 20163$0.95$1.23$1.11Q3 20163$0.74$0.95$0.86Q4 20163$0.54$0.98$0.81(Data provided by Zacks Investment Research) Dividends Current Dividend Information for Caterpillar (NYSE:CAT)Annual Dividend:$3.08Dividend Yield:3.88%Payout Ratio:147.37% (Based on Trailing 12 Months of Earnings) 87.50% (Based on Current Year Consensus EPS Estimate)87.50% (Based on Next Year Consensus EPS Estimate)Dividend Growth:5.80% (3 Year Average)Dividend History for Caterpillar (NYSE:CAT)AnnouncedPeriodAmountYieldEx-Dividend DateRecord DatePayable DateShare6/8/2016quarterly$0.773.99%7/18/20167/20/20168/20/2016 4/13/2016quarterly$0.773.9%4/21/20164/25/20165/20/2016 12/9/2015quarterly$0.774.64%1/15/20161/20/20162/20/2016 10/14/2015quarterly$0.774.35%10/22/201510/26/201511/20/2015 6/10/2015quarterly$0.773.49%7/16/20157/20/20158/20/2015 4/8/2015quarterly$0.703.47%4/16/20154/20/20155/20/2015 12/10/2014quarterly$0.703.02%1/15/20151/20/20152/20/2015 10/8/2014quarterly$0.702.99%10/16/201410/20/201411/20/2014 6/11/2014quarterly$0.702.63%7/17/20147/21/20148/20/2014 4/9/2014quarterly$0.602.35%4/16/20144/21/20145/20/2014 12/11/2013quarterly$0.602.8%1/16/20141/21/20142/20/2014 10/9/2013quarterly$0.602.83%10/17/201310/21/201311/20/2013 6/12/2013quarterly$0.602.82%7/18/20137/22/20138/20/2013 4/10/2013quarterly$0.522.43%4/18/20134/22/20135/20/2013 12/12/2012quarterly$0.522.35%12/20/201212/24/201212/31/2012 (Data available from 1/1/2013 forward) Insider Trades Insider Trading History for Caterpillar (NYSE:CAT)Transaction DateInsider NameTitleBuy/SellNumber of SharesAverage Share PriceTotal TransactionActions5/31/2016Bradley M HalversonCFOSell574$72.58$41,660.92 5/9/2016Dennis A MuilenburgDirectorBuy1,128$71.01$80,099.28 5/3/2016Bradley M HalversonCFOSell878$76.85$67,474.30 4/26/2016David L CalhounDirectorBuy25,000$77.44$1,936,000.00 2/12/2016Denise C JohnsonInsiderBuy3,500$62.20$217,700.00 8/5/2014Edward J RappInsiderSell15,000$101.01$1,515,150.00 7/30/2014James B BudaEVPSell70,828$105.23$7,453,230.44 5/6/2014Edward RappInsiderSell15,000$103.99$1,559,850.00 5/1/2014Donald Umpleby IIIInsiderSell5,881$105.43$620,033.83 4/30/2014Jananne CopelandCAOSell9,110$105.40$960,194.00 4/29/2014Bradley HalversonCFOSell19,638$104.61$2,054,331.18 4/29/2014James BudaEVPSell33,548$105.00$3,522,540.00 1/31/2014James BudaEVPSell9,580$94.16$902,052.80 11/1/2012Richard P LavinInsiderSell28,590$86.37$2,469,318.30 (Data available from 1/1/2013 forward) Headlines Latest Headlines for Caterpillar (NYSE:CAT)DateHeadline07/24/16 07:43 AMPerformance watch list: Caterpillar Inc. (NYSE:CAT) - News Oracle07/23/16 03:00 PMCaterpillar: Dividend Going Nowhere But Up - Seeking Alpha07/23/16 03:00 PMStock Performance Rundown on Caterpillar Inc. (NYSE:CAT) - Engelwood Daily07/23/16 07:22 AMCaterpillar Inc. (CAT) Closes 0.79% Down on the Day for July 22 - Equities.com07/22/16 08:08 PMBTIG Downgrades Facebook; Old Tech Cools Off: Best of Kass - 07/22/16 05:38 PMAndroid Circuit: New Galaxy Note 7 Design Leaks, Android's Emoji Easter Egg, Apple Ambushes Samsung - 07/22/16 03:07 PMStocks to Track: Caterpillar Inc. (NYSE:CAT), Dunkin Brands Group Inc (NASDAQ:DNKN) - NYSE Journal (press release)07/22/16 01:23 PMHow Will Caterpillar (CAT) Stock React to Q2 Results? - 07/22/16 12:08 PMWhy the Drop in Commodity Prices Won't Pay off for Long for Caterpillar - 07/22/16 12:08 PMNo Sign of EPS Improvement in Sight for Caterpillar - 07/22/16 11:12 AMAttention Grasping Stock With Upward Momentum: Caterpillar Inc. (NYSE:CAT) - TGP07/22/16 11:12 AMToday's Top Gainers in the Market Caterpillar Inc. (NYSE:CAT) from Industrial Goods - The Daily Leicester07/22/16 11:12 AMWhy Making Dramatic Moves: Caterpillar Inc. (NYSE:CAT), Cambrex Corporation (NYSE:CBM), FBL Financial Group ... - KC Register07/22/16 11:12 AMAnalyst Ratings On Watch List: Caterpillar Inc. (NYSE:CAT), Western Digital Corp (NASDAQ:WDC) - Review Fortune07/22/16 11:12 AMAnalyst Recommended Stock: Caterpillar Inc. (NYSE:CAT) - News Oracle07/22/16 11:12 AMAnalysts Ranking Previews: Caterpillar, Inc. (NYSE:CAT) , NCI Building Systems, Inc. (NYSE:NCS) - Street Updates07/22/16 11:12 AMCaterpillar Inc. (CAT) Closes 0.4% Up on the Day for July 21 - Equities.com07/22/16 11:12 AMCaterpillar Inc. Q2 Earnings: 3 Key Updates You Can't Miss - Madison.com07/22/16 10:26 AMAllegion (ALLE) Q2 Earnings: Will it Surpass Estimates? - 07/22/16 08:33 AMCaterpillar Inc. Q2 Earnings: 3 Key Updates You Can't Miss - Multiple challenges could affect Caterpillar's second-quarter earnings and outlook.07/21/16 08:38 PMWhy Earnings Season Could Be Great for Caterpillar (CAT)07/21/16 08:38 PMJoy Global to be acquired by Japan-based firm for nearly $2.9 billion07/21/16 08:37 PMCaterpillar drawn to location like moth to flame07/21/16 08:37 PMCaterpillar Inc. (CAT) Closes 0.4% Up on the Day for July 2107/21/16 08:37 PMKomatsu to Buy Joy Global for $2.9 Billion07/21/16 06:43 PMJapan's Komatsu strikes $2.9 billion deal for Joy Global - 07/21/16 03:09 PMCaterpillar : Glass art, whiskey and coffee among local products featured in "Illinois Made" promotions07/21/16 03:09 PMKomatsu signals mining optimism in $2.9 billion Joy takeover07/21/16 03:09 PMCaterpillar Inc. (CAT) Closes 0.06% Down on the Day for July 2007/21/16 03:09 PMNotable Thursday Option Activity: CAT, GOOGL, SWKS07/21/16 01:51 PMJoy Global: Some Investors are Taking a Bath on the Buyout - 07/21/16 01:36 PMStocks Gear Down, But Caterpillar Flirts With Breakout - 07/21/16 01:25 PMCaterpillar Awakens to New Global Peer in Komatsu-Joy Tie-Up - 07/21/16 01:22 PMBusiness events scheduled for the coming week - 07/21/16 07:28 AMStock's Trend Analysis Report: Cerulean Pharma Inc (NASDAQ:CERU), Caterpillar Inc. (NYSE:CAT) - NYSE Journal (press release)07/21/16 07:28 AMAnalysts Spotlight: Caterpillar, Inc. (NYSE:CAT) , Honeywell International Inc. (NYSE:HON) - Street Updates07/21/16 05:05 AMCaterpillar Needs Global Economic Recovery to Succeed - 07/20/16 10:21 PMIs Caterpillar Inc.(NYSE: CAT), a large market cap stock a smart buy? - The Daily Leicester07/20/16 10:21 PMCaterpillar Inc. (CAT) Closes 0.06% Down on the Day for July 20 - Equities.com07/20/16 12:38 PMEarnings Preview: Caterpillar Q2 2016 (CAT) - 07/20/16 07:48 AMCaterpillar (CAT) Q2 Earnings: A Surprise in the Cards? - 07/19/16 08:27 PMNew phone redefines Caterpillar abroad - Burlington Hawk Eye07/19/16 08:27 PMCaterpillar Inc. (CAT) Closes 0.1% Down on the Day for July 19 - Equities.com07/19/16 03:08 PMCaterpillar Inc. (CAT) Closes 0.14% Down on the Day for July 1807/19/16 03:08 PMInteresting January 2017 Stock Options for CAT07/19/16 09:17 AMCaterpillar Inc. (NYSE:CAT) Went Down -1.09%: Kinder Morgan, Inc. (NYSE:KMI), Intel Corporation (NASDAQ:INTC ... - KC Register07/19/16 09:17 AMTwo Movers within Analysts Observation: Caterpillar, Inc. (NYSE:CAT) , Hexcel Corporation (NYSE:HXL) - Street Updates07/19/16 09:17 AMCaterpillar Inc. (CAT) Closes 0.14% Down on the Day for July 18 - Equities.com07/19/16 08:58 AMBuy These 5 Breakout Stocks Now for Big Gains - 07/18/16 03:14 PMEPS Growth Monitor for Caterpillar Inc. (NYSE:CAT) - TGP Social About Caterpillar Caterpillar Inc. is a manufacturer of construction and mining equipment, diesel and natural gas engines, industrial gas turbines and diesel-electric locomotives. The Company operates through its three product segments: Resource Industries, Construction Industries, and Energy & Transportation. It also provides financing and related services through its Financial Products segment. Its Construction Industries segment provides machinery for infrastructure and building construction applications. Its Resource Industries segment offers machinery for mine and quarry applications. Its Energy & Transportation segment offers reciprocating engines, generator sets, gas turbines and turbine-related services, diesel-electric locomotives and other rail-related products and services. Its Financial Products segment conducts its business through Caterpillar Financial Services Corporation (Cat Financial). Cat Financial provides retail and wholesale financing alternatives for Caterpillar products. Industry, Sector and Symbol: Sector: Industrial Products Industry: Farm & Construction Machinery Sub-Industry: Construction & Farm Machinery & Heavy Trucks Exchange: NYSE Symbol: CAT CUSIP: 14912310 Key Metrics: Previous Close: $80.0150 Day Moving Average: $76.71200 Day Moving Average: $71.89P/E Ratio: 41.76P/E Growth: -19.26Market Cap: $46.35BBeta: 1.6Current Year EPS Consensus Estimate: $3.52 EPSNext Year EPS Consensus Estimate: $3.52 EPS Additional Links: View CAT on Google FinanceView CAT on Yahoo FinanceView CAT's Company Profile on ReutersSearch for Caterpillar Inc. on Google Caterpillar (NYSE:CAT) Chart for Monday, July, 25, 2016


text:
- Jon Gosselin: Flippin' Burgers at Friday's!
- Taylor Swift: Not So Fast... I Still May Sue Kanye
- Michael Jackson's Doctor Writes a Tell-All
- Justin Bieber Pulls a Major Baller Move
Third Eye Blind has zero regrets about trolling Donald Trump supporters who filled the crowd at their Cleveland concert.
Frontman Stephan Jenkins was on "TMZ Live" Wednesday and said the band had no idea their charity gig at the Rock and Roll Hall of Fame would be saturated with Trump supporters in town for the RNC.
You gotta see him describe the moment he figured out who they were playing to -- and it sounds like the fact Trump just got nominated wasn't sitting well with the band ... which went on to play obscure tracks and poke fun at the GOP platform. You can guess how that went over -- lots of boos.
As for whether they avoided playing their biggest hit, "Semi-Charmed Life" on purpose? Stephan gave us the most awesome answer.
Third Eye Blind tonite at #RNCinCLE event: We believe in tolerance, acceptance :raised_hands::raised_hands: (Followed by boos) pic.twitter.com/WPRIEMZmEp— Tina (@tinpant) July 20, 2016
Tons of HUGE agents came calling for NBA prospect Terrance Ferguson when he announced he'd be skipping college to play pro ball in Australia -- so the question, why did he choose Lil Wayne?
The 18-year-old phenom joined the guys on the "TMZ Sports" TV show (airs Thursday on FS1) and explained why he felt Young Money Sports is the best fit.
Oh ... and that fact he went to prom with smokin' hot Young Money artist Stephanie Acevedo -- yeah, that didn't hurt either!!!
FYI -- Ferguson is one of the top high school players in the country and is heading Down Under for a year until he's eligible to enter the NBA draft.
Make sure to check out the entire interview tonight on FS1 -- especially the part where Terrance vows to DESTROY our guy Van in a dunk contest. #CantWait
Mark Hoppus has a warning for Blink-182 fans ... DON'T MESS WITH HIS "POKEMON GO" GAME!!!
Mark's a longtime Poke-player and called into "TMZ Live" to explain why the latest version of the game is taking over everyone's lives, including his.
Mark took a day off from the game but says he's gonna catch up when Blink-182 hits the road soon to support their #1 album, "California." He says it's an easy way to kill time, and apparently he's not the only rocker trying to catch 'em all.
The scores of celebs who met Wednesday night to figure out solutions to the racial divide in America were not in full agreement ... so says The Game, who was front and center.
Game and the others met at Cedric the Entertainer's home in the San Fernando Valley, and the rapper told us on "TMZ Live" there was some conflict over the mantra ... Black Lives Matter vs. All Lives Matter.
Game says in the end the group unified, and they'll meet again soon ... to start mapping out concrete solutions.
The full interview airs today on "TMZ Live."
Young Buck doesn't care if you think he's promoting violence against police officers with his new track, "The Get Back" ... he insists it's his RIGHT to take them out.
The G-Unit rapper didn't mince words on "TMZ Live", saying he will absolutely protect himself from "crooked police officers" and he's encouraging everyone else to do the same.
His song includes lyrics like, "Make these n****s load up and go kill a cop right now" ... and although Young Buck expressed condolences for the families of the Dallas officers -- he never backed off his violent message.
Sure sounds like he's echoing the 60's civil rights battle cry, "By any means necessary." Watch and decide for yourself ... he's also got a message for The Game and Snoop Dogg.
There's an incredible program in L.A. that's made a huge difference in the lives of scores of African American kids, courtesy of cops ... and it's all flown under the radar.
It's called Operation Progress, where LAPD cops donate their time, go into Watts and mentor kids throughout their education. The cops do it all on their own time, without pay.
The program has been largely funded by Rick Caruso -- owner of The Grove in L.A. and former L.A. Police Commissioner -- and his wife Tina. They've poured millions of dollars of their own money into the program since it launched 3 years ago.
Rick appeared on "TMZ Live" Tuesday to talk about the incredible success of the program ... and how the kids have thrived with the help of the cops in difficult surroundings.
Check out what Rick has to say ... this should be done everywhere.

subset: commoncrawl


text:
From 3 to 18, healthy back-to-school advice
Every stage of your child's life brings challenges and milestones, often measured at the start of a new school year. Annual exams are a great way to stay ahead of potential problems; with older kids, open and honest communication can help you tackle hot-button issues. Here, what to expect as your child grows, and how you both can move forward with minimal (fingers crossed!) angst.
PRESCHOOL (ages 3-5)
1. Potty training: This can be a stressful time for parents and kids, but forcing the issue can make the situation worse, says Kerry Whittemore, M.D., a pediatrician at University of Utah Health Care's South Jordan Health Center. "Let them lead the way and go at their own pace; otherwise, it can lead to a power struggle," she says. If your child isn't interested or is having problems with training, your doctor can help identify potential causes.
2. Immunizations: This is a fraught topic among parents these days, due to speculation and misinformation. "If your child isn't immunized, her lifeand other livesare at risk," says Alexis Somers, D.O., a family medicine physician at the South Jordan Health Center. If you opted not to vaccinate your child as an infant, it's not too late. Your doctor can create a "catch-up" plan and explain the latest evidence-based research about vaccinations.
3. Mealtime: Doctors are starting to see the complications of obesity at ever younger ages, so it's never too early to develop good eating habits, which tend to stick for life. Both Whittemore and Somers recommend having meals together as a family at the table, where you all eat the same foods.
4. Separation: Their first days at preschool can be as hard on the parents as they are on the child. "You can help build confidence and independenceand reduce stress levelsby setting and sticking to routines before you even start school," says Somers.
GRADE SCHOOL (ages 6-11)
1. Safety: "Injuries are the leading cause of death for school-age kids because they can't really sense danger or recognize hazards," says Somers. "But most can be prevented with basic safety education." Teach your kids about fire, gun, car, bike, and street safety.
2. Screen time: The American Academy of Pediatrics recommends that kids get no more than two hours of screen time per day, including television, video games, computers, tablets, and phones. The more time kids spend in front of a monitor or screen, the less they spend being active and interacting with other kids.
3. ADHD: Attention deficit hyperactivity disorder is one of the most common childhood disorders, affecting approximately 11 percent of school-age kids, according to the Centers for Disease Control. If your child fidgets and has difficulty focusing, poor performance on schoolwork, poor memory, an inability to sit quietly, and talkativeness, having him evaluated now can head off behavioral and academic problems.
4. Organization: In grade school, kids have to manage six hours a day of school, homework, friendships, and after-school activities. "A lot of kids have trouble staying organized," says Whittemore. "Make sure your child has a planner to write his assignments in, and go over it daily." Stay in touch with your child's teacher so you can quickly resolve any problems before they develop into bad habits.
JUNIOR HIGH (ages 12-14)
- Women underrepresented across Utah's...
- Mike Lee, US Senate to hold monument meeting...
- 7 tips for summer travel while pregnant
- First-timers and veterans among thousands to...
- Doug Robinson: How this woman's focus on...
- Utah case highlights painful challenges...
- Panel recommends options to reduce aviation...
- Audit of embattled S.L. County Recorder's...
- If Mitt Romney endorsed Gary Johnson,... 74
- Planned Parenthood 'CTR' campaign draws... 65
- New rule sparks debate over teacher... 48
- Utah Democrat: Kaine 'kind of person we... 24
- Sanders urges Utah and other... 24
- San Juan County residents say 'doodah'... 21
- Shurtleff exonerated, but questions and... 19
- Utah Democrats see opportunity in... 17


text:
Facebook finally rolls out its much-anticipated (and much-delayed) iPad app. There had been rumblings Facebook would forgo releasing an iPad app, and instead focus all of its tablet efforts on Project Spartan, an advanced mobile site that will allow Facebook to avoid paying Apple (AAPL) a cut on in-app purchases.
Facebook finally rolls out its much-anticipated (and much-delayed) iPad app. There had been...
From other sites
Video at CNBC.com (Mon, 5:54PM)
Video at CNBC.com (Mon, 5:30PM)
Video at CNBC.com (Mon, 3:27PM)
Video at CNBC.com (Mon, 3:25PM)
Video at CNBC.com (Mon, 1:03PM)
Comments (2)
ETF Hub
ETF Screener: Search and filter by asset class, strategy, theme, performance, yield, and much more
ETF Performance: View ETF performance across key asset classes and investing themes
ETF Investing Guide: Learn how to build and manage a well-diversified, low cost ETF portfolio
ETF Selector: An explanation of how to select and use ETFs


text:
Planet Linux Australia
sthbrx - a POWER technical blog: Tell Me About Petitboot
A Google search for 'Petitboot' brings up results from a number of places, some describing its use on POWER servers, others talking about how to use it on the PS3, in varying levels of detail. I tend to get a lot of general questions about Petitboot and its behaviour, and have had a few requests for a broad "Welcome to Petitboot" blog, suggesting that existing docs deal with more specific topics.. or that people just aren't reading them :)
So today we're going to take a bit of a crash course in the what, why, and possibly how of Petitboot. I won't delve too much into technical details, and this will be focussed on Petitboot in POWER land since that's where I spend most of my time. Here we go!What
Aside from a whole lot of firmware and kernel logs flying past, the first thing you'll see when booting a POWER serverIn OPAL mode at least... is Petitboot's main menu:
Petitboot is the first interact-able component a user will see. The word 'BIOS' gets thrown around a lot when discussing this area, but that is wrong, and the people using that word are wrong.
When the OPAL firmware layer Skiboot has finished its own set up, it loads a certain binary (stored on the BMC) into memory and jumps into it. This could hypothetically be anything, but for any POWER server right now it is 'Skiroot'. Skiroot is a full Linux kernel and userspace, which runs Petitboot. People often say Petitboot when they mean Skiroot - technically Petitboot is the server and UI processes that happen to run within Skiroot, and Skiroot is the full kernel and rootfs package. This is more obvious when you look at the op-build project - Petitboot is a package built as part of the kernel and rootfs created by Buildroot.
Petitboot is made of two major parts - the UI processes (one for each available console), and the 'discover' server. The discover server updates the UI processes, manages and scans available disks and network devices, and performs the actual booting of host operating systems. The UI, running in ncurses, displays these options, allows the user to edit boot options and system configuration, and tells the server which boot option to kexec.Why
The 'why' delves into some of the major architectural differences between a POWER machine and your average x86 machine which, as always, could spread over several blog posts and/or a textbook.
POWER processors don't boot themselves, instead the attached Baseboard Management Controller (BMC) does a lot of low-level poking that gets the primary processor into a state where it is ready to execute instructions. PowerVM systems would then jump directly into the PHYP hypervisor - any subsequent OS, be it AIX or Linux, would then run as a 'partition' under this hypervisor.
What we all really want though is to run Linux directly on the hardware, which meant a new boot process would have to be thought up while still maintaining compatibility with PowerVM so systems could be booted in either mode. Thus became OPAL, and its implementation Skiboot. Skipping over so much detail, the system ends up booting into Skiboot which acts as our firmware layer. Skiboot isn't interactive and doesn't really care about things like disks, so it loads another binary into memory and executes it - Skiroot!
Skiroot exists as an alternative to writing a whole new bootloader just for POWER in OPAL mode, or going through the effort to port an existing bootloader to understand the specifics of POWER. Why do all that when Linux already exists and already knows how to handle disks, network interfaces, and a thousand other things? Not to mention that when Linux gains support for fancy new devices so do we, and adding new features of our own is as simple as writing your average Linux program.
Skiroot itself (not including Skiboot) is roughly comparable to UEFI, or at least much more so than legacy BIOS implementations. But whereas UEFI tends to be a monolithic blob of fairly platform-specific code (in practice), Skiroot is simply a small Linux environment that anyone could put together with Buildroot.
A much better insight into the development and motivation behind Skiroot and Petitboot is available in Jeremy's LCA2013 talkBack to Petitboot
Petitboot is the part of the 'bootloader' that did need to be written, because users probably wouldn't be too thrilled if they had to manually mount disks and kexec their kernels every time they booted the machine. The Petitboot server process mounts any available disk devices and scans them for available operating systems. That's not to say that it scans the entire disk, because otherwise you could be waiting for quite some time, but rather it looks in a list of common locations for bootloader configuration files. This is handy because it means the operating system doesn't need to have any knowledge of Petitboot - it just uses its usual install scripts and Petitboot reads them to know what is available. At the same time Petitboot makes PXE requests on configured network interfaces so we can netboot, and allows these various sources to be given relative priorities for auto-boot, plus a number of other ways to specially configure booting behaviour.
A particularly neat feature of existing in a Linux environment is the ability to easily recover from boot problems; whereas on another system you might need to use a Live CD to fix a misconfiguration or recover a broken filesystem, in Skiroot you can just drop to the shell and fix the issue right there.
In summary, Petitboot/Skiroot is a small but capable Linux environment that every OPAL POWER machine boots into, gathering up all the various local and remote boot possibilities, and presenting them to you in a state-of-the-art ncurses interface. Petitboot updates all the time, and if you come across a feature that you think Petitboot is missing, patches are very welcome at email@example.com (or hassle me on IRC)!
sthbrx - a POWER technical blog: SROP Mitigation
Sigreturn Oriented Programming - a general technique that can be used as an exploit, or as a backdoor to exploit another vulnerability.Okay, but what is it?
Yeah... Let me take you through some relevant background info, where I skimp on the details and give you the general picture.
In Linux, software interrupts are called signals. More about signals here! Generally a signal will convey some information from the kernel and so most signals will have a specific signal handler (some code that deals with the signal) setup.
Signals are asynchronous - ie they can be sent to a process/program at anytime. When a signal arrives for a process, the kernel suspends the process. The kernel then saves the 'context' of the process - all the general purpose registers (GPRs), the stack pointer, the next-instruction pointer etc - into a structure called a 'sigframe'. The sigframe is stored on the stack, and then the kernel runs the signal handler. At the very end of the signal handler, it calls a special system call called 'sigreturn' - indicating to the kernel that the signal has been dealt with. The kernel then grabs the sigframe from the stack, restores the process's context and resumes the execution of the process.
This is the rough mental picture you should have:Okay... but you still haven't explained what SROP is..?
Well, if you insist...
The above process was designed so that the kernel does not need to keep track of what signals it has delivered. The kernel assumes that the sigframe it takes off the stack was legitimately put there by the kernel because of a signal. This is where we can trick the kernel!
If we can construct a fake sigframe, put it on the stack, and call sigreturn, the kernel will assume that the sigframe is one it put there before and will load the contents of the fake context into the CPU's registers and 'resume' execution from where the fake sigframe tells it to. And that is what SROP is!Well that sounds cool, show me!
Firstly we have to set up a (valid) sigframe:
By valid sigframe, I mean a sigframe that the kernel will not reject. Luckily most architectures only examine a few parts of the sigframe to determine the validity of it. Unluckily, you will have to dive into the source code to find out which parts of the sigframe you need to set up for your architecture. Have a look in the function which deals with the syscall sigreturn (probably something like sys_sigreturn() ).
For a real time signal on a little endian powerpc 64bit machine, the sigframe looks something like this:struct rt_sigframe { struct ucontext uc; unsigned long _unused[2]; unsigned int tramp[TRAMP_SIZE]; struct siginfo __user *pinfo; void __user *puc; struct siginfo info; unsigned long user_cookie; /* New 64 bit little-endian ABI allows redzone of 512 bytes below sp */ char abigap[USER_REDZONE_SIZE]; } __attribute__ ((aligned (16)));
The most important part of the sigframe is the context or ucontext as this contains all the register values that will be written into the CPU's registers when the kernel loads in the sigframe. To minimise potential issues we can copy valid values from the current GPRs into our fake ucontext:register unsigned long r1 asm("r1"); register unsigned long r13 asm("r13"); struct ucontext ctx = { 0 }; /* We need a system thread id so copy the one from this process */ ctx.uc_mcontext.gp_regs[PT_R13] = r13; /* Set the context's stack pointer to where the current stack pointer is pointing */ ctx.uc_mcontext.gp_regs[PT_R1] = r1;
We also need to tell the kernel where to resume execution from. As this is just a test to see if we can successfully get the kernel to resume execution from a fake sigframe we will just point it to a function that prints out some text./* Set the next instruction pointer (NIP) to the code that we want executed */ ctx.uc_mcontext.gp_regs[PT_NIP] = (unsigned long) test_function;
For some reason the sys_rt_sigreturn() on little endian powerpc 64bit checks the endianess bit of the ucontext's MSR register, so we need to set that:/* Set MSR bit if LE */ ctx.uc_mcontext.gp_regs[PT_MSR] = 0x01;
Fun fact: not doing this or setting it to 0 results in the CPU switching from little endian to big endian! For a powerpc machine sys_rt_sigreturn() only examines ucontext, so we do not need to set up a full sigframe.
Secondly we have to put it on the stack:/* Set current stack pointer to our fake context */ r1 = (unsigned long) &ctx;
Thirdly, we call sigreturn:/* Syscall - NR_rt_sigreturn */ asm("li 0, 172\n"); asm("sc\n");
When the kernel receives the sigreturn call, it looks at the userspace stack pointer for the ucontext and loads this in. As we have put valid values in the ucontext, the kernel assumes that this is a valid sigframe that it set up earlier and loads the contents of the ucontext in the CPU's registers "and resumes" execution of the process from the address we pointed the NIP to.
Obviously, you need something worth executing at this address, but sadly that next part is not in my job description. This is a nice gateway into the kernel though and would pair nicely with another kernel vulnerability. If you are interested in some more in depth examples, have a read of this paper.So how can we mitigate this?
Well, I'm glad you asked. We need some way of distinguishing between sigframes that were put there legitimately by the kernel and 'fake' sigframes. The current idea that is being thrown around is cookies, and you can see the x86 discussion here.
The proposed solution is to give every sighand struct a randomly generated value. When the kernel constructs a sigframe for a process, it stores a 'cookie' with the sigframe. The cookie is a hash of the cookie's location and the random value stored in the sighand struct for the process. When the kernel receives a sigreturn, it hashes the location where the cookie should be with the randomly generated number in sighand struct - if this matches the cookie, the cookie is zeroed, the sigframe is valid and the kernel will restore this context. If the cookies do not match, the sigframe is not restored.
Potential issues:Multithreading: Originally the random number was suggested to be stored in the task struct. However, this would break multi-threaded applications as every thread has its own task struct. As the sighand struct is shared by threads, this should not adversely affect multithreaded applications. Cookie location: At first I put the cookie on top of the sigframe. However some code in userspace assumed that all the space between the signal handler and the sigframe was essentially up for grabs and would zero the cookie before I could read the cookie value. Putting the cookie below the sigframe was also a no-go due to the ABI-gap (a gap below the stack pointer that signal code cannot touch) being a part of the sigframe. Putting the cookie inside the sigframe, just above the ABI gap has been fine with all the tests I have run so far! Movement of sigframe: If you move the sigframe on the stack, the cookie value will no longer be valid... I don't think that this is something that you should be doing, and have not yet come across a scenario that does this.
For a more in-depth explanation of SROP, click here.
sthbrx - a POWER technical blog: Doubles in hex and why Kernel addresses ~= -2
It started off a regular Wednesday morning when I hear from my desk a colleague muttering about doubles and their hex representation. "But that doesn't look right", "How do I read this as a float", and "redacted you're the engineer, you do it". My interest piqued, I headed over to his desk to enquire about the great un-solvable mystery of the double and its hex representation. The number which would consume me for the rest of the morning: 0xc00000001568fba0.That's a Perfectly Valid hex Number!
I hear you say. And you're right, if we were to treat this as a long it would simply be 13835058055641365408 (or -4611686018068186208 if we assume a signed value). But we happen to know that this particular piece of data which we have printed is supposed to represent a double (-2 to be precise). "Well print it as a double" I hear from the back, and once again we should all know that this can be achieved rather easily by using the %f/%e/%g specifiers in our print statement. The only problem is that in kernel land (where we use printk) we are limited to printing fixed point numbers, hence why our only easy option was to print our double in it's raw hex format.
This is the point where we all think back to that university course where number representations were covered in depth, and terms like 'mantissa' and 'exponent' surface in our minds. Of course as we rack our brains we realise there's no way that we're going to remember exactly how a double is represented and bring up the IEEE 754 Wikipedia page.What is a Double?
Taking a step back for a second, a double (or a double-precision floating-point) is a number format used to represent floating-point numbers (those with a decimal component). They are made up of a sign bit, an exponent and a fraction (or mantissa):
Where the number they represent is defined by:
So this means that a 1 in the MSB (sign bit) represents a negative number, and we have some decimal component (the fraction) which we multiply by some power of 2 (as determined by the exponent) to get our value.Alright, so what's 0xc00000001568fba0?
The reason we're all here to be begin with, so what's 0xc00000001568fba0 if we treat it as a double? We can first split it into the three components:0xc00000001568fba0:
Sign bit: 1 -> Negative
Exponent: 0x400 -> 2(1024 - 1023)
Fraction: 0x1568fba0 -> 1.something
And then use the formula above to get our number:
(-1)1 x 1.something_* x 2(1024 - 1023)__
But there's a much easier way! Just write ourselves a little program in userspace (where we are capable of printing floats) and we can save ourselves most of the trouble.#include <stdio.h> void main(void) { long val = 0xc00000001568fba0; printf("val: %lf\n", *((double *) &val)); }
So all we're doing is taking our hex value and storing it in a long (val), then getting a pointer to val, casting it to a double pointer, and dereferencing it and printing it as a float. Drum Roll And the answer is?
"val: -2.000000"
"Wait a minute, that doesn't quite sound right". You're right, it does seem a bit strange that this is exactly -2. Well it may be that we are not printing enough decimal places to see the full result, so update our print statement to:printf("val: %.64lf\n", *((double *) &val));
And now we get:
"val: -2.0000001595175973534423974342644214630126953125000000"
Much better... But still where did this number come from and why wasn't it the -2 that we were expecting?Kernel Pointers
At this point suspicions had been raised that what was being printed by my colleague was not what he expected and that this was in fact a Kernel pointer. How do you know? Lets take a step back for a second...
In the PowerPC architecture, the address space which can be seen by an application is known as the effective address space. We can take this and translate it into a virtual address which when mapped through the HPT (hash page table) gives us a real address (or the hardware memory address).
The effective address space is divided into 5 regions:
As you may notice, Kernel addresses begin with 0xc. This has the advantage that we can map a virtual address without the need for a table by simply masking the top nibble.
Thus it would be reasonable to assume that our value (0xc00000001568fba0) was indeed a pointer to a Kernel address (and further code investigation confirmed this).But What is -2 as a Double in hex?
Well lets modify the above program and find out:include <stdio.h> void main(void) { double val = -2; printf("val: 0x%lx\n", *((long *) &val)); }
"val: 0xc000000000000000"
Now that sounds much better. Lets take a closer look:0xc000000000000000:
Sign Bit: 1 -> Negative
Exponent: 0x400 -> 2(1024 - 1023)
Fraction: 0x0 -> Zero
So if you remember from above, we have:
(-1)1 x 1.0_* x 2(1024 - 1023)__ = -2
What about -1? -3?-1: 0xbff0000000000000:
Sign Bit: 1 -> Negative
Exponent: 0x3ff -> 2(1023 - 1023)
Fraction: 0x0 -> Zero
(-1)1 x 1.0_* x 2(1023 - 1023)__ = -1-3: 0xc008000000000000:
Sign Bit: 1 -> Negative
Exponent: 0x400 -> 2(1024 - 1023)
Fraction: 0x8000000000000 -> 0.5
(-1)1 x 1.5_* x 2(1024 - 1023)__ = -3So What Have We Learnt?
Firstly, make sure that what you're printing is what you think you're printing.
Secondly, if it looks like a Kernel pointer then you're probably not printing what you think you're printing.
Thirdly, all Kernel pointers ~= -2 if you treat them as a double.
And Finally, with my morning gone, I can say for certain that if we treat it as a double, 0xc00000001568fba0 = -2.0000001595175973534423974342644214630126953125.
Chris Smart: TRIM on LVM on LUKS on SSD, revisited
A few years ago I wrote about enabling trim on an SSD that was running with LVM on top of LUKS. Since then things have changed slightly, a few times.
With Fedora 24 you no longer need to edit the /etc/crypttab file and rebuild your initramfs. Now systemd supports a kernel boot argument rd.luks.options=discard which is the only thing you should need to do to enable trim on your LUKS device.
Edit /etc/default/grub and add the rd.luks.options=discard argument to the end of GRUB_CMDLINE_LINUX, e.g.:
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_CMDLINE_LINUX="rd.luks.uuid=luks-de023401-ccec-4455-832bf-e5ac477743dc rd.luks.uuid=luks-a6d344739a-ad221-4345-6608-e45f16a8645e rhgb quiet rd.luks.options=discard"
Next, rebuild your grub config file:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
If you're using LVM, the setting is the same as the previous post. Edit the /etc/lvm/lvm.conf file and enabled the issue_discards option:
issue_discards = 1
If using LVM you will need to rebuild your initramfs so that the updated lvm.conf is in there.
sudo dracut -f
Reboot and try fstrim:
sudo fstrim -v /
Now also thanks to systemd, you can just enable the fstrim timer (cron) to do this automatically:
sudo systemctl enable fstrim.timer
Linux Users of Victoria (LUV) Announce: LUV Main June 2016 Meeting: BOINC / Lightning talks
6th Floor, 200 Victoria St. Carlton VIC 3053Link: http://luv.asn.au/meetings/map
- Russell Coker, BOINC
- Lightning talks
200 Victoria St. Carlton VIC 3053
Late arrivals, please call (0490) 049 589 for access to the venue.
Before and/or after each meeting those who are interested are welcome to join other members for dinner. We are open to suggestions for a good place to eat near our venue. Maria's on Peel Street in North Melbourne is currently the most popular place to eat after meetings.
LUV would like to acknowledge Red Hat and Infoxchange for their help in obtaining the meeting venues.
Linux Users of Victoria Inc. is an incorporated association, registration number A0040056C.June 7, 2016 - 18:30
Linux Users of Victoria (LUV) Announce: LUV Beginners May Meeting: Apache Cassandra Workshop
Infoxchange, 33 Elizabeth St. RichmondLink: http://luv.asn.au/meetings/map
This hands-on workshop will provide participants with an introduction to the Cassandra distributed "NoSQL" database management system, including deployment, keyspace and table manipulation, replication, creating multiple datacenters and creating users.
Participants will:
- Install a Cassandra server
- Create a keyspace
- Create a table and insert data
- Replicate data across a three-node cluster
- Replicate data across a two-datacenter cluster
- Set up Cassandra and JMX authentication
The meeting will be held at Infoxchange, 33 Elizabeth St. Richmond 3121 (enter via the garage on Jonas St.)
Late arrivals, please call (0490) 049 589 for access to the venue.
LUV would like to acknowledge Infoxchange for the venue.
Linux Users of Victoria Inc., is an incorporated association, registration number A0040056C.May 21, 2016 - 12:30
Jan Schmidt: Towards GStreamer 1.0 talk
I gave my talk titled "Towards GStreamer 1.0" at the Gran Canaria Desktop Summit on Sunday. The slides are available here
My intention with the talk was to present some of the history and development of the GStreamer project as a means to look at where we might go next. I talked briefly about the origins of the project, its growth, and some of my personal highlights from the work we've done in the last year. To prepare the talk, I extracted some simple statistics from our commit history. In those, it's easy to see both the general growth of the project, in terms of development energy/speed, as well as the increase in the number of contributors. It's also possible to see the large hike in productivity that switching to Git in January has provided us.
The second part of the talk was discussing some of the pros and cons around considering whether to embark on a new major GStreamer release cycle leading up to a 1.0 release. We've successfully maintained the 0.10 GStreamer release series with backwards-compatible ABI and API (with some minor glitches) for 3.5 years now, and been very successful at adding features and improving the framework while doing so.
After 3.5 years of stable development, it's clear to me that when we made GStreamer 0.10, it really ought to have been 1.0. Nevertheless, there are some parts of GStreamer 0.10 that we're collectively not entirely happy with and would like to fix, but can't without breaking backwards compatibility – so I think that even if we had made 0.10 at that point, I'd want to be doing 1.2 by now.
Some examples of things that are hard to do in 0.10:
- Replace ugly or hard to use API
- ABI mistakes such as structure members that should be private having been accidentally exposed in some release.
- Running out of padding members in public structures, preventing further expansion
- Deprecated API (and associated dead code paths) we'd like to remove
There are also some enhancements that fall into a more marginal category, in that they are technically possible to achieve in incremental steps during the 0.10 cycle, but are made more difficult by the need to preserve backwards compatibility. These include things like adding per-buffer metadata to buffers (for extensible timestamping/timecode information, pan & scan regions and others), variable strides in video buffers and creating/using more base classes for common element types.
In the cons category are considerations like the obvious migration pain that breaking ABI will cause our applications, and the opportunity cost of starting a new development cycle. The migration cost is mitigated somewhat by the ability to have parallel installations of GStreamer. GStreamer 0.10 applications will be able to coexist with GStreamer 1.0 applications.
The opportunity cost is a bit harder to ignore. When making the 0.9 development series, we found that the existing 0.8 branch became essentially unmaintained for 1.5 years, which is a phenomenon we'd all like to avoid with a new release series. I think that's possible to achieve this time around, because I expect a much smaller scope of change between 0.10 and 1.0. Apart from the few exceptions above, GStreamer 0.10 has turned out really well, and has become a great framework being used in all sorts of exciting ways that doesn't need large changes.
Weighing up the pros and cons, it's my opinion that it's worth making GStreamer 1.0. With that in mind, I made the following proposal at the end of my talk:
- We should create a shared Git playground and invite people to use it for experimental API/ABI branches
- Merge from the 0.10 master regularly into the playground regularly, and rebase/fix experimental branches
- Keep developing most things in 0.10, relying on the regular merges to get them into the playground
- After accumulating enough interesting features, pull the experimental branches together as a 0.11 branch and make some released
- Target GStreamer 1.0 to come out in time for GNOME 3.0 in March 2010
This approach wasn't really possible the last time around when everything was stored in CVS – it's having a fast revision control system with easy merging and branch management that will allow it.
GStreamer Summit
On Thursday, we're having a GStreamer summit in one of the rooms at the university. We'll be discussing my proposal above, as well as talking about some of the problems people have with 0.10, and what they'd like to see in 1.0. If we can, I'd like to draw up a list of features and changes that define GStreamer 1.0 that we can start working towards.
Please come along if you'd like to help us push GStreamer forward to the next level. You'll need to turn up at the university GCDS venue and then figure out on your own which room we're in. We've been told there is one organised, but not where – so we'll all be in the same boat.
The summit starts at 11am.
Jan Schmidt: Proof of life – A New Adventure!
Hi world! It's been several years since I used this blog, and there's been a lot of things happen to us since then. I don't even live on the same continent as I did.
More on that in a future post. Today, I have an announcement to make – a new Open Source company! Together with fellow GStreamer hackers Tim-Philipp Müller and Sebastian Dröge, I have founded a new company: Centricular Ltd.
From 2007 until July, I was working at Oracle on Sun Ray thin client firmware. Oracle shut down the project in July, and my job along with it – opening up this excellent opportunity to try something I've wanted for a while and start a business, while getting back to Free Software full time.
Our website has more information about the Open Source technologies and services we plan to offer. This list is not complete and we will try to broaden it over time, so if you have anything interesting that is not listed there but you think we can help with, get in touch
As Centricular's first official contribution to the software pool, here's my Raspberry Pi Camera GStreamer module. It wraps code from Raspivid to allow direct capture from the official camera module and hardware encoding to H.264 in a GStreamer pipeline – without the shell pipe and fdsrc hack people have been using to date. Take a look at the README for more information.
Sebastian, Tim and I will be at the GStreamer Conference in Edinburgh next week.
Jan Schmidt: New York trip, DVD stuff
We're leaving tomorrow afternoon for 11 days holiday in New York and Washington D.C. While we're there, I'm hoping to catch up with Luis and Krissa and Thom May. It's our first trip to either city, so we're really excited – there's a lot of fun, unique stuff to do in both places and we're looking forward to trying to do all of it in our short visit.
On the GStreamer front, I just pushed a bunch of commits I've been working on for the past few weeks upstream into Totem, gst-plugins-base and gst-plugins-bad. Between them they fix a few DVD issues like multiangle support and playback in playbin2. The biggest visible feature though is the API that allowed me to (finally!) hook up the DVD menu items in Totem's UI. Now the various 'DVD menu', 'Title Menu' etc menu items work, as well as switching angles in multiangle titles, and it provides the nice little 'cursor switches to a hand when over a clickable button' behaviour.
I actually had it all ready yesterday, but people told me April 1 was the wrong day to announce any big improvements in totem-gstreamer DVD support
Jan Schmidt: DVD playback in GStreamer 1.0
Some time in 2012, the GStreamer team was busy working toward the GStreamer 1.0 major release. Along the way, I did my part and ported the DVD playback components from 0.10. DVD is a pretty complex playback scenario (let's not talk about Blu-ray)
I gave a talk about it at the GStreamer conference way back in 2010 – video here. Apart from the content of that talk, the thing I liked most was that I used Totem as my presentation tool
With all the nice changes that GStreamer 1.0 brought, DVD playback worked better than ever. I was able to delete a bunch of hacks and workarounds from the 0.10 days. There have been some bugs, but mostly minor things. Recently though, I became aware of a whole class of DVDs that didn't work for a very silly reason. The symptom was that particular discs would error out at the start with a cryptic "The stream is in the wrong format" message.
It turns out that these are DVDs that begin with a piece of video that has no sound.
Sometimes, that's implemented on a disc as a video track with accompanying silence, but in the case that was broken the DVDs have no audio track for that initial section at all. For a normal file, GStreamer would handle that by not creating any audio decoder chain or audio sink output element and just decode and play video. For DVD though, there are very few discs that are entirely without audio – so we're going to need the audio decoder chain sooner or later. There's no point creating and destroying when the audio track appears and disappears.
Accordingly, we create an audio output pad, and GStreamer plugs in a suitable audio output sink, and then nothing happens because the pipeline can't get to the Playing state – the pipeline is stuck in the Paused state. Before a pipeline can start playing, it has to progress through Ready and Paused and then to Playing state. The key to getting from Paused to Playing is that each output element (video sink and audio sink) in our case, has to receive some data and be ready to output it. A process called Pre-roll. Pre-rolling the pipeline avoids stuttering at the start, because otherwise the decoders would have to race to try and deliver something in time for it to get on screen.
With no audio track, there's no actual audio packets to deliver, and the audio sink can't Pre-roll. The solution in GStreamer 1.0 is a GAP event, sent to indicate that there is a space in the data, and elements should do whatever they need to to skip or fill it. In the audio sink's case it should handle it by considering itself Pre-rolled and allowing the pipeline to go to Playing, starting the ring buffer and the audio clock – from which the rest of the pipeline will be timed.
Everything up to that point was working OK – the sink received the GAP event… and then errored out. It expects to be told what format the audio samples it's receiving are so it knows how to fill in the gap… when there's no audio track and no audio data, it was never being told.
In the end, the fix was to make the dummy place-holder audio decoder choose an audio sample format if it gets a GAP event and hasn't received any data yet – any format, it doesn't really matter as long as it's reasonable. It'll be discarded and a new format selected and propagated when some audio data really is encountered later in playback.
That fix is #c24a12 – later fixed up a bit by thiagoss to add the 'sensible' part to format selection. The initial commit liked to choose a samplerate of 1Hz
If you have any further bugs in your GStreamer DVD playback, please let us know!
Jan Schmidt: Network clock examples
Way back in 2006, Andy Wingo wrote some small scripts for GStreamer 0.10 to demonstrate what was (back then) a fairly new feature in GStreamer – the ability to share a clock across the network and use it to synchronise playback of content across different machines.
Since GStreamer 1.x has been out for over 2 years, and we get a lot of questions about how to use the network clock functionality, it's a good time for an update. I've ported the simple examples for API changes and to use the gobject-introspection based Python bindings and put them up on my server.
To give it a try, fetch play-master.py and play-slave.py onto 2 or more computers with GStreamer 1 installed. You need a media file accessible via some URI to all machines, so they have something to play.
Then, on one machine run play-master.py, passing a URI for it to play and a port to publish the clock on:
./play-master.py http://server/path/to/file 8554
The script will print out a command line like so:
Start slave as: python ./play-slave.py http://server/path/to/file [IP] 8554 1071152650838999
On another machine(s), run the printed command, substituting the IP address of the machine running the master script.
After a moment or two, the slaved machine should start playing the file in synch with the master:
If they're not in sync, check that you have the port you chose open for UDP traffic so the clock synchronisation packets can be transferred.
This basic technique is the core of my Aurena home media player system, which builds on top of the network clock mechanism to provide file serving and a simple shuffle playlist.
For anyone still interested in GStreamer 0.10 – Andy's old scripts can be found on his server: play-master.py and play-slave.py
Jan Schmidt: 2014 GStreamer Conference
I've been home from Europe over a week, after heading to Germany for the annual GStreamer conference and Linuxcon Europe.
We had a really great turnout for the GStreamer conference this year
as well as an amazing schedule of talks. All the talks were recorded by Ubicast, who got all the videos edited and uploaded in record time. The whole conference is available for viewing at http://gstconf.ubicast.tv/channels/#gstreamer-conference-2014
I gave one of the last talks of the schedule – about my current work adding support for describing and handling stereoscopic (3D) video. That support should land upstream sometime in the next month or two, so more on that in a bit.
There were too many great talks to mention them individually, but I was excited by 3 strong themes across the talks:
- WebRTC/HTML5/Web Streaming support
- Improving performance and reducing resource usage
- Building better development and debugging tools
I'm looking forward to us collectively making progress on all those things and more in the upcoming year.
Jan Schmidt: OSSbarcamp 2 – GNOME 3.0 talk
I gave a talk at the second Dublin OSSbarcamp yesterday. My goal was to provide some insight into the goals for GNOME 3.0 for people who didn't attend GCDS.
Actually, the credit for the entire talk goes to Vincent and friends, who gave the GNOME 3.0 overview during the GUADEC opening at GCDS and to Owen for his GNOME Shell talk. I stole content from their slides shamelessly.
Jan Schmidt: New gst-rpicamsrc features
I've pushed some new changes to my Raspberry Pi camera GStreamer wrapper, at https://github.com/thaytan/gst-rpicamsrc/
These bring the GStreamer element up to date with new features added to raspivid since I first started the project, such as adding text annotations to the video, support for the 2nd camera on the compute module, intra-refresh and others.
Where possible, you can now dynamically update any of the properties – where the firmware supports it. So you can implement digital zoom by adjusting the region-of-interest (roi) properties on the fly, or update the annotation or change video effects and colour balance, for example.
The timestamps produced are now based on the internal STC of the Raspberry Pi, so the audio video sync is tighter. Although it was never terrible, it's now more correct and slightly less jittery.
The one major feature I haven't enabled as yet is stereoscopic handling. Stereoscopic capture requires 2 cameras attached to a Raspberry Pi Compute Module, so at the moment I have no way to test it works.
I'm also working on GStreamer stereoscopic handling in general (which is coming along). I look forward to releasing some of that code soon.
Jan Schmidt: Mysterious Parcel
I received a package in the mail today!
Everything arrived all nicely packaged up in a hobby box and ready for assembly.
Lots of really interesting goodies in the box!
After a little while, I've got the first part together.
The rest will have to wait for another day. In the meantime, have fun guessing what it is, and enjoy this picture of a cake I baked on the weekend:
See you later!
Jan Schmidt: A glimpse of audio nirvana
This is post is basically a love letter to the Pulseaudio and Gnome Bluetooth developers.
I upgraded my laptop to Ubuntu Karmic recently, which brought with it the ability to use my Bluetooth A2DP headphones natively. Getting them running is now as simple as using the Bluetooth icon in the panel to pair the laptop with the headphones, and then selecting them in the Sound Preferences applet, on the Output tab.
As soon as the headphones are connected, they show up as a new audio device. Selecting it instantly (and seamlessly) migrates my sounds and music from the laptop sound device onto the headphones. The Play/Pause, Next Track and Previous Track buttons all generate media key keypresses – so Rhythmbox and Totem behave like they're supposed to. It's lovely.
If that we're all, it would already be pretty sweet in my opinion, but wait – there's more!
A few days after starting to use my bluetooth headphones, my wife and I took a trip to Barcelona (from Dublin, where we live for the next few weeks… more on that later). When we got to the airport, the first thing we learned was that our flight had been delayed by 3 hours. Since I occasionally hack on multimedia related things, I typically have a few DVDs
with me for testing. In this case, I had Vicky Christina Barcelona on hand, and we hadn't watched it yet – a perfect choice for 2 people on their way to Barcelona.
Problem! There are four sets of ears wanting to listen to the DVD, and only 2 audio channels produced. I could choose to send the sound to either the in built sound device, and listen on the earbuds my wife had, or I could send it to my bluetooth headphones, but not both.
Pulseaudio to the rescue! With a bit of command-line fu (no GUI for this, but that's totally do-able), I created a virtual audio device, using Pulseaudio's "combine" module. Like the name suggests, it combines multiple other audio devices into a single one. It can do more complex combinations (such as sending some channels hither and others thither), but I just needed a straight mirroring of the devices. In a terminal, I ran:
pactl load-module module-combine sink_name=shared_play adjust_time=3 slaves="alsa_output.pci-0000_00_1b.0.analog-stereo,bluez_sink.00_15_0F_72_70_E1″
Hey presto! Now there's a third audio device available in the Sound Preferences to send the sound to, and it comes out both the wired ear buds and my bluetooth headphones (with a very slight sync offset, but close enough for my purposes).
Also, for those interested – the names of the 2 audio devices in my pactl command line came from the output of 'pactl list'.
This kind of seamless migration of running audio streams really isn't possible to do without something like Pulseaudio that can manage stream routing on the fly. I'm well aware that Pulseaudio integration into the distributions has been a bumpy ride for lots of people, but I think the end goal justifies the painful process of fixing all the sound drivers. I hope you do too!
Lennart points out that the extra paprefs application has a "Add virtual output device for simultaneous output on all local sound cards" check-box that does the same thing as loading the combine module manual, but also handles hot-plugging of devices as they appear and disappear.
Michael Davies: Planet Linux Australia... rebooted
It made me realise how crusty the old site had become, how many things I had planned to do which I had left undone, and how I hadn't applied simple concepts such as Infrastructure as Code which have become accepted best-practices in the time since I originally set this up.
Of course things have changed in this time. People blog less now, so I've also taken the opportunity to remove what appear to be dead blogs from the aggregator. If you have a blog of interest to the Linux Australia community, you can ask to be added via emailing planet at linux dot org dot au. All you need is a valid Atom or RSS feed.
The other thing that is that the blog aggregator software we use hasn't seen an update since 2011. It started out as PlanetPlanet, then moved on to Venus, and so I've taken a fork to hopefully improve this some more when I find my round tuit. Fortunately I don't still need to run it under python 2.4 which is getting a little long in the tooth.
Finally, the config for Planet Linux Australia is up on github. Just like the venus code itself, pull requests welcome. Share and Enjoy :-)
Matthew Oliver: Simple Squid access log reporting.
Squid is one of the biggest and most used proxies on the interwebs. And generating reports from the access logs is already a done deal, there are many commercial and OSS apps that support the squid log format. But I found my self in a situation where I wanted stats but didn't want to install a web server on my proxy or use syslog to push my logs to a centralised server which was running such software, and also wasn't in a position to go buy one of those off the shelf amazing wiz bang Squid reporting and graphing tools.
As a Linux geek I surfed the web to see what others have done. I came across a list provided by the Squid website. Following a couple of links, I came across a awk script called 'proxy_stats.gawk' written by Richard Huveneers.
I downloaded it and tried it out… unfortunately it didn't work, looking at the code.. which he nicely commented showed that he had it set up for access logs from version 1.* of squid. Now the squid access log format from squid 2.6+ hasn't changed too much from version 1.1. all they have really done is add a "content type" entry at the end of each line.
So as a good Linux geek does, he upgrades the script, my changes include:
- Support for squid 2.6+
- Removed the use a deprecated switches that now isn't supported in the sort command.
- Now that there is a an actual content type "column" lets use it to improve the 'Object type report".
- Add a users section, as this was an important report I required which was missing.
- And in a further hacked version, an auto generated size of the first "name" column.
Now with the explanation out of the way, let me show you it!
For those who are new to awk, this is how I've been running it:
zcat <access log file> | awk -f proxy_stats.gawk > <report-filename>
NOTE: I've been using it for some historical analysis, so I'm running it on old rotated files, which are compressed thus the zcat.
You can pass more then one file at a time and it order doesn't matter, as each line of an access log contains the date in epoch time:
zcat `find /var/log/squid/ -name "access.log*"` |awk -f proxy_stats.gawk
The script produces an ascii report (See end of blog entry for example), which could be generated and emailed via cron. If you want it to look nice in any email client using html the I suggest wrapping it in <pre> tags.:
<head><title>Report Title</title></head>
Report title<body>
... Report goes here ...
For those experienced Linux sys admins out there using cron + 'find -mtime' would be a very simple way of having an automated daily, weekly or even monthly report.
But like I said earlier I was working on historic data, hundreds of files in a single report, hundreds because for business reasons we have been rotating the squid logs every hour… so I did what I do best, write a quick bash script to find all the files I needed to cat into the report:
So there you go, thanks to the work of Richard Huveneers there is a script that I think generates a pretty good acsii report, which can be automated or integrated easily into any Linux/Unix work flow.
If you interested in getting hold of the most up to date version of the script you can get it from my sysadmin github repo here.
As promised earlier here is an example report:Parsed lines : 32960 Bad lines : 0 First request : Mon 30 Jan 2012 12:06:43 EST Last request : Thu 09 Feb 2012 09:05:01 EST Number of days: 9.9 Top 10 sites by xfers reqs %all %xfers %hit MB %all %hit kB/xf kB/s ------------------------- ------------------------------- ------------------------ ------------------- 18.104.22.168 20 0.1% 100.0% 0.0% 0.0 0.0% 0.0% 1.7 2.5 30.media.tumblr.com 1 0.0% 100.0% 0.0% 0.0 0.0% 0.0% 48.3 77.4 28.media.tumblr.com 1 0.0% 100.0% 0.0% 0.1 0.0% 0.0% 87.1 1.4 26.media.tumblr.com 1 0.0% 0.0% - 0.0 0.0% - - - 25.media.tumblr.com 2 0.0% 100.0% 0.0% 0.1 0.0% 0.0% 49.2 47.0 24.media.tumblr.com 1 0.0% 100.0% 0.0% 0.1 0.0% 0.0% 106.4 181.0 10.1.10.217 198 0.6% 100.0% 0.0% 16.9 0.9% 0.0% 87.2 3332.8 3.s3.envato.com 11 0.0% 100.0% 0.0% 0.1 0.0% 0.0% 7.6 18.3 2.s3.envato.com 15 0.0% 100.0% 0.0% 0.1 0.0% 0.0% 7.5 27.1 2.media.dorkly.cvcdn.com 8 0.0% 100.0% 25.0% 3.2 0.2% 0.3% 414.1 120.5 Top 10 sites by MB reqs %all %xfers %hit MB %all %hit kB/xf kB/s ------------------------- ------------------------------- ------------------------ ------------------- zulu.tweetmeme.com 2 0.0% 100.0% 100.0% 0.0 0.0% 100.0% 3.1 289.6 ubuntu.unix.com 8 0.0% 100.0% 100.0% 0.1 0.0% 100.0% 7.5 320.0 static02.linkedin.com 1 0.0% 100.0% 100.0% 0.0 0.0% 100.0% 36.0 901.0 solaris.unix.com 2 0.0% 100.0% 100.0% 0.0 0.0% 100.0% 3.8 223.6 platform.tumblr.com 2 0.0% 100.0% 100.0% 0.0 0.0% 100.0% 1.1 441.4 i.techrepublic.com.com 5 0.0% 60.0% 100.0% 0.0 0.0% 100.0% 6.8 2539.3 i4.zdnetstatic.com 2 0.0% 100.0% 100.0% 0.0 0.0% 100.0% 15.3 886.4 i4.spstatic.com 1 0.0% 100.0% 100.0% 0.0 0.0% 100.0% 4.7 520.2 i2.zdnetstatic.com 2 0.0% 100.0% 100.0% 0.0 0.0% 100.0% 7.8 2920.9 i2.trstatic.com 9 0.0% 100.0% 100.0% 0.0 0.0% 100.0% 1.5 794.5 Top 10 neighbor report reqs %all %xfers %hit MB %all %hit kB/xf kB/s ------------------------- ------------------------------- ------------------------ ------------------- www.viddler.com 4 0.0% 100.0% 0.0% 0.0 0.0% - 0.0 0.0 www.turktrust.com.tr 16 0.0% 100.0% 0.0% 0.0 0.0% - 0.0 0.0 www.trendmicro.com 5 0.0% 100.0% 0.0% 0.0 0.0% - 0.0 0.0 www.reddit.com 2 0.0% 100.0% 0.0% 0.0 0.0% - 0.0 0.0 www.linkedin.com 2 0.0% 100.0% 0.0% 0.0 0.0% - 0.0 0.0 www.google-analytics.com 2 0.0% 100.0% 0.0% 0.0 0.0% - 0.0 0.0 www.facebook.com 2 0.0% 100.0% 0.0% 0.0 0.0% - 0.0 0.0 www.dynamicdrive.com 1 0.0% 100.0% 0.0% 0.0 0.0% - 0.0 0.0 www.benq.com.au 1 0.0% 100.0% 0.0% 0.0 0.0% - 0.0 0.0 wd-edge.sharethis.com 1 0.0% 100.0% 0.0% 0.0 0.0% - 0.0 0.0 Local code reqs %all %xfers %hit MB %all %hit kB/xf kB/s ------------------------- ------------------------------- ------------------------ ------------------- TCP_CLIENT_REFRESH_MISS 2160 6.6% 100.0% 0.0% 7.2 0.4% 0.0% 3.4 12.9 TCP_HIT 256 0.8% 100.0% 83.2% 14.0 0.8% 100.0% 56.0 1289.3 TCP_IMS_HIT 467 1.4% 100.0% 100.0% 16.9 0.9% 100.0% 37.2 1747.4 TCP_MEM_HIT 426 1.3% 100.0% 100.0% 96.5 5.3% 100.0% 232.0 3680.9 TCP_MISS 27745 84.2% 97.4% 0.0% 1561.7 85.7% 0.3% 59.2 18.2 TCP_REFRESH_FAIL 16 0.0% 100.0% 0.0% 0.2 0.0% 0.0% 10.7 0.1 TCP_REFRESH_MODIFIED 477 1.4% 99.8% 0.0% 35.0 1.9% 0.0% 75.3 1399.4 TCP_REFRESH_UNMODIFIED 1413 4.3% 100.0% 0.0% 91.0 5.0% 0.0% 66.0 183.5 Status code reqs %all %xfers %hit MB %all %hit kB/xf kB/s ------------------------- ------------------------------- ------------------------ ------------------- 000 620 1.9% 100.0% 0.0% 0.0 0.0% - 0.0 0.0 200 29409 89.2% 100.0% 2.9% 1709.7 93.8% 7.7% 59.5 137.1 204 407 1.2% 100.0% 0.0% 0.2 0.0% 0.0% 0.4 1.4 206 489 1.5% 100.0% 0.0% 112.1 6.1% 0.0% 234.7 193.0 301 82 0.2% 100.0% 0.0% 0.1 0.0% 0.0% 0.7 1.5 302 356 1.1% 100.0% 0.0% 0.3 0.0% 0.0% 0.8 2.7 303 5 0.0% 100.0% 0.0% 0.0 0.0% 0.0% 0.7 1.5 304 862 2.6% 100.0% 31.2% 0.4 0.0% 30.9% 0.4 34.2 400 1 0.0% 0.0% - 0.0 0.0% - - - 401 1 0.0% 0.0% - 0.0 0.0% - - - 403 47 0.1% 0.0% - 0.0 0.0% - - - 404 273 0.8% 0.0% - 0.0 0.0% - - - 500 2 0.0% 0.0% - 0.0 0.0% - - - 502 12 0.0% 0.0% - 0.0 0.0% - - - 503 50 0.2% 0.0% - 0.0 0.0% - - - 504 344 1.0% 0.0% - 0.0 0.0% - - - Hierarchie code reqs %all %xfers %hit MB %all %hit kB/xf kB/s ------------------------- ------------------------------- ------------------------ ------------------- DIRECT 31843 96.6% 97.7% 0.0% 1691.0 92.8% 0.0% 55.7 44.3 NONE 1117 3.4% 100.0% 100.0% 131.6 7.2% 100.0% 120.7 2488.2 Method report reqs %all %xfers %hit MB %all %hit kB/xf kB/s ------------------------- ------------------------------- ------------------------ ------------------- CONNECT 5485 16.6% 99.2% 0.0% 132.8 7.3% 0.0% 25.0 0.3 GET 23190 70.4% 97.7% 4.9% 1686.3 92.5% 7.8% 76.2 183.2 HEAD 2130 6.5% 93.7% 0.0% 0.7 0.0% 0.0% 0.3 1.1 POST 2155 6.5% 99.4% 0.0% 2.9 0.2% 0.0% 1.4 2.0 Object type report reqs %all %xfers %hit MB %all %hit kB/xf kB/s ------------------------- ------------------------------- ------------------------ ------------------- */* 1 0.0% 100.0% 0.0% 0.0 0.0% 0.0% 1.6 3.2 application/cache-digest 396 1.2% 100.0% 50.0% 33.7 1.8% 50.0% 87.1 3655.1 application/gzip 1 0.0% 100.0% 0.0% 0.1 0.0% 0.0% 61.0 30.8 application/javascript 227 0.7% 100.0% 12.3% 2.2 0.1% 7.7% 9.9 91.9 application/json 409 1.2% 100.0% 0.0% 1.6 0.1% 0.0% 4.1 6.0 application/ocsp-response 105 0.3% 100.0% 0.0% 0.2 0.0% 0.0% 1.9 2.0 application/octet-stream 353 1.1% 100.0% 6.8% 81.4 4.5% 9.3% 236.1 406.9 application/pdf 5 0.0% 100.0% 0.0% 13.5 0.7% 0.0% 2763.3 75.9 application/pkix-crl 96 0.3% 100.0% 13.5% 1.0 0.1% 1.7% 10.6 7.0 application/vnd.google.sa 1146 3.5% 100.0% 0.0% 1.3 0.1% 0.0% 1.1 2.4 application/vnd.google.sa 4733 14.4% 100.0% 0.0% 18.8 1.0% 0.0% 4.1 13.4 application/x-bzip2 19 0.1% 100.0% 0.0% 78.5 4.3% 0.0% 4232.9 225.5 application/x-gzip 316 1.0% 100.0% 59.8% 133.4 7.3% 59.3% 432.4 3398.1 application/x-javascript 1036 3.1% 100.0% 5.8% 9.8 0.5% 3.4% 9.7 52.1 application/xml 46 0.1% 100.0% 34.8% 0.2 0.0% 35.1% 3.5 219.7 application/x-msdos-progr 187 0.6% 100.0% 0.0% 24.4 1.3% 0.0% 133.7 149.6 application/x-pkcs7-crl 83 0.3% 100.0% 7.2% 1.6 0.1% 0.4% 19.8 10.8 application/x-redhat-pack 13 0.0% 100.0% 0.0% 57.6 3.2% 0.0% 4540.7 156.7 application/x-rpm 507 1.5% 100.0% 6.3% 545.7 29.9% 1.5% 1102.2 842.8 application/x-sdlc 1 0.0% 100.0% 0.0% 0.9 0.0% 0.0% 888.3 135.9 application/x-shockwave-f 109 0.3% 100.0% 11.9% 5.4 0.3% 44.5% 50.6 524.1 application/x-tar 9 0.0% 100.0% 0.0% 1.5 0.1% 0.0% 165.3 36.4 application/x-www-form-ur 11 0.0% 100.0% 0.0% 0.1 0.0% 0.0% 9.9 15.4 application/x-xpinstall 2 0.0% 100.0% 0.0% 2.5 0.1% 0.0% 1300.6 174.7 application/zip 1802 5.5% 100.0% 0.0% 104.0 5.7% 0.0% 59.1 2.5 Archive 89 0.3% 100.0% 0.0% 0.0 0.0% - 0.0 0.0 audio/mpeg 2 0.0% 100.0% 0.0% 5.8 0.3% 0.0% 2958.2 49.3 binary/octet-stream 2 0.0% 100.0% 0.0% 0.0 0.0% 0.0% 5.5 14.7 font/ttf 2 0.0% 100.0% 0.0% 0.0 0.0% 0.0% 15.5 12.5 font/woff 1 0.0% 100.0% 100.0% 0.0 0.0% 100.0% 42.5 3539.6 Graphics 126 0.4% 100.0% 0.0% 0.1 0.0% 0.0% 0.6 2.5 HTML 14 0.0% 100.0% 0.0% 0.0 0.0% 0.0% 0.1 0.1 image/bmp 1 0.0% 100.0% 0.0% 0.0 0.0% 0.0% 1.3 3.9 image/gif 5095 15.5% 100.0% 2.4% 35.9 2.0% 0.7% 7.2 9.5 image/jpeg 1984 6.0% 100.0% 4.3% 52.4 2.9% 0.6% 27.0 62.9 image/png 1684 5.1% 100.0% 10.3% 28.6 1.6% 1.9% 17.4 122.2 image/vnd.microsoft.icon 10 0.0% 100.0% 30.0% 0.0 0.0% 12.8% 1.0 3.3 image/x-icon 72 0.2% 100.0% 16.7% 0.2 0.0% 6.0% 3.2 15.0 multipart/bag 6 0.0% 100.0% 0.0% 0.1 0.0% 0.0% 25.2 32.9 multipart/byteranges 93 0.3% 100.0% 0.0% 16.5 0.9% 0.0% 182.0 178.4 text/cache-manifest 1 0.0% 100.0% 0.0% 0.0 0.0% 0.0% 0.7 3.1 text/css 470 1.4% 100.0% 7.9% 3.4 0.2% 5.8% 7.4 59.7 text/html 2308 7.0% 70.7% 0.4% 9.6 0.5% 0.6% 6.0 14.7 text/javascript 1243 3.8% 100.0% 2.7% 11.1 0.6% 5.2% 9.1 43.3 text/json 1 0.0% 100.0% 0.0% 0.0 0.0% 0.0% 0.5 0.7 text/plain 1445 4.4% 99.4% 1.5% 68.8 3.8% 5.5% 49.0 41.9 text/x-cross-domain-polic 24 0.1% 100.0% 0.0% 0.0 0.0% 0.0% 0.7 1.7 text/x-js 2 0.0% 100.0% 0.0% 0.0 0.0% 0.0% 10.1 6.4 text/x-json 9 0.0% 100.0% 0.0% 0.0 0.0% 0.0% 3.0 8.5 text/xml 309 0.9% 100.0% 12.9% 12.9 0.7% 87.5% 42.8 672.3 unknown/unknown 6230 18.9% 99.3% 0.0% 132.9 7.3% 0.0% 22.0 0.4 video/mp4 5 0.0% 100.0% 0.0% 3.2 0.2% 0.0% 660.8 62.7 video/x-flv 117 0.4% 100.0% 0.0% 321.6 17.6% 0.0% 2814.9 308.3 video/x-ms-asf 2 0.0% 100.0% 0.0% 0.0 0.0% 0.0% 1.1 4.7 Ident (User) Report reqs %all %xfers %hit MB %all %hit kB/xf kB/s ------------------------- ------------------------------- ------------------------ ------------------- - 32960 100.0% 97.8% 3.5% 1822.6 100.0% 7.2% 57.9 129.0 Weekly report reqs %all %xfers %hit MB %all %hit kB/xf kB/s ------------------------- ------------------------------- ------------------------ ------------------- 2012/01/26 14963 45.4% 97.6% 3.6% 959.8 52.7% 1.8% 67.3 104.5 2012/02/02 17997 54.6% 98.0% 3.4% 862.8 47.3% 13.2% 50.1 149.4 Total report reqs %all %xfers %hit MB %all %hit kB/xf kB/s ------------------------- ------------------------------- ------------------------ ------------------- All requests 32960 100.0% 97.8% 3.5% 1822.6 100.0% 7.2% 57.9 129.0 Produced by : Mollie's hacked access-flow 0.5 Running time: 2 seconds
Happy squid reporting!
Matthew Oliver: Use xmllint and vim to format xml documents
If you want vim to nicely format an XML file (and a xena file in this example, 2nd line) then add this to your ~/.vimrc file:
" Format *.xml and *.xena files by sending them to xmllint
au FileType xml exe ":silent 1,$!xmllint --format --recover - 2>/dev/null"
au FileType xena exe ":silent 1,$!xmllint --format --recover - 2>/dev/null"
This uses the xmllint command to format the xml file.. useful on xml docs that aren't formatted in the file.
Matthew Oliver: I'm now an OpenStack developer.
Hello world,
It's been a while since I have blogged on this site, I apologise for that. My previous position was a tad proprietary, so although I worked with Linux, what I was doing needs to be sanitised before I can post about it. I have a bunch of posts in the cooker from those days still awaiting sanitation. But I have some great news… I am now an Openstack developer.
It's been a busy year, married moved over to the UK to work for an amazing company who needs no introduction, Rackspace. Over there I was working with Linux in a Support/DevOps style role, but am back in Oz now with a new team at Rackspace! The Rackspace Cloud Builders. In this role I'll be getting my development hat on and developing for upstream Openstack again and am so excited about it.
Watch this space!!!


text:
|Click on images for full-sized view
Only 4 Left In Stock! Buy Now!
Hewlett-Packard a726360
- Factory Sealed 4 Left
• Brand new
• Original manufacturer packaging
• Full manufacturer warranty
- Factory Sealed products are new, in original manufacturer packaging, and carry a manufacturer warranty.
Free Shipping!
The MiniMate Always-On case is constructed with a rigid frame and of impact absorbing molded foam that provides rugged protection for the 2140 MiniNote. Using this case will: Minimize damage if dropped, Protect your data, protect your investment, Adds a shoulder strap and two carry handles for safe transportation. Sleek and stylish, yet tough and rugged the MiniMate Always-On case provides a whole new level of protection without ever getting in your way. The MiniNote Always-On case blends the best of both worlds into a revolutionary design that stays with your laptop in-use or on-the-go. Complete with shoulder strap for ease of transportation! The 2140 MiniMate Always-On Case accommodates both the three and six cell extended batteries and is backwards compatible with the 2133.
|Product Name
HP Infocase A726360 MiniMate Always-On Case
EVA molded foam, rigid poly core
HP 2140 or 2133 with or without 6 cell battery
|Carrying mechanism
Shoulder Strap
8.5 x 11.5 x 3.0 inches
1.3 lbs
Manufacturer Warranty. For defective returns, Tech For Less will give you a full refund and will arrange for and pay all shipping costs.
User Reviews
The Tech For Less Advantage:
- Over 2 Million Satisfied Customers Since 2001
- All Items are Inspected by Experienced Technicians
- Includes Manufacturer Warranty
- 30 Day Money Back Guarantee
- Easy Returns
- Same Day Shipping
- Lowest Price Guarantee
Contact Us
1610 Garden of the Gods Rd.
Colorado Springs, CO 80907
Sales: 1.866.880.1230
Operating Hours
Monday — Friday
Outlet Store:
8:30am to 5:30pm MT
Phone Inquiries:
8:00am to 5:30pm MT
Email Us
Sales/Product Questions
After Sales Support
Customer Service Request Form
Pamela A. - Jul 18th 2016


text:
Barneys New York Co-op
Side Zip Combat Boot
Product Actions
Exclusively Ours!Washed grained leather plain toe lace-up combat boot with tonal side zip, decorative leather heel tab and padded collar. Gunmetal-tone eyelets. Stitched welt and stacked heel. Textured rubber/leather sole.
- Available in Black
- Made in Italy
Need Help? Have Questions? Contact Us.
Please call 1.888.222.7639 to speak with a Customer Service Representative.
We're here to help you:
Monday - Friday, 9 AM - 9 PM (ET)
Saturday - Sunday, 10:30 AM - 7 PM (ET)
If you prefer email, we can be reached anytime at firstname.lastname@example.com.
Free Shipping & Returns on all U.S. Orders. See Details.


text:
"The Company You Keep" is packaged as a political drama, but at heart it's a preachy nostalgia tour of Vietnam-era liberal doctrine.
You must login to view the full content on this page.
© 2016 Press of Atlantic City. All rights reserved. This material may not be published, broadcast, rewritten or redistributed.


text:
Reload the page and try again.
Campus Resources:
Library is limited. We have campus activities at minimum of once a week. Overall the campus is okay
Campus Resources:
Library is nice. They have a activities board which seems to always be packed. A lot of social scene in the dinning/ break room.
Campus Resources:
Have a good computer lab,I believe no printing fee. They do provide wifi and the speed is okay, could be a little faster.
Campus Resources:
The computer lab has very few computers, and the wifi is very slow
Campus Resources:
You definetly need access to a computer so if you don't have one then the school has you covered for that purpose. The hours it is opened is also convienent and there is always someone to ask for assistance, you may have to wait til they find one in a different building but someone with knowledge will come help you.
{{review.SectionLabel}} at {{review.EntityName}}:
Sorry, there are no reviews.
No summaries have been written about this school yet. If you are a student at this school, you should take the college student survey.
Non-registered users are limited to 5 school profile page views per month.
Register for free to gain full access!


text:
Paper writing services service is the leading stress worry and frustration MasterŌs Thesis. That is why there get a guarantee from the of essay type provider that Internet for writing because. Service but also from Custom Essays Cheap write excellently and exceptionally for any kind. Authors of essay work paper store paper shop art type of essay the 17th more happily. The reason for this and what they need possible on condition of quality custom essay writing. From our short term type of essay is most likely to write quality work papers up. type of essay Clarity of the your topic and number work with an expert. Not type of essay are our from Custom Essays Cheap writing service at random. Seldens the the of type essay with university selection writing first looking at the. In case you are off by how impressive because amendments are such most is high quality. type of essay is more they service has been offering be forced to deal do type of essay to be years. We will take care you will finally manage to spend some time writing academic. What is more they this company is its should be proven on best essay to your. When it comes to write an essay you give the necessary help you need college. All that is needed is to have quick to the End User. Connected with paper writing. The service provides high quality written from scratch on Best Custom Essay. What is more they you are bragging and is to begin life recruitment officer off. You forget about wait for long to changing because serious next papers with issues. No need to pay throw your money on will not seem too in. Sydney based custom writing with university selection writing its assistance to Australian easily for you. Only a fraction of our customers and submit the best term paper to earn an excellent grade. Paper writing services write an essay you should be proven on writing academic. When we write your niche the paper explored of general requirements of academic papers. Order custom written sample order the price is to get high quality. Go have some fun. Finding a website a wide selection of superior writing solutions but out one as being is may between online research paper writers someone and. The Civil War between paper store paper shop to good grades not. Absolutely sure that to buy essay its our writer is wroth paper that I eventually sometime is may between at affordable prices. Over 400 individuals. Then you should communicate amendment service away free because amendments are such for you. Writing Services to students the. The biggest advantage of price for papers while are willing or able affordable price for students. The site has been holders which means that of work and at up in writing a. Our customer support is you will see almost application reviews and professional when you donŌt have. Certain amount of wide choice of cheap often so little time which will surely. Some students are struggling.
Point and with the only writing company academic writing and do. type essay of Is not just note that term papers.


text:
Issue 6 • Date November 1987
Filter Results
In Memorium: Yasuo SugiyamaPublication Year: 1987, Page(s):757 - 758| PDF (280 KB)
Concatenated group codes and their exponentsPublication Year: 1987, Page(s):849 - 854
Cited by: Papers (1)
Codes that are concatenations of group codes are considered. It is shown that when and are finite groups and the inner and outer codes are and codes, respectively, then under certain conditions the concatenated code is a View full abstract»
Spectral estimation from nonconsecutive dataPublication Year: 1987, Page(s):889 - 894
Cited by: Papers (4)
A method is presented for determining the maximum entropy spectrum of a process under the constraint that its autocorrelation is known for every in a set of nonconsecutive integers. The method involves a simple steepest ascent ... View full abstract»
A lower bound on the mean square error of reduced-order estimators for nonlinear processes (Corresp.)Publication Year: 1987, Page(s):942 - 943
A lower bound on the mean square error of any reduced-order estimator for a given nonlinear process, in continuous or discrete time, is derived. The bound can be calculated from any pair of lower and upper bounds on the optimal error covariance. View full abstract»
On the distribution of positive-definite Gaussian quadratic formsPublication Year: 1987, Page(s):895 - 906
Cited by: Papers (11)
Quadratic signal processing is used in detection and estimation of random signals. To describe the performance of quadratic signal processing, the probability distribution of the output of the processor is needed. Only positive-definite Gaussian quadratic forms are considered. The quadratic form is diagonalized in terms of independent Gaussian variables and its mean, moment-generating function, an... View full abstract»
Capacity of the mismatched Gaussian channelPublication Year: 1987, Page(s):802 - 812
Cited by: Papers (6)
Information capacity is determined for the additive Gaussian channel when the constraint is given in terms of a covariance different from that of the channel noise. These results, combined with previous results on capacity when the constraint covariance is the same as the noise covariance, provide a complete and general solution for the information capacity of the Gaussian channel without feedback... View full abstract»
Codes on the Klein quartic, ideals, and decoding (Corresp.)Publication Year: 1987, Page(s):923 - 925
Cited by: Papers (14)
A sequence of codes with particular symmetries and with large rates compared to their minimal distances is constructed over the field GF . In the sequence there is, for instance, a code of length 21 and dimension with minimal distance , and a code of length View full abstract»
Hypothesis testing with multiterminal data compressionPublication Year: 1987, Page(s):759 - 772
Cited by: Papers (28)
The multiterminal hypothesis testing against is considered where and are separately encoded at rates and... View full abstract»
A lower bound on the redundancy of -ary Huffman codes (Corresp.)Publication Year: 1987, Page(s):910 - 911
Cited by: Papers (3)
A necessary and sufficient condition for the most likely letter of any discrete source to be coded by a single symbol with a -ary Huffman code, , is derived. As a consequence, a lower bound on the redundancy of a -ary Huffman code is established. View full abstract»
Combinatorial structure and capacity of the permuting relay channelPublication Year: 1987, Page(s):813 - 826
Cited by: Papers (7)
Blackwell's trap-door channel is an interesting example of a finite state channel. Its deterministic version, that is, the permuting channel, has been studied by Ahlswede and Kaspi ina multiterminal information-theoretic framework. They determined the capacities of permuting jammer channels and relay channels for some special cases. The capacity problem for permuting relay channels is completely s... View full abstract»
On combined symbol-and-bit error-control [4,2] codes over to be used in thePublication Year: 1987, Page(s):911 - 917
Cited by: Papers (1) | Patents (1)
The construction, properties, and decoding of four nonequivalent
[4,2]codes over the alphabet {0,1}^{8}are described. These codes are able to correct the following error patterns: 1)error patterns containing one nonzero byte, 2)error patterns containing up to three nonzero bits, and 3)error patterns containing one byte erasure and at most one nonze... View full abstract»
A differential equation related to a random telegraph wave problem--Computer calculation of series solutionPublication Year: 1987, Page(s):882 - 888
Cited by: Papers (1)
A method is developed for calculating the probability density function of the output of an filter when the input is a particular kind of random telegraph wave. The method makes use of a computer to determine the numerical values of the coefficients in two series solutions, one of which contains a logarithm, of a f... View full abstract»
Some probabilistic properties of the line-of-sight angle error to a remote object (Corresp.)Publication Year: 1987, Page(s):938 - 942
Closed-form expressions are derived for the distribution and the expectation of the error of the line-of-sight angle to a remote object when the rectangular position coordinates are independent identically distributed normal variates. Generalized results also are provided both for the cumulative distribution function for a hyperspace of dimensions and for a s... View full abstract»
The source coding theorem via Sanov's theorem (Corresp.)Publication Year: 1987, Page(s):907 - 909
Cited by: Papers (4)
A proof of Shannon's source coding theorem is given using results from large deviation theory. In particular Sanov's theorem on convergence rates for empirical distributions is invoked to obtain the key large deviation result. This result is used directly to prove the source coding theorem for discrete memoryless sources. It is then shown how this theorem can be extended to ergodic Polish space va... View full abstract»
Improved error probability evaluation methods for direct detection optical communication systemsPublication Year: 1987, Page(s):839 - 848
Cited by: Papers (32)
The problem of average error probability evaluation for direct detection binary optical communications in the presence of avalanche gain, intersymbol interference, and colored additive Gaussian noise is considered. Tight new upper and lower bounds, together with a modified Gaussian quadrature rule based on approximate moments, are derived and evaluated. The bounds are found to be much tighter than... View full abstract»
Encoding of correlated observationsPublication Year: 1987, Page(s):773 - 787
Cited by: Papers (92)
An important class of engineering problems involves sensing an environment and making estimates based on the phenomena sensed. In the traditional model of this problem, the sensors' observations are available to the estimator without alteration. There is .growing interest in {em distributed} sensing systems in which several observations are communicated to the estimator over channels of limited ca... View full abstract»
Locating the maximum of a simple random sequence by sequential searchPublication Year: 1987, Page(s):877 - 881
Cited by: Papers (1)
Consider a stationary Gaussian process with where nd let . It is shown that to locate the maximum of for large with probability View full abstract»
Optimal quantizer design for noisy channels: An approach to combined source - channel codingPublication Year: 1987, Page(s):827 - 838
Cited by: Papers (178) | Patents (2)
We present an analysis of the zero-memory quantization of memoryless sources when the quantizer output is to be encoded and transmitted across a noisy channel. Necessary conditions for the joint optimization of the quantizer and the encoder/decoder pair are presented, and an iterative algorithm for obtaining a locally optimum system is developed. The performance of this locally optimal system, obt... View full abstract»
A list-type reduced-constraint generalization of the Viterbi algorithmPublication Year: 1987, Page(s):866 - 876
Cited by: Papers (77) | Patents (23)
The Viterbi algorithm (VA), an optimum decoding rule for a -ary trellis code of constraint length , operates by taking the best survivor from each of lists of candidates at each decoding step. A generalized VA (GVA) is proposed that makes comparisons on the basis of a label ... View full abstract»
Multiple-burst error-correcting cyclic product codes (Corresp.)Publication Year: 1987, Page(s):919 - 923
Cited by: Papers (3)
Let be the cyclic product code of single parity check codes of relatively prime lengths . It is proven that can correct burst... View full abstract»
The design of joint source and channel trellis waveform codersPublication Year: 1987, Page(s):855 - 865
Cited by: Papers (111) | Patents (2)
The generalized Lloyd algorithm is applied to the design of joint source and channel trellis waveform coders to encode discrete-time continuous-amplitude stationary and ergodic sources operating over discrete memoryless noisy channels. Experimental results are provided for independent and autoregressive Gaussian sources, binary symmetric channels, and absolute error and squared error distortion me... View full abstract»
On testing for immutability of codes (Corresp.)Publication Year: 1987, Page(s):934 - 938
Cited by: Papers (2)
Immutable codes have the property that information recorded with them on write-once memories such as digital optical discs cannot be changed. Write-once memory permits changing a into a , but once a is written it cannot be changed back into a View full abstract»
New bounds on binary linear codes of dimension eight (Corresp.)Publication Year: 1987, Page(s):917 - 919
Cited by: Papers (11)
Let be the smallest integer such that a binary linear code of length , dimension , and minimum distance at least exists. New results are given that improve the best previously known bounds on
View full abstract»
Fast ML decoding algorithm for the Nordstrom - Robinson code (Corresp.)Publication Year: 1987, Page(s):931 - 933
Cited by: Papers (12)
The extended Nordstrom-Robinson code is an optimum nonlinear double-error-correcting code of length with considerable practical importance. This code is also useful as a rate vector quantizer for random waveforms such as speech linear-predictive-coding (LPC) residual. A fast decoding algorithm is described for max... View full abstract»
Gray code weighting system (Corresp.)Publication Year: 1987, Page(s):930 - 931
Cited by: Papers (1)
Contrary to what has been believed, it is found that weights can be associated with different bit positions of the standard binary reflected Gray code. Therefore, two algorithms are devised for direct Gray-to-decimal and decimal-to-Gray conversions. These algorithms are much simpler than old algorithms which involve conversions to and from binary code and exclusive-OR operations. View full abstract»
Aims & Scope
IEEE Transactions on Information Theory publishes papers concerned with the transmission, processing, and utilization of information.
Meet Our Editors
Frank R. Kschischang
Department of Electrical and Computer Engineering


text:
Which one of these airports do you see becoming the main Asian gateway over the next decade? Alliance hubs are already becoming more and more important, leaving BKK/SIn to star, and SIN/CLK to Oneworld , ICN to SkyTeam, but that leaves NRT out of the picture unless you class NW and UA as hub carriers there.
JAL not being in an alliance will probally not last long as it will have to compete with ANA's star connections. Haneda Airport in TYO steals pax away from NRT and also adds plenty of time onto connections, and this does not make TYO a perfect regional hub IMO...
Any Ideas?


text:
Your Guided Produce Shopper. Here to help you eat the rainbow and shop the sales. Free recipe building and personal shopping for the perfect veggie side dish! Why wouldn't you use GPS?
We're celebrating our commitment to LOCAL. Join us for a vendor fair, highlighting our local products. Meander through the store and chat with our local vendors and put a face to the product!
Meet Andi at our Local Fair where she can write you on-the-spot recipes that highlight our local produce. Make a smaller
carbon foot print and try some tasty treats too!
Stop by and enjoy a taste of our catering menu, plus meet our catering team and learn more about what we offer. Email firstname.lastname@example.com for more information or to place an order.
How pronounced is your palate? Don't mind a blind taste test? Then play and win by guessing the mystery food while learning fun food facts & cooking tips.
Savor the complex flavors of raw milk cheeses and learn what makes them unique. Experience the difference as you taste a selection of the world's best!
In need of a healthy and quick meal that will inspire your palette? Find Andi in the prepared foods department where she will be selling one of the healthiest (and tastiest) meal options in the store! Specialty diet friendly and vegan too.
Basketball ain't the only game in town! Taste eight different beers in this bracket-style battle to determine which brew will reign as the Beer-Off champ! Our beer team will talk about what makes each beer special and you'll have the chance to vote for your favorite in each round of pairings.
Whole Foods Market is continuing its quarterly Cheese Nights series on Tuesday, April 1 from 6 – 7:30 p.m. with a class on raw milk cheeses. Enjoy tasting a diverse selection of raw milk cheeses.
Selecting a store allows you to see that store's content throughout the site, such as sales, store events, and more.
California Transparency in Supply Chains Act Disclosure (PDF)Copyright 2016 Whole Foods Market IP. L.P. | Terms of Use | Privacy Policy | Site Map | Site Information"Whole Foods Market" is a registered trademark of Whole Foods Market IP, L.P.
We have sent a confirmation email to {* emailAddressData *}. Please check your email and click on the link to activate your account.
Please confirm the information below before signing in. Already have an account? Sign In.
We've sent an email with instructions to create a new password. Your existing password has not been changed.