Bloget™ User Manual

An ASP.Net Web Log Control

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Copyright 2008 Blue Onion Software
All Rights Reserved

Table of Contents

Preface

Introduction
     About Bloget
     About Blue Onion Software
     Program Requirements
     Installation

Using Bloget
     Overview of a Blog
     Bloget Control
     BlogTitle Control
     Categories Control
     Recent Posts Control
     Archive Control
     Blogroll Control
     Membership Services
     RSS Feeds
     Remote Procedure Calls (MetaWeblog and Pingback)
     BlogML
     Comments
     Logging
     Lost Passwords
     Data Formats

Legal Information
     Bloget Freeware License Agreement
     Copyright and Trademark Notices

Technical Support

 

Preface

I recently read a blog article about how writing one's own blogging engine is equivalent to writing yesterday's "Hello World" program. Everyone does one at some point. So here I am with my version of a blogging engine. My "interpretation" is a bit different than others perhaps in that I've expressed my engine as an ASP.NET user control. This packaging has advantages and disadvantages and you'll have to decide if it's right for you. One thing I can say is it has been fun to write and I've learned much about ASP.NET, a platform I have not programmed in before. I hope you find it useful and fun as well and always, send feedback. - Mike

Introduction

While developing the Blue Onion Software Web site I ran into an interesting problem. At one point I wanted to add a blog only to find that there was no blog control included with ASP.Net. A quick survey of the Internet revealed that there really wasn't anything much in the way of ASP.Net blog controls available. Furthermore, the blogging applications that did exist were designed for multi-author systems requiring database support and administration overhead that I really didn't want to deal with. Wasn't there a simple blogging control I could just add to my existing page layouts and that didn't require an expensive SQL Server and an investment in time to learn new templates syntaxes or setup user accounts? I couldn't find anything satisfactory so I bought a book on developing ASP. NET controls and went to work.

I set few goals up front, which I've tried to adhere to:

About Bloget

Bloget is a Web log (often referred to as just 'blog') control for use in ASP.Net 2.0 Web sites. Bloget is implemented as a control meaning you have to insert it into an ASP.Net 2.0 Web page in much the same way you insert other ASP.Net controls. This allows you to integrate your blog into your Web site rather than designing your Web site around the blog software.

Bloget is a whimsical name which is designed to make you feel good about the product and inspire you to throw wads of money at the author (did it work?).

About Blue Onion Software

Blue Onion Software is a somewhat less whimsical name for a group of products I've written over time and which I give away for free including Calendar Gadget®, FreeSnap™, DeskDrive™, Calendar (no I'm not repeating myself) and of course Bloget™. In return, you the grateful user shower the author with money by clicking some of the advertisements on the Blue Onion Software Web site (Hint!) or by donating money. I do it for fun but every little bit does help.

Program Requirements

Installation

Step 1:
Copy the Bloget.dll  assembly to the /Bin folder of your ASP.Net 2.0 Web site. If you don't have a /Bin folder, simply create one.

Step 2:
If you site does not have one, create an /App_Data folder. Bloget requires read/write access to this folder.

Depending on your hosting environment this can be done in several ways. Many hosting providers provide a control panel where folder permissions can be set. If you have access to Windows security options on your host you can set up permissions so only IIS and ASP.NET processes have write access. On IIS 5.0 (Windows 2000) the account used to execute Web applications (IWAM_xxx or IUSR_xxx) needs read/write/modify permissions. The ASP.NET worker process, usually {machine name}\ASP.NET on IIS 5.0 (Windows 2000) or NETWORK SERVICE on IIS 6.0 (Windows 2003) also needs read/write/modify permissions.

Step 3:
Create or use an existing .aspx Web page and add the following two lines of code.

The first line goes near the top of the page usually just under the Page directive.

<%@ Register TagPrefix="bloget" Namespace="BlueOnionSoftware" Assembly="Bloget"%>

And further down the page where you want the blog to appear:

<bloget:Bloget runat="server" ID="bloget" DataContext="~/App_Data/Bloget.xml"/>

Step 4:
Open the Web page in your browser and revel in the glory of your blog. Actually, you'll see a license agreement. Basically it says you're responsible for your own Web site and that you do not hold the author and Blue Onion Software liable for anything no matter how miserable things become for you.

