Wednesday, March 9, 2011

Enable Compiler Extensions in .NET 2.0

If you get an error like shown below; this is probably due to the downgrade of a project from .NET 3.5 or higher to .NET 2.0

Cannot define a new extension method because the compiler required type 'System.Runtime.CompilerServices.ExtensionAttribute' cannot be found. Are you missing a reference to System.Core.dll?

Extension methods are a new feature in .NET 3.5 (C#3/VB9) that let you appear to "spot weld" new methods on to existing classes.
If you think that the "string" object needs a new method, you can just add it and call it on instance variables.

But how do we accomplish this in .NET 2.0?

VB.NET

' you need this once (only), and it must be in this namespace
Namespace System.Runtime.CompilerServices
    <AttributeUsage(AttributeTargets.Assembly Or AttributeTargets.[Class] Or AttributeTargets.Method)> _
    Public NotInheritable Class ExtensionAttribute
        Inherits Attribute
    End Class
End Namespace
' you can have as many of these as you like, in any namespaces
Public NotInheritable Class MyExtensionMethods
    Private Sub New()
    End Sub
    <System.Runtime.CompilerServices.Extension> _
    Public Shared Function MeasureDisplayStringWidth(graphics As Graphics, text As String) As Integer
        ' ... 
 
    End Function
End Class

C#



// you need this once (only), and it must be in this namespace
namespace System.Runtime.CompilerServices
{
    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class
         | AttributeTargets.Method)]
    public sealed class ExtensionAttribute : Attribute {}
}
// you can have as many of these as you like, in any namespaces
public static class MyExtensionMethods {
    public static int MeasureDisplayStringWidth (
            this Graphics graphics, string text )
    {
           /* ... */
    }
}

Thursday, March 3, 2011

Upgrade Windows 1.0 to Windows 7

http://www.winrumors.com/man-upgrades-windows-1-0-to-windows-7-via-every-other-windows-versions/

I stumbled upon this video of a guy upgrading windows from the first until the last version…
Talk about backward compatibility !!!

The movie  shows all details about the installation process of each version of the windows UI from windows 1.0 until windows 7.
The only exception is Windows ME, missing as you can only upgrade to ME or 2000 and not both.

The video creator, Andrew Tait, used VMWare to install each version and started by installing MS-DOS 5.0 to prepare for the Windows 1.0 installation.

If you’re a Windows fan and have 10 minutes free then check-out the nostalgic video below,
thanks to The Next Web for spotting this classic.

Tuesday, February 15, 2011

FileDB - A C# database to store files

When browsing through the codeplex website, I found an interesting project.
A simple easy to use storage container, in the past I used QVFS
http://www.codeproject.com/KB/vb/QVFS.aspx .
But this project seems to be abandoned. This seems to be very promising, the only thing I'm missing, that is available in QVFS is the ability
to create a folder structure inside the virtual storage file. On the other hand QVFS uses 2 files, 1 info file and a data file as this FileDB uses only 1 file.

Ripped of CodePlex website : http://filedb.codeplex.com/
Credits go to mbdavid http://www.codeplex.com/site/users/view/mbdavid

 

FileDB - Project Description




FileDB is a free, fast, lightweight C# (v3.5) DLL project to store, retrieve and delete files using a single archive file as a container on disk.
It's ideal for storing files (all kind, all sizes) without databases and keeping them organized on a single disk file.



  • First stable version was launched
  • Improvements on concurrent write access
  • New method: Export - Export all files to a directory

using Numeria.IO;

var pathDB = @"C:\Temp\MyDB.fdb";

// Creating an empty FileDB archive
FileDB.CreateEmptyFile(pathDB);

// Store file from input stream
var info = FileDB.Store(pathDB, "MyFileName.jpg", inputStream);
// -or- store directly from the file itself
var info = FileDB.Store(pathDB, @"C:\Temp\MyPhoto.jpg");

// The 'info' variable returned contains information about your file (generated GUID, filename, file-length, mime-type)
var fileGuid = info.ID;

// Reading file inside FileDB and writing it on an output stream (also available to write it directly to a file)
var info = FileDB.Read(pathDB, fileGuid, outputStream);

// Deleting a file
var ok = FileDB.Delete(pathDB, fileGuid);


