Meeting buddy, a really cool application for HTC Touch Diamond

UPDATES : Due to an overwhelming response from users who downloaded the trial version, I am slashing the price of Meeting Buddy from $10 to $5!!!! Thank you all for your support. And yes, I am also going to refund those who have already paid for it. So enjoy !!!!!!!!!!!!!!!!!!

I have been working on this application called “Meeting Buddy” for all of you HTC Touch Diamond and HTC Touch pro owners for the last whole week and am finally done with it.

Here is a screenshot of the Configuration /Settings screen :

mbsettings2

Here are a few cool things that the software does :

  • If you simply Enable Meeting buddy without checking any other settings, it will put your phone into vibrate mode when you put your HTC Diamond face down, and will set it back to normal ringer when you put it face-up. It uses HTC Diamond’s built in accelerometer/G-Sensor for this.
  • If you check ‘Use Outlook Integration’, meeting buddy will put your phone into vibrate mode only if it sees that you are in a meeting (It does this by checking your phone’s outlook calendar)
  • If you use ‘Outlook Integration’ another settings becomes available to you called ‘Pocket Sensor’, if you check this, Meeting Buddy will put your phone into vibrate mode, if it senses darkness (i.e your phone is probably in your pocket). It uses HTC Diamond’s light sensor for this.

PS: The light sensor in HTC diamond is not that great. For eg. it may tell you it is dark in the evenings even if you have all your lights on. This is an experimental option, I recommend you play around with it but not rely on it too much.

  • Meeting Buddy also has an option which allows you to lock/unlock the phone automatically using ambient light. So, if it is dark it will lock the phone’s keyboard. (So you don’t accidentally dial someone when your phone is in your pocket). It will unlock the keyboard as soon as you take it out of your pocket.
  • Another option that it gives you is to lock/unlock the phone when you shake your phone.
  • The last setting ‘Auto unlock on Incoming call’ is very obvious. So, if your phone’s keyboard is locked and Meeting Buddy detects an incoming call, it will unlock the keyboard or you, so you don’t have to fumble around.

You can download the software here –>Click to download. This is trialware so you get a fully functioning version for 5 days.

REQUIRES .Net compact framework 3.5. Click to download Just install it on your main desktop/laptop and it will automatically download it to your phone the next time you connect via ActiveSync

After that if you realy like it you can pay me $5 using Paypal (Paypal email = mr_nishantpant@hotmail.com) and send me an email with your proof and I will send you a regisration code for the software.

If you don’t have a Paypal account you can also purchase it here using a Credit Card : http://classic.pocketgear.com/software_detail.asp?id=27720

Get rid of Regsvr32, Regasm, Gacutil… A Shellextension for .Net and COM dlls

I had originally written a Shellextension for COM dlls, which would give you the option of registering/unregistering a dll (if it is a com dll) by right clicking on it. Here is the original post :http://nishantpant.wordpress.com/wp-admin/post.php?action=edit&post=11

After several years, I finally took out some time and created a Shellextension which works for .Net assemblies as well. These are the few features it has :

1. If you right click on a DLL and if it is a COM Plus dll it will show you the following menu.

COM Plus DllsIf you click on a COM dll but it is not installed in COM+, then you will get all above options except, the last 3 options which are relevant to COM+ only. Also, if you right clik a COM only dll, then it WILL give you an option called “Create COM+ package”.

2. IF you Right click on a dll which is a .Net assembly and is Strong Named as well, you will see the following menu :

If you right click on an Assembly which is not Strong Named, you will see all options except GACUTIL

3. If you hover your mouse over a dll which is a .Net dll, you will see some brief information about the dll like below :

4. If you right click on an Assembly, you will see a menu option called “Open with Lutz Reflector”. In case you dont know what Lutz Reflector is, it is an awesome free tool written by Lutz Roeder which disassembles any .Net assembly and shows you the source code in a very easy to view typelibrary browser. Since you could have downloaded Lutz Reflector anywhere in your PC, my shellextension will prompt you for the location just once when you first click on this option. It will then remember the location and will just open the Reflector with your assembly loaded in it.

Tested with Lutz Reflector 5.1

