Category/Item Breakdowns (July 8)

From 1989 until 2007, I taught classes for our estimating and accounting software. It was a good excuse to visit most parts of the US and Canada. The classes covered the Excel-based MacNail, then the current Goldenseal. Over 1000 users attended, and learned how to improve their businesses. I also learned first-hand what people found most confusing.

One problem area in Goldenseal was the two different ways you can itemize things in estimate and expense breakdowns. There are category breakdowns, where you just type stuff in. Also item breakdowns, where each line pops up a list of unit costs (Assemblies or Cost Items).

With hindsight, the split isn’t as useful as we first thought it would be. There still has to be a way to type unlisted things into a item breakdown. And category breakdowns still have to reference items like Bids and Allowances. They really aren’t different enough to be worth the extra fuss. Even worse, the names are rather confusing.

With Goldenseal Pro, we have a chance to fix some of the design flaws in the original Goldenseal. The category/item split is one of the worst. Goldenseal Pro will have just one type of breakdowns for estimates, expenses and sales. That’s one less thing to think about. One less thing to explain.

In Goldenseal Pro, if you want to pop up a material cost item, you’ll use a Material Item. If you want to type in a material, it’s Material Text. Ditto for labor, subcontractors, equipment or other costs. The names are revised from the current version, but they act the same otherwise.

This week we finished the code that converts old-style breakdowns to the new format. That way old data will still be usable. It probably will take a few more weeks to get all the little quirks working for breakdown tables. We can link into existing code for some of them, but some will be easier to just redo in Qt.

At first, testing showed weird errors. Eventually our staff discovered that for expenses, the menu doesn’t include the option to type in materials. For 20 years our testers never noticed it, and nobody ever reported it as a bug. I suspect it was because the whole category/item thing is so confusing. Nobody ever realized it was just a bug with an easy fix. Anyhow, it works properly now for Goldenseal Pro.

Breakdown tables are already further along than we ever got in our previous efforts with Cocoa and MFC. Progress is looking good. It’s just a matter of time.

BTW right now is the perfect time for users to tell us about any other frustrations with Goldenseal. It’s not too late for us to make design changes to improve it.

Dennis Kolva
Programming Director
TurtleSoft.com

OOP (Jun 29)

Running a business is complicated. A construction business is more complicated than most, with plenty of quirks. Because of that, writing construction accounting and estimating software is a challenge. There’s always one more weird thing that needs to be handled.

To help keep the programmers sane amidst all that complexity, Goldenseal uses OOP: object-oriented programming. It uses code that looks more or less like the real world. With luck, OOP makes everything a bit more logical and easier to understand.

For example, to handle change orders, there’s a CChangeOrder class. It stores data for change orders, and does math and other tricks for them.

Object classes can have parents and siblings. The parent of a CChangeOrder is a CBreakdownTransaction (also the parent for all other transactions that have a breakdown table). Allowances have change orders as their parent. They inherit most of the same behavior as change orders, but tweak a few things that are different.

Our staff spends plenty of time designing objects and their contents. If it’s done well, coming back years later isn’t be too painful. Stuff still makes sense. If OOP is done poorly, then it turns out to be a confusing mess.

As we hook up Qt with our existing code, we find some of each.

All the data classes like CChangeOrder are great. No need to touch them at all. So far the database code is also working well.

Breakdown tables are more challenging. We had to write them from scratch in the original Goldenseal, so they have thousands of code lines for screen drawing, mouse clicks, and other interface details. Most of that is handled automatically by Qt table classes. Our staff is still figuring out what can be deleted from our old code, and what has to stay. Fortunately, we don’t need to clear out all the clutter right now. Sometimes it’s better to wait and be sure it really can be tossed. Sorta like cleaning the garage.

The hardest kind of OOP in Goldenseal is the link between what you see on the screen, and what’s stored on disk. We have a DB_RecordViewer class that handles that: record loading, saving, and everything in between. Its children are specialized to manage specific types of records: for example, CChangeOrderViewer for change orders.

As with tables, there is plenty of excess code in there. Newer frameworks already handle much of the nitty-gritty of screen display. We still need record viewers to handle the quirks, but they talk with a Qt object for most things.

Last winter we got records loading from disk onto the screen, and last week we got data saving from the screen back to disk. It’s coming along.