FileDB Methods



  • CreateEmptyFile - Create an empty data file archive
  • Store - Store from file/stream to the data file
  • Read - Search a fileID and restore it to output file/stream
  • Delete - Delete a file
  • ListFiles - List all files inside the archive
  • Shrink - Reorganize archive removing unused disk space
  • Export - Export files inside archive to a directory

All operations have a static method helper or can be used from a FileDB instance.


ASP.NET MVC Example

Below is a basic example to store/retrieve/delete information in a ASP.NET MVC Controller



private string pathDB = @"C:\Temp\MvcDemo.fdb";

// Uploading a file
[HttpPost]
public ActionResult Upload()
{
HttpPostedFileBase file = Request.Files[0] as HttpPostedFileBase;

if (file.ContentLength > 0)
FileDB.Store(pathDB, file.FileName, file.InputStream);

return RedirectToAction("Index");
}

// Download
[HttpGet]
public ActionResult Download(string id)
{
// Using a classic way to download a file, instead of FileContentResult mode.
// Optimizing for big files. Your webserver will not consume CPU/Memory to download this file (even very large files)

using (var db = new FileDB(pathDB, FileAccess.Read))
{
var info = db.Search(Guid.Parse(id));

Response.Buffer = false;
Response.BufferOutput = false;
Response.ContentType = info.MimeType;
Response.AppendHeader("Content-Length", info.FileLength.ToString());
Response.AppendHeader("content-disposition", "attachment; filename=" + info.FileName);

db.Read(info.ID, Response.OutputStream);

return new EmptyResult();
}
}


Why?


Well, all web developers already had this problem: "I need to store same user files (photos, documents, ...) and I need to save them on my web server. But where? File system or database?"
(See some discussion in http://stackoverflow.com/questions/3748/storing-images-in-db-yea-or-nay#3756)
The problem is: the database was not designed to store files. ADO.NET doesn't have a good method to work with streams (only byte[]).
For small files (less then 100K) it works very nice. But what happens with a 10Mb file? 100Mb? It's terrible! The solution: work on file system!
The file system has a problem too: what if my user wants to upload 300 files? And what if I have 2000 users?
You will have thousands of files to backup and manage, and this will be a pain.
My idea: a single archive (or a single archive per user) to store only user uploaded files.
I use the SQL Server database to store the ID file reference (GUID) and FileDB does the rest of the job, storing and managing the files and bytes.


How FileDB works?


FileDB was designed to be fast, very simple, file-based and works with all file sizes.
FileDB doesn't consume lots of memory because it works only with streams (no byte[]).
The data structure is built with two kinds of pages: IndexPage and DataPage.
- The IndexPage stores information about the file descriptor and it's organized in a binary tree structure.
- The DataPage stores the file bytes.

Both pages have 4096 bytes (plus 100 bytes to file header). Each page has its own header to store information about the data inside the page.
You can delete a file inside the archive and the empty data pages will be used on next insert. Or you can shrink database to get your non-used bytes.
FileDB caches (in memory) only index pages, to be faster on a second search.


Limitations

I've made many tests to check performance and limitations with all file sizes.
To protect against many clients changing data on same archive, FileDB uses read share mode.
This way many users can search/read simultaneously but only one user can write (store/delete) at a time.
FileDB class also implements IDisposable so you can use it inside a using code.


using(var db = new FileDB(pathDB, FileAccess.ReadWrite))
{
db.Store(@"C:\Temp\MyPhoto.jpg");
}



The data size limitations are based on .NET MaxValue constants. FileDB works with UInt32 (4 bytes unsigned), which limits each file to 4GB and the database to 16TB (4096 Pages * UInt32.MaxValue).

Monday, January 24, 2011

How to identify if string contain a number?

System.Text.RegularExpressions.Regex.IsMatch(input, "\d")

So times you will need to check a string, to see if it contains a number.
What’s the best way to do this?


There are several solutions like this function :

TryParse approach:



Public Shared Function IsNumeric(Expression As Object) As Boolean
    Dim isNum As Boolean
    Dim retNum As Double
    isNum = [Double].TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, retNum)
    Return isNum
End Function

Check Characters in String approach:



Public NotInheritable Class Extensions
    Private Sub New()
    End Sub
    <System.Runtime.CompilerServices.Extension> _
    Public Shared Function IsNumeric(s As String) As Boolean
        For Each c As Char In s
            If Not Char.IsDigit(c) AndAlso c <> "."C Then
                Return False
            End If
        Next
 
        Return True
    End Function
