When window.location.href="..." doesn't work

by Jon Davis 31. July 2008 04:12

I got a strange "Access is denied" error on a site where I had used window.location.href as a way of redirecting a page. Here's the alternative solution I came up with, which seemed to work fine. (Ha!)

<script type="text/javascript" language="Javascript">

document.body.innerHTML="<form action=\"http://www.othersite.com\" method=\"get\"></form>";
document.forms[0].submit();

</script>

 

Currently rated 4.0 by 1 people

  • Currently 4/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Web Development

iPhone 2.0 Pwnage Works On A 2.5G (1st Gen) iPhone

by Jon Davis 30. July 2008 18:20
I finally upgraded my first-gen iPhone to the v2 software and ran the Pwnage Tool against it. Seems to work "fine", I have T-Mobile phone and 2.5G Internet working as well as Cydia and a few apps. Most of the v1 software apps are gone and unavailable, though, unfortunately. Apple is smart, they discourage the use of unauthorized third party software installations by deploying their own marketplace bits right on the device. It's not unlike the Xbox 360 Live Marketplace in that sense. I apparently overestimated how many developers would bother to curttail the official deployment route (App Store) for the "hacker's" route (Cydia) instead. My iPhone is not 100% stable, I don't think, as after everything was installed the screen keyboard responded very slowly until I did a hard reboot. But then, my iPhone, being jailbroken since I got it, has never been 100% stable in this regard. Such is the price of ensuring I can fully enjoy what's rightfully mine.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

T-SQL: Universal User Map

by Jon Davis 23. July 2008 21:20

Here's an approach I recently took with taking a reusable data component that has user identification bindings associated with the data, and making it pluggable to different applications.

There can be lots of different web application databases that involve users, and as such there are often many different ways of identifying them. The primary keys might be:

  • int - The int is fine, it's easy (i.e. terse) to administer, it scales well (so long as you don't have more than a couple billion people hammering on your site). One of the biggest problems with int is that collisions between two applications using int are guaranteed.
  • uniqueidentifier / GUID - This is almost always a value that is guaranteed to be unique between two distinct applications. Unfortunately, almost always and always aren't the same thing; once in a blue moon, collisions do occur. Furthermore, uniqueidentifiers don't scale well -- they're bulky, wordy to administer, and, being somewhat randomly generated, they don't sort in the index in a meaningful way.
  • Email / varchar(xx) - Email is an okay key, it kind of imposes a business rule of social distinction on top of record distinction, which may or may not be appropriate. I think Email is an important column to index--and IMO it's almost always appropriate to use with user credentials as an alternate username on the same login form--but I don't think it's an administrator's ideal as a PK.
  • Username / varchar(xx) - The username is fine for logging in with, but I rarely see it used for primary keys. One problem is that unless you re-index in upper/lower case, you're imposing distinction on case sensitive names, which is not normal practice.

Others might be used but these are used quite often, in that order.

So the problem I ran into was that I was building this "sub-application" that multiple web applications could use, but each web application that would use it handled user IDs differently. First I built the data round uniqueidentifier, since that is most likely to be unique across apps, but then I started asking around about what the applications are actually using. While one does use GUIDs, another uses int, and another uses a mixed choice of GUID, int, and e-mail.

This had me thinking, and so I devised a UserMap table that would accept any combination of any identifying data.

To start with, I already had web application context tables created.

CREATE TABLE [dbo].[Site]
(
    SiteId int NOT NULL PRIMARY KEY, 
    [CreateDate] datetime NOT NULL CONSTRAINT [DF_Site_CreateDate]  DEFAULT (getdate()),
    [ModifyDate] datetime NOT NULL CONSTRAINT [DF_Site_ModifyDate]  DEFAULT (getdate()),
    BaseUrl nvarchar(500) NOT NULL
); 

CREATE TABLE [dbo].[AppContext]
(
    [SiteId] [int] NOT NULL,
    [AppContextId] [int] NOT NULL,
    [CreateDate] datetime NOT NULL CONSTRAINT [DF_AppContext_CreateDate]  DEFAULT (getdate()),
    [ModifyDate] datetime NOT NULL CONSTRAINT [DF_AppContext_ModifyDate]  DEFAULT (getdate()),
    [BaseUrl] [nvarchar](500) NOT NULL,
    
    CONSTRAINT [PK__AppContext] PRIMARY KEY CLUSTERED 
    (
        [SiteId] ASC,
        [AppContextId] ASC
    )
) 

