text:
- New Arrivals
- Household Helpers
- Organizers
- Gift Directory
- Kitchen
- Health & Beauty
- Lawn & Garden
- Pets
- As Seen on TV
- Sale & Clearance
- More Ways to Shop
- Web Only
- Looking Great! Mini-Site
- Bed & Bath
- Apparel
- Entertainment
- Home Décor
- Weekly Specials
CORN SILK REMOVER CLEANS CORN COBS WITHOUT DAMAGING KERNELS! Fine nylon bristles at the center of this circular brush gather every clingy string and strand with an easy sweep. Lightweight, compact unit with easy-grip handle lets you clean dozens of ears without fatigue. 3-7/8" diam.
Forgot your password?
Try our Password Recovery Page.
Welcome to Harriet Carter - Distinctive Gifts Since 1958. Find a large selection of products for organizing your life. As seen on TV products, household gadgets and problem solvers, unique gifts and gift ideas. Buying online is the fastest and most convenient way to shop! We have created this Web site just for you. Everything on HarrietCarter.com is arranged by product category for quick, easy selection. In addition to our selection of gift ideas, you'll find products for organizing, As Seen On TV items, New Arrivals, Web Exclusive Gifts, Household Gadgets and products for your Pets.
Copyright 2014 Harriet Carter Gifts, Inc.
All Rights Reserved.
Harriet Carter
We are now accepting PayPal as a form of payment. For those of you unfamiliar with PayPal, it is a Web-based service that enables you to pay an online merchant without revealing your financial information. We've added this payment option to better meet your expressed needs for confidence, control, convenience and choice in your payment methods.
Learn more about PayPal and decide if you would like to set up a PayPal account.
Thanks for visiting our Web site - come back soon!


text:
AvoDerm (10)
Blue Basics (8)
Blue Buffalo (33)
Blue Freedom (2)
Blue Life Protection (11)
Blue Longevity (2)
Blue Wilderness (10)
Canidae (9)
Canidae Pure (3)
Castor & Pollux (6)
Halo (9)
Hill's Ideal Balance (10)
Merrick (16)
Natural Balance (16)
Nature's Recipe (8)
Nature's Variety (18)
Organix (3)
Solid Gold (4)
Soulistic (3)
Spa Select (1)
Ultramix (3)
Wellness (22)
Canned Food (68)
Dehydrated Food (2)
Dry Food (87)
Food Pouches (9)
Frozen Food (4)
Raw Food (9)
Indoor (28)
Sensitive Stomach (12)
Skin & Coat (2)
Weight Management (16)
There is no doubt that you want to give your cats the very best care by providing them with the proper nutrition they need for maximum health and longevity. As organic and natural cat food offers your precious kitties an assortment of health and nutritional benefits, they also contain wholesome, high-protein food sources that cats find irresistible. Whether you're looking for canned or dry all natural cat food, there are so many flavors and formulas available that you are bound to find the type of food that will work best for your cat. Natural cat food is highly recommended because it lacks artificial ingredients, synthetic chemicals, or preservatives, which makes it easier to digest opposed to other types of foods that contain artificial fillers and preservatives. As a popular type of natural food, Natural Balance cat food has been around for over 20 years and is widely respected by various animal professionals, ranging from veterinarians, animal trainers and breeders. Whether you choose Natural Balance cat food or a different type of natural food, give your precious kitties the well-balanced nutrition that they deserve with an all natural cat food.

subset: commoncrawl


text:
2014 Annual
Hibbing, MN, May 15 & 16, 2014
How to become a Member
Board of Directors
Future and past meeting locations
The Constitution of the Institute
Student Research Fund
Goldich Medal Guidelines and Award Winners
The Homer Award
Eisenbrey student travel award guidelines
and application
Student paper awards
Publications of the Institute
Career opportunities
and journal articles on Lake Superior Geology
The Slate Islands
About the Institute
The Institute on Lake Superior Geology is
a non-profit professional society with the objectives of
providing a forum for exchange of geological ideas and scientific
data and promoting better understanding of the geology of
the Lake Superior region. The major activity of the Institute
is an Annual Meeting with geological field
trips and technical presentations.
What's new
New! The 2014 meeting will be held in Hibbing, MN on May 15 and 16, 2014
Update to the Mineralogy of Michigan just published
ILSG Publications now available online
ILSG Student Research Fund
Reports of Annual Meetings
2011 Annual Meeting - Ashland, Wisconsin
2010 Annual Meeting - International Falls, Minnesota
2009 Annual Meeting - Ely, Minnesota
2008 Annual Meeting - Marquette, Michigan
Comments to firstname.lastname@example.com


text:
We truly are the CENTER of our community...
The JCC offers state-of the-art fitness centers, a 4-star rated Nursery School, popular summer camps, classes and sports leagues for all ages, teen programs, senior exercise and recreational opportunities, an Alzheimer's respite program, Jewish enrichment, community cultural events, and so much more -- all while striving to promote and ensure the strength and well-being of our Jewish community.
Upcoming Events
May 12, 2014
11:45 am - 1:30 pm
May 12, 2014
5:15 pm - 7:00 pm
June 2, 2014
11:45 am - 1:30 pm
General Information
General Information
Our Community...
- Values Jewish culture, practice and thought, and serves as an educational resource for JCC members and for all New Orleanians with an interest in Judaism.
- Knows that comfortable, clean and conveniently located facilities set the tone for everything we do at the JCC.
- Embraces health and wellness, and JCC Fitness Centers are committed to helping members achieve positive lifestyle changes.
- Embraces children through education, sports and family activities.
- Celebrates the joys of childhood and encourages the independence of youth.
- Values lifelong learning, encourages friendship among adults of all ages and extends special assistance to elders.


text:
It's solid. My favorite part is that when you are done with a page, the next page loads under it.
But I would like to see smilies and have the last post button work. I like the effor though. Nice work
It's solid. My favorite part is that when you are done with a page, the next page loads under it.
But I would like to see smilies and have the last post button work. I like the effor though. Nice work
|Sponsored Links
Couple of teams that may or may not been mentioned:
1- Emoticons are shown if you click a certain post and read it individually. In the thread page they don't come up
2- the app doesn't go sideways when you turn the phone
Yeah I think the most pressing needs are a "last unread post" and the ability to bookmark forums.
Andy's List of Secrets
not that impressed, a little slow
|Sponsored Links
Just downloaded and its nice. I wish there was an option to collapse forums that i dont want to see like the real site (i want to collapse the nba forum because i have no desire to view it). Also, id like to have a "whose online". Lastly, there is no bold when it comes to what page of a thread im viewing. Its like i have to remember what page im on. Nothing major but probably an easy fix.
Overall though, i like it a lot.
Looks good.
Is there a way to hide specific forums/sports that we do not intend to post in? I never post in the NBA forum and do not want to have it shown to safe time. On the web version it is very simple, just click on the two arrows pointing up to hide that sport. But on the app it does not appear to be possible.
Member of the Owlluminati!
This is definitely a step in the right direction but the using your phones browser is much more efficient.
GJO- You will never be forgotten. "MORE THAN MINFINITY"!
Holy crap, I didnt even know you can collapse those forums. Goodbye NBA!
Andy's List of Secrets
Is it possible to send vm's from the app?
Hey guests! Some sincere advise: don't sign up for ProSportsDaily. You can do better.
|Sponsored Links


text:
Disclaimer: This scientific independent research is provided by Aisle7 and is for informational use only. GNC provides this information as a service but does not endorse it. Likewise, Aisle7 does not recommend or endorse any specific products.I accept these terms
Wet Platinum® Premium Lubricant, Silicone Based8.9 oz.
Price: $21.99
$3.99 Flat Rate Shipping! Details
AVAILABILITY: In stock, Ships in 1-2 full bus. days. Details
- Description
(Product received may temporarily differ from image shown due to packaging update. Image and product details will be revised, shortly)
Must be 18 years of age or older to purchase.
Stays Wet Longer™
- Doctor Recommended
- Stays Slick Under Water
- Guaranteed Never Sticky
Wet Platinum® Premium Body Glide is Extra Concentrated making it longer lasting, with less need for reapplications. Wet Platinum® is guaranteed to never become sticky and feels silky smooth. Great for moisturizing body massage and skin conditioning. Also revitalizes dry leather and latex clothing. Will not harm those materials. Wet® products are doctor recommended for enhancing your most intimate moments.
We cannot accept returns due to the nature of the product.
If irritation or discomfort occurs discontinue use immediately. Do not use if tamper evident seal is removed or broken. Keep out of eyes and ears. Keep out of reach of children. Store at controlled room temperature 59 to 86F (15 to 30C). Very slippery, Clean spills immediately. This product may stain some fabric. Test a small area before use. For cosmetic use only. Do not use near an open flame. Once opened, bottle may leak if not stored upright. Do not use with other silicone products.
* These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.
- Supplement Facts
Apply as needed to the area of the body you wish to moisturize. Reapply as desired. Easily washes away with soap and use immediately.
Warning: Due to the nature of this product we cannot accept returns for this item. All sales are final. We apologize for any inconvenience this may cause.
This product will be fulfilled by our trusted commerce partner drugstore.com. This item will be shipped to you separately at no additional cost to you.
- Health Notes
Visit the Live Well Health Center
We currently do not have articles matching this product.
To browse our library of health and nutrition-related news and articles-, please visit our Live Well Health Center.
Copyright 2013 Aisle7. All rights reserved. Aisle7.com
Learn more about Aisle7, the company.
Learn more about the authors of Aisle7 products.
Information expires June 2014.
- Ratings and Reviews
REVIEW SNAPSHOT®by PowerReviews
- Complicated to use (3)
Best Uses
Reviewed by 3 customers
Sort by
- Smells Great
- Complicated To Use
Best Uses
- Men
- On-the-go
- Weekly Use
- Women
Comments about DRUGSTORE Wet Platinum® Premium Lubricant, Silicone Based:
It Was too Slippery it kept falling out of the BUNG HOLE!( IF you Know what i saying)
- My Beauty Routine Takes:
- 30 Minutes
- Effective
- Good Value
- Lightweight
- Complicated To Use
Best Uses
- Daily Use
Comments about DRUGSTORE Wet Platinum® Premium Lubricant, Silicone Based:
While the lube works great, the "new, updated" bottle is difficult to use. But still a good deal for the price!
- Effective
- Good Value
- Complicated To Use
- Poor packaging
Best Uses
Comments about DRUGSTORE Wet Platinum® Premium Lubricant, Silicone Based:
This new container is really difficult to open!! It has an attached, solid black plastic lid that requires you push down in only one specific area to open the tilting top and release the product. There is no marking where to press to open other than an embossed small label "PRESS", which is flat and can not be felt at all. I am constantly struggling to find where to press to open the darn bottle! The lube is great, but not if you can't get to it.....
- Ask A Question
Astroglide® Glycrin Paraben Free
- Price: $11.99
Sliquid® Silver Silicone Intimate Lubricant
- Price: $25.99
- Price: $11.99