End Class

What about locales where '.' is the group separator, not the comma (e.g. pt-Br)? What about negative numbers?
Group separators (commas in English)? Currency symbols?
TryParse() can manage all of these as required using NumberStyles and IFormatProvider.

Regular Expressions approach:



System.Text.RegularExpressions.Regex.IsMatch(input, "^\d+$")

This will return true if input is all numbers


If you just want to know if it has one or more numbers mixed in with characters, leave off the ^ + and$.



System.Text.RegularExpressions.Regex.IsMatch(input, @"\d")

Actually I think it is better than TryParse because a very long string could potentially overflow TryParse.

Summary


In my opinion the winner is the Regular Expressions Method

Sunday, January 9, 2011

Secunia Personal Software Inspector (PSI)

 

Upon stumbling through the web, I found a nice tool to check the installed software for security issues and out-dated programs.
So I thought I’d shared it with you…

http://secunia.com/vulnerability_scanning/personal/

They even have an online scanning tool, so you don’t need to install the application http://secunia.com/vulnerability_scanning/online/

Screenshot PSI application :image

FREE PC Security for Home Users

The Secunia PSI is a FREE security tool designed to detect vulnerable and out-dated programs and plug-ins which expose your PC to attacks. Attacks exploiting vulnerable programs and plug-ins are rarely blocked by traditional anti-virus and are therefore increasingly "popular" among criminals.
The only solution to block these kind of attacks is to apply security updates, commonly referred to as patches.
Patches are offered free-of-charge by most software vendors, however, finding all these patches is a tedious and time consuming task.
Secunia PSI automates this and alerts you when your programs and plug-ins require updating to stay secure.
Download the Secunia PSI now and secure your PC today - free-of-charge.


Secunia PSI Watch: How to install and use the Secunia PSI 2.0

Current version:
2.0

Latest release:
5th Jan, 2011

File size:
1,737,088 bytes

Alternate download link: ftp://ftp.secunia.com/PSISetup.exe

Older version of the Secunia PSI can be downloaded at:

http://secunia.com/PSI1Setup.exe

System Requirements

The list of requirements that must be met for the Secunia PSI to function correctly are:

Supported Operating Systems (32 & 64 bit):
  • Microsoft Windows 7
  • Microsoft Windows Vista SP 1 or later
  • Microsoft Windows XP - SP 3
Privileges

To install and run the Secunia PSI you require administrative privileges.

Connectivity

Access to Secunia's encrypted servers via SSL (https://psi.secunia.com:443/) and access to Microsoft Windows Update servers,
see also Software Requirements below

Software Requirements

The latest version of Microsoft Update.
You can determine whether or not you are running the latest version by visiting update.microsoft.com.
If you are able to check your system for missing updates through this tool, your system should function properly with the Secunia PSI.

Hardware Requirements:

There are no additional hardware requirements.
If your computer runs any of the above mentioned Operating Systems, then Secunia PSI should work.

Tuesday, December 7, 2010

VB.NET : Check TextBox For Non-Numeric Values

Public Function CheckTextBox(ByVal textb As TextBox, ByVal key As KeyPressEventArgs, Optional ByRef err As String = "") As Boolean
 
       Select Case Asc(key.KeyChar)
           Case 8 To 15
               Return True
           Case 48 To 57
               Return True
           Case 127
               Return True
           Case Else
               err = "Illegal characters have been put in!" + vbCrLf + "Please only use numeric characters."
               Return False
       End Select
   End Function

VB.NET : Sort Collection Made Easy

  
Public Function SortStringCollection(ByVal Col As Collection) As Collection
        ArrayList.Adapter(Col).Sort()
        Return Col
    End Function

Wednesday, November 3, 2010

Test if Integer has been set : Nullable Value Types

For example, let's say that you have an integer for tracking some value and it can be positive and negative.
It is also possible for the value to be not set yet.
How do you detect that the value hasn't been set yet?
You typically come up with some arbitrary number like 99999999 and hope that the real value is never actually 999999999.

A better way since .NET 2.0, Nullable Value Types
Class [MyClass]
 
Private someValue As System.Nullable(Of Integer)
    Public Sub New()someValue = Nothing
End Sub
 
Public Function GetSomeValue() As Integer
    If someValue IsNot Nothing Then
        Return someValue
    Else
        Throw New Exception("Some Value has not been set")
    End If
End Function
 
End Class