UPDATE (8/21/08) - Just heard from Lutz Roeder, that his software will be further developed and maintained by Red-Gate software from now on. (It will still be free though). See link for details –>Click to see article

5. If you go to the thumbnail view of any folder which has dlls, the shellextension analyzes the dlls and puts and changes their icon which helps you identify them. The Shellextension can distinguish between a regular dll, COM dll, .Net 1.0, 1.0, 2.0, 3.0 and 3.5 assembly. See below :

6. Last but not the least, you can customize the behavior of the dll and turn the ShellExtensions off or on. You can toggle, IconHandler extension, Right Click context menu extension and ToolTip extension. Here is a snapshot of the configuration screen :

This is the first time I am releasing this ShellExtension, so there may be a few bugs in it. I would really appreciate if you can report the bugs to me by leave a comment in this post. I will try to work on them as soon as I can find time.

DOWNLOAD/Setup :

Create pdf documents for free

Here is an open source printer driver. Once you install it on your machine it will create a fake printer on your computer. Printing any document to this printer, will cause your document to be converted into a .PDF file. Pretty neat!

  • Close programs like Outlook, Word, SQLEdit, Visual Studio etc. (otherwise the setup may fail)
  • Install the software (accept all defaults), it will create a new printer on your machine called “PDFCreator”.
  • To create pdf documents all you need to do is to print to this printer. It will prompt you for the PDF location and will automatically open the PDF after it is created.

An enhanced UpdateProgress control, which shows an animation at the point where mouse was clicked

WHY DO IT ???

Before you read the post, let us answer why did I waste time in changing the behavior of the UpdateProgress control. Here is the deal. Suppose, you have 5 or 6 controls on your page, which when clicked result in an Ajax call. You know that the UpdateProgress control is pretty much static, meaning, wherever you put the <asp:UpdateProgress> tags, that is the place where the progressbar will show up when your Ajax call is in progress. So, no matter which control the user clicks the progressbar is being shown in a fixed place. Why may some people consider this bad ???

  • You or anyone looking at the screen, may lose track of why you are waiting because the progressbar just shows that you are waiting not what has triggered the wait.
  • If the page is long, and the progress bar is at a fixed place, there is a possibility that you clicked a control which is a scroll length away from where the progressbar will show.
  • If the control which was clicked can give a feedback for the user to wait, it prevents the user from clicking the same button twice.

So, much for justifying why I wrote this control. But those were just a few thoughts behind it. Let us get back to the nitty gritties. Btw, here is a YouTube vide of how it looks (video is a little fuzzy but it shows what I am trying to communicate)

The Code :

I will not go into too much detail explaining the code, because I am sharing the source code with you. But here is the high level overview :

  • Create a new control, which inherits from UpdateProgress control
  • Embed two resources in your control assembly. (the default hourglass image and the javascript used to make this control work)
  • Override Render method, and inject javascript. The javascript will hook into the AJAX InitializeRequest and EndRequest events, by calling add_initializeRequest() and add_endRequest() methods of Sys.WebForms.PageRequestManager class.
  • The first Image control in the <ProgressTemplate> of the UpdateProgress control will be assumed to be the hourglass image, and if you haven’t set an ImageURL value for it, a default image will be supplied. You can create your own hourglass images from this awesome website : http://www.ajaxload.info/#preview

That is it. Do leave comments and suggestions if you find this control useful. I am also attaching the source code and the assembly. If you don’t want to see the code, just use the assembly and things should work right away.

Migrating Sourcesafe database from one server to another in 5 steps

