Tuesday, October 2, 2007

WideFinder and Java

Update: I realized there is a stupid bug in the concurrent version that I posted. ConcurrentHashMap.putIfAbsent returns null if there was no previous value - not the new value - so I was missing one increment and the Executor seemed to be eating the NullPointerException. I've updated the code below.

Everyone seems to getting in on Tim Bray's WideFinder challenge; there is even a C++ implementation.
I think it was originally supposed to be a competition between all those new and exciting dynamic languages, but they have not be overly impressive thus far. So I've decided to post up my various attempts at a solution in Java. Here is the basic WideFinder in Java (all import statements are omitted for brevity):


public class WideFinder {
public static void main(String[] args) throws IOException {
Map<String, Integer> counts = new HashMap<String, Integer>();
Pattern p = Pattern.compile("GET /ongoing/When/\\d\\d\\dx/(\\d\\d\\d\\d/\\d\\d/\\d\\d/[^ .]+) ");
BufferedReader in = new BufferedReader(new InputStreamReader(
new FileInputStream(args[0]), "US-ASCII"));

String line = null;
while ((line = in.readLine()) != null) {
Matcher m = p.matcher(line);
if (m.find()) {
String key = m.group();
Integer currentCount = counts.get(key);
counts.put(key, (currentCount == null ? 1 : (currentCount + 1)));
}
}
in.close();

List<Entry<String, Integer>> results = new ArrayList<Map.Entry<String, Integer>>(counts.entrySet());
Collections.sort(results, new Comparator<Entry<String, Integer>>() {

public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2)
{
return o2.getValue().compareTo(o1.getValue());
}

});

for(int i = 0; i < 10; i++) {
System.out.println(results.get(i));
}
}
}



The basic version is very similar to the Ruby one, if a little more verbose. Like all of the others, it is primarily IO bound. One important thing I found, was that specifying the encoding as being ASCII made about 30% improvement in the time taken. This is because Java uses unicode strings internally, and if you read text without specifying an encoding it will use the platform default. ASCII is a good bit quicker to convert than ISO-8859-1.

For a file with 1 million entries I got the following times:

real 0m3.208s
user 0m3.460s
sys 0m0.215s

Taking the regexp out:

real 0m2.267s
user 0m2.329s
sys 0m0.210s

So we can potentially save up to 1 second, almost 1/3 of the time. My first solution was to try to keep things as close to the original as possible. For each line, instead of matching it directly, I submit a new task to an ExecutorService. To make the map safe to access from multiple threads I use a ConcurrentHashMap, with AtomicIntegers as values.


public class WideFinderConcurrent {
public static void main(String[] args) throws IOException, InterruptedException {
int threads = Integer.parseInt(args[1]);
ExecutorService executorService = Executors.newFixedThreadPool(threads);

final ConcurrentHashMap<String, AtomicInteger> counts = new ConcurrentHashMap<String, AtomicInteger>();
final Pattern p = Pattern.compile("GET /ongoing/When/\\d\\d\\dx/(\\d\\d\\d\\d/\\d\\d/\\d\\d/[^ .]+) ");

BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(args[0]), "US-ASCII"));

String line = null;
while ((line = in.readLine()) != null) {
final String lineForTask = line;
executorService.execute(new Runnable() {
public void run() {
Matcher m = p.matcher(lineForTask);
if (m.find()) {
String key = m.group();

AtomicInteger currentCount = counts.get(key);
if (currentCount == null) {
currentCount = new AtomicInteger(0);
AtomicInteger old = counts.putIfAbsent(key, currentCount);
if (old != null) {
currentCount = old;
}
}
currentCount.incrementAndGet();
}
}
});
}

in.close();
executorService.shutdown();
executorService.awaitTermination(100000, TimeUnit.SECONDS);

List<Entry<String, AtomicInteger>> results = new ArrayList<Map.Entry<String, AtomicInteger>>(counts.entrySet());
Collections.sort(results, new Comparator<Entry<String, AtomicInteger>>() {
public int compare(Entry<String, AtomicInteger> o1, Entry<String, AtomicInteger> o2) {
int anotherVal = o1.getValue().get();
int thisVal = o2.getValue().get();
return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
}
});