Dennis Kolva
Programming Director
TurtleSoft.com

Decisions & Breakdown Tables (June 14)

What amazes me most about the recent real estate sale efforts is how little time some folks spent on a such a big purchase decision.

One buyer sent her sister to look at houses. She viewed by phone, liked the first house they visited, and made an immediate offer. The contract was signed and accepted the same morning. My house was third on their list so they never got that far.

There is a saying: “don’t marry someone until you’ve summered and wintered with them”. That may be a general rule that can apply to all decisions. If so, it probably needs to be adjusted for decision size. That rule of thumb calculates out to between 1.75% and 5% of the final cost or investment, depending on how you figure seasons and marriage length.

If the logic is right, you should spend 30 to 90 seconds deciding where to eat lunch. A $100 tool deserves 4 to 10 minutes of thought. It’s worth 35 minutes to 1.5 hours of research for a $1000 computer setup, and 23 to 70 hours for a $40K truck. A $300K house purchase ought to get 170 to 500 hours of planning.

You can plug in your own numbers: the spreadsheet is at this link. My guess is that most people over-think small decisions, and under-think the big ones.

I’m still looking at Zillow and Realtor.com daily, in prep for a sale/purchase in March 2022. It will be a more educated decision then. The past few months I was busy finishing up construction work, and didn’t spend 170 hours on buying research. Maybe I can summer and winter with some of the fixer-uppers that are still unsold, and get a better sense of their flaws. Kinda like dating, with hunks of wood and masonry.

Meanwhile, our staff is back to making progress on Goldenseal Pro. Last week we hit a big milestone: smart fields now pop up a list of items when in a breakdown table. It’s a small bit of interface, but we never were able to make it work in Cocoa for Macintosh. MFC for Windows was even worse: we never got tables to work there at all.

Doing it in Qt took a few days of futzing, but that’s not bad. Most likely, everything that we need to do will be possible with Qt. Just a matter of time.

Dennis Kolva
Programming Director
TurtleSoft.com

Real Estate #2 (May 26)

During the pandemic year I stayed home a lot, and fixed up my house: new roof, paint outside and in, floor sanding, minor repairs. Power tools have improved greatly since my last big construction projects in the 1980s and 90s. It made the work very satisfying. Lithium ion rocks!

I thought seriously about moving on to another fixer-upper. So I listed the house as a FSBO (for sale by owner), with plans to use a regular real estate agent if that didn’t work out. Besides the potential to save on commissions, doing it all was educational. Also, easier to coordinate buying, selling, final construction work and clutter removal.

The house went onto Craigslist March 31. That listing was a dud: two agents called, plus one possible buyer who never followed through. In past years I’ve listed raw land a couple of times, and those were much more successful. Not sure why the difference.

Houzeo promises MLS listings for about $400. I signed up, but soon canceled and got a refund. For this area they use a state-wide agency based in New York City. Their contact number on the listings never reached a human. There was no way to reach the owner, or get information about the properties. The phone system seemed mostly designed to sell cheap listing services to other FSBOs. Maybe Houzeo is a viable option in some areas, but definitely not here.

Zillow is probably the most popular website for buying houses, so I put a FSBO listing there on April 15. The process was free, and very easy: just upload text and pictures. It even allowed a website link to the house description website.

Zillow was much more successful. The initial traffic report looked like this:

In comparision, MLS listings around here usually get 1500 hits on the first day, and 3000 after a week. It’s necessary to click through to see the FSBOs, and apparently 80% of people never do that.

One buyer stopped the day after it was listed, but decided no after viewing the outside. Eleven others booked visits. 3 came with buyer’s agents, 6 were solo, 2 no-showed. All were pre-qualified with cash or a bank letter. None submitted offers.

ListWithClever.com offers MLS listings for $3000, promising much better service than Houzeo. For this area, they use an agent in Syracuse (more than an hour drive from here). I didn’t discover them until late in the process, and decided not to go that route. Maybe in the future.

I talked to a few Ithaca agents. One seemed great, but she ghosted me for 2 weeks. The main selling season is short around here, and mid-May is already near the end. Waiting until 2022 seemed more and more attractive. So I canceled the Zillow listing and planted the vegetable garden.

The next day, that first buyer emailed to express renewed interest. They toured the insides twice, and really liked the chestnut trim. A week later they submitted an offer for $12K over my list price.

