January 31, 2008

TripIt is awesome

You know what I really like? TripIt.com. It’s amazingly simple. You take all those travel confirmation emails that you get from your travel agent, hotels, car rental agencies, etc, and you just forward them to plans@tripit.com. That’s all you have to do. You don’t have to sign up for an account. You don’t have to log on. You just forward those emails. You can do it right now.

You get a link back by email, with a beautifully organized itinerary, showing all your travel data plus maps, weather reports, and all the confirmation numbers for your flights and address for your hotels and so on.

It’s kind of magical. You don’t have to fill out lots of little fields with all the details, because they’ve done a lot of work to parse those confirmation emails correctly… it worked flawlessly for my upcoming trip to Japan.

Think of it this way. Suppose you want to enter a round trip flight on your calendar. The minimum information you need to enter is probably:

  1. the airline
  2. the flight number
  3. four times (departure and arrival, there and back)
  4. four time zones (or else your phone will tell you that your flight is at 5 pm when it’s really at 2pm)
  5. a confirmation number (for when the airline denies that you exist)
  6. where you’re going

All in all it takes a few minutes and is very error prone. Whereas, with TripIt, you just take that email from the airline or Orbitz, Ctrl+F, type plans@tripit.com, and send. Done.

TripIt is a beautiful example of the Figure It Out school of user interface design. Why should you need to register? TripIt figures out who you are based on your email address. Why should you parse the schedule data? Everyone gets email from the same 4 online travel agencies, 100-odd airlines, 15 hotel chains, 5 car rental chains… it’s pretty easy to just write screen scrapers for each of those to parse out the necessary data.

Anyway, it’s a shame I have to say this, but I have no connection whatsoever to tripit.com.

Not loving your job? Visit the Joel on Software Job Board: Great software jobs, great people.

Related Posts