for(int i = 0; i < 10; i++) {
System.out.println(results.get(i));
}
}
}


The performance for this version is pretty poor:
real 0m5.407s
user 0m11.921s
sys 0m4.023s

Most of the locking is probably uncontended but there is still significant overhead. It also is probably not a great idea to use lots and lots of AtomicIntegers. With more work being done in the tasks it might be more reasonable. The next step was to get my hands dirty with low level threading. Many bloggers will have you believe this is impossible to get right, but somehow I've managed to write a fair bit of multithreaded code with manual synchronization without causing horrible errors. For this version I just used two threads: the main thread doing the reading, and another thread doing the regexp match and map update. I didn't bother trying to parallelize the sort. The main thread will pass lines on a queue to the regexp thread. Once the file is finished a special object is put on the queue to indicate that. We then wait for the regexp thread to finish and get the map back. Obviously locking overhead will be a problem so instead of putting lines on the queue one by one batches of lines are used.


public class WideFinder2ThreadsBulk {
public static void main(String[] args) throws IOException, InterruptedException {
int batchSize = Integer.parseInt(args[1]);
Pattern p = Pattern.compile("GET /ongoing/When/\\d\\d\\dx/(\\d\\d\\d\\d/\\d\\d/\\d\\d/[^ .]+) ");

LineCounter counter = new LineCounter(p);
Thread t = new Thread(counter);
t.start();

BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(args[0]), "US-ASCII"));

String line = null;
List<String> batch = new ArrayList<String>(batchSize);
while ((line = in.readLine()) != null) {
batch.add(line);
if (batch.size() == batchSize) {
counter.addLines(batch);
batch = new ArrayList<String>(batchSize);
}
}
counter.addLines(batch);
counter.finished();

t.join();
in.close();

List<Entry<String, Integer>> results = new ArrayList<Map.Entry<String, Integer>>(counter.getCounts().entrySet());
Collections.sort(results, new Comparator<Entry<String, Integer>>() {
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2)
{
return o2.getValue().compareTo(o1.getValue());
}
});

for(int i = 0; i < 10; i++) {
System.out.println(results.get(i));
}
}

static class LineCounter implements Runnable {
private static final List<String> FINISHED = new ArrayList<String>();
private final BlockingQueue<List<String>> queue = new ArrayBlockingQueue<List<String>>(100);
private final Pattern pattern;
private final Map<String, Integer> counts = new HashMap<String, Integer>();

LineCounter(Pattern pattern) {
this.pattern = pattern;
}

public void run() {
List<String> lines = null;
try {
while ((lines = queue.take()) != FINISHED) {
for (String line : lines) {
Matcher m = pattern.matcher(line);
if (m.find()) {
String key = m.group();
Integer currentCount = counts.get(key);
counts.put(key, (currentCount == null ? 1 : (currentCount + 1)));
}
}
}
}
catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}

void addLines(List<String> batch) throws InterruptedException {
queue.put(batch);
}

void finished() throws InterruptedException {
queue.put(FINISHED);
}

Map<String, Integer> getCounts() {
return counts;
}
}
}



Finally we get some speedup (for batches of 500 lines):
real 0m2.597s
user 0m4.137s
sys 0m0.294s

You could generalize this for multiple threads, but it likely would not be worth the effort. Really, this whole exercise probably isn't worth the effort. In fact, I feel like we have all failed one of Steve Yegge's interview questions. A commenter on Tim Bray's blog shows that Unix command line utilities are the way to go, while we have been writing big programs, and trying to optimize file IO. Another - probably easy - way to do this would be to suck the data into your preferred DB, and run a single (simple) SQL query. But that wouldn't be fun, would it?

68 comments:

Paulo Faria said...

Friend, is this code :
AtomicInteger currentCount = counts.get(key);
if (currentCount == null) {
currentCount = counts.putIfAbsent(key, new AtomicInteger(0));
} currentCount.incrementAndGet();

