text:
Thursday, July 16, 2009
Vegan Deviled Eggs ... Yes, I Did!
And without further ado, I give you Tofu Deviled "Eggy" Bites:
Yes, I know eggs are egg-shaped, and these cuties are square, but shaping tofu into eggs seems like a waste of good tofu. Who cares what shape they're in if they taste awesome?
The base is plain ole' extra firm tofu, which shares a very similar texture and tastelessness with boiled eggs. The topping is made from silk tofu, black salt, turmeric, pickle relish, red onion, and love. I swear to god, these bites taste just like the real thing — or at least from what I remember. To be honest, I haven't had a deviled egg in over four years, but this is how I remember them tasting.
The recipe is most definitely going in my cookbook's appetizer section, but I'm so proud of this one that I need to share it with the world right now. Here goes ...
Tofu Deviled "Eggy" Bites
Black salt, commonly found at most Indian food markets, is the magical ingredient in these babies. It tastes EXACTLY like eggs, so don't skimp on it. Order it off the Internet if you cannot find any, but don't make these guys without it. I promise it will not be the same.
1 pound extra firm tofu
Half 12.3-ounce package of firm silk tofu (about 1 cup)
1 cup cooked white beans, drained and rinsed
2 Tbsp. vegan mayonnaise (like Vegenaise)
1 Tbsp. yellow mustard
1 tsp. turmeric
1/2 tsp. black salt (plus about 1 Tbsp. more for spreading on "egg whites")
1 Tbsp. dill pickle relish
1/2 Tbsp. red onion, very finely minced
Black pepper, to taste
Paprika, for garnish
Fresh chives (optional, for garnish)
Drain water from the extra firm tofu. Wrap in several layers of paper towels and place on a plate. Put something heavy on top, like a jar or book, and allow to press in the fridge for at least 30 minutes.
After extra firm tofu is pressed, cut it in half. Then cut each half into four quadrants or squares. Slide a knife on the side of each quadrant to cut three squares from each. In the end, you should have about 24 little squares. If these instructions are too confusing, just cut into bite-sized squares and aim to get about 20 to 24. Set aside.
Place the silk tofu, beans, mayonnaise, mustard, turmeric, and one teaspoon black salt into a food processor. Process for about a minute or until smooth. Transfer to a mixing bowl and stir in relish, onion, and black pepper. Set aside.
Pour the other tablespoon of black salt into a small bowl. Using your fingertip, rub a touch of black salt on each white firm tofu square. Top each square with a dollop (about one teaspoon) of the yellow silk tofu mixture.
Sprinkle with paprika and top with chives.
Makes about 24 bites.
If you haven't already entered, don't miss your chance to win a $20 gift certificate to create your own granola mix from MixMyGranola. See this post for details.
80 comments:
- Laura said...
Bianca those look crazy good! I have actually thought about veganizing deviled eggs before...I am glad you did all the hard work for me :) These will be a big hit a my next family gathering, I am certain!!
- July 16, 2009 at 11:40 PM
- Jenni (aka Vegyogini) said...
Bianca, I already knew you were one rockin' vegan, but I just raised your pedestal up another zillion feet. I've been waiting so long for someone to veganize deviled eggs! I don't think I've had one for, oh, 15+ years. I need to get some of that black salt!
- July 17, 2009 at 12:37 AM
- Jan Scholl said...
I can taste these at 2AM. If only I could find the black salt locally. Whole Foods wanted over $20 for what looked like a tablespoon. Is there a place to get it with free shipping online? I would buy more spices etc if I could find a good source. Living in boring town is no fun for veggies.
- July 17, 2009 at 1:09 AM
- nora said...
How adorable! I like that they're square. It's the vegan spin on it!
- July 17, 2009 at 2:20 AM
- Sal - AlienOnToast said...
those look great, i just ordered some black salt as well!! thanks for posting the recipe.
- July 17, 2009 at 3:39 AM
- Mary said...
So cute! I love plain, raw tofu. I totally eat it straight out of the container.
- July 17, 2009 at 5:55 AM
- jessy said...
imagine me hugging you right now! it's a big squeeze and i'm telling you that you're the absolute best! ever! i have been so sadfaced, missing deviled eggs - something my mom made and i guess i just assumed they really weren't veganizable. i guessed wrong! you are too awesome and i puffy heart you the most for sharing the recipe with us! i need to find black salt and you better believe that i'm running out today after work on a black salt mission! you just made my friday all that more glorious! thank you + one million! superw00t! - July 17, 2009 at 6:08 AM
- Lisa said...
Bianca, this is brilliant! And cute! I've got to get some black salt now.
- July 17, 2009 at 6:20 AM
That is AWESOME Bianca!!!
- July 17, 2009 at 7:40 AM
- Tara said...
Now I HAVE to find black salt. This is absolutely brilliant! I am so impressed, and thank you for this recipe!
- July 17, 2009 at 7:53 AM
- Mihl said...
Those look amazing! I need to start experimenting with my jar of black salt, too.
- July 17, 2009 at 7:56 AM
- T said...
Not only are those adorable, but they aren't going to give you food poisoning if they sit in the sun too long! :P
I know a lot of picnic-goers who are going to be thrilled by this one! - July 17, 2009 at 8:10 AM
- Leslie Richman said...
Oh my gosh! I am super excited about this!
- July 17, 2009 at 8:31 AM
Am I the only one trying to figure out how to make these for Veganstock? You are a genius!
- July 17, 2009 at 8:32 AM
You are a genious! I cannot begin to tell you how excited I am about this recipe. I used to love deviled eggs. I am definitely getting some black salt ASAP and making these!
- July 17, 2009 at 8:50 AM
- Jenny said...
This looks amazing and sounds amazing! wonderful job! I will be making these for sure sometime soon :) thank u!
- July 17, 2009 at 9:21 AM
these are brilliant!
- July 17, 2009 at 11:02 AM
- Jenn said...
Yum! I adore deviled "tofu." Black salt rules!
- July 17, 2009 at 12:03 PM
- Unknown said...
OMG I cannot wait. I want to try these. I guess I need to find black salt. These look yummy!!
- July 17, 2009 at 12:38 PM
- Rose said...
Cool recipe, very creative...I never liked deviled eggs even in my pregan days...it wasn't the taste that I didn't like, but rather the idea of them. But I think I'm gonna give these a try. Thanks for sharing your creative talents.
- July 17, 2009 at 1:09 PM
this is a great appetizer. I always disliked eggs but I think I would just make the filling of this and spread it on bread or something even if it is tofu it would be disguised so I can eat it:) Will have to order some black salt online as I have given up searching here.
- July 17, 2009 at 3:05 PM
- vegan.in.brighton said...
Awesome! I'm loving black salt at the mo' , I've been using it in a tofu egg mayo recipe and it makes it so much better.
- July 17, 2009 at 3:15 PM
- For the Love of Guava said...
Popped over from Shellyfish! OMG! Vegan Deviled Eggs?! Seriously a gift to the world! Your cookbook's going to be awesome!
- July 17, 2009 at 5:08 PM
- thedalyn said...
Thank you, thank you, thank you, thank you! I love deviled eggs and I've been thinking about tackling a vegan version. With baby and dissertation and everything else, it's nice to have it done for me...Can't wait to try this!
- July 17, 2009 at 5:43 PM
- Theresa said...
Almost everyone I know has had a negative experience with devilled eggs, where they ate far too many and got vurry sick. Somehow I expect you could eat loads of your tofu devils and not have the same effect. These look so great!
- July 17, 2009 at 6:05 PM
- Jenna said...
OH Fabulous! Thank you for this! I loved the taste of deviled eggs- one of the few egg dishes I actually liked and kinda miss. I'm sure this will be EVEN BETTER!
- July 17, 2009 at 6:39 PM
- Tofu Mom (AKA Tofu-n-Sprouts) said...
Ohmygosh - This is SO FUNNY!!! I did exactly the same thing when I first discovered "Black Salt" four or five years ago!! (long before I had a blog or thought to write these things down.) My "yolks" also use a little bit of garbanzo puree to add more of the mealy "yolk" texture. But yeah, perfect use for the stuff. YUM-O!!
(I LOVE LOVE LOVE black salt! It works in so MANY different dishes really - Makes tofu into AWESOME and very authentic "egg-salad" too by the way) - July 18, 2009 at 1:44 AM
- The Voracious Vegan said...
You will be forever hailed as a vegan hero for this one, my dear! I can't wait to try this great idea! Now I just have to track down that black salt...
- July 18, 2009 at 3:43 AM
- Gina said...
Sounds like I need to get my grubby little mits on some black salt!! I was just thinking yesterday about how much I used to LOVE deviled eggs.
- July 18, 2009 at 7:04 AM
- miss v said...
judging by all the comments, you are some sort of vegan superwoman. i knew this, of course. can i add to your praises? YOU ROCK my little vegan world! i soooo cannot wait to make these.
- July 18, 2009 at 7:28 AM
They look amazing!!! I still haven't tried to make any egg creations with tofu. I guess you could say I'm a little scared! You've inspired me though.
- July 18, 2009 at 8:45 AM
- Peanut Butter Swirl said...
wow this sounds amazing!!
I loved that you used tofu! - July 18, 2009 at 8:18 PM
- dreaminitvegan said...
Wow, I need to try this out on my husband because he LOVES deviles eggs. hmmmmmm.
- July 18, 2009 at 8:57 PM
- Cyn said...
Whoa. You are out of control, lady. I am totally making these.
- July 18, 2009 at 10:20 PM
- Mike K said...
Wow, this is a fabulous idea! I loved deviled eggs as a kid - I'm finally buying that black salt next time I go to the local Asian market - can't wait to try these!
- July 18, 2009 at 10:45 PM
- Sheridan said...
YAY!!! You did it! I can't wait to try them!
- July 19, 2009 at 3:05 PM
- April said...
So exciting! I will try them very soon.
- July 19, 2009 at 7:33 PM
- The Vegan Snorkeler said...
THANK YOU, Bianca! I've weirdly missed the taste of deviled eggs, even though I haven't eaten them since forever. I'm totally going to try to make these as soon as I get my hands on some black salt.
- July 20, 2009 at 3:23 AM
- The Vegan Snorkeler said...
THANK YOU, Bianca! I've weirdly missed the taste of deviled eggs, even though I haven't eaten them since forever. I'm totally going to try to make these as soon as I get my hands on some black salt.
- July 20, 2009 at 3:23 AM
- Vegan In The VI said...
This is a truly epic post in the world of vegan blogging. Right up there with Vegan Yum Yum's cupcakes and Don't Eat Off The Sidewalk's Tempeh Wingz.
- July 20, 2009 at 9:13 AM
- MeloMeals said...
Yum! Black salt is really amazing..
- July 20, 2009 at 12:36 PM
- Jen Treehugger said...
I'm another one who's recently discovered the magic of Black Salt. This recipe looks soo soo good.
You're a star.
:) - July 20, 2009 at 4:17 PM
- Erin said...
You went and did what I've been wanting to do for a long, long time. Very nice! Can't wait to try it.
- July 20, 2009 at 5:19 PM
- James said...
If you live in Japan, you can order a very generous bag of black salt for about 150円 from Indojin.com
This recipe looks great, Ima try it tonight. - July 20, 2009 at 7:54 PM
- Virginia said...
- July 22, 2009 at 10:32 AM
- Melisser; the Urban Housewife said...
Awesome! I think you should note that black salt isn't actually black, it's pink! There's a fancy finishing salt called black salt that costs a ton & isn't the same!
- July 23, 2009 at 7:35 PM
- Jenny said...
Fun! Gonna try these!
- July 23, 2009 at 9:35 PM
- Susan G said...
That is brilliant - one of the things I have missed!
- July 24, 2009 at 12:17 PM
- Bethany said...
now I'm in trouble. I just sent this link to my husband, who was a deviled egg freak before we went vegan. you just made his day :)
- July 24, 2009 at 2:48 PM
- Leandra said...
Omg thank you so much for posting this!! Before going vegan I used to looooove deviled eggs. They were one of my favorite foods, and one that I miss the most. I guess it's time for me to finally go track down some black salt!
- August 7, 2009 at 2:07 PM
- Julia said...
You can get free shipping until the end of August on black salt from here: http://www.saltworks.us/shop/product.asp?idProduct=207
I mashed tofu and added diced celery to the recipe to make egg salad instead. As a sandwich, it was fantastic. - August 8, 2009 at 2:54 PM
- Jenn said...
You are SO smart. Bring these babies to Nashville!
-Hello Veggie - August 13, 2009 at 8:51 AM
I made these with a few modifications. I didn't have silk tofu or relish. Instead I used extra vegenaise and some horseradish. I've always thought horseradish was eggy and they turned out great! next time i'll try them with the relish and silk tofu to compare.
- August 18, 2009 at 10:42 AM
- Lisa said...
I am SO excited to make these! Seriously, just last week my company had a potluck, and I looked at the deviled eggs, sighed because I used to adore them, and thought to myself, "That is one thing that just can't be veganized." Thank you for making me eat my words! I live right near a Penzeys (for the black salt), and once I have some people to serve these to, it's ON. If you were making these to bring somewhere, would you transport the squares and topping separately, then assemble on site?
Again, THANK YOU. I've been sending this link to everyone and their brother. :) - August 18, 2009 at 8:42 PM
Creative. Beautiful. Simply awesome!
Faith - October 19, 2009 at 1:07 AM
- Veg-In-Training said...
You are now my hero! This month for MOFO I'm veganizing family favorites. My friend just DOUBLE DOG DARED me to veganize her late hubby's recipe. I'm going to use yours as a base (his is a tad different) I'll make sure to give you the plug on my bloggy.
Thanks!! - October 21, 2009 at 9:45 AM
Hi Bianca, I'm def trying these! Hey. I have a new recipe for 'vegan sunny side up eggs'. I'd like to collaborate with you on the final recipe. This black salt might be a necc ingredient. Please email me.
Thanks and thanks for the great recipe.
Rocky Shepheard - November 7, 2009 at 5:29 AM
Amazing! I thought deviled eggs were just something you can't vegenize.. guess I was wrong. =D
- November 25, 2009 at 10:43 PM
We were trying to think of how to make devilled eggs, too. We got most of the ingredients but we didn't know black salt. My mom wanted to find black salt for an Indian chat. We're going to make this for our (vegan) staff potluck with a HOT theme. I suggested "Hell" and my mom told me about devilled eggs (i've always been vegan so I didnlt know). - Ian, just turned 8.
- December 14, 2009 at 9:32 PM
- lauren said...
it's easter. i made your deviled egg recipe thinking it might turn out ok, but they turned out amazing! you are awesome. this is the first recipe i've tried from your site, and now i'm looking forward to trying more!
- April 4, 2010 at 1:37 PM
- Tea Rex said...
Oh my gosh these look amazing. I have wanted to make vegan deviled eggs for the LONGEST time and now you have saved me the trouble!
And by the way . . . I love the Vegan Brunch book :) - April 5, 2010 at 2:36 PM
- Meg said...
Thank you for this amazing recipe! My husband and I just went vegan last fall and so I can attest that these do taste and feel AMAZINGLY like the "real" thing -- but better :D They've been a real hit with non-vegan friends, too!
The chives are good for garnish, but I prefer green olives and pimientos (along with the paprika). Reminds me of so many family holiday meals where we had deviled eggs except these are yummier, healthier, and cruelty-free -- and no eggs to peel!!! - April 13, 2010 at 7:45 PM
- Meg said...
I always end up with WAAAAAAAAY more of the "yolk" than I need. Is this normal? It still tastes great, but I hate to see it go to waste.
Is it possible to freeze the yolk mix? - May 17, 2010 at 6:41 PM
- Talula said...
These look so yummy! Brilliant! Can't wait to bring them to a cookout!
- July 30, 2010 at 1:41 PM
- Delcianna said...
great recipe, thanks! I made them today for a potluck. I used garbanzo beans though b/c I saw another recipe with those and they struck me a more egg-y for some reason.
- October 23, 2010 at 10:28 PM
- Unknown said...
Oh. my. god. Ever since going vegan, deviled eggs has been one of the dairy foods I've missed most. Thank you thank you thank you for posting this recipe!
- November 6, 2010 at 7:53 PM
Canned white beans or freshley cooked?
- November 14, 2010 at 7:09 PM
- Button Soup said...
Very interesting, although extra firm tofu sounds a bit too firm for imitating boiled egg, maybe just firm would be closer?
- November 25, 2010 at 11:18 AM
- MamaJolley said...
I have a way better recipe than silly ole tofu!!:
Deby's Vegan Deviled "Eggs" (Potatoes)
7 new potatoes (egg size-ish)
2 Tbsp vegan mayonnaise
1 teaspoon yellow mustard
1 to 2 tablespoons finely chopped sweet pickle
Salt and Pepper
*a dash turmeric is optional for yellow color
Paprika for dusting at the end
Boil eggs until fork tender. Cut 6 of them in half; peel the 7th. Use a melon-baller to scoop out the centers of the 12 potato halves. Mash the scooped out bits along with the 7th potato and mix in all remaining ingredients except paprika. Fill each half with a scoop of the yellow mixture. Dust with paprika, and enjoy!!
Obviously you can use your favorite family recipe for deviled eggs, using the same technique. You can peel the potato halves if you want to, but it's not necessary. The taste and texture are extremely satisfying to a vegan who has been craving this holiday staple.
Pic is at: http://farm4.static.flickr.com/3456/3817772083_06584e90df.jpg - November 30, 2010 at 7:03 PM
I make something similar to this. I use a firm tofu base but instead of silken tofu middle, I used mashed avocado with veganaise, nutritional yeast, mustard, and a little bid of crumbled firm tofu (because I liked a chunky center). It was very delicious. Maybe it's just me, but when you mix avocado and veganaise, it taste just like a yolk.
- April 5, 2011 at 11:42 AM
I wish these were as good as they look. For me it just didn't do anything. I followed the recipe exact and it just tasted odd, like turmeric and mustard. The consistency of the middle was too slimy not that pastey feel like real deviled eggs I think I'll try using potato recipe next time.
- May 11, 2011 at 5:15 PM
Oh. My. GODDESS these are amazing!!! I just made them, with only one substitution- I used onion powder instead of minced red onion, simply because that's how I used to make them in my pre-vegan days. :) But OH are they delicious! I used a piping bag to pipe the mixture on top of the tofu squares, and added a dash of extra paprika on top. SOOO good! Thank you, thank you, thank you! I have been craving deviled eggs for YEARS and now I can finally enjoy them compassionately. <3
- June 17, 2011 at 10:30 AM
- TroyW said...
Lol. You should just use my cage free vegan-fed happy chicken eggs.
- July 27, 2011 at 1:53 PM
You are too awesome! I am 19 and I've been a vegetarian for about 5 years and wanted to go vegan. I WAS waiting until the holidays were over because I wanted to do it right and I thought starting out around holiday time when there were so many yummy things to eat would be so hard. Now I will be switching to vegan this week.
Can't wait to try these.
Jami - November 11, 2011 at 5:11 AM
Bianca, I'm only now coming across your page & I'm so excited to make some of your recipes (and am looking forward to your cookbook!). I just bought some black salt myself - it does taste exactly like deviled eggs, it's insane. Thanks for this recipe!
- February 15, 2012 at 6:44 PM
Bianca, these are SO AWESOME. Thank you so much for posting the recipe - they're going to our Easter celebration today!
One question though - in the recipe ingredients 1/2t of black salt is specified, but in the directions it's 1t that's placed in the food processor.
I did 1/2t, and thought it was plenty eggy for my tastes, but just curious what you decided.
Thanks again! - April 8, 2012 at 12:45 PM
- Bianca said...
Hey Erin! The other 1/2 teaspoon is spread on the white tofu eggs, just to give it a super eggy flavor. But sounds like they were fine without it. I may have made a typo on the recipe here though. I'll check it out! Thanks for letting me know.
- April 9, 2012 at 4:18 PM
- Sherri - PDX Yogini said...
These are awesome! I'd totally missed them on your site. Using a cookie/food cutter would be awesome, like the little plum blossom one I've been using for shaped daikon (the dog and I just eat the bits or I make stock with it). You could make a little tofu salad up with the bits cut off.
- May 2, 2012 at 10:45 PM
- Mike said...
I agree who cares what there shaped like as long as they taste awesome. I like how you show people that you can eat tasty food as a vegan and your not as limited as peolpe think.
- September 10, 2012 at 10:42 AM
Here is a place to get your black salt that is owned by a caring company!
http://www.frontiercoop.com/products.php?ct=spicesaz&cn=Kala+Namak+Sea+Salt - November 27, 2012 at 6:23 PM