Meanwhile, on the buying end, there was nothing plausible in Ithaca. A few nearby villages and cities had interesting properties at lower prices. I looked at a few and made a contingent offer on one. However, when they turned on the water, the kitchen floor became a pond, and most of the fixtures didn’t work. No insulation, so plumbing probably froze regularly. The basement looked like the old Windows screen saver with random pipes everywhere.

After canceling that one, I looked at a few others. Unfortunately, it was late in the season and the good ones were all sold. It narrowed down to just one late entry, which had zoning problems.

So, it’s back to the pre-Covid routine at least until Spring 2022. Goldenseal Pro will be finished a few months faster.

Is a real estate FSBO worth doing? I’ve had two prior successes with less expensive properties, so it’s a definite maybe. However, selling a nice residence may work out better with an agent.

For one thing, the agent can honestly not mention flaws, because they don’t know about them. I removed almost all the old lead paint, and was proud to mention it during the tours. But I suspect that people just heard “blah blah blah LEAD blah blah” and were scared off. Better to have an agent who side-steps the issues.

There may also be boundary problems. The house may feel less used when you don’t meet the person who previously lived there. Or maybe it’s just that MLS is needed to bring in bigger crowds. Ultimately I had an 8% conversion rate, which may be reasonable for such an expensive transaction. There was a buyer, but having more viewers increases the chances of a bidding war and a better price.

I checked Zillow to see percentages of listings that are FSBO. Across the US it averages about 20%. The high is 40% around New York City, ranging down to 6% in Houston. There aren’t any obvious geographic trends. No easy way to find the success rates for each method.

As for real estate in general, here’s a Zillow map of houses listed at over $20 million:

And here’s the map for housing under $10K.

Happy shopping!

Dennis Kolva
Programming Director
TurtleSoft.com

Change Order Billing & Debugging (May 13)

A long-time user of our accounting software called in recently with a problem in their change order billing. There was a mystery retainage amount that showed up when they billed for the project.

It turned out to be a bug in the printed form. Goldenseal does not track retainage on change orders, but it’s on the printed bill layout. The amount comes from the main project: that works fine for regular project billing, but it is just confusing for change orders. The solution is to use Custom Layouts, and remove that field from the form. Here are instructions to remove it.

This bug has been around for almost 20 years. It’s only a problem for users who create change orders, and also do projects with retainage. Otherwise it just shows zero. That may be why nobody has reported it until now.

For some reason, Change Orders have always been difficult.

Our C++ source code uses object-oriented programming (OOP). Everything is an object, usually inheriting code from parent objects. Allowances, Change Orders, Sales and Rental Transactions all generate income, so they have the same parent. The problem is that some people want change orders to act like miniature projects. Those are job accounts, which have very different parents. There’s no good place to put code that both can use.

For a while, we addressed user requests by duplicating Project code into Change Orders. It became more and more difficult. We finally backed off and decided that Change Orders just need to be their own thing. If you withhold retainage on one, it’s complicated enough to be a separate project. Likewise, if you want a detailed change estimate, create an Estimate record. Those have fancier breakdowns that handle all sorts of estimating quirks. You can link the Change Order to it.

There are some deeper reasons for the bug.

Our estimating and accounting software started out as simple spreadsheets created to run Turtle Creek Carpentry. It was a small remodeling company that didn’t need much paperwork. After computerizing, we took on bigger projects that sometimes involved change orders, retainage, and other fancy stuff. But that only lasted a couple years before the software business took over from construction contracting.

Many of the features in Goldenseal come from user requests, rather than our own needs. Sometimes the programmers must guess how the code should be set up. Sometimes the guesses are wrong. Most programmers do not have in-depth knowledge of estimating, accounting or whatever. There’s a certain amount of faking involved.

We listen to tech calls and user feedback, then fix the bugs to get everything working properly in the next update. It’s something that every software company must do.

Even worse, there is a huge range of construction business types and sizes. They all have different needs. When we add new features, it’s important to not make things more confusing for the users who don’t need them. That takes some judgement and design skill. Sometimes we need to back-track or remove features that are too confusing.

Meanwhile, the past couple months I’ve been wrapped up in real estate selling and buying. It has been interesting, but it’s winding down. More details in the next post.

Dennis Kolva
Programming Director
TurtleSoft.com

