ingig.net

Ideas, problems and development of Fronturs websites

This is amazing, who needs airplanes?

clock May 31, 2008 19:02 by author ingig

I guess Star Trek experience is closer then you think. Simply said, Wow!

http://www.musionmedia.co.uk/cisco_day.html

Be the first to rate this post

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


Capitalize each word

clock May 9, 2008 18:47 by author ingig

Just for bookmarking, I have thought about this every few months

http://www.aspdotnetfaq.com/Faq/How-to-Capitalize-the-First-Letter-of-All-Words-in-a-string-in-C-sharp.aspx

Be the first to rate this post

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


Prevent xss in Asp.Net

clock May 8, 2008 15:58 by author ingig
We just did a big update on our system, where we try to prevent possible xss attacks. For those who don't know, xss attacks can happend when you allow user to send text to your server and then display it. From v. 1.1 Asp.Net provided some protection from xss but it's very limited and I disabled it immediately when it came out since it just throws an ugly error message to the user who is trying to put something as small as <b> in his text.

The framework from Microsoft, using viewstate and postback, provides some protection as well since it's harder to change variables, but I never liked that framework, I instead did it the old fashion way, a edit.aspx page that submited it's forms to save.aspx using post. So this is how I get the variables.

string name = Request.Form["name"];
int id    = int.Parse(Request.Form["id"]);
bool isTrue = (Request.Form["isTrue"] == "1");

The problem with this is that I had to clean the variables every time to prevent xss with something like my method Util.ClearHtml(string), the code is something like this

string name = Util.ClearHtml(Request.Form["name"]);
int id        = int.Parse(Clear.Html(Request.Form["id"]));
bool isTrue = (Clear.Html(Request.Form["isTrue"]) == "1");

This is a bit to much code for me and since I'm lazy I almost never did this. Then if somebody sends id=abc the page would crash. This didn't bother me so much, since it only happend when something spooky was going on. But it's ugly. Also the ClearHtml method didn't really do very good job in cleaning the text from possible xss attacks.

So my solution is this. I created the XssClear class with the following methods

This is for getting value from a submitted form using POST

public string F(name); //returns null if string is null else string.Empty if fails to convert, string is Trim()-ed
public int FInt(name); //returns 0 if fails to convert
public double FDouble(name); //returns 0 if fails to convert
public decimal FDecimal(name); //returns 0 if fails to convert
public bool FBool(name); //returns false if fails to convert
public DateTime FDateTime(name); //returns DateTime.MinValue if fails to convert
public string[] FArray(name); //returns null if fails to convert or if value is == "" and "," is the default seperator
public string[] FIntArray(name); //returns null if fails to convert or if value is == "" and "," is the default seperator
public XssClearResult FHtml(name); //this is used when the user can insert html

This is for getting variable using GET (or QueryString)

public string QS(name);
public int QSInt(name);
public double QSDouble(name);
public decimal QSDecimal(name);
public bool QSBool(name);
public DateTime QSDateTime(name);
public string[] QSArray(name);
public string[] QSIntArray(name);
public XssClearResult QSHtml(name);

All my pages inherits from the page BarnalandPage (old name), there I have these methods. So when I want to get a varible from QueryString this is how it's done

string name = QS("name");
int id = QSInt("id");
bool isTrue = QSBool("isTrue");

This saves alot of pain, errors in our system has gone down extremly in the first hours of having it running like this.

So to clean the text for xss attacks I do few things. I don't have think about the basic variables, int, bool, datetime, double, decimal. If the class can't convert it, the default value is returned. Allowing text and html (FHtml and QSHtml) is the big trouble.

This is the method to clean a text and not allowing html

private string Get(string key, string value, string def) {
    if (value == null) return def;

    //Let's check if we have already retrieved this key before
    if (content.ContainsKey(key)) return (string) content[key];

    //AntiXss is a library from Microsoft, seems to work fine
    string s = AntiXss.HtmlEncode(Ingig.Util.ClearHTML(value)).Trim();
    content.Add(key, s);
    return s;
}

The AntiXss library seem to do it's job fine, prevents every attack that is on the xss cheat sheet

Next job is to remove any possible xss attack in a html text. This is more complicated, since the possiblities are many as you can see on the cheat sheet.

We use the method GetHtml(string key, string value); and it looks like this

public class XssClear {
    ....
    ....
    ....