text:
A year and a half ago, a mix-up at a Tyson Foods chicken processing plant landed more than 150 workers in the hospital. Five required intensive care.
The problem: Somebody poured a solution of sodium hypochlorite (think industrial strength bleach) into a 55-gallon drum that had contained an antimicrobial solution identified as FreshFx.
That stuff was acidic, according to investigators. Mix bleach and acid, and you can make a lot of chlorine gas in a hurry.
At the Tyson plant in Springdale, Ark., that toxic gas spread quickly. About 600 people working there were evacuated.
Four months later, 116 workers had asthma symptoms related to the release. More than 100 had symptoms of posttraumatic stress disorder.
At six months, three people showed symptoms of a type of severe asthma caused by exposure to irritating chemicals.
"This chlorine release and its resultant health effects were preventable," the Centers for Disease Control and Prevention concludes in a report published Thursday in the Morbidity and Mortality Weekly Report.
An investigation by CDC's National Institute for Occupational Safety and Health found that the root cause of the problem was a failure to communicate. The worker who mixed the chemicals by mistake "had limited English skills, and was unable to read the label on the drum that had been inadvertently left in the wrong place," the report concluded.
Tyson spokesman Gary Mickelson disputed these conclusions in an email to Shots:
The NIOSH study incorrectly identifies the employee who accidentally mixed the chemicals as being Spanish-speaking. The worker responsible is not Hispanic and his primary language is English. In addition, this employee had previously received hazardous chemical training.
CDC stood by the reports. The published material "is accurate," spokeswoman Christina Spring said in an email to Shots.
A separate report from NIOSH, also cited labels only in English combined with a lack of English literacy at the plant as broader safety issues. Most employees at the plant spoke Spanish or Marshallese (the language of the Marshall Islands) rather than English as a first language.
"While there's no question this was an unfortunate incident, we acted responsibly in addressing it," Tyson's Mickelson said. The CDC report doesn't reflect the changes Tyson has made to prevent problems like this from happening again, he said.
Copyright 2021 NPR. To see more, visit https://www.npr.org.