All users are associated with an application context, which is hosted on a site. I don't know anything about the site, the application, or the user, except that a) the site has a URL, 2) the web app has a relative URL, and 3) the user is going to be identified in some way. I don't know what way that will be, I don't care, but I'll guess it'll be one of the fields I listed at the top of this article.

CREATE TABLE [dbo].[UserMap]
(
    [UserId] int IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [CreateDate] [datetime] NOT NULL CONSTRAINT [DF_UserMap_CreateDate]  DEFAULT (getdate()),
    [ModifyDate] [datetime] NOT NULL CONSTRAINT [DF_UserMap_ModifyDate]  DEFAULT (getdate()),
    [Guid] uniqueidentifier NOT NULL DEFAULT (newid()),
    [SiteId] int NULL,
    [AppContextId] int NULL,
    [Email] nvarchar(50) NULL,
    [Username] nvarchar(50) NULL,
    [AppUserId] int NULL 
); 

Note that I could also put indexes on each of the identifying columns as well. These indexes will slow INSERTs and UPDATEs down, but SELECTs will be very fast. Given that this particular application add-on I'm building is intended to be used for data collection more than anything else, I will not add these indexes.

Because this table stores multiple different kinds of identifying information, each web application can now perform a JOIN operation against this table in whatever way it deems appropriate, as long as it includes the SiteId and AppContextId in the JOIN clause.

So now when working with my data tables, I would only store the sub-app's UserId. Now I needed my INSERTing stored procedures to look that ID up, and in its absence, to INSERT the mapping record. I also needed to enforce the rule that some kind of identification is mandatory for insertion. I didn't implement a constraint, but I did implement a few stored procedures that imposed this rule.

Let's look at the first problem. I want to INSERT some data in some other table, using only a UserId. I don't know what the UserId is, but I do have an e-mail address, or a username, or a GUID, or something.

Well, how about if I just do a lookup?

CREATE PROCEDURE [dbo].[UserMap_GetUserId]
    @SiteId int,
    @AppContextId int,
    @UserGuid uniqueidentifier = NULL,
    @AppUserId int = NULL,
    @UserEmail varchar(50) = NULL,
    @AppUsername varchar(50) = NULL,
    @UserId int output