    XssClearResult result;
    string pattern;
    public XssClearResult GetHtml(string key, string value) {
        if (value == null) return null;
        if (content.ContainsKey(key)) return (XssClearResult) content[key];

        result = new XssClearResult();

        // change every hexadecimal to ascii
        // change every hex value to ascii
        // remove &#x09; | &#9; | &#x0A; | &#10; | &#x0D; | &#16;
        // remove tab | \n | \r
        // remove /\*\s*\S*\s*\*/  'This is comments in code

        value = Regex.Replace(value, @"(&\#[0-9]{1,20};?)", new MatchEvaluator(XssClear.DecimalToString), RegexOptions.IgnoreCase);
        value = Regex.Replace(value, @"(&\#x[0-9][0-9a-f];?)|(%[0-9a-f]{2};?)", new MatchEvaluator(XssClear.HexToString), RegexOptions.IgnoreCase);
        value = Regex.Replace(value, @"¼(/?script)¾", "<$1>", RegexOptions.IgnoreCase);
        value = Regex.Replace(value, @"/\*[^*]*\*/", "", RegexOptions.IgnoreCase);
        // value = Regex.Replace(value, @"(\n)*", "");
        value = Regex.Replace(value, @"(\t|\r|\f)*", "");

        DataTable dt;
        //I have the database table XssRegex, which contains list of regex that prevent xss attacks, let's load it from db if not cached
       if (HttpContext.Current.Cache["XssRegexList"] == null) {

            //This uses my DbConnection class which connects to the database and saves alot of pain
            DbConnection db = new DbConnection();
            db.Sql = "SELECT regex FROM XssRegex";
            dt = db.Query().Table;

            HttpContext.Current.Cache.Insert("XssRegexList", dt);
        } else {
            dt = (DataTable) HttpContext.Current.Cache["XssRegexList"];
        }


        //Now we run through the regex and remove any thing that is a possible xss attack
        //If we find a possible attack we remove it and add it into our error list
        //and report what pattern it was that caused the error
        Regex regex;
        MatchCollection matches;
        foreach (DataRow dr in dt.Rows) {
            regex = new Regex(dr["regex"].ToString(), RegexOptions.IgnoreCase);
            matches = regex.Matches(value);
            if (matches.Count > 0) {
                for (int i=0;i<matches.Count;i++) {
                    result.Errors.Add(AntiXss.HtmlEncode(matches[i].Value.Replace(matches[i].Value, "[[[span class[]red]]]" + matches[i].Value + "[[[///span]]]")).Replace("&#91;&#93;", "=").Replace("&#47;&#47;&#47;", "/").Replace("&#91;&#91;&#91;", "<").Replace("&#93;&#93;&#93;", ">"));
                   
                    result.Patterns.Add(AntiXss.HtmlEncode(dr["regex"].ToString()));
                }
                value = regex.Replace(value, "");
            }
        }
       
        pattern = "<[a-z*^on]*\\s*([a-z^on]*=\"?[a-z]*\"?)|(?<Event>on[a-z]*[^=]*=[^ >]*)|";
                pattern +=    "<[a-z*^on]*\\s*([a-z^on]*=\"?[a-z]*\"?)|(?<Event>seeksegmenttime[^=]*=[^ >]*)|";
                pattern +=    "<[a-z*^on]*\\s*([a-z^on]*=\"?[a-z]*\"?)|(?<Event>fscommand[^=]*=[^ >]*)|";
                pattern +=    "<[a-z]*\\s*[a-z]*=\"?([a-z^on]*=\"?[a-z]*\"?)|(?<Event>(mocha|livescript)[^:]*:[^ \">]*)\"?";

        pattern = "<[a-z*^on]*\\s*((?<Attributes>[a-z]*=?\"?[^\">]*\"?)\\s*)*";

        regex = new Regex(pattern, RegexOptions.IgnoreCase);
        matches = regex.Matches(value);
        for (int i=0;i<matches.Count;i++) {
            value = regex.Replace(value, new MatchEvaluator(RemoveOnEvent));               
        }
       
        pattern = "<embed(\\s*\\w*\\s+|(\\w*=\"((?<Always>always)|[^\" ]*)\"))*";
        regex = new Regex(pattern, RegexOptions.IgnoreCase);
        matches = regex.Matches(value);
        for (int i=0;i<matches.Count;i++) {
            value = regex.Replace(value, new MatchEvaluator(RemoveAlwaysInScriptAccess));
        }

        result.Text = value.Trim();
        string s = (value);
        content.Add(key, result);
        return result;
    }