After you accept the license agreement you'll see your first posting. Well OK, it's my posting but it has some really useful stuff in it to help you start using your blog and it only begs for money a little at the end.

Step 5:
Proceed to the Administration Panel (hint, there's a link in the first posting). The default password is "Bloget" (pretty clever, eh?). At a minimum, you should change this password immediately. If not others, less friendly than I will plunder your blog and lay waste to it faster than a pizza delivery driver on a Friday night.

It's worth taking the time to fill out the RSS section at this time since you'll more than likely want to produce an RSS feed for your site. The Title and Description appear in the RSS. The blog link is just that, the Web address of your blog. Again this only for the RSS feed.

Step 6:
Start posting! Returning to the posting in your blog, you'll see links for adding a new posting. Add a few test entries to get a feel for how the process works (you can remove them later). You can add additional controls, enable RSS, Pingbacks and MetaWeblog. See the related sections for more information. 

Step 7:
Think kind thoughts about the author. Feel an overwhelming urge to go to the
Blue Onion Software Web site and click the advertisements. Notice the "Donate" button. Contribute $5 and enjoy the endorphin rush from a good deed done.

Using Bloget

Overview of a Blog

Most blogging engines today can be characterized as Web applications. You download, install and "your site" is up an running. This is a great approach if all you want is Blog and a few other pages. Bloget takes a different approach and is implemented as a control (actually a collection of controls). As such, you have to add it to an existing Web application structure. Like all design designs, this one has both strengths and weaknesses. On the plus side, you can plug Bloget into existing sites and have a fine degree of control over appearance and interaction. On the downside, you have to decide what that appearance will look like.

One of the unique aspects of Bloget is that you can express an entire blog in a single file. The tag line "One file, one binary, one blog" expresses this intent. The One file is the ASPX page you intend to display your blog in. One binary refers to the one binary (Bloget.dll) you need to add to your Web application's /Bin directory. There are no complicated install routines, database setups or Web.config modifications required. Of course "One blog" refers to the blog you produce with Bloget.

Because Bloget is so simple to install, it can be integrated into many places. Often, Bloget is used as a running descriptive log for build environments. As changes to the build configuration are made, the configuration manager can add blog entries describing the changes instead of circulating emails. Bloget can easily integrate into Web based systems like Cruise Control.

Membership support is supplied by ASP.NET's membership services. This means you can use existing ASP.NET 2.0 membership providers with Bloget. See Membership Services for more details.

RSS feeds are automatically available in Bloget. RSS feeds are 2.0 compliant. In addition, RSS feeds support templates so allowing you to control the appearance and content of feeds without the use of plugins like other blog engines sometime employ.

Bloget blogs also support MetaWeblog API. This allows you to use offline blog authoring tools like Windows Live Writer and BlogJet.

Bloget does not have user accounts (I'm reconsidering this one). It is not a multiple author blog (also on my list). This makes sense when you consider it's a "control" and not an application. That said, it is possible to have multiple blogs by simply replicating the blog structure described above and pointing to a different data file.

Bloget Control

The Bloget control is the most important control. It displays postings, indexes, allows editing, displays logs, etc. It's essentially an entire blogging system in a single control. It is controlled by using query parameters and can be extensively modified using templates.

Bloget is controlled through CGI query parameters. The parameters are:

Parameters can be prefixed with a string value which is useful if should you have more than one Bloget control rendered on a page. It can be overridden using the Prefix property. For example:

<bloget:BlogetBlog runat="server" DataContext="~/App_Data/Bloget.xml" Prefix="bloget" />

You can set the target link of the links in your blog by using the Url parameter. Url overrides the link setting in the blog's settings.

Templates

Out of the box, Bloget provides a useable, if somewhat plain, blog. However, the appearance of Bloget can be customized through the use of templates. Templates are HTML elements that define the layout of a particular portion of Bloget. Here's an example:

<bloget:BlogetBlog runat="server" ID="bloget" DataContext="~/App_Data/Bloget.xml">

  <ItemTemplate>
    <p>
      <a href="<%#Container.PostLink%>" style="font-size:x-large">
      <%#Container.PostTitle%></a><br/>
      <%#Container.PostCreated.ToString("r")%>
    </p>
    <div><%#Container.PostDescription%></div>
    <p>
      <asp:HyperLink runat="server" NavigateUrl="<%#Container.PostEditLink%>"
        Text="edit" Visible="<%#Container.LoggedIn%>"/>
      <asp:Literal runat="server" Text=" | " Visible="<%#Container.LoggedIn%>"/>
      <a href="<%#Container.PostLink%>">comments (<%#Container.PostCommentCount%>)</a>
    </p>
  </ItemTemplate>

  <ItemSeparatorTemplate>
    <hr/><hr/>
  </ItemSeparatorTemplate>

  <CommentHeaderTemplate>
    <p style="font-size:x-large; font-weight:bold; letter-spacing:1em">Comments</p>
  </CommentHeaderTemplate>

  <CommentTemplate>
    <div style="background:aliceblue; padding-left:10px; padding-right:10px;
     margin-bottom:1em; border:solid thin blue;">
      <p><b><%#Container.CommentTitle%></b></p>
      <div><%#Container.CommentDescription%></div>
      <p style="color:Gray;"><%#Container.CommentAuthor%> | 
        <%#Container.CommentDate.ToString("r")%>
      </p>
    </div>
  </CommentTemplate>

  <IndexTemplate>
    <%#Container.PostCreated.ToString("MM-dd-yyyy")%>   
    <asp:HyperLink runat="server" NavigateUrl="<%#Container.PostLink%>" 
      Text="<%#Container.PostTitle%>" />
    <br/>
  </IndexTemplate>

  <IndexYearSeparatorTemplate>
    <p style="letter-spacing:1em; color:Gray; font-size:large; text-align:center">
      <%#Container.PostCreated.ToString("yyyy")%>
    </p>
  </IndexYearSeparatorTemplate>

  <IndexMonthSeparatorTemplate>
    <p style="font-weight:bold; background:aliceblue">
      <%#Container.PostCreated.ToString("MMMM")%>
    </p>
   </IndexMonthSeparatorTemplate>

</bloget:Bloget>

If you have used any of the ASP.NET server controls that supports templates like the GridView or DataList control, the above example should look familiar. (note to self, this section needs to be expanded greatly). There are a large number of items from your blog that can be referenced. Please refer to the example web site and intellisense to discover these items.

The declarative syntax for Bloget is as follows:

<bloget:Bloget
  DataContext="string"
  ShowOnly="None|Blog|View|Edit|Admin|Index|Categories|Drafts
           |LicenseAgreement|Login|Logout|EventLog"
  Prefix="string"
  Url="string"

  <TitleTemplate>
    <%#Container.BlogTitle%>
    <%#Container.BlogDescription%>
    <%#Container.BlogCopyright%>
    <%#Container.BlogWebMaster%>
    <%#Container.BlogLoggedin%>
    <%#Container.BlogMode%>
  </TitleTemplate>

  <FooterTemplate>
    <%#Container.BlogTitle%>
    <%#Container.BlogDescription%>
    <%#Container.BlogCopyright%>
    <%#Container.BlogWebMaster%>
    <%#Container.BlogLoggedin%>
    <%#Container.BlogMode%>
  </FooterTemplate>

  <PostTemplate>
    <%#Container.BlogTitle%> ...
    <%#Container.PostID%>
    <%#Container.PostTitle%>
    <%#Container.PostTitleUrlEncoded%>
    <%#Container.PostCreated%>
    <%#Container.PostLink%>
    <%#Container.PostEditLink%>
    <%#Container.PostPermaLink%>
    <%#Container.PostPermaLinkUrlEncoded%>
    <%#Container.PostTags%>
    <%#Container.PostTagLinks%>
    <%#Container.PostExcerpt(maxCharacters)%>
    <%#Container.PostDescription%>
    <%#Container.PostCommentCount%>
    <%#Container.PostPingbackCount%>
    <%#Container.PostSourceLink%>
    <%#Container.PostSourceTitle%>
    <%#Container.PostEnclosureName%>
    <%#Container.PostEnclosureNameSize%>
    <%#Container.PostEnclosureLink%>
    <%#Container.PostEnclosureType%>
    <%#Container.PostEnclosureLength%>
  </PostTemplate>

  <PostSeperatorTemplate>
    <%#Container.BlogTitle%> ...
    <%#Container.PostID%> ...
  </PostSeperatorTemplate>

  <CommentHeaderTemplate>
    <%#Container.BlogTitle%> ...
    <%#Container.PostID%> ...
    <%#Container.CommentTitle%>
    <%#Container.CommentDate%>
    <%#Container.CommentAuthor%>
    <%#Container.CommentEmail%>
    <%#Container.CommentText%>
  </CommentHeaderTemplate>

  <CommentTemplate>
    <%#Container.BlogTitle%> ...
    <%#Container.PostID%> ...
    <%#Container.CommentTitle%> ...
  </CommentTemplate>

  <PingbackHeaderTemplate>
    <%#Container.BlogTitle%> ...
    <%#Container.PostID%> ...
  </PingbackHeaderTemplate>

  <PingbackTemplate>
    <%#Container.BlogTitle%> ...
    <%#Container.PostID%> ...
    <%#Container.PingBackLink%>
    <%#Container.PingBackDate%>
  </PingbackTemplate>

  <IndexHeaderTemplate>
    <%#Container.BlogTitle%> ...
    <%#Container.PostID%> ...
    <%#Container.PostID%>
    <%#Container.PostTitle%>
    <%#Container.PostTitleUrlEncoded%>
    <%#Container.PostCreated%>
    <%#Container.PostLink%>
    <%#Container.PostEditLink%>
    <%#Container.PostPermaLink%>
    <%#Container.PostPermaLinkUrlEncoded%>
    <%#Container.PostTags%>
    <%#Container.PostTagLinks%>
  </IndexHeaderTemplate>

  <IndexMonthSeparatorTemplate>
    <%#Container.BlogTitle%> ...
    <%#Container.PostID%> ... <%#Container.PostTagLinks%>
  </IndexMonthSeparatorTemplate>

  <IndexYearSeparatorTemplate>
    <%#Container.BlogTitle%> ...
    <%#Container.ItemID%> ... <%#Container.ItemTagLinks%>
  </IndexYearSeparatorTemplate>

  <IndexFooterTemplate>
    <%#Container.BlogTitle%> ...
    <%#Container.PostID%> ... <%#Container.PostTagLinks%>
  </IndexFooterTemplate>

  <SearchResultsTemplate>
    <%#Container.PostID%> ... <%#Container.PostTagLinks%>
  </SearchResultsTemplate>

</bloet:Bloget>

Title Control

The Title control can be used to display the title of your blog. In its default configuration it places the title of the blog in an H1 element and the description in a paragraph element. It can be enhanced with a stylesheet or customized using a template. The Title is invoked as follows:

<bloget:BlogetTitle runat="server" ID="myId" DataContext="~/App_Data/Bloget.xml"> It can be customized using a template. For example:

<bloget:BlogetTitle runat="server" DataContext="~/App_Data/Blog/Bloget.xml">
  <HeaderTemplate>
    <h1>
      <%#Container.BlogTitle%>
    </h1>
    <p>
      <%#Container.BlogDescription%><br />
      <small><%#Container.BlogCopyright%></small>
    </p>
  </HeaderTemplate>
</bloget:BlogetTitle>
Declarative syntax:

<bloget:BlogetTitle
  DataContext="string"
  Prefix="string"

  <TitleTemplate>
    <%#Container.BlogTitle%> ...
  </TitleTemplate>
</bloget:BlogetTitle>

Categories Control

Bloget supports categories (sometimes called tags). You can associate one or more categories with any blog entry. The Category control lists all categories present in the blog and their respective entry counts. The Category control is invoked as follows:

<bloget:BlogetCategory runat="server" ID="myId" DataContext="~/App_Data/Bloget.xml">

It can be customized using a template. For example:

<bloget:BlogetCategory runat="server" ID="blogetCategory" DataContext="~/App_Data/Bloget.xml">
  <CategoryTemplate>
    &bull; <a href="DefaultWithTemplates.aspx?c=<%#Container.CategoryId%>">
    <%#Container.CategoryName%> (<%#Container.CategoryCount%>)</a><br/>
  </CategoryTemplate>
</bloget:BlogetCategory>

Declarative syntax:

<bloget:BlogetCategory
  DataContext="string"
  Prefix="string"
  Url="string"

  <CategoryTemplate>
    <%#Container.BlogTitle%> ...
    <%#Container.CategoryName%>
    <%#Container.CategoryId%>
    <%#Container.CategoryCount%>
  </CategoryTemplate>
</bloget:BlogetCategory>

Recent Posts Control

The recent posts control lists the most recent posts in the blog. It can be filtered by category. Here's an example:

<bloget:BlogetRecent runat="server" ID="myId" DataContext="~/App_Data/Bloget.xml"/>

It can be customized using the <IndexTemplate> template.

Archive Control

The archive control displays a list of links by months that contain blog postings. The control display a month/year list but can be customized in a fashion similar to other Bloget controls using templates. Below is an example of customized archive control. The Length parameter limits the number of entries to display.

<bloget:BlogetArchive runat="server" DataContext="~/App_Data/Bloget.xml" Length="12">
  <ArchiveTemplate>
    <a href="<%#Container.ArchiveLink%>">
    <%#Container.ArchiveDate.ToString("Y")%></a><br/>
  </ArchiveTemplate>
</bloget:BlogetArchive>

Declarative syntax:

<bloget:BlogetArchive
  DataContext="string"
  Prefix="string"
  Url="string"

  <ArchiveTemplate>
    <%#Container.BlogTitle%> ...
    <%#Container.ArchiveDate%>
    <%#Container.ArchiveLink%>
  </ArchiveTemplate>
</bloget:BlogetArchive>

Blog Roll Control

The Blog Roll control displays a list links to other resources you think you're readers might be interested in. The Blog Roll control takes a URI to an OPML file. OPML files are commonly used to export blog lists from news aggregators like Bloglines. The two URI types recognized by Blog Roll control are http:// and file://. Here's an example.

<bloget:BlogetBlogRoll runat="server" ID="blogroll" DataContext="~/App_Data/Blog/Bloget.xml" 
 Uri="http://www.bloglines.com/export?id=blueonionsoftware" />
Blog Roll will parse the OPML file at the given Uri and display it. It checks this address every 6 hours and updates the blog accordingly. Two other parameters can be added. Length controls the number of links to display. If you're like me, you probably read a large number of blogs. Displaying a hundred or more blogs may not be what you want. In conjunction with the Length parameter you can specify Random=true which will select a random links from the OPML file.

Like all Bloget controls, customizations using templates are supported. Here's an example:

<bloget:BlogetBlogRoll runat="server" ID="blogroll" DataContext="~/App_Data/Blog/Bloget.xml"
 Uri="http://www.bloglines.com/export?id=blueonionsoftware">
  <BlogRollTemplate>
    <img src="Images/arrow.png" alt="" />
    <asp:HyperLink ID="HyperLink3" runat="server" NavigateUrl="<%#Container.BlogRollHtmlUrl%>"
     Text="<%#Container.BlogRollTitle%>" /><br />
  </BlogRollTemplate>
</bloget:BlogetBlogRoll>
And finally, the declarative syntax:

<bloget:BlogetBlogRoll
  DataContext="string"
  Prefix="string"
  Url="string"

  <BlogRollTemplate>
    <%#Container.BlogTitle%> ...

    <%#Container.BlogRollTitle%>
    <%#Container.BlogRollHtmlUrl%>
    <%#Container.BlogRollXmlUrl%>
  </BlogRollTemplate>
</bloget:BlogetBlogRoll>

Search Control

 

Contact Control

 

Membership Services

Membership services are configured and serviced using ASP.NET's membership services. Membership services conduct authentication and authorization using a provider model. The provider model allows for different backend's that supply authentication, authorization and profile information. Out of the box, ASP.NET supplies

ASP.NET membership gives you a built-in way to validate and store user credentials. ASP.NET membership therefore helps you manage user authentication in your Web sites. You can use ASP.NET membership with ASP.NET Forms authentication or with the ASP.NET login controls to create a complete system for authenticating users.

ASP.NET membership supports facilities for:

You configure the membership system in your application's Web.config file. The easiest way to configure and manage membership is with the Web Site Administration Tool, which provides a wizard-based interface. As part of membership configuration, you specify:

Bloget also supplies an XML based provider model. The XML provider only uses files. Bloget's membership provider is configured like any other membership provider in your application's Web.config file. Bloget's membership provider is great for discount hosting services that don't offer SQL or ActiveDirectory services.

RSS Feeds

Adding an RSS feed is simple and automatic.By default, the 10 most recent blog entries are included in the feed. The number of entries can be adjusted using the Admin panel. You can produce feeds for categories using query parameters. For instance, to generate a feed for category 2:

http://yoursite.com/Blog.aspx?m=rss&c=2 Bloget produces valid RSS 2.0.

The content of an RSS feed can be enhanced using templates. This allows you to place additional content (like ads) for instance directly in feeds. Here's an example.

<RssContentTemplate>
  <%#Container.PostContent%>
  <div>
    <a href="http://www.pheedo.com/click.phdo?x=62927&u=<%#Container.PostID%>">
    <img src="http://www.pheedo.com/img.phdo?x=62927&u=<%#Container.PostID%>" /></a>
  </div>
  <div>
    powered by <a href="http://blueonionsoftware.com/bloget.aspx">Bloget</a>
    - <i>"One File, One Binary, One Blog"</i>
  </div>
</RssContentTemplate>

Remote Procedure Calls (MetaWeblog and Pingback)

Bloget supports the MetaWeblog and Pingback API's. These API's allow your blog controlled by sending XML-RPC commands. Many third-party tools and popular Web sites (like Digg) can interact with blogs that support these API's. The procedure for enabling RPC in bloget is similar to RSS example above. You will create a new Web page and with only the following two lines.

http://yoursite.com/Blog.aspx?m=rpc

MetaWeblog is a standard client-server application programming interface for weblog (blog) publishing. It is built on XML-RPC. MetaWeblog API was designed to address limitations of Blogger API.

On the administration screen you will need to add several pieces of information to enable MetaWeblog services. They are:

Owing to the fact that Bloget is a user control the blog ID is always the same for these API's. It is:

The he password is unique and it is the same one that is used to access the Administration areas of your blog.

The following MetaWeblog commands are supported:p>

Pingback is an automatic mechanism that enables authors to keep track of who is linking to, or referring to their articles. Pingbacks are automatic and require no user intervention when enabled. You can choose to display pingbacks in your blog. Pingbacks are also logged. There are two components to Pingbacks. When you post an article, Bloget will scan the article for links and attempt to "Ping" those links. The result of the ping attempt is logged.

Pingbacks are listed in blog entry page under the comments section.

Once you have updated these fields, you should be able to user third-party off line blogging tools like BlogJet and Windows Live Writer. To make using these features even easier, the blogging community has developed a standard API for detecting MetaWeblog enabled blogs called Really Simple Discoverability (RSD). RSD is well, really simple to implement.

In Bloget, the Administration panel has a checkbox for enabling RSD. Check it and Bloget does the rest.

BlogML

BlogML is an XML format for storing the entire content of a blog. You can use BlogML as a way to archive the contents of blogs or to act as a standard format for transferring content from one blog to another - this could include migrating a blog from one blogging engine to another. There are currently several blogging engines that provide support for BlogML including:

There are also implementations that exist for converting Blogger content to BlogML.

Navigate to the Administration screen. Near the bottom you'll find import and export controls. Exporting will produce an BlogML compliant XML file. If you have blogs elsewhere that support BlogML, export them and then import them to Bloget.

Comments

Like most good blogging engines, you can allow users to leave comments on you postings. You can enable comments on a per posting basis or on globally. When enabled, postings will include an area near the bottom of the post where the user can submit his comment. Comments are a mixed blessing. On the good side, they allow interaction with your readers and can add value to your blog. On the bad side, there is comment spam. Comment spam usually does not pertain to your post but instead contains links and advertisements to other sites. Often these spam comments are inserted by other programs called robots or spam-bots.

Bloget takes some basic measures to suppress these messages but is by no means bullet proof. In addition to turning-off comments, you can limit the number of comments per posting and the amount of time the posting will accept comments. Also you can easily delete comments by viewing the posting while logged-in. You'll see a delete button under each comment entry that allows you to quickly remove any offending comment.

To further combat spam-bots, Bloget requires confirmation from the comment author. This requires Javascript to be enabled. Most spam-bots do not support Javascript and thus will fail to post a comment.

Bloget also rejects comments that have hyperlinks in them. 

Logging

Bloget logs significant events such as new postings, changes to administration settings, comments, pingbacks, etc. Log files are saved in "~/App_Data/yyyy-mm-dd.bloget.log" where "yyyy-mm-dd" is the date in sortable format. You can change the name and location where log files are saved by adding a entry to the <appSettings> section of your Web.Config file. This folder path must start with "~" or it will be rejected and files will go to the default location. Furthermore, the path must exist and be writable (Bloget will not automatically create the folder).

<add key="BlogetLogFolder" value="~/App_Data/Logs/" />

All entries start with a 3 digit code indicating the category of the log message followed by the time, control ID and message. The category codes are as follows:

Code Category
100 Error
200 Authorization
201 Administration
300 Remote Procedure Call (RPC) Request
301 pingback.ping
302 RPC request accepted
303 RPC request rejected
400 Posting
401 Ping

Lost Passwords

If you forget your password, you're doomed. Well not really, but there is no password recovery. You'll have to open the Xml file in the AppData folder and edit it. Here's a sample XML provider data file that comes with the standard distribution.

<?xml version="1.0" encoding="utf-8"?>
<users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:blueonionsoftware-com:bloget:user:data">
  <User>
    <id>1280d92b-12a2-4f69-a72d-d866f6c2a998</id>
    <username>admin</username>
    <email>example@example.com</email>
    <comment />
    <password>x61Ey612Kl2gpFL56FT9weDnpSo4AV8j8+qx2AuTHdRyY036xxzTTrw10Wq3+4qQyB+XURPWx1ONxp3Y3pB37A==</password>
    <locked>false</locked>
    <question />
    <answer />
    <lastLogin>2008-01-03T00:11:01.5998672Z</lastLogin>
    <lastActivity>2008-01-03T00:11:01.5998672Z</lastActivity>
    <lastPasswordChange>0001-01-01T00:00:00</lastPasswordChange>
    <lastLockedOut>0001-01-01T00:00:00</lastLockedOut>
    <createdOn>2007-11-15T00:51:01.9804Z</createdOn>
    <active>true</active>
  </User>
</users>

This will reset the password to "admin"

Data Formats

Bloget uses a data provider type mechanism. Currently, the only data provider is an XML, file based provider but if you look at the code I think you'll see that a data provider is a simple item to implement. I chose to stick with an object model which will make things slighty more interesting for anyone writing a database provider.

In the XML data provider, all data in Bloget are stored in files using XML. The specifics of the formats are not all that interesting. How the files relate to each other is more important. The file specified in the Bloget declaration is the main file and contains information that pertains to the entire blog. In addition, it contains an index of all the blog entries. Blog entries are identified by a computer generated number called a GUID (Global Unique Identifier). A GUID is a 128-bit integer (16 bytes) that can be used across all computers and networks wherever a unique identifier is required. Such an identifier has a very low probability of being duplicated.

The Bloget index contains the title of the blog entry, the identifier (the GUID), the date it was created, the date it was last updated, and a list of category ID's. The actual blog entry and associated comments are stored in a separate file. The name of the file is the blog entry identifier (again, the GUID), prefixed with the letter 'C'. It is stored in the same directory as the Bloget main file.

You might ask yourself if a system like this is scalable. Honestly, I don't know. I found that scaling is as much trial and error as it is design (those of you who have done this know what I mean). Still, I do take some measures to make Bloget efficient. I routinely test Bloget with 10,000 blog postings to test response times and stability. On occasion, I've bumped this up to 100,000 postings. I would wager that most blogs have fewer postings than than my tests. Bloget takes full advantage of ASP.NET's caching facilities. If a posting is accessed frequently, it likely will be in the cache.

Bloget also tries very hard not to corrupt files. All files are serialized in memory, reparsed to check validity and then committed to disk. Backup files are created of the previous version as further insurance. This works well for Blogs because most file operations are read. File writing is are less frequent. To date, I have not lost a single posting. Of course your milage may vary but consider I use this software every day for my own blog.

Legal Information

Bloget Freeware License Agreement

September 19, 2006

By using, copying, or distributing the accompanying software you indicate your acceptance of the following Bloget Freeware License Agreement. If you do not agree to any of the terms of this License, then do not use, copy, or distribute Bloget.

1. LICENSE. Blue Onion Software hereby grants you a non-exclusive, transferable license to use its software product and accompanying documentation on the following terms. You may:

a. use Bloget on any computer in your possession;
b. make copies of Bloget; and

(i) You may NOT distribute the software by any means; You may NOT charge any amount for distributing Bloget. You are specifically prohibited from charging, or requesting donations, for any such copies, however made, and from distributing the software and or documentation with other products (commercial or otherwise) without prior written permission. You may NOT distribute Bloget as part of or in a bundle or package with any other product;

(ii) You may NOT sublicense, rent or lease any portion of Bloget;

2. LIMITATIONS ON LICENSE. You shall not make use of the Blue Onion Software name and/or any trademarks, service marks, trade dress adopted and/or used by Blue Onion Software.

3. TITLE. Title, ownership rights, and intellectual property rights in and to Bloget, and each copy thereof (including all copyrights therein), shall remain in Blue Onion Software. Bloget is protected by the copyright laws of the United States and international copyright treaties.

4. WARRANTY AND LIMITATION OF LIABILITY. Bloget is free of charge, and there is no warranty for the software. Blue Onion Software provides the software 'as is,' and Blue Onion Software disclaims all conditions and warranties of any kind, either express, implied, statutory, or otherwise, including, but not limited to, any conditions or implied warranties of merchantability, satisfactory quality, and fitness for a particular purpose. Should the software prove defective, you assume the cost of all necessary servicing, repair or correction.

Under no circumstances and under no legal theory, tort, contract, or otherwise, shall Blue Onion Software be liable to you or any other person for any general, direct, indirect, special, incidental, consequential, or other damages of any character arising out of this agreement or the use of or inability to use the software, including but not limited to personal injury, loss of profits, loss of data, output from the software or data being rendered inaccurate, failure of the software to operate with any other programs, damages for loss of goodwill, business interruption, computer failure or malfunction, or any and all other damages or losses of whatever nature, even if Blue Onion Software has been informed of the possibility of such damages.

5. INDEMNIFICATION. You shall defend, indemnify and hold harmless Blue Onion Software, from any claim, demand, liability, damage award, suit, judgment, or other legal action (including reasonable attorney's fees) arising out of your use, distribution, modification, or duplication of Bloget.

6. TERMINATION. The license granted hereunder is effective until terminated by Blue Onion Software. You may terminate it at any time by destroying Bloget. This license will terminate automatically if you fail to comply with the limitations described above. On termination, you must destroy all copies of Bloget. The termination of your license will not result in the termination of the licenses of any distributees who have received rights to Bloget through you so long as they are in compliance with the provisions of this Agreement.

7. EXPORT CONTROLS. None of Bloget or underlying information or technology may be downloaded or otherwise exported or re-exported into (or to a national or resident of) any country in violation of the laws and administrative regulations of the United States relating to the control of exports of commodities and technical data. By downloading or using Bloget, you are agreeing to the foregoing and you are representing and warranting that you are not located in, under the control of, or a national or resident of any such country.

8. MISCELLANEOUS. This agreement represents the complete agreement concerning this license between the parties and supersedes all prior agreements and representations between them. It may not be amended. If any provision of this agreement is held to be unenforceable for any reason, this agreement shall terminate. This agreement shall be governed by and construed under MI law as such law applies to agreements between MI residents entered into and to be performed within MI, except as governed by U.S. federal law.

Copyright and Trademark Notices

Bloget is Copyright © Blue Onion Software 2006. All rights reserved. The documentation and all computer files are also Copyright © Blue Onion Software 2006. All rights reserved. Bloget™ is a trademark of Blue Onion Software. The trademarks are the property of Blue Onion Software. All other trademarks are the property of their respective owners.

Technical Support

If you have a question about Bloget, first look in HELP.TXT or consult online help. If you cannot find the answer, you can send electronic mail to mike@blueonionsoftware.com. Be prepared to send the following information:

  1. The version number of Bloget that you are using.
  2. The type of hardware that you are using.
  3. The exact wording of any messages that appeared on your screen.
  4. A description of what happened and what you were doing when the problem occurred.
  5. A description of how you tried to solve the problem.

For additional information, send electronic mail to mike@blueonionsoftware.com