subset: commoncrawl


text:
This version of the C14 MicroFocuser will fit both the Edge HD and new-style non-HD 14" SCTs from Celestron. The "new-style" non-HD C14s have the same style rear cell as the Edge HD models. This rear cell has the molded 3-lobed pattern and cooling vents. "Old-style" C14s are earlier models with the ribbed rear cell.
The Starlight Instruments SCT MicroFocuser provides the smoothest control for fine focusing. Two focus knobs allows for standard or 1/10th-speed focusing, making the MicroFocuser extremely accurate. Excellent for both imaging or visual observing, this focuser is precision-machined and anodized black with a brass fine-focus knob.
The SCT MicroFocuser is easily installed in place of the original focus knob on Celestron Edge HD 14" SCTs. A built-in stop prevents the primary mirror from detaching from the focuser.
View the instruction manual for this product


text:
I was deeply disappointed to read UR Professor Steve Landsburg's recent blogs praising Rush Limbaugh for a "spot-on analogy" with respect to his offensive remarks about Georgetown student Sandra Fluke (although Landsburg parted company with Limbaugh for calling Fluke a "slut"). Landsburg went further. He stated that Ms. Fluke's position deserved "only to be ridiculed, mocked and jeered." He further stated that the right word for her position was "extortionist," characterized those who disagreed with his view as "contraceptive sponges," and added that there is nothing wrong with being paid for sex.Contraceptive sponges... now, that is clever.
... I am outraged that any professor would demean a student in this fashion. To openly ridicule, mock, or jeer a student in this way is about the most offensive thing a professor can do. We are here to educate, to nurture, to inspire, not to engage in character assassination.To openly ridicule, mock, or jeer a student in your classroom may be one of the most offensive things a professor can do, but when a student is a political activist who testifies before a congressional subcommittee on a specific policy question that you disagree with, it's not that horrible to blog about that. (It's not the approach I, as a professor, felt like taking. If you look at my first post on the subject, I said "I've been avoiding weighing in on this subject, in part because, as a law professor, I don't like talking about an individual law student," and then my discussion wasn't about the young woman, but all the political leveraging that was going on.)
Of course, Seligman is a political actor. He's got to deal with his intra-university constituencies. I'd like to know who's been pressuring him to push back Landsburg.
Landsburg now has made himself newsworthy as one of Limbaugh's few defenders. I wish he had focused instead on the ideal of a university as an institution that promotes the free exchange of ideas and lively debate at its best in an atmosphere of civil discourse in which the dignity of every individual is respected.Lively, but not too lively, apparently. And please don't stick out "as one of Limbaugh's few defenders." The more people are all on one side of an issue, in Seligman's view, the more important it is for everybody to get over on that side. And Landsburg ought to focus on... what? Some abstract ideal that Seligman seems to be violating in the process of mushily stating?
Here's the Inside Higher Ed article that pointed me to Seligman's statement. Added facts:
On Wednesday, about 30 students protested Landsburg's comments by coming to one of his courses and standing between him and the class while he continued to lecture.... They left after 15 minutes but then came back at the end of the class.And the university president sides with the students... in lofty pursuit of the free exchange of ideas and lively debate in an atmosphere of civil discourse in which the dignity of every individual is respected. Okay.
"We are here to educate, to nurture, to inspire, not to engage in character assassination." Where's the character assassination? Landsburg disagreed with the policy Sandra Fluke promoted. In Congress. Professors have the obligation to "nurture" and "inspire" her from afar by refraining from taking on her ideas? Is that some special kid-gloves treatment for women? Ironically, that would be sexist. Should we be patting the female political activist on the head and murmuring good for you for speaking up? That is dismissive. It's better feminism to react to what a woman in politics says and to respond to her with full force the way you would to a man. And that's what Landsburg did:
[W]hile Ms. Fluke herself deserves the same basic respect we owe to any human being, her position — which is what's at issue here — deserves none whatseover. It deserves only to be ridiculed, mocked and jeered. To treat it with respect would be a travesty....Now, Landsburg's an economist. Note the references to externalities or other market failures. He goes on to say a little something about prostitution. He goes on find the the analogy to prostitution flawed. Fluke is, he says, more of an "extortionist" — an "extortionist with an overweening sense of entitlement." For some reason Seligman thought he needed to throw in his position on prostitution:
To his credit, Rush stepped in to provide the requisite mockery. To his far greater credit, he did so with a spot-on analogy: If I can reasonably be required to pay for someone else's sex life (absent any argument about externalities or other market failures), then I can reasonably demand to share in the benefits. His dense and humorless critics notwithstanding, I am 99% sure that Rush doesn't actually advocate mandatory on-line sex videos. What he advocates is logical consistency and an appreciation for ethical symmetry. So do I. Color me jealous for not having thought of this analogy myself.
I totally disagree with Landsburg that there is nothing wrong with being paid for sex.Landsburg, rejecting the prostitution analogy, had written "Ms. Fluke is not in fact demanding to be paid for sex. (Not that there's anything wrong with that.)" Seligman continues:
Having been a Dean of two law schools with clinics that addressed violence against women, I am all too aware of the terrible correlation between prostitution and the physical and emotional demeaning of women.Oh, a correlation? Well, then, by all means, totally disagree with a professor who entertains the notion that the exchange of money for sex might not in itself be wrong. Because you're all about the free exchange of ideas and lively debate!


text:
Product Description 2013 Watson Wakeboard Binding:
Shawn Watson's Pro wakeboard binding maintains its position in our line as one of our most responsive high end bindings. The Liquid Force Watson binding provides just the right balance of flexibility and support needed to perform at the highest levels. Watson demands high performance and Liquid Force delivers it with the 2013 Watson Pro. Whether you're a stylishly smooth pro like Watson or a weekend warrior, you'll be performing your best with Watson's 2013 bindings on your feet.


text:
Check out my range of rebel masks in three different colours and designs, raning in price between $13- $17
Rebel Masks
- I'm a product detail. I'm a great place to add more information about your product such as sizing, material, care and cleaning instructions. This is also a great space to write what makes this product special and how your customers can benefit from this item.


