life in a smart mob

social networking and other stuff
Adobe done badly - product feedback is good!

While downloading the latest Adobe reader i ran into a slight problem. We are behind a proxy and the new installation tool that Adobe uses doesn't *seem* to work that way. I'm guessing because the installation tool downloads from the browser and then runs separately and tries to connect to from web address endpoint, doesn't use my browser proxy settings and so can't authenticate and get out.

So, being the nice guy that I am i figured i'd tell Adobe. What i wanted to do was send them a simple email saying "Do you know your new installation program fails behind a proxy."

After looking about the ironically titled "contact us" page for at least a minute (which really is longer than "contacting us" should ever take...) i saw something saying "Try our automated e-mail response system". Here i was presented with (small text to save space):

Customer service form         
  
 *Required fields 
 
 *First name
 
 
 *Last name
 
 
 *Address
 
 
 Address 2
 
 
 *City
 
 
 *State/province
 Select one... --U.S.-- AL AR AK AZ CA CO CT DC DE FL GA DE HI IA ID IL IN KS KY LA MA MD ME MI MN MO MS MT NC ND NE NH NJ NM NV NY OH OK OR PA RI SC SD TN TX UT VA VT WA WI WV WY --Canada-- AB BC MB NB NF NS NT ON QC PE PQ SK --------- Other State/Province  
 
 
 *ZIP / postal code
 
 
 *Country or region
 Select a country or region...United StatesCanadaAsia/PacificEuropeLatin AmericaOther
 
 *E-mail address
 
 
 Adobe ID
   What's this?  
    
   
 *Your question, comment, or suggestion
 
 Please fill out only one of these categories: 
 
  Adobe Store
 
Provide your question, comment, or suggestion regarding the online Adobe Store.
 
  
 
 General Adobe product information 
 
Which Adobe product do you have a question about? 
 
 Choose a product... Adobe ATM Deluxe Adobe ....  
 
What is the version of the product?
 
 
 Select product version... 1.x 2.x 3.x 4.x 5.x 6.x 7.x 8.x 9.x 10.x CS    Help me find this.
 
 
What operating system are you using? 
 
 Choose an OS version... 
  
 
  Adobe processes and policies 
  Select a category... Accessibility Activation Export compliance How to buy/order Piracy Product registration Product replacement Return/exchange/refund Shipping Tax exemption Transfer of license Upgrade installer Other   
  
 
  Adobe services and programs 
  Select a category... Adobe Open Options Adobe Solutions Network (ASN) ASN Developers ASN Service Providers ASN Training Providers Authorized Resellers Certification Program Adobe Expert Support Investor Relations Philanthropy Professional Associations/User Group Relations Trade Shows and Events User to User Forums Other 
  
 
  Other — please elaborate in the section below  
       
 
 *Please enter your message below using as much detail as possible.
 
 Provide any relevant product, program, policy, or processes details.
 
 Provide any relevant URLs. 
 
 Provide any relevant hardware details. 

 characters left (750 characters maximum allowed)      
   
  
 Web submissions are handled from 6 a.m. to 5 p.m. Pacific time, Monday through Friday. We will respond to you via e-mail within one or two business days of receipt.
 
 
Now for a company who make excellent user friendly document software, this is probaly as off putting as i can imagine a form could get. The point is really that companies should think more about how to encourage user feedback about their products rather than hindering the process. Oh, and it doesn't always have to be technical - it can be the obvious stuff too! It's one thing to break your software - and another to stop people telling you about it. The Microsoft feedback site is a bit better, but i still think they could benefit from a "just tell us" link which has a email address, a subject and a textbox. A newletter from Steve Ballmer last year discussed how the Visual Studio product had been dramatically improved from user feedback during the development process. I have even been involved in feedback myself at Microsoft. Some feedback must be better than none at all?!

So i won't be telling them. If you know the email address, please do.

Steven.

aspiring technical entrepreneurs

This may appear obvious to some of you and not so to others.

