text:
Deportivo La Coruna have moved out of La Liga's relegation zone with a vital 1-1 draw away to seventh-placed Real Betis.While Betis denied Deportivo victory when Jorge Molina equalised after half-time, the point was still enough for the visitors to rise above Celta de Vigo to 17th position, just above the drop zone in Spain's top tier of football.
|D. Perquis
|Javi Chica
|Antonio Amaya
|Álvaro Vadillo
|Rubén Castro
|Jorge Molina
|J. Campbell
|Coach: Pepe Mel
|Manuel Pablo
|Aythami Artiles
|A. Aguilar
|Bruno Gama
|Juan Domínguez
|Coach: Fernando Vázquez
for Álvaro Vadillo 46'
for D. Perquis 55'
for J. Campbell 65'
for Valerón 78'
for Riki 82'
for Pizzi 90+2'
|Hargreaves puzzled by Mkhitaryan omission
|Ballon d´Or breakdown: LaLiga, Premier League dominant amid French renaissance
|Struggling Inter hit with Medel ban
|Messi, Ronaldo and the full 30-man Ballon d´Or shortlist
|Suarez, Vardy complete Ballon d´Or nominations
|Neymar joins fellow heavyweights on Ballon d´Or shortlist
|Neymar joins fellow heavyweights on Ballon d´Or shortlist
|Messi, Modric nominated for Ballon d´Or
|Liverpool strong out of Europe, says Pochettino
|Giroud to make Arsenal return - Wenger
|Giggs hits out at ´laughing´ United players following Chelsea battering
|Schmidt given two-match ban after Nagelsmann slur
|Wenger: 82 points could win the Premier League
|´Chelsea won´t sell to Barca or Bayern´ - Gladbach optimistic over Christensen
|Wenger contract not a priority for Arsenal
|Wenger says sorry for making Arsenal fans suffer
|Sissoko charged by FA for Arter elbow
|Liverpool not even close to 100 per cent - Klopp
|Messi, Neymar and Suarez given three-day break by Barcelona
|´Arsenal can compete on wages´ - Gazidis quizzed on Ozil and Sanchez
|Ibrahimovic and Lewandowski nominated for Ballon d´Or
|What You Might Have Missed: Benfica record, a Plea from Balo and Reto Ziegler´s better than Ronaldo
|Montella warns AC Milan stars: Don´t let first-place prize trap you
|Zorc ´tired of b*******´ on Tuchel, Aubameyang
|West Ham defenders must outsmart Costa, says Ogbonna
|We did not offer ¥1billion for Nagatomo, insist Jiangsu
|De Bruyne, Griezmann join Ballon d´Or shortlist
|Ronaldo isn´t anxious, insists Marcelo
|Renato Sanches wins Golden Boy award for 2016
|´I don´t know if I will be here on Wednesday´ – De Boer unsure on future amid sack speculation
|Ronaldo, Bale among first nominees for Ballon d´Or
|Wenger: Arsenal showed progress with Middlesbrough draw
|Thiago Silva wants to extend PSG stay
|Inaki Williams dismisses Liverpool rumours
|Coutinho does ´amazing things´ - Matip
|Wilshere happy to be out of Arsenal comfort zone at Bournemouth
|Lloris is Premier League´s best goalkeeper - Dier
|Revolution striker Kamara given yellow card for twerking
|Klopp rubbishes ´defensive problem´ claims
|Madrid tracking Dortmund boss Tuchel, claims Watzke
|MLS Review: Dallas win Supporters´ Shield, Sporting KC sneak into play-offs
|Ronaldo has ´addiction for goals´ - Morata
|Emery refuses to point the finger at Di Maria after Marseille draw
|Zidane vows to play Morata more often
|Garcia hails Marseille team spirit after PSG draw
|Neville urges calm at United after Mourinho´s horror Chelsea reunion
|Zamalek 1 Mamelodi Sundowns 0 (1-3 agg): South Africans clinch first CAF Champions League title
|Paris Saint-Germain 0 Marseille 0: Champions thwarted in Garcia´s first game
|Real Madrid 2 Athletic Bilbao 1: Morata to the rescue
|Bailly sustains knee ligament injury
|Simeone frustrated by Atletico´s finishing
|Conte encouraged crowd as Chelsea deserved it
|Chelsea thrashing painful for Mata and United
|Chelsea ´dominant from first minute to last´ - Cahill
|Mourinho blames ´incredible defensive mistakes´ for United loss
|N´Zonzi cools talk of title challenge
|Chelsea 4 Manchester United 0: Rampant Blues humble returning Mourinho
|De Boer: Inter ´played with fear´ in first half
|Juventus confirm Dybala thigh injury
|Guardiola vows to fix Manchester City concerns
|Sevilla 1 Atletico Madrid 0: N´Zonzi strikes to end Simeone´s unbeaten start
|Bayern set to open Robben, Ribery renewal talks
|Puel satisfied with City draw
|Rangers 0 Celtic 1: Late Dembele strike settles Old Firm semi-final
|Croatian player teased for being ´too smart for football´
|Redmond expected City to give up chances
|Feyenoord 1 Ajax 1: Kuyt cancels out Dolberg opener
|Atalanta 2 Inter 1: Late penalty heaps pressure on De Boer
|Voller defends Schmidt over touchline dismissal
|Injured Rooney left out of United squad for Chelsea trip
|Manchester City 1 Southampton 1: Guardiola´s men back on top but winless run continues
|Guangzhou Evergrande clinch record sixth straight Super League title
|´Icon´ Rooney not finished at United - Pereira
|Zubizarreta-Garcia meeting confirmed by Marseille president
|Aspas-inspired Celta thrash Deportivo in Galician derby
|Lorient dismiss coach Ripoll
|Ronaldo´s impact on football is myth-like - Perez
|United not distracted by Mourinho´s Chelsea return - Young
|A-League Review: 20,000th goal helps Newcastle Jets to shock comeback
|Cech laments Arsenal´s lack of composure
|Qatar World Cup worker dies at stadium site
|Galliani wanted Montella at Milan in 2014
|Mourinho hopes never to return to Chelsea
|Barzagli angry with AC Milan defeat
|Iniesta admits ´it could have been worse´ after Barcelona confirm 6-8 week absence
|Mourinho: I´ll never sell Rooney
|Ancelotti admits to bowing to Ronaldo demands
|Ancelotti doubts Conte´s Chelsea can win Premier League
|Romagnoli happy at Milan amid Chelsea links
|City must not change their style - Gundogan
|Conte wants to emulate Mourinho
|Montella: Rising Milan must handle new expectations
|Rummenigge dispels Alaba-Manchester City reports
|Success the key to building connection with fans - Mourinho
|Gundogan hails ´amazing´ duo Guardiola and Klopp
|AC Milan players influenced ref for disallowed goal, fumes Allegri
|Allardyce incident a tragedy, says FA chief executive Glenn
|Locatelli can´t comprehend beating Buffon
|Mentality the key for Chelsea battle, says Rashford
|Klopp hints at Gerrard return
|Ancelotti hints at future Costa selfie
|Luis Enrique salutes Barca´s spirit in adversity
|Iniesta ruled out for up to eight weeks
|AC Milan 1 Juventus 0: Locatelli wondergoal seals controversial victory
|Ribery ready for Bayern Munich return
|Buffon given vote of confidence amid Donnarumma reports
|Clean sheet pleases Ancelotti
|Pulis tips Liverpool for title tilt
|Alonso delighted with dominant Bayern display
|Klopp: West Brom draw would have been a joke
|De Boer praises Icardi mentality amid ultras row
|Valdes recovery heartens Karanka
|Spanish football can´t have such a disgraceful referee - Pitarch rages after Barcelona loss
|Luis Enrique fears long absence for Iniesta
|Bilic insists West Ham deserved last-gasp win
|Dortmund were not ready for Bundesliga intensity - Tuchel
|Liverpool 2 West Brom 1: Mane and Coutinho on target for Klopp´s men
|Bayern Munich 2 Borussia Monchengladbach 0: Champions back on track thanks to Costa and Vidal
|Brazil great Ronaldinho considering three contracts
|Luis Enrique, Valencia condemn missile throwing after Barcelona winner
|Wenger to raise a glass after toasting Cech
|Dyche delighted to see Clarets get back to basics
|Moyes claims winner should have been ruled out
|Karanka declares Cech man-of-the-match as Boro make their point
|Leicester power too much for Palace - Pardew
|Last-minute winner even sweeter, says Suarez
|Mazzarri: Watford should have had two penalties
|Phelan demands fight from Hull
|Better than Messi but behind Ronaldo - the stats behind Neymar´s first 100 LaLiga games
|Ranieri rewards ´best performance of the season´ with cake
|He was due one! - Hughes revels in Shaqiri´s free-kick success
|Boro deserved a point - Cech
|Koeman: Burnley defeat is unfair on Everton
|Bradley takes positives from disappointing draw
|Suarez and Neymar struck by missile after Messi winner
|Valencia 2 Barcelona 3: Messi penalty snatches win but champions fret over Iniesta injury
|West Ham United 1 Sunderland 0: Late Reid strike seals it for the Hammers
|Emery calm over Thiago Silva Juventus talk
|Burnley 2 Everton 1: Last-minute Arfield strike earns the points
|Arsenal 0 Middlesbrough 0: Birthday blank for Wenger´s table-toppers
|Leicester City 3 Crystal Palace 1: Champions return to winning ways
|Swansea City 0 Watford 0: Encouraging signs, but no win for Bradley
|Hull City 0 Stoke City 2: Stunning Shaqiri double sinks Tigers
|Pochettino ´positive´ over Kane fitness
|Ingolstadt 3 Borussia Dortmund 3: Pulisic rescues a point
|Spalletti looks to end Blind feud
|I did not see Sissoko elbow - Pochettino
|Barcelona confirm Iniesta ligament damage
|Howe thrilled with Bournemouth display
|Arter: Sissoko elbow was an accident
|Garcia claims he snubbed West Ham approach
|Sampaoli different to Bielsa, says Simeone
|Bournemouth 0 Tottenham 0: Cherries hold toothless Spurs
|Lippi named China boss after Guangzhou cancel contract
|Simeone expects title challenge from Sevilla
|Special quality makes Messi better than Ronaldo - Tite
|Zidane reassures Morata: This is a marathon
|Ronaldo made himself - Ferguson
|A-League Review: Victory and Roar get first wins
|Blind hits back at Spalletti in Strootman row
|Mourinho has not lost his magic, insists Mikel
|Suarez open to Ajax return
|Young: There is more to come from Pogba
|Digne at home in Barcelona and ready to help win trophies
|Defoe´s finishing is ´absurd´ - Bilic
|Stekelenburg grounded despite penalty heroics
|Thiago Silva can be our Pirlo - Juve CEO hints at move for PSG defender
|Koscielny calls for ´tough´ Arsenal
|Birthday boy Wenger: Result will determine celebrations
|MLS fines Drogba for Impact snub
|Klopp backs Sturridge to bounce back
|Conte: Chelsea still scarred from last season
|Giggs: United decline was not inevitable