    //This is for removing AllowScriptAccess in embed tags
    public string RemoveAlwaysInScriptAccess(Match m) {
        if (m.Groups["Always"].Value.Trim() == "") return m.Groups["Always"].Value;
        result.Errors.Add(AntiXss.HtmlEncode(m.Value.Replace(m.Groups["Always"].Value, "[[[span class[]red]]]" + m.Groups["Always"].Value + "[[[///span]]]")).Replace("&#91;&#93;", "=").Replace("&#47;&#47;&#47;", "/").Replace("&#91;&#91;&#91;", "<").Replace("&#93;&#93;&#93;", ">"));
        result.Patterns.Add(AntiXss.HtmlEncode(pattern));

        return m.Value.Replace(m.Groups["Always"].Value, "no");
    }


    public string RemoveOnEvent(Match m) {
        string txt = m.Value;
        for (int i=0;i<m.Groups["Attributes"].Captures.Count;i++) {
            string temp = m.Groups["Attributes"].Captures[i].Value.ToLower();
            if (temp.StartsWith("on") || temp.StartsWith("seeksegmenttime") || temp.StartsWith("fscommand") || temp.StartsWith("mocha") || temp.StartsWith("livescript")) {
                result.Errors.Add(AntiXss.HtmlEncode(m.Value.Replace(m.Groups["Attributes"].Captures[i].Value, "[[[span class[]red]]]" + m.Groups["Attributes"].Captures[i].Value + "[[[///span]]]")).Replace("&#91;&#93;", "=").Replace("&#47;&#47;&#47;", "/").Replace("&#91;&#91;&#91;", "<").Replace("&#93;&#93;&#93;", ">"));
                result.Patterns.Add(AntiXss.HtmlEncode(pattern));
                txt = txt.Replace(m.Groups["Attributes"].Captures[i].Value, "");
            }
        }
        return txt;
    }

    /* One trick for xss is to type everything in Decimal or Hex, these two methods (DecimalToString and HexToString)
        changes all decimal and hex into regular text */

    public static string DecimalToString(Match m) {
        return char.ConvertFromUtf32(System.Convert.ToInt32(m.Value.Replace("&#", "").Replace(";", "")));
    }

    public static string HexToString(Match m) {
        return char.ConvertFromUtf32(Convert.ToInt32(Convert.ToUInt32(m.Value.Replace("&#x", "").Replace("%", "").Replace(";", ""), 16)));
    }
}

The result is then loaded into XssClearResult


public class XssClearResult {
    private ArrayList errors;
    private ArrayList pattern;
    private string text;

    public XssClearResult() {
        this.errors  = new ArrayList();
        this.pattern = new ArrayList();
    }

    public ArrayList Errors {
        get {return errors;}
    }
    public ArrayList Patterns {
        get {return pattern;}
        set {pattern = value;}
    }
    public string Text {
        get {return text;}
        set {text = value;}
    }
}

So when I want to allow user to send html over the wire I simply do

string text = FHtml("text").Text;

If I want to list all the possible xss attack that the user inserted I simply do

ArrayList al = FHtml("text").Errors;
for (int i=0;i<al.Count;i++) {
    Response.Write(al[i]);
}

As far a I can see this prevents "any" known xss attacks which is nice because they used to be everywhere in our system. Why did I use "any"? Well I don't do checks for old Netscape 4 browsers.

The are some assumptions that I make,
  • string is always trimmed,
  • number variables(int,double,decimal) returns 0 if it fails to convert,
  • boolean variable returns false if it fails to convert,
  • DateTime returns DateTime.MinValue if it fails to convert,
  • if the value that is going to be converted to an array is empty it returns null.
You can still change the default value, in one case I needed FInt("id") to return -1 as default value, so the method FInt("id", -1) came to be available.

You can download the XssClear class here, it includes XssClear, XssClearResult and a txt file with the regex's in the database, hope you like it and can use it.

Currently rated 5.0 by 2 people

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


Google search results

clock April 22, 2008 21:18 by author ingig
Does anyone else feel like the google search results aren't the same quality as it used to be. Just a feeling, it's been really difficult to find stuff lately.

Be the first to rate this post

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


Remove item from Response Header

clock April 17, 2008 12:16 by author ingig

Every time somebody requests a item from our webserver it inserts a litle info about itself into the response header

Server:Microsoft-IIS/6.0

I've been wondering how to remove this since I think it pretty pointless

