Recently in Web Tech Category

WebException and the HttpWebResponse

The following code is used to make a request and get the results:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://bbrown.info/");
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
StreamReader reader = new StreamReader(resp.GetResponseStream());
string contents = reader.ReadToEnd();
resp.Close();

contents will contain the HTML of this blog if the server gives a 200 OK response. Anything else will throw a WebException. You can wrap the snippet above in a try-catch to handle a non-200, but the exception is thrown in the GetResponse call so you get nothing from the actual response. 404? May as well be a 500.

Today I discovered that the WebException itself has two properties: Response and Status. This Response is the same as the resp above so you can extract out the server response in the catch.

This whole behavior of HttpWebRequest is counterintuitive in the sense that a non-200 is not an exceptional circumstance; I would have expected the response to be accessible and the status code to be populated.

How to Parse DateTimes from the Twitter API

If you were wanting to interact with the Twitter API under .NET, you might find yourself trying to convert a date value from the XML results over to a DateTime in your code. Twitter uses a weird format for their dates—Thu Sep 04 11:09:28 +0000 2008—that doesn't get converted properly with just a good ol' DateTime.Parse. You could spend a lot of time iteratively trying to figure out the correct format to use. Or, you could just use the following (my free gift to you, dear Twitter-API-consuming reader):