text:
Regarding the ongoing Penn State criminal investigation, the NCAA is actively monitoring developments and assessing appropriate steps moving forward. The NCAA will defer in the immediate term to law enforcement officials since this situation involved alleged crimes. As the facts are established through the justice system, we will determine whether Association bylaws have been violated and act accordingly. To be clear, civil and criminal law will always take precedence over Association rules.
Mark Emmert
President, NCAA


text:
If you want your audience to make a call, your best bet is to dial the number for them. The mConnect text-to-call feature launches a phone call to any number you designate when users respond to your SMS message. Constituents can easily call a local politician, clients can reach an information center, and customers can get directly to the sales department.
Route Calls by Location
Nationwide text blasts can reach a lot of people, but they're not always the best tool for reaching the right people in the right way. What if you want to direct a constituent to her district congressman, or send a consumer to the retail store right in his town?
mConnect can sort incoming calls based on location, and route them straight to the locally targeted numbers you've selected.
Of course, sometimes it makes sense to send everybody to a national number – whether it's a healthcare hotline or the president's office. mConnect can do that, too.
Play Audio Messages
While you're making it easy for people to make a call, why not help them figure out what to say? You have the option of recording a message that will be played as the call is connecting. You can even record multiple messages, which we'll allocate to different groups of callers. The options are endless: remind a political caller of talking points; describe special offers; include a welcome greeting from a celebrity. And it's easy to set up – just upload an mp3 from your computer, or call and record the message from your phone.
Track Every Call
All mConnect phone calls run through the Mobile Commons system, so they can be tracked and analyzed. You can see exactly who's calling, when they called, and how long they stayed on the phone. You can also track where the calls are coming from: a text message broadcast, an email, your web site, or any other source. Call reports happen in real time, so you'll know right away whether people are taking the action you want.
No Texting Necessary!
Create a call to action that's broader than your mobile list. Run a national ad with a call-in phone number, and even those who only have landlines can call in and be routed to their nearest Senator or store.
Build Your SMS List from Callers
Our system checks to see if callers are already members of your mobile list. If they're not, you can customize automatic follow-up messaging to bring them into the fold. Send them an SMS message, asking them to opt in for future news. Or you could ask your callers a survey question, link them to a web page, or just thank them for taking the time to make the call.
Quick and Easy Roll-Out
Because we focus on making our technology easy to use, you can launch your mConnect campaign quickly, to coordinate with any time-sensitive event or breaking news. mConnect ties in easily with your email, web, and mobile campaigns, so you can use it to make the most of your existing networks.
Try It Now
Use our demo to get connected to your Representative, right now. Click here to try the demo.
Additional Benefits
- Support tens of thousands of simultaneous phone calls.
- "Throttle" your text blasts over hours or days to ensure that callers are able to speak with someone – and that they don't get busy signals.
- Initiate calls with text messages or from the web.
- Send a text message as a result of a call being made.


text:
Independent Study (3-6 credit hours)
Students interested in registering for an independent study should contact their advisor approximately one year prior to the desired enrollment date. Your advisor will refer you to a faculty member who is interested in supervising independent study students. Most independent studies involve designing and carrying out a research project under the supervision of a faculty member. Independent studies are only for those students who excel academically and have a vested interest in psychology. An independent study also requires a large investment of time and effort. However, the experience you will gain conducting your own research project is not found in any other class.
Internships (1-6 credit hours)
An internship is supervised work experience in a community agency or hospital. Internships are usually awarded only to those students who are in their Junior or Senior year of study, have an interest in work-related experience, and have a strong academic background. For each credit hour earned, the student is required to work 50 hours in an agency setting. Again, contact your advisor one year ahead of time and inform him/her of your interest in an internship. Your advisor will refer you to the Internship Supervisor, who will work with you to set up a schedule with a participating agency.
Because there are a limited number of independent studies and internships available each year, it is very important that you make your interests known early in your program. Also, because of the limited availability, GPA may be considered to determine a student's placement in these programs.
Both independent studies and internships are available for students on a limited basis. Many graduate programs expect students to have some research background and/or work experience in a related field. Research oriented independent studies and work related internships help students get this experience.
Department Chair Dr. Kim Purdy
Sign-up for ExperimentsSign-up InstructionsEMS Support Email
Contact UsUSC Upstate
Department of Psychology
800 University Way
Spartanburg, SC 29303
Phone: 864-503-5779Faculty & Staff Directory
The University of South Carolina Upstate is accredited by the Southern Association of Colleges and Schools Commission on Colleges to award baccalaureate and masters degrees. Contact the Commission on Colleges at 1866 Southern Lane, Decatur, Georgia, 30033 or call 404-679-4500 for questions about the accreditation of USC Upstate. Comments or Complaints?


text: Try something like GooGone. There are several other similar products, but this one is pretty good at this sort of stuff (mostly natural ingredients). Readily available lots of places and not very expensive. Acetone might work - be careful with the stuff as it is absorbed through your skin, and it smells funky. Use gloves and good ventilation. Something like the Mr Clean Eraser might help getting the last of it up.


text:
ScarletHue: Thanks! I think I've corrected the arm.
So here is the colour WIP. Feedback needed.
I'm not sure how I should go one. Either add some contrasting colour in the shading, but if I do that I feel that I should add a bg. If i don't then it feels kinda flat :/
If you guys have any ideas, fire at will. God knows i could use em.