For all you aspiring technical entrepreneurs out there if i were ever to give some advice from my experiences trying to build a few different types of online businesses over the last 7 years it would be this. Make sure the first thing you do is step away from the laptop and get a very simple A4 list of the problems your customers are facing. This is admittedly been the hardest thing for me to do when compared to keeping up with the latest and greatest technologies that will make my products fly.

For each component or feature you decide to implement, have a *real* problem that is satisfies - this is what they will pay for.

It's been hard coming from a technical background and not drawing use cases as my first step. Long before you get to use cases there is a whole bunch of things you need to do.
I not "get" how this works and so I am starting back at stage 1 just now (well 4 weeks into it), and although i have much of the technology actually developed (which some of you may have seen), I am actually agoing to go through the entire process, business plan and all, from the start and see what comes out at the other end.

I will scribble down what happens over the coming weeks and months and hopefully some of it will be useful to any of you folks looking to develop a product that will sell to someone other than us technophobes. Some may be obvious and other points not so. Let me know how i come across!

To end on a technical note - if you don't have Enterprise Architect, make sure you have a look now!

Steven.

Peer to Peer Source Control

Working on a project where we are all working in different places and online at different times and so on.

We are not working on an Open Source project (don't get me started) and most online source control sites seem to be only for OS projects.
Equally, I seem unable to find something that you can install as a peer based cource control system on Windows (I'd rather avoid the 8000 things you have to set up before you can use such things on Linux, after having such fun installing Mono).

So, i'm looking for ideas and pointers. I'd rather not have to develop anything myself, or extend SourceSafe and so on.
Either it is online always and is web based (or at least http/web service accessible) or it is peer based.

Steven

1MB at last

After a month of moving house and having no phone and most importantly no broadband, i now have the bells and whistles of 1MB ADSL.
And does it fly!!

My contract also finishes on Friday so will start looking for something else to do.

Want to get more involved in Xml this time.... and i can even get VentureTogether ready for public alpha :)

Steven.

DotNetOS domain name available

I have the domains names dotnetOS.net and dotnetOS.org - they are due to expire in a month or and it is unlikely I will keep them. I had intentions for a Dot Net Open Source software listing, but my other projects leave me no time to do it properly.

If anyone else would like them (for free of course), perhaps for a dot net Open Source site, please let me know.

steven

vtgo.net

SqlXml and Yet Another Blog Engine

In Don Box's post Yet Another Blog Engine (Don, if you read this, the ?key=XXXXT takes me to a blank page every time :) ) he asks about the "a-ha" moment when he may get SQLXML or see it as a preferred technique over others.

Here's one scenario for a blog engine. You develop a backend database and the basically acts as a backend to your RSS data (indexing and whatever...). You deploy a client that updates that database based on the Xml from the RSS file(s). You then want to extend, say with a new namespace set of elements (say DC). Easy, add the columns to a new table in the database and ??? There are no doubt a million number of ways this could be done, but what could possibly be easier than annotating the centralized Xml Schema for the RSS documents you have to map the new nodes to columns in the database (and vice versa when getting them back)?? Sure you could update your code that uses the IDataReader, but then there is re-compilation and re-deployment. In SqlXml you have no real overhead - and update to the database (which happens in either scenario) and an update to the schema, which may or may not be centralized, but certainly doesn't require a build/install.

I have done this (not for blogs) and after we got the Schema sorted it was easy. Imagine you wanted to import your Blog Archive to some other database (analysis/reporting) - BulkUpload and SqlXml make this a very easy thing to do. Anyway I can interact with Xml I love it, and SqlXml is not perfect, but there are some situations where it is hard to beat!

XML Query will make it even better in the future and i'm looking forward to it.

vtgo.net

Session in Classic ASP to ASP.Net

I was asked about how to transfer Session state between these Classic ASP and ASP.Net. The first solution that popped into my head was serialization to Xml.

Both can read and write Xml pretty quickly, but has anyone looked into this as an extensible means of transfering state and even remoting state? Any thoughts/answers on this?

I first heard about SQL Reporting tonight as a means to replace Crystal. Any good?

vtgo.net

Foaf with hex encoded SHA1 mailbox

The Foaf mbox_sha1sum element is an email address with the "mailto:" appended to it. Btw, it is not just the digest result, nor is it the result encoded as Base64, but it is Hex encoded (doesn't state the Hex part as the element definition, although i subsequently found it in another element definition).

public static string CreateHexSHA1Sum(string email)
{
    
SHA1Managed hash = new SHA1Managed();
    
    
byte[] digest = hash.ComputeHash(Encoding.Default.GetBytes(email));

     System.Text.StringBuilder sb = new System.Text.StringBuilder();

     foreach (byte b in digest) 
         
sb.Append(b.ToString("x2"));

     return(sb.ToString());
}

In goes someemail@venturetogetherspam.com and out comes 23f728c05bcf6e68eae7f51243ebc805d0d819c5 so we have :

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:foaf="http://xmlns.com/foaf/0.1/">
 <foaf:Person>
   <foaf:name>Steven Livingstone</foaf:name>
   <foaf:mbox_sha1sum>23f728c05bcf6e68eae7f51243ebc805d0d819c5</foaf:mbox_sha1sum>
 </foaf:Person>
</rdf:RDF>

vtgo.net

VT : File copying security puzzler?

So here's a security potential puzzler - some of you will get it right away and others will not. Really depends on whether you have run into it in the past and it is branded into your brain, or maybe security is just first nature to you. Don't read the end and tell me at what point you figured it out. I have numbered various activities througout the blog, so tell me by number where you figured out there would be a problem (note some may be bogus!).

Scenario : At VentureTogether we want you to be able to associate an image with your profile - but of course if you choose not to, you can ignore this step. So a long time ago I created an "Images" directory under Inetpub a long time ago and it currently allows you to upload an image and saves it it the directory. This works fine for ALL users and always has done. To the present... In the case where a user did not upload a photo, a temporary "photo not uploaded" image is to be shown. Next I got a basic photo saying "person unknown" from a freebie site on the web and downloaded it and saved it on my desktop so i could quickly edit it ever so slightly [1]. Once this was done i "Cut and Pasted" the file (called "nophoto.jpg") into the "Images" folder under the Inetpub folder [2].

Next to the coding. A method called SetNoPhoto() was created in my code behind and was designed as follows:

private void SetNoPhoto(int accountID)
{
 string filename = "nophoto.jpg";

 //get a reference to the "no photo" image
 string root = "/Glasgow/UserData/Images/Users/";
 string webroot = Server.MapPath(root + filename);

try
 {
  //first we need to provide access to write to the folder
  FileIOPermission perm
   = new FileIOPermission(FileIOPermissionAccess.AllAccess,
    Server.MapPath(root));

  //make sure we have permission
  perm.Demand();

  File.Copy(webroot, Server.MapPath(root) +  accountID.ToString() + ".jpg");     [xxx]
 }

 catch (Exception ex)
 {
  throw ex;
 }

}

I ran the ASPX page and go an access denied for the file being created during the copy in the line maked [xxx] above [3]. So back I went and checked the parent folder permissions and even made EVERYONE have full acess, ensured the "write" checkbox was checked in IIS and clicked OK. I re-ran the page and still I got the same access denied exception [4].

Next I tried to create a text file in this method - if nothing else than to just validate i could even write to it within this method (paranoia setting in you see!). So I added the code below:

System.IO.StreamWriter sw = System.IO.File.CreateText(Server.MapPath(root) +   accountID.ToString() + ".txt");
sw.WriteLine("I am a new file");
sw.Close();

Again I ran my ASPX file and guess what. The ".txt" file was successfully created and was sitting there in the folder (and i'm sure it had a wicked smile). [5] Got it yet? Bug in File.Copy?? Don't feel too stupid if you haven't got it yet - I felt pretty stupid as I should have known better having read every page of Writing Secure Code, and yep, something was certainly securing its ass off. Now the simple answer...

It was way back when you cut and pasted the file into the inetpub subfolder [6]. Had I copied the thing it would have worked fine. But i cut it. When you copy the file it will inherit the permissions of its containing folder, which would have made everything work fine. But, when you cut, it holds its permissions and hence only my computer account and one or two others could access the file. So when the ASPNET account (or anyone else for that matter) tried to access it, the were denied, So the actual error in the File.Copy() wasn't in fact access denied on the out file, it was access denied on the input file.

So should I feel stupid, or my brain just missed something? I'll guage that by the response I get, but just remember - it happens to us all at least once!

vtgo.net

Avalon lon way to get it - XAML, Xml and (not) Xslt

First, apologies for the title. They made me do it!

So I am finally managing to find some spare time to have a look into Avalon, Indigo and Winfx. However, my first look at Avalon and how it uses Xml is both exciting and confusing all at the same time. Aplogies for any mix up in the various names - still getting used to them.

The way the code separation is done is very cool - i like being able to separate logic from layout from styling. Heck been doing it for years with Xslt, but Avalon makes it even better :)
Maybe this last sentence makes it obvious where the confusion lies. Now, can i re-iteterate I am just looking into this stuff (spent most of my time on Whidbey) so please, please, please don't call my mum (mom) and tell her her son sucks (at least not for this blog) - this is first impressions.

So, Xslt. I like it. It's easy, it works and it is part of the Xml family that I was introduced to way back pre-1998. However, what i seem to see in Avalon is some new technique being adopted to basically do the same thing and I can't quite understand why.

So an example in Avalon using Xaml may be:

<FlowPanel ID="fp">
 <FlowPanel.DataContext>
  <Bind DataSource="{Contacts}" />
 </FlowPanel.DataContext>
 <Button Click="PickIt">Get Them</Button>
 <ListBox ItemStyle="{Person}" ID="_result">
  <ListBox.Items>
   <CollectionContainer Collection="*Bind(Path=/Contacts/*)" />
  <ListBox.Items>
 </ListBox>
</FlowPanel>

In Xslt you could simply do :

<FlowPanel ID="fp" xmlns:dsExt="urn:microsft-com-avalon">
 <FlowPanel.DataContext DataSource="dsExt:Bind(Contacts)" />
 <Button Click="PickIt">Get Them</Button>
 <ListBox ItemStyle="{Person}" ID="_result" Collection="dsExt:Bind(/Contacts/)" />
</FlowPanel>

Again, in Avalon you may have :

<Style def:Name="Person">
 <ListItem />
 <Style.VisualTree>
  <FlowPanel>
   <Border Margin="3" BorderBrush="Blue" BorderThickness="1pt">
    <SimpleText Text="Bind(Path=DisplayName)" />
   </Border>
   <Border Margin="3" BorderBrush="Orange" BorderThickness="5pt">
    <SimpleText FontStyle="Italic" Text="Bind(Path=Email)" />
   </Border>
 </Style.VisualTree>
</Style>

In Xslt you may have (but would never explicity put style in like this - i got CSS) :

<Style def:Name="Person">
 <ListItem />
 <Style.VisualTree>
  <FlowPanel>
   <Border Class="BorderStyle1">
    <SimpleText Text="dsExt:Bind(DisplayName)" />
   </Border>
   <Border Class="BorderStyle2">
    <SimpleText Class="Italics" Text="dsExt:Bind(Email)" />
   </Border>
 </Style.VisualTree>
</Style>

Things like <Style.VisualTree> concern me, but i may be missing the point. For me it's Xml is data, Xslt is layout and Css is style (sure you can put style in Xslt, but why?). On top of that you already have Xml schema that works well with Xml and Xslt. Beyond this you could even write an Xml Schema that could derive the components on the page, leaving thing like text to the Xml and style and positioning to the Xslt. I already do all this on a current project to derive ASP.Net pages. However, in here i see all of this in together. We see Path, when XPath is an implicit part of Xslt. Even extension functions can make the more complex stuff easy too.

Any if you say this is easier than Xslt then i'd love to know how? For me they are very similar and in fact Xslt may even be easier. Show me something hard to write in Xslt that is easy in Avalon.

One disclaimer I will add is that Microsoft always bring out the coolest technology that suddenly makes sense - certainly everything else I have seen if definitely what i was wanting and there is even some stuff in there i didn't know i wanted. So i aint being old miserable me, just fishing for answers!

vtgo.net

More Posts « Previous page - Next page »