(not just any FREE webhost) (Hello from San Francisco?) (Bribing Bloggers

January 29, 2008

Microsoft can’t speak straight any more

Here’s how Microsoft says, “SQL Server 2008 will be late:”

“We want to provide clarification on the roadmap for SQL Server 2008. Over the coming months, customers and partners can look forward to significant product milestones for SQL Server.  Microsoft is excited to deliver a feature complete CTP during the Heroes Happen Here launch wave and a release candidate (RC) in Q2 calendar year 2008, with final Release to manufacturing (RTM) of SQL Server 2008 expected in Q3. Our goal is to deliver the highest quality product possible and we simply want to use the time to meet the high bar that you, our customers, expect.”

What? Can you understand that? “A feature complete CTP during the Heroes Happen Here launch wave?” What on earth does that mean?

The guy who wrote this, Francois Ajenstat, ought to be ashamed of himself. Have some guts. Just say it’s late. We really don’t care that much. SQL Server 2005 is fine. As Judge Judy says, “Don’t piss on my leg and tell me it’s raining.”

Phil Factor explains.

Not loving your job? Visit the Joel on Software Job Board: Great software jobs, great people.

Related Posts

(Why website visitors don’t convert into sales - part 2) (MySQL AB Completes Record Quarter & Year) (Ask me something in Japanese, please…) (Another Reason to Attend DevTeach) (MySQL Users Conference 2006 - Call for Participation

How MySQL Query Cache works with Transactions

As MySQL Manual Says Query Cache works with transactions with Innodb tables but it does not tell you how and with which restrictions.

According to my tests it works but it is very restricted and one could expect it to work much better:

The result set can be retrieved from query cache (for statements both inside and outside of transactions) until there is a statement inside transactions which modifies the table. As soon as table is modified in transaction it becomes uncachable by query cache until that transaction is committed. Not only query cache can’t be used inside the same transaction which modified data but also in other concurrent transactions which do not even see the changes done yet

Of course such implementation is rather restricted. Queries outside of transactions well could use query cache until it is invalidated by committed transaction, however it was probably too hard to implement using current query cache infrastructure. With current approach Innodb can probably do something as simple as marking table “uncachable” if it has any uncommitted changed which would take care about all complicated aspects of change visibility in different transaction modes.

In most cases this limitation should not cause many problems (compared to general coarse table base invalidation it does) - only in case of long uncommitted transactions you will get data being uncachable for concurrent workload for a long time.


Entry posted by peter |
No comment

Add to: delicious | digg | reddit | netscape | Google Bookmarks

Related Posts

(MySQL Query Cache and prepared statements - support comming ?) (Beware large Query_Cache sizes) (Getting real life query speeds with MySQL) (MySQL Query Cache WhiteSpace and comments) (Query Profiling with MySQL: Bypassing caches

:CueCat is back!

Google: “2D barcodes are an especially exciting part of this because they allow readers to “click” on interesting print ads with their cellphones and seamlessly connect to relevant online content.”

Years ago, I went out on a limb and dismissed a similar scheme thus: “The number of dumb things going on here exceeds my limited ability to grok all at once. I’m a bit overwhelmed with what a feeble business idea this is.”

OK, more than seven years have passed. Things have changed. People have camera phones with web browsers now. Some things are still the same: typing URLs is not hard, this is a monumental chicken and egg problem, and this doesn’t provide any value to the consumers who are expected to install new software on their phones to go along with this ridonculous scheme.

Sometimes when the elders say to the youngsters, “don’t do that, we tried that, it failed,” it’s just because they’re failing to notice that the world has changed. But sometimes the elders are right, and the youngsters really are too young to know the history of the idea they think that they’ve just invented.

I guess we’ll get to watch to see whether the oldsters or the youngsters will win this one.

Still, it doesn’t say much for the quality of those 150 people Google hires every week that they’re now chasing some of the worst of the bad ideas of the fin de siecle. What’s next, GooglePetFood.com?

Not loving your job? Visit the Joel on Software Job Board: Great software jobs, great people.

Related Posts

(Exciting times) (blockhaus is back!) (Back to USA) (I’m back, and some links…) (Yes, it’s been quiet around here…

Google backs out of the position 6 penalty

Three weeks ago, we informed you about Google’s new position 6 penalty. At this time, it was unclear why Google assigned this penalty to some websites. It seems that Google doesn’t use this penalty anymore. Why did this happen?

Related Posts

(Google’s new position 6 penalty) (Google’s -30 penalty) (Does Google think that your web site is spam?) (How to react to Google’s latest AdWords changes) (Google Sponsored Links search

New technologies detect black-hat SEO methods

Search engine optimization methods are divided in two categories: black hat SEO and white hat SEO. Recent developments indicate that websites that use black-hat methods will be in trouble soon.

Related Posts

(Working with Red-Black Trees in C#) (Never Change the Default Parameters of Virtual Methods) (HP NonStop Server Primer) (Application of RS-GIS-GPS Technology in the Evaluation of Changing Cultivation Into Forestry/Grassland) (The New ASP 3.0 Server Methods

Monty unviels Maria and starts Blogging

This weekend we’re hearing great news from Michael “Monty” Widenius - one of the Fathers of MySQL. Monty finally found a time to create his own blog with very descriptive name Monty Says. At the same time Monty finally announces Maria - the MyISAM successor storage engine he has been working for last few years. You can now get Maria from MySQL BitKeeper Server.

I’m really excited to see Monty speaking publicly again in the free form rather than in form of sanitized interviews and press releases we’ve seen during recent years.

I’m also excited to see Monty finally releasing his new brainchild and putting his personal commitment behind it: “NOTE: The opinions and promises stated in this FAQ is by the Maria development team and not promises by MySQL AB.” I guess this means Monty will now have more time to do coding and helping people with Maria problems - things he was also great with.

It is still unclear how Maria will be integrated with MySQL (what version, which conditions etc) but honestly I do not really care. I can trust code from Monty (when he will call it stable) and as soon as Pluggable Storage Engine API works well it should not require any official support to work well.

Monty has serious plans and long road map with Maria. Initial version has two main benefits compared to MyISAM - it has page cache for rows (meaning no OS calls will be required to fetch/modify row data) which can dramatically improve performance for certain on disk temporary tables (both implicit and explicit) and it will be (optionally) crash safe, meaning you will not have to deal with partially executed statements or check and repair tables in case of crash which can be showstoppers for many applications when MyISAM would be sufficient otherwise.

But this is only first version - further version to include full transactional storage engine with MVCC and row level locks functionally close to Innodb or Falcon. Though many internal architecture decisions are different from either.

What I also like about Maria is - it gets tools to check and repair tables from the very first versions as well as has tables movable between the nodes one by one. This functionality is may be not in line with serious traditional DBMS thinking when data in theory never is corrupted and database maintains consistency between tables so you should not be moving them around in binary format but it is often so convenient in practice.

I will not say anything about performance of Maria because performance is not the main goal of this release and Monty tells me there are a lot of things which are not optimized yet. Some of these will be quite soon others will be fixed in one of the next Maria versions.

We’ve been testing Maria for a few weeks now and should warn you it is still Alpha software - we’re finding bugs and Monty and team fix them promptly. The passion and speed of bug fixes however makes me think it will be stabilizing rapidly, and the best thing you can do to speed up this process is download maria and give it a try on your workload.

It is also worth to note number of links Monty mentions in his announcement still do not work - it takes time MySQL to update documentation and make worklog entries publicly visible, but at least we have the the sources available now.

In general MySQL seems to keep low profile about Maria (there was almost no mentions on conferences in articles etc even though it was in works for almost 2 years) I guess there are some marketing reasons for that - with Falcon being storage engine of focus for last couple of years MySQL probably does not want distractions. Not to mention showing there is at large extent similar storage engine in works would leave impression as there is a chance Falcon would fail and never deliver its promises (so there is backup) or turn not to be transactional storage engine of choice for future MySQL.

Again, Congratulations Monty, these are both great news !

UPDATE: I now see some binaries are made available, some Maria Documentation is also now available at MySQL Forge.


Entry posted by peter |
2 comments

Add to: delicious | digg | reddit | netscape | Google Bookmarks

Related Posts

(Blog Tales: Blogging is Only the Beginning) (Blog Tales: Blogging is Only the Beginning) (I haven’t given up blogging yet…) (Yes, it’s been quieter than usual around here…) (Linux Magazine: Exclusive: Interview with Monty Widenius

No more MySQL Crash Safe Replication in 5.0 ?

As you might know even if you’re only using Innodb tables your replication is not completely crash safe - if Slave MySQL Server crashes/power goes down it is likely for relay logs to run out of sync (they are not synced to the disk) plus position on the master which slave remembers becomes stale.

During MySQL 4.0 and 4.1 series there was a great workaround if you’re using only Innodb tables - Innodb when Innodb does crash recovery it would print position in master log files up to which replication was done:

SQL:

  1. InnoDB: IN a MySQL replication slave the last master binlog file
  2. InnoDB: position 0 115, file name portland-bin.001717

All you needed to do is to use –skip-slave-start on the slave server and have a little script which will do CHANGE MASTER TO to specified location to restore replication in case of crash (assuming you’re only using Innodb tables of course)

Another way this functionality was usable is cloning Slave->Slave by use of LVM without pausing replication (so you can get consistent master position).

It is all great but it does not work any more in MySQL 5.0 Baron has spotted it by incident when we were verifying some of examples for High Performance MySQL book.

In the bug Heikki explains the code was probably removed in MySQL 5.0 during XA implementation though the code which prints the data back on recovery was not, so it prints you some log file name and position but they have nothing to do with real position on the master anymore.

I hope Innodb team will find a way to restore this functionality or at least remove confusing message which leaves impression this thing works.

Until this issue is fixed getting Crash Safe replication with MySQL is not impossible but surely more complicated and has much higher performance overhead - you can run slave with –sync-binlog and –log-slave-updates so you can see what last statement was executed before the crash and then find matching position in the master logs.

Interesting enough similar functionality is implemented in Mark Callaghan’s patches if you use rpl_transaction_enabled=1

Note even though this functionality is currently broken other somewhat similar functionality works as expected.
Innodb during recovery also prints position in the MySQL binary log:

SQL:

  1. InnoDB: Last MySQL binlog file position 0 589600615, file name ./galax-bin.001376

This one is helpful in other cases - for example when you’re taking LVM snapshot (for backup or to clone slave from the master) and can’t do traditional and recommended way with FLUSH TABLES WITH READ LOCK for snapshot creation. This happens when you have large amount of tables or your load pattern is to cause unacceptable stall if this lock is used. You can just take LVM Snapshot (assuming you’re only using Innodb tables and not touching your MyISAM system tables) and use this position to point to proper location on the master, or later use for point in time recovery using binary log.


Entry posted by peter |
No comment

Add to: delicious | digg | reddit | netscape | Google Bookmarks

Related Posts

(How To Set Up Database Replication In MySQL (16 Jan 2006)) (How To Set Up Database Replication In MySQL (16 Jan 2006)) (MySQL Replication and Slow Queries) (Beware: key_buffer_size larger than 4G does not work) (TechNet Webcast: A More Secure and Well-Managed Infrastructure (Part 11 of 18): Secure Data Access With SQL (Level 300)

January 25, 2008

Walkthrough: Building a Mobile Game in Visual Studio® 2008

The latest version of Microsoft® Visual Studio® includes a lot of new treats for mobile developers. In addition to new debugging tools and emulators, it includes the Windows® Mobile 5 SDK, .NET® Compact Framework 3.5, and SQL® Server Compact Edition 3.5 out of the box, without additional installs. This walkthrough gives you the code and assets for a fully functional Hangman-style game called “W80 Words” (weighty words), which takes advantage of the new platform and coding environment.

Related Posts

(Your First Windows Mobile Database App: SQL Server 2005 Compact Edition (CE) on Windows Mobile 6) (XML Everywhere: DB2 9 and Ajax, Part 1) (XML Everywhere: DB2 9 and Ajax, Part 1) (Building Mobile Web Applications with .NET Mobile Web SDK & ASP.NET) (Building Mobile Web Applications with .NET Mobile Web SDK & ASP.NET

Copilot is now free on weekends

Remember Fog Creek Copilot? The app that our 2005 interns built that lets you remote control someone’s computer over the Internet to help them with technical problems?

Well, recently we figured out that we’re paying for a lot of bandwidth over the weekends that we don’t need, so we decided to make Copilot absolutely free on weekends. Yep, that’s right… free as in zero dollars, free, no cost, no credit card, no email address, nothing.

How it works: You go to https://www.copilot.com, enter your name, and get an invitation code. You then download and run a tiny piece of software. Tell your friend the invitation code, they go to copilot.com and enter it, and they download a tiny piece of software. Now you’re controlling their computer. Works with Windows or Macintosh, through almost any firewall.

Details: Weekend = 8pm EST (GMT-5) Friday night to 2am EST Monday morning. Copilot subscribers can use Copilot free on weekends, too.

ALSO! The Copilot team is still hard at work; Copilot 3.0 is just starting to enter testing. Tyler and Ben want to hire a Summer intern in marketing for the Copilot team. If you’re a smart college student that’s more interested in marketing than software development, please apply by emailing your resume to jobs@fogcreek.com.

Not loving your job? Visit the Joel on Software Job Board: Great software jobs, great people.

Related Posts

(Fix your mom’s computer for mother’s day) (Cobranding Copilot) (Happy Mother’s Day!) (Some reviews…) (Shutdown in OS/X
« Previous entries