DateTime.ParseExact((directMessage.SelectSingleNode("//created_at").InnerText), "ddd MMM dd HH:mm:ss zzzz yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

directMessage here is an XmlNode representing a single direct message extracted from a list of direct messages. I found this out after many iterations since all of the .NET libraries for Twitter just punt on this conversion.

The Land of Unicorns and Rainbows

"This shit is too pedantic, too convoluted, and violates too many preconceived notions of how authentication works. Instead of trying to figure out your bullshit, a user will just use the same username and password that he uses for everything. Problem solved." — Ted Dziuba, "OpenID is Why I Hate the Internet"

Polishing the Chrome

I've just finished reading Scott McCloud's comic book introduction to Google Chrome, Google's new browser that will be released tomorrow in some fashion. I am very intrigued by this new player and I think McCloud's work is an accessible introduction to the basic ideas behind the design. (Of course, it could have been summarized in a single page or blog entry much more efficiently than being spread over 40 pages but McCloud did a great job in explaining things.)

When Jason Kottke first began speculating that Google was working on its own browser, I dismissed it just like I did his notion of Google OS—a Linux distro with Google branding. (I'm not sure Kottke can count this as a win, by the way, since five years worth of bupkis does not make for a successful prediction.) It seemed like an overreach for Google, well outside its focus. The intervening years have proven that Google views its mission as pretty much everything on or related to the Internet.

But I think Google Chrome makes a lot of sense. For one thing, Google now has some skin in the game. It can act in such a way that Microsoft and Apple have for so long: if there's some special feature that it would like to be prevalent, it can implement it in its browser and propose it as a standard to some friendly standards body. Microsoft got XMLHttpRequest in there early (among many other examples) and Apple got the canvas element accepted in exactly that way. Google, previously, had to work within the Microsoft-Apple-Mozilla constraints and now it gets to be the interloper, the mole. I think that's a powerful position and likely well worth whatever money Google is throwing at this project.

Also, it clearly has some innovations to bring forth. Putting each tab in its own process is genius. At once it solves the issue of memory leaks and the expansive memory footprint that afflicts every modern browser as well as protecting the user from malicious code in a very effective way. Google also developed its own Javascript virtual machine called V8 to couple to the open-source WebKit. Refactoring the Javascript engine has become a hobby with the browser makers: SquirrelFish from Apple, TraceMonkey from Mozilla, and excuses from Microsoft (paraphrased thusly: "Oh, Javascript isn't really that important. We focused our performance improvements in IE8 on everything else that stunk about IE.") The neat thing about Google's Javascript optimizations is that they took a completely different approach to speeding things up, which means the other browser makers will likely copy them. Innovation in the browser space is an unmitigated good thing.

Finally, as the most popular set of properties on the Internet, Google can drive adoption of its browser by offering improved performance and heightened functionality when visited using Chrome. It can tie its sites into the browser in a way that it never could if it weren't a browser maker itself.

In the end, each of these reasons for developing its own browser also benefit the user so I applaud Google's decision and hope that they can succeed in following through—which has always been a problem in Google's application ADD environment.

[UPDATE (9/2/2008): Google Books has a better version, so I've updated the Google Blogoscoped link to point there.]

Feed and Social Distribution Session

Talk with Jerry Cain, Ari Steinberg (Manager of News Feed Team), and Tom Whitnah.

  • Use the right channel to deliver the right message. Overview of the old ways of communication with users. Requests: when one user wants another user to take a specific action. Notifications: user-to-user to tell a user an action has been taken towards her, app-to-user to tell a user about something important to her from the application. Feed story: when a user wants to share actions they've taken.
  • Feed is the center of communication on Facebook. Old: single stream, not interactive, only 25 slots. New: top stories as highlights, multiple streams of news, more room for application stories to appear, commenting on stories.
  • feed.publishTemplatizedAction: disaster, user-specific token sets made aggregation very difficult.
  • New methods: feed.registerTemplateBundle and feed.publishUserAction
  • Allow template bundles to include several templates per story size, ranging from user-specific to more general. You can define different templates within a bundle to handle 1, 2, and many aggregated stories.
  • Before you launch your application, think about the sort of templates you're going to be using. Calling the API method only allows for one-line stories. Feed forms: FB.Integration.showFeedDialog()
  • Great communications = happy users. Respect users' attention and their friends' attention.
  • Higher acceptance, lower ignore = more requests allocated.
  • Notifications: user-to-user, can be sent to any non-friends who are also users of the app; app-to-user, allocation is approximately seven per week per user.
  • More read, fewer hidden / spam = more notifications allocated.

Q&A

  • Allow access to News Feed? Nope.
  • Handle instead of a bundle ID? Not yet.
  • Facebook applications versus Facebook Connect? No differentiation.
  • (me) Disclose allocations per user instead of aggregate? Can put it on the short-term roadmap, but wary of disclosing who is a tattletale.
  • Statistics data available via an API call? Someone was working on that but he didn't know the status of that work.
  • Set privacy in News Feeds? Not at this point but hopefully someday.
  • Timeline for new statistics to appear? In the next week or so.
  • Give visibility into an app's spamminess? Talked about it with the Reviews application but have found some spamminess within the Reviews application itself.
  • What kind of history for allocation reductions? Spamminess metrics last about a month.
  • Expand News Feed on friends to see more of a story? Haven't really thought it.
  • In stories themselves, possible to see how many times one was read in News Feed? Would like to, but not a high priority.
  • Add or view comments, available through API? Probably through fb:comments, not allow to add comments programmatically due to spam concerns.

Talk by Ruchi Sanghvi and Josh Elman. Here are my rough notes on the presentation:

  • The never-ending profile was the motivation behind the redesign.
  • Emphasizing feeds: increases engagement and encourage content creation
  • Simpler, cleaner profiles: easier profile navigation, clearer identity, more control
  • More control over profile: users decide about tabs, when to publish, and look of stories
  • "It all starts with the Wall": feed, publisher, profile boxes
  • Stories: one-line, short, or full (up to 500x700). Done with feed forms, using FBML or Javascript.
  • Publisher: different versions for user and friends,
  • Info tab: deep integration with structured information, should represent information about what the user's done. Info stuff is enabled through canvas page button using FBML or Javascript.
  • Tabs: provides the richest expression, hybrid of a profile box and canvas page (solely FBML, no advertising), no caching, 760 pixels wide, no autoplay, fb:visible-to-owner
  • Profile boxes: profile_main -> narrow, on Wall, wide and narrow appear on Boxes tab, Bookmarks will be migrated, must manually add a bookmark otherwise.
  • New permissions/lack of adding: reduces friction. First access provides user ID, friends, pic and names, publish feed stories, send requests. Add require_login to links to trigger permissions solicitation.

Q&A:

  • How do users first get into the app if they're not adding?: About page much more static.
  • Should apps offer all integration points and let users decide or pick some?: Both, but mostly the latter.
  • Is user info going to be available to all? Still limited to privacy settings.
  • What can the Publisher do?: Rehashed already shown options
  • Smiley app? Uses shared preferences, which has been available for 9 months
  • Can you detect whether a user is in new profile? Yes, part of API.
  • Widened Wall, is it final? Yes.
  • (from me) Extended permissions, is the Wiki list definitive? Yes.
  • Engagement metrics, what are they? Bunch of them. User can reorder boxes.
  • What are these info sections? Not a mini-feed, opposite of one. More for static information. Button on canvas page shows example, the user allows it, adds it to profile, and edits inline.
  • What new stats will be available, users who have added tabs? Yes.
  • Logged in user for tabs is viewer or user? Viewer. Tabs focus should be on the user.

Off to F8

I'm getting ready to fly out to San Francisco for the F8 Conference put on by Facebook. We're leaving Phoenix at 7:20 AM and returning to Sky Harbor by 10:30 PM, so it's going to be a long day but very much worth it—I hope. I plan to blog my raw notes for each session throughout the conference for my colleagues that couldn't attend as well as posterity.

Armchair Architects

In case you haven't heard, Twitter's been having some alarming downtime due to scaling issues. It's become quite popular and continues to grow significantly in both traffic and users every month. As more and more people come to rely on its unique service, these outages have grown increasingly frustrating and that has lead to a minor cottage industry in the blogosphere: complaining about Twitter and ponying up solutions to help them out of this situation.

So here's what they need to do: shut up and realize that, by and large, they've got no idea what problems the Twitter team is having and no credibility in offering advice. Oh, you thought I was going to join in the chorus. While I have some experience with scaling in working in online banking and then a popular hosted blogging engine, I won't pretend to have any special insight into the problem. Unfortunately, many of my fellow bloggers don't share my restraint.

Just to give you an idea of the scope of the problem, Dare Obasanjo's entry details some of the complications that become obvious after more than a superficial rumination. Some might say that attacking this is easy, but they're dead wrong. What's even worse, the application that the Twitter developers originally built wasn't what it has become.

Second guessing and judging based on insufficient (or absolutely no) evidence is practically the coin of the blogosphere. Twitter needs to fix their problems, but I guarantee that their team cares more about doing so than you ever will.

[UPDATE (5/30/2008): More details.]

Lock-In

Google recently announced its AppEngine initiative and I can't say I get who would want it. It strikes me as too inextricable from Google.

Amazon Web Services operates in a similar fashion but it is clearly serving as an infrastructure provider rather than a platform. While it'd be hard to migrate off of AWS if you ever chose to do that, it's not as if you're promoting Amazon by virtue of creating and running your application. At every turn, the AppEngine application uses Google products like Google Checkout and Google Accounts. Building a business so closely associated with the largest Internet company in the world strikes me as perilous.

AppEngine aspires to be a platform like Facebook has become. But it lacks the social aspects that make Facebook so attractive as an application platform. So, ultimately, I think AppEngine's main competitor is not Amazon, Facebook, or even Microsoft (which has its own cloud initiative in development) but Ning. Who's Ning? Exactly. I just don't see this market as compelling so I don't understand why Google's entered it.

Rick, Rick, He's Our Man

Over at Found on the Web, I've made my first April Fool's joke. As you might expect, it's Rick-Roll related.

Here's the Javascript I used:


<script type="text/javascript" language="javascript">
var links = document.getElementsByTagName("a");
for (var i=0; i < links.length; i++)
{
links[i].onclick = function()
{
location.href="http://www.youtube.com/watch?v=oHg5SJYRHA0";return false;
};
}
</script>

It gets every hyperlink on the page, loops over them, and adds an onclick event handler that performs the redirect.

Managing Content

So I'm looking for the best open-source .NET CMS out there. Here's what I've found for options:

This is the part that I really dread: deciding amongst competing technologies. Each of them has features that I like and some of them even have user interfaces that I prefer. But then, at the same time, you have to look at the codebase and decide which is the one that is extensible, maintainable, and understandable. And the two assessments rarely overlap.

In this situation, there is no overlap. Rainbow Portal has probably the best user interface, but it's development seems completely stalled and the codebase is, well, terrible. Cuyahoga has an okay user interface (from what I can surmise given the lack of a demo site), an okay codebase (no unit tests, NHibernate pain, fairly straightforward separation of modules from core code), and decent development cycles but a rather lackluster slate of sites using it. Umbraco has an odd codebase (I found it very confusing at least), unknown user interface (really hard to pin it down from the code), good development cycles, and a pathetic slate of sites. The rest of them I didn't like for one reason or another.

Ultimately I have to pick based on which CMS has the codebase that I can live with most. If the user interface isn't that compelling, I can make it better if I have source that I'm comfortable with. Plus, I'm going to be extending the hell out of it so it's got to be robust enough that I'm not fighting the tool to expand and create new applications or modules.

Cuyahoga seems to be it. I just wish I could be more satisfied with the choice; I guess that couldn't happen unless I was rolling my own.

Internet Exploder

With the imminent release of Internet Explorer 7 and my MetaWeblog feature in the can, it's time to start taking care of a few visual glitches in IE7 with my app. I installed it, requiring my first restart in 59.5 days. (Side note: I abhor restarting. I can't think of a Windows restart that wasn't a royal pain in the butt and this restart was no exception. Somehow my projects unbound themselves from source control and so I had to wait forever to re-establish the connection. Boy do I hate restarting.)

I was slightly ready for IE7 since I had read its upcoming feature lists since it was announced. I knew that there would be some CSS issues and that the UI had changed to add tabs and such. My first impression? Firefox use is going to skyrocket!

I was at first confused by the blank tab to the right of the normal tab line. I've got a malfunctioning extension on my Firefox that makes something like that when you right click in the tab line so I thought it was a glitch. Then I clicked on it. Hoo ah! That blows! I didn't know what to expect but it wasn't opening a new tab and retaining that faux tab.

So then I needed to go to our defect tracking system, which I've helpfully bookmarked. Umm, where's the bookmarks? Uhh, where's the menu? I had to bust out laughing because I can't believe anyone in their right mind would eliminate the menu bar from a Windows application. There's UI experimentation and then there's UI madness. A colleague finally pointed me out to the star under the address bar. Lo and behold, there's my wayward bookmark.

I'm not sure what it is, but the interface leaves me unsettled. I feel like there's so much missing or hidden. It's not just a lack of familiarity because Safari has a very similar, minimalist appearance by default. Oh, but it does have a menu. I think the menu is the biggest factor in my unease.

I consider myself a power user and a browser afficionado. Hell, I have bought browsers because they had neato features. If I had this first impression with IE7 given my context, how are the masses of Windows users going to react when this thing is foisted on them and there's no easy path back to IE6? I stayed on IE5.5 much longer than anyone I knew because there were some quirks with IE6 I didn't like. I ended up upgrading because of the constant nagging and pressure to do so. And there was no way to downgrade by that time. People are going to go nuts about this.

Luckily, there's an excellent alternative just waiting for the forced update.

[UPDATE (10/19/2006): GAAAAH! They released it! Time to step up the fixin' something awful.]

Re: reBlog

I read Matt Haughey's overview of reBlog on Lifehacker with considerable interest. I am a Bloglines user too and it often is hard to keep up with the 280 or so feeds to which I subscribe. I like the idea of a feed aggregator designed for power users and I can't imagine a feed reader that requires installation on a server to ever be ready for the average user.

I installed it and imported my OPML list from Bloglines. It got about halfway through the list the first time before it timed out. The second time worked better because most of the feeds had already been set up. The keyboard navigation was everything Matt said it would be except for the fact that it wouldn't hold my keyboard navigation setting in the session—a known problem. Having to hit the "/" key on every page was annoying but I still didn't have to move my hand from the keyboard.

Then it hit me. This is my application at this point. I've installed it, blocked access to the world, and I can do whatever I want. So I changed the session-reading logic so that there wasn't a possibility that keyboard navigation could be off. And it worked beautifully!

It's really simple: open up the file /your-reblog-folder/library/RF/Utility.functions.php and change line 125 from : 0); to : 1);. If it's not line 125 in your installation, find the line after the line reading REF_USE_KEYBOARD and make the change.

Google Web Analysis

Web Authoring Statistics: I can't believe how incredibly interesting this is. Google analyzed the way over a billion Web pages were composed and distilled it into various statistics. I love it.

Out of Beta

Web Developer, easily the best extension for Firefox, has hit 1.0. The new features are impressive and I can't wait to see what he comes up with in the future. Congratulations!

The UI is the Application


I had a weird confluence two weeks ago. Early in the day, I read this blog entry over at CodingHorror.com—great blog by the way—about how the user interface is the application. Then, a coworker lamented how much he hated UI work compared to the clarity of working in code-behinds. Finally, I was talking to Bob Parsons about the progress on the application I'm working on when he asked how it looked and mentioned that the UI is all important. These three events were so glaring when taken together that I had to ruminate on them.

I'm now very convinced that the user interface is actually everything. You can have the cleanest, most object-oriented code possible but no one that matters is ever going to see it. In other words, your code could be horrible, dreadful code pasta and customers could still flock to it. I'm not suggesting that code cleanliness is unimportant—far from it, in fact, because spaghetti code makes making things better an odious chore—but I am suggesting that beyond a certain level, there are diminishing returns in making things elegant.

I'll admit that I suffer from an ingrained sense of code aesthetics. All my classes are laid out by member type, then by accessibility levels, and then alphabetically. That's crazy organized, for those keeping score, but it's my particular little mania and it doesn't take a long time to maintain. Outside of that obsession, though, I'll do whatever fulfills the interface requirements. That means that I've used a GOTO statement before and that means that I'll use a Repeater even though a DataGrid is far easier. There's really no place for dogmatism in web application development.

For as long as I can remember, I've seen managers focus exclusively on the look and feel of a web application—often getting hung up on the smallest little details. A small quirk here and there during development is to be expected, but it can often derail a presentation or demonstration. I've always thought that managers afflicted with such beliefs were lacking in vision and hung up on the superficial. By and large, that was a fair assessment. The people displaying such behavior were both near-sighted and superficial.

But to hear Bob Parsons say such a thing really made me question my thinking. He's definitely neither. His business sense is on display for me every working day. His opinion is not dismissible as the vapid blathering of someone who loves to hear himself talk. I started to ponder what it might mean to say that, paraphrasing, looks are everything. That's what led me to realize that the customer is never going to see anything except the looks. He doesn't care that you chose SQL Server over MySQL or ASP.NET over Python or a table-less design over font tags.

As long as the site comes up quick enough (a ever-diminishing requirement as broadband gets more widely purchased), you could be running an Access database with a FrontPage-created UI. The customer's sole concern is whether your application is worth the money he's paying. (If it's a free application, then he only cares whether it's worth the time he's investing.) That certainly puts the relative importance of many of the web developer's cherished decisions into sharp relief.

It also means that if you're not willing to come up with a stunning user interface, then you better price your application pretty cheaply. This is assuming, of course, that you've got little in the way of competition. That's a huge assumption in this day and age since the barriers to entry have never been lower. Conversely, if you've got a stunning interface and a useful application, then you can kick your pricing up a touch and get away with it. This latter conclusion is bolstered by the excellent fortunes of Apple since 1998.

All of this has some relevance for the product I'm developing at work, to be sure. But mostly it's applicable to the idea I'm devoting my spare time to. That's right, I've finally decided what to do with my life. For a long time, I was torn between writing a series of books, developing a non-profit surrounding an online encyclopedia of Phoenix history, and becoming a software entrepreneur (don't call me an ISV, please). Each of these options suits me terrifically but I'm mostly interested in what might have the greatest returns the soonest.

I think the books have the greatest potential with the lowest risk because each book in the series will build the audience for the next one and no one else would come up with the same book I can. Unfortunately, the books are really suited to someone with a bit more career experience and I think a lack of credibility would be a serious hurdle to overcome.

The non-profit history project has no substantial monetary return but an incredibly satisfying emotional one. Hell, I'll finally be using my degree in history. That would make me feel a lot better about the student loans I'm paying on right now. Luckily, though, Phoenix history isn't going anywhere and will be easier and more satisfying when I'm older anyway.

So that pretty much leaves the entrepreneurial option. That suits me very well and can be very rewarding, but I was quite adrift due to a lack of a good idea. I've got that now—several, in fact—and an excellent opportunity that will pass by November if I don't act soon. That makes for a considerable catalyst to my daydreams and I'm knee deep in a functional specification that I hope to complete soon. I'm still not sure how much I want to publicly reveal or to what degree I'll be blogging about my experience as a startup, but you readers will be the first to know should I opt for transparency.

And you better believe I'll be focused on the application's interface. More so than I ever would have before.


Hey Foxy!


For developers contemplating switching to Firefox, be aware that there's much more recommend the browser than awesome standards compliance. With the addition of a couple of extensions, you can turn it into the developer's wet dream (or equivalent—if there is one*—for the ladies). Here's my quick list:
  • Web Developer: there's so much to see and do that it's hard to know where to begin. This toolbar allows you to disable all sorts of web functionality to see how your app looks in barebones format. It's got a form population feature that's tremendously helpful when testing interfaces. There's some great features that help you visually see different elements of the page that you'd normally have to go down to source to view. The clincher, for me, are the CSS features. The option entitled "View Style Information" shows the complete cascade when you hover over an element and the exact set of styles being applied when you click on the element. The "Edit CSS" option is an absolulte godsend when doing any sort of complex CSS, which is what I'm great at. It opens up a sidebar with the external stylesheet. You can then edit the styles and it dynamically displays the results in the page. No reloading, no save-and-refreshing. You can then save the stylesheet or revert back to the unaltered one. If this feature sounds impressive, it's even better when you see it in action.
  • Venkman: this is an extension that adds a full-featured Javascript debugger to Firefox. Yeah, I know you can use Microsoft's debugger for Javascript but I've never gotten it to work to my satisfaction. From what I have seen of it, Microsoft's version lacks a lot of neat stuff in Venkman. I love how you can debug all Javascript, even the stuff that the browser is using internally. There's even syntax coloring and profiling, though I'm not sure how useful that really is. If you've ever used VisualStudio's debugger, then you'll be right at home in Venkman and you'll understand its utility.
  • DOM Inspector: Venkman has a DOM inspector side to it, but it's overkill for most DOM inspection needs. You can do searches for a particular ID and then see the node from all sorts of different angles. I use it a lot when I didn't have the foresight to start up Venkman but I need to see the state of a Javascript object or all the CSS being applied to a particular element.
There are tons of other great extensions out there, but this triumvirate is downright indispensable to the web applications developer.

* The female orgasm is always trumpeted as the best and most powerful but I don't think any lady has ever had one in her sleep.

[UPDATE (8/2/2005): Did I really discuss "nocturnal emissions" in the context of recommending Firefox? Weird.]


On the Way to the Forums


Vanilla: Vanilla is a brand new open-source forum software that's stated goal is to "the mold created and followed by just about every other forum on the web." This jibes with my experience in bulletin boards—I've found them pretty much all the same, even down to their interfaces. The only other different forum software I've run across is PunBB and that's not that different.

Sometimes it's good to follow the pack: conventions make user interfaces easier for users to understand. Most of the time, to my mind at least, it's great to re-examine the premises of commodity software and see if there's still some innovation to be had. I'm definitely going to try out Vanilla at my community's fledgling virtual community.


Python on Rails


I've been intrigued by all the hoopla surrounding Ruby on Rails. It's a web application framework that is described by its practitioners in exactly the same manner as Cocoa is lauded. They say that the framework takes care of nearly everything, so you just need to write the glue and functionality. I don't know how accurate that is since I've never used either. I haven't bothered trying Ruby on Rails because the installation process sounds like a tedious pain. Sure, my host now supports Ruby on Rails but I don't want to have to do all my development on a remote server.

Now there's a similar framework available for Python called Django. Python is a language that is nearly ubiquitous in the Unix world and has some language features that I really like. I think that learning Python would have much greater utility than learning Ruby, even though Ruby on Rails is hot, hot, hot right now.

[NOTE: There's also another Python framework that more explicitly tries to emulate Ruby on Rails: Subway. {via}]

[UPDATE (7/17/2005): I thought of another reason to learn Python over Ruby: PyObjC. It's a Python bridge to the Cocoa libraries. That would provide a nice transition to using Objective C, which is a direction I'd like to eventually head.]

[UPDATE (7/18/2005): Simon Willison, one of the creators, shares the backstory.]


Online Outlining


I can't believe I never mentioned Sproutliner before. It's a free, online outlining web app that's surprisingly robust. It gets even better because its creator open-sourced it recently. I liked the hosted option, but it's very openness made me unable to use it for sensitive matters. Now I can host it on my own site, put it behind some authentication, and use it to my heart's content.

It took a little doing because I didn't install it into the root of my domain. The developer made it so that every link and reference was root relative, i.e., "/some-path/some-file.php". There were a lot of those references, so it took awhile to hunt them down—a global replace didn't work, unfortunately—and make them plain ol' relative.


About this Archive

This page is an archive of recent entries in the Web Tech category.

Travel is the previous category.

Find recent content on the main index or look in the archives to find all content.

Feedback to

Monthly Archives