text:
The paper does not prove that climate has not played an important role in the shaping of human cranial variation. Rather it shows that it does not play an important role in the level of diversity found in different populations. But, I really can't think why anyone would propose that.
Let's take a particular trait, say nose breadth or cranial breadth. It has been demonstrated that the former tends to be narrower and the latter broader in more northerly compared to more equatorial regions. But, this is a difference in the means and not a difference in the variance of the traits in question.
The authors write:
All the most informative traits were distributed in the anterior region of the cranium (yet not all anterior traits were highly informative). This came as a surprise as the anterior regions of the cranium are generally assumed to be more affected by natural selection (i.e. facial area and cranial breadth), while the temporal bone and some traits of the neurocranium are considered to reflect population history (Beals et al. 1984; Franciscus & Long 1991; Roseman 2004; Harvati & Weaver 2006).
Diversity is reduced in either of two ways:
- Serial bottlenecks, when a subset of the variation present in the ancestral population migrates to new regions
- Selection, which reduces diversity in the traits under selection
Under the scenario of selection, however, it is expected that traits under selection will be more affected by the new ecological conditions that occur away from the cradle.
The finding that the anterior region of the cranium is more informative in terms of reduced diversity is actually consistent with selection and not with bottlenecks, since it is in this part, in nasal features, facial flatness, prognathism, etc. that populations have developed strongly differentiated types under selection.
Furthermore, in this paper the study is limited to skulls from the last 2,000 years. But, if bottlenecks are indeed responsible for the reduction of diversity, then this reduction of diversity would be visible in the earliest Homo sapiens skulls from the various regions, as these would be descended from the few bottlenecked migrants. Are Upper Paleolithic Europeans, for example, more or less diverse than Africans of equivalent age, or even modern Africans?
On the contrary, recent skulls may be less diverse than the earliest ones, due to a longer period of selection, i.e., the tens of thousands of years between the earliest Homo sapiens in Europe or Asia and the ones of the last 2,000 years. Moreover, this selection ought to have been strongest in regions further from Africa, as this is correlated with different environments (although not necessarily the 3 climate variables considered here).
In conclusion:
- Within-population variance decreases with distance from Africa, but this does not measure between-population difference in mean trait values
- Both bottlenecks and selection result in reduced variance
- A stronger variance-reduction signal in the anterior cranium is more consistent with selection than with bottlenecks
- The bottlenecks theory should be more visible in early, not recent skulls as those studied in this paper. Recent skulls should have reduced variance compared to their more ancient counterparts due to a long period of selection.
Proceedings of the Royal Society B doi:10.1098/rspb.2008.1563
Distance from Africa, not climate, explains within-population phenotypic diversity in humans
Lia Betti et al.
The relative importance of ancient demography and climate in determining worldwide patterns of human within-population phenotypic diversity is still open to debate. Several morphometric traits have been argued to be under selection by climatic factors, but it is unclear whether climate affects the global decline in morphological diversity with increasing geographical distance from sub-Saharan Africa. Using a large database of male and female skull measurements, we apply an explicit framework to quantify the relative role of climate and distance from Africa. We show that distance from sub-Saharan Africa is the sole determinant of human within-population phenotypic diversity, while climate plays no role. By selecting the most informative set of traits, it was possible to explain over half of the worldwide variation in phenotypic diversity. These results mirror those previously obtained for genetic markers and show that 'bones and molecules' are in perfect agreement for humans.


text:
What is Ambroxol Terbutaline & Guaiphenesin?
Ambroxol Terbutaline & Guaiphenesin Syrup is a medicine that is used for the treatment of Respiratory Diseases, Cough, Congestion, Common Cold, Bronchitis, Breathing Illnesses and other conditions.
Ambroxol Terbutaline & Guaiphenesin Syrup contains Ambroxol Hydrochloride, Guaiphenesin, Menthol, and Terbutaline Sulphate as active ingredients.
Ambroxol Terbutaline & Guaiphenesin Syrup works by thinning the chest mucus; thinning the mucus in the air passages; relaxing and opening the airways; temporarily relieving minor pain;
Detailed information related to Ambroxol Terbutaline & Guaiphenesin SyrupâÂÂs uses, composition, dosage, side effects and reviews is listed below.
Ambroxol Terbutaline & Guaiphenesin Syrup Uses
Ambroxol Terbutaline & Guaiphenesin Syrup is used for the treatment, control, prevention, & improvement of the following diseases, conditions and symptoms:
Ambroxol Terbutaline & Guaiphenesin Syrup Working, Mechanism of Action and Pharmacology
Ambroxol Terbutaline & Guaiphenesin Syrup improves the patient condition by performing the following functions:
Ambroxol Terbutaline & Guaiphenesin Syrup Composition and Active Ingredients
Ambroxol Terbutaline & Guaiphenesin Syrup is composed of the following active ingredients (salts)
Please note that this medicine may be available in various strengths for each active ingredient listed above.
Ambroxol Terbutaline & Guaiphenesin Syrup Side-effects
The following is a list of possible side-effects that may occur from all constituting ingredients of Ambroxol Terbutaline & Guaiphenesin Syrup. This is not a comprehensive list. These side-effects are possible, but do not always occur. Some of the side-effects may be rare but serious. Consult your doctor if you observe any of the following side-effects, especially if they do not go away.
Ambroxol Terbutaline & Guaiphenesin Syrup Precautions & How to Use
Before using this drug, inform your doctor about your current list of medications, over the counter products (e.g. vitamins, herbal supplements, etc.), allergies, pre-existing diseases, and current health conditions (e.g. pregnancy, upcoming surgery, etc.). Some health conditions may make you more susceptible to the side-effects of the drug. Take as directed by your doctor or follow the direction printed on the product insert. Dosage is based on your condition. Tell your doctor if your condition persists or worsens. Important counseling points are listed below.
The most widely recognized markets for this item incorporate the accompanying nations.you don't mind ask with us if your nation or district isn't recorded:
ASIA: Afghanistan, Israel, Jordan, Pakistan, Russia, Saudi Arabia, Singapore, Syria, Philippines, Turkey, Turkmenistan, Uzbekistan, Yemen, Vietnam, Indonesia, Malaysia, Iran, Tajikistan, and so forth.
AFRICA: South Africa, Uganda, Nigeria, Ghana, Kenya, Mauritius, Botswana, Egypt, Ethiopia, Libya, Sudan, Congo, Gambia, Ivory Coast , and so forth.
NORTH & SOUTH AMERICA: USA, Canada, Panama, Trinidad and Tobago, Costa Rica, Puerto Rico, Dominican Republic, Argentina, Guatemala, Guyana, Peru, Bolivia, Venezuela , Brazil, Bahamas, Ecuador, and so forth .
EUROPE: Austria , Azerbaijan, Belarus, Belgium, Cyprus, Czech Republic, Denmark, France, Georgia, Germany, Hungary, Ireland, Iceland, Netherlands, Norway, Poland, Spain, Sweden, Switzerland, Ukraine, United Kingdom (UK) , Latvia, and so forth.
OCEANIA: Australia, New Zealand, Fiji, and so forth.
All Rights Reserved.(Terms of Use) Developed and Managed by Infocom Network Private Limited. |


text:
This is the 956-681 subcode (NPA-NXX) prefix page. Follow a prefix to find the number you are looking for. We divide our pages up to make them more user friendly to navigate!
The 956-681 subcode mainly covers Mcallen in Hidalgo county. But other numbers maybe included as well.
We have a database of information derived from the public phone records of Texas state. Many of the numbers in this subcode are Regular Landline registered to Smartcom. We hear they employ a large number of people in the Texas office.
Recently there have been an increase in reported calls, we've had over 774769 comments across our systems for the 956-681 subcode.
Looking for a different number? Follow a link below to see our recently active.
713-367-1924 925-566-2913 847-429-3362 570-527-8711 909-689-4126415-728-4864 816-400-9841 947-740-6991 513-217-5212 360-746-9106


text:
David Shuttle Ltd is a family run business that has been trading globally in Fine Dining and Gifts for over 30 years, offering an eclectic range of highly competitively priced brand named products.
We have now established ourselves as one of the UK's largest retailers of Swarovski Crystal, Riedel Crystal, Emma Bridgewater and Lalique to name but a few.
We are based in Buckinghamshire, but have a customer base throughout the UK and internationally. David Shuttle ships worldwide and we are renowned for our exceptional customer service.
If you use a voucher not advertised on Quidco, your purchase will not be eligible for cashback


text:
Somewhere, probably in Africa (maybe Asia), there was a meeting.
A branch of the primate family that had started walking upright, and a cousin of the gray wolf, first set eyes on each other. And both realized this relationship had potential.
The records show we've been together for at least 15,000 years, but I suspect dogs (and their ancestors) have been leading us around for much longer. It's impossible not to see how useful they must have been as an alarm system and hunting partner going back to our cave days. And being with us gave them steady access to a food supply. So this has been a win-win relationship from the start. Dogs gave humans a better chance to survive, and vice-versa. So we grew up together.
When humans first came across the Bering Strait, they brought dogs with them. There's even the possibility that they couldn't have made the trip without dogs to pull their sleds.
Most relationships would get old after this long, but not us. If anything, our need for them has increased over time, but in different ways. We may not need hunting partners as much, but their incredible skills for guide/assistance animals, security, search & rescue, and many other jobs, make them invaluable.
Sometimes they can even drive us around (Thank you, Doreen!)
But the most basic part of the deal is still companionship. Humans seem to have an instinctive need for different species companionship. And they like us, too. Because of the nature of the Grumpy household (3 dogs) there is inevitably at least one in our bed at night, and another in a kid's bed. There's something very primordial about dozing off next to a dog. You can envision our mutual ancestors in a cave, with a fire in the background, huddling together with a wild dog for warmth. And as you fall asleep, the dog has one eye on the entrance to warn you of danger.
And on that note, for those of you who didn't notice her name added last month, I'd like to introduce Mello:
How much is that doggy in the window?
Mello is maybe 2 years old, and was found wandering downtown Grumpyville by employees at Mrs. Grumpy's job. She had no collar or chip, and after combing through multiple lost pet sites, and looking for "lost dog" signs, we were unable to locate her owner. So she has now joined Snowball and Cooper in the Grumpy insane asylum.
Making herself at home.
She is an awesome dog, and we are lucky to have her. Great dogs can be found anywhere. All of the Grumpy dogs have been rescue animals, and if you're looking for a new companion, I recommend adopting from your local shelter.
You (and your new friend) will be thankful you did.
Happy Thanksgiving everyone!


