Wednesday, December 9, 2009

How to know the location of Mobile Cell Tower


In Order to know the location of certain cell tower, you should identify this Cell Tower; Mobile Cell Towers are normally identified with certain IDs
  • MCC :: Mobile Country Code
  • MNC :: Mobile Network Code
  • LAC :: Location Area Code
  • CID :: cell Identifier
In this post, I will assume you already know the identifiers of the cell tower you want to know its location (latitude, longitude).

So far I can only find Three ways to be able to get the location of that Mobile Cell Tower

    1. Asking your Mobile Network Company about the exact location of that Tower, but they will probably not answer you and even if they did they will not give you the map of their whole towers network, "so that way suck if you want to be independent of the Mobile company"
    2. Using OpenCellID project which is very good project "just my opinion", but the project is still limited to some places in some countries, and it is not world wide like Google
    3. Being able to use Google GeoLocation-Api. After going around with this API, I was able to reverse the use of the API to be able to get the location of cell towers from it, and to use it to get the locations of around 250 towers in Alexandria Egypt
    You can see the list of Alexandria Cell Towers Networks here.

    To make my work more user friendly, i developed a simple Application called iTScan, which you supply it with the cell towers identifier and it will provide you with the location of the tower in different file formats

    Finally I want to say that I believe that OpenCellID gives you better accuracy of the location of the cell tower than Geo-Location api, i have no prove which approach is better but I think the way geo-Location api work to get location of cell towers will probably not be accurate as OpenCellID which depends on manually identify the places of the Mobile Cell Towers.

    This work have been done in 2009 and according to the way geo-location api works, every thing went fine "at that time".

    If you know any other method to know the location of cell towers, please share in your comments

    Friday, October 9, 2009

    Http Scoop Crack

    Http Scoop is a mac based Http sniffer, in my opinion it is the best considered to other alternatives because
    1. It don't require any configuration
    2. Small size "not like wireshark"
    3. Nice and simple GUI
    But of course it is not free, that why i tried to crack that 14 days trail thing. it appeared that it wasn't that much hard, not because i am a unique developer but they did have a weak defense.

    Anyway, you can download the free, crack version from here.

    Just download, unzip and run.

    If for some reason it didn't work with you, plz make a comment about it,so i try to fix that case

    Saturday, September 19, 2009

    XML parsing on different mobile platforms (J2ME, Android, iPhone)

    Before writing this post, I was thinking that there is a big difference between parsing xml in different mobile platforms (J2ME, Android, iPhone) but it appeared that they are much similar to each other.

    The following is the file that is to be parsed in that tutorial

    ---------------
    <xml>
    <data id="5</data>
    <name>Forrest</name>
    <age>25</age>
    <username>forrestgrant</username>
    </data>
    </xml>
    ------------------
    J2ME

    To be able to parse xml in J2ME you will need to add Kxml.zip to your project resource files because parsing xml in J2ME requires XmlParser which is not available in the default J2ME package.
    To start parsing XML in J2ME you created XmlParser object, give it a reader object from the string, file, URL or whatever you are trying to read from, Then you start using that parser to get something called ParseEvents which contains type, name, text.

    Type is used to know type of the current tag, the parser is handling whether it is
    Xml.START_DOCUMENT:
    Indication that parser has just started parsing the xml document.
    Xml.START_TAG
    Indicates the parser is current handling a starting tag.

    More tags and its usage can be found here.

    Name is used to get the tag name of the current node that is being parsed.
    Text is used to get the get the string value within the current node you parsing.

    Sample J2ME code
    Creating XMLParser For String

    byte[] xmlByteArray = xmlString.getBytes();
    ByteArrayInputStream xmlStream = new ByteArrayInputStream(xmlByteArray);
    InputStreamReader xmlReader = new InputStreamReader(xmlStream);
    XmlParser parser = new XmlParser(xmlReader);

    Iterating Over XML Tree

    boolean isParsing = true;
    while(isParsing)
    {
    pe = parser.read();
    switch (pe.getType())
    {
    case Xml.START_TAG:
    tagName = pe.getName();
    if(tagName.equals("data"))
    {
    Attribute id = pe.getAttribute("id");
    System.out.println("id value = "+id.getValue());
    }
    if(tagName.equals("name"))
    {
    pe = parser.read();
    tagValue = pe.getText();
    System.out.println("name value = "+tagValue);
    }
    else if(tagName.equals("age"))
    {
    pe = parser.read();
    tagValue = pe.getText();
    System.out.println("age value = "+tagValue);
    }
    else if(tagName.equals("username"))
    {
    pe = parser.read();
    tagValue = pe.getText();
    System.out.println("username value = "+tagValue);
    }
    break;
    case Xml.END_TAG:
    tagName = pe.getName();
    if(tagName.equals("data"))
    {
    isParsing = false;
    }
    break;
    }
    }
    Android

    The main difference parsing xml in J2ME and Android is the following
    1. The xml parsing library is already available in the Android SDK , so you don’t have to download anything.
    2. The navigation through the xml Tree, is done automatically, you only state your Parser handler class, all xml event are sent to that class whether it is start document , tag, end document or tag or whatever, so to be able to parser XML in Android, you first need to create You XML handler class which extends DefaultHandler class where you override the method you are going to write your handler within it.
    Sample Android Code
    Creating XMLParser For String

    SAXParserFactory spf = SAXParserFactory.newInstance();
    SAXParser sp = spf.newSAXParser();

    /* Get the XMLReader of the SAXParser we created. */
    XMLReader xr = sp.getXMLReader();
    /* Create a new ContentHandler and apply it to the XML-Reader*/
    MYXMLParser myExampleHandler = new MYXMLParser();
    xr.setContentHandler(myExampleHandler);
    byte[] xmlByteArray = xmlString.getBytes();
    ByteArrayInputStream xmlStream = new ByteArrayInputStream(xmlByteArray);
    InputStreamReader xmlReader = new InputStreamReader(xmlStream);
    xr.parse(new InputSource(xmlReader));

    My XML handler Example

    public class MYXMLParser extends DefaultHandler{
    private String textBetween;

    @Override
    public void startElement(String uri, String localName, String name,
    Attributes attributes) throws SAXException {
    if(localName.equals("data"))
    {
    String id = attributes.getValue("id");
    System.out.println("id value = "+id);
    }
    textBetween = "";
    }
    @Override
    public void characters(char ch[], int start, int length) {
    textBetween += new String(ch, start, length);
    }
    @Override
    public void endElement(String uri, String localName, String name)
    throws SAXException {
    if(localName.equals("name") ||localName.equals("age") || localName.equals("username"))
    System.out.println(localName+" value = "+textBetween);
    }
    @Override
    public void endDocument() throws SAXException {
    super.endDocument();
    }

    }

    iPhone (Objective C)

    Parsing XML in that SDK is identical to parsing XML in Android , the only difference here is that you optionally implement NSXMLParserDelegate, after identifying the delegate you will receive the events in the NSXMLParserDelegate methods like


    - (void)parserDidStartDocument:(NSXMLParser *)parser
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    and other methods

    Creating XMLParser For String

    NSXMLParser* mParser = [[NSXMLParser alloc] initWithData:[xmlString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]];
    [mParser setDelegate:self];
    BOOL success = [mParser parse];

    Handling XML Events

    -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    if([elementName isEqual:@"data"])
    {
    NSString* value = [attributeDict objectForKey:@"id"];
    NSLog([NSString stringWithFormat:@"id value = %@",value]);
    }
    }

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    if (!currentStringValue) {
    // currentStringValue is an NSMutableString instance variable
    currentStringValue = [[NSMutableString alloc] initWithCapacity:50];
    }
    [currentStringValue appendString:string];
    }

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    if([elementName isEqual:@"name"])
    {
    NSLog([NSString stringWithFormat:@"name value = %@",currentStringValue]);
    }else if([elementName isEqual:@"age"])
    {
    NSLog([NSString stringWithFormat:@"age value = %@",currentStringValue]);
    }else if([elementName isEqual:@"username"])
    {
    NSLog([NSString stringWithFormat:@"username value = %@",currentStringValue]);
    }
    [currentStringValue release];
    currentStringValue = nil;
    }



    More detailed Sample code is available to download from here

    Saturday, August 15, 2009

    Great Quotes

    From Troy modified a little bit
    • Original :: Honor you gods, Love you woman, defend your country "Achilles"
    • my version :: Honor you God, Love you women, defend your Religion,family
    • All that is necessary for the triumph of evil is that good men do nothing "Edmund Burke"
    • The price of greatness is responsibility "Winston S. Churchill"
    • I would rather live a short life of glory than a long one of obscurity "Alexander The Great"
    • Those who vote decide nothing. Those who count the vote decide everything "Joseph Stalin"
    • No one's a virgin, life screws us all! "AJ McLean"
    • Sex isn't the answer. Sex is the question, yes is the answer "AJ McLean"
    • Failure is an option, fear is not. "James Cameron"
    • No Retreat, No Surrender. "movie 300"
    • No Woman No Cry . "Bob marley"
    • Good artists copy, great artists steal "Picasso"

    Monday, August 10, 2009

    Evaluating JavaScript from Java

    To evaluate some JavaScript code in java, you have to do the following
    1. Create instance of type ScriptEngineManager
    2. Get JavaScript engine instance by called getEngineByName method
    3. Us e the eval method to evaluate your javascript code
    Sample Code

    =================================================

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("js");
    engine.eval("var x = 5;var y = x + 2");
    System.out.println(engine.eval("y"));

    =================================================

    Tuesday, July 14, 2009

    Sending HTTP GET request in Flash Lite 3.0


    To send HTTP GET request in Flash Lite you have two options depending on the type of data you are receiving

    Case you want to receive normal plain text
    Sample Code

    ===================================================

    var requestHandler:LoadVars = new LoadVars();

    requestHandler.load("http://www.google.com",requestHandler,"GET");

    requestHandler.onData = function(str:String) {
    trace("data reached");
    if (str == undefined) {
    trace("Error loading content.");
    return;
    } else
    {
    trace("can be read.");
    //testTxt is a container where text can be displayed
    testTxt.text = str;
    }
    }
    ===================================================

    N.B:
    If you tried to print the str in the output window, the str will not be printed, the only way to see that output is to set the content of a container with it.

    Case you want to receive XML data

    Sample Code

    ===================================================

    var xmlData:XML = new XML();
    xmlData.ignoreWhite = true;

    xmlData.load("http://rss.news.yahoo.com/rss/entertainment");

    xmlData.onLoad = function(sucesso:Boolean):Void {
    if (sucesso) {
    var firstlist:Array = xmlData.childNodes;
    var secondList:Array = firstlist[0].childNodes;
    //.......................
    //.......................
    //....................... so on
    }
    };

    ===================================================

    Friday, July 10, 2009

    Coordinate System Utility Library in Java

    LatLongLib is a java library that provides the basic operations to be done on difference coordinate system
    • Latitude / longitude points
    • Degree, Minute, Second points
    • UTM points
    To download LatLongLib library click here.
    To find more details about the package (Javadoc, Testing Samples), click here.

    The main Features provided by the package is
    1. Get Distance between two latitude/longitude points in meters using
      • getHaversineDistance
      • getVincentyDistance
      • getQuickEstimate
    2. Get slope between two latitude/longitude points using
      • getSlope
    3. Get point apart from certain point by certain distance and certain angle using
      • getPointAtDistance
    4. Convert latitude/longitude points to Degree Minute Second point using
      • calculateDMSFormat
    5. Convert Degree Minute Second point to latitude/longitude points using
      • calculateDDFormat
    6. Convert latitude/longitude points to UTM point using
      • LLtoUTM
    7. Convert UTM point to latitude/longitude points using
      • UTMtoLL

    Friday, July 3, 2009

    Tips for your graduate project documentation

    In this post I will try to document what I have learned during the documentation phase of my graduate project.

    Graduate project report comments:
    1. Written in Latex recommended, I personally suggest using MikTex and TexMaker.
    2. Introduction should goes like that
      • Overall All Idea.
      • Importance of that field "your thing".
      • Problem you are trying to solve.
      • Your contribution in solving that problem.
    3. Sections and subsections words should be capitalized.
    4. Avoid don't , isn't, use do not , is not.
    5. All axes in graphs should have the description and units.
    6. Make graphs black and white printable, show description line with different styles (solid, dotted) and not different colors.
    7. Add Related work sections for describing work done by others in the same field, don't forget adding references.

    Monday, June 22, 2009

    Getting GSM info like Cell ID, signal Strength on Symbian SDKs

    In this tutorial i will demonstarte different ways to get GSM information like
    1. Cell Tower ID
    2. Location Area Code of the current tower (LAC)
    3. Mobile Network Code (MNC)
    4. Mobile Country Code (MCC)
    5. SIM Card Operator
    6. Signal Strength
    on different Symbian SDKs

    S60_3rd_FP1
    =======================================
    void CTowerModel::RunL()
    {
    if(iStatus==KErrNone)
    {
    if(iCounter == 0)
    {
    iCounter = 1;
    iTelephony->GetSignalStrength( iStatus, iSigStrengthV1Pckg);
    }
    else
    {
    iCounter = 0;
    iTelephony->GetCurrentNetworkInfo( iStatus, iNetworkInfoV2Pckg);
    }
    iParent->updateDisplay();
    SetActive();
    }
    }
    =======================================
    The prevoius code switchs alternatvlty when iCounter=0,
    Code gets Signal Strength using
    iSignalStrengthV1.iSignalStrength

    and when iCounter = 1, Code gets the Network Info like Cell tower id,lac. mcc, mnc
    Cell Tower ID ==>iNetworkInfoV2.iCellId
    LAC ==>iNetworkInfoV2.iLocationAreaCode
    MCC ==>iNetworkInfoV2.iCountryCode
    MNC ==> iNetworkInfoV2.iNetworkId
    Operator Name ==> iNetworkInfoV2.iShortName

    you should add the following CAPABILITY to be able to get Signal Strength
    • Location
    • ReadDeviceData
    • ReadUserData
    More detailed code can be found here

    S60_2_0_CW
    =======================================
    void CTowerModel::RunL()
    {
    if(iStatus==KErrNone)
    {
    iCellID = 1;
    iSignalStrength = 1;
    iMobileNetworkCode = 1;
    iLocationAreaCode = 1;

    MBasicGsmPhoneNetwork::TCurrentNetworkInfo cni;
    User::LeaveIfError( phone.GetCurrentNetworkInfo( cni ) );
    iCellID = cni.iCellId;
    iLocationAreaCode = cni.iLocationAreaCode;
    MBasicGsmPhoneNetwork::TNetworkInfo ni = cni.iNetworkInfo;
    MBasicGsmPhoneNetwork::TBscNetworkId bni = ni.iId;
    iMobileNetworkCode = bni.iMNC;
    iMobileCountryCode = bni.iMCC;
    TBuf<30> iOperatorName = ni.iLongName;

    TInt32 st;
    phone.GetSignalStrength(st);
    iSignalStrength = st;
    iParent->updateView();
    }
    else
    {
    iCellID = 0;
    iSignalStrength = 0;
    iMobileNetworkCode = 0;
    iLocationAreaCode = 0;
    }
    iTimer.After(iStatus,1000000);
    SetActive();
    }
    =======================================

    To be able to test this code you might need to include etelbgsm.h File
    A screenShot of the emulator Testing
    More detailed code can be found here

    Wednesday, June 3, 2009

    Want to use ActiveWidgets??

    First For those who might don't know what is ActiveWidgets?

    ActiveWidgets: is ActiveWidgets is a powerful javascript
    component library which makes web application development a lot easier and more productive. ActiveWidgets provides you with a set of common visual elements (like datagrid, tabs, tree, combo) sharing professional look-and-feel and simple programming model.

    In my opinion ActiveWidgets is a great javascript library, the only thing that i don't like about is that IT IS NOT FREE :D, so you can only have a trial version and if you try to use it in any of your projects "not just examples, that is the trick :D" you will propably see something like the next figure saying thay you are using an Evaluation Version.











    So i tired to remove that thing "of course without paying", and indeed i was able to do that, so if any one is interested in the Free version, you will only have to replace the original aw.js "ActiveWidgets\runtime\lib" with a new one that is free to download from here"new aw.js"

    To know what i have done, you can just compare the old file with the new files, good luck and i hope you enjoy it.

    Monday, June 1, 2009

    Economic crisis in America "2008"

    In the last period a lot of companies in the US have filed for bankruptcy protection, in the first I didn't care for that Phenomenon because I thought it was a temporary phase that US will eventually pass by.

    But when General motors’ company files for bankruptcy protection, I knew that US is indeed going down, so I though I might write this post to keep track of all companies that files for bankruptcy protection.

    The following is the name of the companies that face or file for bankruptcy protection


    lehman brothers insurance

    Tribune Company

    Montenegro's Biggest Exporter

    American Home Mortgage

    Midway Games

    Source Interlink




    General Motors

    i did also found a lot of company names in that link

    Friday, May 8, 2009

    Loading HTML page into another

    Options of loading an html page into another?

    First option "easiest option and worst"

      is using the frameset and frame tag to load one page into another, the main disadvantage of that method is that you have multiple scroll panes one for each page which make the total layout of the page sucks, example
    Second options is also easy

    but your server has to support PHP to work correctly on it, in that case you can use the tag <?php include("another.php");?> which will loads the another page in the original page
      Third option "which I like most may be not as easy as prevoius alternatives"

      is to use Ajax calls through JavaScript load html page into an empty div, so your server need not support any special language, the page layout will looks normal. The only disadvantage of that method is that style of the imported page will not be imported as well, example

    Wednesday, April 29, 2009

    Developing for Symbian, Android and iPhone

    The main points of this comparison will be considering the developing phase point of view and not the architecture and the details of the SDK OS itself

    First of all, i want to state my admire to the Symbian OS as embedded OS without considering anything about tools used in the development like Carbide IDE , emulator and etc

    First point in comparison is the installation phase , that might seems nothing in the point of view of a lot of people but if you have to choose between a number of alternative, it always make sense to choose the easiest one as long as this choice will not cause trouble in the future.

    When considering the installation guide of Symbian developing tools, you will have to install of 3 programs in certain order with almost defined paths and until now “Y:2009” you have to put your workspace within certain places in the your installation directory or you will not be able to compile and run your projects which is not the case in any other SDK it have ever used.

    In Android SDK, thanks to Google documentation, the installation phase turns out to be couple of easy and clearly explained steps that you maximum takes from you 10 minutes without including the downloading part :D

    Despite that iPhone is developed on MAC OS which is Linux based OS "famous for being command line OS", the installation phase doesn't exceed clicking few "i agree", "continue" buttons and done, you are ready to develop

    The next point in comparison is the documentation of the SDK itself
    When considering Symbian API, the documentation sucks and i am sorry to say that but i damages more than it benefits, in that link for example you will see the methods and all variables are listed in HTML single line at the top of the page so it is very hard to know which methods do which job, so you have to scroll all over the page “for infinity” to get general idea about the use of the class, methods and what information does it provides

    On the other hand in Android and iPhone , the documentation is magnificent and very helpful and that is not because it provide more information than that provided by Symbain but because the way of presenting that information.

    The last point in my comparison is the memory handling and leaks finding process

    Android by default have a garbage collection so it is very easy for any beginner to get started with Android without having to consider the memory handling while developing.

    iPhone SDK provides a tool named Instrument that provide developers with hints about lines in the code that generate memory leaks so developer can check these lines for any error easily. it is clear that this tool helps developer focus on code model and don't waste his time searching for memory leaks holes. for more details

    Finally, coming to carbide which provides nothing that helps developers in that issue, The mobile emulator makes a sign "General error:-1" when a leakage occurs but it don't say where that error has occurred. A tool named Hooklogger is supposed to provide carbide developers by a way to indicate where the memory allocation is done and where the freeing is done so developers can identify where leakage has occurred but in my opinion Hooklogger is nothing compared to the Instrument tools provided by iPhone SDK and it isn't that much help.


    Flash Lite application Signing

    How to install an SWF file developed on adobe flash on your Nokia device phone ?

    This tutorial will assume that you have a valid SWF file developed on adobe flash.
    To be able to install your SWF file on Nokia device, you will have two phases to finish

    First phase: is converting the SWF file into an unsigned sis file. To do that Nokia provide online packaging service that converts SWF file to unsigned sis file, in that tool you submit your SWF files choose the main SWF file which is the starting point of your program

    Second phase: is to convert that unsigned sis file to signed one with capabilities that will allow it to function well, and i have written more about that process here in my blog

    Saturday, April 11, 2009

    Kaspersky get Around Tips

    • Delete the black list file on your machine

    • This way might be useful when you get tired from googling for kaspersky keys or when you just want to enable kaspersky to scan for virus and you don't have time to start searching for keys.
      The Black list is a file on your machine that contains list of black listed keys. This file typically is placed in C:\Documents and settings\Users.AllWindows\Application Data\Kaspersky Lab\AVP8\Bases\black.lst in windows XP or in C:\ProgramData\Kaspersky Lab\AVP8\Bases\black.lst in Windows Vista and windows 7.
      If you tried to delete that file in normal way "shift+delete", you will get a message saying that you can't delete that file because it is currently in use "protected" so to get around that you will have to boot different OS and delete it from there.

      One of the easiest ways to boot another OS, is to try one of Linux live CD and when OS is loaded you can delete. after you boot windows again kasper will say that black lst database is corrupted and so you can get it any old key file that you have used before "already blacklisted" and kasper will be enabled again
      N.B: you should think twice before you updated kasper because it will normally restore that black list again from server and the key will be black listed again

    Friday, March 6, 2009

    Geolocation API faults

    First of all I want to say that I am a big fan of Google Company, and this blog don’t intend to decrease its value. I am just stating the faults of Geolocation API Network Protocol


    Geolocation API faults with examples

    1. Google don't take into consideration the signal strength of the submitted towers, that appears when you send 2 requests to Google with same tower id but with different signal strength, the response of Google will be the same for the 2 requests, example
    2. Google don’t take into consideration the MCC of the submitted request, that will appear when submitting 2 towers with the same MCC while one response will given certain country location while the other response will give another country, example
    3. Google do nothing with the history is the towers submitted by the user. That appears when you send 1 tower X and get a response Y also when you send 2 towers X and Z you will get the same response Y, example
    4. When a tower is unknown is submitted as the current tower with a know tower as previous tower, Google do nothing with the second tower and return nothing, example
    Notice:
    • The submitted examples are Wireshark files so to be able to open these files you need to download that software, download link
    • You can download the total examples from here

    Wednesday, March 4, 2009

    How to sign your sis/sisx on your S60 Symbian SDK mobile

    In that tutorial i will talk about you to sign your sis files on S60 symbain SDK I did manage to deploy my application on E63 Nokia device which has Symbian OS v9.2 version S60 3rd Edition, Feature Pack 1.
    I will divide this tutorial into 2 parts
    1. Deploy simple application that require no capabilities
    2. Deploy applications that require capabilities from your phone device

    Simple application without capabilities

    If you will want to deploy a simple application that doesn’t require any capabilities from your mobile phone you can deploy the generated sisx file generated from your carbide or whatever IDE you use but you will probably see that error message “Certificate error. Contact the application supplier”, to get around that error you can easily set your phone to install any application without checking for signed application and these are the steps to do that

    Go to installations -> App.Manager -> choose options -> Settings, there you will find Software installation option change it to ALL and not signed only

    After that you will be able to install any simple application you develop on your mobile isa

    Application with capabilities

    Case you are developing more complicated applications that requires capabilities from your phone, I assume you know the capabilities your application require also you know how to choose these capabilities from your IDE

    If you try the previous way for deploying simple application you will probably get the following error “required application access not granted, to get around that you will have to get a certificate to be able to install your application on your device

    There are 2 main choices to get your application signed to be able to deploy it

    Without using publisher key/id

    And so without any cost which I will take about in that tutorial. This way is mostly used for testing products or for students trying to make application required for their study in college like my case.

    To be able to sign your application you will have to use the Nokia open signing beta tool online at the following link in which you have to set the IMEI of your mobile, choose the required capabilities of your application and finally upload your sis file and not the sisx file. After going through the whole process, Nokia will provide you with a new signed sis file which will be installed easily on your device isa

    With using publisher key/id
    This way is mostly used when you want to develop commercial products, you will have to require a publish key as far as I know and so you will have to pay for Nokia there share, I don't know much about that way but I guess this link might help you more if you like to go ahead in that direction.