File Formats (Apr 23)

Back in 1994 I made detailed blueprints for my current house: enough to get a building permit for the rehab work. Now that it’s for sale, I wanted to show the plans as a selling aid. All the construction project files were still there in an old backup, but nothing would open the drawings.

I don’t even remember which app created the plans. Maybe MacDraw II, maybe MiniCAD. Definitely nothing that runs on current Macs. There is still one laptop here from the early 2000s, but nothing on it would open the files. All the older hardware died years ago.

As developers, Turtlesoft has had a hard time keeping up with changes on the Macintosh. It’s also a problem for plain old users. When an app dies, so does all the data that it knows how to unlock.

I’ve tried out a few simple CAD programs to whip out plans, both for the current house and the probable next one. FloorDesign2 seems like the best so far. However, it uses its own file format. You can print and then save as pdf, but the details won’t transfer to any other CAD apps.

Some types of data do have universal formats. For text, there is plain text (.txt) and rich text (.rtf), which many apps can read. Spreadsheet data translates well as either tabbed text, or comma separated values (.csv). Page layouts can use either .pdf or .html. Databases often uses SQL.

In addition, some apps are so dominant that other software is forced to support their file format. Excel and MS Word are that way. QuickBooks aspires to that role, at least for add-ons. AutoCAD may do it for higher-end CAD. Unfortunately, many apps have their own unique data formats, and it’s difficult or impossible to move it elsewhere.

I don’t know if there is any good solution for this, except for keeping old computers around. They seem to last longer if used regularly.

These struggles also apply to our Goldenseal software. You can export any data to a text file and then open it in Excel. However, there’s no easy way to move all the accounting details to some other app in a single step.

The transfer problem works both ways. We wrote code to import from QuickBooks, but it can only translate some of the data from their export file. The translator brings in all the account setup details, but not purchases, bank transactions or job costing. The two formats are too different. Importing from any other accounting software would be even harder.

One issue for accounting software like ours is security. Having the file format be too accessible is not a good idea. Too much risk that data will be changed or stolen. The Goldenseal file format is not encrypted, but viewing the raw file data is not very useful. Even if someone clever had access to your computer, it would take many hours for them to figure out how to, say, find and change a paycheck amount.

If you are really worried about that risk, you can encrypt the whole hard drive, and protect everything on it. All of the fraud problems we’ve heard about from users have come from employees who could just sign on and enter stuff the usual way. Preventing that kind of fraud requires careful use of password access, and occasional audits by the owner or their accountant.

An employee who enters data should not also be reconciling bank statements. Having a second set of eyeballs on the money adds a ton of security.

Dennis Kolva
Programming Director
TurtleSoft.com

Covid-19 in New York #7 (Apr 14)

This chart shows the local experience with Covid-19 over the past 13 months. Blue is number of active cases, yellow is number in hospital, red is cumulative deaths. The last two are 10x to make them more visible.

There was a bump after every major holiday. Even Halloween. The most recent was mostly Cornell students after Spring Break.

That first blue bump in March/April 2020 now seems downright puny. Of course, NYC and a few other places had a terrible time then. The spare capacity here saved lives. Local medical staff took a bus down to help. Some patients transferred here.

I got the J&J vaccine more than a month ago, but haven’t changed behavior much. The chart explains why. Almost 30% of local residents are fully vaccinated, and over 50% have taken one jab. But active cases and hospitalizations are still worse than anything before November. It’s not over yet.

In the rest of the US, the situation is similar. New confirmed cases are off the winter peak, but still higher than last summer. Most regions are showing a small fourth surge.

Deaths have fallen off faster, probably because older people were vaccinated first. It’s already better than last summer. These days, Covid-19 is mostly a young people disease.

BTW the green bump is because Ohio changed the way they classified Covid deaths, and suddenly added 5,000.

Covid-19 probably is winding down. Unless something dramatic happens, this will be my last post on the subject. It has been an interesting ride. I sure hope we are better prepared for the next one.

Dennis Kolva
Programming Director
TurtleSoft.com

Real Estate (Apr 2)

My house is getting ready for sale. I’ve also started looking at places to buy. The goal is to make both happen at the same time, and not be homeless in between.