AS
    DECLARE @sql nvarchar(max)
    SET @sql = N'SELECT @UserId = (SELECT TOP 1 [UserId] FROM [dbo].[UserMap] '
        + N'WHERE SiteId=' + CONVERT(varchar(10), @SiteId)
        + N'  AND AppContextId=' + CONVERT(varchar(10), @AppContextId) + N' AND'
    IF @AppUserId    IS NOT NULL SET @sql = @sql + N' [AppUserId]    = ' +  CONVERT(nvarchar(10), @AppUserId) + N' AND'
    IF @UserGuid    IS NOT NULL SET @sql = @sql + N' [Guid]        = N''' + CONVERT(nvarchar(50), @UserGuid) + N''' AND'
    IF @UserEmail    IS NOT NULL SET @sql = @sql + N' [Email]        = N''' + CONVERT(nvarchar(50), @UserEmail) + N''' AND'
    IF @AppUsername    IS NOT NULL SET @sql = @sql + N' [Username]    = N''' + CONVERT(nvarchar(50), @AppUsername) + N''' AND'
    SET @sql = SUBSTRING(@sql, 1, LEN(@sql)-4) + N')'
    print @sql
    EXEC sp_executesql @sql, N'@UserId int output', @UserId output
    
    return @UserId
; 

 

Notice that it doesn't create the UserId if no records are returned. This is an exported sproc that actually gets used on the INSERT sprocs for the other tables.

CREATE PROCEDURE [dbo].[MyAppData_Add_GetNewID]
    @MyAppContextId int,
    @MyAppFieldId int,
    @UserId int = NULL,
    @AppUserId int = NULL,
    @UserGuid uniqueidentifier = NULL,
    @UserEmail varchar(50) = NULL,
    @AppUsername varchar(50) = NULL,
    @DataText varchar(500),
    @MyAppFieldOptionId int,
    
    @MyAppDataId int output
AS
    
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 
    BEGIN TRANSACTION
    
    DECLARE @CreateDate datetime, @ModifyDate datetime
    SET @CreateDate = getdate()
    SET @ModifyDate = @CreateDate
    
    DECLARE @MyAppId int
    DECLARE @SiteId int
    DECLARE @AppContextId int

    SELECT @SiteId = [SiteId], @AppContextId = [AppContextId], @MyAppId = [MyAppId]
    FROM [MyAppContext]
    WHERE [MyAppContextId] = @MyAppContextId
    
    IF @UserId IS NULL  
    BEGIN
        IF @AppUserId IS NOT NULL
        OR @UserGuid IS NOT NULL
        OR @UserEmail IS NOT NULL
        OR @AppUsername IS NOT NULL
        BEGIN
            EXEC [dbo].[UserMap_GetUserId] @UserGuid, @AppUserId, @UserEmail, @AppUsername, @UserId output
        END
        ELSE
        BEGIN
            RAISERROR ('Must populate a user identification field.', 16, 1)
            RETURN
        END
    END
    
    IF @UserId IS NULL --still, perhaps due to provided data but no match
    BEGIN
        print '@UserId is still null.'
        EXEC [dbo].[UserMap_Add_GetNewID] @SiteId, @AppContextId, @AppUserId, @UserGuid, @UserEmail, @AppUsername, @UserId output
    END

    INSERT INTO [dbo].[MyAppData]
    (
        [MyAppContextId],
        [SiteId],
        [AppContextId],
        [MyAppFieldId],
        [CreateDate],
        [ModifyDate],
        [MyAppId],
        [UserId],
        [DataText],
        [MyAppFieldOptionId]
    ) VALUES (
        @MyAppContextId,
        @SiteId,
        @AppContextId,
        @MyAppFieldId,
        @CreateDate,
        @ModifyDate,
        @MyAppId,
        @UserId,
        @DataText,
        @MyAppFieldOptionId
    )
    
    SET @MyAppDataId = SCOPE_IDENTITY()
    
    COMMIT TRANSACTION
    
    return @MyAppDataId; 

Now notice that if it's still null, it's invoking [dbo].[UserMap_Add_GetNewID], which is basically the INSERT sproc for the user map table. Here that is below, and note that it does a simple INSERT and then a dynamic UPDATE. I only did this for simplicity's sake, to minimize the code, I don't think it will make a huge difference performance-wise.

CREATE PROCEDURE [dbo].[UserMap_Add_GetNewID]
    @SiteId int,
    @AppContextId int,
    @AppUserId int,
    @UserGuid uniqueidentifier = NULL,
    @Email varchar(50) = NULL,
    @Username varchar(50) = NULL,
    @UserId int output
AS
    INSERT INTO [dbo].[UserMap]
    (
        SiteId,
        AppContextId
    ) VALUES (
        @SiteId,
        @AppContextId
    )
    
    SET @UserId = SCOPE_IDENTITY()
    
    EXEC [dbo].[UserMap_Update] @UserId, @SiteId, @AppContextId, @AppUserId, @UserGuid, @Email, @Username
    
    return @UserId;
    
    
CREATE PROCEDURE [dbo].[UserMap_Update]
    @UserId int,
    @SiteId int,
    @AppContextId int,
    @AppUserId int,
    @UserGuid uniqueidentifier = NULL,
    @Email varchar(50) = NULL,
    @Username varchar(50) = NULL
AS
    DECLARE @sql nvarchar(max)
    SET @sql = N'UPDATE [dbo].[UserMap] SET [SiteId] = ' +  CONVERT(varchar(10), @SiteId) + ', '
        + N'[AppContextId] = ' + CONVERT(varchar(10), @AppContextId) + N','
        + N'[ModifyDate] = getdate(),'
    IF @AppUserId    IS NOT NULL SET @sql = @sql + N' [AppUserId]    = ' +  CONVERT(varchar(10), @AppUserId) + N','
    IF @UserGuid    IS NOT NULL SET @sql = @sql + N' [Guid]        = N''' + CONVERT(varchar(50), @UserGuid) + N''','
    IF @Email        IS NOT NULL SET @sql = @sql + N' [Email]        = N''' + CONVERT(varchar(50), @Email) + N''','
    IF @Username    IS NOT NULL SET @sql = @sql + N' [Username]    = N''' + CONVERT(varchar(50), @Username) + N''','
    SET @sql = SUBSTRING(@sql, 1, LEN(@sql)-1) + N' WHERE [UserId]    = ' + CONVERT(varchar(50), @UserId)
    
    EXEC(@sql)
; 

That's it. I came up with it and implemented and tested in one late afternoon, I feel good about it, but I'm open to feedback. Does it smell bad? Am I doing something bad here? T-SQL isn't my greatest strength so fill me in.

kick it on DotNetKicks.com

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , , ,

Word of the Day: Weasel

by Jon Davis 21. July 2008 13:37

I hate bugs that I can't fix because the cause is buried in a third party architecture (like WCF) and disappears faster than the symptoms occur. I call these things weasels, as in those little bastards that pop their heads out and make a nuisance and disappear under the ground before you have a chance to ask what the heck happened. (The other dictionary definition fits the bill, too: a sneaky, untrustworthy, or insincere person. http://www.merriam-webster.com/dictionary/weasel)

I once saw an app show up on my taskbar for a split second and it knocked whatever I was working on out of focus .. I didn't know what the heck it was, there was no way to trace it .. so I created a Windows app called "Weasel Monitor" that basically monitored all processes and made a bunch of noise (showed up on a log) if a process's lifetime was only a tiny split second. This worked for me, and the term weasel stuck.

Could've gone with mole but that word is severely over-used in software to mean different things. (Spelunking, anybody?)

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Computers and Internet

Blog List 2008

by Jon Davis 20. July 2008 22:56

Here's my current blog subscription list. Pasting here just because the list was conveniently handy (I had to extract the list for my own reasons).

 .NET slave
http://feeds.feedburner.com/netslave

Ajaxian » Front Page
http://feeds.feedburner.com/ajaxian

Ayende @ Rahien
http://feeds.feedburner.com/AyendeRahien?format=xml

AZGroups Event Calendar
http://www.google.com/calendar/feeds/admin%40azgroups.com/public/basic

CodePlex
http://www.codeplex.com/rss.ashx

Coding Horror
http://feeds.feedburner.com/codinghorror

Delicious/devkick
http://feeds.feedburner.com/devkick/news

devKick Components
http://feeds.feedburner.com/devkick

DotNetKicks.com
http://feeds.feedburner.com/dotnetkicks

Extremetech
http://feeds.ziffdavis.com/ziffdavis/extremetech

Fragmented Code
http://feeds.feedburner.com/FragmentedCode

If broken it is, fix it you should
http://blogs.msdn.com/tess/rss.xml

ISerializable - Roy Osherove&#39;s Blog
http://feeds.feedburner.com/Iserializable

John Resig
http://feeds.feedburner.com/JohnResig

Jose Fajardo
http://www.cynergysystems.com/blogs/rss/josefajardo

Matt W's Windows Workflow Place
http://blogs.msdn.com/mwinkle/rss.xml

MattBirmingham.com
http://feeds.feedburner.com/MattBirmingham

MSDN Architecture Center. Agile Development
http://www.microsoft.com/feeds/msdn/en-us/architecture/rss/rssSpecialAgile.xml

MSDN Home Page: "How Do I?" Videos
http://www.microsoft.com/feeds/msdn/en-us/HDI/Home-HDI.xml

MSNBC.com: Technology & Science
http://www.msnbc.msn.com/id/3032117/device/rss/rss.xml

MSNBC.com: Top MSNBC Headlines
http://go.microsoft.com/fwlink/?LinkId=44406

PDC 2008 Event Updates
http://www.microsoft.com/feeds/MSDN/en-us/events/PDC_2008_Event_Updates.xml

Planet Ajaxian
http://planet.ajaxian.com/index.xml

ProgrammableWeb
http://feeds.feedburner.com/ProgrammableWeb

Rick Strahl's Web Log
http://feeds.feedburner.com/rickstrahl

Rob Conery
http://feeds.feedburner.com/wekeroad/EeKc

Rob Fahrni
http://rob.crabapples.net/rss.xml

Scott Hanselman's Computer Zen
http://feeds.feedburner.com/ScottHanselman

ScottGu's Blog
http://weblogs.asp.net/scottgu/rss.aspx

Shawn Hargreaves Blog
http://blogs.msdn.com/shawnhar/rss.xml

Slashdot
http://rss.slashdot.org/Slashdot/slashdot

videos - Channel 9
http://channel9.msdn.com/rss.aspx?ForumID=14&Mode=0&sortby=0&sortorder=1

Visual Web Developer Team Blog
http://blogs.msdn.com/webdevtools/atom.xml

you've been HAACKED
http://feeds.haacked.com/haacked/

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

First Music Single Sale, Ever

by Jon Davis 19. July 2008 11:31

I just made my first sale of a music single.

I've been tinkering music production as a really lightweight hobbyist my whole adult life (it was one of my core interests when I was a kid), not really producing many songs, never going public with anything I had done, and mostly just tinkering with music tools and experimenting. I have thrown together a couple two or three *shrug* complete songs over the years as an adult, though really nothing very special, and I keep kicking myself for not actually making music production a higher priority considering how much money and "wannabe musician" efforts I've invested in tools and in tinkering.

While my musical interests are diverse among all major genres (pop, rock, jazz, classical/symphonic, electronic grooves, ambient), 2600 Hz has always been the "band name" chosen for electronic grooves and ambient music. I've owned 2600hertz.com for years, but never actually did anything with it.

A week and a half ago, after I decided it was time to transition to a new job, I decided I should also start daring to throw my music out there for public consumption. To start with, I decided, I should get a few of my initial silly experiments of the last decade out there and see where they hang. I created a profile on soundclick.com (the new replacement for what was MP3.com back in the late 90's for indie music):

http://www.soundclick.com/2600hz

And a few days ago I decided it was time to reconnect my MIDI keyboard to my home PC workstation, reinstall my music tools, and get to work actually doing what I keep wishing I was doing, which is having fun with music production.

To my surprise, Space Ages reached #84 in the Ambient music charts!!  I thought it was surely a fluke--it was, at the time, the first song on my 2600 Hz profile page, and for a while there when I had "hack" this and "hack" that on my 2600Hz profile, my ClickSound profile was on the top page of the Google search for "2600 Hz". (Not anymore. Seems it was very quickly put into Google blacklist, which is obviously extremely unfortunate for me.)

Anyway, I received the following e-mail last night. This, in itself, is utterly meaningless, but it's kind of like that "first dollar" thing that a retail store might frame or something (except that it's a lot less than a dollar). It feels really good, and makes me want to consider actually giving music production more than just a toyish occasional tinkering.

-----Original Message-----
From: SoundClick Store [mailto:ecommerce@soundclick.com]
Sent: Friday, July 18, 2008 5:34 PM
To: ----@-------.---
Subject: 2600 Hz - Space Ages (Single), sale on SoundClick


Hi 2600 Hz, you have a sale on SoundClick!

1 x 2600 Hz - Space Ages (Single)

Customer:
----@-------.---
   
You're credited a total of $0.17 USD for this sale.
Your current balance is $0.17 USD.

You don't have to do anything. If your current balance is higher
than $20.00 USD, you receive your next payment within the
week via PayPal.

Please make sure that the PayPal email we have on file is your
current one:
----@-------.---

------------------
SoundClick - your #1 eCommerce store
 

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Music Production

Looking For Opportunities

by Jon Davis 19. July 2008 02:31

I recently put in my resignation notice (finishing as of August 1), feeling it was time to move on, so I am on the "job hunt", hoping primarily for a role where I can specialize in something like:

  • Architectural leadership and core development in any new system or software product
  • Software product management
  • Search engine development
  • Social networking development

The first two of the bullets above are not titles I have actually "owned" before. They are roles, however, that after 12 to 13 years of doing what I do professionally I feel I've picked up the capacity, the individual experiences, the detail-mindedness, and the ability to focus on the bigger picture while nitpicking the finer aspects of a project, that I feel I could genuinely do a lot of good in either area.

Meanwhile I have always been and will continue to be available for short-term, invoiced-by-the-hour contracts in C#, SQL Server, and/or ASP.NET. Normally I limit my availability on that to evenings and weekends, but things are obviously different, for now, so any time of any day is fine.

References are hard to come by because time flies and head hunters have abused the references-calling in the past, but my LinkedIn profile/resume (with a couple written recommendations) is available on request.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Community Server 2008: Nice Try, But It Still Leaves Us Hanging

by Jon Davis 19. July 2008 02:04

A couple years ago, we were starting to examine the need for a community / social networking solution, mainly forums and blogs, and my boss told me that I, as a senior engineer on the team, would be responsible for identifying our requirements, selecting and recommending a platform to build upon, and taking part in seeing it get tailored to the company's needs.

I always give my tasks 190%. Forget 110%. Identify requirements? Okay, let's have meetings and figure out our requirements. So a co-worker and I spent nearly a week mulling over ideas for the ultimate community system we could ask for, and documenting our brainstormed ideas as we saw fit. We started building up a rough draft. The plan was to take this rough draft and hand it over to the manager and executive and ask them to take a big, fat red pen and cross out the things that were beyond the scope of expectations. (Literally, I expected that about half of the requirements would be dropped. Incidentally, this strategy is not normal, requirements should come top-down, not bottom-up, but no actual requirements had been established so we had to come up with them.) Instead, my boss took the 3/4-written rough draft Word document we'd been exchanging around the office and sent it directly to telligent to basically ask them for a work order quote.

So first of all, that's not really what telligent does. At the time, they had no professional services team, and their closest equivalent primarily only handled themes and site integration. Second, we hadn't yet selected a technology platform, so, without explaining himself or his reasons, the boss apparently decided to cancel out on his word on making selecting a platform to build upon as a step in the process. Third, the extent of our requirements in our unrefined draft was so far beyond what any ASP.NET-based commercial community software / social networking solution delivers. The closest functional equivalents are closed systems like MySpace and Yahoo! Groups. Fourth, while begging and groaning on the phone with telligent, my boss pretty much insulted the entire team, and was overheard by me, mentioning me specifically in describing my previous job and how I was not focused on ASP.NET at the time, and how I therefore "have never done this sort of thing before". That occasion has haunted me every day since then because it was well explained that I not only have "done this sort of thing before" (software & web development, using ASP.NET et al), I actually built a rich and detailed community system from scratch in ASP Classic and SQL Server 7 all the way back in 1999 and explained all this in my interview.

Somehow, telligent agreed to sign up for the tasks, refusing to use our specifications but indicating that they'd figure out their own subset, and after they took the boss's money they called him up and let him know that they would basically make all the changes in the actual product instead. He didn't get his money back, we basically just received ultimately useless alpha build drops of what would later become Community Server 2008 and did our own QA'ing for them (on top of their own QA'ing). By the time the features we had agreed upon were done, CS 2008 was just a couple months away from its first public beta, so the boss decided to scrap everything we had received from them in private, and wait for the final product.

CS 2008 is actually pretty extensive, and it has a lot more features in various places than we ourselves had asked for (it is, after all, their product, not ours). But we couldn't use it up front. In the process of adding features we didn't ask for, they added new support requirements that required us to resolve, and meanwhile there are still features we had been in need of.

I was again tasked to lead up the project of getting CS 2008 set up and out the door, but even before delving into documenting the specific tasks that would be required--tasks that I submitted for review 900 times and were never reviewed by management to detail for proper truncation and elimination--the MS Project gantt chart (using it as a calculation tool, not as a "BS to the boss" communication tool) showed truthfully and accurately that there was another half-year of functional customizations development involved, particularly considering that there were nine seperate web sites each in need of a community solution. In response, instead of the boss having the whole team go gung-ho and focus on the project to get it out of the way, instead the other team members were immediately pulled off the project and I was left on the project by myself. Not a single senior member of the team or manager bothered to read the tasks I had written up for the project, to detail, and to this day after about three months of full-time focus the tasks are only about one quarter finished, with the entire QA process dropped and close to zero theming comps or implementations by me, by the graphics designer, or by the cross-department magazine leadership.

I posted part of our change list on telligent's own forums, and they locked the thread as moderated so that people can't discuss it, hence the reason why I'm posting it here now (not that people would discuss it, but call it a mega-bump).

http://dev.communityserver.com/forums/t/500575.aspx

 

Features We Had To Implement, and Wish Were Already Implemented.

I wanted to share a list of things we have been having to make in order to make CS 2008 usable for our own purposes. We're still not there yet but we're getting close, and I'm sharing this because, in my opinion, there is no louder message of "please add these features into your product" than the willing efforts made by the customers to do it on a proprietary basis. (Note that these customizations are not being redistributed.) Most of these I had to do single-handedly, and so far it has taken months of SDK tweaking.

  1. Make the top navigation bar data-driven for sort order, data-driven for additional links to custom URLs, and administratable from the Control Panel. (We implemented.)
  2. Auto-generate a blog for each user, and make certain that no errors occur if there are no posts. (We implemented.)
  3. Auto-generate a media gallery for each user, and make certain that no errors occur if there are no posts. Note that the new "My Files" feature is not adequate for this purpose as it doesn't support ratings, comments, etc. (We implemented.)
  4. Hide inappropriate admin options in the control panel from "normal users" in their personal Media Gallery settings, such as e-mail notifications.
  5. Add a "My Blog Actions" component on the sidebar for the Blogs section, so that users can jump straight into managing their blog from the Blogs portal. (We implemented.)
    • Add A New Post
    • View All Posts
    • View Comments On My Posts
    • Manage My Blog
  6. Add a "My Gallery Actions" component on the sidebar for the Media section, so that users can jump straight into managing their media gallery from the Media portal. (We implemented.)
    • Add A New Gallery Item
    • View My Gallery
    • View Comments on My Gallery
    • Manage My Gallery
  7. Add a link to the user's blog from the user's profile. (We implemented.)
  8. Add a link to the user's media gallery from the user's profile. (We implemented.)
  9. Replace the general Media section on the user's page with a "My Media Gallery" section.
  10. Wanted (we have not implemented): Albums inside a gallery.
  11. Restore the drop-down menu for selecting what area to search. (Where'd this go?!)
  12. When searching for users, always assume a wildcard (*) on prefix/suffix. (We implemented.)
  13. Add prominent link to browse people from the user's portal. (We implemented. We added "Members" to the Welcome control on the top right, which links to ~/user/Members.aspx?search=1&t=&sb=1&so=1.)
  14. Make gallery RSS feed PicLens-compliant. (See PicLens.com)
  15. Replace the slide show with PicLens Lite.
  16. Aggregate the media with statistical roll-ups:
    • Highest Rated[in the ..]
      • Last 24 hours
      • Last 7 days
      • Last month
      • Last year
      • All time
    • Most Talked About ...
      • Last 24 hours
      • .. etc
    • Most Viewed
      (We are implementing.)
  17. Show randomized gallery items on sidebar based on statistical aggregate roll-up data. (We are implementing.)
  18. Add "Share with friend" functionality to media galleries. (We implemented.)
  19. Each group/hub gets an events calendar. (We are implementing.)
    • Users can "subscribe" to events to receive an e-mail reminder 24 hours prior to group events. (We are implementing.)
  20. Add the following options (and implement what they infer) to the Edit Profile page:
    • Share Friends (Yes/No)
    • Show Profile Comments (Yes/No)
    • Share Blog Link (Yes/No)
    • Share Gallery Link (Yes / No)
    • Share My Activity Logs (Yes / No)
    • Share My Files (Yes / No)
    • Share My Bio (Yes / No)
    • Show My Announcements (Yes / No)
    • Share My Groups (Yes / No)
      (We implemented.)
  21. Make profile comments and announcements distinct, so that the comments can be treated like a thread and the profile owner can actually respond to a comment without it being a broadcasted announcement. (Think FB 'wall'!!) (We implemented.)
  22. Flag new conversation messages as unread. Any unread messages enables a "new mail" icon to appear in the Welcome control on the top right. Mark the message as read by the recipient when the user accesses the actual conversation message, so the icon disappears. (We implemented.)
  23. Support site-wide survey questions that show up in the user's profile as an additional tab. (We implemented.) These questions are data-driven, and the site administrator can create questions that consist of:
    • Drop-down menus
    • Multi-select list box
    • Textbox
    • Textarea
    • Radio buttons
    • Checkboxes
  24. Support hub-wide survey questions that show up in the group as a Q/A or Polls section. These questions are data-driven, and the hub administrator can create questions of the same types that are supported in the site-wide survey (previous item). (We implemented.)
  25. Support multiple TOS agreements. Make TOS data-driven to point to either a URL or full text field, with a TOS modify date, display each of the TOS agreements in a seperate IFRAME with an "I agree to these terms" checkbox below each, and log the user agreeing to the TOS with timestamp, so that if a TOS modify date ever changes, and any member accesses any member-only section of the site (such as Add a New Post), the user must agree to the latest TOS. Same behavior as World of Warcraft. :) (We implemented.)
  26. Fully integrate live chat support, and link out to a chat room from groups/hubs. (Each group gets a chat room.) (We implemented.)
    • Log chat room activity such that a user can mark a chat room as a favorite and a "Recent chat rooms", "Favorite chat rooms", and "Group chat rooms" are aggregated on the user's portal page with a quick link into the chat room (We implemented.)
  27. Restore into Hawaii the statistical and history data for forums that was enjoyed in the Calypso theme. (We implemented.)
  28. "Write a New Post", "Mark All As Read", and "Reply" need glyphs! (We implemented.)
  29. Make the Control Panel themeable, and make the theme managed by the site theme directory. (We implemented.)
  30. Implement site aggregation in an alternate portal page, magazine-style.

Lots more, but these are enough to mention.

Makes me want to go and build a new community framework from scratch. It's still not too late, although it would take me at least a few years to catch up to telligent's product as it is today.

Currently rated 4.0 by 1 people

  • Currently 4/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

Software Development | Web Development

Social Load Testing?

by Jon Davis 8. July 2008 22:58

Five Runs (silly how many Ruby/Rails-oriented companies are named with two words and one with a number) developed a social load testing solution that appears to help you load test your site and trace bottlenecks in code, but instead of pounding on your own site using local automation, it allows live visitors -- fellow developers who need load tests done for their sites -- to pound on your site.

http://www.fiveruns.com/products/tuneup

Interesting concept. We even have social networking for load testing.. LOL..

Currently rated 1.0 by 21 people

  • Currently 1/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , , ,

Computers and Internet | Software Development | Web Development

SD Cards' Capacities Are Exploding

by Jon Davis 8. July 2008 21:16

Two years ago I really went out and splurged and got myself a halfway decent 6MP digital SLR camera, lenses, a travel case, and the largest capacity SD (Secure Digital) RAM card I could get at Best Buy. Altogether, I spent somewhere on or around $1,000. The SD card was 2GB. It was about $100 at the time, as far as I can remember. But meanwhile I've found myself using it from time to time like a tiny fingertip-held floppy disk.

One year ago, solid state drives started to take off, and 32GB capacities were about the biggest you could get. Anything more than that costed about $1,000.

Now, 32GB SD cards are available at Amazon.com for less than $300. It's this tiny little thing, and yet it has room enough to dual-boot the full installations of Vista and Linux with complete suite of developer tools. So then the questions become, do BIOS's support booting from these things? And, shouldn't these be the new solid state standard?

Might be a speed issue. "15MB" means that it transfers data at only 15MB/s, so perhaps therein lies the problem. 52x CD-ROM drives transfer at around 64 megabits per second (or 8 megabytes per second) so this transfer rate is only about double the speed of a standard high-speed CD-ROM drive. Whereas, a SanDisk SSD5000 Solid State Drive (64GB) has a transfer rate of 121MB/s, which is about eight times as fast as this little SD card.

Even so, the geek in me wonders how far one can go with shrinking UMPCs with technologies like this.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

General Technology | Computers and Internet


 

Powered by BlogEngine.NET 1.4.5.0
Theme by Mads Kristensen

About the author

Jon Davis (aka "stimpy77") has been a programmer, developer, and consultant for web and Windows software solutions professionally since 1997, with experience ranging from OS and hardware support to DHTML programming to IIS/ASP web apps to Java network programming to Visual Basic applications to C# desktop apps.
 
Software in all forms is also his sole hobby, whether playing PC games or tinkering with programming them. "I was playing Defender on the Commodore 64," he reminisces, "when I decided at the age of 12 or so that I want to be a computer programmer when I grow up."

Jon was previously employed as a senior .NET developer at a very well-known Internet services company whom you're more likely than not to have directly done business with. However, this blog and all of jondavis.net have no affiliation with, and are not representative of, his former employer in any way.

Contact Me 


Tag cloud

Calendar

<<  May 2018  >>
MoTuWeThFrSaSu
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

View posts in large calendar