text:
85 Years 85 Artists Art Exhibition Opens to the Public
By Bayley Blackney Menlo College hosted the 85 Years 85 Artists art show to celebrate its 85th anniversary on March 26. The walls of the Menlo College Administration Building… Read More
Menlo College Earns AACSB Accreditation
Menlo College has earned AACSB accreditation (Association to Advance Collegiate Schools of Business), a distinction earned by less than five percent of the world's business… Read More
Menlo Student Divya Nag - Forbes Pick for 30 under 30
Her name is Divya Nag '14 and she has just been chosen as one of Forbes 30 under 30, top talent–people under age 30 who are not… Read More
Honors Convocation Spring 2014
By Vicky Schultz On Friday, April 4, 2014, Menlo College held the annual Honors Convocation dinner to celebrate students who achieved academic excellence. Students and their families, faculty,… Read More
The Most Prolific Wide Receiver to Ever Play for Menlo, Nate Jackson '01, Returns to Campus
The most prolific wide receiver to ever play for Menlo College, Nate Jackson, returns to campus on Monday, April 28, 2014, addressing Professor Doug Carroll's "Ethics in… Read More
The Oaks Press #7, Spring 2014 Now Online
February 24, 2014: The latest issue of The Oaks Press (#7, February 24 to March 2, 2014) is now available online. In this issue: A Message from the Editor RA Recruitment Career Corner Student Union Info Volunteer Income Tax Assistance (VITA) program Video Contest "Menlo In Me" Bookstore Sale Campus Events Cindy Manko, Peer Counselor, on Gender and Sexuality Tutor Lab, Writing Center, and…
Larry Bensky Visits Menlo to Talk about Barack Obama in the Light of History
February 20, 2014: By Vicky Schultz To commemorate the many transformational presidents the United States has seen, Menlo College welcomed literary and political journalist Larry Bensky on Monday evening to celebrate President's Day. Bensky is well known for his work with Pacifica Radio, a network of radio stations known for its progressive political orientation, and was presented with the George Polk…
VITA Program Returns to Menlo
February 18, 2014: Need to get your taxes done? The VITA program is back! The Menlo College Accounting club is offering its services and providing free income tax return preparation for the Menlo Community through the Volunteer Income Tax Assistance (VITA) program, sponsored by the United Way and the IRS. This program was introduced last year to great success. Through this program, Menlo…
Major Wireless Initiative at Menlo College
February 17, 2014: By Vicky Schultz On Wednesday, February 5 Menlo College's Office of Information Technology (OIT) announced a project to significantly upgrade the college's wireless and networking system. With the help of cutting-edge technology solutions Menlo will be increasing its connection speeds to set a new standard for business schools; Menlo will truly be at the forefront. As a…


text:
World-Herald columnist Tom Shatel sits down with first-year A.D. Shawn Eichorst to discuss his role at the helm of the Husker athletic department.
* * *
Q: Any surprises so far, good or bad?
A: All positive surprises. What our staff has been able to do with the football and volleyball and basketball ticket sales is remarkable. Just really stepped up to the plate. Not surprised, but I am surprised. That's what I expected from the outside looking in, and we're seeing it happen.
Q: As a guy coming in from the outside, is the Nebraska football "brand" what it used to be?
A: I think we have as much presence nationally as anyone. I think that's firmly cemented. I don't think that's ever going away. We played for three conference championships in four years, last time I looked. A lot of people would like to be in that position. We all get the fact that there are high expectations here at Nebraska. But we're not far away.
Q: Get any advice from Tom Osborne that stands out?
A: Coach and I talk quite a bit. He's given me good advice. I think the strongest piece of advice he gave me is be yourself. Lead the way you know how, with respect and integrity, lead with values and be positive. I probably learned more from Coach by watching him, seeing how he conducts himself.
Q: How much do you know about Steve Pederson?
A: I don't know a ton about Steve. I got a chance to spend time with Steve and Tami when we let Pitt into the ACC. We had a good relationship.
Q: Do you know anything about his time here? Do you want to know?
A: Not really. I don't really look back. I just try to stay focused on my own business. There are two sides to every story.
Q: There's a perception already that you won't be a visible A.D. The format of your radio show was changed to include more athlete features and less of you. Is that part of that?
A: I'm doing a column on Huskers.com. What I hope to do with that is what I hope to do on the radio show: give some attention to people who don't normally get it, so our supporters get to know all the things we do. That's what this is all about. Heck, I could talk for an hour. I'd rather our people really get to sample what's happening. These are real people. I know I've got to be out there, and I'm comfortable with that.
|Join the conversation on the Big Red Today Facebook page.
Q: Do you like how the Big Ten divisions were split?
A: Absolutely. Everything runs in cycles. A group, we're better when all of us are striving for championships, and as I sit around the table with my brethren, I see that. The divisions make sense, they make sense for the league, for Nebraska and for the fans. You can run any metrics or optics you want, but competitively they were pretty balanced over the last 20 years. At the end of the day, you've got to go win games.
Q: The student sections I've seen at various Big Ten football stadiums are large and have an impact. What can you do to grow the presence of students at Nebraska football games — and draw them to games in the future with so many distractions out there?
A: I haven't been here enough to know. But that would be a priority, absolutely. We have to strive in that direction. It's hard to manufacture some of that stuff. You just try to do the best you can. What I've seen so far with volleyball and basketball, our students are passionate. They're into it. You have to be progressive.
Q: This is an interesting time for men's basketball. Would you like to help transform that program during your tenure?
A: I think there is a hunger for quality basketball. In my short time here, when I talk to people, they talk about that. When I see the passion we have for other sports, and I see the new arena, I can envision a time when that is the toughest ticket in the state.
Q: You talk about the Nebraska Way. Can that survive in a world of social media and instant gratification, and more pressures and demands with bigger money and playoffs, etc.?
A: I think the Nebraska Way is tried and true. That doesn't mean you get complacent or try and stop time. If you're not living, you're dying. What we need to do is continue to be who we are but also be progressive. We're thinking about our facilities. I'm thinking about the connectivity of our facilities with smartphones and that sort of stuff. How we can improve the fan experience, especially when we know the technology in your hand is so good, and the TVs at home are exceptional. All of our games for the most part are on. To me, there's nothing like the true and genuine live event. We can continue the Nebraska Way and continue unrelenting pursuit of championships, but we're not going to change how we do that. We're not going to cut corners.
Q: Nebraska fans want to win the right way, but some people are getting impatient with Bo Pelini. Is doing it the right way and contending for titles enough, or do you want more?
A: As long as you're doing all those other things (right way) and competing at a high level, in a very visible and competitive business that we're in ... I don't think anyone wants to win more than Bo. And Bo will win some championships. He will win some championships.
— Tom Shatel


text:
Text Edition
Top Stories
Michael Clarke confident of Aussie success
Australia Twenty20 skipper Michael Clarke is confident the Aussies will break their duck in the West Indies and claim their first Twenty20 World Cup title..
After suffering two disappointing tournaments in England and South Africa Clarke is confident that his squad can claim their maiden title in the shortest form of the game.
"It's a huge tournament; our form over the last 12 months has certainly improved and is much better. It's a tournament that we haven't won yet," said Clarke during a pre tournament press conferemce in St Lucia.
"I don't think it's any extra pressure than captaining any other form of the game. If I think a call needs to be made, I need to have the confidence to make that decision. If it doesn't pay off, well it doesn't pay off," he added
"With the talent that we have in our squad I'm very confident. My job will be made a lot easier by how good the players are around me. We have a lot of matchwinners with bat and ball."
"Davie Warner or Shaun Tait, both have so much talent in this form of the game."
Because of their struggles in the shortest format of the game and their failiure to qualify for the Super Eight stage of last years tournament in England the Aussies are ranked outside of the top eight teams.
"I don't think it bothers us too much. I heard we were ranked ninth or something the other day and now in the media we're favourites for the tournament. How quickly things change in a couple of days when we've played no cricket," said Clarke.
"For us it's about making sure we prepare really leading up to Sunday's game, make sure we come out here and play to our potential. That's the one thing we haven't done in our previous world championships for Twenty20," he added.
Australia gets their preparations for the tournament under way in St Lucia tomorrow with a warm up game against Zimbabwe.
"We need to use both practice games to build momentum but also to give guys who haven't played in the IPL a chance to get some cricket under their belt," Clarke said.
source - cricket20.com
Text Edition Home
Champions League Cricket
Twenty20 World Cup


text:
RavenDB Conf Videos: Diving into Voron
This low level talk is all about Voron, how it actually works, the design decisions that we had to do, the things that didn't work…
RavenDB Conf Videos: Introduction to document database modeling with RavenDB
We recorded the recent RavenDB conference, and we are starting to make them available now. The first to show up is Mauro Servienti's intro talk to RavenDB.
Corax: The problem of space
Corax is a research project that we have, to see how we can build a full text search library on top of Voron. Along the way, we take the chance to find out how Lucene does things, and what we can do better. Pretty much from the get go, Corax is likely to use more disk space than Lucene, probably significantly so. I would be happy if we could get a merely 50% increase over Lucene
The reason that this is the case is that Lucene goes to great length to save disk space. From storing all integers in variable length format, to prefix compression to implicitly referencing data in other files. For example, you can see that when you try reading term positions:
TermPositions are ordered by term (the term is implicit, from the .tis file).
Positions entries are ordered by increasing document number (the document number is implicit from the .frq file).
The downside of saving every little bit is that it is a lot more complex to read the data, requiring multiple caches and complex code path to actually get it properly. It make a lot of sense, when Lucene was created, disk space was at a premium. I won't go as far as to say that disk space doesn't matter, but given a trade off of using more disk space vs. using more memory / complexity, it is much easier to justify disk space usage today*.
* The caveat here is that you need to be careful, because just accessing the disk can be very slow.
One of the major things that we wanted to deal with Corax is reducing index corruption issues, and seeing if we can simplify things into a transactional system. As a side effect of that, we don't need to have index segments, and we don't need to do merges to free disk space. The problem is that in order to handle this, we need to make track additional information that Lucene doesn't need to.
Let us look at the actual data we keep. Here is a very simple index:
using (var fullTextIndex = new FullTextIndex(StorageEnvironmentOptions.CreateMemoryOnly(), new DefaultAnalyzer()))
using (var indexer = fullTextIndex.CreateIndexer())
indexer.AddField("Name", "Oren Eini");
indexer.AddField("Name", "Arava Eini");
For each field, we are going to create a multi tree. And for each unique term in the field we have a list of (Index Entry Id, term frequency, boost).
- @fld_Name
- arava
- { 2, 1, 1.0 } (index id 2, freq 1, boost 1.0)
- eini
- { 1,1,1.0 }
- { 2,1,1.0 }
- oren
- { 1,1,1 }
- @fld_Email
- email@example.com
- { 2,1,1.0 }
- email@example.com
- { 1,1,1.0 }
This is pretty much the equivalent to the way Lucene store things. Possible space optimizations here include not storing default values (term frex or boost of 1), storing index entry ids as variable ints, etc.
The problem is that while this is actually enough for the way Lucene does things, it is not enough for the way Corax does things. Let us consider the case of deleting a document. How would you go about doing this using the information above?
Lucene does this by marking a document id as deleted, and will purge its details on the next segments merge. That works, but only because a segment merge actually read & write all of the relevant segments data. Without a segments merge, deleting a document is actually something that would require us to scan all the data in the entire database. This is not really practical. Therefor, we need to store additional data so we can delete it later on. In this case, we have the Docs tree, which has keys for (index entry id, field id and term num). This looks like this:
- Docs
- [1,1,1]: oren
- [1,1,2]: eini
- [1,2,1]: firstname.lastname@example.com
- [2,1,1]: arava
- [2,1,2]: eini
- [2,2,1]: firstname.lastname@example.com
Using this information, we can now remove all traces of a document when it is deleted. However, the problem here is that we need to also keep the terms per document in the index. That really blow up the index size, obviously.
The reason for this peculiar way of storing the document fields in this manner is that we also want to reuse this information for sorting. When Lucene needs to sort data, it has to read all of the data from the fields, then recreate the values for all relevant documents. Corax can just serve the data already there.
A pretty obvious step to save space would be to track the terms separately, and use an id in the Docs tree, not the full term. That leads to an interesting problem, because we are going to need to be able to go from term –> id and id –> term, which pretty much require storing them twice, unfortunately.
Final note, Corax is a research project.
Success: From Opening a Champagne Bottle To Hiding Under the Bed with Said Bottle
During the RavenDB courses* in the past few weeks, I was talking with one of the attendees and I came up with what I think is a great analogy.
* Yes, courses, in the past 4 weeks, I've given the RavenDB course 3 times. That probably explains why I don't remember which course it was.
What are your success metrics? From Opening a Champagne Bottle To Hiding Under the Bed with Said Bottle?
The first success metric is when you have enough users (and, presumably, revenue) to cross the threshold to the Big Boys League. Let us call this the 25,000 users range. That is the moment when you throw a party, go to the store and grab a whole case of champagne bottles and make fancy speeches. Of course, the problem with success is that you can have too much of it. A system that does just fine (maybe creeks a little ) on a 25,000 users is going to behave pretty differently when you have 100,000 users. That is the moment when you find your engineers under the bed, with a half empty bottle of champagne and muttering things about Out Of Capacity errors and refusing to come out until we fire all the users.
In just about any system, you need to define the success points. Because Twitter was very luck that it managed to grow even though it had so many problems when its user base exploded. It is far more likely that users will figure out that your service is… well, your engineers are drunk and hiding under the bed, so the service looks accordingly.
And yes, you can try to talk to people about SLA, and metrics and capacities. But I have found that an image like that tend to give you a lot more focused answers. Even if a lot of the time the answer is "I don't know". That is a place to start, because this make it a lot more acute than just "how many req/sec do we need to support?".
The nice thing about working in a large team…
There are a lot of stuff that are hard to do when you are working on a large team. But the really nice thing is the velocity in which you can move.
I just started the morning with the following commands:
And I have another PR pending for a different branch that I'm going to have to look at. Overall, I think that this is a pretty cool thing to have. We can push forward in many direction at once, and it can be pretty awesome to look at all the good thins that are coming our way.
Optimizing Voron and the cost of Multi Trees
One of the nice features that Voron got from LMDB is the notion of multi trees. If I recall correctly, LMDB calls them duplicate items, or something like that. Basically, it is the ability to store multiple values for a single key.
Update: The behavior described in this post has been in LMDB for the over 3 years. It is just something that Voron didn't have. Please note that this post discuss the Voron's limitation and its solution, not LMDB, which has had the solution for a long time.
Those items are actually stored as a nested tree, which effectively gives us a great way to handle duplicates. From an API standpoint, this looks like this:
// store tree.MultiAdd(tx, "Eini", "users/1"); tree.MultiAdd(tx, "Eini", "users/3"); tree.MultiAdd(tx, "Eini", "users/5");//read using(var it = tree.MultiRead(tx, "Eini")) { if(it.Seek(Slice.BeforeAllKeys) == false) yield break; do { yield return it.CurrentKey; // "users/1", "users/3", "users/5" }while(it.MoveNext()); }
Internally, we handle this in the following fashion:
- If a multi add operation is the very first such operation, we'll add it as a simple key/value pair in the tree.
- If a multi add operation is the 2nd such operation, we'll create a new tree, and add both operations to the new tree. The original tree will have the key/nested tree reference stored.
That lead to a very easy to use API, which is quite useful in many cases. However, it also have space usage implication. In particular, a tree means that we have to allocate at least one page to it. And that means that we have to allocate 4KB to hold any multi tree with more than a single value. Since there are actually a lot of scenarios where we would want to store a small number of small values, that can often lead to a lot of waste on our part. We use 4KB to store data that we could have stored in just 64 bytes, for example. That means that when we want to actually store things that might be duplicated, we actually need to consider the taken space consideration as well.
I think that this is a pretty bad idea, because it leads us to do things with composite keys under some scenarios. That is something that Voron should be able to just handle for me. So we changed that, in fact, what we did was changed the way we approach multi trees in general. Now, for every multi value, we can store up to 1KB of items in the same page as the key, before we devolve into a full blown multi tree.
The idea is that we can use the same Page mechanism we use elsewhere, and just have a nested page inside the parent page. As long as the nested page is small enough, we can just store it embedded. That result in some nice space saving. Since usually we have items in the following counts: zero, one, few, lots.
We need this to help with Corax, and in general, that would reduce the amount of space we need to use in many cases.
The Corax Experiment: API
I posted before about design practice for how I would approach building a search engine library. I decided to bite the bullet and actually try to do this. Using Voron, that turned out to be a really simple thing to do. Of course, this doesn't do a tenth of what Lucene does, but it actually does quite a lot. The code is available here, and I want to emphasize again, this is purely experimental / research project.
The entire thing comes to less than 500 lines of code. And it is pretty functional even at this stage.
Corax is composed of:
- Analysis
- Indexing
- Querying
Analysis of the documents is handled via analyzers:
1: public interface IAnalyzer
2: {3: ITokenSource CreateTokenSource(string field, ITokenSource existing);4: bool Process(string field, ITokenSource source);
6: }
An analyzer create a token source, which accept a TextReader and produces token. For each token, the Process method is called, and it is used to do things to the relevant token. For example, here is the default analyzer:
1: public class DefaultAnalyzer : IAnalyzer
2: {3: readonly IFilter[] _filters =
4: {5: new LowerCaseFilter(),6: new RemovePossesiveSuffix(),7: new StopWordsFilter(),
8: };
10:11: public ITokenSource CreateTokenSource(string field, ITokenSource existing)
12: {13: return existing ?? new StringTokenizer();
14: }
15:16: public bool Process(string field, ITokenSource source)
17: {18: for (int i = 0; i < _filters.Length; i++)
19: {20: if (_filters[i].ProcessTerm(source) == false)21: return false;
22: }23: return true;
24: }
25: }
The idea here is to match, fairly closely, what Lucene is doing, but hopefully with clearer code. This analyzer will text a stream of text, break it up to discrete tokens, lower case them, remove the possessive 's suffix and clear stop words. Note that each of the filters are actually modifying the token in place. And the tokenizer is pretty simple, but it does the job for now.
Now, let us move to indexing. With Lucene, the recommendation is that you'll reuse your document and field instance, to avoid create garbage for the GC. With Corax, I took it a step further:
1: using (var indexer = fullTextIndex.CreateIndexer())
2: {
3: indexer.NewDocument();4: indexer.AddField("Name", "Oren Eini");
6: indexer.NewDocument();7: indexer.AddField("Name", "Ayende Rahien");
9: indexer.Flush();
10: }
There are a couple of things to note here. An index can create indexers, it is intended to have multiple concurrent indexers running at the same time. Note that unlike Lucene, we don't have Document or Field classes. Instead, we call methods on the indexer to create a new document and then add fields to the current document. When you are done with a document, you start a new one, or flush to complete the entire operation. For long running indexing, the indexer will flush itself automatically for you.
I think that this API gives us the best approach. It guide you toward using a single instance, with internal optimizations to make it memory efficient. Multiple instances can be used concurrently to speed up indexing time. And it knows when to spill flush itself for you, so you don't have to worry about that. Although you do have to complete the operation by calling Flush() at the end.
How about searching? That turned out to be pretty similar as well. All you have to do is create a searcher:
1: using (var searcher = fti.CreateSearcher())
2: {3: QueryResults queryResults = searcher.QueryTop(new TermQuery("Name", "Arava"), 10);
4: Console.WriteLine(queryResults.TotalResults);5: foreach (var match in queryResults.Results)
6: {7: Console.WriteLine(match.DocumentId + " - " + match.Score);
8: }
9: }
We create a searcher, and then we can utilize it to perform queries.
So far, this has been all about the API we have, I'll talk about the actual implementation in my next post.
Finding a port in a storm: Or how to get a consistent build experience
RavenDB is a server product, as such, we are obvious going to have to talk over the network. That is great, except that it means we need a system wide resource, a TCP port. And that isn't so great, because it turn out that there are a lot of things that can try to grab a port and use it.
And I don't speak about things like Skype taking over port 80. I'm talking about the use of dynamic or ephemeral ports. That means that during the build, we can have something (for example, Chrome, or DropBox, or anything that uses the web) make a call and suddenly that port is busy and you can't bind to it.
The default ports we use for tests are in the 8070 – 8090 range, but we have had consistent build failures because something is taking the ports. Finally I took the time to investigate, and I discovered that:
1: C:\Work\ravendb-3.0 [master]> netsh int ipv4 show dynamicport tcp
3: Protocol tcp Dynamic Port Range
4: ---------------------------------
5: Start Port : 1025
6: Number of Ports : 64510
So, on the two machines I tested this on, we had the dynamic port range cover everything from port 1025 and up. This sucks. And probably explains the issue. This is how we fixed it (I hope):
1: netsh int ipv4 set dynamicportrange tcp startport=10000 numberofports=55535
Basically, everything below port 10,000 is free for us to use. And yes, this post is here mostly so I'll not have to remember it in the future.
Design practice: Building a search engine library
Note: This is done purely as a design practice. We don't have any current plans to implement this, but I find that it is a good exercise in general.
How would I go about building a search engine for RavenDB to replace Lucene. Well, we have Voron as the basis for storage, so from the get go, we have several interesting changes. To start with, we inherit the transactional properties of Voron, but more importantly, we don't have to do merges, so we don't have any of those issues. In other words, we can actually generate stable document ids.
But I'm probably jumping ahead a bit. We'll start with the basics. Analysis / indexing is going to be done in very much the same way. Users will provide an analyzer and a set of documents, like so:
1: var index = new Corax.Index(storageOptions, new StandardAnalyzer());
3: var scope = index.CreateIndexingScope();
4:5: long docId = scope.Add(new Document
6: {7: {"Name", "Oren Eini", Analysis.Analyzer},8: {"Name", "Ayende Rahien", Analysis.Analyzer},9: {"Email", "firstname.lastname@example.com", Analyzed.AsIs, Stored.Yes}
10: });
11:12: docId = scope.Add(new Document
13: {14: {"Name", "Arava Eini", Analysis.Analyzer},15: {"Email", "firstname.lastname@example.com", Analyzed.AsIs, Stored.Yes}
16: });
18: index.Sumbit(index);
Some notes about this API. It is modeled quite closely after the Lucene API, and it would probably need additional work. The idea here is that you are going to need to get an indexing scope, which is single threaded. And you can have multiple indexing scopes running a the same time. You can batch multiple writes into a single scope, and it behaves like a transaction.
The idea is to deal with all of the work associated with indexing the document into a single threaded work, so that make it easier for us. Note that we immediately get the generated document id, but that the document will only be available for searching when you have submitted the scope.
Under the hood, this does all of the work at the time of calling Add(). The analyzer will run on the relevant fields, and we will create the appropriate entries. How does that work?
Every document has a long id associated with it. In Voron, we are going to have a 'Documents' tree, with the long id as the key, and the value is going to be all the data about the document we need to keep. For example, it would have the stored fields for that documents, or the term positions, if required, etc. We'll also have a a Fields tree, which will have a mapping of all the field names to a integer value.
Of more interest is how we are going to deal with the terms and the fields. For each field, we are going to have a tree called "@Name", "@Email", etc. Those are multi trees, with the keys in that tree being the terms, and the multi values being the document ids that has those threes. In other words, the code above is going to generate the following data in Voron.
Documents tree:
- 0 – { "Fields": { 1: "firstname.lastname@example.com" } }
- 1 – { "Fields": { 1: "email@example.com" } }
Fields tree
- 0 – Name
- 1 – Email
@Name tree
- ayende – [ 0 ]
- arava – [ 1 ]
- oren – [ 0 ]
- eini – [ 0, 1 ]
- rahien – [ 0 ]
@Email tree
- email@example.com – [ 0 ]
- firstname.lastname@example.com – [ 1 ]
Given this model, we can now turn to the actual querying part of the business. Let us assume that we have the following query:
1: var queryResults = index.Query("Name: Oren OR Email: email@example.com");2: foreach(var result in queryResult.Matches)
3: {4: Console.WriteLine("{0}: {1}", result.Id, result["Email"] )
5: }
How does querying works? The query above would actually be something like:
1: new BooleanQuery(
2: Match.Or,3: new TermQuery("Name", "Oren"),4: new TermQuery("Email", "email@example.com")
5: )
The actual implementation of this query would just access the relevant field tree and load the values in the particular key. The result is a set of ids for both parts of the query, and since we are using an OR here, we will just union them and return the list of results back.
Optimizations here can be to run those queries in parallel, or to just cache the results of particular term query, so we can speed things even more. This looks simple, and it is, because a lot of the work has already been done in Voron. Searching is pretty much complete, we only need to tell it what to search with.
The dark sides of Lucene
I've been using Lucene for the past six or seven years, and after my last post, I thought it would be a good idea to talk a bit about the kind of things that it isn't doing well. We've been using it extensively in RavenDB for the past 5 years, and I think that I have a pretty good understanding of it. We used to have one of Lucene.NET committers working at Hibernating Rhinos, so I've a high level of confidence that I'm not just stupidly not using it properly, too.
Probably the part that caused us the most pain with Lucene was the fact that it isn't transactional. That is, it is quite easy to get into situations where the indexes are corrupted. That make it… challenging to use it in a database that needs to ensure consistency. The problem is that it is really not a use case that Lucene is well suited for. In order to ensure that data is saved, we have to commit often, the problem is that in order to ensure good performance, we want to commit less often, but then we will the changes if we crash. For that matter, Lucene doesn't do any attempt to actually flush the data properly, relying on the OS to do that, a system crash can cause you to lose data even though you "committed" it.
Fun times, I can tell you that.
Next, we have the issue of what Lucene call updates. Updates in Lucene are actually just delete/add, and they don't maintain the same document id (more on that later). Because of that, you usually have to have an additional field in the index that would be your primary key, and you handle updates by first deleting then adding things. That is quite strange, to be fair, and it means that you can't "extend" an index entry, you have to build it from scratch every time.
Speaking of this, let us talk a bit about deletes. Ignoring for the moment the absolutely horrendous decision to do deletes through the reader, let us talk about how they are actually done. Deletes are recorded in a separate file, and that means that the moment you have any deletes (or, as I mentioned, updates), all the internal statistics are wrong. We run into this quite often with RavenDB when we are doing things like facets or suggestions. For example, if you have request a suggestion for a user name, it will happily give you suggestions for deletes users, even though we deleted it in Lucene.
It will go away eventually, when it is ready to optimize the index by merging all the files, but in the meantime, it makes for interesting bug reports. Speaking of merging, that is another common issue that you have to deal with. In order to ensure optimal performance, you have to be on top of the merge policy. This results in some interesting issues. For RavenDB's purposes, we do a writer commit after every indexing batch. That means that if you are writing to RavenDB slowly enough, we do a commit after every document write. That result in a lot of segments, and the merge policy would have to do a lot of merges. The problem here is that merges have two distinct costs associated with them.
First, and obviously, you are going to need to write (again) all of the documents in all of the segments you are merging. That is very similar to doing merges in LevelDB ( indeed, in general Lucene's file format is remarkably similar to SST ). Next, and arguably more interesting / problematic from our point of view is the fact that it also kills all of the caches. Let me try to explain, Lucene uses a lot of caches to speed things up, in fact, most of the sorting is done by using the caches, for example. That works really well when we are querying normally, because segments are immutable, which makes for great caching. But on a merge, not only have we just invalidate all of our caches, we now need to read, again, all of the data that we just wrote, so we would be able to use it. That can be… costly. And both things can introduce stalls into the system.
The major problem externally with merges is that the document id changes, and that means that you cannot rely on them. It would be much easier if you could send an id out into the world, and get it back later and do something with it, but that isn't possible with Lucene.
Next, and not really an operational issue like the rest, Lucene's multi threaded behavior is… a hammer to an egg, in most cases. By that I mean code like this:
I mean, it is certainly functional, but it is pretty ugly.
Now, don't get me wrong, I think that Lucene is pretty neat. But there are some really dark corners there. For example, the actual searching, go ahead and try to find where that is done in Lucene. It is very easy to get lost between all of the different aspects: weights, sorters, queries and various enumerators. For fun, a lot of that runs at hard to figure out times, making the actual query run time interesting to try to figure out.
As a good example, let us take the simplest possible query, TermQuery. Go ahead, try to find where it is actually doing the query for matching terms in this code: https://github.com/apache/lucene/blob/LUCENE_2_1/src/java/org/apache/lucene/search/TermQuery.java
That actually happens here: https://github.com/apache/lucene/blob/LUCENE_2_1/src/java/org/apache/lucene/search/TermScorer.java#L79, and it is effectively a side effect of calling reader.termDocs(term) that limit the matches only to those with the same term. Trying to track down where exactly things happen can be… interesting.
Anyway, this post is getting to long, and I want to get back to figuring out how Lucene does its thing without dwelling too much in the dark…
What Lucene does, a look under the hood
Lucene is a search engine library, which is great. But as it turns out, there is a lot going on there. After working with it for several years, I can say with confidence that it is a pretty awesome library. But surprisingly, a lot of the effort that went into it doesn't seem to be talked about / visible to people not trolling through the code. I think that this is a pretty good testament for how successful it is. That, and the fact that it is now the base line against which all other search libraries & engines are compared.
What I wanted to talk about today was the kind of things that Lucene is doing that doesn't seem to get much publicity. I think that Spolsky said it best:
Back to that two page function. Yes, I know, it's just a simple function to display a window, but it has grown little hairs and stuff on it and nobody knows why. Well, I'll tell you why: those are bug fixes. One of them fixes that bug that Nancy had when she tried to install the thing on a computer that didn't have Internet Explorer. Another one fixes that bug that occurs in low memory conditions. Another one fixes that bug that occurred when the file is on a floppy disk and the user yanks out the disk in the middle. That LoadLibrary call is ugly but it makes the code work on old versions of Windows 95.
I remember just how much impact that article made on me at the time. And Lucene's codebase bear true for this words. Lucene is a search engine library, which basically means that it does:
- Indexing
- Querying
- Maintenance
One of the major areas of maturity in Lucene is how it optimized indexing. You can see it in the code. For example, Lucene goes to a great deal of trouble to avoid allocating memory willy nilly. Instead, pretty much everything there is done via object pools. This helps reduce the memory pressure when doing a lot of indexing and can save a lot of GC cycles.
Another is the concept of multiple threads for indexing .A lot of Lucene is build around this idea, it has a lot of per thread state that is meant to ensure that you don't have to deal with concurrency yourself. The idea is that you can take an IndexWriter and write to it concurrently, then call commit. A lot of the work to do with indexing is CPU intensive, so that makes a lot of sense, and Lucene nicely isolates you from all of that work. There is DocumentWriterPerThread, so you can see really nice scaling effects as you throw more threads & hardware at the problem.
Usually, when people start messing with Lucene, they do that by writing analyzers, and you are sort of exposed to the memory constraints by being encourage to use ReusableTokenStream, etc. It has also a nice pipeline architecture for doing the indexing work with filters.
On the querying side, Lucene does a lot of work to ensure that things just works. It has a Boolean Model for searches, and Vector Space Model for ranking. Writing your own Query classes is pretty easy too, once you understand how things work, and again, this is another common place for people to extend Lucene. But there is a lot going on behind the scenes. Lucene does a lot of caching on a segment basis, and it is quite nice, since segments are immutable, it means that you can get pretty good usage out of that.
That give it a lot of its speed, and it means that over time, things are actually going to be faster, because more parts of the segments are in memory and cached.
Finally, we have all of the other work that Lucene does. In practice, it means things like merging segments (hopefully in the background), and keeping the overall system humming along. Unfortunately, that is also one of the places that are usually most common for people to start tinkering with when they run into perf problems. That is anything but trivial, and optimizing it is something that require a lot of expertise and understanding about the specific scenario you have.
And on top of that, you have everything else that already works on top of Lucene. Which is quite a lot.
As I said earlier, that is a very impressive piece of technology. That doesn't mean that it doesn't have its own set of problems, but that is something that I'll discuss in detail in my next post.
Sorting with Lucene
I talked about the Lucene formula and how it calculate things using tf-idf for best matches. Now I want to talk about the actual sorting implementation. As it turned out, the default sorting (by relevancy) is really simple. All you need is to get the relevant score for a query, then you shove the results through a heap with a specified size. The heap will take care of maintain the top results.
So far, that is pretty simple to understand. But the question is, how do you do sorting on a field value? The answer is, not easily.
GetStringIndex() does something very interesting. I returns a string index, which gives us:
- A string array containing all the distinct (sorted) value for this index.
- A int array with all the documents in the index, with the position of the value of that field in the string value array
Now we can compare fields by their field position on the field, which give us pretty good sorting. Unfortunately, this also require us to load all the values to memory. Let us see another example, which would probably be easier to follow:
Sorting by an integer is done like this:
Get an array (whose size match the number of documents), We can then sort things easily because accessing the relevant field value only require us to have the document id to index into the array.
The reason Lucene does this is that it uses an inverted index, and it has no easy way of going from the field values to the list documents it has. So it is easier to read all the values into memory and work with them there. I don't like it, but off hand, I can't think of a better way to handle this.
RavenDB Conf: Success!
Now that the conference is over ,and I am merely doing 3 back to back RavenDB courses in 3 cities and 2 continents, I can sit back and look at that.
I was, in a word, a blast. We had eight speakers giving 14 talks, about topics that moved from date and time handling in RavenDB to operational concerns to architectural how to. But, to be honest, I think that I found the attendees to be the main attraction. It was really good to finally meet so many of the people we have been talking with over the past few years. And what people are building with RavenDB is flat out amazing, and just a little bit scary. It is a funny thing when I see people take our tool and put it to uses that we have never even imagined.
Another great part was the hackaton. We had, in the space of a few hours, produced a major new feature for RavenDB (distributed counters), with everything wired up: Storage, Wire Protocol and even the UI. We still need to complete the replication bits, but those are coming.
We have recorded the sessions, and we hope to have the edited videos soon. I wanted to take the time and thank the speakers and the attendees for such a great conference .
We'll be seeing you again soon… .
My RavenDB Conference presentations
RavenConf, day 1
I started the day at 5:30 AM, because we had to go to the venue and get everything ready. This is now 01:30 AM for the next day, and I am still stoked.
I took this picture at around 8 AM, when people started to queue up to go into the conference:
For that matter, you can see a few other photos from the conference here. I'll do a retrospect about the conference when I have time to breath. But for now, I can report that the RavenDB Hackaton was quite a success, we have a cool new feature mostly implemented. You can see it here: https://github.com/ayende/ravendb/tree/duco
And yes, I'll talk about that in the future as well. But right now, I'm going to have a db capable of managing a 100 billion records tomorrow, live on stage, so I probably need to get some sleep done…
The Lucene formula: TF & IDF
The basis of how Lucene work is tf–idf, short for term frequency–inverse document frequency. You can read about it here. It is pretty complex, but it is explained in detailed in the Lucene docs. It all fall down to:
For now, I want to look at the tf() function. The default implementation is in DefaultSimilarity.Tf, and is defined as:
That isn't really helpful, however. Not without knowing what freq is. And I'm pretty sure that Sqrt isn't cheap, which probably explains this:
So it caches the score function, and it appears that the tf() is purely based on the count, not on anything else. Before I'll go and find out what is done with the score cache, let's look at the weight value. This is calculated here:
And idf stands for inverse document frequency. That is defined by default to be:
And the actual implementation as:
And the caller for that is:
So, we get the document doc frequency of a term, that is, in how many documents this term shows, and the number of all the documents, and that is how we calculate the idf.
So far, so good. But how about that doc frequency? This is one of the things that we store in the terms info file. But how does that get calculated?
I decided to test this with:
This should generate 3 terms, two with a frequency of 1 and one with a frequency of 2. Now, to figure out how this is calculated. That part is a real mess.
During indexing, there is a manually maintained hash table that contains information about each unique term, and when we move from one document to another, we write the number of times each term appeared in the document. For fun, this is written to what I think is an in memory buffer for safe keeping, but it is really hard to follow.
Anyway, I now know enough about how that works for simple cases, where everything happens in a single segment. Now let us look what happens when we use multiple segments. It is actually quite trivial. We just need to sum the term frequency each term across all segments. This gets more interesting when we involve deletes. Because of the way Lucene handle deletes, it can't really handle this scenario, and deleting a document do not remove its frequency counts for the terms that it had. That is the case until the index does a merge, and fix everything that way.
So now I have a pretty good idea about how it handled the overall term frequency. Note that this just gives you the number of times this term has been seen across all documents. What about another important quality, the number of times this term appears in a specific document? Those are stored in the frq file, and they are accessible during queries. This is then used in conjunction with the overall term frequency to generate the boost factor per result.
Peeking into Lucene indexing
Continuing my trip into the Lucene codebase, now I'm looking into the process indexing are happening. Interestingly enough, that is something that we never really had to look at before.
It is quite clear that Lucene is heavily meant for utilizing additional threads for improving overall indexing speed. You can see it in the number of per thread state that exist all over the indexing code. That is also meant to reduce memory consumption, as far as I can see.
The real stuff happens in the ProcessDocument() where we have a chain of DocFieldConsumerPerThread and TermsHashConsumerPerThread which actually do the work.
Then the real work is happening on a per field level in DocInverterPerField, where the analyzer is actually called. The process in which the analyzers return values for the text is interesting. There are "attributes" that are added to the stream, per token, and they are used to get the relevant values. I assume that this allows to have different levels of analyzers.
This way, you can have analyzers that don't deal with offesets or positions, etc. And the actual processing of this is done in a chain that appears to be:
- Freq Prox
- Term Vectors
But that isn't something that I really care about now. I want to see how Lucene writes the actual terms. This is being written in the TermsInfoWriter, which took some time to find.
Terms are stored in a prefix compressed mode (sorted, obviously), and there is the actual terms, and an index into the terms, which allows for faster seeking into the file. This is actually done here:
This is a single term written to the file. A lot of the stuff Lucene does (prefixes, VInt, etc) are done in the name of conserving space, and it reminds me greatly of LevelDB's SST. In fact, the way terms are stored is pretty much an SST, except that this happens to be on multiple files. Pretty much the entire behavior and all the implications are the same.
It also means that searching on this is fast, because the data is sorted, but pretty complex. And it also explains a lot about the actual exposed API that it has. I think that I have a pretty good idea on how things work now. I want to now go back up and look at specific parts of how it works… but that is going to be the next post.
RavenDB 3.0 milestone
Well, today we have reached a really big milestone for RavenDB 3.0. It is now the master branch in our development mode, and 2.5 is in maintenance mode.
That means that you can go here: http://github.com/ayende/ravendb and see all the cool stuff that we are doing. Official builds will be up for the conference, so you can play with the new stuff .
Last RavenDB Conference tickets
We still have a couple of tickets available for the RavenDB conference. And sale of them ends tomorrow. You can buy them here.
I'm already at the states (writing this from JFK right now), and getting ready to show you some very cool stuff next week.
My distributed build system
Yes, I know that you are probably getting geared up to hear about some crazy setup, and in some manner, it is crazy. My distributed build system is this:
Yep, that is me manually distributing the build to do a cross check on a reasonable time frame.
I've mentioned before that our build time is atrocious. With over 3,500 tests, this is no longer a feasible alternative to just run them normally. So we started parallel efforts (pun intended), to reduce the time it takes the system to build and reduce individual test times as well as the ability to parallelize things.
We are actually at the point where we can run concurrent tests, even those we previously had to distribute. And we can even do that with replicated tests, which are the ones usually taking the longest. But what we'll probably have in the end is just a bunch of test projects (currently we have ~5) that we will run on different machines at the same time.
We are using Team City for build system, and I know that it has capabilities in this regard, but I've never actually looked into that. We're going to be pretty busy in the next couple of weeks, so I thought that this would be a good time to ask.
My current thinking is:
- One build that would actually do the compilation, etc.
- Then branch off that to a build per test project, which can run on different agents
- Then a build on top of that that can actually deploy the build.
Any recommendations on that? We are going to need 5 – 7 agents to run the tests in parallel. Any recommendations on how to get those? Ideally I would like to avoid having to pay for those machines to sit idle 60% – 80% of the time.
Any other alternatives?
Hibernating Rhinos: The Movie
Well, it is finally here, it has been ten years since I started blogging. My first blog was on April's 1st 2004, and somehow, we are a decade later.
Usually it is time for introspective, and careful thought about what was and what will be, but I'm having no time for that. Instead, I wanted to let you know that we just finished signing with Lucas Film (well, it said Disney on the contract, but I'm a geek, so I'll go with the more impressive title) for a movie about Hibernating Rhinos. The idea is basically similar to the Social Network, but much better.
I'm trying to see if I can get Jesse Eisenberg to play there.
And I got a budget for 999 ravens to be released in a flock at one of the scenes!
We'll show a trailer for the movie (purely computer generated, so far) at our Conference in a week.
The Lucene disk format
I realized lately that I wanted to know a lot more about exactly how Lucene is storing data on disk. Oh, I know the general stuff about segments and files, etc. But I wanted to know the actual bits & bytes. So I started tracing into Lucene and trying to figure out what it is doing.
And, by the way, the only thing that the Lucene.NET codebase is missing is this sign:
At any rate, this is how Lucene writes the segment file. Note that this is done in a CRC32 signed file:
And the info write method is:
Today, I would probably use a JSON file for something like that (bonus point, you know if it is corrupted and it is human readable), but this code was written in 2001, so that explains it.
This is the format of the format of a segment file, and the segments.gen file is generated using:
Moving on to actually writing data, I created ten Lucene documents and wrote them. Then just debugged through the code to see what will happen. It started by creating _0.fdx and _0.fdt files. The .fdt is for fields, the fdx is for field indexes.
Both of those files are used when writing the stored fields. This is the empty operation, writing an unstored field.
This is how fields are actually stored:
And then it ends up in:
Note that this particular data goes in the fdt file, while the fdx appears to be a quick way to go from a known document id to the relevant position in the fdx file.
As I was going through the code, I did some searches, and found a very detailed explanation of the actual file format in the docs. That is really nice and quite informative, however, just seeing how the "let us take the documents and make them searchable" part is quite interesting. Lucene has a lot of chains of responsibilities going through. And it is also quite interesting to see the design choices that were made.
Unfortunately, Lucene is very much wedded to its file format, and making changes to it isn't going to be possible, which is a shame, since it impacts quite a lot of the way Lucene works in general.
Reduce ^ 2 in RavenDB
An interesting question that keeps popping up is how to re-reduce the results of a map/reduce. That is really nice feature on the surface, but it has a lot of implications, for example, when / how you run the 2nd reduce, can you chain only 1 time, or multiple times , what happens when there are a lot of reduce results, etc.
But most of the time, what people want is to be able to do aggregation on the map/reduce results without too much hassle, and they don't have a lot of aggregated results or they are fine with waiting for them if they are very large. And we have a really nice solution for that scenario.
You start by defining the base map/reduce operation, like so:
Note that we need to also output the fields that we care about reducing further. In this case, we start by reducing to postal code, but we keep the city, region and country options as well.
Then, we define a transformer. Note that this is a special transformer, in that it has a group by in it, and it takes some parameters from outside.
Using those two together, we can now get the following results…
Raw map/reduce output:
With loc = City, we get:
With loc = Country, we get:
Tada, we have reduced further the result of a map/reduce operation. Now, this is subject to the usual limitations of RavenDB paging, in that it will only go through the only 1024 results. That can be a problem, but that is why RavenDB has the Streaming API.
You can use streaming on a map/reduce index with a transformer (and even apply parameters on top of that). That end up giving you the ability to run a re-reduction on top of a map/reduce index regardless of size.
Of course, on very large result sets, that can take quite a while, but that is expected and usually fine. For that matter, if you need to, you can chain the stream into a bulk insert, and get the re-reduction in that manner.
"Incremental" map/reduce in MongoDB isn't
Rafal an Ben Foster commented on my previous post with some ideas on how to deal with incremental updates to map/reduce indexes. Rafal said:
Actually, it's quite simple if you can 'reverse' the mapping operation (for given key find all documents matching that key): you just delete aggregate record with specified key and run incremental map-reduce on all matching documents. In today's example, you would delete the aggregate with key='oren' and then run map reduce with a query:
db.items.mapReduce(map,reduce, { out: {reduce: 'distinct_item_names'}, query: {name: 'oren' } });
And Ben said:
It's worth mentioning that I was able to get the MongoDB map-reduce collections updating automatically (insert/update/delete) by monitoring the MongoDB OpLog …
…and listen for new documents in the OpLog which could then be used to re-execute an incremental Map-Reduce.
And while this looks right, this actually can't possibly work. I'll start from Rafal's suggestion first. He suggest just issuing the following set of commands whenever we delete something from the database:
1: db.distinct_item_names.remove({name: 'oren' } });2: db.items.mapReduce(map,reduce, { out: {reduce: 'distinct_item_names'}, query: {name: 'oren' } });
And yes, that will actually work, as long as you are careful to never do this concurrently. Because if you do run this concurrently… well, the best you can hope is no data, but the liker scenario is data corruption.
But this actually gets better, deletes are annoying, but they are a relatively simple case to process. You have updates to deal with too. We'll assume that we are watching the oplog to get notified when this happens. Here is an MongoDB oplog entry
1: {2: "ts": {3: "t": 1286821984000,4: "i": 1
5: },6: "h": "1633487572904743924",7: "op": "u",8: "ns": "items",9: "o2": {10: "_id": "4cb35859007cc1f4f9f7f85d"
11: },12: "o": {13: "$set": {14: "Name": "Eini"
15: }
16: }
17: }
As you can see, we an update operation (op: u) on a specific document (o2._id) with the specified update (o.$set). That is really great, and it is utterly useless for our purposes. In this case, we updated the name from Oren to Eini, so we would like to be able to run this:
1: db.distinct_item_names.remove({name: 'oren' } });2: db.distinct_item_names.remove({name: eini' } });3: db.items.mapReduce(map,reduce, { out: {reduce: 'distinct_item_names'}, query: {name: 'oren' } });
4: db.items.mapReduce(map,reduce, { out: {reduce: 'distinct_item_names'}, query: {name: eini' } });
Except that we don't have any way to get the old value out from the oplog. And this still isn't going to work concurrently.
But let us say that we decided to have a watcher process monitor the oplog somehow, and it will ensure no concurrency of those requests. Now you have to deal with fun issues like: "what happens if the watcher process recycle?" How do you keep your place in the oplog (and remember, the oplog is capped, stuff you haven't seen might be removed if they are beyond the specified size.
And… to be frank, once we have done all of that, this is still the easy part. One of the reasons that you want to do this work in the first place is to deal with large amount of data. But you cannot assume that you'll have even distribution of the data.
One bug request that came against the RavenDB map/reduce implementation was a map/reduce index on the US Census data. That is ~300 million documents, and the index the user wanted to build was a map/reduce group by the state. You have states like California, with more than 30 million people in it, and you realize that you don't want to have to re-do the map/reduce over the entire 30+ million documents that you have there. In RavenDB, under this scenario, you'll have to issue about 3,073 operations, by the way. Versus the 30 millions you would need for this approach.
So yeah, "incremental" map/reduce can't handle concurrent work, can't handle deletes, can't handle updates, and definitely shouldn't be used on large data sets. And that is after you went to the trouble of setting up the watcher process, monitoring the oplog, etc.
Or, you can use RavenDB and you get a true incremental map/reduce without having to worry about any of that.
Differences in Map/Reduce between RavenDB & MongoDB
Ben Foster has a really cool article showing some of the similarities and differences between MongoDB & RavenDB with regards to their map/reduce implementation.
However, there is a very important distinction that was missed. Map/reduce operations are run online in MongoDB, that means that for large collections, map/reduce is going to be very expensive. MongoDB has the option of taking the result of a map/reduce operation and writing it to a collection, so you don't need to run map/reduce jobs all the time. However, that is a snapshot view of the data, not a live view. Ben mentioned that you can do something called incremental map/reduce, but that isn't actually really good idea at all.
Let us look at the following sequence of operations:
1: db.items.insert({name: 'oren', ts: 1 });2: db.items.insert({name: 'ayende', ts: 2});
3:4: var map = function Map() { emit(this.name,null); };5: var reduce = function(key, val) { return key; };
6:7: db.items.mapReduce(map,reduce, { out: 'distinct_item_names' });
This creates two items, and give me the distinct names in a separate collection. Now, let us see how that works with updates…
1: db.items.insert({name: 'eini', ts: 3 });
2:3: db.items.mapReduce(map,reduce, { out: {reduce: 'distinct_item_names'}, query: {ts: {$gt: 2} } });
This is actually nice, mongo is able to merge the previous results with the new results, so you only have to do the work on the new data. But this has several implications:
- You have to kick something like 'ts' property around to check for new stuff. And you have to _udpate_ that ts property on every update.
- You have to run this on a regular basis yourself, mongo won't do that for you.
- It can't work with deletes.
It is the last part that is really painful:
1: db.items.remove({name: 'oren'});
Now, there is just no way for you to construct a map/reduce job that would remove the name when it is gone.
This sort of thing works very nicely when what you want is to just append stuff. That is easy. It is PITA when we are talking about actually using it for live data, that can change and be modified.
Contrast that with the map/reduce implementation in RavenDB:
- No need to manually maintain state, the database does it for you.
- No need to worry about updates & deletes, the database does it for you.
- No need to schedule map/reduce job updates, database does it for you.
- Map/reduce queries are very fast, regardless of data size.
To be frank, the map/reduce implementation in RavenDB is complex, and pretty much all of it comes down to the fact that we don't do stupid stuff like run a map/reduce operation on a large database on every query, and that we support edge cases scenarios like data that is actually updated or deleted.
Naturally I'm biased, but it seems to me that trying to use map/reduce in Mongo just means that you have to do a lot of hand holding yourself, while with RavenDB, we take care of everything and leaving you to actually do stuff.


text: % This is the RIPE Database query service. % The objects are in RPSL format. % % The RIPE Database is subject to Terms and Conditions. % See http://www.ripe.net/db/support/db-terms-conditions.pdf % Note: this output has been filtered. % To receive output for a database update, use the "-B" flag. % Information related to '184.108.40.206 - 126.96.36.199' % Abuse contact for '126.96.36.199 - 126.96.36.199' is 'email@example.com' inetnum: 22.214.171.124 - 18.104.22.168 netname: ENTANET-ADSL descr: ADSL endpoints NAT conections only country: GB admin-c: ET216-RIPE tech-c: ET216-RIPE status: ASSIGNED PA mnt-by: ENTANET-MNT mnt-lower: ENTANET-MNT mnt-routes: ENTANET-MNT source: RIPE # Filtered role: Entanet Technical address: Entanet remarks: All objects pointing at this role have been anonomised to remarks: protect the identity of our customers. admin-c: EH1633-RIPE tech-c: EH1633-RIPE nic-hdl: ET216-RIPE mnt-by: ENTANET-MNT source: RIPE # Filtered % Information related to '18.104.22.168/17AS8468' route: 22.214.171.124/17 descr: ENTANET International Ltd origin: AS8468 mnt-by: ENTANET-MNT source: RIPE # Filtered % This query was served by the RIPE Database Query Service version 1.72 (DBC-WHOIS2)


text:
Skip to content
and found 2 items
398cc, 34bhp, 95mph, Insurance group
The largest incarnation of the Piaggio MP3 retains the same reassuring all-weather grip and stability afforded by the third wheel, but with more power for motorway cruising. It's no Goldwing, but if your daily commute mixes town work with high-speed open roads, this could be the motorcycle you're looking for.
398cc, 45bhp, 93mph, Insurance group 9
The CCM FT35S was built as the bastard offspring of a supermoto motorcycle and a flat-track racing motorcycle comes the road-legal beauty from Britain's own CCM. Stopping just this side of total two-wheeled self-indulgence the CCM FT35S is for folk who make statements and act the goat with no thought for such dreary irrelevances as practicality or comfort.
Save money by comparing quotes. It's quick and easy
Compare and buy 100s of bargain priced products for you and your bike
Motorcycle Cover | Cheap Motorcycle Insurance | Moped Insurance | Scooter Insurance | 125 Insurance | Work Experience


text:
Art on the Corner: 'Mountain Peak'
SCULPTURE: "Mountain Peak" is in front of Heirlooms for Hospice, on the south side of the 600 block of Main Street. ARTIST: Former Grand Junction resident Suzi Rhae Ross…
Want to read more?
This article and other exclusive local content now require a subscription. (Learn More)


text:
nothing happens when click on "download" here..
player installer does NOT get downloaded
(and there's a JavaScript error on this page...)
Adobe is not aware of this problem???????
would appreciate some help..
thank you.,.
am on Win7 32-bit.....
thank you..
We're having the same issues here...
Win 7 64-bit
Firefox / IE 8
Clicking the Download Now button refreshes and nothing happens.
Clicking the checkbox to avoid spamware installation (McAfee) causes a Javascript error
$A is not a function [Break On This Error] return __method.apply(null, [this].concat($A(arguments))); prototype.js (line 246)
Also... noticed I'm getting (301 Moved Permanently) Status back from
GET /flashplayer/download/ 301
GET /flashplayer/ 301
We need this page to work for our clients to be able to use our Flex application. Urgency is important here. Thanks!
Same here. two different Win 7 boxes, multiple browser versions. I tried calling, but we all know how that went Adobe.
Same here. Vista/IE9. Keep trying to open email attachments needing Flash only to be told I need to load it. I uninstall it (which is the current version), and then download the lastest from the Adobe site. Adobe window says Flash installed and playing. I then reopen IE9 and the email. Clicking on the the attachment again brings up the note that Flash is not installed, and that I need to install it. Have gone through this process Multiple times, including disabling virus sw during the download and install. This is true of multiple emails w/attachments needing Flash.
Any advice, any one?
Alternate installer download from the FAQ: http://forums.adobe.com/thread/909550
ok, finally got this to work.. (why does it default to installing google toolbar??? I hate it when you download something and it surreptitiously downloads something else
THEY NEED TO TURN THIS OFF... if I want google toolbar I know where to get it.. thank you very much...
(I stopped installation in the middle when I realized, downloaded again... this is LOUSY USABILITY, to install sutff in people's machines they haven't asked for... ( you don't always realize at first that option is turned on -- and that's precisely what they count on -- is google paying Adobe for this????)
I also can not seem to download a Flash Player. I am using IE9 on a Vista machine. Every time I try an install it takes me to the page for the 11.0.1 which states not available for Vista. How do I get a flash player, please help with any suggestions.
Flash Player is available for Windows Vista 32 bit.
PFB the link which has the system requirements for the latest version of Flash Player:
Also, you can use http://get.adobe.com/flashplayer/download/ to get directly to the download page.
Thank you very much for this reply, however my Vista machine is 64 bit,
will that still work?
Yes it works on Vista 64 bit as well. The requirements mentioned in the above link are the minimum required specifications. Please try the above steps.
In case it still doesnt work, provide us with the following details:
1. Exact error message or result after you click on the download button.
2. Current version of Flash Player installed on your system. (Click on this link to find that out http://www.adobe.com/software/flash/about/)
This is the default message I get when I attempt to view a WMV file. "You
need to upgrade your Adobe Flash Player to watch this video." I did verify
that I have version 22.214.171.124 installed on my Vista 64 machine. Please
accept my thanks for trying to help me with this issue, it is making me
crazy in that I can not view any file requiring Flash. In that I have what
I think is a better anti virus program installed on my machine this problem
did not start until after I uninstalled a Mcafee anti virus program last
week. This is probably why I am having this Flash problem. I prefer not to
reinstall Mcafee unless it is necessary to get Flash once again.
What files do you have in
Regarding IE9, see also
A comment - not a response to Derzoom of Gat Willener(?). I have Vista Premium 32, all of the right files in C:\Windows\System32\Macromed\Flash, and tried all of the Adobe help threads I can find. Also tried online and offline standalone installs. Tried going back to IE8 and installing Flash Player, then reinstalled IE9. Always got the same "You need to install Adobe Flash Player." On a tip, I finally created a new Windows user, and that did it. I have no idea why it worked. Now I can view all videos, including Youtube.
Thanks for the help.
I'm having this same problem, and the page you gave a link to has this message near the top:
Note:Flash Player does not support 64-bit versions of Windows XP and Vista. Flash Player 11 now includes support for Windows 7 64-bit
So, what do I do?
The file in my Flash folder is FlashUtil64_11_1_102_ActiveX
I can't watch any videos in Explorer!
Uninstall the 64-bit Flash Player.
Download the 32-bit Flash Player and install.
I tried that with no luck. The proper Flash player showed up in my control panel/ programs. But I still get black Youtube screens with the message that I need to upgrade. I've worked on this all day with no results.
Even though Adobe tells me I'm now running Flash and it shows up under control panel/ programs.
, I still get that black Youtube screen telling me I need to upgrade. This had gone on all day, multiple times.
To assist us in quickly understanding your problem, please follow these guidelines when posting:
TOMMICMAC wrote:
32 bit edition of what exactly? Windows 7, Windows Vista, Windows XP, Windows 2000?
Also, which edition of Internet Explorer? Is it 6, 7, 8 or what?
Do you have Flash installed at all at the moment? If so which version? Go to: http://www.adobe.com/software/flash/about/
if you don't have it, or even if you do, what happens exactly when you attempt to install it or update it?
Vista, 64 bit laptop with Google Chrome, Windows Mail and Internet Explorer 8.
I had originally said Vista, but a check of my IE properties showed 8. (Yes, a little knowledge is a dangerous thing) Somewhere along the line I must have replaced Vista with IE 8.
I do not have Flash installed now since I have repeatedly installed and uninstalled it to update it. Every time I bring up a YouTube window, it is black with the message that I must upgrade to see a video. I do that, it installs it and says I'm now running Adobe Flash but still the same black screen comes up with the same "must upgrade" message.
I did this repeatedly all day yesterday because I need to access YouTube on a regular basis.
Does this help us?
Can you see this test video? http://www.youtube.com/swf_test.html
No. I get a blank window with this message "Adobe Flash Player 8 or higher not detected"
Sorry to respond so late, Xircal
Flash Player for Internet Explorer
Is this the installation file that you have tried?
It's OK.
But some sites don't upgrade their Flash players - because as commercial enterprises, they have to pay for a license - which is why you're seeing that message. If you go to this site, you'll see a message shown in the screenshot: http://www.froedtert.com/FlashNotFound.aspx
The only thing you can do in this situation is to contact the site's webmaster and inform them that technology has moved on and that they should upgrade their site to work with the latest version of Flash.
jon.sullivan.mindflash wrote:
We're having the same issues here...
Win 7 64-bit
Firefox / IE 8
Clicking the Download Now button refreshes and nothing happens.
Clicking the checkbox to avoid spamware installation (McAfee) causes a Javascript error
Adobe earns commission from McAfee if you install their app. That's the only reason it's there. It doesn't scan the file you're downloading.
Can you please do the following.
N.B. If after you successfully install Flash on IE and want to proceed with the installation on another browser, do not run the uninstaller again. If you do, it will uninstall it from IE as well and you'll be back where you started.
Hi I cant download the flash player and I dont think its because of any of the common reasons the others here seem to have.
I had version 10 and uninstalled it in the hope to get the new version, and as I expected it cant be downloaded and now Im left without none. The download starts, then it stops afer a few minutes adn a message pops up saying ''an error occured while downloading this file'' .
I use internet explorer and I dont seem to have any problems with Java. I mean I enabled it on the settings of the internet options. I uninstalled my antivirus a few weeks back in ordr to download something, so that can't be the problem either.
Please help.
Try downloading the offline installer from http://helpx.adobe.com/content/help/en/flash-player/kb/installation-pr oblems-flash-player-windows.html#main-pars_header and save it to disk, then close all browser windows and run the downloaded installer.


text: Understanding Weight-Loss SurgeryWeight-loss surgery can help the severely obese drop significant pounds and even head off serious illnesses, like diabetes.By Krisha McCoy, MSMedically reviewed by Lindsey Marcellin, MD, MPHWeight-loss surgery (WLS), also called bariatric surgery, is a procedure that can help people who are severely obese lose weight when traditional weight-loss methods — diet, exercise, and weight-loss medications — have failed. By helping you lose excess weight, bariatric surgery can also help prevent, manage, or even resolve a number of serious obesity-related health conditions. Bariatric surgery "is a multidisciplinary approach to the treatment of obesity and [related] diseases," says John Baker, MD, a bariatric surgeon in Little Rock, Ark., and president of the American Society for Metabolic and Bariatric Surgery. How Bariatric Surgery Works Bariatric surgery alters your digestive system to induce weight loss. Exactly how your procedure works depends on the specific type of bariatric surgery you have. According to Dr. Baker, some weight-loss surgeries are restrictive in nature. "They can influence weight loss by restricting caloric intake [and] by limiting the volume that a patient can take in," he says. Other procedures work by limiting nutrient absorption so the body absorbs fewer calories. And some weight-loss surgeries combine both restrictive and malabsorptive techniques. Bariatric Surgery: Four Types The types of bariatric surgery that are commonly performed today are: Adjustable gastric band. If you have an adjustable gastric band (Lap-Band), a small band will be surgically placed around your upper stomach to create a pouch that limits the amount of food you can eat. Roux-en-Y gastric bypass. According to Baker, gastric bypass works by both limiting your food intake and interfering with nutrient absorption. In a gastric bypass procedure, your digestive system will be manipulated so that food is routed from a small pouch in your stomach directly into your small intestine. Biliopancreatic diversion with a duodenal switch. For duodenal switch procedures, much of your stomach will be removed, food will be routed away from a large portion of your small intestine, and digestive juices will be routed away from your digestive system. Vertical sleeve gastrectomy. Vertical sleeve gastrectomy is a procedure in which much of your stomach is removed, resulting in a tubular sleeve that serves as a smaller stomach. This restricts your food intake, but does not interfere with the absorption of nutrients. Baker says that there are other investigational bariatric surgeries on the horizon. "But there needs to be more long-term study and evaluations of those operations and procedures [before they become available]," he notes. Immediate Benefits of Bariatric Surgery The most obvious benefit of weight-loss surgeries is weight loss, which can be dramatic. Other than bariatric surgery, Baker says that "very few, if any, of the medical treatments are effective at long-term weight loss." Whereas with traditional weight loss, people might lose 5 percent to 10 percent of their body weight in two years — only to gain it back — the effects of bariatric surgery are generally much more substantial. Baker says that on average, people lose 50 percent of their excess body weight with adjustable gastric banding, 62 percent to 68 percent of their excess body weight with gastric bypass, and 70 percent to 80 percent of their excess weight with duodenal switch procedures. More Benefits of Bariatric Surgery But even more important than helping you lose weight, bariatric surgery can also help prevent or treat other health problems that are related to your weight. "It is not so much the weight loss [but] the fact that with metabolic and bariatric surgery, you can improve or resolve a number of chronic diseases," Baker says. He lists diabetes, hypertension, obstructive sleep apnea, gastroesophageal reflux disease (GERD), cancer, and heart disease among the 30-plus obesity-related diseases that can be potentially helped by bariatric surgery. Last Updated: 02/18/2010 | Next Article: 12 Steps To Manage Your Weight » Leave a comment To leave a comment, please log in below using your preferred network. More on Balance Healthy Living Basics Disease Prevention Mental Fitness Balance Articles in Balance How To Lead a Well-Balanced Life 6 Ways to Take a Mental Vacation The Power of Love Includes Stress Relief 8 Tips for Managing Stress 7 Ways to Zap Stress Before it Strikes Care for the Caregiver How to Get Better Sleep 10 Tips for Taking Time Out for Yourself This Summer Your Action Plan for Dealing With Change 7 Ways to Sharpen Your People Skills More Articles Back to Top


text:
NORTHERN, Colo. - Lorraine Bastian of Northglenn, Colo., went home to her Maker on Saturday, Feb. 23, 2013, at 7:30 p.m. after a long illness.
She is survived by two daughters, Janice Cowling of Escanaba, and Sharon Turner of Northglenn, Colo.; 13 grandchildren, 30 great-grandchildren and one great-great-granddaughter, two sisters-in-law, Eva Viau and Rosella Bastian; and several nieces and nephews and cousins.
She was preceeded in death by her husband, Leroy, mother, father, brother and sister, one great-grandson and one great-great-grandson, also three brothers-in-law and one sister-in-law.
Article Photos
Lorraine Bastian
She lived for many years in the Escanaba area and was employed at Robinson's Furniture Factory.
She will be remembered by many as a member of the Salvation Army.
Those who knew and loved her will always remember her beautiful smile and tender heart. A memorial service will be held at the Salvation Army in Escanaba on March 23 at 2 p.m.