You need to create a httpmodule, 

public class WebsiteDomainModule : IHttpModule {
    // IHttpModule members
    public void Init(HttpApplication httpApp) {
        httpApp.PreSendRequestHeaders += new EventHandler(this.OnPreSendRequestHeaders); 
    }

    public void Dispose() {
        // Usually, nothing has to happen here...
    }
    public void OnPreSendRequestHeaders(object sender, EventArgs e) {
        HttpContext.Current.Response.Headers.Remove("Server");
    }
}

Just add a reference into you web.config file and that line is gone.

By removing that line we save about 25 MB of traffic data every day, about 3GB a month. Not bad.

Be the first to rate this post

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


Upper the first letter - Util

clock April 10, 2008 16:36 by author ingig

Another simple one. This makes sure that the first letter in a text is uppercase

public static string UpperFirstLetter(string str) {
    return str.Substring(0, 1).ToUpper() + str.Substring(1, str.Length-1);
}

Be the first to rate this post

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


Just in case someone is using type for locking

clock April 7, 2008 18:38 by author ingig
Check out this article about locking, http://jeffbarnes.net/portal/blogs/jeff_barnes/archive/2008/02/07/don-t-use-types-for-locking.aspx

Be the first to rate this post

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


Clear html - from Util class

clock April 3, 2008 13:44 by author ingig

To continue with my util class, this is how you clear all html from a text.

public static String ClearHTML(String text) {
    Regex reg = new Regex("<[^>]*>");
    return reg.Replace(text, " ");           
}

Currently rated 5.0 by 1 people

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


The Util class

clock April 2, 2008 15:40 by author ingig

I was looking at the Util class that we use in our website and decided to put the code here on the blog. I'll create a post for each method, but be aware, the code isn't always the most optimized and some of it was written over 6 years ago. 

Let's start with something simple

public static bool LegalEmail(string email) {
    if (email == null) return false;
    if (email.Length < 6) return false;
    if (email.IndexOf("@") == -1) return false;

    return (Regex.Match(email, @"^[a-z0-9\._-]+@[a-z0-9\._-]+\.+[a-z0-9]{2,4}$", RegexOptions.IgnoreCase).Length != 0);
}

This method simply checks if the string is a legal email address. Now that .Net support extension in v3.5 I guess it's time to change this into an extension, so instead of writing

string email = "example@example.com";
if (Util.LegalEmail(email)) {
    //do stuff
}

you can write

string email = "example@example.com";
if (email.LegalEmail()) {
    //do stuff
}

 

Be the first to rate this post

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


Here comes another bubble

clock March 21, 2008 16:14 by author ingig

Be the first to rate this post

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


The C# ?? null coalescing operator

clock September 22, 2007 22:03 by author ingig

This is pretty cool, never knew about it 

http://weblogs.asp.net/scottgu/archive/2007/09/20/the-new-c-null-coalescing-operator-and-using-it-with-linq.aspx

Be the first to rate this post

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


Paper prototyping

clock May 31, 2007 23:44 by author ingig

I was looking at stylegala.com and there was a link about paper prototyping. This is something that anybody who designs software should use. Most of the time I use paper or the whiteboard and recently my notebook since it's a tablet. There is still some trouble with using a tablet, mostly flexability. You can handle the paper anyway you want, it's light and not hot but there is something about the computer, like storing the prototype, the paper prototype usually ends up in the trash.

Also writing up flowcharts on paper is a great help, a lot better the using software to draw them. So the paper is still working well

Be the first to rate this post

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


Graham Algorithm

clock May 26, 2007 21:39 by author ingig

This is something I've been looking for

http://www.codeplex.com/grahamalgorithm it's build on A Plan for Spam

The plan for this is for detecting indecent posts in guestbook and weblog comments.  For some reason kids(and even some adults) think it's funny(usually the kids) or just to be cruel(usually the adults) post indecent entries into others peoples guestbook.

Right now we are using a long word list to try to filter out the bad posts, some word are good with low spam probability and others bad word with high spam probability. This is hard because you can write the same word many different ways and there are endless amount of bad words out there.

Be the first to rate this post

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


PublicDomain

clock May 26, 2007 20:52 by author ingig

Quite nice class library

http://www.codeplex.com/publicdomain 

Be the first to rate this post

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


3D map of the world

clock May 21, 2007 03:51 by author ingig

This is just really cool

http://freeearth.poly9.com/

Currently rated 2.0 by 1 people

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