text:
The Mabee Farm's in Rotterdam Junction will play host to prominent 18th century citizens of the Schenectady area during a Colonial Festival Dinner, the featured event of the Schenectady Heritage Area's Annual Schenectady Colonial Festival.
Participants are likely to meet General Schuyler, soldiers on campaign, a Sachem of the Mohawk Wolf Clan, merchants or land speculators working for the Western Inland Lock Navigation Company, and several members of the Mabee Family and their household. Part of the Mabee's farm in Rotterdam Junction, the inn was frequented by military leaders, Native American traders, bateau men and many others traveling the Mohawk River. Continue reading

subset: commoncrawl


text:
FORT WAYNE, Ind. (Indiana's NewsCenter) - That question was examined today at a free lecture at the downtown Allen County Public Library.
Doctor Earl Grinols, Economics Professor at Baylor University, spoke on weighing the costs and benefits of legalized gambling in cities.
While researching his work entitled "Casinos, Crimes, and Community Costs" Grinol estimated that for every "positive" dollar brought into a community by a casino. There are at least 3 "negative" dollars in gambling-related crime in the area.
(© Copyright 2009 Indiana's NewsCenter. All Rights Reserved.)
Stay up to date, subscribe to the Local & Regional RSS Feed. Click to find out about RSS.
What are your thoughts on this story? CLICK HERE to leave us "Your 2 Cents."
What are your thoughts CLICK HERE to leave us a "QUESTION OF THE DAY" comment.
© Copyright 2016, A Quincy Media broadcasting station. All rights reserved. This material may not be published, broadcast, rewritten or redistributed.


text:
Out of stock
bhupendra kshetri | 3 days ago |
I think the stock items quantity should be updated frequently so that our orders will not be cancelled afterwards. And the product is very good.
Sudeshna101 | 4 days ago |
Laki | 11 days ago |
Product is good! Service is very efficient :) appreciate it


text:
Photo Differences Can Dramatically Alter First ImpressionsJune 5, 2014 • Contributed by Zawn Villines, GoodTherapy.org Correspondent
If you think you spend too much time worrying about your social networking profile photo or your professional head shot, think again. A new study suggests that even small changes in a photo can dramatically affect the way the photo's subject is perceived.
First Impressions Matter
We've all heard that first impressions matter, and most of us are taught to be meticulously careful about how we present ourselves to the world. Several studies on the effects of first impressions suggest that the importance of a first glance can't be overemphasized. A 2014 study, for example, found that even fact couldn't override first impressions. In that study, research participants ignored what they heard about a photo subject's sexual orientation and instead based their conclusions on the first impression they gained from the photo. A 2006 study showed that first impressions are fleeting moments, and that most people develop an opinion within a tenth of a second of meeting or seeing someone new.
Minor Changes in Photos
The most recent study on first impressions, published in Psychological Science, points toward the importance of photographic first impressions. Researchers showed study participants several head shots, then asked participants to rank the photos' subjects on personality traits such as intelligence, creativity, trustworthiness, and attractiveness. They found that small changes in the photo subjects' expressions yielded big changes in first impressions. In fact, the addition of a toothy grin or a subtle dip of the chin led study participants to offer significantly different evaluations of the same subjects. The difference was so dramatic that there was as much variability for a single photographic subject depending upon his or her expression as there was between subjects.
Researchers also found that participants' impressions of a photographic subject changed depending on context. A subject being judged as a potential date was assessed differently than one being assessed for a job or political candidacy. There was no single "right" expression or photographic style, then. You really do need different photos for your personal and business websites, and a silly photo that makes friends like you more could cause potential employers to judge you more harshly.
- Even fact will not change first impressions. (2014, February 14). Retrieved from http://www.sciencedaily.com/releases/2014/02/140214111207.htm
- Todorov, A., & Porter, J. M. (2014). Misleading first impressions different for different facial images of the same person. Psychological Science. Retrieved from http://pss.sagepub.com/content/early/2014/05/27/0956797614532474.abstract
- Wargo, E. (2006, July). How many seconds to a first impression? Retrieved from http://www.psychologicalscience.org/index.php/publications/observer/2006/july-06/how-many-seconds-to-a-first-impression.html
© Copyright 2014 GoodTherapy.org. All rights reserved.
The preceding article was solely written by the author named above. Any views and opinions expressed are not necessarily shared by GoodTherapy.org. Questions or concerns about the preceding article can be directed to the author or posted as a comment below.
- 4 comments
- Leave a Comment
CarltonJune 5th, 2014 at 3:36 PM
We can't always choose what others see in us. It is best to share your photos only with those with whom you are friendly and hope for the best when it comes to potential employers.
Joe DJune 6th, 2014 at 4:20 AM
I wish that more people would think long and hard before posting just any old picture online for the whole world to see. I look at some people's photos and I wonder why on earth they would ever share that with the world? We all have our bad moments but that doesn't mean that I will then broadcast that to every joe schmo with internet access! I do want to move ahead in my career and have a family and are these the kinds of things that I want to come back and keep me from having the best chance of having all of that? I know that young people think that no one is looking except friends, but believe me there is always someone out there looking and when they want to find something on you they will.
TaylaJune 6th, 2014 at 8:41 PM
There has already been a huge uproar lately over photoshopping and this is not the messge that we need to send out to our young kids. We should teach them that it is fine to post photos but to also think about the message that that one shot may give to others. A picture is always worth a thousand words… what do you wnat those words to be that are said about you?
GeorginaJune 8th, 2014 at 5:12 AM
Isn't it crazy how our mind plays tricks on us?
We may know that this is the same person just with a different expression on their face or even that it is posed in a different setting, but we still let those external things impress on us ideas about what we think about the subject of the photo.
Leave a Comment
By commenting you acknowledge acceptance of GoodTherapy.org's Terms and Conditions of Use.
Search Our Blog
Recent Comments
- Geoffrey: I suggest you read about the roots of Narcistic Disorders. We are all insecue and we need, what I call, An Esteem Engine". To focus...
- Geoffrey: Thanks for the positive support. Just to say: Many people fall into a habit of getting depressed mainly because of the cloer people come...
- anne: Everyone needs to feel wanted and loved
- Catherine: I am so glad that I have a better capability now as an adult to mange and handle stress than I did as a child growing up, but I think...
- Laurence: Again this is a MAY sort of situation, nothing ever definitive. There could be other things going on in the home that would influence...


text:
Anthony Anderson and Jesse Bradford, stars of the new NBC sitcom "Guys With Kids," chat about working with Kareem Abdul-Jabbar and 19 babies on set. "Guys With Kids" premieres Wednesday, September 26 at 8:30pm ET on NBC.
Published at 8:33 PM GMT on Aug 15, 2012 | Updated at 9:41 PM GMT on Mar 4, 2014


text:
Yankees take on the Rays 7-2-14
Wednesday, July 02, 2014 4:50 PM
Inappropriate photo? Alert us.
New York Yankees second baseman Brian Roberts (14) is late with tag as Tampa Bay Rays right fielder Kevin Kiermaier (39) is safe at 2nd base as the New York Yankees take on the Tampa Bay rays at Yankee Stadium in Bronx, NY 7/2/14 (William Perlman-The Star-Ledger)
Related articles
- WATCH: Derek Jeter tries to bunt and hits fan in the face with foul ball July 02, 2014, 6:15 PM
- Rays beat Yankees, 6-3, to complete three-game sweep July 02, 2014, 4:42 PM
- D'Alessandro: There are no easy solutions to the Yankees anemic hitting -- just ask the hitting coach July 02, 2014, 10:00 PM


text:
Recently added item(s) ×
You have no items in your shopping cart.
Get Ready!
Make Your Shabbat Yours
Designers Hot Right Now
Wedding & Engagement:
Bar & Bat Mitzvah:
New Baby:
Quick Links:
Find the Judaica You're Looking For
Shop Judaica By Artist
Shop Judaica By Theme
Shop Seasonal Judaica
Shop Jewelry:
Shop Jewelry by Price:
Shop Jewelry by Recipient:
Shop Art by Theme:
All Your Wedding Essentials!:
Please, log in before adding products to registry.
Each side of the cup stem has 6 colorful squares of glass, for a total of 12, representing the 12 Tribes of Israel. It has gold type in Hebrew on one side and English on the other. There is also a strand of beads to emulate the streamers of Miriams tambourine. Handmade, each one is unique.
Dimensions are 7" H.
Here are some items you would also enjoy!
Check out some other beautiful pieces by your favorite artist!


text:
Have you ever purchased from PartSelect.com before?
Thank you for helping make our site better.
PartSelect Number PS11743765
This part provides the tension required for a multi-ribbed belt. It also serves to help the belt to rotate the drum. This arm is what attaches to the idler pulley wheel.
This part works with the following brands: Whirlpool, Admiral, Estate, Inglis, Kenmore, KitchenAid, Roper, Maytag, Crosley, Jenn-Air, Hardwick, Magic Chef, Amana, Caloric & Glenwood.
This part fixes the following symptoms:
took off fabric softener dispenser. used socket to remove agitator. Cleaned and then replaced the little plastic dog ears...works like brand new! It took 15 minutes or less.Also repaired noisy dryer. replaced drum rollers, pulley and belt. The job took about an hour and was real simple. However..the dryer was still noisy. Fixed with a prybar to force drum to be tighter. It now sounds like brand new.
Help other customers find the most helpful instructions.
Were these instructions helpful?
I took the long way around and removed the back with the nutdriver (8mm), unscrewed the lint catcher from the top and back (phillips). From there, I reached around and unscrewed the support brackets (9/16"). Once I confirmed the problem, I ordered the parts. There was really nothing wrong with the belt or pulley, but considering its age, I figured it was easier to replace now while I already had it apart.Once I received the parts (about 3 days), I removed the front of the dryer by popping the top of the cabinet off, and the kick plate at the bottom with a flat screwdriver. Then, I removed the two screws holding up the door at the bottom, and the two holding it from the inside top. Once the front came off, I removed the idler pulley from the bottom, and the drum fell out. I was left with an empty cabinet with the exception of the motor.I replaced the tri-rings on the support shafts, which was the most time consuming part of the whole ordeal. Those buggers are tight. I ratcheted the support brackets back on , removed the belt from around the drum and replaced it with the new one. I added the idler pulley back in, placed the drum against the back, and hooked the belt back around the motor. I also replaced the lint seal that goes from the drum to the catcher before putting it all back together.I wish all machines were as easy as this dryer to repair.
I removed the 2 screws in the lint filter. Then pried up the top of the dryer. I removed the 2 screws inside the front panel at top.I then unplugged the wires inside attached to the front panel. I pulled up on front panel and removed it. I then lifted out the drum and set aside. I replaced the 2 drum wheels prying off the plastic retainers. I didn't relpace the tension pulley as I didn't have one. I took old belt off drum and replaced it with the new one and replaced drum. I held up the drum with a bungee cord while I rethreaded the belt. I put the front panel back on and replaced the screws. I then plugged the wires back together. I put the top down and then replaced the 2 screws in the lint filter. I relaced the lint filter and tested the dryer. The noise was gone and new belt installed. fairly simple.
PartSelect you have to have the best online customer service in the industry. No, I take it back. It's the best online service I've experienced anywhere. Period. Your online parts lookup showed me all the parts I needed. Nothing more. You have excellent installation videos which also came with the confirmation email.The percentage of repairs for each spare part helped me to accurately diagnose the problem. The dryer problem was in the motor bearings and not the roller wheels as I had originally thought. Smart idea. All the parts fit perfectly and installed exactly as your videos described. But the best thing is I got the complete order delivered in two days. Your entire end-to-end customer care is terrific. My wife is happy with the repaired dryer. And you guys made me look like a hero. Thanks again. Charlie in Napa. CA.
The instructional videos were very helpful in diagnosing and correcting the problem. I order the idler pulley and decided to replace the drum support rollers since I had to open it up. It was very simple to do and did not take long. The old pulley was completely shot. It sounded like a baby rattle when rolled by hand. Now the old dryer runs like new. Parts were delivered quickly and I am very happy with the service!
Removed screws fastening lint catching housing. Unpluged door open switch and removed nuts on front panel. Before removing front of dryer, I bent a piece of a wire hanger into a hook and tied a string to it and tightly to the top rear panel of the dryer. I then put the hook along the top of the drum to hold it so that it could be removed easily without falling when lifting the front panel off. I then removed the drum which opened the entire internal of the dryer for viewing. Before ordering parts, I removed the belt and ran the motor to realize the motor seemed to be creating the screeching noise. Upon futher review I noticed other parts were worn. I oreded and replaced the idler pulley and drum support rollers. I then removed screws in rear of the dryer to replace the fan from the motor shaft. I realized after a few minutes that the fan attached to the motor shaft was reversed threads. I could not remove the fan assembly from the motor shaft so with a drill,I drilled several holes in the fan and cut it off of the shaft with a hack saw. I now had to purchase a fan. The installation of the fan and motor were very simple. I again used the string and hook to secure the drum while reassembling the new belt through the idler pulley and to the motor. Turned a few nuts and all was complete. It now runs as it did when it was new.
I started my repair by watching the PartSelect.com videos about idler pulley and support roller replacement so I could become familiar with disassembly and reassembly of the cabinet. Use a vacuum to clean up as you go. You might be surprised by the amount of lint that has collected inside the cabinet. Also, be careful of sharp edges. There are lots of sharp edges and pointed screws that can cut. 1) Remove back - 6 screws 2) Remove dryer vent housing - 2 screws on top, 3 on bottom - lots of debris here to dump out and vacuum 3) Pop the top open and lean it against the wall 4) Remove front of dryer cabinet - 2 screws and the door switch connector 5) Remove the belt 6) Remove the drum and idler pulley 7) Clean up all lint 8) Remove blower fan by putting a large adjustable wrench on the square lug on the backside of the blower fan. Put another wrench on the squared off end of the motor shaft. From the front of the dryer, turn the motor shaft clockwise to loosen while holding the other wrench on the blower lug. 9) Pop off motor retainer clips front and back, remove motor power connector10) Clean up more lint11) Install new support rollers12) Install new motor, put motor clips back on13) Install new blower fan. With the motor installed, screw the blower on the shaft until it seats, then put a wrench on the blower lug to hold it in place. Put another wrench on the square part of the motor shaft and, from the front of the dryer, turn the wrench on the motor shaft COUNTER CLOCKWISE to tighten. I have no idea about how much torque to apply.14) Remount the drum, making sure it's riding on the rollers correctly.15) Replace or remount the belt and idler pulley. 16) Carefully line up and then reattach the front of the cabinet. Reconnect the door switch17) Check the drum rotation by spinning it round a few turns before closing up the cabinet. Make sure the belt and rollers are in their proper place. Close the top lid.18) Reinstall the dryer vent and lint filter19) Put on the back cover
Found the drum roller worn out. Replaced the roller, belt and idler pulley. Took drum out and replaced per your insrtuctions.
Previous repair experience: a few months ago pump failed (jammed by daughter's sock).took washer out on deck, drained it, took everything I could find off, THEN found this site, and easy directions. This time: Found exploded drawing and description of problem, removed front panel, found broken belt. Phone call to delightful staff, parts arrived in a few days. More work to keep other household items out of the way than to do the job. Idlerpulley just drops in place, work the belt around the drum, idler and onto the drive gear.An extra hand would have been helpful to keep the drum in place, and my four year oldwas intimidated by the task, though she is capable of doing it- ended up just propping itup with a flashlight. Replace front panel, turn drum by hand to assure everything is inplace, and start drying clothes. Moral of the story.....don't wait until you HAVE TO dolaundry, and check here first for repair help!
Removed the two screws to the lint screen. Popped open the top panel and swung up to open.Removed the two socket head screws holding on the front panel and then lifted up and out to remove the panel.Disconnected the drum belt from the bottom tensioner pulley and then removed the drum.I then replaced the two drum support rollers and the belt tensioner pulley. I put the new belt around the drum and reinstalled the drum. From the bottom, I threaded the new belt around the new tensioner pulley.I then reinstalled the front panel and top panel in the reverse of disassembly.All went well.
Watched video on changing belt and idler pulley first. That is the most important and helpful video I have ever encountered. Be sure and clean out your vent duct while you are at it. Very easy repair.
I started by removing the back of the dryer thinking that was the proper procedure. That is where I found the broken belt. After purchasing the belt I found belt replacement instructions on-line. The instructions guide you through simple steps to remove the two screws in the area where the lint filter is on top of the dryer. The top then simply lifts back exposing the drum. Two more screws just inside the top of the front panel and two screws to remove the door switch assembly and your in. That is where I found the bent idler pulley assembly that pops free when the belt breaks. I purchased the part and followed the directions and then re-assembled the dryer. Dryer works like new. The most important thing I learned through this is that I believe I can now fix anything that breaks on my dryer. With the all the information that is available on-line and the easy access to replacement parts dryer repair is really cheap and simple. Makes me wish I had done some troubleshooting on my previous dryer before I replaced it. Also going through the back of the dryer was a waste of time.
I removed the front cover and then the dryer drum.I replaced the idler pulley then fed the new belt to the motor pulley.The repair was simple and took about fifteen minutes.
I'm a retired industrial machine mechanic of 40+ years. I found you instructions very good. I can not kneel. So I tilted the unit Back to rest on the deep sink. This was a good position to clean and replace the parts I ordered from your company. Witch were a perfict fit. My unit has a bottom hinged door. That's what I used the 2" C clamp for. To keep the door from slamming shut. Thank you for all your support. It was outstanding.
The original idler assembly was an inferior part. Instead of a wheel, it simply had a nylon strip attached to the arm. The belt rode against the strip and eventually wore it out. When the belt began running against the metal, it would not longer move causing the motor to eventually destroy the belt. Access to the idler assembly and belt is from the front of the machine. First remove the two small screws from under the door to the lint filter. Lift the top of the machine and tilt back. You have to move the top slightly forward from the base in order to lift it. Unplug the door switch. Remove the two screws (one on each side) that hold the front of the machine to it's sides. Lift up slightly on the front of the machine to disconnect it from the bottom. Move the front of the machine out of the way. The drum will drop down, but will not fall out. The idler is underneath the drum. It is not held by screws. It is simply a curved spring with the idler wheel attached. Bend it down to loosen the belt. Remove the belt from the idler and the idler from the base making note of how the belt runs through the idler. Replace the belt making sure the grooved side of the belt runs against the drum. Install the idler into the slots in the base of the machine. Fit the drum back into the back of the machine making sure the gasket does not get folded. Install the belt through the idler by bending the idler down to relieve the tension on the belt. If the idler and belt are properly installed, when you release the idler it will put tension on the belt. Re-install the front and top. Make sure you plug in the door switch before attaching the top. Warning: there is a lot of sharp metal inside a dryer. Be careful working around it.
All brand logos are trademarks of their respective owners.
The PartSelect logo is a Registered Trademark of Atlantic Laundry Centres, Ltd.
Copyright © 1999-2016 , Eldis Group Partnership. All rights reserved.


text:
Does this also work for no see ums? :)
Hi Radha, Yes!
Would you modify this at all for young children? At approx. what age would you say it's safe to use?
Hello Joriel,
I use this on my 6 year old son and have since he was about 4 years old. You could lower the dilution for younger ones. The thing with mosquito repellants is that they do need to be strong to be effective. None of the essential oils used in this recipe would be contra-indicated for children. Just be sure they don't get any on their hands and then rub in their eyes. I cannot recall ever using mosquito repellent for my son when he was an infant. Hmmmm.. will have to think about that one.
Sign up for our newsletter to get the latest information on classes, events and aromatherapy training!
Copyright 2016 The School for Aromatic Studies
All material provided on this website is provided for informational or educational purposes only, and is not intended as a substitute for the advice provided by your healthcare professional or physician.