not equivalent to this :
AtomicInteger currentCount = counts.putIfAbsent(key, new AtomicInteger(0);
currentCount.incrementAndGet();

only, errr, slower?

UnintentionalObjectRetention said...

It is equivalent, but it probably isn't faster.
AtomicIntegers aren't as cheap to create as regular Integers, so we probably don't want to create lots of them unnecessarily. You would expect most articles to have multiple entries in the log file, so you would be creating a lot of objects to throw away immediately. That probably isn't the best idea even for regular Integers. putIfAbsent probably holds onto a lock for ever so slightly longer than a get, so that might make a difference too.

Tim said...

Shoot me the code with the imports and I'll give it a whack on the big iron. NetBeans couldn't auto-figure-out the imports and my Java is getting rusty... tim dot bray at sun dot com

UnintentionalObjectRetention said...

I sent the code on a couple of days ago. Hopefully it hasn't been eaten or something.

1 Chat a Day said...

Ehm,

why wouldnt you show the imports in your post ? It would give us instant gratification ;)

T.

Anonymous said...

Who knows where to download XRumer 5.0 Palladium?
Help, please. All recommend this program to effectively advertise on the Internet, this is the best program!

Anonymous said...

Online Casino Games tyuueooru
http://stonewalljacksoncarnival.org/ - No Download Casino
Therefore, the more the online casino, the more the casino options and offers as well.
[url=http://stonewalljacksoncarnival.org/]Virtual Casino[/url]
Therefore, the more the online casino, the more the casino options and offers as well.
Casino Money
You can enjoy online casino simply by getting connected to the Internet.

Anonymous said...

dating timeline [url=http://loveepicentre.com/]dating questions[/url] zelda dating sim http://loveepicentre.com/ singles events in boston

Anonymous said...

It isn't hard at all to start making money online in the underground world of [URL=http://www.www.blackhatmoneymaker.com]blackhat seo tools[/URL], You are far from alone if you have no clue about blackhat marketing. Blackhat marketing uses little-known or not-so-known ways to generate an income online.

Anonymous said...

depression feeling lack of motivation [url=http://usadrugstoretoday.com/products/inderal.htm]inderal[/url] cold smoke rib roast first http://usadrugstoretoday.com/products/minocin.htm how long does it take for blood pressure medicine to work http://usadrugstoretoday.com/products/ed-strips.htm
how to reschedule diabetic pets insulin doses [url=http://usadrugstoretoday.com/products/trimox.htm]trimox[/url] reasons for vaginal itching [url=http://usadrugstoretoday.com/products/kamagra-oral-jelly.htm]mens health link lees summit[/url]

Anonymous said...

http://poow.in/ginseng/bonsai-ficus-ginseng-care
[url=http://poow.in/gaba/gaba-side-effects]waldorf astoria pharmacy[/url] drug white crosses [url=http://poow.in/labetalol/labetalol-broncotis]labetalol broncotis[/url]
online pharmacy prices http://poow.in/zyban/zyban-150-mg-glaxo-wellcome
[url=http://poow.in/xanax/what-are-the-difference-between-yellow-and-white-xanax]camp bethel drug detox program north carolina[/url] vinnie betony beaver county times drug bust articles [url=http://poow.in/melatonin/melatonin-during-pregnancy]melatonin during pregnancy[/url]
noupoort drug rehab centre http://poow.in/risperidone/technetiun-labeled-risperidone
[url=http://poow.in/levodopa/subdermal-implants-levodopa]virginia pharmacy license[/url] douglas pharmacy [url=http://poow.in/geodon/geodon-patient-assistance-program]geodon patient assistance program[/url] alzheimer drug [url=http://poow.in/levaquin/levaquin-psychosis]levaquin psychosis[/url]

Anonymous said...

clothes storage bins http://topcitystyle.com/xxl-funky-size8.html faux chanel earrings [url=http://topcitystyle.com/etro-milano-dress-shirts-brand36.html]wholesale fashion accessories australia[/url] tod fashion designer
http://topcitystyle.com/-casual-shirts-roberto-cavalli-category71.html scub clog shoes [url=http://topcitystyle.com/armani-jeans-cut-pants-brand8.html]designer plus sizes[/url]

Anonymous said...

kidney stones lemon [url=http://usadrugstoretoday.com/products/dulcolax.htm]dulcolax[/url] cliapan drug http://usadrugstoretoday.com/products/celexa.htm
attention deficit disorder meditation [url=http://usadrugstoretoday.com/products/amaryl.htm]amaryl[/url] non prescription contact lens order contacts online [url=http://usadrugstoretoday.com/products/alpha-lipoic-acid.htm ]underage smoking in singapore [/url] down syndrome and heart defect
valentine key to my heart keychains [url=http://usadrugstoretoday.com/products/aldactone.htm]aldactone[/url] high protein blood disorder http://usadrugstoretoday.com/products/indinavir.htm
health net orange plan [url=http://usadrugstoretoday.com/products/lopid.htm]lopid[/url] nj dental hygienist school [url=http://usadrugstoretoday.com/products/tretinoin-cream-0-05-.htm ]lsu medical center south [/url] diabetes check feet

Anonymous said...

that are the side effect of medicine after a thyroid is removed [url=http://usadrugstoretoday.com/products/viagra-plus.htm]viagra plus[/url] canadian mental health statistics http://usadrugstoretoday.com/products/pulmicort.htm
philippine herbal medicine [url=http://usadrugstoretoday.com/products/levitra-professional.htm]levitra professional[/url] smoke hole caverns [url=http://usadrugstoretoday.com/products/eulexin.htm ]ezorb calcium supplements [/url] what is a normal blood count
nitroglycerin pills [url=http://usadrugstoretoday.com/products/avandia.htm]avandia[/url] articles on low immune systems in the elderly http://usadrugstoretoday.com/catalogue/1.htm
how to duct tape your breast for strapless dress [url=http://usadrugstoretoday.com/products/risperdal.htm]risperdal[/url] alphabetical drug list prescription [url=http://usadrugstoretoday.com/products/plavix.htm ]rising cost of prescription drugs [/url] raliegh north soccer shoot out

Anonymous said...

trimaran designer http://www.thefashionhouse.us/28-stretch-jeans-size18.html polish horseshoes [url=http://www.thefashionhouse.us/46-versace-size4.html]mens wide shoes[/url] outlet athletic shoes
http://www.thefashionhouse.us/grey-black-men-color238.html designer inspired handbags [url=http://www.thefashionhouse.us/?action=products&product_id=1823]chanel pearls from the oc[/url]

Anonymous said...

medicine hat online menu [url=http://usadrugstoretoday.com/products/flagyl-er.htm]flagyl er[/url] how many people diet each year http://usadrugstoretoday.com/products/diovan.htm
how many days rest for muscle growth [url=http://usadrugstoretoday.com/products/calcium-carbonate.htm]calcium carbonate[/url] hoosier heart farm [url=http://usadrugstoretoday.com/products/lisinopril.htm ]physical fitness enhancement [/url] history of herpes zoster
adult drug treatment programs [url=http://usadrugstoretoday.com/index.php?lng=it&cv=eu]No prescription online pharmacy[/url] neck symptoms cancer head lump pain health throat include sore http://usadrugstoretoday.com/products/female-viagra.htm
medical empath [url=http://usadrugstoretoday.com/products/flagyl-er.htm]flagyl er[/url] childrens riddles about health [url=http://usadrugstoretoday.com/products/medrol.htm ]benedryl dosage infants [/url] medical errors dealing with arthritis

Anonymous said...

Amiable post and this post helped me alot in my college assignement. Say thank you you as your information.

Anonymous said...

Yoou! present
[url=http://tube.hqporn.us/][img]http://pics.hqtube.com/gallery/pink_eye_2_sc4_3.jpg[/img][/url] [url=http://granny.hqporn.us/][img]http://pics.hqtube.com/gallery/white_panty_chronicles_19_sc2_2.jpg[/img][/url] [url=http://granny.hqporn.us/][img]http://pics.hqtube.com/gallery/naughty_little_nymphs_2_sc2_1.jpg[/img][/url] [url=http://tube.hqporn.us/][img]http://pics.hqtube.com/gallery/handjobs_17_sc2_3.jpg[/img][/url]
Absolute Pornstars Brief Review: [url=http://shemale.hqporn.us/]chica porn [/url] , free bleach porn [url=http://granny.hqporn.us/]lil lexy porn videos [/url] or porn samples [url=http://join.hqtube.com/track/qx4DABkR/]jenna jameson porn star [/url] , hard core gay porn [url=http://squirts.hqporn.us/]neat porn movies [/url] or elderly porn [url=http://milf.hqporn.us/]women of porn [/url] , tinkerbell porn [url=http://tube.hqporn.us/]hamster video porn [/url] and youtube porn [url=http://tube.hqporn.us/]pregant porn [/url] or muscle free gay porn [url=http://squirts.hqporn.us/]vietnamese porn [/url] , High definition video porn site starring the most gorgeous pornstars in the hardcore action. [url=http://www.radionhb.com/chat//viewtopic.php?p=166339#166339]medical porn [/url] . The problem with Absolute Pornstars is that they don’t have very much content. There are 44 DVDs they’ve gotten the licenses to or added or however they do it. That means you’re looking at roughly 175 scenes to download, which means that a whole bunch of the pornstars here have no videos at all. The picture galleries aren’t exclusive and neither are the videos. That all adds up to them charging too much money for a membership. $39.95 is a stretch for membership to a fairly small site. [url=http://miwan.com.tw/bbs//viewtopic.php?p=56884#56884]porn limewire [/url] . F Sweet Undressing Teen new [url=http://forex.usdfy.com/bbs//viewtopic.php?p=392153#392153]usenet porn [/url] . Teen lady engulfs a very big black sword with her mouth and twat. [url=http://www.stlmusiclive.com/viewtopic.php?f=51&t=35244&p=290329#p290329]tottaly spies porn [/url] . 13 pics of Amateurs : watch payton gobble and fuck this young guys cock [url=http://www.matadorespr.net/foro/index.php?showtopic=33530&st=0&gopid=51991&#entry51991]777 porn [/url] , Category: FREE > Straight > Porn Stars [url=http://lesbian.hqporn.us/]kim porn [/url] , japanese porn in japan [url=http://squirts.hqporn.us/]free full porn videos [/url] or porn with mom and dad [url=http://squirts.hqporn.us/]cellphone porn [/url] , voyager porn [url=http://milf.hqporn.us/]porn petite girls [/url] or porn for adults [url=http://squirts.hqporn.us/]free porn babes [/url] , croc porn reviews [url=http://japan.hqporn.us/]lesbian porn pictures [/url] and male porn [url=http://shemale.hqporn.us/]watch porn free [/url] or porn movie downloads [url=http://squirts.hqporn.us/]australian porn stars [/url] , A site featuring bi-sexual MMF action [url=http://www.envaccord.com/modules.php?name=Forums&file=viewtopic&p=1508233#1508233]clasic porn [/url] . Category: FREE > Straight > Interracial [url=http://www.soldatfan.laa.pl/viewtopic.php?p=150882#150882]vintage 80 s porn [/url] . 13 pics of Housewifes : slutty wife in mesh lingerie gets naughty [url=http://www.coachhosting.de/bvv/opinio_commutare/viewtopic.php?p=301409#301409]pocahontas porn [/url] . Japanese harlot gets gang-shagged and takes immense cumload all over face. [url=http://www.cetafi.net/modules.php?name=Forums&file=viewtopic&p=15281&sid=13a727da1ee0975f68ccea58b0751a00#15281]free porn anal [/url] . 16 pics of Lesbians : sexy big tit lesbian cougar seduces blondie teen for fucking [url=http://www.stlmusiclive.com/viewtopic.php?f=51&t=35209&p=290360#p290360]gay porn pictures [/url] , everything.....

Anonymous said...

Any thoughts on this i found on my blog guys? What do you guys think is it very good information to put on a website?

[quote]Are you suffering from toothache for ones last couple of days? Well, if the answer is in the affirmative then it is advisable to fix an appointment inside your dentist in worcester. Finding a very good dentist is also quite a employment but if you stay anywhere around Worcester, Worcester dentist with excellent skills and techniques is also very easily found.

Apart from toothache there are lots of diseases that require dental care. Gingivitis is really a disease in which the gums turn into inflamed and effects in redness and bleeding. One more disease that requirements dentistry is Peroidontitis. In this disease plaque bacterium penetrates in between the gums and the teeth.

Therefore anaerobic bacteria establish themselves under the receding gums. Other diseases that need dental attendance are Xerostomia, Halitosis and Canker sores.[/quote]

They also left a link on there that looks like [url=http://eldon8ortiz.insanejournal.com/281.html]Worcester Dentist[/url]

Anonymous said...

[url=http://trig.com/stratterareviews/biography]strattera side effects weight loss
[/url]

Anonymous said...

small terra cotta flower pots beverly hochstedt florist
bolton ontario florist fresh flowers on wedding cakes florists in beaufort sc homes in flower mound tx
how to make a flower pen

Anonymous said...

здорово!
зарубежные партнерки - 3426

Anonymous said...

http://46thstpaintshop.com/forex/sitemap.html teen titens porn xxx teen sex porn ann angel hardcore

Anonymous said...

new discounted hp 94 inkjet cartridges
http://life.menstyle.it/community/lowclockmota
http://feabikussi1989.blog132.fc2.com/
http://gggizzzzmo.blogspirit.com/
http://asdqwdefwef.splinder.com/

Anonymous said...

Brand Name Handbags for Less, [url=http://allbrandhandbags.com/deals/Brighton+Handbag/]Brighton Handbag[/url], [url=http://allbrandhandbags.com/deals/Donald+J+Pliner+Handbag/]Donald J Pliner Handbag[/url], [url=http://allbrandhandbags.com/deals/Fossil+Handbag/]Fossil Handbag[/url], [url=http://allbrandhandbags.com/deals/Kenneth+Cole+Handbag/]Kenneth Cole Handbag[/url], [url=http://allbrandhandbags.com/deals/Osgoode+marley+Handbag/]Osgoode marley Handbag[/url], [url=http://allbrandhandbags.com/deals/Tignanello+Handbags/]Tignanello Handbags[/url].

Anonymous said...

Download Audio Books, iPod And Digital Audio Books Talking Books [url=http://free-audiobook-download.com/]Free Audiobook Downloads[/url].

- Eclipse: The Twilight Saga Book 3 (unabridged) As Seattle is ravaged by a string of mysterious killings and a malicious vampire continues her quest for revenge, Bella once again finds herself surrounded by danger

- A Wizard Alone: Young Wizard Series Book 6 (unabridged) Best-selling author Diane Duane has created a book full of magical mystery, suspense, and humor

- New Moon: The Twilight Saga Book 2 (unabridged) When the Cullens, including her beloved Edward, leave Forks rather than risk revealing that they are vampires, it is almost too much for 18-year-old Bella to bear

- Sterling Point Books: George Washington: Frontier Colonel (unabridged) Sterling North, author of the award-winning children's classic Rascal, tells the tale of the Father of Our Country and how he became one of the greatest leaders of all time

- Case Of The Deadly Sell-out This episode of the Adventures of Nero Wolfe first aired on January 5, 1951

Anonymous said...

[b]Clavamox (Amoxicillin/Clavulanate)[/b]
[b]Drug Uses[/b]

Clavamox is approved for treatment of the following canine infections:
Skin and soft-tissue infections such as wounds, abscesses, cellulitis, and superficial/juvenile and deep

pyoderma due to susceptible strains of the following organisms: lactamase-producing Staphylococcus aureus,

non-lactamase-producing Staphylococcus aureus, Staphylococcus spp., Streptococcus spp. and E. coli.
Periodontal infections due to susceptible strains of both aerobic and anaerobic bacteria.

Anonymous said...

[url=http://infobooksonline.com/shop/College+Textbooks/]College Textbooks[/url]. Algorithm Design, Biology Books, Design Books, Financial Accounting, Mathematics Books, Microeconomics, Psychology Books.

Anonymous said...

Brand Name Handbags for Less, [url=http://bargain-designer-handbags.com/deals/Alexander+McQueen+Handbag/]Alexander McQueen Handbag[/url], [url=http://bargain-designer-handbags.com/deals/Coogi+Handbag/]Coogi Handbag[/url], [url=http://bargain-designer-handbags.com/deals/Guess+Handbag/]Guess Handbag[/url], [url=http://bargain-designer-handbags.com/deals/Jimmy+Choo+Handbag/]Jimmy Choo Handbag[/url], [url=http://bargain-designer-handbags.com/shop/Lulu+Guinness+Handbag/]Lulu Guinness Handbag[/url], [url=http://bargain-designer-handbags.com/shop/Stuart+Weitzman+Handbag/]Stuart Weitzman Handbag[/url] Brand Name Handbags for Less J United Boston Style White Tote Handbag Bag Purse T394 michael kors handbags Choose Black Leather Juicy Couture Satchel Handbag , kathy van zeeland handbags Vb Womens Clutch Tote Shoulder Bag Handbag michael kors handbags Vb Womens Clutch Tote Shoulder Bag Handbag , Authentic Chanel Black Leather Bowler Handbag Chanel Black Quilted Leather Large Handbag Authentic Chanel Bag Handbag Tote Authentic Patent Rare , Designer Style Black And White Hand Bag Brand Women Designer Leather Tote Hobo Shoulder Handbag Purse H Pink Designer Shoulder Large Buckle Purse Handbag , Guess Faux Snake Satchel Handbag Purse Green.

pedro velasquez said...

In my Finding Things chapter of Beautiful Code,dominical costa rica tours the first complete program is a little Ruby script that reads the ongoing Apache logfile and figures out which articles have been fetched the most. It’s a classic example of the culture, born in Awk, perfected in Perl, of getting useful work done by combining regular expressions and hash tables. I want to figure out how to write an equivalent program that runs fast on modern CPUs with low clock rates but many cores; this is the Wide Finder project.
http://www.dominicalcostaricatours.com

Anonymous said...

Hey just becoming a member, glad to be in! I look ahead to partcipating and have study a good deal so far, so hello!

I've been concerned in some other forums and have uncovered this site to have substantially greater subject material, so it helps make sense to last but not least publish!

BTW where is the option to change the time zone for my account? It's kind of weird having the time like 5 hours off lol

Oda Ivey said...

Super-Duper site! I am loving it!! Will come back again - taking you feeds also, Thanks.

Vincenzo Aggarwal said...

ohh�nice post but really?/? :P

Vincenzo Aggarwal said...

ohh�nice post but really?/? :P

Besa Lighting 943182 Series 943 Graphite Wall Sconce said...

Hi. I read a few of your other posts and wanted to know if you would be interested in exchanging blogroll links?

Charles David Platform Sandal said...

Please, can you PM me and tell me few more thinks about this, I am really fan of your blog...

Charles David Platform Sandal said...

Please, can you PM me and tell me few more thinks about this, I am really fan of your blog...

Calvin Klein Ladies Minimal Watch said...

As a Newbie, I am always searching online for articles that can help me. Thank you

Canterbury Of New Zealand Ian L S Striped Rugby Jersey Natural said...

Of course, what a great site and informative posts, I will add backlink - bookmark this site? Regards, Reader.

cachcach kids Dress said...

Interesting article. Were did you got all the information from... :)

best organic seo services said...

Thanks a lot for sharing this amazing knowledge with us. This site is fantastic. I always find great knowledge from it.

buy vicodin online said...

This is good site to spent time on .I just stumbled upon your informative blog and wanted to say that I have really enjoyed reading your very well written blog posts. I will be your frequent visitor, that's for sure.

buy codeine online said...

This is such a helpful reading material for me, I’ve learned a lot of new things. Thanks for the great post!

buy xanax online said...

Interesting read!!! Your website is fantastic with informative content which i like to add to my favorites.

buy ritalin online said...

Really such a valuable post.
I appreciate your article.
Thanks for posting!

buy online vicodin es said...

Very significant article for us ,I think the representation of this article is actually superb one. This is my first visit to your site

the best seo company said...

I'm still learning from you, but I'm trying to achieve my goals. I certainly enjoy reading all that is posted on your blog.Keep the information coming. I loved it!

cost effective advertising said...

Hi buddy, your blog's design is simple and clean and i like it. Your blog posts are superb. Please keep them coming. Greets!!!

limo service in EAST Brunswick said...

I really liked your article.

Frank said...

Hey,
Loving your blog, awesome tips on blog you have here. I
would just like to ask you some questions privately, mindweb hosting in pakistan,samsung mobile prices in pakistan,nokia mobile prices in pakistan,VLC Player Free Download

medicine forum said...

Very significant article for us ,I think the representation of this article is actually superb one. This is my first visit to your site

buy watson said...

Information like what you described here is going to be quite useful to me. I will post a link to this post on my site. I am sure my members will find that helpful.

Play Rummy said...

Thank you for sharing this kind of important information. and especially for sharing your own experience with these.

Hotel In Anaheim said...

Nice job. hope to be back soon and see more stuff. A special thanks for the straight answer.

Knox Karter said...

Absolutely fantastic topic! Great blog. Thanks for taking the time and writing this.
Ready-Made Animals Logo

price per head service said...

This is really satisfied by the nice services in this blog that to really providing the wonderful info is visible in this blog

Plavix said...

hi,
Java. Perusing the blogs of the Java and Scala programmers, it appears that the common complain is .. regular expressions. So the hunt was on for a good regular expression library. Joni, a port of the Ruby Oniguruma regex library to the JVM used by the JRuby project, appears ideal: low-level and supposedly very fast. Until one hits the total lack of documentation. So that’s off the table. Ended up using dk.brics.automaton, which appears to perform well enough, even when parsing Unicode strings.

call center voip solutions said...

Hilariously cool. I have been looking for sites like this for a long time. Thank you my friend.

Anonymous said...

[url=http://freewebs.com/awctxstate/apps/profile/101794715/][IMG]http://maximalblog.net/AZIPICS/2012-05-07_00169.jpg[/IMG][/url]

[url=http://freewebs.com/sitiafm/apps/profile/101795055/]Buy azithromycin in australia[/url]

cheap zithromax and purchase generic zithromax online

[url=http://freewebs.com/carworksauto/apps/profile/101737854/]Can i order azithromycin[/url]

Zithromax (azithromycin) is known as a component all around the classification of drugs called macrolide anti-biotics. Zithromax fights bacteria contained in the childs body.
Zithromax can feel dealing with diverse unique variations of difficulties a result of bacteria, like for example inhaling problems, epidermis disease, head difficulties, and venereal illness.
Zithromax is also utilized for uses not promoted in script drugs guide.

Anonymous said...

top [url=http://www.c-online-casino.co.uk/]uk casinos online[/url] brake the latest [url=http://www.realcazinoz.com/]realcazinoz.com[/url] free no set aside reward at the best [url=http://www.baywatchcasino.com/]baywatch casino
[/url].

Anonymous said...

top [url=http://www.xgambling.org/]online casinos[/url] coincide the latest [url=http://www.realcazinoz.com/]casino[/url] autonomous no store bonus at the leading [url=http://www.baywatchcasino.com/]baywatchcasino.com
[/url].

Unknown said...

Wow, this article end is unexpected, and in reason, let me much surprised and aftertaste. Many see this article I think is a good thing, can make their own thinking have been develop.taxis in w2 | minicab to airport | airport drop w2

Unknown said...

Well, very good content, let me feel very surprised. Surprise life would have so good things, more to my surprise I would see such a good content. Well, I will pay more attention to, and I want to more surprise.cabs in w2 | cab w2 | w2 taxis

Unknown said...

I love it,Excellent article.I am decide to put this into use one of these days.Thank you for sharing this.To Your Success!mirza maqbool | Maqbool mirza

Bridal lehenga said...

Good – I should definitely say I'm impressed with your blog. I had no trouble navigating through all the tabs as well as related info. The site ended up being truly simple to access

long frocks said...

You described it very beautiful. your writing style grabbed my intentions,would love to read more about it… 

shalwar kameez said...

Thanks for sharing such a fastidious opinion, paragraph is fastidious, thats why i have read it entirely

Danny Danials said...

I have been using this app Muslim Pro Apk : and downloaded and playing it regularly.