text:
Red Wings even series with Blackhawks
Chicago, IL – Brendan Smith netted the game-winning goal late in the second period, part of a four-goal burst which lifted the Detroit Red Wings to a 4-1 victory over the Chicago Blackhawks to even this Western Conference semifinal at one game apiece.
Damien Brunner, Johan Franzen and Valtteri Filppula also lit the lamp for the Red Wings, who recovered nicely following Wednesday's series-opening 4-1 loss.
Henrik Zetterberg posted two assists and Jimmy Howard stopped 19 shots for the win.
"Now we're freshened up a bit. This series is on," noted Wings head coach Mike Babcock.
Patrick Kane registered the lone goal and Corey Crawford made 26 saves for the Blackhawks, who saw their eight-game win streak against Detroit ended.
Game 3 shifts to Joe Louis Arena on Monday.
Detroit evened the score at the 2:40 mark of the second, as Brunner's mid-air tip of a Jakub Kindl point shot knuckled past Crawford, then took the lead with 3:53 remaining as Smith came in from his point position to one-time a Zetterberg feed home.
"He creates a lot of stuff. Sometimes for both teams," Zetterberg quipped about his teammate and goal scorer.
Franzen's short-side goal off a break up the right wing at 7:19 of the third period gave the Red Wings a 3-1 advantage, and Filppula made it a three-goal spread for the visitors with a slick backhander from the slot inside of eight minutes remaining.
"We know going into their building it's going to be even more difficult than it was today. We'll turn the page," said Blackhawks captain Jonathan Toews about heading to Detroit to continue the series.
Crawford turned away a Cory Emmerton breakaway chance at the tail end of a Chicago power play after the midway point of the first period, and the hosts later cranked up their offensive machinery.
Kane finished off a three-way passing play between himself, Patrick Sharp and Michal Handzus, ripping a one-timer home from the right side with 5:55 to play.
"Across the board, we should all assume some responsibility. We have to be way better than that," said Chicago head coach Joel Quenneville when asked if he placed any blame on Crawford.
Game Notes
Detroit's last victory over Chicago was a 3-2 shootout decision on Jan. 14, 2012 ... Kane's goal was his first playoff marker since April 21, 2011, in Game 5 of a Western Conference quarterfinal against Vancouver ... With a win on Saturday, Chicago could have posted their first home sweep of Detroit to begin a playoff series since winning Games 1 and 2 of the Norris Division semifinals in 1985 ... Detroit welcomed back forward Drew Miller to the lineup for the first time since breaking a bone in his right hand on April 20.