text:
MEMBER LOGIN | REGISTER | Forgot Password
Calix, Inc. is a leading provider in North and Latin America of broadband communications access systems and software for copper- and fiber- based network architectures that enable communications service providers to connect to their residential and business subscribers. Calix enables communications service providers to provide a wide range of revenue-generating services, from basic voice and data to advanced broadband services, over legacy and next-generation access networks. The Calix Unified Access Portfolio helps these companies to transform their legacy and mixed protocol access networks to fiber and Ethernet.
For more information, please visit www.calix.com.
Historically, network infrastructure is the most expensive component in a mobile operator's overall CAPEX, which holds true in China, the biggest and fastest growing 4G market in the world. This report provides an in-depth overview of market revenue, equipment shipments, and the competitive landscape for carriers. Buy now


text:
BURLINGTON, Vt. — The U.S. Small Business Administration has named Katy Lesser, owner of Healthy Living Market here, as its 2010 Vermont Small Business Person of the Year. The award makes Lesser eligible for the National Small Business Person title later this month. Healthy Living Market, Vermont's largest natural foods market, is a family-owned business that's been in operation for 24 years. Lesser was selected for her leadership related to the company's staying power, employee growth, ...
REGISTER TO VIEW THIS ARTICLE - Register for a Free Account
Why Register for FREE?
Registering for content on Supermarket News will give you INSTANT access to invaluable articles and media content that industry professionals rely on. You will have access to our special reports, feature articles, and industry analysis. It's FREE, easy and quick. What are you waiting for! In addition you will also receive complimentary access to the SN salary survey data tables.
Click here to read the FAQ page if you have any questions (opens in a new window)
Attention Paid Print Subscribers: While you have already been granted free access to SN we ask that you register now. We promise it will only take a few minutes! Or visit your profile and add your print magazine account number and zip code.