Using the Frontur Webservice API

clock May 17, 2007 21:05 by author ingig

I'll try to give step by step description on how to use the Frontur Webservice API. In this first tutorial I'll be using Visual C# Express to connect to the webservice. If you use VB.Net you should be familiar with what's happening.

The next tutorial I'll use Java and the Intellij IDEA from Jetbrains.com, this is the only IDE that I have ever liked so I recomend it.

The first step is to register on one of our websites. Since this is in english I'll go to babyworld.net and pick my self a username and password and type in my email. You don't have to write any baby. Then click Save. Next  I click on API at the bottom of the page. There I'll get a litle description of what is possible. If needed I'll add more information.

Now click on My keys & Apps, this is where you can apply for a key. Type in your name and email. If you are going to write a web application you need to type in the Url. Select the application type, give it some name and description. The name of the application and description isn't important at this point. Right now we don't want to show the application on the public website since we are just trying this out. Check the terms box and click Save. [figure1]

This will give us a API key that we can use in our application, see [figure 2]

Now it's time to fire up Visual C# Express and create a new Window Application, I'll name it MyLatestPictures [figure 3]. I create a private variable called apiKey. [figure 4] Next we'll create a new web reference(Project -> Add Web Reference). We are going to use the the DataStorage webservice. This is where you can retrieve all files from our system. The path to the webservice is http://babyworld.net/dev/DataStorage.asmx as you can see if you go to http://babyworld.net/dev/ the WSDL file for that webservice is http://babyworld.net/dev/DataStorage.asmx?WSDL

So we will use that URL and paste it into the Add Web Reference window [figure 5]. We click the Add reference button.

Next we go into the Window Designer and setup few controls on that form. I have 3 pictureboxes, two buttons and one lable. [figure 6].

This is the code in form, the names of the controls are: lblTotalImages; button1; button2; currentPicture; prevPicture; nextPicture

public partial class Form1 : Form {

    //You'll need a new api key, this one doesn't work
    private string apiKey = "4717046c-9974-45ba-88b3-ad5a5d7fe6ca";
    private FolderFile[] files = null;
    private int currentPosition = 0;

    public Form1()  {
        InitializeComponent();

        //Create instance of the DataStorage object that the webservice provides
        DataStorage ds = new DataStorage();

       //We retrieve 10 last files from websiteId 27733, the password is empty
       //the websiteId is the path to the website. E.g. http://babyworld.net/baby/123,
       //http://barnaland.is/barn/123. WebsiteId should always be available to test

         //this application or others. If you don't know the websiteId you can use
        //http://babyworld.net/dev/website.asmx to look it up.
        files = ds.GetLatestFilesOnWebsite(27733, 10, "", apiKey);

        //Just setting some text
        lblTotalImages.Text = "There are total of " + files.Length + " files retrieved";

      //Disable the previous button, this is the first picture so there is
      //no previous picture

      button2.Enabled = false;

    //load current picture (the big one)
    for (int i = 0; i < files.Length; i++) {
        if (IsPicture(files[i].FileName)) {
            LoadImage(currentPicture, files[i].Path);
            currentPosition = i;
            i = files.Length;
        }
    }

    //lets load a thumbnail into the nextPicture PictureBox
    LoadNextPicture();
}


private void button1_Click(object sender, EventArgs e) {

    if (currentPosition+1 >= files.Length) button1.Enabled = false;
    button2.Enabled = true;

    //load current picture (the big one)
    for (int i = currentPosition + 1; i < files.Length; i++) {
        if (IsPicture(files[i].FileName)) {
            LoadImage(currentPicture, files[i].Path);
            currentPosition = i;
            i = files.Length;
        }
    }

    LoadNextPicture();
    LoadPrevPicture();
}


private void button2_Click(object sender, EventArgs e) {

     if (currentPosition-1 <= 0) button2.Enabled = false;
    button1.Enabled = true;

    //load current picture (the big one)
    for (int i = currentPosition - 1; i > -1; i--) {
        if (IsPicture(files[i].FileName)) {
            LoadImage(currentPicture, files[i].Path);
            currentPosition = i;
            i = -1;
        }
    }

    LoadNextPicture();
    LoadPrevPicture();
}


/**
* Loads the picture from the domain into the application
*/

private void LoadImage(PictureBox box, string path) {

    WebRequest wr = WebRequest.Create("http://babyworld.net/" + path);
    using
(WebResponse webResponse = wr.GetResponse()) {

        box.Image = Image.FromStream(webResponse.GetResponseStream(), false);
    }
}


/**
* Check if this fileName ends on a picture extension
*/
private bool IsPicture(string fileName) {

    return (Path.GetExtension(fileName) == ".jpg" ||
                Path.GetExtension(fileName) == ".jpeg" ||  
                Path
.GetExtension(fileName) == ".gif" ||

                    Path.GetExtension(fileName) == ".png");
}


/***
* Loads the previous picture thumbnail into the previous picture box
*/

private void LoadPrevPicture() {

    //load prev picture

    for (int i = currentPosition - 1; i > -1; i--) {
          if (IsPicture(files[i].FileName)) {
            LoadImage(prevPicture, files[i].ThumbnailPath);
            i = -1;
        }
    }
}

/***
* Loads the next picture thumbnail into the next picture box
*/

private void LoadNextPicture() {
    //load next picture
    for (int i = currentPosition + 1; i < files.Length; i++) {
        if (IsPicture(files[i].FileName)) {
            LoadImage(nextPicture, files[i].ThumbnailPath);
            i = files.Length;
        }
    }
}

}

}

