Tuesday, June 1, 2010

Installing Red5 on windows

Installing Red5 is easy as explained below.
  1. Before installing Red5 we need to make sure java is installed on the target machine. Because Red5 needs to java.
  2. If java is not installed then download the latest version of java and install it.
  3. Make sure the JAVA_HOME environment variable is set to the java installed root directory.
  4. To set the environment variable, right click "My Computer" in start menu/desktop and go to properties. Go to "Advanced" tab and there you will see a button named "environment variables" at bottom. Clicking it will open a dialog which will let you add your own variable. Click "New" button in the top section i.e., User variables and int the popup eneter JAVA_HOME for variable name and root directory of the java for variabl value as shown below
  5. Now you are ready to install the Red5. Download the latest version of Red5 from http://code.google.com/p/red5/ and install it.
  6. During the installation you may be asked to enter your ip address and port number (for version Red5 0.9.0 Final) to run the http protocol for Red5. You can enter your ip address or the dns name. But you must remember this as this is the one you need to use always. If you enter ip address during installation and use dns name in application then it will not work. You should use the one what you entered during installation. I don't know the reason but I experienced this. But if you are not asked to enter IP address (for version Red5 0.8.0 Final) then there will be no issues with the dns name to access the server. In this case the default port number is 8080.
  7. After Red5 installation is complete then you need to start the service.
  8. You can verify whether the Red5 is running and working fine by browsing to http://ip_address:port_number in any browser. The ip_address and port_numbers should be same as the ones entered during installation. Or the dns name and default port number 8080 will work work in the second case explained in the above step. If the server is working fine then you will be able to the server's home page which will talk about some demos, etc.

Audio recorder in website

One of our clients had a requirement having an audio recorder to be integrated with his website. He wanted record and playback features. This was challenging job to me and I did lot of research in this and finaly found one third party tool which serves exactly. The tool was FLV Audio Recorder developed by AVChat Software. You can get more details in it's website http://flvar.com/.

But this needs one the below media servers. Media servers are same as conventional web servers but they only deal with storing and streaming of videos, audios and images. Media servers use a different protocal called RTMP to accept the video/audio requests same as HTTP is used to accept various kinds of requests.

  1. Red5
  2. FMIS
  3. Wowza

The 1st media server listed above, Red5 is available for free and rest are expensive. I was interested to use Red5 as it was freely available.

To integrate the audio recorder in website I did the following:

  1. I got the 30-day trial version of FLV audio recorder. We need to request for trial version by filling a small form and they will email us with the download details of trial product. This will include a license key which needs to be entered in the product.
  2. I unzipped the archive and placed in some folder. And I created a virtual directory in IIS pointing to this folder. So I have verified all the files in audio recorder are accessed by webserver.
  3. I installed the Red5 media server as explained in the post http://cherupally.blogspot.com/2010/06/installing-red5-on-windows.html.
  4. I followed the installation instructions provided in http://flvar.com/documentation.
  5. I entered my license key in audiorecorder.properties file as instructed.
  6. I changed the avc_settings.php file to point to my red5 server.
  7. That's it. I am done with the integrating stuff. When I opened the audiorecorder-api.html file in browser I have noticed the audio recorder rendered in flash and functioning well.
  8. After completing all steps you may not get the audio recorder working until you reboot the machine. I had to reboot my machine to see the recorder working.



kick it on DotNetKicks.com

Friday, February 12, 2010

Bubbling up events from user control to parent page/control

It is a good practice to use user controls when same controls are repeated in many pages. But there are some cases where the user control has some controls which generate events and those need to be handled by the containing page/user control. For eample there is a button control in the user control and you want to do something in parent page/control when the button in user control is clicked. In this case

1.You need to define an event handler in user conrol as shown below.

public partial class UC_Pagination : System.Web.UI.UserControl
{
...
...

public event EventHandler PageIndexChanged;
...
...
...
}


2. You need to call the event explicitly in the user control's implementation of the event handler of button click as shown here

public partial class UC_Pagination : System.Web.UI.UserControl
{
...
...
protected void Button1_Click(object sender, EventArgs e)
{
...
...
PageIndexChanged(sender, e);
...
...
}
...
...
...
}

3. Implement the event handler bubbled up by user control in the parent page/control in its own way as usual (shown below).


public partial class Coaches : System.Web.UI.Page
{
...
...
protected void ucPaginationPageIndexChanged(object sender, EventArgs e)
{
...
...
...
}

...
...
}

kick it on DotNetKicks.com
Shout it

How to implement paging with LINQ

Before going into how paging is implemented with LINQ, Let's discuss the need for implementing paging.

With large amounts of data, it is not a good practice to pull all records from database when you are showing a fraction of them in one page. It is always recommended to use data on demand approach. When you want to show first 20 records out of the search results then you must get the first 20 records from database and discard the rest. Similarly when you want to show next 20 records of the search results then you need to get the next 20 records from database and discard the rest. This is nothing but called paging.

LINQ has made the paging solution very simple as shown below example.