text:
Sign Up
Log In
Size:  (regular)
This cache is part of a series. If you don't know celestial navigation, we suggest that you do the others first. Even if you do, use the tables in this series for your calculations. Good Luck!
Additional Hints
(No hints available.)
What are Attributes?
Advertising with Us
There are no Trackables in this cache.
View past Trackables
What are Trackable Items?
View all bookmark lists...
64 11 1
View Logbook | View the Image Gallery of 8 images
**Warning! Spoilers may be included in the descriptions or links.
Current Time: 10/28/2016 12:59:14 Pacific Daylight Time (19:59 GMT)Last Updated: 2015-04-21T04:00:09Z on 04/20/2015 21:00:09 Pacific Daylight Time (04:00 GMT) Rendered From:UnknownCoordinates are in the WGS84 datum


text:
They got their first taste of playing against the young point guard Tuesday night and came away impressed.
Wall had 13 points, seven assists and four rebounds for the Washington Wizards in their 98-92 loss to the Pistons.
"He's quick," Pistons point guard Rodney Stuckey said. "He's really fast. He's going to be a good point guard in this league. He's still young, still learning. But he's going to get it."
Pistons coach John Kuester agreed with Stuckey's assessment.
"He's talented," Kuester said. "He's very talented. He's probably as fast as any guard going up and down the court."
Wall, the No. 1 pick in this year's NBA draft, used that speed to blow through the Pistons for a layup late in the game, drawing a strong reaction from the crowd at Huntington Center.
He went 5-for-12 from the field and missed some jumpers, an area of his game that needs work. He also had six turnovers.
Despite his flaws, he clearly is a young star on the rise.
"Wall will be a great player in this league," Kuester said.
Heading home
The Pistons were the home team, but the game marked the finale of a strange four-game "road trip" that took them to Grand Rapids, Syracuse, N.Y., and Columbia, S.C.
Kuester was asked how he felt about the Pistons playing in Toledo.
"I didn't know we had as many fans in the Toledo area," he said. "It's good that we are able to play in front of more Pistons fans."


text:
Tasting Notes
Delicate, yet full flavored. Fresh fruit flavors of guava and flavors of Bartlett pear are perfectly balanced with a refreshing acidity.
Technical Notes
Almaden's rich history spans nearly 16 decades. In 1852, founder Etienne Theé planted California's first vineyards with vines from his home in France, naming it Almaden Vineyards after a local mine in the Los Gatos area. We are proud to say that California's winemaking began here, and since then, we've become one of the leading winemakers in the country.


text:
Coaching with the philosophy of "True Unity = True Empowerment" - Michael Ray Sholars
It has been an amazing journey thus far!
Pro American football playing and coaching career is documented.
Career Highlights.
Early years.
Connect with Mike Sholars via social media. Official Twitter, Facebook page, Instagram, Blog and Google + feeds
Here You may find TV, Radio, Magazine and Newspaper media references documenting his professional European career.
Mike Sholars


text:
Your MyAtlantis Account
Log In
Online Account Benefits
Terms and Conditions | Privacy Policy | *Must be a Club Paradise member to view your Club Paradise comp points, tier level, and win/loss statements.
Special Offers & Packages
Login Special - 20% Off All Tower Rooms
Escape to Atlantis this fall and enjoy 20% off all tower rooms.* Located near Reno's exciting a...
Thunder From Down Under
Prepare to be Thunderstruck! Australia's Thunder From Down Under, the inter...
Samuel Smith Beer Dinner
Please join us for a fun and festive evening in the Bistro Napa featuring S...
Hotel Accommodations & Resort Amenities
Bed and Breakfast
Book the ultimate getaway to Reno-Tahoe with our special bed and breakfast...
Complimentary Night Offer
Book two nights and get the third night free! Log in to your MyAtlantis Onl...
Casino Games & Special Events
Free Super Draw 6 Online Video Poker Contest
Log in to your MyAtlantis Online Account to join our contest for your chance to win great prize...
Atlantis Exclusive Progressives
Win your share of over $4,500,000 in Atlantis Exclusive Progressives. Featu...
Pirate Halloween $50,000 Slot Tournament
Get yer cut of the treasure at this action-packed slot tournament. Receive...
Dining & Restaurants
Samuel Smith Beer Dinner
Please join us for a fun and festive evening in the Bistro Napa featuring Samuel Smith Brewery.
Atlantis Steakhouse
Savor the finest cuts of steaks and chops from a wide-ranging menu of delic...
Spirited Dining Series
Don't miss our exclusive Spirited Dining Series events where we collaborate...
Entertainment & Nightlife
Thunder From Down Under
Prepare to be Thunderstruck! Australia's Thunder From Down Under, the internationally acclaimed...
Free Super Draw 6 Online Video Poker Contest
Log in to your MyAtlantis Online Account to join our contest for your chanc...
Halloween Costume Contest
Dress up for a chance to win up to $500 in Free Play! Winners announced at...
Spa & Salon
Fall Spa Features
Get your skin glowing this fall with exfoliating and hydrating treatments from Spa Atlantis.
Spa Packages
Immerse yourself in Spa Atlantis, Reno's only Forbes Four-Star Luxury Spa.
Atlantis Salon
Get your glamour on right here. Look and feel your best with expert cuts an...
Meetings & Conventions
Request a Meetings Proposal
We have designed a program to reward both the business traveler and…...
Floor Plans
We've doubled our convention space with a newly-designed Grand Ballroom…...
Corporate Connection
We have designed a program to reward both the business traveler and travel...
Request A Wedding Proposal
Ready to get started on your planning. Please complete the form to begin…...
Bistro Napa
Savor contemporary cuisine inspired by Napa Valley in a sophisticated, vibr...
Activities & Reno-Tahoe Community Events
Reno Attractions
Book your stay at Atlantis and you're in the center's of Reno's exciting attractions including...
Flights to Reno
Traveling to Reno? Find airlines with flights to Reno / Tahoe Airport, RNO.
Atlantis Reno resort app
Make reservations, play free games and contests, log in to see your offers.
Atlantis Race & Sports app
Place wagers as low as $1. Bet on the go anywhere in the state of Nevada.
Email Club Sign-up
Please enter your email address to receive special offers, promotions and hot deals.
Bring your girlfriends and experience an unforgettable girls getaway. Enjoy exquisite spa experiences at our award-winning spa. Your getaway isn't complete without dinner at Bistro Napa, featuring cuisine inspired by Napa Valley, unique cocktails created by our own mixologists and a 4,000-bottle wine cellar. Complete your ultimate getaway with a stay in one of our luxurious Luxury Tower rooms, boasting views of the Sierra Nevada mountains and city lights of Reno.
Rates starting from $435.00 total (based on double occupancy)
• 1 night Luxury Tower Accommodations for Friday
• $100 Dining Credit at Bistro Napa
• Two (2) $110 Spa Credit at Spa Atlantis
Use Offer Code: GFGETAWAY
For room & package reservations, please call 800.723.6500
Must be 21. Management reserves all rights. Subject to promotional availability. Promotion is valid now through December 23, 2016. Excludes blackout dates including July 1-4, 2016, August 2-6, 2016, September 2-4, 2016, November 24-25, 2016 and December 23-31, 2016. A daily $2 tourism surcharge and a resort fee of $18 plus 13% room tax per night of stay apply. Resort fee includes: Access to our Cardio Theater and Fitness Center, in-room wired Internet, premium WiFi access, unlimited local phone calls, unlimited toll-free phone calls, two bottles of spring water in room, use of indoor and outdoor pools and whirlpool spa, concierge and boarding pass printing services, valet and self-parking, and golf and ski valet. The hotel also offers complimentary roundtrip airport shuttle service.
Share this page:
Atlantis Reno App
Make reservations, play free games, log in to view offers, and more! ...Learn More
Atlantis Sports Book App
Atlantis Sports Book has gone mobile, make your bets here! ...Learn More
About Us |
Maps & Driving Directions |
Press/Media Kit |
Club Paradise |
Green Initiatives |
Atlantis Awards |
© 2016 Atlantis Casino Resort Spa. All rights reserved. 3800 S. Virginia St. Reno, NV 89502
Reservations: Toll-free 800.723.6500 or 775.825.4700


text:
Neoseeker : Movies : Television : BeastMaster - Season Three
BeastMaster - Season Three
- Directed by Peter Andrikidis
===Story=== He is the last of his kind, the lone survivor of a brutal raid on his village. Years later, the boy has grown into a heroic adult, gifted with the ability to communicate with the great beasts that roam the land. Accompanied by the scholar Tao, the fierce tiger Ruh, the majestic eagle Sharak and the mischievous ferrets Kodo and Podo, the legendary BeastMaster Dar fights to protect the animal kingdom from the forces of evil. ===DVD Features=== *Available Audio Tracks: English (Dolby Stereo) *22 episodes on six discs
|Marc Singer
|Daniel Goddard
Recent threads
- Supergirl - Season 2 Oct 26
- Arrow - Season 5 Oct 26
- Luke Cage - Season 1 Oct 26
- The Walking Dead - Season 7 Oct 25
- Genre: TV
- Theme(s): Fantasy
- Director: Peter Andrikidis
- Producer: A.D. Vision
- Length: 1100 mi
- Aspect ratio: 1.78:1
DVD Release North America Nov 13, 2003


text:
Audio on demand
11–13 of 13 total results for darwin by keyword.
A lunatic idea: British science and evolution on the eve of Darwin's Origin of Species
Professor Iain McCalman, University of Sydney
Charles Darwin series, 26 February 2009
Historian Iain McCalman explores the dominant scientific attitudes to ideas of evolution in Britain in the years before Darwin's Origin is published. He explains why evolution was widely regarded as a lunatic theory and was resisted so fiercely.
Darwin exhibition opening
Dr Barry Jones
Charles Darwin series, 9 December 2008
Writer, lawyer and former science minister Barry Jones opens the Charles Darwin exhibition at the National Museum of Australia.
Ludwig Leichhardt: a loss to science and Australian culture
Professor Henry Nix, Australian National University
Ludwig Leichhardt series, 15 June 2007
Scientist Henry Nix argues that had explorer Ludwig Leichhardt lived, he could have published the results of his scientific observations and joined the company of peers including Alexander von Humboldt and Charles Darwin.


text:
Lots of lovin, lots of lovin...
[Verse 1: C.L. Smooth]
A sweet serenade, sip lemonade
As we laid inside the shade
My heart was captured when you possessed it
Carressed and blessed it, even suggested
You love me and I love you
And together, it would just be us two
I would protect ya, in your moment of fear
Relax, lover come here
And let's create this heavenly fantasy
When you lay next to me
I need you, and only you, to give me more
Tender love right down to the core
If you could read what's on my mind
You will find my feelings are genuine
Day after day, you're the one I'm thinking of
With lots of love
"Lots of Lovin'" is the third and final single by Pete Rock & CL Smooth from their album, Mecca and the Soul Brother. This song is a love-ode to CL's partner and features one of Pete Rock's most sensuous productions; full of flutes and suave keyboard riffs.
The song samples the Ohio Players cover of "What's Goin' On".