You can get the project here If you have any questions please post it into our forum on frontur.com or post in the comments below or send me an email. Also, you get a 16GB account if you are using any of our webservices for free for life (or at least while the application works)

Be the first to rate this post

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


New prices at Amazon S3

clock May 1, 2007 01:00 by author ingig

I recieved an email from the Amazon Web Services telling me that the prices are going down. This I like.

Current bandwidth price (through May 31, 2007)
$0.20 / GB - uploaded
$0.20 / GB - downloaded

New bandwidth price (effective June 1, 2007)
$0.10 per GB - all data uploaded

$0.18 per GB - first 10 TB / month data downloaded
$0.16 per GB - next 40 TB / month data downloaded
$0.13 per GB - data downloaded / month over 50 TB
Data transferred between Amazon S3 and Amazon EC2 will remain free of charge

New request-based price (effective June 1, 2007)
$0.01 per 1,000 PUT or LIST requests
$0.01 per 10,000 GET and all other requests*
* No charge for delete requests

Storage will continue to be charged at $0.15 / GB-month used.

It's always good news to see the price go down. They have added a new category were you pay per request. I can' see that this will affect us in any way. 

The progress of uploading the files are going well. We have about 80% of all the files uploaded and soon we will start using it on our public website. I have been trying it here on the development machine and it seems to work fine.  

 

Be the first to rate this post

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


New theme and podcast

clock April 27, 2007 01:00 by author ingig

Those two of you that are comming to this website, accourding to Google Analytics (which means: I at home and I at work), have noticed that there is a new theme on the site. Nothing more to say about that.

I've been spending two days at home in bad health, meanwhile I've been catching up to some great video podcasts.

If you have the chance look at these video podcasts they are great. There are more podcasts on revision3.com that are promising. I'm have að HTPC at home using MediaPortal, there I download these podcasts automatically so I view these shows just like any other tv show. I wouldn't be surprise if 20% of the shows I'll be watching at the end of the year will be video podcast. Ofcourse these video podcasts will never compete with million dollar shows like Lost & 24 but with items like Apple TV I think the power will shift and we will see totally different market in 5-10 years.

Be the first to rate this post

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


Regex for element parsing

clock April 16, 2007 23:02 by author ingig
Just for future reference for retrieving the element and attribute from a html file
\</?(?<tagName>[a-zA-Z]*)\s*((?<attributeName>[\w]*)\s*=?\s*
            (?<attributeValue>["/\?='%\-:;a-zA-Z0-9]*))*>

Be the first to rate this post

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


Trying SubSonic

clock April 16, 2007 15:49 by author ingig
I've been trying SubSonic 2 for few days now and it looks pretty cool, I had some problems with updating and deleting record but that seems to be fixed by now. I think that about a two year or so we will be very close to let a website generate it self just by database. SubSonic is pretty far from there but I can defenently see it in the future.

Added few links to the site, just what I remeber at the moment

Be the first to rate this post

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


Search

Twitter Updates

    Myndir

    Er.is

    Calendar

    <<  November 2008  >>
    SuMoTuWeThFrSa
    2627282930311
    2345678
    9101112131415
    16171819202122
    23242526272829
    30123456

    Archive

    Tags

    Categories


    Blogroll

    Disclaimer

    The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

    © Copyright 2008

    Sign in