UPDATE: The easiest way to move a VSS database to a new server is to copy the whole database in one shot. If your database is small this works like a charm. See this MS KB article for details. The only gotchas are :

  1. This involves copying the complete VSS folder over the network. This may be slooooow and the file copy may even fail suddenly for no reason.
  2. If the VSS db is real big then even winzip will stop at 65K files, so rule out that option if the no of files > 65K. Even winrar doesn’t work. I haven’t tried Lharc or ARJ yet.

    —————————————————————————————-

    Original Post

    If you have found this article, it means you haven’t had much luck trying to find how to migrate VSS from one machine to another. Also, many of you must have noticed that MS KB article http://support.microsoft.com/kb/q176875/ is bogus and the syntax for ssarc does not work. So, how do you actually move your VSS sourcesafe database ????

    STEP 1: Use SSARC.EXE to archive your existing database.
    Here is the syntax which I got working for me after umpteen trial/errors :
    ssarc “-s\\vssserver\vssfolder” d:\Archive.SSA $

    1. Notice that -s is inside the quotes
    2. $ means the whole VSS should be archived starting from root. You can specify sub branches too. eg. $/Projects or $/Project/Project1
    3. Make sure you enter ‘N’ (NO) when ssarc asks you if you want to delete the existing database after it has been archived.

    STEP 2: Run SSRESTOR.EXE to restore the database on the new server.
    ssrestor “-s\\NewServer\VSS” d:\ArchivedProjects.ssa “$/PathYouWantToRestoreTo”

    STEP 3: Copy existing users from your current VSS installation.
    Copy VSS\Users folder, VSS\Users.txt file and Um.dat file to the new installation

    STEP 4: Run Analyze -F “C:\Program Files\Microsoft Visual Studio\VSS\Data. This will re-generate the rights for all the users based on um.dat. Remember you just cannot simply copy rights.dat file to do this.

    STEP 5: You can either change the current srcsafe.ini to point to the new database, so that developers don’t get a broken link. Or you can just shutdown the server and tell people to reload their projects from the new server.

    Thats it. When you complete step 5….your VSS migration is complete !!!!

    Further Reading:—————

    Problems/Fixes for integrating VSS with Interdev:
    http://www.codeproject.com/asp/VSS_and_VID.asp?df=100&forumid=136229&select=1313406&msg=1313406

    User right setup for VSS:
    http://support.microsoft.com/kb/131022/EN-US/

    Use of http://codebetter.com/blogs/darrell.norton/archive/2004/04/15/11493.aspx vss binding remover on developer’s machines to get rid of .scc files

    LDAP Query to search a user in AD using his partial last name

    Dim User as object

    Set User = GetUserObjectFromPartialName(’doe’)

    Msgbox User.FullName & User.sAMAccountName

    —————————————————————————————————-

    Public Function GetUserObjectFromPartialName(ByVal PartialName As String) As Object
    On Error Resume Next
    Set rs = CreateObject(”adodb.recordset”)
    rs.ActiveConnection = “provider=adsdsoobject”

    rs.Open “<LDAP://dc=sl,dc=ad,dc=csx,dc=com>;(&(objectCategory=Person)” & _
    “(objectClass=OrganizationalPerson)(name=” & PartialName & “*));adspath;subtree”

    If Not rs.EOF Then
    Set GetUserObjectFromPartialName = GetObject(rs(0))
    End If
    End Function

    Recursive LDAP function to get nested groups

    Here is a simple recursive function that I wrote which will give you nested groups and members for any given Active Directory group. Try it….it works! U can bind it to a tree later on to show it on the screen. I have also included an output of how it looks when bound to an iewc Treeview.

    tree.jpg

    Dim AdsPath as string
    Dim XMLRoles as string

    AdsPath = GetAdsPathOfGroupThroughADO(”Domain Admins”)

    XMLRoles = GetRoleMembers(Adspath)

    ———————————————————————–

    Public Function GetAdsPathOfGroupThroughADO(ByVal Group As String) As String
    On Error Resume Next
    Set rs = CreateObject(”ADODB.RecordSet”)
    rs.Open “;(sAMAccountName=” & Group & “);adspath”, “provider=ADsDSOObject”

    If Not rs.EOF Then
    s = rs(0).Value
    End If

    GetAdsPathOfGroupThroughADO = s
    End Function
    ———————————————————————–

    Public Function GetRoleMembers(ByVal RoleAdsPath As String) As String
    Dim eu As Object
    Dim XML As String

    Set eu = CreateObject(”ess.user”)
    Set Group = GetObject(RoleAdsPath)
    XML = “”

    For Each member In Group.Members
    If member.Class = “Group” Then
    XML = XML & vbCrLf & GetRoleMembers(member.ADsPath)
    ElseIf member.Class = “foreignSecurityPrincipal” Then
    On Error Resume Next
    Set u = GetObject(”LDAP://=” & eu.SidStringToHexString(member.cn) & “>”)
    If Err.Number = 0 Then
    XML = XML & vbCrLf & “”
    End If
    End If
    Next

    XML = XML & vbCrLf & “”
    GetRoleMembers = XML
    End Function

    ———————————————————————–

    input.jpgTreetransform.XSLT
    eg. TreeView1.TreeNodeSrc = “XML returned by GetRoleMembers()….”
    TreeView1.TreeNodeXsltSrc = Server.MapPath(”Treetransform.xslt”)�
    ———————————————————————–

    WordPress statistics not updating with Blogstat, firestat or Statpress

    I moved my WordPress blog to my Home machine recently. The main motivation was to have full control over wordpress. As most of you would already know that WordPress is free!, which means that you can download the entire wordpress software with source code and run it from your home machine. All you need is a webserver. I use IIS but there are several free webservers out there. By the way IIS is also free depending on the operating system you have. eg. Windows XP Pro comes with IIS. Or Windows Vista Business and above also come with IIS.

    Anyway, I installed at least 15 free plugins when I moved my blog to my own machine. Yes, thats what you get for hosting your own blog. If you have a wordpress.com or wordpress.org blog, you will not even see the menu option called ‘plugins’. But, the real power of wordpress lies in plugins. Once you start seeing the plugins available out there, you will literally freak out.

    So, I installed 3 plugins just to track my stats (i.e how many people are visiting my blog, what blog posts they are reading, what country they are comning from, what Google search terms they are using to get to my blog etc etc). But, I was really frustrated the first few days, because all the stats plugins showed me was 0 vistors, 0 hits….and I knew that this couldn’t be true. So, now I am sharing the one line of code which was causing all my stats plugins to malfunction. I found out that the “theme” that I was using for my Blog had a missing line of code in the header.php file. So, I just added this line of code and wallah!!!! all the plugins started showing me stats instantly. This is what I did to start making it work…………

    <div id=”sitetitle”>
    <h1><a href=”<?php bloginfo(’url’); ?>”><?php bloginfo(’name’); ?></a></h1>
    <h2><?php bloginfo(’description’); ?></h2>
    </div>

    <div id=”menu”>
    <ul>
    <li><a href=”<?php bloginfo(’url’); ?>”>home</a></li>
    <?php wp_list_pages(’title_li=’); ?>
    </ul>
    </div>
    <?php wp_head(); ?> <– This is the line I changed.

    Leave a comment if this does or doesn’t work for you.

    Use declarative security to show a Security trimmed navigation Menu along with enforcing role based security for your website

    Hi All,

    Here is what we are trying to achieve in this article.

    • Provide side-wide security without writing a single line of code
    • Show navigation menus to the user, which automatically hide the options which the user doesn’t have access to (also called Security Trimming)
    • Use declarative syntax in web.config to tighten your security so that even if the user knows a particular URL, he cannot get to it, unless he is explicitly granted access to the URL.

    Background :-
    I have this hierarchy of folders
    /
    |—UserManagement

    |—Default.aspx

    |—ChangePass.aspx

    |—AdminPage.aspx (Only admins should have access to this page, and the menu control shouldn’t show this option)

    I am using a ASP:Menu control and I want all logged in users to be able to see all menu options except the AdminPage link, but I want the administrator to be able to see every single menu option.

    Here is a snapshot of the relevant tags from my web.config file —————————————————————-

    <!–In this case my Roles are stored in an XML file, your roles can reside in SQL Server or AD or ADAM, it doesn’t matter–>

    <add name=AzManPolicyStore connectionString=msxml://C:/Azman.xml />

    <!–Here is how we enable the role manager. In this case the built in ASP.Net website config tool will automatically read and write Roles and their membership info in the file mentioned above. i.e Azman.xml–>

    <roleManager enabled=true defaultProvider=RoleManagerProvider>

    <providers>

    <add name=RoleManagerProvider

    type=System.Web.Security.AuthorizationStoreRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, publicKeyToken=b03f5f7f11d50a3a

    connectionStringName=AzManPolicyStore

    applicationName=TestApp/>

    </providers>

    </roleManager>

     


    <!– To make security trimming and declarative security work, we need to follow the pessimistic approach. i.e first we will deny everyone access to our website–>

    <authorization>

    <deny users=*/>

    </authorization>

    <!– Then we selectively start permitting users and or Roles access to folders/files–>

    <location path=UserManagement>

    <system.web>

    <authorization>

    <allow roles=“Administrators, Managers, Users”/>

    </authorization>

    </system.web>

    </location>

    <!– Deny access to everyone except Admin on the Admin only page–>

    <location path=UserManagement/AdminPage.aspx”>

    <system.web>

    <authorization>

     

    <deny users=*/>

    <allow roles=“Administrators”/>

    </authorization>

    </system.web>

    </location>

    Here is the excerpt from my Default.aspx page, which has the menu control ———————————–
    <asp:Menu ID=Menu1 runat=server DataSourceID=SiteMapDataSource1

    Orientation=Horizontal>

    </asp:Menu>


    <!–Note that I am explicitly mentioning Sitemapprovider=”" attribute, although if I dont mention it, it should pick up the default provider. But this is what made the security trimming work for me. If you don’t do this, the Security trimming in menus will not work !! –>

     

    <asp:SiteMapDataSource ID=SiteMapDataSource1 runat=server SiteMapProvider=XmlSiteMapProvider />


     

     

    Here is my Web.Sitemap file—————————–

     

    <?xml version=1.0 encoding=utf-8 ?>

    <siteMap xmlns=http://schemas.microsoft.com/AspNet/SiteMap-File-1.0>

    <siteMapNode url=~/Default.aspx title=Home description=“”>

    <siteMapNode url=~/UserManagement/Default.aspx title=Manage security settings description=“”/>

    <siteMapNode url=~/UserManagement/ChangePass.aspx title=Change your password description=“”/>

    <siteMapNode url=~/UserManagement/AdminPage.aspx title=Admin Only Functions description=“”/>

    </siteMapNode>

    </siteMap>

     

     

     

    Thats it. Just by following these simple steps, you will have rock solid security for your website. And you don’t have to write a single line of code too.

     

    AZMan Rolemanager keeps roles cached and does not reflect changes for a long time

    If you have found this article, you already know who Mr. Azman is and what I am talking about here. So, I will not go into the details to explain you what asp.net 2.0 Rolemanager is and what all options it gives us to store role and membership information.

    Here is the excerpt from my web.config file :

    <!–In this case my Roles are stored in an XML file, your roles can reside in SQL Server or AD or ADAM, it doesn’t matter–>

    <add name=AzManPolicyStore connectionString=msxml://C:/Azman.xml />

    <!–Here
    is how we enable the role manager. In this case the built in ASP.Net
    website config tool will automatically read and write Roles and their
    membership info in the file mentioned above. i.e Azman.xml–>

    <roleManager enabled=true defaultProvider=RoleManagerProvider>

    <providers>

    <add name=RoleManagerProvider

    type=System.Web.Security.AuthorizationStoreRoleProvider,
    System.Web, Version=2.0.0.0, Culture=neutral,
    publicKeyToken=b03f5f7f11d50a3a

    connectionStringName=AzManPolicyStore

    applicationName=TestApp/>

    </providers>

    </roleManager>

     

    You must have noticed that in this example my Role data store is c:\azman.xml file. The problem that I was facing was that, whenever I would make changed to my role membership by using ASP.Net web configuration tool, it would update the .xml file perfectly fine, but ASP.net would still continue using the cached roles that it had loaded when I started my application.

    After some research I found out that, the the default behavior of Rolemanager is to cache roles in memory for 60 minutes. This might be unacceptable for some people. So, the solution for this is to add cacheRefreshInterval=”x” to your RoleManagerProvider node. The X can be as low as 1 which would mean 1 minute, but you can change to whatever suits you best.

    <add name=RoleManagerProvider

    type=System.Web.Security.AuthorizationStoreRoleProvider,
    System.Web, Version=2.0.0.0, Culture=neutral,
    publicKeyToken=b03f5f7f11d50a3a

    connectionStringName=AzManPolicyStore

    cacheRefreshInterval=”1

    applicationName=TestApp/>