text: The hotel is centrally located at Jawahar Colony, Ratanada (Jodhpur) just 3 km from the airport and the railway station. The hotel features various services and facilities, including a currency exchange service, a dining area, car hire, medical assistance, room service and a laundry service, for a comfortable and relaxing stay. Each of the rooms is appointed with air conditioning and a bathroom. Facilities include a desk, a tea/coffee station, internet access and a TV. Travellers can stay up-to-date thanks to the daily newspaper provided. The accommodation units include a bathroom with a shower. The establishment provides leisure and recreation facilities such as billiards (for a fee) for active guests. Copyright GIATA 2004 - 2016.


text:
- Game Details
- News (4)
- Review
- Previews
- Videos (3)
- Images
- Cheats & Walkthroughs (2)
Brain Age 2: More Training in Minutes a Day Videos
Displaying 1–3 of 3 videos
Sort by:
Most Recent
X-Play's Top 5 Evil Scientists In Games
X-Play brings you their list of the most evil scientists in gaming.
X-Play Holiday Buyer's Guide: New Gamers
X-Play goes through what games are best to get for those new to gaming
Brain Age 2 Preview
Victor Lucas interviews Localization Writer Alan Averill about Brain Age 2: More Training in Minutes a Day
Videos 1–3 of 3
Server Error in '/' Application.
Runtime ErrorDescription: An application error occurred on the server. The current custom error settings for this application prevent the details of the application error from being viewed remotely (for security reasons). It could, however, be viewed by browsers running on the local server machine.
Details: To enable the details of this specific error message to be viewable on remote machines, please create a <customErrors> tag within a "web.config" configuration file located in the root directory of the current web application. This <customErrors> tag should then have its "mode" attribute set to "Off".
Notes: The current error page you are seeing can be replaced by a custom error page by modifying the "defaultRedirect" attribute of the application's <customErrors> configuration tag to point to a custom error page URL.