text:
XFreePixmap(display, pixmap)
Display *display;
Pixmap pixmap;
The server uses the specified drawable to determine on which screen to create the pixmap. The pixmap can be used only on this screen and only with other drawables of the same depth (see XCopyPlane for an exception to this rule). The initial contents of the pixmap are undefined.
XCreatePixmap can generate BadAlloc, BadDrawable, and BadValue errors.
The XFreePixmap function first deletes the association between the pixmap ID and the pixmap. Then, the X server frees the pixmap storage when there are no references to it. The pixmap should never be referenced again.
XFreePixmap can generate a BadPixmap error.


text:
The Wild Roses Are In Bloom
"How many cat years are in a human year?" Joe asked me as we lay in bed yesterday morning. He knew I was thinking about Gretel.
"Some people say seven, but there are plenty of cats who live to be at least 20, so some people say five."
"Well even at five years, that would make Gretel, wow, really old."
About an hour later, with a little cry of goodbye, the last of my four transplanted California cats passed away. She was 20 years old. Her death wasn't entirely unexpected, though I didn't think I'd be out in the garden digging another grave less than a week after the sudden loss of New Cat.
Apart from being periodically terrorized by the 4-1/2 pound Doodle Monster during the past decade, I don't think Gretel could have asked for a better cat life.
She spent her last day laying in the shade on the front step, taking in the fresh air and the farm. She waited for me to wake up the next morning and was wrapped in my arms when she took her final breath.
We were gone much of yesterday, and when I opened the front door late last night I caught myself automatically checking Gretel's favorite spots to see where she was, to make sure she was okay. I was surprised her absence hit me so hard. A little while later I realized that I've lived with Gretel longer than I've lived with anyone else in the world--more than half my life.
I'm not sad for Gretel, but a hundred years is a long time to be together. It's no wonder my heart and my home feel so empty. The memories, of course, will live on as long as I do, and for that I will always be grateful.
© 2007 FarmgirlFare.com, the award-winning blog where Farmgirl Susan shares photos & stories of her crazy country life on 240 remote Missouri acres.


text:
PITTSBURGH (AP) — A project examining the local health impacts from natural gas drilling is providing some of the first preliminary numbers about people who may be affected, and the results challenge the industry position that no one suffers but also suggest the problems may not be as widespread as some critics claim.
The Southwest Pennsylvania Environmental Health Project has been trying to help people who feel they've been sickened by natural gas drilling or processing for about 18 months in one county south of Pittsburgh.
The work is potentially important because it's one of the first long-term attempts to monitor drilling-related health impacts, and it could help other groups identify possible symptoms.
The project found 27 cases where people in Washington County believe they were hurt by nearby drilling — seven cases of skin rashes, four of eye irritation, 13 of breathing problems and three of headaches and dizziness. The skin exposures were from water and the other cases were from air. The numbers don't represent a full survey of the area, just cases so far with plausible exposures.
The EHP group is trying to help those who have been exposed to drilling-related air or water pollution, toxicologist David Brown told The Associated Press, adding that they're finding "an array of symptoms" in some people who live close to either wells or processing stations.
There are some surprises: Air pollution seems to be more of a threat than water pollution, and the huge processing stations that push gas into national pipelines may be more of a problem than the drilling sites themselves. The processing stations can handle large volumes of gas from hundreds of wells.
Washington County has a population of about 200,000, and about 700 natural gas wells have been drilled there in the past six years. It's also home to large gas processing operations.
Some experts not involved with the findings praised the general program but said the debate over fracking and health often neglects a crucial point.
"There's a strong case that people in the U.S. are already leading longer lives as a consequence of the fracking revolution," said Michael Greenstone, a professor of environmental economics at the Massachusetts Institute of Technology. That's because many power plants have stopped burning coal and switched to natural gas, which emits far less fine soot, nitrous oxide and sulfur dioxide.
"Obviously, that has to be counterbalanced against the local effects of the drilling," and that makes for a complicated decision, said Greenstone, formerly one of President Barack Obama's chief economic advisers. Obama has expressed strong support for the natural gas drilling boom and has said it can be done safely.
Greenstone said more work needs to be done to confirm that Washington County residents were affected by natural gas activity and not by other factors, but he called the project an "important start."
The EHP group only counted cases where symptoms began after natural gas activity started, where there was a plausible source of exposure and where the individual didn't have an underlying medical condition that was likely to have caused the symptoms.
Brown said the project team is aware more work needs to be done on links between natural gas activities and health impacts. He said the work has been "a lot harder than I thought it was going to be," but they've made substantial progress.
The work is preliminary, but there are other independent signs of problems related to the gas industry in Washington County.
John Poister, spokesman for the Departmental of Environmental Protection, said last week that the agency has ordered natural gas company MarkWest Energy Partners to submit a pollution control plan for one plant and would like to see the improvements "sooner rather than later."
MarkWest environmental manager Nathan Wheldon said that protecting the environment of communities is a top priority and that the company operations meet or exceed all applicable state and federal regulations.
MarkWest, based in Denver, operates large natural gas facilities. A previous DEP report found some of the state's highest levels of gas drilling air pollution in Washington County, including toxic compounds such as benzene, toluene and formaldehyde. Other gas drilling firms and companies operate in the area, too.
Long-term exposure to benzene can affect the immune system and cause cancer, while toluene can cause excessive sleepiness, confusion and, with long-term exposure, brain damage.
Patrick Creighton, a spokesman for the Marcellus Shale Coalition, an energy industry group, said, "Air quality across our region, and the nation, is sharply improving thanks to expanded natural gas use."
Brown said one of the most worrying findings was the extremely high levels of air pollution found inside two homes that are about 1,000 feet from a gas processing station. Western Pennsylvania tends to have high levels of air pollution, but the levels found in the two homes were up to four times higher than the local average.
Brown said the group is collecting more data and pushing ahead to refine ways to advise people who are worried about nearby natural gas activity


text:
Bar Team Member
You don't need any experience to join us as a Bar Team Member. You do need to be able to demonstrate that you are a great team player as well as being able to work unsupervised during busy times and be keen to learn.
We invest in our people and operate an award-winning internal training programme, as a Bar Team Member this will give you the opportunity to develop your career.
Stonegate is the largest pub company in the UK with over 1000 pubs, bars & clubs and over 12,000 passionate employees helping us deliver a fantastic customer experience.
So, whether you are looking to begin an exciting career in hospitality, or you are an experienced pub pro looking for a new challenge, we want you to be part of the Stonegate family.
Benefits of working for Stonegate Group:
- Reward Card – 25% off Food & Drink
- Wagestream – Ability to withdraw part of your salary prior to payday
- Stonegate Xtra Rewards – Voluntary benefits from major high street retailers & travel
- David Lloyd – 25% off gym membership
- Dental Insurance
- Employee Assistance – Licence Trade Charity
- Pension Contribution
Stonegate Group can offer you a career as a Bar Team Member in your local pub, bar or Club.


text:
A free for all forum for discussing anything non-disney. Have something to share? A great tip, recipe, idea? Heard a good joke? Need to vent? This is the forum to do it!
Use this control to limit the display of threads to those newer than the specified time frame.
Allows you to choose the data by which the thread list will be sorted.
Order threads in...
Note: when sorting by date, 'descending order' will show the newest results first.
Forum Rules


text:
Shaving Foam Bottle Mockup
About the Product
Shaving Foam Bottle Mockup
Present your shaving foam bottle design and templates in the right way using this shaving foam bottle mockup! Simply place your design with a single click using the Photoshop smart object. It's really that simple!
The mockup is fully layered and customizable so you can make any changes. Every element is a single layer. You can change/remove background, you can change any colors (background, any bottle part...), adjust or remove shadows and reflections, you can make literally any changes!
- High-quality and photorealistic 3D mockup
- 3840 x 2617 px
- Simple and easy to edit
- Place your design with a single click – using Photoshop smart object
- Fully layered and customizable – every element is a single layer
- Lot of options for customizing
- Change/remove the background
- Change any colors (background, any bottle part...)
- Adjust or remove the shadows and reflections
- Make literally any changes
- Readme file included
- 24/7 unlimited support included
The mockup is compatible with Photoshop versions CC 2022, CC 2023+.
If you need any help with any UnicDesign product or got any questions, please contact us via link provided in the 'Readme' file.
Design is for demo purposes only and is not included in the download.
Product Specs
- Created: Feb 06, 2024
- File Size: 18.3 MB
- Dimensions: 3840 x 2617 px
- Layered


text:
Number 1 Dad Atlanta Falcons Nike Game Jersey - Black
Number 1 Dad Atlanta Falcons Nike Game Jersey - Black
Regular price
Regular price
Sale price
Unit price
Your dad loves watching their beloved Atlanta Falcons play on Sunday's. Reward their passion for the team while also showing them how you feel about them with this Number 1 Dad Game Jersey from Nike. Its heat-sealed graphics provide a kickoff-ready aesthetic while also offering a comfortable lightweight feel. Designed for everyday movement this jersey has a tailored fit and features mesh side panels for added ventilation as they celebrate every big play the Atlanta Falcons make this season.
- Product ID: 200192457
- Brand: Nike
- Imported
- Designed for movement
- Heat-sealed name numbers and team details
- Mesh side panels for extra breathability
- Sewn-on NFL Shield at collar and satin twill woven jock tag at hem
- Short sleeve
- Side splits at hem
- Loose fit
- Material: 100% Polyester Tricot
- Machine wash tumble dry low
- Jersey Color Style: Team
- Officially licensed
- Nike Game