For buying, Zillow and Realtor.com are fantastic. Put in the right filters, and you can see a map with everything that matches. I wish it existed for the three other times I bought property. Real estate agents are still doing business as usual, but I think it’s an industry that soon will be disrupted by technology.

As a remodeler, I always talked directly with clients. We negotiated prices and talked out the details. It worked well. A few bigger jobs had an architect involved, but they were not much different than subcontractors: another expert handling their part of the project.

Real estate is very different. Around here, there is a listing agent working for a 3% commission. They are supposed to look out for the seller’s interest. Then a separate buyer’s agent getting their own 3%. It’s more like a lawsuit than a sale.

Usually I try to look at properties with the listing agent, since they know more about the property and the seller. However there’s a fixer-upper Victorian in Waverly NY that had to be done via buyer’s agent. Questions take about a week. I ask the buyer’s agent, who asks the listing agent, who asks the seller. Then it comes back the chain. Often so garbled that it’s not even useful. Three people eager to make a sale, who might be lying.

Aside from the communication issues, those 3% cuts are big chunks of money. They fall from the sky and land on agents almost randomly. That creates all sorts of perverse incentives. It turns some people into assholes.

Last weekend I booked to see a different Waverly Victorian at 2 PM Sunday. The listing agent planned to be out of town, so someone else was going to show it. An agent called me Saturday night. I incorrectly assumed he was the replacement, even though he mentioned the wrong address. Rather than clarify, he got the appointment details from me and said he’d show it. Then he called the listing agent and booked for 1 PM. Then texted me to say the time had changed. He also did some web stalking: looked up my house in the tax rolls, prepared a detailed sale analysis, and spent most of the visit trying to sell me on having him list it. The scam fell apart when I got a call at 2:15 from the original agent, wondering why I didn’t show. Yuch.

Having agents involved doesn’t seem to add 6% of value to real estate selling. So, I’m going to try a FSBO (for sale by owner). I’ll probably have to pay a buyer’s agent. Zillow is very aggressive about pushing them. But maybe I can talk directly with buyers and, you know, figure something out. I’ve sold 2 properties out of 3 that way, and the sales went much more smoothly than the one with an agent.

This is kind of an experiment. I’ll handle the sale the way I think it should be done, and see what happens. There’s already a web page. House for sale in Ithaca NY. Pix, videos, lots of detail. For the next 2 or 3 weeks it will be a work in progress. The house is on Craigslist now. It will list on MLS and the realty sites when there are more photos and videos, probably via Houzeo.

There’s a little construction work still undone, but mostly what’s left is sorting and boxing 27 years of accumulation. Feels good to get everything into better order. There’s already a Home Depot bin full of assorted door and shelf hardware. Another with plumbing. Electrical will need two of them. One bin is nothing but hammers.

Meanwhile, I kinda won’t mind when technology disrupts the real estate biz.

Dennis Kolva
Programming Director
TurtleSoft.com

Goldenseal Pro Progress: Resources (Mar 23)

Goldenseal estimating and accounting software is built from three components. There is C++ source code that runs business functions and the user interface. There’s construction accounting and estimating data in the starter files. And in between, there are resources: text, layouts, icons and other program details.

The source code is compiled into machine language, with no easy way to see it. The estimating data is totally visible and easy to change. Resources are in between.

In the original Goldenseal for Mac, resources were built into the app file. Anyone could use an app called ResEdit to change them. One user actually converted all the text to Spanish. Other changes were possible if you hacked the right resources. Sadly, ResEdit never made it out of Mac OS 9. It was still possible to hack Goldenseal while it ran on PPC Macs, but the switch to Intel zapped all user access to resources. Meanwhile, the Windows version never had resource access at all.

We are still trying to figure how best to handle resources in Goldenseal Pro.

These days, the Mac hides resources inside what’s called a package or bundle. You can see the resources for any app: just right-click on the icon and choose Show Package Contents from the menu. Early on we wrote temporary code that exported all the resources out of the current Goldenseal, and into the Pro version. Those resources were in the bundle, and user accessible.

Apple really likes XML as a way to store data (it’s similar to the HTML that builds web pages). We tried XML at first, but didn’t like it. The text is hard to read: stuff like <tag><anothertag>blahblahblah</anothertag></tag>. Just one wrong punctuation mark, and it crashes. So, we switched everything to plain text. It’s easy to edit in Excel or TextEdit, and reads are 10x to 100x faster.