This is a much cleaner and safer way than checking for some arbitrary number like 999999999.

Following snippet from Microsoft explains :
http://msdn.microsoft.com/en-us/library/ms235245(v=VS.100).aspx




So what are Nullable Value Types ?




Sometimes you work with a value type that does not have a defined value in certain circumstances.
For example, a field in a database might have to distinguish between having an assigned value
that is meaningful and not having an assigned value.
Value types can be extended to take either their normal values or a null value. Such an extension is called a nullable type.

Each nullable type is constructed from the generic Nullable(Of T) structure.
Consider a database that tracks work-related activities.
The following example constructs a nullable Boolean type and declares a variable of that type.
You can write the declaration in three ways:


Dim ridesBusToWork1? As Boolean
Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)

The variable ridesBusToWork can hold a value of True, a value of False, or no value at all. Its initial default value is no value at all, which in this case could mean that the information has not yet been obtained for this person. In contrast, False could mean that the information has been obtained and the person does not ride the bus to work.

You can declare variables and properties with nullable types, and you can declare an array with elements of a nullable type.
You can declare procedures with nullable types as parameters, and you can return a nullable type from a Function procedure.

You cannot construct a nullable type on a reference type such as an array, a String, or a class.
The underlying type must be a value type. For more information, see Data Type Implementation (Visual Basic).

 



How to Use a Nullable Type Variable?




The most important members of a nullable type are its HasValue and Value properties.
For a variable of a nullable type, HasValue tells you whether the variable contains a defined value.
If HasValue is True, you can read the value from Value.
Note that both HasValue and Value are ReadOnly properties.


Default Values
When you declare a variable with a nullable type, its HasValue property has a default value of False. This means that by default the variable has no defined value, instead of the default value of its underlying value type. In the following example, the variable numberOfChildreninitially has no defined value, even though the default value of the Integer type is 0.



Dim numberOfChildren? As Integer

A null value is useful to indicate an undefined or unknown value.
If numberOfChildren had been declared as Integer, there would be no value that could indicate that the information is not currently available.


Storing Values

You store a value in a variable or property of a nullable type in the typical way. The following example assigns a value to the variable numberOfChildren declared in the previous example.


numberOfChildren = 2

If a variable or property of a nullable type contains a defined value, you can cause it to revert to its initial state of not having a value assigned. You do this by setting the variable or property to Nothing, as the following example shows.


numberOfChildren = Nothing

Note

Although you can assign Nothing to a variable of a nullable type, you cannot test it for Nothing by using the equal sign.
Comparison that uses the equal sign, someVar = Nothing, always evaluates to Nothing.
You can test the variable's
HasValue property for False, or test by using the Is or IsNot operator.


Retrieving Values
To retrieve the value of a variable of a nullable type, you should first test its HasValue property to confirm that it has a value.
If you try to read the value when HasValue is False, Visual Basic throws an InvalidOperationException exception.
The following example shows the recommended way to read the variable numberOfChildren of the previous examples.


If numberOfChildren.HasValue Then
    MsgBox("There are " & CStr(numberOfChildren) & " children.")
Else
    MsgBox("It is not known how many children there are.")
End If

A database is one of the most important places to use nullable types.
Not all database objects currently support nullable types, but the designer-generated table adapters do.
See "TableAdapter Support for Nullable Types" in TableAdapter Overview.


See Also


Tasks
Troubleshooting Data Types (Visual Basic)

Reference
InvalidOperationException
If Operator (Visual Basic)
Is Operator (Visual Basic)
IsNot Operator (Visual Basic)
HasValue

Concepts
Data Types in Visual Basic
TableAdapter Overview
Local Type Inference (Visual Basic)
Other Resources
Data Type Implementation (Visual Basic)

techPhile: Using VB keywords as Variables

techPhile: Using VB keywords as Variables

Credits goto : Cody Schouten


Using VB keywords as Variables

In C#, a name of a get/set accessor was not a keyword but in VB.Net it was. No matter what libraries or how many different online code converters I tried, I could not get it to work. I finally resorted to google and found out that you can surround a keyword with brackets ([ ]) and than you can use that keyword however you need. In my case it allowed me to use custom sinks in .NET Remoting. Here's an example:

Dim [New] as String
New = "Blah"

As a very BIG note: Be careful when using it. When you can name something other than a reserved keyword, do so. It can cause many issues if you use this unwisely.