public List<Client>
GetAllClients(bool? isActive, int pageNumber, int pageSize, out int totalPages)
{
//Actual query which returns large data
var query = dataContext.Clients.Where(p => isActive == null || p.IsActive == isActive);

//Calculating total number of pages by taking ceiling number of the fractional value
totalPages = (int)Math.Ceiling((decimal)query.Count() / (decimal)pageSize);

//Paging logic goes here
return query.Skip((pageNumber - 1)*pageSize).Take(pageSize).ToList();
}


The parameters which play major role in paging are page number and page size. The page number is to identify the page of which the records to be returned. And the page size to identify the number of records to be returned. And there is another out parameter totalPages which is used to hold the total number of pages available within the data returned. This is needed to show the number of pages to the user and also useful in the logic which enables/disables page navigation.
Shout it
kick it on DotNetKicks.com

Saturday, December 19, 2009

How to get Sql server 2008 intellisense working for schema changes

The new feature "intellisense" added in sql server 2008 is making my life easier. And I am enjoying this feature a lot. But I noticed many times that when we make any changes to DB schema like creating / modifying database objects (tables, sprocs, ...) we don't notice the schema changes in intellisense in the same session. This made me too bad and many times I cursed Microsoft for this inclomplete feature. But after making some research on this, I have found the solution to get intellisense for new schema changes in current session.

Actually what happens when you connect to sql server 2008 using sql server management studio is, it queries for the current database schema and saves it somewhere. And It uses this schema information for showing the intellisense when the user is writing queries. But when we create/update the sql objects (sprocs, tables, views, ...) these won't be updated and the intellisense is pulled from old schema. That's why we don't notice the schema changes in intellisense unless we explicitly refresh the cache. In order to get new chema changes we must clear the intellisense cache.

To clear the intellisense cache we need to click Edit -> Intellisense -> RefreshLocalCache in sql server 2008 management studio as shown in below screen.


Shout it
kick it on DotNetKicks.com

Sunday, November 8, 2009

Installing IIS 7.0 on Windows Server 2008

Let me explain my experience on installing IIS 7.0 on windows server 2008. I had a tough time to find a way to install IIS 7.0 on windows server 2008. I thought that it would be same as installing IIS 6.0 on windows server 2003 by going to "control panel" -> "Add or Remove Programs" -> "Add/Remove Windows Components" and install IIS. But I couldn't find this in windows server 2008. After doing a long research I found a link which helped me.

I followed the below steps to install IIS 7.0 on windows server 2008.
  1. Go to "Start" -> "Administrative tools" -> "Service Manager".
  2. Right click the node "Roles" in the "Service Manager" window and click on "Add Roles".
  3. Follow the wizard.
  4. Select web server(IIS) in 2nd step of the wizard.
  5. You might get the following popup immediately. If you get this please click "Add Required Role Services".
  6. You follow the wizard until you get the below step.
  7. Follow the wizard until the final step.
  8. That's it. You are done with installing IIS 7.0 on windows server 2008.
  9. If you face any problems please follow the below link. It has detailed step by step guidelines to install the IIS 7.0 on windows server 2008. http://learn.iis.net/page.aspx/29/installing-iis-70-on-windows-server-2008/

kick it on DotNetKicks.com
Shout it

Thursday, November 5, 2009

C# 4.0 new features: Named and Optional arguments

Microsoft has introduced few new features in C# 4.0. I would like to discuss the below listed new features in this post.

1. Optional arguments
2. Named arguments

Optional arguments: This feature allows you to omit arguments when calling methods. This is done by defining a method with assigning default values to parameters. For better understanding, let's take a look at the below example.

We define a method called "SomeMethod" by proving default values to two of its parameters as shown.

public void SomeMethod(int a, int b = 50, int c = 100);

Now this method can be called in different ways as shown below.

SomeMethod(10, 30, 50); // This is a normal call as 3 arguments were passed

SomeMethod(10, 30); // This call is omitting parameter "c". This call is equalant to SomeMethod(10, 30, 100)

SomeMethod(10); // This call is omitting both "b" and "c". This call is equalant to SomeMethod(10, 50, 100)

As you see, we can omit any number of consecutive parameters from right to left. In the above examples we omitted parameter "c" alone and parameters "b" and "c" together. Do you see a way to omit the parameter "b" in the above example? If you call the method "SomeMethod" by passing one argument as shown below, the compiler assumes that the argument passed was for the first parameter i.e, "a". So we need a way to tell the compiler that this argument was passed to a particular parameter, in this case it is "b". This requirement was fulfilled by c# 4.0's another new feature called "Named Arguments". Let's take a closer look at this feature.

Named Arguments: This feature allows you to pass the arguments by the corresponding parameter names.

For example you can pass the arguments by name as shown below.
SomeMethod(a:10, b:30, c:50);

By this feature, we don't need to pass the arguments in the order of parameters defined in the method. We can rewrite the above method call as shown below.
SomeMethod(c:50, b:30, a:10);

And you can solve the above discussed problem (omitting the middle parameter "b") as shown below.

SomeMethod(a:10, c:50); // This call Omits the parameter "b".

Optional and Named arguments features can also be applied to constructors. This feature is mainly useful where you have methods that have many number of parameters. Because it is very difficult to call a method by passing the parameters in same order as the method was defined. There are many possibilities to make mistakes in the order. So, having named parameters and the ability to pass parameters in any order by explicitly referring the parameter names will make our life easier.

kick it on DotNetKicks.com
Shout it