text:
Outdated egg!
This is an egg for CHICKEN 4, the unsupported old release. You're almost certainly looking for the CHICKEN 5 version of this egg, if it exists.
If it does not exist, there may be equivalent functionality provided by another egg; have a look at the egg index. Otherwise, please consider porting this egg to the current version of CHICKEN.
A small web-server written in Chicken.
Felix Winkelmann. Currently maintained by Peter Bex.
Requires the intarweb, uri-common, uri-generic and sendfile extensions.
Spiffy is a web-server library for the Chicken Scheme system. It's quite easy to set up and use (whether as a library or a standalone server application) and it can be customized in numerous ways.
To test it out immediately, try the following command after installing:
$ csi -e "(use spiffy) (start-server)"
This starts up a spiffy server which listens on port 8080, and serves documents from the default docroot, which is a directory called web underneath the current working directory.
A typical httpd would be a more complete program which first configures a few things like the port-number and root-path parameters and set up some logging through access-log and error-log. It could also configure some extensions (like simple-directory-handler) and register some user-defined path handlers by adding them to vhost-map. Finally it could daemonize by forking and exiting. The mentioned parameters are explained below.
Starting the server
[procedure] (start-server [port: port-number] [bind-address: address] [listen: listen-procedure] [accept: accept-procedure] [addresses: addresses-procedure])This is the most convenient way to get a server up and running quickly. It starts the server to listen on the given port. Other configuration can be tweaked through SRFI-39 parameters. These are listed below. Once the server is started, server behaviour can be controlled through these parameters as well. After the listener is started, when spiffy-user and/or spiffy-group are provided, this procedure will drop privileges before starting the accept loop.
By default, Spiffy will only serve static files. On directories, it will give a "403 forbidden", unless there is an index-file. If there is, that file's contents will be shown.
All arguments directly supplied to start-server override the configuration parameter values and will be parameterized to reflect this new setting.
port-number defaults to the value of server-port (see below). bind-address defaults to the value of server-bind-address (see below). listen defaults to tcp-listen and should accept a port number, backlog and bind address. accept defaults to tcp-accept, and is passed on as-is to accept-loop. addresses-procedure defaults to a procedure which works like tcp-addresses but can also detect SSL ports and return the addresses of the underlying TCP connection.
[procedure] (accept-loop listener accept [addresses])This procedure starts the loop which accepts incoming connections and fires off threads to handle requests on those connections. You can use it if you need more control over the startup process than start-server offers.
The listener object should be an object which is accepted by the accept procedure, which should return two values; an input and an output port which represent an incoming connection from a client. The optional addresses procedure should accept the input port returned by the accept procedure and return two strings; the local and remote addresses of the server and client, respectively.
For example, you can set up an SSL context and drop privileges, and possibly load extra code before starting the accept loop (Spiffy contains the required code to detect SSL ports, and will handle those more-or-less transparently):
(use chicken-syntax) ; This must done at the very toplevel so that it is available in the interaction-environment. (use spiffy openssl) (server-port 443) (spiffy-user "www") (spiffy-group "www") ;; Bind the port as root, before we drop privileges (define listener (ssl-listen (server-port))) ;; Load the certificate files as root so we can secure their permissions (ssl-load-certificate-chain! listener "server.pem") (ssl-load-private-key! listener "server.key") ;; Drop root privileges (switch-user/group (spiffy-user) (spiffy-group)) ;; We don't want to load this extra code as root! (load "extra-code.scm") ;; Done! Start listening for connections. (accept-loop listener ssl-accept)[procedure] (switch-user/group user group)
This is a helper procedure which allows you to easily drop privileges before running the accept loop. The user and group must be either strings or UID/GID numbers which indicate the username and groupname to which you want to switch. Either is also allowed to be #f, if you don't want to switch that aspect of the process.
Configuration parameters
The following parameters can be used to control spiffy's behaviour. Besides these parameters, you can also influence spiffy's behaviour by tweaking the intarweb parameters.
[parameter] (server-software [product])The server software product description. This should be a valid product value as used in the server and user-agent headers by intarweb; this is a list of lists. The inner lists contain the product name, the product version and a comment, all either a string or #f. Default: (("Spiffy" "a.b" "Running on Chicken x.y")), with a.b being the Spiffy major/minor version and x.y being Chicken's.
[parameter] (root-path [path])The path to the document root, for the current vhost. Defaults to "./web".
[parameter] (server-port [port-number])The port number on which to listen. Defaults to 8080.
[parameter] (server-bind-address [address])The IP address on which to listen, or all addresses if #f. Defaults to #f.
[parameter] (max-connections [number])The maximum number of simultaneously active connections. Defaults to 1024.
Any new connection that comes in when this number is reached must wait until one of the active connections is closed.
[parameter] (spiffy-user [name-or-uid])The name or UID of a user to switch to just after binding the port. This only works if you start Spiffy as root, so it can bind port 80 and then drop privileges. If #f, no switch will occur. Defaults to #f.
[parameter] (spiffy-group [name-or-gid])The name or GID of a group to switch to just after binding the port. This only works if you start Spiffy as root, so it can bind port 80 and then drop privileges. If #f, it will be set to the primary group of spiffy-user if the user was selected. Otherwise, no change will occur. Defaults to #f.
[parameter] (index-files [file-list])A list of filenames which are to be used as index files to serve when the requested URL identifies a directory. Defaults to '("index.html" "index.xhtml")
[parameter] (mime-type-map [extension->mimetype-list])An alist of extensions (strings) to mime-types (symbols), to use for the content-type header when serving up a static file. Defaults to
'(("html" . text/html) ("xhtml" . application/xhtml+xml) ("js" . application/javascript) ("css" . text/css) ("png" . image/png) ("xml" . application/xml) ("pdf" . application/pdf) ("jpeg" . image/jpeg) ("jpg" . image/jpeg) ("gif" . image/gif) ("ico" . image/vnd.microsoft.icon) ("svg" . image/svg+xml) ("txt" . text/plain))
See also file-extension->mime-type for a procedure which can look up file extensions for you.
[parameter] (default-mime-type [mime-type])The mime-type (a symbol) to use if none was found in the mime-type-map. Defaults to 'application/octet-stream
[parameter] (default-host [hostname])The host name to use when no virtual host could be determined from the request. See the section on virtual hosts below.
[parameter] (vhost-map [host-regex->vhost-handler])A mapping of virtual hosts (regex) to handlers (procedures of one argument; a continuation thunk). See the section on virtual hosts below. Defaults to `((".*" . ,(lambda (continue) (continue))))
[parameter] (file-extension-handlers [extension->handler-list])An alist mapping file extensions (strings) to handler procedures (lambdas of one argument; the file name relative to the webroot). Defaults to '(). If no handler was found, defaults to just sending a static file.
[parameter] (access-log [log-file-or-port])Filename (string) or port to append access log output to. Default: #f (disabled)
[parameter] (error-log [log-file-or-port])Filename (string) or port to which error messages from evaluated code should be output. Default: (current-error-port)
[parameter] (debug-log [log-file-or-port])Filename (string) or port to write debugging messages to. Default: #f (disabled)
[parameter] (access-file [string])The name of an access file, or #f if not applicable. This file is read when the directory is entered by the directory traversal system, and allows you to write dynamic handlers that can assign new values for parameters only for resources below that directory, very much like adding parameters in code before calling a procedure. See the section "Access files" for more information.
[parameter] (trusted-proxies [list-of-strings])When an incoming request is first accepted, the remote-address is initialized to the IP address of the remote peer. When this peer is a reverse proxy in an internal network, that value is not so useful because all requests would seem to come from there.
If you want to have a more meaningful value, you can add the IP addresses of proxies to this list, and X-Forwarded-For entries from these proxies will be stripped, and the first entry just before the most-distant trusted proxy will be used.
Be careful: all IP addresses in this list will be trusted on their word.
Default: () (trust no one)
Besides "static" configuration, Spiffy also has several handlers for when something is to be served.
[parameter] (handle-directory [proc])The handler for directory entries. If the requested URL points to a directory which has no index file, this handler is invoked. It is a procedure of one argument, the path (a string) relative to the webroot. Defaults to a procedure which returns a "403 forbidden".
[parameter] (handle-file [proc])The handler for files. If the requested URL points to a file, this handler is invoked to serve the file. It is a procedure of one argument, the path (a string) relative to the webroot. Defaults to a procedure which sets the content-type and determines a handler based on the file-extension-handlers, or send-static-file if none was found and the method was HEAD or GET (otherwise it replies with 405 "Method Not Allowed").
[parameter] (handle-not-found [proc])The handler for nonexistent files. If the requested URL does not point to an existing file or directory, this procedure is called. It is a procedure of one argument, the path (a string) to the first missing file in the request path. Defaults to a procedure which returns a "404 Not found".
The path path which is passed to the handler is handled in a particular way: It contains all the components that exist, and the final component is the file or directory which does not exist. That means this path may differ from the concatenated URI path; this can be seen as "pathinfo" for the would-be file, if it had existed.
The path should be interpreted as relative to root-path.
Important security note: If you are going to resolve the URI's path in the file system, please remember to check that it doesn't contain slashes in any of the components, as that could be used in a path traversal attack. Alternatively (and possibly even safer), try to ensure that the final path lies under the desired root directory.
[parameter] (handle-exception [proc])The handler for when an exception occurs. This defaults to a procedure that logs the error to the error log. While debugging or developing, it may be more convenient to use a procedure that sends the error back to the client:
(lambda (exn chain)
(send-status 'internal-server-error (build-error-message exn chain))))
[parameter] (handle-access-logging [proc])
The handler for access logging. This is a procedure of zero arguments which should write a line to the access log. Defaults to a procedure which writes a line to access-log which looks like this:
127.0.0.1 [Sun Nov 16 15:16:01 2008] "GET http://localhost:8080/foo?bar HTTP/1.1" 200 "http://localhost:8080/referer" "Links (2.2; NetBSD 5.99.01 macppc; x)"
Runtime information
During the handling of a request, Spiffy adds more information to the environment by parameterizing the following parameters whenever the information becomes available:
[parameter] (current-request [request])An intarweb request-object that defines the current request. Available from the moment the request comes in and is parsed. Contains, among other things, the query parameters and the request-headers, in fully parsed form (as intarweb returns them).
The URI is automatically augmented with the host, scheme and port if it is not an absolute URI.
[parameter] (current-response [response])An intarweb response-object that defines the current response. Available from the same time current-request is available. This keeps getting updated along the way, while the response data is being refined (like when headers are being added).
[parameter] (current-file [path])The path to the requested file (a string). Available from the moment Spiffy determined the requested URL points to a file (just before the handle-file procedure is called). This file is relative to the root-path.
[parameter] (current-pathinfo [path])The trailing path fragments (a list of strings) that were passed in the URL after the requested filename. Available from the moment Spiffy determined the requested URL points to a file (just before the handle-file procedure is called).
[parameter] (remote-address [address])The IP address (a string) of the user-agent performing the current request. See also trusted-proxies.
[parameter] (local-address [address])The IP address (a string) on which the current request came in.
[parameter] (secure-connection? [boolean])#t when the current connection is a secure one (SSL), #f if it isn't (regular HTTP). This pertains only to the direct connection itself, so if Spiffy is behind a proxy this will be #f even if the proxy itself is connected to the client over SSL.
One way to get around this is to always add a custom header to your reverse proxy's configuration file. Then you can read this out in Spiffy and set secure-connection? to #t or #f, as well as updating the request URI's scheme. There is no standardized header for this, so the default Spiffy won't do this.
An easier way around this is to set up two spiffies listening on different ports and configure one to have secure-connection? set to #t, which you redirect incoming HTTPS requests to.
This parameter may disappear or change in the future, when there are more smart people using Spiffy who know how to deal with this or the Spiffy maintainer has a moment of clarity and decides how to do this cleanly.
Virtual hosts
Spiffy has support for virtual hosting, using the HTTP/1.1 Host header. This allows you to use one Spiffy instance running on one IP address/port number to serve multiple webpages, as determined by the hostname that was requested.
The virtual host is defined by a procedure, which can set arbitrary parameters on-the-fly. It is passed a continuation thunk, which it should explicitly call if it wants the processing to continue. The most used parameter in virtual host setups is the root-path parameter, so that another docroot can be selected based on the requested hostname, showing different websites for different hosts:
(vhost-map `(("foo\\.bar\\.com" .
,(lambda (continue)
;; Requires the spiffy-dynamic-handlers egg...
(parameterize ((file-extension-handlers
`(("ssp" . ,ssp-handler) ("ws" . ,web-scheme-handler)))
(root-path "/var/www/domains/foo.bar.com"))
(,(glob->regexp "*.domain.com") .
,(lambda (continue)
;; Requires the spiffy-cgi-handlers egg...
(parameterize ((file-extension-handlers
`(("php" . ,(cgi-handler* "/usr/pkg/libexec/cgi-bin/php"))))
;; You can also change PHP's arg_separator.input
;; to be ";&" instead of this parameter
(form-urlencoded-separator "&")
(root-path "/var/www/domains/domain.com"))
In this example, if a client accesses foo.bar.com/mumble/blah.html, the file /var/www/domains/foo.bar.com/mumble/blah.html will be served. Any files ending in .ssp or .ws will be served by the corresponding file type handler. If there's any PHP file, its source will simply be displayed. In case of my.domain.com/something/bar.html, the file /var/www/domains/domain.com/something/bar.html will be served. If there's a .ssp or .ws file there, it will not be interpreted. Its source will be displayed instead. A .php file, on the other hand, will be passed via CGI to the program /usr/pkg/libexec/cgi-bin/php.
Domain names are mapped to a lambda that can set up any parameters it wants to override from the defaults. The host names are matched using irregex-match. If the host name is not yet a regexp, it will be converted to a case-insensitive regexp.
Important security note: If you are going to resolve the URI's path in the file system, please remember to check that it doesn't contain slashes in any of the components, as that could be used in a path traversal attack. Alternatively (and possibly even safer), try to ensure that the final path lies under the desired root directory.
Access files
Fine-grained access-control can be implemented by using so-called access files. When a request for a specific file is made and a file with the name given in the access-file parameter exists in any directory between the root-path of that vhost and the directory in which the file resides, then the access file is loaded as an s-expression containing a function and is evaluated with a single argument, the function that should be called to continue processing the request.
This works just like vhosting. The function that gets called can call parameterize to set additional constraints on the code that handles deeper directories.
For example, if we evaluate (access-file ".access") before starting the server, and we put the following code in a file named .access into the root-directory, then all accesses to any file in the root-directory or any subdirectory will be denied unless the request comes from localhost:
(lambda (continue)
(if (string=? (remote-address) "127.0.0.1")
(send-status 'forbidden "Sorry, you're not allowed here")))
If we only want to deny access to files that start with an X, put this in the .access file:
(lambda (continue)
(let ((old-handler (handle-file)))
(parameterize ((handle-file
(lambda (path)
(if (not (string-prefix? "X" (pathname-file path)))
(send-status 'forbidden "No X-files allowed!")
(old-handler path)))))
Of course, access files can be used for much more than just access checks. One can put anything in them that could be put in vhost configuration or in top-level configuration.
They are very useful for making deployable web applications, so you can just drop a directory on your server which has its own configuration embedded in an access file in the root directory of the application, without having to edit the server's main configuration files.
Warning: Be very careful when using this. The full Scheme language is available from access files. That means that a small mistake in your web application's file permissions might result in a complete breach of your server's security. This feature will be removed in a future version, because it is much too dangerous.
Procedures and macros
The following procedures and macros can be used in dynamic web programs, or dynamic server configuration:
[procedure] (with-headers new-headers thunk)Call thunk with the header list new-headers. This parameterizes the current response to contain the new headers. The existing headers are extended with new-headers through intarweb's headers procedure.
[procedure] (write-logged-response)This procedure simply writes current-response after calling handle-access-logging. Responses should always go through this procedure instead of directly using write-response from intarweb.
If you have a response body to write, you still need to remember to call finish-response-body (from intarweb) after doing so.
[procedure] (log-to log format . rest)Write a printf-style format string to the specified log (one of access-log, error-log or debug-log). format is a printf-style format string, and rest arguments should match the arguments one would pass to printf. A newline is appended to the end of the log message automatically.
[procedure] (send-response #!key status code reason body headers)Easy way to send string data to the client, with additional headers. It will add appropriate headers and will automatically detect HEAD requests. If BODY is #f, no body is sent and the content-length header is set to zero.
The status is a symbol describing the response status, which is looked up in intarweb's http-status-code parameter. If code and/or reason are supplied, these take precedence. If status and code are missing, the default status is ok.
[procedure] (send-status code reason [message])[procedure] (send-status status [message])
Easy way to send a page and a status code to the client. The optional message is a string containing HTML to add in the body of the response. Some structure will be added around the message, so message should only be the actual message you want to send.
This can be called either with a numeric code, string reason and optional message or with a symbolic status and optional message.
(send-status 404 "Not found" "Sorry, page not found! Please try <a href='/search.ws'>our search page</a>") ;; Alternative way of doing this: (send-status 'not-found "Sorry, page not found! Please try <a href='/search.ws'>our search page</a>")[procedure] (send-static-file filename)
Send a file to the client. This sets the content-length header and tries to send the file as quickly as possible to the client. The filename is interpreted relative to root-path.
[procedure] (file-extension->mime-type EXT)Looks up the file extension EXT (without a leading dot) in mime-type-map, or uses default-mime-type when the extension can't be found.
If EXT is #f, it'll look up the extension that is the empty string.
This returns a symbol which indicates the mime-type which is matched to the extension (for example text/html).
[procedure] (restart-request request)Restart the entire request-handling starting at the point where the request was just parsed. The argument is the new request to use. Be careful, this makes it very easy to introduce unwanted endless loops!
[procedure] (htmlize string) => stringEncode "special" html symbols like tag and attribute characters so they will not be interpreted by the browser.
[procedure] (build-error-message exn chain [raw-output])Build an error message for the exception exn, with call chain chain. Defaults to HTML output, unless raw-output is given and nonfalse.
This section will describe what the various modules that come with Spiffy are and how they work.
This was moved to the spiffy-dynamic-handlers egg.
This was moved to the spiffy-dynamic-handlers egg.
This was moved to the spiffy-cgi-handlers egg.
In order to get directory listings, you can use simple-directory-handler. Just parameterize handle-directory's value with the simple-directory-handler procedure and you're set.
This directory handler truly is very simple and limited in what you can customize. For a more flexible directory handler, see the spiffy-directory-listing egg.
The simple directory handler has a few configuration options:
[procedure] (simple-directory-dotfiles? [dotfiles?])Determines if dotfiles should show up in the directory listings. Default: #f
[procedure] (simple-directory-display-file [displayer])A lambda that accepts three arguments: the remote filename, the local filename and a boolean that says if the file is a directory. This lambda should output a table row with the desired information. Defaults to a lambda that prints the name, size and date when the file was last modified.
The simple-directory handler adds only one procedure to the environment:
[procedure] (simple-directory-handler pathname)The handler itself, which should be used in the handle-directory parameter.
Quick config for serving up a docroot
Spiffy is very easy to use for simple cases:
(use spiffy) (server-port 80) (root-path "/var/www") ;; When dropping privileges, switch to this user (spiffy-user "httpd") (spiffy-group "httpd") (start-server)
One could also use parameterize (according to taste):
(use spiffy) (parameterize ((server-port 80) (spiffy-user "httpd") (spiffy-group "httpd") (root-path "/var/www")) (start-server))
If you put this in /usr/local/libexec/spiffy.scm you can use this example init.d script or these example systemd scripts as-is, to launch Spiffy.
A simple dynamic web page example
If you would like to dynamically serve content, you can use a custom handler in the vhost-map for the host on which you want to serve this content:
(use spiffy intarweb uri-common) (define (handle-greeting continue) (let* ((uri (request-uri (current-request)))) (if (equal? (uri-path uri) '(/ "greeting")) (send-response status: 'ok body: "<h1>Hello!</h1>") (continue)))) (vhost-map `(("localhost" . ,handle-greeting))) (start-server)
It's not advised to use string concatenation for building HTML, as it is rather unsafe and easy to get wrong. For a slightly larger example, see this demonstration of Spiffy with SXML.
Network tweaks
Spiffy does not activate Chicken's TCP buffering, which results in extra traffic: one packet sent per header line. With a TCP buffer size greater than the total header length, all headers will be coalesced into a single write; generally the response body will be coalesced as well. For example:
(tcp-buffer-size 2048) ; from unit tcp (start-server)
Redirecting to another domain
When you have a domain you want to canonicalize so that it will always have www in front of it, you can set up a conditional redirect in your vhosts section:
(use spiffy intarweb uri-common) (vhost-map `(("example.com" . ,(lambda (continue) (let* ((old-u (request-uri (current-request))) (new-u (update-uri old-u host: "www.example.com"))) (with-headers `((location ,new-u)) (lambda () (send-status 'moved-permanently)))))) ("www.example.com" . ,(lambda (continue) (continue))))) (start-server)
Alternatively the following version can be used to generate appropriate handlers for several domains:
(use spiffy intarweb uri-common) ; Generates a handler that can be used in vhost-map that will cause all requests to that URL to be rewritten to the domain specified in 'to'. (define (canonicalise-domain to) (let ((to (uri-reference to))) (assert (equal? '(/ "") (uri-path to))) (assert (null? (uri-query to))) ; We don't see fragments on the server and choose not to care about usernames and password fields. (lambda (continue) (let* ((old-u (request-uri (current-request))) (new-u (update-uri old-u scheme: (or (uri-scheme to) (uri-scheme old-u)) port: (or (uri-port to) (uri-port old-u)) host: (or (uri-host to) (uri-host old-u))))) (with-headers `((location ,new-u)) (lambda () (send-status 'moved-permanently))))))) (vhost-map `(("example.com" . ,(canonicalise-domain "http://www.example.com")) ("www.example.com" . ,(lambda (continue) (continue)))))
The above code hooks a handler for the regular expression "example.com", checks the request's URI and then updates only the host component, keeping all other components (like port and path) intact. Then it sends a simple status response that indicates a 301 "Moved Permanently" response, using the new URI in the Location: header.
The second entry just tells Spiffy to continue serving the request when it's made to www.example.com. A request on any other host will receive a 404 not found response due to not having a vhost entry. More elaborate setups can parameterize some other aspects for each host before calling continue.
- 5.4.2: Use proper 2-element vectors for date and last-modified headers, for compatibility with intarwebs newer than 1.6.1.
- 5.4.1: Once again allow backslashes in paths on UNIX-like platforms in CHICKENs where make-pathname was fixed. Improve request handling performance. Remove over-reliance on undocumented alist-ref comparison procedure's argument order (which will be changed in CHICKEN 4.11).
- 5.4: Fix critical security vulnerability (path traversal, CVE-2015-8235) by disallowing backslashes in request paths (thanks to Benedikt Rosenau for reporting the vulnerability). Use spiffy in the gensym'ed name of spiffy's threads, for easier debugging. Thanks to Evan Hanson.
- 5.3.2 Fix tests so they still function correctly when SPIFFY_TEST_PORT is overridden. Thanks to Kon Lovett for pointing this out.
- 5.3.1 Don't try to handle another request when the input or output ports are closed (thanks to Thomas Hintz. This makes websocket support work properly!)
- 5.3 Improved presentation and correctness of HTML in simple-directory-handler (thanks to Roel van der Hoorn). Fixed serving of static files on Windows due to missing #:binary option (thanks to "Jubjub").
- 5.2.1 Handle disconnections more gracefully (as per intarweb 1.2), and improved debugging some more..
- 5.2 Log prematurely broken connections to the debug-log, to aid in... debugging (thanks to Andy Bennett). Fix locking bug in tests, and disable the "unreadable file is 403" check when run as root.
- 5.1 Fix static file handling of files which cannot be read by Spiffy (thanks to Andy Bennett). Use intarweb's new finish-response-body procedure where needed. Add image/svg+xml to the default mime-type lists.
- 5.0 Work around race conditions in simple-directory-handler related to deleted files or self-referential symlinks (reported by Mario). Move deprecated dynamic content handlers into separate spiffy-dynamic-handlers egg. Move cgi handler into separate spiffy-cgi-handlers egg.
- 4.15 Disallow non-GET/HEAD requests for normal files in handle-file. Remove dependencies on matchable and regex eggs. Allow request-uri overrides in user lambdas to affect the default handler (Thanks to Mario).
- 4.14 Fix ssp-handler's pathname construction so it doesn't error on files in the rootdirectory. Fix incompatibility with version 1.6.1 of the OpenSSL egg [Thanks to Mario and Thomas.]
- 4.13 Add trusted-proxies parameter so remote-address can have a meaningful value in the presence of reverse proxies [thanks to John J Foerch]. Allow cgi scripts to be outside the docroot. Pass on query-strings to CGI scripts as-is, if possible, to avoid breaking scripts that rely on a particular variable-separator (reported by Felix Winkelmann). Refactor to use symbolic response codes from Intarweb.
- 4.12 Make Spiffy optionally fully independent of Unit tcp [thanks to Jim Ursetto] Tests now also work with Chickens greater than 4.6.0 (removed deprecated getenv calls)
- 4.11 Drop openssl requirement (suggested by Felix Winkelmann); split up listening and accept loop invocation to allow loading code after dropping root privileges (suggested by Mario Goulart).
- 4.10 Fix serious bug which caused Spiffy to exit after handling N requests. Fix handling of empty path components now that uri-generic preserves them.
- 4.9 Export file-extension->mime-type. Add more info about exceptional situations to the debugging logs when enabled.
- 4.8 Fix ssl support. Get rid of spiffy-root-uri. Add timestamp and request info to error log.
- 4.7 Fix redirects for directories again (thanks to Mario). NO TESTCASE (possibly to be fixed in uri-generic)
- 4.6 Fix redirects for directories with special URI characters in them (thanks to Felix)
- 4.5 Add send-response procedure; flush output after request is handled; use proper IANA-assigned MIME types in default mime-type-map; fix server-root-uri when spiffy is behind a proxy [thanks to zbigniew]
- 4.4 Fix a problem with 304 "not modified", for which Safari incorrectly tries to read a content-body when a content-length is present.
- 4.3 Fix crash with extensionless files and nonempty extension handlers
- 4.2 Add support for caching headers and proper If-Modified-Since support
- 4.1 Make cgi-handler cope with missing pathinfo. Fix statuscode related crash in cgi-handler. Make ssp handler's open/close tags parameters, so it actually matches what the documentation says. Add ssp-cache-dir. Update for latest intarweb changes (0.2)
- 4.0 Rewrite from scratch, using Intarweb
- pre-4.0 See the changelog for the old spiffy
Copyright (c) 2005-2017, Felix L. Winkelmann and Peter Bex All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


text:
Get a quick FREE car finance check that WON'T affect your credit scoreQuick check
Abarth Car Finance 500C CONVERTIBLE
View car details- Fast, no obligation quote today
- We compare the UK market
- Get approval with the best APR rates available to you
- Please login/register to use advanced features
Used Abarth 500c Convertible Finance Application
Use the calculator below to see how little Abarth 500c Convertible finance could cost you! You could be driving your new car away today!
Estimated monthly payment with £500 deposit.
Representative example of credit
Getcarfinancehere.com is a broker not a lender
Borrowing £5,000
over 5 Years
with a representative APR of 13.2%
and a deposit of £500, the amount payable
would be £102.85 per month,
with a total cost of credit of £1671.01
and a total amount payable of £6171.01.
An absolute classic model, the Abarth 500c Convertible retains all of its original charm to this date, its unique shape largely accounting for the model's boundless external appeal. If the Abarth 500c Convertible is your dream car, Get Car Finance Here can help you achieve your dream with our offering of affordable Abarth 500c Convertible car finance deals for no initial deposit. Even those with a bad credit history can claim affordable car finance deals with us, and drive away in an Abarth 500c Convertible today!
Fill in your details on the form provided below to learn what sort of affordable Abarth 500c Convertible car finance deal you could obtain through Get Car Finance Here.
Other Available Abarth Models
Not found what you are looking for? Take a look at the complete range of Abarth Car Finance cars available.