Qt also manages resources. It wasn’t hard to re-use most of the existing stuff when we switched over. Unfortunately, Qt hides them somewhere. If you open the app bundle, they aren’t visible. There may be some way to make Qt resources act more like Cocoa, but so far we haven’t discovered the secret.

It may be a moot point. Apple has toughened its security: to run Goldenseal Pro on newer Macs we must jump through hoops to guarantee that the app comes from a legitimate source. That probably means that users can’t hack app resources any more. The changes will be considered a security threat and it just won’t run.

We could store resources and other data outside the app bundle, but that makes installation and updates more difficult. Having just two things to keep track of (app and company file) is simpler for everyone.

Aside from the Goldenseal app, there is also your own accounting data, stored in your company file. One of the first things we wrote was a translator which converts existing Goldenseal files into Goldenseal Pro format. It even makes a few improvements along the way.

There is one piece of data that gets lost in the move: pictures. The current Goldenseal stores them in an obsolete format (PICT) which neither Cocoa nor Qt support. Fortunately, there are websites that convert PICT files to .jpg, .png or whatever. When we launch the Pro version we’ll provide links and instructions so you can salvage any pictures you may have stashed away.

Dennis Kolva
Programming Director
TurtleSoft.com

Goldenseal Pro Progress: Layouts & Actions (Mar 16)

After two weeks, Custom Layouts is starting to look like something. It loads fields. You can drag them around on the screen. Click a tool, and you can add a new field. The app is already further along than we ever got with the Cocoa version.

Unfortunately, there isn’t any Qt sample code for doing a MacDraw-like environment. We’ll have to create most of the interface from scratch. None of it is real hard to write, but there are many fussy details. Undo in particular is a PITA.

The original Custom Layouts command needed at least one programmer-year to finish. Qt will be faster, but most likely it will take 2 or 3 months to get everything working well.

This stage of programming is a bit like starting rehab work on an old house. Sometimes you have to knock a few holes in the walls, just to see what the guts are like. Then you can get a better estimate of what’s needed. We kinda just did that with Custom Layouts. Now there’s a clear scope of work, and we know it’s doable.

Speaking of knocking holes, I must share a construction tale from an Ithaca rehab project in the 1980s. It was a small, odd house that had been owned by a custodian who worked at Cornell. The new owner wanted to remove a non-bearing wall to combine two rooms. I tried knocking holes to check for wiring, but couldn’t. It was plaster over an old door, with concrete fill behind it, then wood scraps nailed together, then plaster on the other side. Demolition was like an archeology dig through all the random building materials that someone brought home from work. Bricks, putty, roofing tiles, wadded newspaper, grout, tar, woods of all sorts. Too bad YouTube didn’t exist back then, because the demo (or the construction process) would be an amazing time-lapse video.

Anyhow, next on the agenda for Goldenseal Pro is the final untouched mode: action commands (Reconcile, Pay Bills, Deposit Funds, Project Billing, Sales Billing, Write Payroll, Job Costs). It definitely will be hard, because the current code sucks. Giving a complete overhaul to the interface has been on the to-do list for more than a decade.

The rest of Goldenseal uses Custom Layouts to arrange fields on the screen. It makes setup easy for our staff. It also lets users make changes. Action screens currently use a different system that is awkward for us. Users can’t change anything there at all. Since we have to rewrite anyhow, now is the time to switch them over to the Custom Layouts system.

Our staff probably will be working on the two areas in parallel for a while. If it gets too frustrating, we’ll take a break and work on other, simpler loose ends.

Meanwhile, this winter I’ve been doing major interior work on my house. In 2 or 3 weeks it will be ready to list and sell. This area is in a seller’s market for single-family homes, so it probably will go fast. I’m already looking at fixer-uppers to replace it.

The current house was built in 1910, right after the chestnut blight came through. Chestnut lumber was cheap for a while, so they used it for all the trim work. I wouldn’t mind finding another house from the same era. Chestnut looks great, and it’s easy to work with. Too bad it’s now a fossil.

If the next house needs trim or flooring, I’ll put in ash. This century’s cheap hardwood caused by a major species loss.

Unfortunately, the whole selling, buying and moving process may cut into programming progress for a couple months. We’ll see.

Dennis Kolva
Programming Director
TurtleSoft.com