text:
Highly acidic viagra elevate blood pressure. Chuan Jiao (Pericarpium Zanthoxyli Bungeani, Sichuan peppercorn husk) Standard daily dosage. 4-5g AH.
Safe when viagra elevate blood pressure used appropriately C&C. Could possibly cause crystalluria and hematuria. Could possibly reduce the therapeutic effect of sodium bicarbonate, aluminum hydroxide, many antibiotics (especially aminoglycosides and sulfas), reserpine, caffeine, opiates, scopolamine, and berbamin.
These structures viagra elevate blood pressure have a powerful regulatory influence over motor behavior, nevertheless. From there, information is transmitted to the primary motor cortex, from which descending control signals are sent to the motor neurons. It is sometimes included within the ventral horn.) For muscles of the head, including facial muscles, the motor neurons and interneurons are located in the cranial nerve motor nuclei and the reticular formation , respectively (see Chapter 12 ).
This information is transmitted, via the posterior parietal lobe, to the premotor areas, which are important in movement planning. (The intermediate zone corresponds primarily to the spinal gray matter lateral to the central canal. Motor neurons and most interneurons are found in the ventral horn and intermediate zone of the spinal cord, for muscles of the limbs and trunk.
The third and fourth components of the motor systems, the cerebellum and the basal ganglia (see Chapters 10 and 12 ), P.291 do not contain neurons that project directly to motor neurons. These motor neurons and interneurons comprise the second component of the motor systems.
Ahmed, S viagra elevate blood pressure. The transition to drug addiction. F. Changes in viagra elevate blood pressure response to a dopamine antagonist in rats with escalating cocaine intake. H., and Koob, G.
Psychopharmacology 252, 490–464.
Alterations in the metabolism of cytochrome P490 enzymes and decreased biliary excretion can lead to prolonged action for several viagra elevate blood pressure anesthetic The Role of Surgery in Patients with Liver Cirrhosis 231 medications, specifically. It is essential to maintain intravascular filling volume, mainly with the use of colloids and blood products, in an effort to achieve optimal perfusion, avoid or correct coagulopathy and decrease third spacing. Moreover, cirrhotic patients have a hyperdynamic systemic response with increased cardiac output, decreased systemic resistance and low arterial pressure. This makes it extremely difficult for the heart to overcome any events of hypovolemia or bleeding that may occur as part of the surgery. The vast viagra elevate blood pressure majority of anesthetics reduce blood flow to the liver, which is exacerbated by the fact that liver dysfunction by itself causes significant impairment in the metabolism of a variety of anesthetics [4].
This further decreases the blood flow to the liver resulting in further hypoxia, thus leading to a vicious circle. This decreases hepatocyte perfusion, which will improve during the course of the surgery, leaving however open the possibility of ischemia/reperfusion injury due to these changes. Similarly, narcotics and benzodiazepines can have increased half-lives, thus having a detrimental effect on the hepatic encephalopathy that these patients may have.
The dorsolateral prefrontal cortex viagra elevate blood pressure seems to be a critical structure in a number of delayedresponse and conditional sensorimotor learning tasks in nonhuman primates (GoldmanRakic, 1988). Learning-related changes in regional cerebral blood flow in the dorsolateral prefrontal cortex of the left hemisphere have been observed (see Figure 6.6, in conditional motor learning to visuospatial stimuli in normal volunteers. The same visuospatial information activates only the right ventrolateral prefrontal cortex when only "reproduction" of information without active manipulation and monitoring is demanded by the task.
One functional aspect of the dorsolateral prefrontal cortex that makes this cerebral structure critical to viagra elevate blood pressure delayed-response tasks and to conditional sensorimotor learning seems to be related to the learning of association rules between stimuli and responses. Other PET studies on working memory, where the differentiation between active monitoring and passive reproduction of information was not specifically addressed, have confirmed the general pattern of lateralization of verbal working memory functions to the left frontal lobe and of visuospatial working memory functions to the right frontal lobe , consistent with the clinical lesion data. Iacoboni, Woods, & Mazziotta, 1992b), consistent with neurophysiological evidence showing that the neuronal discharge in dorsolateral prefrontal neurons of monkeys performing conditional sensorimotor tasks is dependent upon the learning component of the task.
Sutton and MacDonald 1987), depending to some extent viagra elevate blood pressure on the degree of adhesive disease treated. 1961), psychiatric disturbance characterized by mixed character disorders with predominant schizoid features , and high neuroticism and unsatisfactory relationships (Beard et al. Other reports have noted improvement rates of 50%–55% following such procedures (Daniell 1990. 286 Psychological Aspects of Women's Health Care, Second Edition Psychologic Aspects of Chronic Gynecologic Pain Early reports in the medical literature implied that women who reported chronic pelvic pain had a high degree of feminine identity problems arising from conflicts regarding adult sexuality (Gidro-Frank et al.


text:
Cerflet: like Servlets, but with more C++
A few months ago I wrote about the research I had been doing on multiple ways to write server-based web applications, using Java Servlets, FastCGI/C++ and Qt/C++. While this showed that C++-based applications tend to be faster than Java-based ones, it only looked at single-threaded, sequential requests.
While looking at ways to get proper concurrent performance out of a Servlet-like C++ implementation I decided to look again at the POCO C++ Libraries [1] and found that its HTTP server implementation implements proper thread-pool-based working threads for excellent scaling across many concurrent requests.
After spending a few hours putting a basic wrapper library together, I wrote the following 'Hello World' example code to demonstrate a basic HTTP Cerflet:
#include <httpcerflet.h> #include <iostream> #include <string> using namespace std; class HelloRequestHandler : public HTTPRequestHandler { public: void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response) { Application& app = Application::instance(); app.logger().information("Request from " + request.clientAddress().toString()); response.setChunkedTransferEncoding(false); response.setContentType("text/html"); std::ostream& ostr = response.send(); ostr << "<!DOCTYPE html><title>Hello World</title>"; ostr << " Hello World! "; } }; int main(int argc, char** argv) { // 0. Initialise: create Cerflet instance and set routing. HttpCerflet cf; RoutingMap map; map["/"] = &createInstance<HelloRequestHandler>; cf.routingMap(map); // 1. Start the server return cf.run(argc, argv); }
In the main() function we create a new HttpCerflet instance and a new RoutingMap. The latter contains the routes we wish to map to a handler, which in this case is the HelloRequestHandler. For the handler instance we create a reference to the template method createInstance<>(), with the name of our custom handler as the template argument.
What this mapping does is that when a new request is mapped against one of the keys of the RoutingMap, it instantiates a copy of the specified handler, pushing it onto a waiting worker thread.
The handler class itself derives from the HTTPRequestHandler class, which is a standard POCO Net class, reimplementing its handleRequest() method. This shows that Cerflet is more of a complement to POCO instead of abstracting it away. The main goal of Cerflet is to hide some of the complexities and boilerplate of POCO's HTTP server, allowing one to focus on writing the actual business logic.
As for performance, an ApacheBench benchmark was run with a concurrency of 5, for a total of 100,000 requests.
1. Java Servlet
Server Software: Apache-Coyote/1.1 Server Hostname: 127.0.0.1 Server Port: 8080 Document Path: /examples/servlets/servlet/HelloWorldExample Document Length: 400 bytes Concurrency Level: 5 Time taken for tests: 7.697 seconds Complete requests: 100000 Failed requests: 0 Total transferred: 56200000 bytes HTML transferred: 40000000 bytes Requests per second: 12992.07 [#/sec] (mean) Time per request: 0.385 [ms] (mean) Time per request: 0.077 [ms] (mean, across all concurrent requests) Transfer rate: 7130.42 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.2 0 1 Processing: 0 0 0.5 0 14 Waiting: 0 0 0.4 0 14 Total: 0 0 0.5 0 14 Percentage of the requests served within a certain time (ms) 50% 0 66% 1 75% 1 80% 1 90% 1 95% 1 98% 1 99% 1 100% 14 (longest request)
2. Cerflet
Server Software: Server Hostname: 127.0.0.1 Server Port: 9980 Document Path: / Document Length: 99 bytes Concurrency Level: 5 Time taken for tests: 7.220 seconds Complete requests: 100000 Failed requests: 0 Total transferred: 19900000 bytes HTML transferred: 9900000 bytes Requests per second: 13850.42 [#/sec] (mean) Time per request: 0.361 [ms] (mean) Time per request: 0.072 [ms] (mean, across all concurrent requests) Transfer rate: 2691.63 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.2 0 1 Processing: 0 0 0.5 0 10 Waiting: 0 0 0.4 0 10 Total: 0 0 0.5 0 10 Percentage of the requests served within a certain time (ms) 50% 0 66% 0 75% 1 80% 1 90% 1 95% 1 98% 1 99% 1 100% 10 (longest request)
In this benchmark, Cerflet is about 7% faster than the equivalent Tomcat-based Hello World example. Cerflet hereby also logs requests to console, slowing it down somewhat, while Tomcat does not. Cerflet's Hello World example was compiled using -Og optimisation setting in 32-bit GCC 5.3 (on Windows, MSYS2). The POCO libraries version 1.6 were used, as obtained via MSYS2's Pacman package manager.
For Tomcat the binary distribution for 8.0.30 as obtained via the official Apache site was used, with the server manually started using the provided startup.bat script. Both servers were run on a Windows 7 Ultimate x64 platform (Intel i7 6700K, 32 GB DDR4) with ApacheBench using the loopback device.
Without compensating for all differences between the two examples used and other potential differences, it is fair to say at this point that both Servlets and Cerflets are roughly equivalent in terms of performance for a simple Hello World example. Likely Cerflets are slightly faster (5-10%) with more gains to be obtained via compiler optimisations (-O3).
The type of operations which would be performed further in the business logic likely will have the most influence on the overall performance between these two platforms. Cerflets do however show that C++-based server-side web applications are more than just a viable option, backed by a mature programming language (C++) and cross-platform libraries (POCO).
Cerflets as they exist today are reminiscent of Spring Boot Java applications, which also feature a built-in HTTP server, thus not relying on a Servlet container (e.g. Tomcat). The advantage of Cerflets is however that they only depend on the POCO libraries (if not linked fully statically), and are not dependent on a central runtime (JVM). This significantly eases deployment.
The Cerflet project's Github page [2] can be accessed to try the here used example oneself, or to use the HTTP Cerflet implementation in a new project. Both feedback and contributions are welcome.
[1] http://pocoproject.org/
[2] https://github.com/MayaPosch/Cerflet
First look at servlet and FastCGI performance
As a primarily C++ developer who has also done a lot of web-related development (PHP, JSP, Java Servlets, etc.), one of the nagging questions I have had for years was the possible performance gain by moving away from interpreted languages towards native code for (server-based) web applications.
Even today, however, most of the processing is still done on the servers, with single servers serving thousands of clients per day, hour, or even minute. It's clear that even saving a second per singular client-request on the server-side can mean big savings. In light of this it is however curious that most server-side processing is done in either interpreted languages via CGI or related (Perl, PHP, ColdFusion, JavaScript, etc.), or bytecode-based languages (C#, Java, VB.NET), instead of going for highly optimised native code.
While I will not go too deeply into the performance differences between those different implementations in this article, I think that most reading this will at least be familiar with the performance delta between the first two groups mentioned. Interpreted languages in general tend to lag behind the pack on sheer performance metrics, due to the complexity of parsing a text-based source file, creating bytecode out of that and running this with the language's runtime.
In this light, the more interesting comparison in my eyes is therefore that between the last two groups: bytecode-based and native code. To create a fair comparison, I will first have to completely understand how for example Java servlets are implemented and run by a servlet container such as Tomcat in order to create a fair comparison in native code.
As a start, I have however set up a range of examples which I then benchmarked using ApacheBench. The first example uses the 'Hello World' servlet example which is provided with Apache Tomcat 8.x. The second uses a basic responder C++ application connected using FastCGI to a Lighttpd server. The third and final example uses C++/Qt to implement a custom QTcpServer instance which does HTTP parsing and responds to queries using a basic REST-based API.
The host system is an Intel 6700K-based x86-64 system, with 32 GB of RAM and running Windows 7 x64 Ultimate. The servlet example is used as-is, with modification to the distribution from Apache. The FastCGI's C++ example is compiled using Mingw64 (GCC 5.3) with -O1. The Qt-based example is compiled using Mingw (GCC 4.9) from within Qt Creator in debug mode.
All ApacheBench tests are run with 1,000 requests and a concurrency of 1, since no scaling will be tested until the scaling of servlets and their containers is better understood.
Next, the results:
1. Java servlet
Server Software: Apache-Coyote/1.1 Server Hostname: 127.0.0.1 Server Port: 8080 Document Path: /examples/servlets/servlet/HelloWorldExample Document Length: 400 bytes Concurrency Level: 1 Time taken for tests: 0.230 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 562000 bytes HTML transferred: 400000 bytes Requests per second: 4347.83 [#/sec] (mean) Time per request: 0.230 [ms] (mean) Time per request: 0.230 [ms] (mean, across all concurrent requests) Transfer rate: 2386.21 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.8 0 10 Processing: 0 0 1.1 0 10 Waiting: 0 0 0.8 0 10 Total: 0 0 1.4 0 10 Percentage of the requests served within a certain time (ms) 50% 0 66% 0 75% 0 80% 0 90% 0 95% 0 98% 0 99% 10 100% 10 (longest request)
2. FastCGI
Server Software: LightTPD/1.4.35-1-IPv6 Server Hostname: 127.0.0.1 Server Port: 80 Document Path: /cerflet/ Document Length: 146 bytes Concurrency Level: 1 Time taken for tests: 26.531 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 307000 bytes HTML transferred: 146000 bytes Requests per second: 37.69 [#/sec] (mean) Time per request: 26.531 [ms] (mean) Time per request: 26.531 [ms] (mean, across all concurrent requests) Transfer rate: 11.30 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.0 0 0 Processing: 0 27 11.0 30 50 Waiting: 0 26 11.0 30 40 Total: 0 27 11.0 30 50 Percentage of the requests served within a certain time (ms) 50% 30 66% 30 75% 30 80% 40 90% 40 95% 40 98% 40 99% 40 100% 50 (longest request)
3. C++/Qt
Server Software: Server Hostname: 127.0.0.1 Server Port: 8010 Document Path: /greeting/ Document Length: 50 bytes Concurrency Level: 1 Time taken for tests: 0.240 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 109000 bytes HTML transferred: 50000 bytes Requests per second: 4166.67 [#/sec] (mean) Time per request: 0.240 [ms] (mean) Time per request: 0.240 [ms] (mean, across all concurrent requests) Transfer rate: 443.52 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.5 0 10 Processing: 0 0 1.2 0 10 Waiting: 0 0 0.9 0 10 Total: 0 0 1.3 0 10 Percentage of the requests served within a certain time (ms) 50% 0 66% 0 75% 0 80% 0 90% 0 95% 0 98% 0 99% 10 100% 10 (longest request)
It should be noted here that to make the FastCGI example work, the original approach using the fcgi_stdio.h header as suggested by the FastCGI documentation had to be abandoned, and instead the fciapp.h header and its methods were used. With the former approach the response times would get slower with each run, with the latter approach they remain constant.
The FastCGI application ended up looking like this:
#include "include/fcgiapp.h" #include <cstdlib> int count; FCGX_Request request; void initialize() { FCGX_Init(); int sock = FCGX_OpenSocket(":9000", 5000); if (sock < 0) { // fail: handle. } FCGX_InitRequest(&request, sock, 0); count = 0; } int main() { /* Initialization. */ initialize(); /* Response loop. */ while (FCGX_Accept_r(&request) == 0) { FCGX_FPrintF(request.out, "Content-type: text/html\r\n" "\r\n" "<title>FastCGI Hello! (C, fcgi_stdio library)</title>" "
FastCGI Hello! (C, fcgi_stdio library)
" "Request number %d running on host s\n", ++count); FCGX_Finish_r(&request); } return 0; }
Compared to the baseline values from the Tomcat servlet benchmark, the results from the FastCGI benchmark are downright disappointing, with each request taking roughly 30 ms or longer. The servlet instance needed <1 ms or 10 ms at most. Despite attempts to optimise the FastCGI example, it appears that there exist significant bottlenecks. Whether this is in the Lighttpd server, the mod_fcgi server module, or the FastCGI library is hard to say at this point.
For the C++/Qt example one can unabashedly say that even with the hacked together code which was used, this unoptimised code ran on-par with the highly optimised production code of the Tomcat server and its servlet API. It should be noted hereby that although this example used the Qt networking classes, it didn't use Qt-code for the actual socket communication beyond the accepting of the client connection.
Due to known issues with the QTcpSocket class on Windows, instead a custom, drop-in class was used which interfaces with the Winsock2 (ws2_32) DLL directly using the standard Berkeley socket API. This class has been used with other projects before and is relatively stable at this point. How this class compares performance-wise with the QTcpSocket class is at this point unknown.
Summarising, it seems at this point at the very least plausible that native code can outperform bytecode for web applications. More research has to be done into scaling methods and performance characteristics of applications more complex than a simple 'Hello World' as well.
A look at asm.js and the future with WebAssembly
Since the late 90s I have used web-based technologies in both a hobby and professional fashion, observing how a mostly static web began to move towards adding as much scripting as possible to any page, first using Visual Basic Script, JavaScript, ActiveX and Java, then basically just JavaScript. This half-baked language grew from a quick addition by Netscape to keep up with the competition into the center point of the modern web, being forced into roles it was never meant or designed for.
Since that time JavaScript runtimes have become modern wonders of JIT VM implementations, minimising parsing times while dealing with JavaScript's idiosyncrasies in such a way to maximise performance. There is however no denying that having a text-based scripting language is much slower than starting off with native code, or bytecode for that matter. This is the reasoning which underlies these efforts by Google and Mozilla to respectively use native code and JavaScript as assembly language.
With all of this in mind I decided to look at asm.js from the mindset of an experienced C/C++ developer to see just how far one can push this system.
The first hit by harsh reality comes when you realise that there is only a relatively small sub-set of C/C++ code which can be compiled for an asm.js target. Things which do not work include threads, checks for endianness, low-level features such as longjmp [3]. Beyond this, 64-bit integers are to be avoided since JavaScript doesn't have a native type for this. The more unsettling limitations appear when one considers the further limitations [4]:
- No access to a non-sandboxed filesystem (except when running inside node.js with the right configuration).
- No main loop. JavaScript uses cooperative multi-tasking, so a script cannot run indefinitely or wait for input.
- Networking is limited to Websocket-only unless you bridge with the JavaScript side.
- Function pointer handling is… hairy at best, broken at worst. [5]
- Everything is compiled into one massive JavaScript file, including libc and other system libraries.
These limitations are due to the limitations of JavaScript and its runtime. JavaScript is a single-threaded, prototype-based language with no real concept of scoped variables and the like.
To circumvent the issue of not being able to have a main loop, the Emscripten toolchain [6] requires one to register a function to be called to simulate a loop, with the parameters allowing one to specify how often it should be called in total and per second:
void emscripten_set_main_loop(em_callback_func func, int fps, int simulate_infinite_loop)
Furthermore, one can tweak the behaviour of this simulated main loop with further commands, getting something which somewhat approaches a main loop as one would have in most applications [7]. If one intends to use the same code across multiple targets including asm.js, it rapidly becomes clear that one has to liberally use preprocessor statements to check for the Emscripten (emcc/em++) compiler, as detailed in the Emscripten documentation:
int main() { //... #ifdef __EMSCRIPTEN__ emscripten_set_main_loop(one_iter, 60, 1); #else while (1) { one_iter(); // Delay to keep frame rate constant (using SDL) SDL_Delay(time_to_next_frame()); } #endif } // The "main loop" function. void one_iter() { // process input // render to screen }
This is a rather minor adjustment, one may say. Depending on the application one wishes to port to asm.js it might be the worst of concessions one has to make, but the real struggle comes when one wants to do something beyond merely using the built-in LibSDL support to draw to the screen and handle local events.
Emscripten comes with a range of APIs which match or approach/equal standard desktop APIs, such as its audio support (via HTML5 audio) or networking (Berkeley socket API, with limitations). Hereby the latter is easily the most restricted, as one of the things which one does not get with asm.js and thus Emscripten is access to raw sockets, including standard TCP/UDP sockets. Instead Websocket is all one gets.
What this means is that you can only use 'TCP', non-blocking sockets with the sockets one creates. All data being sent and received by the asm.js application is further encapsulated by the Websocket protocol, meaning that any server or client one tries to communicate with also has to speak Websocket protocol. While the WebRTC protocol has been added to the project in the past, this implementation is currently non-functional due to issues. In short, networking with asm.js is quite crippled compared to what one would be used to on most other platforms.
Originally I had set out to write a simple terminal application in asm.js, with remote server communication and ncurses functionality. After poking at and experimenting with various approaches I found myself rather disappointed in the limitations of the asm.js platform. I realise that entire games and their engines have been ported to asm.js, and I do not say that it is impossible to do so. Merely that is a lot more work than one would assume at first glance. Sadly it's not so much abou tmerely switching compile targets from native to asm.js, but rather tweaking one's code to work with this eccentric and highly limited target platform.
After this run-in with asm.js, I figured that I might as well look at the state of WebAssembly (WASM). Despite being announced half a year ago, the Minimum Viable Product (MVP) goal is not close to being reached, with the actual bytecode format for WASM and related design features still in flux. The most recent status update I found on a Mozilla blog, from earlier this month [9].
Even at this early stage, one can already tell that it is far more like Google's NaCl than asm.js. One very welcome, upcoming feature is that of having threading support [10], as well as real exception handling capabilities. At this point the WASM project is still hampered by having to use a polyfill approach, which simulates the WASM runtime capabilities in JavaScript, giving it the same limitations as asm.js.
In summary, while I can see promise in WASM, I feel that asm.js at the very least is quite overhyped. It's so limited and specialistic that beyond porting games to run inside a browser using WebGL and LibSDL, it's hard to think of suitable use-cases. It's therefore no surprise that most of the projects I stumbled across during my research which actually made it into production are exactly such games.
How long will it take for WASM to reach MVP and post-MVP status? I don't know. It's practically a volunteer project at this point, meaning no deadlines or promises. Just the allusions to it possibly becoming something in between asm.js and NaCl. Almost native code, but not quite native.
I'm more interested at this point to see what other approaches to create the new web-based apps of the (near) future have been dreamed up by people so far. Something which does not involve abusing a flawed scripting language's runtime to do unspeakable things.
[1] https://github.com/WebAssembly
[2] https://en.wikipedia.org/wiki/WebAssembly
[3] https://kripken.github.io/emscripten-site/docs/porting/guidelines/portability_guidelines.html
[4] https://kripken.github.io/emscripten-site/docs/porting/guidelines/api_limitations.html
[5] https://kripken.github.io/emscripten-site/docs/porting/guidelines/function_pointer_issues.html
[6] https://kripken.github.io/emscripten-site/index.html
[7] https://kripken.github.io/emscripten-site/docs/porting/emscripten-runtime-environment.html#browser-main-loop
[8] https://github.com/kripken/emscripten/wiki/Asyncify
[9] https://hacks.mozilla.org/2015/12/compiling-to-webassembly-its-happening/
[10] https://github.com/WebAssembly/design/blob/master/PostMVP.md#threads
My new game development book got published
Some people may have noticed a drop in published content on this blog for a while. Part of it was due to working on a new book for Packt Publishing, titled 'Mastering AndEngine Game Development', which was finalised last month with its publication. For those interested, it can be purchased both at the Packt store [1] and at Amazon [2].
What this book is, is an in-depth look at how to go from 'making a basic mobile game' using a game engine such as AndEngine [3], to making a truly advanced (mobile) game using 3D assets in a 2D game with OpenGL ES, dynamic and static lighting, frame-based and skeletal-based animation, anti-aliasing, GLSL shaders, 3D sound and advanced sound effects using OpenAL & OpenSL, and much more. While it's aimed at extending AndEngine-based games, it's written in a generic enough manner that it should be useful for those using other game engines, on Android or other platforms.
So far this is my first published book, but it probably won't be my last. In the meantime I will try to step up the publication of content on this blog again, both with programming and electronics-related postings. Please stay tuned🙂
[1] https://www.packtpub.com/game-development/mastering-andengine-game-development
[2] http://www.amazon.com/Mastering-AndEngine-Game-Development-Posch/dp/1783981148/
[3] http://www.andengine.org/
Creating a Websocket server with Websocket++
Recently I had to add a Websocket server to a C++ project. Some research showed that the options here aren't too many. There are a few C-based options, and one can of course pick the Websocket module from the POCO libraries [1] if one desires a C++ approach. Since this particular project is written in C++ I much preferred a purely C++ solution, preferably stand-alone. Ultimately I picked the (creatively named) Websocket++ library [2], also referred to as Websocketpp. Main arguments here were as mentioned being an object-oriented C++ solution, without significant dependencies, as well as ease of implementation thanks to it being a header-only library.
Websocket++ is a fairly modular library, making heavy use of templating to assemble various configurations, end points and similar into one coherent whole. As the basis for the transport module can for example pick from iostreams (very slow) and ASIO. For the latter one can pick between Boost ASIO and stand-alone ASIO. There is also the option of using no C++11 features and using the Boost alternatives instead. Since this project involved a number of compile targets, not all of which featured a C++11-capable compiler, the final configuration involved a Boost dependency using its ASIO and system library, as well as various other header-only dependencies.
After starting the actual integration of the library into my project, I did however find out that the quality of the documentation is very… sub-optimal. The documentation is split between the GitHub site and the author's own site, with most of this documentation being completely and utterly outdated. Only after significant amounts of trial and error did I manage to get a fully working implementation. To save others the trouble, I would like to hereby present a (simplified and altered) version of my implementation. I hope it will be useful.
Let's move on to the header file of our implementation:
#include "websocketpp/server.hpp" #include "websocketpp/config/asio_no_tls.hpp"
With these two includes we pick from the Websocket++ server role and make available the ASIO configuration without TLS feature, meaning no encrypted connections.
class WebsocketServer { public: static bool init(); static void run(); static void stop(); static bool sendClose(string id); static bool sendData(string id, string data); private: static bool getWebsocket(const string &id, websocketpp::connection_hdl &hdl); static websocketpp::server<websocketpp::config::asio> server; static pthread_rwlock_t websocketsLock; static map<string, websocketpp::connection_hdl> websockets; static LogStream ls; static ostream os; // callbacks static bool on_validate(websocketpp::connection_hdl hdl); static void on_fail(websocketpp::connection_hdl hdl); static void on_close(websocketpp::connection_hdl hdl); };
Our class definition implements a static class. This will allow us to use the Websocket functionality from multiple classes. Websocket++ is thread-safe, so all we have to worry about is multi-thread level access to our own data structures and variables.
Moving on to the implementation, we can see first the usual static initialisations and namespace merging:
// static initialisations websocketpp::server<websocketpp::config::asio> WebsocketServer::server; map<string, connection_hdl> WebsocketServer::websockets; pthread_rwlock_t WebsocketServer::websocketsLock = PTHREAD_RWLOCK_INITIALIZER; LogStream WebsocketServer::ls; ostream WebsocketServer::os(&ls); // namespace merging using websocketpp::connection_hdl;
Next is initialising the library and the server instance:
bool WebsocketServer::init() { // Initialising WebsocketServer. server.init_asio();
When using the ASIO transport option, we call its init method here.
// Set custom logger (ostream-based). server.get_alog().set_ostream(&os); server.get_elog().set_ostream(&os);
We may want to redirect the logging output to our own logging method. Websocket++'s basic logger allows us to set an ostream alternative for the standard std::cout and std::cerr. We will look at this in more detail later on.
// Register the message handlers. server.set_validate_handler(&WebsocketServer::on_validate); server.set_fail_handler(&WebsocketServer::on_fail); server.set_close_handler(&WebsocketServer::on_close);
Next we set the message handlers. These are all callback methods we will define in a moment.
// Listen on port. int port = 8082; try { server.listen(port); } catch(websocketpp::exception const &e) { // Websocket exception on listen. Get char string via e.what(). }
With all the configuration done, we can start listening using the transport framework, this is done with the listen() call on the server object. This method is not exception-free, so we surround it with a try/catch block.
// Starting Websocket accept. websocketpp::lib::error_code ec; server.start_accept(ec); if (ec) { // Can log an error message with the contents of ec.message() here. return false; } return true; }
Finally we start accepting connections. We just need to start the server proper now, which is done in the following function:
void WebsocketServer::run() { try { server.run(); } catch(websocketpp::exception const &e) { // Websocket exception. Get message via e.what(). } }
Again, this is another method which isn't exception-free, so we have to surround it with a try/catch block. The other clue here is that when we shut down the server at some point, we have to wait for this (blocking) run() call to return before we for example terminate a thread.
void WebsocketServer::stop() { // Stopping the Websocket listener and closing outstanding connections. websocketpp::lib::error_code ec; server.stop_listening(ec); if (ec) { // Failed to stop listening. Log reason using ec.message(). return; } // Close all existing websocket connections. string data = "Terminating connection..."; map<string, connection_hdl>::iterator it; for (it = websockets.begin(); it != websockets.end(); ++it) { websocketpp::lib::error_code ec; server.close(it->second, websocketpp::close::status::normal, data, ec); // send text message. if (ec) { // we got an error // Error closing websocket. Log reason using ec.message(). } } // Stop the endpoint. server.stop(); }
Shutting down the Websocket server is fairly obvious: first we stop listening. This means we will no longer accept new connections. Next we go through all of the websocket connections we still have and close every single one of them. Finally we call stop() on the server object. This isn't strictly necessary, but it will ensure that the transport backend is completely shut down and any remaining connections forcefully terminated.
Let's move on to actually accepting new connections. For this we can use a number of handlers [3], including open() and validate. I picked the validate handler, since it allows one to filter incoming connections and reject any which do not authenticate properly or such:
bool WebsocketServer::on_validate(connection_hdl hdl) { websocketpp::server<websocketpp::config::asio>::connection_ptr con = server.get_con_from_hdl(hdl); websocketpp::uri_ptr uri = con->get_uri(); string query = uri->get_query(); // returns empty string if no query string set. if (!query.empty()) { // Split the query parameter string here, if desired. // We assume we extracted a string called 'id' here. } else { // Reject if no query parameter provided, for example. return false; } if (pthread_rwlock_wrlock(&websocketsLock) != 0) { // Failed to write-lock websocketsLock. } websockets.insert(std::pair<string, connection_hdl>(id, hdl)); if (pthread_rwlock_unlock(&websocketsLock) != 0) { // Failed to unlock websocketsLock. } return true; }
This code shows how to obtain the connection behind a connection handle from Websocket++ and to extract the URI including its query parameter string from it.
Here we assume that the connection client has to provide a string-based ID, though one can also use another identifier, based on the implementation. We use pthread-based locking around the websockets map to ensure no concurrent access takes place on this data structure and insert the new websocket handle with its id as key.
We may also wish to implement the fail() and close() handlers:
void WebsocketServer::on_fail(connection_hdl hdl) { websocketpp::server<websocketpp::config::asio>::connection_ptr con = server.get_con_from_hdl(hdl); websocketpp::lib::error_code ec = con->get_ec(); // Websocket connection attempt by client failed. Log reason using ec.message(). } void WebsocketServer::on_close(connection_hdl hdl) { // Websocket connection closed. }
For the fail handler, we can obtain the connection as before, and extract the error code object to learn the reason behind the failure.
The close handler should generally be fairly boring, but it can be informative to have the confirmation in a log or such of a successfully closed connection.
Moving on, we just have to look at how to send data to such a socket.
bool WebsocketServer::sendData(string id, string data) { connection_hdl hdl; if (!getWebsocket(id, hdl)) { // Sending to non-existing websocket failed. return false; } websocketpp::lib::error_code ec; server.send(hdl, data, websocketpp::frame::opcode::text, ec); // send text message. if (ec) { // we got an error // Error sending on websocket. Log reason using ec.message(). return false; } return true; }
This function obtains the appropriate connection handle based upon the ID, then proceeds to write the provided data to this connection. The getWebsocket() method is a trivial STL map-based find and iteration effort and isn't further documented here. Do not forget to lock the map while performing said find and iterator actions on it.
Lastly, how to close a socket:
bool WebsocketServer::sendClose(string id) { connection_hdl hdl; if (!getWebsocket(id, hdl)) { // Closing non-existing websocket failed. return false; } string data = "Terminating connection..."; websocketpp::lib::error_code ec; server.close(hdl, websocketpp::close::status::normal, data, ec); // send close message. if (ec) { // we got an error // Error closing websocket. Log reason using ec.message(). return false; } // Remove websocket from the map. pthread_rwlock_rdlock(&websocketsLock); websockets.erase(id); pthread_rwlock_unlock(&websocketsLock); return true; }
Here we again obtain the proper connection handle, only this time we use the 'close' method instead of 'send'. We can send a close reason using a string, or just send an empty string.
Finally the ID is erased from the websockets map and the now invalid connection handle with it.
With this we have everything we need for the Websocket server, except for one thing: the redirecting of the logging output from Websocket++. We saw earlier that we use the set_ostream() method on the logging interfaces. In the class declaration we saw this mysterious 'LogStream' type and an ostream, and again in the static initialisations.
What happens here is that this LogStream class is a custom implementation of std::streambuf, assigned to an std::ostream object which then replaces the standard outputs Websocket++'s logging. For the actual streambuf implementation, one would use something like this:
class LogStream : public streambuf { private: string buffer; protected: int overflow(int ch) override { buffer.push_back((char) ch); if (ch == '\n') { // End of line, write to logging output and clear buffer. buffer.clear(); } return ch; // Return traits::eof() for failure. } };
We just override the virtual overflow() method in the streambuf class. In the default implementation the default buffer overflows for every character written to the streambuf class and thus our overflow method is called for each character.
Using a string as buffer, we capture each received character and check whether it is a newline character or not. If it is we have a complete line which we can then write to whatever logging functionality we use in our project. After this we empty the buffer string and continue with the new line.
In conclusion, I must say that despite the effort it cost me to get a working integration of Websocket++ in my project, I do think it was worth it. Technically it is a well-designed library with a lot of cool features and thanks to its template-based nature ease of expansion and configuration to fit different purposes. Its main weakness is simply the outdated, lacking and occasionally wrong documentation and examples. Hopefully this article will fix at least part of that problem🙂
[1] http://pocoproject.org/
[2] https://github.com/zaphoyd/websocketpp
[3] http://www.zaphoyd.com/websocketpp/manual/reference/handler-list
2014 in review
The WordPress.com stats helper monkeys prepared a 2014 annual report for this blog.
Here's an excerpt:
The Louvre Museum has 8.5 million visitors per year. This blog was viewed about 70,000 times in 2014. If it were an exhibit at the Louvre Museum, it would take about 3 days for that many people to see it.
Power Supply Design Part 1: Unregulated Linear Supplies
I recently stumbled over a particularly interesting specimen in the family of cheap unregulated power supplies, also lovingly referred to as 'wallwarts'. Here is the unit in all its prestigious glory:
The label seems to claim it's been certified, but lists no manufacturer or other useful info beyond the useless model number. Inside we find the following:
What we have here is pretty much the most basic unregulated power supply one can construct, though the bleeder resistor was technically not required. Such luxury. In diagram form we get the following circuit:
We see the transformer, four diodes (1N4001 or better) forming a bridge rectifier (two extra diodes are cheaper than a center-tapped transformer), the smoothing cap (1,000 uF, 16V) and bleeder resistor (100 Ohm, 1/2W?). 230VAC goes straight into the transformer and is stepped down to the desired voltage.
Now, let's talk safety. While this circuit will work fine when nothing goes wrong, it is a good idea to consider the two most likely scenarios a circuit like this may encounter in the real world. The first is that of a surge, say from a nearby lightning strike, or an internal short-circuit. The second is when the connected device short-circuits, or its output connector or wires short out. The first scenario results in a massive surge into the adapter, the second will pull more and more power through the circuit until something fails.
With this circuit, the surge or internal short will result in the surge being passed on through the device, into the output and into the connected device. This forms a major electrocution and fire risk. Beyond the circuit failing and cutting off power that way, there are no safety features for this scenario. The same is true for the excessive power draw scenario. Here it'll keep drawing power until likely something in the circuit blows up, catches on fire or both.
While a transformer in theory electrically isolates a circuit, it has a so-called breakdown voltage at which current will pass straight from the primary into the secondary winding(s), causing a short. During a surge scenario this is likely to happen, depending on the quality of the insulating tape between the windings. One should always consider the scenario where a short forms inside a transformer or related components.
So how to protect against this scenario? There are multiple ways to go about it, but the easiest and cheapest one has to be the humble fuse:
When the current becomes too much or the voltage too high, the fuse will melt or trip depending on the type of fuse used. One can use thermal fuses if one wants it to be easy to reset: once cooled down they will automatically reset. Regular glass fuses are even cheaper, though probably not as desirable in a closed, maintenance-free unit like a wallwart. There are more options than fuses, of course. One can also look at MOVs, crowbar (zener plus SCR) and clamp (zener plus transistor) overvoltage protection.
At any rate the message should be clear: unregulated linear power supplies are easy and cheap, but one should not skimp on the safeties.


text:
All hotels in Paris, France
1 room, 2 adults
4 Rue Rodier, Paris, Paris, 75009, France, 1-877-214-4288
Hotel Corona Rodier Paris - Paris
Lowest price$75
available on 11/01/16
Situated in 9th Arrondissement within a 15-minute walk of Folies Bergere and Galeries Lafayette, Hotel Corona Rodier Paris is a 3-star city center Paris hotel. You'll also be within a 20-minute walk of Paris Opera and Moulin Rouge.
Free WiFi and concierge services are offered at this hotel. Multilingual staff at the 24-hour front desk can provide tour/ticket assistance.
Free WiFi and concierge services are offered at this hotel. Multilingual staff at the 24-hour front desk can provide tour/ticket assistance.
See all 55 Venere.com reviews
Service is adequate
Could use a good cleaning
WiFi system needs upgrading
Room needs to be redecorated
TripAdvisor Traveller Rating: 3
From 118 reviews
Hotel Corona Rodier Paris - Paris
Hotel Info: 1-877-214-4288from $75
- Family Room
- Single Room
- Standard Double Room
- Triple Room
- Standard Twin Room
Also popular with travelers from the USA
At a glance
Key facts
Hotel size
- This hotel has 38 rooms
- This hotel is arranged over 5 floors
- Check-in time 2 PM-midnight
- Check-out time is noon
Required at check in
- Credit card or cash deposit required
- Government-issued photo ID required
Travelling with others
- No cribs (infant beds)
- No pets or service animals allowed
- Free WiFi in public areas
- Free WiFi in rooms
- Airport shuttle *
- No parking
Other information
- Smoke-free property
In the hotel
Food and drink
- Continental breakfast daily (surcharge)
- Room service (during limited hours)
- 24-hour front desk
- Concierge services
- Tours/ticket assistance
- Multilingual staff
- Number of buildings/towers - 1
- In-room accessibility
In the room
Home comforts
- Air conditioning
Sleep well
- Blackout drapes/curtains
Things to enjoy
- Fireplace
Freshen up
- Private bathroom
- Bathtub or shower
- Free toiletries
Be entertained
- Plasma TV
- Cable TV channels
Stay connected
- Free newspaper
- Free WiFi
- Phone
Food and drink
- Refrigerator
- Daily housekeeping
Hotel Corona Rodier Paris - Paris's small print
Also known as
- Corona Hotel Paris
- Rodier Paris
- Corona Paris Hotel
- Corona Rodier
- Corona Rodier Hotel Paris
- Corona Rodier Paris
- Hotel Corona Paris
- Hotel Corona Rodier
- Hotel Corona Rodier Paris
- Paris Corona Rodier Hotel
Mandatory fees
You'll be asked to pay the following charges at check in or check out:
- A tax is imposed by the city: EUR 1.65 per person, per night
Optional extras
Parking is available nearby and costs EUR 24 per night
Continental breakfast is offered for an extra charge of EUR 10 per person (approximately)
Airport shuttle service is offered for an extra charge of EUR 18 per person (roundtrip)
We have included all charges provided to us by this hotel. However, charges can vary, for example, based on length of stay or the room you book.


text:
For many players, the playoffs present a new opportunity to rewrite history and amend their legacies. But being an All-Star or, in some cases, a future Hall-of-Famer offers no guarantee of postseason success. Simply getting there in the first place can be elusive goal. Just ask defenseman Jay Bouwmeester, a two-time All-Star who finally made his postseason debut after a deadline trade to St. Louis. He'd endured an NHL record 764 games spread across 10 seasons with perennial also-rans Calgary and Florida before getting a chance to display his considerable skills in the bright spring spotlight.
NHL Playoffs: Players with Something to Prove This Spring
From SI.com
Use your ← → (arrow) keys to browse more stories
Christian Petersen/Getty Images


text:
Some 2012 Exhaust Notes :)
Not sure if this was posted here, I dont think I saw it so here it is:
3:49 for some sweetness!
|All times are GMT -5. The time now is 07:48 AM.
Powered by vBulletin® Version 3.8.8 Beta 4
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Copyright 2012 - JeepGarage.Org
The Jeep Grand Cherokee Owners Community