text:
As promised, from Victor Stenger's Quantum Gods (Prometheus 2009).
First, from the Foreword by Michael Shermer. On a book tour in the spring of 2004 he met the producers of the documentary (although I would call it a "documentary") What the Bleep Do We Know?
What the Bleep Do We Know? went on to become one of the highest grossing documentary films of all time…The explanation is to be found in the fact that the film is not really about quantum physics. The documentary's central motif is that we create our own reality through will, thought, and consciousness, which, according to the "experts" who appear as talking heads throughout the film (most of whom are not scientists, let alone quantum physicists), depends on quantum mechanics, that branch of physics so befuddling even to those who do it for a living that it can be invoked whenever something supernatural or paranormal is desired. [p 7]
He quotes University of Oregon physicist (ret'd) Amit Goswamy saying the material world is nothing but movements of consciousness and that he chooses moment by moment his experiences.
I publicly challenged Dr Goswami to leap out of a twenty-story building and consciously choose the experience of passing safely through the ground's tendencies. [p 8]
He cites Deepak Chopra and J.Z. Knight, Roger Penrose and Stuart Hameroff. He asks Victor Stenger if the Penrose-Hameroff conjecture (about microtubules and stuff) has any merit.
Stenger explained to me that the gap between sub-atomic quantum effects and large-scale macrosystems is too large to bridge. [p 9]
In other words, no.
Stenger explains in the preface what "quantum spirituality" is.
The primary theme of the quantum spirituality movement is that "we make our own reality." This principle is the subject of many book in which the authors grandly claim a new "paradigm" in our understanding of the nature of reality, with the human mind somehow tuned into a "cosmic consciousness" that pervades the universe. [pp 14-5]
Ok, now I get it. When I say that I too think I'm part of something much bigger than my own self, and cite the species, and animals, and living organisms, and the cosmos, and history, I'm not talking about what quantum spirituality people are talking about when they say they are part of something bigger than their own selves. They're talking about something else; they're talking about being somehow tuned into a "cosmic consciousness" that pervades the universe.
Yes. I don't think we make our own reality, and I don't think I'm somehow tuned into a cosmic consciousness that pervades the universe.

subset: commoncrawl


text:
Refer friends, family or strangers to Mid South Home Buyers, and receive $1,000 each and every time they purchase a property from us, no real estate experience required. Our average buyer purchases ten properties over time. You'll get paid each and every time your referral purchases, forever. Simply mentioning our name to a stranger at a party will suffice as a referral, no extra work on your part required.
We record the referral source of each and every investor that purchases property from us. Our referral program has been extremely successful because of our continual payment to referees years after the referral was made. Join the many individuals who receive $1,000 checks from Mid South Home Buyers on a regular basis, who often didn't even know their referral had come back for another purchase.


text:
Man gets 27 years
in home invasion
By Chris Green
Rockford Register Star
ROCKFORD - A 26-year-old man found guilty of home invasion and armed robbery was sentenced to 27 years in prison, Winnebago County State's Attorney Joe Bruscato announced Tuesday.
Marcell Norris, 26, was sentenced Monday by 17th Circuit Associate Judge Gary Pumilia.
In addition to home invasion and armed robbery, Norris also was found guilty of resisting a peace officer and possession of cannabis.
On April 29, Rockford police responded to the 2300 block of South 6th Street where they were flagged down by an individual who pointed to a woman. The woman told police two men broke in through her front door, pointed handguns at her and demanded money.
One of the suspects continued to hold a gun to her head, while the other took two laptop computers from the residence and left the area.
A neighbor of the victim saw a suspicious black SUV in the alley before the home invasion, called 911 and observed two subjects get out of the vehicle and approach one of the houses. A short time later, the two subjects ran back to the vehicle, got in and left.
A Rockford police officer saw the suspect vehicle as it was leaving the area, and followed it to the 1700 block of Kishwaukee Street where it stopped.
Three occupants fled from the vehicle at that time. Officers chased the subjects and Marcell Norris was caught a few minutes later. The victim identified Norris as the intruder who pointed a small handgun at her and took her laptop computers. The neighbor also identified Norris as one of the persons he saw exit the SUV a short time before the offense, then run back to the SUV after the offense was committed.
Home invasion and armed robbery are class X felonies with a sentencing range of six to 30 years in prison.
Norris received a sentence of 12 years plus a 15-year enhancement for being armed with a firearm.


text:
I went to this conference called the National Young Leaders Conference. I thought I would be able to go online there, but first, I left my power cord at home, and my mom had to mail it to me, and then I didn't have WiFi in my room, and none of that mattered anyway, because we woke up at six and were going until 10:30, at which point 4 girls had to use 1 bathroom to get ready for the next day (this usually took until 1 am). I had no time there and I did a lot of work and got no sleep and couldn't do any reading and it was.......THE. BEST. TIME. OF. MY. FREKKIN. LIFE.
No joke. No sarcasm. It was amazing!!
Some highlights:
- Hearing Scott Beale, CEO and founder of Atlas Corps, speak, and getting to give a short spiel thanking him in front of about 330 other scholars.
- Visiting all the major memorials.
- Going to a workshop about Youth Venture.
- Meeting my representative's assistant.
- Seeing Diane Feinstein debate on the Senate Floor.
- Seeing John McCain. (Some other people said they saw a very annoyed John Kerry too)
- Sitting in the front row at the House of Congress, listening to Congressman Sanford Bishop speak.
- Listening to The Milton Jaques Press Panel (Nancy Ambrose among others)
- Having a Town Hall discussion on immigration and feeling so lucky to be in a room full of such intelligent teenagers. It was seriously amazing to be surrounded by intelligent people for 6 full days.
- Performing the duties of Minority Leader for the Republican party, including choosing talking points, reviewing amendments, and choosing debate speakers, opening and closing a Model Congress Simulation, and pumping up a crowd.
- Acting as an Associate Justice.
- Winning a booty shakin' dance contest at our farewell dinner cruise/dance.
- Meeting amazing kids from across the country who I am never going to forget.
- Discovering that I am far bolder than I ever imagined, far more outgoing than I ever imagined, and a much better leader than I ever imagined.
It's nice to be back, but it's bittersweet. I feel like I've crammed a month of life into six days. It was seriously one of the most mindblowing experiences out there. If you get invited to NYLC or GYLC, do it. Seriously.
Now that I'm back, I'm ready to start college applications, book reviews, interviews, and a zillion other things I've neglected for what feels like a lifetime.
Love to all the amazing followers who stuck by me in this long silent period and to the few people who actually began following me. Wowza.
Tashi <3


text:
I started to think about this after seeing Anna's personality as contrasted to Elsa.
Elsa is all calm and regal, Anna is michevious, freewheeling and hot tempered.
In Brave there's a similar situation with Merida and her brothers in Brave.
She's always pressured to "behave properly", but nobody really cares that they are little terrors.
So, I started to wonder, are the firstborn in each Royal family expected to act in a manner befitting a future queen? Therefore, they're not given the freedom to do whatever they want.
Whereas there are no such expectations attached to their younger siblings, so they can be as naughty as they want.
Merida even gives a monologue on this issue.


text:
The extra rest works out well
Rivers's practice plans rerailed
As snow blanketed Boston over the weekend, leaving upward of 2 feet in many areas, Celtics coach Doc Rivers said he shoveled "a ton,'' watched a lot of basketball, and made gumbo, which he described as "terrific.''
He did venture outside for a bit because his oldest son, Jeremiah, was in town and wanted to see what blizzard conditions were like.
"He's from Florida, and he's never been in one, so I thought he should experience it,'' Rivers said Sunday, before his team beat Denver, 118-114, in triple overtime at TD Garden.
"We walked about a half-block, and he wanted to turn around. That was disappointing. But it was cool. It was really neat seeing the city with no one in it, at least no cars. It was great.''
The Celtics entered Sunday's game after two days off. The team had planned to practice Saturday, but canceled it because of the snow.
"Trust me, we tried everything we could [Saturday], even into the evening,'' Rivers said, adding that the Celtics' director of team security, Phil Lynch, advised against it.
Rivers said he contemplated holding a practice Sunday morning but decided against it. The Celtics also did not hold a morning shootaround. They did, however, come to TD Garden in the afternoon to hold a walkthrough at "a real pace,'' Rivers said.
"I don't know what that does, but it makes me feel better,'' Rivers said.
Denver played Cleveland Saturday and then headed to Boston. Logan Airport reopened at about 11 p.m. Saturday, and a Nuggets official said the team landed around 1:30 a.m. Sunday. Denver coach George Karl said his team was in bed by about 3:30 a.m.
Because of how late the team got in, and because it was playing on the second of a back-to-back, Karl said the energy level of his players was going to be an interesting, if not key, factor of the game.
At the start of the game, though, the Celtics looked like they were in a rhythm while Denver looked asleep. The Celtics jumped out to a 12-0 lead and the Nuggets had more turnovers (five) than shots (four). By the end of the game, the Celtics had more stamina — or at least it seemed that way after several Denver jumpers hit the front of the rim.
"It was a fun game, but I'm sure everybody was tired,'' Denver's Andre Miller said.
After the game, Kevin Garnett, who played 47 minutes, the most he's played as a Celtic, said he told Rivers, "I wasn't built for this.''
Deja vu for Karl
Karl knows what Boston is going through in losing a key player, then going on a hot streak. The Nuggets dealt star Carmelo Anthony to New York on Feb. 22, 2011, and Denver won 18 of its next 25 games to close the regular season. Several Nuggets, including those received in the deal for Anthony, stepped up. Of the Celtics, who are playing without All-Star guard Rajon Rondo, Karl said, "With Rondo on the court, you had more of a non-shooting team. They have more of a shooting team now.''
Karl added, "They're unique. They're a jump-shooting team, and they have a lot of guys that can make them.'' More than anything, Karl credits Paul Pierce, who he said has been "incredible.''
Back to Boston
Hours before tipoff, the Celtics recalled rookie center Fab Melo from their NBDL team, the Maine Red Claws.
Melo played one game with Maine during his most recent assignment, and had 6 points and 5 rebounds in 23 minutes against Bakersfield Friday.
Melo, who did not play Sunday, is averaging 11.0 points, 6.8 rebounds, and 3.45 blocks in 27.4 minutes per game in his 20 contests with Maine.
Balanced attack
Denver entered the game in fourth place in the Western Conference, riding a league-high nine-game winning streak. But no Nugget was named to the All-Star team. Instead, the team is winning with balance: six of its players average double-digit points.
So, how would Karl feel about being named the NBA's Coach of the Year? "I don't want Coach of the Year,'' he said. "Coach of the Year usually gets fired.''
Karl's remark was in reference to the firing of Brooklyn Nets coach Avery Johnson one month after he was named the Eastern Conference Coach of the Month in November.
Rivers praised the up-tempo, do-it-by-committee style of Denver, a style typical of a team coached by Karl and one that the Celtics have been playing lately. However, Rivers didn't think his team could be as balanced as Denver.
"Because we have a guy named Paul Pierce on our team that's pretty good and Kevin Garnett,'' Rivers said.
Garnett said he was "baffled'' that Denver has no All-Stars, adding that "the league really needs to check itself.''


text:
The new Alberta School of Performing Arts will be larger and more expensive than originally anticipated, according to the school's recently completed master floor plan.
TUSCALOOSA | The new Alberta School of Performing Arts will be larger and more expensive than originally anticipated, according to the school's recently completed master floor plan.
The floor plan was presented to the Tuscaloosa City Board of Education Tuesday by Executive Director of Facilities Jeff Johnson and Jim Ward, principal architect at WSV Architects. Johnson said the new school initially was going to be an elementary school to replace Alberta Elementary, which was destroyed by the April 27, 2011, tornado. Its originally was to be about 77,000 square feet and cost about $14 million.
But since the school was changed to a Pre-K through eighth-grade performing arts school, its size and cost have increased.
The floor plan for the school now is about 110,000 square feet and its cost is about $19 million. In addition, the school's 1,500-seat theater will be about 44,000 square feet, costing $11 million, Johnson said. The school and its auditorium are separate for insurance reasons, he said.
A potential problem for the school is parking, Ward said. The school's auditorium will have room for 375 people and its theater will seat 1,500 people, but there will only be about 340 parking spaces on campus.
Ward said he hopes the city will allow street parking for the school's annual year-end performances and other big events there.
Superintendent Paul McKendrick said he'd like to rent the school's theater out to the community for conferences and performances to make some extra money.
If the board approves the floor plan at its next meeting, Ward said things will be on schedule with a ground breaking ceremony on April 1. Construction would begin June 12 and the school would be completed and ready to open Aug. 5, 2014.
Ester Payton, the mother of an Alberta Elementary student, said the school's floor plan looks good, but she's concerned about the school opening on time.
"The kids are anxious as well as the parents," Payton told the board. "I'm also concerned about the safety of the school with it being so large."
Payton, other parents and Alberta faculty have said for months that they want to move out of the wing of the Tuscaloosa Magnet School, where Alberta Elementary's students have been since the tornado, and have their own school again.
Brenda Parker, Alberta's principal, said she's excited that the school is finally at the planning stage. She said Alberta's staff is preparing to receive professional development on how to implement performing arts into the school's curriculum.
"So far so good," she said.
The board also learned Tuesday that a construction grant that Deborah Tucker, executive director of Maude Whatley Health Clinic, applied for in June had received preliminary approval. Tucker said she expected final approval for the grant within 30 days.
Tucker applied in June 2012 for a $500,000 grant to build a school-based health clinic at the new school. The board OK'd Tucker's applying for the grant but it still must approve placing a clinic at the school.
"A school-based health clinic is not just a clinic on a school campus," Tucker said. "It's designed to help improve the health status of the school's students and their families.
"It's designed to help the school meet objectives surrounding students like immunization rates, preventing the flu, preventing diabetes, preventing obesity and dealing with behavioral issues," she said. "We also have dental services that can help students with dental issues, which is something that a school nurse can't do."
Tucker said the grant will pay for about 80 percent of the clinic's construction cost. The rest of the money will have to be raised.
If the clinic is approved, Ward said it'll be a stand-alone building. He said he doesn't know where on the school's property it'll be built.
Reach Jamon Smith at email@example.com or 205-722-0204.


text:
- Code Commit - http://www.codecommit.com/blog -
Bloom Filters in Scala (and all the fun that they bring)
Posted By Daniel Spiewak On October 13, 2008 @ 12:00 am In Scala | 16 Comments
This is a post I have been meaning to write for quite some time. Despite being an officially excommunicated [1] former-member of the Ruby community, I still like to keep up on the latest developments. A few months ago, my Ruby Inside [2] feed produced an interesting post introducing a new library by Peter Cooper (the author of Ruby Inside). Unlike the most "new" Ruby libraries which are most often just bad clones of Rails snibblets, Peter's WhatLanguage [3] seemed to be quite unique and interesting. For the first time in years, I was reading about an innovation in Ruby-land which actually sounded quite exciting. A good feeling to be sure.
In a nutshell, WhatLanguage (project page [4] at GitHub) is a statistical language identification API which analyses arbitrary input
String(s), scoring them against a set of built-in languages (including English, French, Spanish, Russian, and others). Add to that a little bit of meta-programming magic and the possibilities are eye-catching to say the least:
require 'whatlanguage' 'Here is some text to identify'.language # => :english '¿Hola, pero donde está su pelo?'.language # => :spanish
To be honest, I'm not sure what practical application I would have for such a library, but it sure looks like fun! Under the surface, the implementation is deceptively simple. WhatLanguage bundles a set of words for each language it supports. The implementation then searches these sets for each word in the string, aggregating a score for each language depending on whether or not the word was found. If exactly one language has a higher score than the others once the end of the string is reached, it is "declared the winner" and returned as a result. Otherwise, the analysis is undecided and
nil is returned. Simple, right?
The tricky part is somehow storing and searching those gigantic language word sets in an efficient manner. As it turns out, this isn't so easy. Just stop and consider the number of words which exist in your native tongue. Unless you speak a very strange, primarily-tonal language, the number is likely in the upper hundreds of thousands. Just going off of Peter's word lists, Russian is the real trouble maker, weighing in with a nearly one million word vocabulary. Any attempt to store that much data would require megabytes of memory and several minutes to process, even on a fast machine. Any sort of hash set is completely out of the question due to the nature of contiguous memory allocation, but can you imagine trying to perform a search traversal on a tree with almost a million nodes? Obviously, a more effective solution is required.
So far we have been focusing our imaginary efforts on data structures which guarantee 100% accuracy and full reversibility. That is to say, data structures which allow you to get out what you put in and which ensure that if something is "in" it will be found and if something is "out" it will not. After all, is a data structure without these guarantees really all that useful?
As it turns out, the answer is "yes". Consider a standard hash set as an example. Sets make absolutely no guarantee about the ordering of their elements. If you attempt to iterate over a set, you will eventually reach everything inside, but you cannot rely on a certain element coming before the others. Of course, the advantage we gain by making this trade-off is constant time [5] searching by item identity. Lists cannot achieve this performance, neither can arrays. If you want to search either one of these structures, you must look through every element from start to finish. So with hash sets, we have effectively traded a fundamental guarantee about our data for efficiency in some other respect.
The same is true for probabilistic sets. We don't actually need all of the properties of a set to implement WhatLanguage. For example, we don't need to actually retrieve a word from our dictionary, we only need to discover whether or not that word is in the set. In fact, we really only need our data structure to have two important properties:
Hash sets can make the first guarantee, but as we have already noticed, they don't really require any less memory than just storing everything in an array. Since we can't afford one million words-worth of memory per language, we need to come up with some way of storing information about the presence of an element without retaining the data it represents. In order to do this, we have to make one important sacrifice: accuracy.
We basically need to accept the fact that our data structure may sometimes return inaccurate results. As it turns out though, this is just fine. Remember, we're scoring languages one token at a time; an incorrect answer now and again isn't going to kill us. Given a large enough input string, a minimal percentage of inaccuracy will literally be lost in the noise.
As it turns out, there already exists a very old technique for accomplishing exactly these requirements. Bloom filters [6] have been around since the beginning of time (or at least the 1980s), but unfortunately very few developers are aware of them. In a nutshell, they precisely satisfy all of the needs we just finished enumerating. They provide true (not amortized) constant-time searches and will consistently return
true or
false for a given element, depending on whether or not the value is in the set. Occasionally they will give false positives (claiming that an element is in the set when in fact it is not), but never false negatives. This property is extremely useful in many applications, but it turns out that this is even more than we need for WhatLanguage.
Most importantly though, bloom filters are extremely compact in memory. Rather than storing an entire value, they hash every element to one or (usually) more indexes in an array of bits (0 or 1). In an optimal bloom filter guaranteeing no false positives, each element would correspond to precisely k bits of memory (where k is the number of hash functions, usually in the vicinity of 3 or 4). Once this hashing is complete, the value itself may be discarded. Thus, assuming an optimal bloom filter with 3 hash functions, the storage requirements for one million words would only be 375 KB of memory. Compare this to the 8 MB required just to store the pointers to each of the words, much less the values themselves! If we include the underlying character values, we start pushing closer to 20 MB.
375 KB for a million elements is impressive, but bloom filters can actually do a lot better than that. Remember, we agreed to accept some false positives. It's easy to imagine how even an ideal bloom filter (such as the one we have been analyzing) could have some inaccuracy, but if we're willing to live with a few more false positives, we can allow hash collisions and drop our memory requirements into the 200 KB range. Not bad, considering how much data we're storing!
So how does the magic actually work? We've hinted at the implementation in our analysis of memory requirements, but we're still missing some important details. Consider the following diagram (courtesy of Wikipedia):
Under the surface, a bloom filter is just an array of
boolean values. The length of the array is referred to as the width of the bloom filter. When the filter is empty, all of the array values are set to
false. To insert an element, we compute k different hash indexes in the array and set them all to
true. The real beauty of the data structure is the manner in which we handle collisions: we don't worry about it. Whenever one (or more) of the hash functions returns an index which is already
true, we simply leave that index as-is and move on. Thus, the procedure for inserting an element into a "full" bloom filter is precisely the same as inserting into an empty one: set all of the hash indexes to
true. In a sense, bloom filters can never be full, they just get less and less accurate.
Bloom filters define only one operation other than insertion: searching. To determine whether or not a value is in the set, we run all of our hash functions and find the indexes to which it corresponds. If all of these indexes are
true, then we can assume that the value is indeed in the set. Conversely, if any one of indexes is
false, then the value cannot be in the set since we would have set that value to
true upon insertion.
It is important to note that removal is not supported by bloom filters. Intuitively we could just take the value to be removed, calculate its hash indexes and then set the corresponding elements to
false. However, if any other values also hash to even one of those locations, we will be effectively removing it from the bloom filter "by accident". Subsequent searches for that value will hash to the index which we erroneously set to
false, resulting in a false negative on the search (saying that an element is not in the set when in fact it is). Fortunately for us, WhatLanguage only requires insertion and searching for values, removal is not on the agenda.
Well, this has probably been a nostalgic (for those of you who enjoyed your university days) stroll through the land of data structure theory, but we're still lacking one critical factor: a concrete implementation. Bloom filters don't sound that complicated on paper, but to do anything useful with them we're going to need some code.
Before we dive in, we might want to define some more precise requirements for our implementation. We're writing this in Scala, so it would be nice to implement bloom filters as a functional data structure. I'm not going to get into all the benefits of immutable data structures; suffice it to say, I really think that they're the only way to go for most serious applications. Unfortunately, in order to do this, we're going to need some sort of immutable, array-like data structure under the surface which provides random access in constant time. Sound familiar? [8]
This is actually where the whole saga of persistent vectors in Scala found its roots. The first time I tried to implement a functional bloom filter in Scala I made use of a conventional array under the surface with copy-on-write semantics. As you can imagine, this is hideously inefficient in both space and time. In order to solve the problem, I had to implement a data structure which was just as efficient for reading and writing, but which also shared structure with subsequent versions. Now, two months later, I've borrowed just such a design from Clojure and created a first-class implementation in Scala.
With a persistent vector now at our disposal [9], we can easily implement a persistent bloom filter by using a vector to represent our boolean indexes. Every time we perform an insertion, we will "modify" the relevant indexes, creating a new instance of the vector. This vector can then be used in our "modified" bloom filter, returned as a new instance of our container class. Since persistent vectors share unmodified structure between versions, so does our bloom filter. All of the hard work of efficient immutability is already done for us, we just need to implement a thin facade. We start out by defining the class skeleton:
import BloomSet._ class BloomSet[A] private (val size: Int, val k: Int, private val contents: Vector[Boolean]) extends ((A)=>Boolean) { val width = contents.length def this(width: Int, k: Int) = this(0, k, alloc(width)) } object BloomSet { def alloc(size: Int) = { (0 until size).foldLeft(Vector[Boolean]()) { (c, i) => c + false } } }
We'll keep all of our utility functions in the companion object. There's really no need to put them in the main class, and the JVM is able to optimize dispatch to static members to a slightly higher degree than it can instance members (
invokestatic). Technically, we don't really need the
alloc function, it just hides some of the boiler-plate involved in initializing a vector to a certain length. Note that this operation is extremely fast, even for high values of width. Despite the fact that we are creating a huge number of
Vector objects, very little memory is actually wasted. Even at this early stage in the implementation, the advantages of persistence are evident.
You'll notice that our bloom filter has three major properties: size, k, and width. As previously mentioned, k is the number of hash functions to be used, while width is the length of the array used to store the boolean values. These values have to be user-configurable because different applications will call for different optimizations. For example, implementing WhatLanguage requires the storage of almost a million elements per set. Obviously we would not want to attempt to use a bloom filter which only had a width of (say) 200. This wouldn't cause any errors per se (remember, bloom filters are never "full"), but the accuracy of such a filter would be almost nil. With a million elements all hashed into a mere 200 indexes, it is likely that that every single index would have a value of
true. Such a bloom filter would return
true when searching for any value, including those which were not inserted. We said we would tolerate some false positives, but we still want the results to be meaningful. Since the width of a bloom filter cannot be changed once data is inserted (at least, not without "losing" data), the user must be able to decide in advance how much space will be required and then instantiate
BloomSet accordingly.
The value of k is an even more interesting proposition. The intuition is that the larger our value of k (thus, the more hash functions we use), the greater the accuracy of our bloom filter and the fewer false positives we will return. This is technically true when the bloom filter does not contain very many elements, but as more and more values are inserted, higher values of k become problematic. Wikipedia has an excellent (and extremely readable) mathematical analysis [10] of this and other properties of bloom filters. As it turns out, the optimal value for k (one which will yield the fewest false positives) can be computed by the following expression (where m is the width and n is the size, or the number of elements contained in the filter):
For the sake of quick-computation, this is essentially equivalent to:
The equivalence isn't precise (logarithms are almost always irrational), but since we're already rounding the result to the nearest integer, we don't need to be too concerned.
While it would be nice if we could just auto-magically set k to the optimum value and be done with it, that just isn't the case. Like width, k cannot be changed after data has been inserted. Unfortunately, its optimum value is dependent on the number of items which will eventually be in the set. Since we don't really "know" this value within the data structure until after the insertions are complete, there is no way for us to self-optimize. To provide maximum configurability, we need to allow this value to be set by the API consumer on a case-by-case basis.
As an interesting aside, we can actually compute the accuracy of a bloom filter on a scale from 0 to 1 given values for width, k and size. In this case, accuracy is defined as the odds that a search result is indeed accurate (the chance of it not being a false positive). Wikipedia gives the following expression for this accuracy:
Thanks to the marvels of approximation, this is a fairly efficient computation on modern platforms. Translated into Scala, it looks something like this:
lazy val accuracy = { val exp = ((k:Double) * size) / width val probability = Math.pow(1 - Math.exp(-exp), k) 1d - probability }
As interesting as this minor detour has been, we still haven't arrived at a working implementation of the bloom filter data structure. We have the basic structure in place, but we still need to implement the two core operations: insert and search, rendered in Scala as
+ and
def +(e: A) = new BloomSet[A](size + 1, k, add(contents)(e)) def contains(e: A) = { (0 until k).foldLeft(true) { (acc, i) => acc && contents(hash(e, i, width)) } } protected def add(contents: Vector[Boolean])(e: Any) = { var back = contents for (i <- 0 until k) { back = back(hash(e, i, width)) = true } back }
Feels sort of anti-climactic doesn't it? After all that analysis, we find that it is possible to implement the essence of a bloom filter in less than 17 lines of code. Technically, I probably could trim this down to more like 8 lines, but this isn't an exercise in Scala golf. These three methods are just the materialization of all of the hand-wavy descriptions that we've spent the last five pages working through. Each time we insert an element, we calculate k different hash values and set the appropriate vector indexes to true. To find that element, we calculate the same k hashes and ensure that all of the indexes have an appropriate boolean value.
Those of you who are actually reading the code snippets rather than just blindly trusting my veracity will probably notice that I've omitted a fairly important function from the above sample; specifically:
hash. Somehow, we need to define a function which will simulate the existence of a potentially unlimited number of hash functions. Based on our usage of this function, we need to be able to grab a hash value for a given value and function index, restricted to a given width. This is not a trivial problem.
As a good developer, you should already be trying to think up ways to reduce the code involved in implementing these requirements. I mean, we could potentially just dream up a few dozen different hash functions with a fairly wide distribution of results. However, I don't know about you, but I really don't have that much imagination. I have a hard enough time developing just one solid hash function, much less dozens. What's more, if each hash function corresponds with a different method, then we can't really scale the number of hash functions to any integer k.
A better approach would be to create a single hash function and then skew its value n times for every n between 0 and k. Like most things that have to do with hashing, it's cheating, but providing we do our job right, it should give us a fairly decent way of computing the required k hash functions. Of course, the key phrase there is "do our job right". We need to make sure that we skew the initial hash value sufficiently for each successive hash, otherwise successive hash functions might get "stuck in a groove". For example, let's assume that each successive hash function is equivalent to the previous hash + 2. If we then inserted two elements into the bloom filter with k = 3, there would be the potential that the hash(0) for the first element would be precisely 2 greater than the hash(0) for the second. If this is the case, then hash(1) for the second would equal hash(0) for the first. Thus, the first and second elements would collide on two out of three indexes. Not exactly an optimal distribution.
To avoid this problem, we should be sure to skew the hash value by a different amount for each hash function. A convenient way of doing this is to use the number of iterations, or the index of the particular hash function. To further improve the distribution, we will also use the bitwise XOR operation rather than simple addition. It's not really intuitively obvious, but XOR is mathematically far superior for hashing and just as cheap in terms of processor cycles. Put it all together, and the implementation looks something like this:
def hash(e: Any, iters: Int, bounds: Int): Int = { Math.abs( if (iters == 0) e.hashCode else iters ^ hash(e, iters - 1, bounds) ) % bounds }
The final bit of math in this function mods our skewed hash value with the given bounds. Whenever we call hash, we always pass the width of the bloom filter. This is a trick that you'll see a lot in any hash-based data structure. Essentially, we're just mapping our hash value into the required domain. Hash values can be anything between -231 and 231 – 1, but our vector indexes can only be between 0 and width - 1. Just a rule of thumb, but any time you have a problem where you must "map values from a large domain to a more restricted one", mod is generally the correct approach.
Observant readers will notice that our implementation of
hash is a little inefficient. Actually, it's worse than just a "little" inefficient: it's downright terrible. Remember that we have to call this method once for every integer n between 0 and k. This isn't so bad, since k is usually comparatively small, but the real problem is our sneaky use of recursion within
hash. The time complexity of
hash is precisely O(n), where n is the number of iterations. Once you factor this in with the number of times we call this function and it is easy to see how the total complexity of computing k hash values is actually O(k2). Thus, for k = 4, we actually call
hash 16 times! You can imagine how this could get very problematic for higher values of k.
Technically, we could rewrite
add and
contains to compute the hash values incrementally from the bottom up. This would bring the hashing complexity down to O(k). However, this is a bit more elegant in terms of code, not to mention easier to talk about in a modular fashion. In practice, this inefficiency is only a problem for higher values of k due to the fact that computing a single-step hash value is actually a very fast operation. We will run into trouble in a little bit though when we attempt to optimize the bloom sets for shorter wordlists in WhatLanguage.
One of the important requirements of WhatLanguage that we haven't really touched on so far is the ability to store freeze-dried bloom filters on disk and then suck them back into memory quickly and efficiently. If you think about it, this requirement only makes sense since one of our primary motivations from the start was to avoid the burdens associated with huge word lists. After all, if our in-memory representation of a language is only a few hundred kilobytes, shouldn't the on-disk representation be no worse? Furthermore, if we had to parse a wordlist into a bloom filter every time we wanted to check a string's language, the performance imposition would be utterly prohibitive.
Fortunately, there is a fairly obvious format which we could use to efficiently serialize an arbitrary bloom filter. Recall that the real heart of a bloom filter is the array of
boolean flags, an array which can also be represented as an array of bits. We could very easily select these bits eight at a time, combine them together using bit-shifting and produce a
byte value which could be sent to an
OutputStream. Thus, a bloom filter with an array of
{true, false, true, true, true, false, false, true, false} would be stored as the following series of bits:
101110010, which in hexadecimal
byte form becomes
In addition to the array, we also need to store the size, k, and width of the bloom filter, otherwise it will be impossible to find anything reliably in the deserialized result. The Scala
store and
load methods to accomplish this are verbose, but fairly straightforward:
class BloomSet[A] ... { ... def store(os: OutputStream) { os.write(convertToBytes(size)) os.write(convertToBytes(k)) os.write(convertToBytes(contents.length)) var num = 0 var card = 0 for (b <- contents) { num = (num << 1) | (if (b) 1 else 0) // construct mask card += 1 if (card == 8) { os.write(num) num = 0 card = 0 } } if (card != 0) { os.write(num) } } } object BloomSet { def load[A](is: InputStream) = { val buf = new Array[Byte](4) is.read(buf) val size = convertToInt(buf) is.read(buf) val k = convertToInt(buf) is.read(buf) val width = convertToInt(buf) var contents = Vector[Boolean]() for (_ <- 0 until (width / 8)) { var num = is.read() var buf: List[Boolean] = Nil for (_ <- 0 until 8) { buf = ((num & 1) == 1) :: buf num >>= 1 } contents = contents ++ buf } if (width % 8 != 0) { var buf: List[Boolean] = Nil var num = is.read() for (_ <- 0 until (width % 8)) { buf = ((num & 1) == 1) :: buf num >>= 1 } contents = contents ++ buf } new BloomSet[A](size, k, contents) } ... }
It is interesting to note that
store is a good example of what David MacIver meant when he says that functional code good code [11]. I actually tried to write this in a functional style to start with, but I gave up after it became horribly ugly (having four nested folds is never a good sign). The imperative rendering (in this case) is concise and elegant, one of the many advantages of a hybrid languages like Scala.
This particular format for rendering a bloom set is almost precisely identical to the format used by Peter Cooper's Bloomin' Simple [12], the library which sits underneath WhatLanguage. However, due to hashing differences it is impossible to use his serialized bloom filters in Scala or vice versa.
So now that we have our magic bloom filter ready and waiting, it's time to take a crack at Peter's fancy language identifier! As it turns out, this is a lot simpler than the bloom filter itself. Conceptually, all we have to do is load a different bloom filter for each language and then use that bloom filter to check each input string token individually. For the sake of uniformity, we will convert all tokens to lower-case.
Of course, before we can load the language bloom filters we need to first store them, and we cannot store a bloom filter before it is generated. To that end, we need to create a simple Scala script (yes, a script) which reads in a file of newline-delimited words, inserts them all into an instance of
BloomSet and then stores the result in a corresponding language file. Scala's scripting functionality is actually quite good, especially for a statically typed language, and really deserves some better recognition. The complete language generator script is as follows:
import com.codecommit.collection.BloomSet import java.io.{BufferedOutputStream, File, FileOutputStream} import scala.io.Source val WIDTH = 2000000 def computeK(lines: Int) = (((9:Double) * WIDTH) / ((13:Double) * lines)).intValue for (file <- new File("wordlists").listFiles) { if (!file.isDirectory) { println(file.getName) println("==========================") val src = Source.fromFile(file) val count = src.getLines.foldLeft(0) { (i, line) => i + 1 } println(" Word count: " + count) val optimalK = computeK(count) val init = new BloomSet[String](WIDTH, Math.min(optimalK, 100)) println(" Optimal K: " + optimalK) println(" Actual K: " + init.k) val set = src.reset.getLines.foldLeft(init) { _ + _.trim } println(" Accuracy: " + set.accuracy) val os = new BufferedOutputStream( new FileOutputStream("src/main/resources/lang/" + file.getName)) set.store(os) os.close() println() } }
I originally created this script using JRuby, thinking of course that it would be much easier to perform a simple, one-off task like this in a dynamically typed language. Interestingly enough, the JRuby version was about twice as long and actually took dramatically longer to run. By "dramatically" I mean on the order of seventy times longer. The above Scala script takes just over 30 seconds to run on my machine using the wordlists from WhatLanguage [13]. This stands in stark contrast to the 35 minutes required for the JRuby script. Both scripts use the same underlying data structure to perform all the work (
BloomSet), so it's really hard to claim that one implementation was fundamentally slower than the other. In short: JRuby does not seem terribly well-suited for computationally-intensive tasks, even when most of that computation is taking place in Java-land. Anyway…
This script is fairly straightforward. The one interesting landmark is the fact that it actually makes two separate passes over the wordlist file. The first pass just counts the number of lines, while the second pass reads the words individually, converts them to lower-case and stores them in the bloom filter. This two-pass approach allows us to calculate the optimal value for k in our bloom filter. This contrasts with the Ruby implementation of WhatLanguage, which just uses 3 as a global default (the width is the same in both libraries). According to my math, this per-language optimization actually ekes out an average 2-3% better accuracy in the bloom filters. This means fewer false positives and nominally better language detection.
I say "nominally" because such a miniscule improvement in bloom filter performance actually makes very little difference in the grand scheme of things. Most strings are decidedly one language or another, meaning that results should be essentially identical between the two implementations. Regardless, it's the thought that counts. (right?)
Just for the curious, the script produces the following output when run:
dutch ========================== Word count: 222908 Optimal K: 6 Actual K: 6 Accuracy: 0.986554232499401 english ========================== Word count: 234936 Optimal K: 5 Actual K: 5 Accuracy: 0.9827068384240777 farsi ========================== Word count: 339747 Optimal K: 4 Actual K: 4 Accuracy: 0.9408664843803285 french ========================== Word count: 629569 Optimal K: 2 Actual K: 2 Accuracy: 0.7817441534106517 german ========================== Word count: 298729 Optimal K: 4 Actual K: 4 Accuracy: 0.9590696917792074 pinyin ========================== Word count: 399 Optimal K: 3470 Actual K: 100 Accuracy: 1.0 portuguese ========================== Word count: 386393 Optimal K: 3 Actual K: 3 Accuracy: 0.9148904670664727 russian ========================== Word count: 951830 Optimal K: 1 Actual K: 1 Accuracy: 0.6213162918878307 spanish ========================== Word count: 595946 Optimal K: 2 Actual K: 2 Accuracy: 0.7984358472107859 swedish ========================== Word count: 54818 Optimal K: 25 Actual K: 25 Accuracy: 0.9999999755910407
I'm not sure why Pinyin [14] only has a vocabulary of 399 words, but that seems to be the way things are. This means of course that we're storing barely 400 elements in a bloom filter with a width of 2,000,000. Needless to say, I wasn't surprised to see that the optimal k was in the mid thousands. Unfortunately, this is where our inefficient
hash implementation comes back to bite us. I discovered that if I were to allow a k value of 3470, even when only inserting 399 elements, the time required to process just the single language was upwards of 20 minutes. This may have something to do with the fact that 34702 is very, very large.
To get around this problem, I cheat and cap the k value at 100 in the script. This still produces a computed accuracy of 100% in the bloom filter, and it takes much less time to process. A fast
hash is actually even more important during lookups. Considering that we have to check each token in a string against each and every supported language, a fast lookup is crucial to ensuring performance of the final product. If it took even 10 ms to compute the hash of a single token when checking against the Pinyin language, the implementation would be completely unusable.
Now that we have our word lists encoded as bloom filters, we can turn our attention to slightly more important problems; specifically: what do we want the API to look like? I decided to base my Scala implementation primarily on Peter's Ruby API. However, there is one small wrinkle in this plan: WhatLanguage uses symbols for everything. That's fine and in line with Ruby idioms, and technically we could use Scala symbols if we really wanted to, but Scala is a statically typed language with a lot of powerful idioms of its own. It would be a lot more conventional if we found a type-safe way of representing the same concepts. To that end, I decided to go with a similar (but not identical) approach as exemplified in the following code snippet:
import com.codecommit.lang._ "Hello, this is a test".language // => english val wl = new WhatLanguage(english, french, spanish) val text = "Bonjour, my name is Daniel. Estoy bien. Como estas? Êtes-vous ennuyer?" wl.processText(text) // => Map(English -> 4, French -> 5, Spanish -> 6)
The neat trick of the day is our use of static values in scope as a form of type-safe symbol. We create a new instance of
WhatLanguage, passing it three instances of class
Language representing (oddly enough) the languages we wish it to use during the analysis. We can also use "
all" as a shortcut for enumerating every supported language.
Another cute little API feature is our use of the
lang "package" to bring everything into scope, including two implicit conversions and a small boat-load of language values. This is made possible by the fact that
lang is not actually a package but a singleton object. Even Scala does not allow values and functions as top-level elements in a package, but it does allow them within objects. Our import at the head of the snippet is actually equivalent to the following bit of Java:
import static com.codecommit.lang.*;
With all of this in mind, the rest of the library is fairly easy to create. All we need to do is design an algorithm which splits an input string into tokens, loops over each one keeping track of how many tokens are matched by each language, and finally selects the highest-scoring language from the result and returns its corresponding static value. As one would expect, this is easily accomplished:
package com.codecommit import java.io.BufferedInputStream import com.codecommit.collection.BloomSet import scala.collection.mutable.ArrayBuffer object lang { case object all extends Language("all") { val langs = List(dutch, english, farsi, french, german, pinyin, portuguese, spanish, swedish) override lazy val words = BloomSet[String]() override val toString = "All languages meta-variable" } val dutch = Language("dutch") val english = Language("english") val farsi = Language("farsi") val french = Language("french") val german = Language("german") val pinyin = Language("pinyin") val portuguese = Language("portuguese") val russian = Language("russian") val spanish = Language("spanish") val swedish = Language("swedish") implicit def conversion(str: String) = new { val language = new WhatLanguage(all).language(str).getOrElse(null) } implicit def languageToString(lang: Language): String = lang.toString sealed case class Language private[lang] (file: String) { lazy val words = { val is = new BufferedInputStream(getClass.getResourceAsStream("/lang/" + file)) try { BloomSet.load[String](is) } finally is.close() } override val toString = file(0).toUpperCase + file.substring(1) override def equals(other: Any) = other match { case lang: Language => toString == lang.toString case _ => false } override val hashCode = file.hashCode } class WhatLanguage(langs: Language*) { def language(str: String) = { val back = new ArrayBuffer[Language] var max = 0 for ((lang, score) <- processText(str)) { if (score > max) { back.clear back += lang max = score } else if (score == max) { back += lang } } if (back.length == 1) Some(back(0)) else None } def processText(str: String) = { val langs = if (this.langs.contains(all)) all.langs else this.langs val prime = langs.foldLeft(Map[Language, Int]()) { _(_) = 0 } str.split("""\s+""").foldLeft(prime) { (map, token) => langs.foldLeft(map) { (map, lang) => if (lang.words.contains(token.toLowerCase)) { map(lang) = map(lang) + 1 } else map } } } } }
Well, it's been a fun and informative journey through the fertile land of bloom sets and simple statistical language analysis. As usual, all of the source (and binaries) are available for download. It's a bit of a shame, but I didn't get a chance to discuss a number of rather interesting features also available in my bloom filter implementation (such as concatenation of bloom filters).
Bloom filters are quite interesting in and of themselves, and definitely a useful technique that every developer should keep in their back pocket. Peter Cooper definitely merits kudos for his implementation of WhatLanguage based on bloom filters, but despite the fact that I took the time to port it to Scala, I still don't see much practical benefit. At any rate, the library is now available in Scala; hopefully someone else will find it more useful than I do!
Article printed from Code Commit: http://www.codecommit.com/blog
URL to article: http://www.codecommit.com/blog/scala/bloom-filters-in-scala
URLs in this post:
[1] officially excommunicated: http://www.javalobby.org/java/forums/t101687.html
[2] Ruby Inside: http://www.rubyinside.com/
[3] WhatLanguage: http://www.rubyinside.com/whatlanguage-ruby-language-detection-library-1085.html
[4] project page: http://github.com/peterc/whatlanguage/tree/master
[5] constant time: http://en.wikipedia.org/wiki/Constant_time
[6] Bloom filters: http://en.wikipedia.org/wiki/Bloom_filter
[7] Image: http://upload.wikimedia.org/wikipedia/commons/a/ac/Bloom_filter.svg
[8] Sound familiar?: http://www.codecommit.com/blog/scala/implementing-persistent-vectors-in-scala/
[9] at our disposal: http://www.codecommit.com/blog/misc/implementing-persistent-vectors-in-scala/final/Vector.scala
[10] excellent (and extremely readable) mathematical analysis: http://en.wikipedia.org/wiki/Bloom_filter#Probability_of_false_positives
[11] Image: http://www.drmaciver.com/2008/08/functional-code-not-equal-good-code/
[12] Bloomin' Simple: http://snippets.dzone.com/posts/show/4235
[13] wordlists from WhatLanguage: http://github.com/peterc/whatlanguage/tree/master/wordlists
[14] Pinyin: http://en.wikipedia.org/wiki/Pinyin
[15] Download whatlanguage: http://www.codecommit.com/blog/misc/bloom-filters-in-scala/whatlanguage-0.1.0.jar
[16] sources: http://www.codecommit.com/blog/misc/bloom-filters-in-scala/whatlanguage.zip
[17] Download collection library: http://www.codecommit.com/blog/misc/bloom-filters-in-scala/collection-0.1.0.jar
[18] sources: http://www.codecommit.com/blog/misc/bloom-filters-in-scala/collections.zip
[19] Download BloomSet.scala: http://www.codecommit.com/blog/misc/bloom-filters-in-scala/BloomSet.scala
Click here to print.
All content copyright © 2010 Daniel Spiewak. Distributed under Creative Commons.
All code (unless otherwise stated) is licensed under the BSD License.


text:
FREE Vehicle Search: Enter a VIN or Plate
Get Answers To Your Questions: Get The AutoCheck Report
Step 1. Find your Car
Search by vehicle identification number (VIN) or US license plate to find the car you want to research.
Step 2. Pick your Plan
Multiple Reports if you're still shopping and considering many vehicles. A single report might be right for you if you've found your dream car and are ready to buy.
Step 3. Subscribe and Check Vehicle History
from your desktop or mobile device. One time fee. No recurring charges
Why do used car shoppers
choose AutoCheck?
Here's what people are saying:
"AutoCheck was well worth every penny I paid - saved me lots of time & money (made dealing with auto dealers 100% easier). I would certainly recommend AutoCheck to anyone in the market for a vehicle." - Satisfied User
"I owe my success in buying a used car to you guys. Your research and data gathered is invaluable input to this important buying decision. Thanks for being there." - Recent Purchaser


text:
Three Goals for Magnuson
NEW HAVEN, Conn. – It took about 30 minutes for the Yale women's lacrosse team to shake off the rust in the season opener Saturday morning at Reese Stadium vs. Holy Cross. The Bulldogs fell behind 7-3 at halftime, but the second half was a different story. A pair of goals by junior midfielder Erin Magnuson jump-started a seven-goal run by the Bulldogs, and they wound up limiting the Crusaders to just one goal in the final 30:43 to come away with a 10-8 win.
"I think in the first half we were just too amped up, with it being our first game," said Anne Phillips, Yale's Joel E. Smilow, Class of 1954 Head Coach of Women's Lacrosse. "We played fast, but we weren't deliberate when we needed to be. We turned the ball over too much."
The first half actually got off to a very brief good start for Yale, as sophomore midfielder Kelly Anne Sherlock drove in for the game's first goal just over a minute in. A free position goal by Magnuson then put Yale up 2-0 two minutes in, but the rest of the half was controlled by the Crusaders. After four Holy Cross goals in a span of 13 minutes the Bulldogs called timeout, but Holy Cross (0-3) tacked on one more to extend its lead to 5-2 before sophomore attacker Nicole Daniggelis got one back on a free position shot for the Bulldogs. Crusaders attacker/midfielder Kate Martino then scored a pair in the final minute, part of a three-goal day for her, to make the lead 7-3.
The Bulldogs had committed 11 turnovers in the first half (compared to three by Holy Cross), but in the second half Yale committed just seven and Holy Cross committed eight. The Bulldogs also continued to dominate on the draw control -- they won 14 for the day, including eight by Daniggelis. Those numbers added up to plenty of possession time in the second half, and the Bulldogs took advantage of it.
"Defensively, we made stops in the second half that gave our attack time," said Phillips. "Our defense stiffened, the momentum shifted, and that's how we were able to come back."
Magnuson's pair of free position goals in the first five minutes of the second forced Holy Cross to burn a timeout, but that did not slow the Bulldogs. With 24:13 left in the game, junior midfielder Christina Doherty drove to goal and scored -- despite being fouled -- to pull Yale within one.
One of those Holy Cross turnovers then enabled Yale to tie the game, as sophomore defender Flannery Carney scooped up the ground ball in Yale's defensive zone and freshman attacker Tess McEvoy scored the game-tying goal after the clear. Yale's defenders wound up with seven of the team's 12 ground balls, led by three from senior captain Adrienne Tarver.
Senior midfielder Julie Mongan then delivered the go-ahead goal with 18:31 remaining, her third career goal -- and perhaps a sign of more to come.
"Julie Mongan did some really good things today, and helped us in transition," said Phillips. "I think she's going to perform at a high level for us this year; she'll be a player to watch."
Another goal by Doherty forced another Holy Cross timeout with 17:08 left, but senior attacker Jen DeVito added Yale's 10th goal shortly after that.
A crease violation wiped away a Holy Cross goal with less than 10 minutes to play, but the Bulldogs caught a tough break after that when McEvoy's free position shot hit the post. The Crusaders were finally able to creep closer when attacker/midfielder Sara Hennessey scored on a free position with 7:05 left.
But that would be as close as the Crusaders would get. Yale senior goalkeeper Erin McMullan came up with one of her best saves of the day to deny midfielder Avery Giorgio from the doorstep with three minutes to play, and after that Yale spent most of the final minutes running out the clock. McMullan finished with seven saves.
"Erin McMullan played well, and made some big, timely saves," said Phillips. "She also did a good job on the clear, using the clock to our advantage."
Yale (1-0) travels to Sacred Heart for a 4:00 p.m. game next Wednesday.
Report by Sam Rubin '95 (email@example.com), Yale Sports Publicity


text:
Schaeffler applies cookies to secure an optimal use. With the further use of this website you accept the application of cookies. More Information
Enquiries on environmental protection should be directed to
Environmental Site Officer
The Barden Corporation
200 Park Avenue
Danbury, CT 06810
Tel. +1 203 794-8235
Fax +1 203 794-8227
Eco-Audit and Certification to ISO 14001
An Integral Part of our Company Philosophy
Environmental protection as a company objective – what does it mean to us? For many years, an environmental philosophy has had number one priority in product development, purchasing, production and the supply and disposal of materials. Active environmental protection is thus an integral part of all areas of our business. We are convinced that positive environmental management helps to secure the progress and success of our Company.
With the validation and certification of our manufacturing facilities, we are taking a leading role in environmental protection. The plants of the Schaeffler Group have been certified to ISO 14001 at every location worldwide. Many locations, even outside Europe, have also been validated according to the even stricter EMAS (Eco-Management and Audit Scheme) program.


text:
You have no items in your shopping basket.
Ambience Hardwood Flooring
orders over £50*
Request your samples here
Read our customer reviews
Over 300 floors on display
Currently Shopping by
Shopping Options
We accept all major Credit Cards and Paypal.
Ambience Hardwood Flooring is a trading name of Kitchener Flooring LTD - Registered in England.
Unit 5 Euston Street, Freemens Common, Leicester, LE2 7ST
Tel: 0116 2741050 Fax: 0116 2741046 Intl: +44 116 2741050
Company registration number 5868645 VAT no. GB835055142
© 2019 Ambience Hardwood Flooring. All Rights Reserved.
Unfortunately we only have in stock, we are due more stock on .
Please call 0116 2741050 to pre-order


text:
- Description
Quick Overview
Rejuvenate, nourish and cleanse your skin with the Herb &Veda Rose Handmade Soap. This super moisturizing glycerin soap is made with the essence of rose, which makes you feel luxurious. Beneficial for all skin types, it leaves your skin soft and smooth.
- A super moisturizing glycerin soap made with essence of Rose
- Beneficial for all skin types though, leaves skin cleansed and refreshed
- No synthetic ingredients
- Safe and natural
Additional Information: Herb & Veda under the flagship of Emporium is a company that brings you herbal soap and skincare products. Our mission is to establish Herb & Veda as an important brand that represents quality in skin care.
Explore more from our Herbal/Ayurvedic Soap collection here
- Reviews (0)
Ask Nykaa (0)
Have a question on this product? Write a question and earn 100 reward points.
No questions yet. Ask and answer questions to earn 100 points (=Rs.1) each time!


text:
Don't see your question? Visit our help section.
Get access to great in-store deals and local pick-up
Sign up for our email deals newsletter!
Compared to previous iPhone models, the iPhone 6s Plus is an upgrade in almost every way. Faster processing, quicker WiFi, better cameras, and a sturdier frame makes the iPhone 6s Plusstand out from its older siblings. GameStop's refurbished iPhone 6s Plus comes with a power adaptor, sync/charging cable, and new Ear Buds.
Do you have old devices laying around? Sell them for cash at GameStop. Check the value of your devices on the GameStop App.
Want a new console or game, but your entertainment funds are running a little low? Now you can trade in your old iPhone for cash or credit toward the games, systems and accessories you've been holding out for! Find out how much your old iPhone® or Android phone is worth.
Pro Price


text:
He's just shocked—shocked!—at what happened the other day, at least now that someone's finally noticed it. Brown's response here only prompts additional questions: Does someone else do his tweeting for him? (If so, this person is awfully prolific.) Does Brown ordinarily approve every tweet before that someone else presses "Send"? Was Brown—gasp!—hacked?
Brown also apologized publicly yesterday to Scott Mitchell for saying he once deliberately didn't block for him, though Brown also said he initially didn't regret the play when it happened. At least he didn't blame anyone else.
Previously: ESPN's Lomas Brown Spent His Christmas Insulting People On Twitter
h/t to B Ryan


text:
- About us
- Blogs
- Funding/Donations
- Challenges
- Chapters
- Papers
- Projects
- Code of Conduct
- Google SoC
- Recent posts
- Security Workshops
This was the second year of operations for the Kenya Chapter.
Read more »
This was our inauguration year and first year of operations. The biggest milestone was bringing the team together and setting off on the research projects.
We managed to get a representation at the Annual Workshop held in Dubai in February 2013 and that gave us good contact with existing members of the Global organization. One fruitful area of collaboration has grown from the Polish team through Piotr Kijewski to receive feeds about Kenya from the Polish CERT.
Current chapter members: Read more »


text:
Goes Viral
" Internet meme generators have found a new subject for the ongoing Ridiculously Photogenic meme series, 30-year-old Rafael Nunes. A photo of The Ridiculously Photogenic Homeless Guy from Brazil has gone viral online.
The Ridiculously Photogenic meme series began with the "Ridiculously Photogenic Guy," moved on to the "Ridiculously Photogenic Girl," and then on to the "Ridiculously Photogenic Puppy." Now we have the Ridiculously Photogenic Homeless Guy.
The Huffignton Post reports that according to the Portuguese language website Reidaverdade.com, the photo of Rafael Nunes was snapped by a tourist in the Brazilian town of Curitiba. The photo has gone viral on Facebook, Imgur and Reddit."
Related articles
- Do you guys remember "Ridiculously photogenic homeless guy"? Well, i'm from his town and we started a campaign to get him off the streets. This morning we got him on a 8 month crack re-hab program. (imgur.com)
- Ridiculously Photogenic Homeless Guy Snapshot Goes Viral (news.softpedia.com)
- Top 5 Funniest Internet Meme Costumes (techeblog.com)
- The Ridiculously Photogenic Football Player Meme (buzzfeed.com)
- Most Photogenic Dog on the Internet (savingbenji.com)
- The life of New Zealand's latest criminal celebrity: the ridiculously photogenic Daniel Tohill (Lohill) (ridiculouslyinteresting.com)
- How to Use YouTube, Email, and Facebook to Make $10,000 (blogs.constantcontact.com)


text:
A few years back there was talk of making the case directly to Tokina with a petition. As far as I know, this never happened. (If it did, it doesn't seem to have had an effect!)
As a result, I've taken the liberty of creating a petition with the aim of getting Tokina to see the market for this lens.
If you're in agreement, please sign away! At the same time, if you're able to write something in the comments section of the petition as you sign it (e.g. your thoughts on the lens, if you think you would buy it, etc.) that will lend it much more weight.
All the best,
P.S. If anyone with a website would like to advertise this petition and therefore make it more effective, please let me know and I can send you the code for a 'widget'. I think.
Edited by drpepper, 04 October 2012 - 03:24 PM.


text:
Sale Date Ended
PMP Workshop Payment for Group Nomination
Sale Date Ended
Page Views : 302
Project Management Professional (PMP®) – Next Benchmark in your career growth
Certified Project Management Professional (PMP®) is a credential from Project Management Institute, USA (PMI) accepted globally over the last 25 years. It recognizes your capability among employers, clients and colleagues that you follow a structured approach, methodology, tools and techniques aligning to PMI's global standards to bring projects to successful completion. Industries as diverse as Oil and Gas, Aerospace, IT, Healthcare, Infrastructure, Automotive, Banking/Financial services etc. have come to rely on PMI credentials when they are embarking complex and business/safety critical projects.
Faculty Profile
P Seenivasan PMP, PgMP has 28 years of experience in the domains of Program and Project Management, Process Quality and Software development. The software development experience is from the area of New Product Development in ERP and web applications. He holds his B.Tech degree in chemical engineering from University of Madras with a Master degree in Business Administration. He is a Certified Quality Analyst (CSQA) from QAI, USA and certified PMP and PgMP through PMI, USA. PS was one of the founder directors of PMI Pearl City Chapter, Hyderabad and served the chapter during 2001 – 2006.
K.S.R Gopal PMP has about 35 years of experience in the fields of Project Management and General Management. His vast industry experience includes Fertilizer, Fine Chemicals, Heavy Chemicals, Bulk Drugs, Agro Products, Food Processing and IT. The Project Management experience has been in all the areas from Conceptualization till Commissioning. K.S.R Gopal has a Bachelor Degree in Mechanical Engineering and Chemical Engineering and a Post Graduate Diploma in Management Studies. He is a certified Project Management Professional (PMP) through PMI, USA. He teaches Project Management courses regularly for the PMI Chapter workshops and at Center for Organization Development (COD).
PMP Credential Process overview:
Any Graduate degree or global equivalent
3 years of project experience in directing and managing activities accruing to 4500 hours of effort
35 Hours of mandatory formal training in Project Management
An application review and approval by PMI and payment of Exam fee
Random audit to validate the details you have submitted to PMI
Multiple choice examination to demonstrate your ability to apply your knowledge, skill and behavior as a Project Management Professional
Program highlights
Participants will learn a complete overview of PMI's Project Management Body of Knowledge (PMBOK) covering the 5 Process groups and 10 Knowledge areas. Below are some of the critical learning points.
How to develop Project Charter and perform Stakeholder Analysis
Collect Requirements and develop Project Scope
Build Work Breakdown Structure
Build and optimize schedule through PERT/CPM
Earned Value Management
Quality Assurance and Quality Control Timely, Relevant & Effective Project CommunicationIdentify, Analyze & Respond Project Risks.
How to manage procurement and select Contract Type
Code of ethics & Professional conduct for PMPs
Project Management – Key differentiators
Integrated approach to Project Management Knowledge Areas
Cost Performance Baseline
Integrated Project Management Plan
Integrated Change Control
Earned Value Management
Stakeholders Engagement
Project Management Methodology
Performance Measurement Baseline
Project Management Office
Lessons Learned
Organizational Process Assets
Workshop Benefits
Access to e-learning portal for chapter-wise mock exam and one full PMP Prep simulation exam
An innovative first of its kind Process cum Data Flow Diagram based on the PMBOK® Guide content
A well-researched condensed Course material and a Workbook
Test taking strategies for the PMP® Certification Exam
Ongoing assistance to submit PMP application & support


text:
The average individual suffering from an addiction needs $200 per day to support the disease.
Abuse of prescription opioids like OxyContin and Vicodin has climbed 342% from 1993 to 2005.
About three million cases of child abuse are reported each year in the US. Three out of four involve drug or alcohol abusing parents.
More than 1,700 high school and college students die of alcohol poisoning or alcohol-related injuries each year.
Nearly 1 out of 5 people detained in American prisons committed their offences to obtain money for drugs.
Currently, an estimated 25 million Americans are addicted to drugs and alcohol.
If you do not suffer from an addiction by the age of 25, you are less likely to become addicted.
From 1992 to 2003, the abuse of controlled prescription drugs by 12 to 17 year olds more than tripled, rising to $2.3 million.
Among the homeless adults in shelters, almost 90% are alcoholics and alcohol abusers: more than 60% are drug addicts or abusers.
Almost 50 percent of Americans struggling with addiction do not receive treatment due to insurance barriers.
About 135,000 people die each year as a consequence of alcohol and drug abuse, not including tobacco.
Twenty-two percent of full-time college students meet criteria for alcohol and drug abuse.
More than half of all adults have a family history of alcohol abuse.
For each unemployed substance abusing woman on welfare who becomes self-supporting and maintains sobriety, the annual benefit to society is about $50,000.
Twenty-two percent of full-time college students meet criteria for alcohol and drug abuse.
Twenty-five percent of all people admitted to hospitals are admitted for problems related to alcohol.
Studies show that every dollar spent on treatment leads to a $7.46 reduction in legal, social and other costs to taxpayers.
About 335,000 people die every year as a direct result of their use of tobacco products.
Theories posit that people suffering from addiction self-medicate a physical, emotional or spiritual hurt.
In 2004, NIH set the annual costs of underage drinking at $19 billion from traffic accidents and $29 billion from violent crime.
An estimated $31 billion of Medicare inpatient hospital costs—some 25% of all Medicare inpatient hospital spending—are attributable to substance abuse.
Ninety percent of property crimes and muggings are related to drugs.
Cocaine overdose caused approximately 25,000 emergency room admissions in 1997.
Substance abuse is a chronic disease affecting nearly 1 in 10 Americans over the age of 12.
Expert estimates of the number of crimes committed by one single drug addict range from 89 to 191 a year.
Approximately 80% of all crime in the US is related to drug or alcohol addiction.
People who have been drinking are at greater risk of being the victim of a violent crime.
Teens who attend religious services regularly are less likely to use drugs, alcohol and tobacco than those who do not attend.
Less than 20 percent of Americans who need treatment receive it.


text:
Kuijer wanted in killing of step-son
Niagara Regional Police are seeking Canada-wide arrest warrants for Justin Kuijer for first-degree murder and attempted murder in connection to the death of a seven-year-old St. Catharines boy and a Friday stabbing at a local bank.
On Sunday Const. Phil Gavin said police would apply for the warrants this morning when the courts open, and that the 43-year-old Kuijer is still considered to be armed and dangerous.
"We are talking about serious criminal offences here. Two families have suffered tremendously by these violent acts. This has impacted the entire community," Gavin said during a press briefing at the NRP's St. Catharines office. "We are asking anyone who has information about Mr. Kuijer to call 911."
Kuijer was already wanted for attempted murder after a man entered the RBC on Martindale Road Friday morning and stabbed an employee.
Gavin said police believe the woman was deliberately targeted, and the attack was neither the result of a domestic dispute nor a robbery gone bad. Police said the victim was known to her assailant but police are still trying to determine the motive for the attack.
About 10 minutes before the bank attack, a 911 call was made from an apartment at 173 Queenston St., where Kuijer's stepson, Nathan Dumas was found critically injured. He was discovered in the apartment by his mother Whitney Dumas.
The boy died at St. Catharines hospital Saturday morning.
The boy's mom said she arrived at the apartment at about 10:15 a.m Friday and was met at the front door by Kuijer, her ex-boyfriend, who had his bags packed and was ready to leave. The pair had been together for nearly six years, and Dumas had recently broke up with him.
"I said to him, 'Well let's go inside and talk about arrangements for our kids.' We have three kids," Dumas said in an interview with The Standard. "He asked for my keys to my van so he could go get a coffee. That's when I went into the house and found my son."
The cause of Nathan's death is not being released by police for investigative reasons, said Gavin.
"He was the kindest little boy you'd ever meet. Everybody loved him," his mom said in a tear-filled interview. "He was such an old soul."
Dumas said a friend of Nathan's lost an eye in an accident more than a year ago, and received a donated eye.
"He had two different eye colours, so I had to explain to Nathan why that was. And he said to me, 'Mom, that is what I want. If something ever happens to me, that's what I want,'" Dumas said.
"But we can't do that (donate Nathan's organs) because of the measures they took to try and save his life."
Dumas said she doesn't understand why anyone would want to hurt her son other than as a way to hurt her.
Dumas's Queenston Street apartment had been sealed by police until Saturday as part of their ongoing investigation. Gavin said the apartment has been released by police, but officers are remaining there as a security precaution.
"I don't have anything right now," Dumas said Saturday. "I don't have clothes for my kids. I don't have clothes for me. My whole world has been ripped apart. I just want justice for my son and for that lady at the bank. I want him found."
Friends of Dumas launched a Go Fund Me campaign to help pay for Nathan's funeral. In a Facebook post Saturday, Dumas said funeral arrangements for her son are being covered Victims Services Niagara.
Gavin said police will not discuss how the death of Nathan and the stabbing at the bank are connected.
He said the victim of the stabbing remains in stable condition. Her name and the hospital she is at are not being released as a security precaution while Kuijer remains at large, Gavin said.
Police began a manhunt for Kuijer, 43, of St. Catharines for attempted murder after the attack at the RBC Friday morning.
Police believe he is in Dumas's grey 2009 Pontiac Montana van with the licence plate BYTE 392.
Gavin said there is a floral sticker on the back of the van in memory of missing women in Canada related to Ashley Simpson, a St. Catharines woman and Dumas's friend who disappeared in British Columbia in 2016.
Police do not know where Kuijer is, and have been in contact with other law enforcement agencies, including Ontario Provincial Police and border patrol officers, as part of their investigation, Gavin said.
He urged Kuijer to turn himself in peacefully.
Police are asking anyone who knows the location of Kuijer or the van to call 911.
Kuijer is described as white with a thin build, trimmed beard and longer dark hair. He was wearing a black tuque, brown leather coat, dark pants, boots and an orange hoodie.


text:
Drift from Driftshire
Andytats in the Landy lol
Gregster towing Landy above
Rospicer in the Wrangler
Loneranger the local.
Le Wilberforce (plus Roxie, the brains of the outfit)
RatCav Troopering
Vauxsqueeks & minisqueeks
Snapper, OiC HF and quite possibly the teenager!
Laz3484 (and maybe my son for part of it)
Taylor6632 in the 2.8
Bobbinsjob n Maria
Geeks in The Hulk
JEOH n Marion in GodZilla
Robfog in something (need to buy it first)
Fudge in the merc..... and maybe needing a tow onto the camp site or drifting tests
Horses45 and Aurora with Ria if we can find something to stay in as our caravan was killed on the way back from the woods last year or a daily visit ?
Jellybaby and lad


text:
Welcome to SILVER Sewer & Drain Plumbing Service Online!
"Your one-stop plumbing services company"
At SILVER Sewer & Drain Plumbing Service, we provide fast, reliable and guaranteed service for all of your plumbing and heating needs. Since 1991, we have provided Ventura County with superior, customized service on a wide variety of residential and commercial plumbing and heating concerns.
SILVER Sewer & Drain Plumbing Service has the training, experience and knowledge to get the job done right. From repairs to installations, we pride ourselves as your "one-stop plumbing service provider:"
- Residential plumbing specialists.
- Tankless Water Heaters - we are manufacture certified in sales, repair and installation of Rinnai, Rheem, Noritz, Navien & Jacuzzi-Lowes brand.
- Standard gas or electric water heater repair or replacement usually the same day you call.
- Commercial plumbing services and maintenance agreements
- HOA service providers
- Heating & Air-Conditioning sales, repair and installation
- Water, fire, smoke and mold restoration services
Our Service
We've been serving the Ventura County for over 20 years. You can expect our service team to be professional and courteous, to make sure we answer all your questions and provide the highest quality of work. We gladly offer free estimates.
Our Guarantee
Integrity, service, value and 100% customer satisfaction are our guarantee to our customers.
Our two local service centers are in Ojai and Ventura, so in the event you are having a plumbing emergency, we will be available immediately.
Your call is answered by a licensed plumber 24 hours a day, 7 days a week. Call (Scott)805-646-0523 or 805-969-7337. Weekend Prices Same As Weekday Prices.


text:
Hands On with LiveAndroid: Android On Your Laptop, The Easy Way
First, a disclaimer. LiveAndroid is in no way a complete (or even remotely usable) netbook OS at this point. The most current release, Version 0.2, does not support Wi-Fi, sound, or even a usable pointer on a hardware machine (though there is a mouse in Virtual PC). It also seems to be extremely unstable; the one laptop I could get it running on would go into an infinite loop of suspending and waking up if I left it alone for too long.
Despite my continued efforts, I couldn't get Android to boot from either a USB-attached CD-ROM drive or thumb drive on any of the netbooks in the PC Mag Labs, a problem which the LiveAndroid team says they are in the process of fixing.
And that's about it. Internet connectivity via wired LAN is technically possible, but I wasn't having much luck setting it up on the Toshiba. Without the Marketplace (not included in the open-source version of the OS, but on the to-do list for future versions of LiveAndroid), you're limited to the apps that come with the OS. And without Internet connectivity, you're completely out of luck unless you really enjoy staring at a clock all day.
Overall though, the user experience doesn't seem too shabby on a netbook, with its simple method of accessing applications and a widget-oriented UI. Seeing as I wasn't able to use the browser, the critical "net" part of the netbook went untested. With Android's Webkit-based browser, I wouldn't expect it to reach the same level of compatibility or speed as Chrome OS likely will when it's released, or even that of Firefox on Windows XP and Linux machines.
Really though, what makes Android really exciting as a bootable CD isn't usability,: It's the idea that the operating system may be usable in the future. It puts one of the most talked about mobile operating systems within everyone with a CD burner's grasp. Sure it crashes every 5 minutes or so, but it's the future! And the future is always buggy until it becomes the present.


text:
Pretty Peacock Sticko Stickers
See Some Similar Items
Click Picture to Zoom
Item: 015586960303 - Type: Stickers.
STICKO-Classic Stickers. Sticko flat stickers are available in a variety of designs and themes to fit any and every occasion. They are ideal for embellishing cards, scrapbook pages, craft projects, and so much more. This package contains Pretty Peacock: nineteen stickers on a 4x7 inch sheet. Imported.
123Stitch.com ships via the U.S. Postal Service to anywhere in the world. Orders to the U.S. typically arrive 3-5 days after we ship.
Shipping charges are shown in your shopping cart every time you add an item.
If you are not completely satisfied with any of our products, you can return it to us within 30 days for a full refund.
|More Items Like Pretty Peacock Sticko Stickers
Go to Page: 1 2 3 4 5
Cross Stitch, Fabric, Floss, Thread, Quilting, Rubber Stamps and Dies


text:
The First day of school. I have a fifth grader and second grader. It really does go by fast!
Fiona's edible cell project. She did all by herself.
Walk to school day.
Having lunch with Aida. Kellyn loved the hot lunch!
Going on camping trip over Labor day. We had some much stuff, it was crazy!


text:
Custom Full Color Rectangle Soft Vinyl Key Fobs!
Full color mobile branding! Use for Branding, Fundraising Programs, Member Contacts, Identification Cards & More! These Key Fobs are easy and economic to package and distribute or mail!
Piece Size: 1 x 3.125"
Imprint Size: .875 x 3"
Durable, soft and flexible Sof-Color Economy vinyl.
White, vinyl product color only.
Compliant with state and federal product safety regulations.
Second Side Imprint Available
Notes: During checkout, please include design and information instructions. You will receive a proof within 72hrs (3 Business Days) for approval. We will allow up to 3 proof changes at no additional cost.
If you are supplying any artwork, email artwork to firstname.lastname@example.com
Select your options below!
Thanks for using SDW for your Auto Dealer Supplies, Marketing Materials, Balloons, Banners, Drop Boxes, Flags, Forms & Folders, Hang Tags, Key Tags, As Is Buyers Guides, License Plate Frames, License Plates, Windshield Numbers and all your Dealer Products.


text: EditableChristmasCouponBook This post may contains affiliate links. For more information, see my disclosure here. 0 comment 0 Facebook Twitter Google + Pinterest Liz Liz Eischen is the Founder and Content Writer for Kitchen Table Finances. She is digital engagement specialist by day and a personal finance blogger by night. Through her blog, she is teaching millennials how to start on their own personal finance journey and navigate finances through side hustles, stories and resources. Leave a Comment Cancel Reply Notify me of new posts by email. This site uses Akismet to reduce spam. Learn how your comment data is processed.


text:
Is It Time to Reform the 401(k)?
America's self-directed retirement system -- the 401(k) and similar products -- is complicated, expensive, and rife with conflicts of interest.
Last month, PBS's Frontline aired a blockbuster episode on America's retirement system. You can watch the whole thing free online.
It featured some of my heroes, like Vanguard's John C. Bogle, and some of my favorite financial writers like Helaine Olen and Jason Zweig.
The show argued that America's self-directed retirement system - the 401(k) and similar products - is complicated, expensive, and rife with conflicts of interest.
I agree, and I've written extensively about how 401(k)s charge hidden fees, offer bad investment options, and are generally incomprehensible.
But in discussing the show with some of my favorite financial thinkers, I realized that while everyone seems to agree that the system needs to be fixed, there's a major philosophical divide about how to fix it.
Forgetting about political feasibility for the moment, the question is this: Should we reform the 401(k) or get rid of it and replace it with something else?
Small Steps
Allan Roth, a Utah-based certified financial planner and blogger for CBS News, says we should give every worker access to the federal government's Thrift Savings Plan (TSP).
"Personally, I'd love to roll my IRAs to the TSP to both get access to the G fund and lower cost stock funds," says Roth.
The TSP is the model for what every 401(k) should be like: Its only investment options are ultra-low-cost index funds, plus the G fund, a government bond fund that never loses principal.
"Americans need to save more and the best way to get them to do this is to force them to affirmatively opt out of saving," says Dave O'Brien, a certified financial planner in Midlothian, Virginia.
O'Brien sees the 401(k) system from both sides; he advises clients who are saving for retirement and also companies who want to design a better 401(k) for their employees.
All too often, O'Brien sees people taking 401(k) loans for foreseeable emergency expenses. "Participants should be encouraged to save into an FDIC-insured emergency fund account before saving into their qualified plan in order to be eligible for a loan," he says.
He continues, "Far too many people borrow from their 401(k) because they have no cash saved to pay for the new transmission, etc."
I'd love to see Roth and O'Brien's reforms implemented. I'm eager to roll my IRA into the TSP without having to get a federal job, too.
But as much as I rail against bad funds and high 401(k) fees, I've become increasingly skeptical that any voluntary approach to retirement saving will produce the result we presumably want from our retirement system: allowing people to retire at a reasonable age and preserve (at least approximately) their pre-retirement standard of living.
Why We Fall Behind
Here's a thought experiment:
Let's say all mortgages were structured as a 30-year loan with no monthly payments and a 100% balloon payment due at the end. The homebuyer would be responsible for setting aside, say, $300,000 over the course of 30 years then handing it over to the mortgage holder as a lump sum.
How many people would keep up with their mortgage payments under this system? That is: after 20 years, what percentage of homeowners would have $200,000 saved, and how many would be behind?
The answer is obvious, right?
Practically everyone would be behind. It's not because they're lacking in personal responsibility; it's because the rules of the game are dumb.
What's the difference between this hypothetical and saving for retirement? Basically nothing, except that in the real world, you get punished in the short term for not making your mortgage payment but get punished in the long term for failing to save for retirement.
And psychologically, it's much harder to change your behavior to avoid long-term pain than short-term pain. Long-term consequences just don't feel real, and this is a fact of human psychology.
And saving for retirement is much more complicated than paying off a mortgage, so all the more reason to weasel out of it.
Tess Vigeland, the former host of American Public Media's Marketplace Money and now a freelance writer and voiceover artist, says, "Based on the emails and calls I fielded in six years hosting Marketplace Money."
"I don't see how we can expect people to parse 401(k) options and statements when they (a) have trouble balancing their checkbooks and (b) don't understand how CDs work," she says
The Role of Financial Literacy
It's easy to respond to this line of reasoning by saying, okay, fine: We need to do a better job of teaching people that saving for retirement is important and how to use the tools they have available.
"As for the argument that we need more education and advice, how much more could there be?" asks Vigeland.
She says, "There are thousands of financial advisers. There are hundreds of websites with all kinds of information to read and try to understand. There are even great radio shows that try their best to clarify and help out. And yet, we still have this problem. So clearly it's not working."
One obvious (and politically impossible) approach is to expand Social Security or supplement it with a similar pension-like program.
The program would be mandatory, would reward work because the payout would be based on paycheck deductions, and would be regularly reviewed and modified to keep it solvent.
That's pie-in-the-sky. But what about a hybrid system that would keep investment decisions in the loop? Keep the 401(k). Make the TSP available to any employees who don't have a 401(k) at work or have a lousy one.
Now, make two little tweaks:
- Make minimum contributions mandatory. Send 10% of every paycheck to a worker's 401(k) by law, the same way we require payroll deduction for Social Security and income tax. People would be allowed to save more, but not less.
- End 401(k) loans and early withdrawals. Once you put the money in, you can't get it out until retirement age. Special rules could apply to situations like total disability.
These aren't crazy ideas. They already apply to Social Security: You can't choose not to participate, and you can't crack into the money early.
But this supplemental system wouldn't be at risk of insolvency, because there's no promised payout; it's based on the actual investment performance of the account.
Yeah, I'm a dreamer. But as long as we have a retirement system that resembles a 30-year mortgage with a balloon payment, most Americans will undersave.
What's crazier: Trying to change the law of the land, or the laws of human behavior?Editor's Note: This article by Matthew Amster-Burton was originally published on MintLife.
See more from Mint.com:
Twitter: @mint
- 1
Daily Recap Newsletter
entertainment, education and
smart market commentary.


text:
Zend Technologies has announced that it is working with Oracle to deliver an integrated and optimized enterprise-class Linux and PHP solution for deploying and managing business-critical Web applications. Zend's Web application server is now available through the Oracle Unbreakable Linux Network (ULN). Zend Server also includes out-of-the-box enterprise-grade connectivity to Oracle Database.
Users of the Oracle Unbreakable Linux Network (ULN) now have one-stop access to Zend Server via ULN, helping to speed installation for their PHP-based Web applications. The Unbreakable Linux Network is a resource for Oracle Unbreakable Linux support subscribers, with access to software patches, updates, and fixes.
"Oracle and Zend have a long-standing commitment to the PHP community, with a history of collaboration that has ensured integration between Oracle and Zend's PHP-based solutions," said Andi Gutmans, Zend CEO. "Together, we are now delivering an enterprise-grade PHP stack from top to bottom supporting the development, deployment, and management of business-critical PHP applications on Oracle. This full stack will also ease deployment in virtual environments using Oracle VM."
Oracle customers can access Zend Server from ULN through standard, native RPM package delivery (http://linux.oracle.com ). A 30-day free trial license for the Zend Server is available online upon request at http://www.zend.com/products/server/license.


text:
Explore by Type
Product Options
Get Inspired
Explore Our Brands
Thoughtfully designed.
Crafted with expertise.
Building beyond
the status quo.
Window & door replacement
made easy for you.
Professional Resources
Professional Events
More Opportunities
Contact Us
No matter how ambitious your ideas may be, Marvin Signature Services can make them a reality. Offering one-of-a-kind solutions and unparalleled expertise.
See examples of how Marvin has helped create beautiful spaces, and get some ideas about what's possible with your own project or design.
We are always here to help you figure out which window or door is best for you. Find an independent dealer partner near you, and start getting answers to your questions.
In case the printed variety is more your style, you can always request one of our Marvin catalogs to look for more inspiration for your project.