Tuesday, September 22, 2009

Changing account info with yahoo is difficult

I have seldom used yahoo email account since they no longer support POP. Recently, I have logged on to it and was forced to add new security questions due to their new design and interface. Then I found that there is an error in my birthday and would like to amend it. Unfortunately the field is not available. I sent them a question asking about how to update it.

The answer is that I have to wait for 35 days in order to edit the field since my security questions are newly added/updated. The other ridiculous thing is that this field will be public by default (see the email exception below). I can't hide it until 35 days. How difficult to make the personal account information becomes editable immediately since they have already had the interface? Why do I have to wait 35 days? Anyway, I simply hide my entire profile since I am not using it for connections.

The following is excerpted from the email answered by Yahoo:

"Once the 35 days has passed, you will be able to edit your age from the "Edit Profile" link in your Yahoo! Profile. Edit fields for your birth date will be available on that page after the 35 day period. You will also be provided a field that will allow you the ability to hide your age from other users."

September 28, 2009
The 35 days have already passed. I still don't see that there is a field for age or birthday available at the Edit Profile page. Everything is the same as before only showing Full Name, Display Name, Location, Verify and two buttons (Save and Cancel) - that's! The page with the birthday info I found is only available at Account Info page. Unfortunately it is not editable at that page. I have never seen Age field that Yahoo keeps mentioning. They should have posted the screenshot at their support page to guide people. Such a question has been asked several times if you do a search on Google, but no one is fond of their answer. I have been talking to Yahoo back and forth 4 times. I can see that it is wasting time. Wait for 35 days? Then what? The information is still unavailable. Yahoo support just wants to dismiss you ASAP regardless of your satisfaction with their answer. Luckily, I don't subscribe their pay service. It is totally not worth it! Although it is free, Users should have the right to make corrections on their personal data. It seems to me that Yahoo promotes false information and discourages users to make amendments!

Side note:
  • A few years ago, a friend of mine's email accounts were hacked. She successfully had her Hotmail back but not Yahoo. She was extremely furious with Yahoo and advised everyone to reconsider if he or she chooses Yahoo's service while there are better services in somewhere else.
  • If you lose your password, you probably will be out of luck to get your account back from yahoo. I lost once in the past but luckily I remember it a month later to have it back. Their service support is very poor regardless of how much information you provide them. Their answer is always the same, "Sorry, your data doesn't match with their file." So the case is closed.

Thursday, September 3, 2009

Your Facebook photo alumn is never private

Regardless of your permission setting on your Facebook photo albums, they are all considered public. Each album is assigned an unique access link. It can be found at the bottom of the album page (the link is only visible to you). Don't think you set the photos are only viewed by you; then the rest of the world can't see it. Facebook has explicitly said in every album that "Share this album with anyone by sending them this public link: ...." Obviously your photos are viewable to non-facebook users, which means everyone. The link will look like this:

    http://www.facebook.com/album.php?aid=12345&id=123456789&l=abcdefghij

In the above example, l=abcdefghij, I believe, is sort of the public access ID. Without it, non-Facebook users cannot go in the album or see the photo. Therefore, don't casually distribute your album link to anyone. Without it, the link is difficult for human educated guess; possibly a hack program can. If you have ever published the link to someone else, you may consider to create a new album by transferring the existing photos to the new one and then delete the old album. The new album will be assigned a new public access ID. Such a way it may keep your photos more safer. As of this writing, there is still no guarantee to keep your photo on Facebook 100% private.

Blogger fails to identify users

Some people are unable to provide comments with their own identities using their Google accounts, because blogger always mistakenly tags them with someone else. Clearing cookies and cache for the browser won't make a difference. I am one of them. Thus, I won't comment friends' blogs with my Google Account identity because it will never be me. Luckily most of them allow visitors to sign with Name/URL.

I just did a little bit experience using a public computer where I have never been before by posting a comment back to my own blog. When I posted a comment, I logged in with my Google account, hoping my name will show up correctly. No, never! Instead, I became someone else. The worst is that I don't even know who that person is. Obviously, it is not the issue of you possessing many Google accounts as blogger claims. Unfortunately, blogger has never admitted the fault and has no plan to fix it. In looking back the complaints posted to the blogger user communities/forums, this problem has existed for a few years already. To be safe, if you have already experienced this problem, it would better not use Google account when you post a comment to blogger, use OpenID if you have another identity with some other sites, or use Name/URL if the blog allows anonymous posting.

Blogger cannot correctly handle their own Google account for comment posting. Why not put Google account under OpenID category and handle it the same way as other OpenIDs? This problem discourages people using (or signing up) Google accounts and also degrades user experience.

Monday, August 31, 2009

How to make your Facebook note visible to everyone?

[Update on Oct 1, 2010]

Facebook has changed a lot since March 2010. This post previously is no longer valid. In the past, Facebook Notes privacy setting possessed its own rules and settings which were different from other applications. Nowadays everything has been migrated. Notes acts like other applications and its privacy permission setting also follows the norms.

There are 4 categories in permissions: Everyone, Friends of Friends, Friends Only and Customize. The privacy permission is a lot of simpler. For example,

Setting permission to Everyone on a note means that this note is visible to everyone on Facebook, no matter if your wall is closed or the wall is visible only to yourself. However, if your personal profile is closed or only visible to certain people, the Facebook community may not see your note via your profile page unless they have your note URL, e.g. http://www.facebook.com/note.php?note_id=[your_note_id].

Unlike the past, the default setting of Notes application has no additional control on permissions. It will be applied to a note when published only when you don't make any permission change individually.

There are two areas to control if your Facebook note is visible to everyone.

First, you have to open your application permission door to the Facebook public. This application permission acts like a gatekeeper to control who can get in the Notes door and see your notes. The default permission is Everyone. Each individual note can be associated or applied by different permissions as needed. The default is still Everyone. If you set your Notes application permission to something else other than Everyone, and then you set your individual note to Everyone, your note will not be visible to everyone on Facebook. For example, if you set the Notes application permission to Only Friends, and you set your note to Everyone, it means that only everyone of your friends will see that note. In other words, the permissions for both the application and the note itself must be set to Everyone in order to share that note with the Facebook public. The following table could provides you some illustration.

Notes Application Permission Individual Note Permission Who can see the note
Everyone Everyone Everyone on the Facebook this is the default.
Only Friends Everyone Everyone of your friends on Facebook
All combination permission sets are not shown in this table. There are only two examples as discussed.

For me, I set my Notes application permission to Everyone; then I use the individual note permission to control who can see my notes. Some notes will be shared with the entire Facebook community, some with my friends, some with certain people and some even only for myself. If you are sure that you won't share anything to the Facebook public, you can just simply to close the door by setting the application permission to something else other than Everyone. Then the unwanted guests won't be able to get into your Notes territory.

How and where to set the application permission settings

Here is one of the ways to do it.
  • Navigate to your Notes page, and then at the top of the page (blue bar), mouse over Settings. you will see something similar as below.
    locate application settings
  • Select Notes Settings if it exists; otherwise, select Application Settings.
  • If you select Application Settings, locate the application called Notes and then click on Edit Settings.
  • Notes application settings
  • Now you're at the application setting control box where you can change the permission. permissions dropdown box


Individual Note Permission

In each note, you should find something similar to the following at the bottom of the note when you compose it. Set or change the permission as needed.
individual notes permissions box



One more thing, Setting Everyone permission to both the application and the note will not make it to be visible to non-Facebook users. All users have to log in onto Facebook in order to see your note.

Thursday, August 27, 2009

Location of IsolatedStorageFile

An IsolatedStorageFile is always persisted to a dedicated location by .NET isolated storage API. Each file, when it is first created, will be granted access at least to the current logged-on user plus other requirements. In other words, an IsolatedStorageFile is created based on isolated requirements called IsolatedStorageScope, for example,

  • User + Assembly
  • User + Assembly + Domain
  • Roaming + User + Assembly
  • Roaming + User + Assembly + Domain
  • ...
  • Machine + Assembly +
  • Machine + Assembly + Domain
  • ...
Note that you cannot initialize a storage with IsolatedStorageScope.User and IsolatedStorageScope.Machine together because IsolatedStorageScope.Machine represents All Users which include the current user. But either one of them must be present in the IsolatedStorageScope with others. In addition, you cannot use IsolatedStorageScope.Application if the application is not configured or running as a ClickOnce application, which implies you can only use either IsolatedStorageFile.GetUserStoreForApplication() or IsolatedStorageFile.GetMachineStoreForApplication() for store initialization only when the application is NOT a ClickOnce application.

The exact location to represent the isolated storage "file system" varies from operating systems.

For user scope (IsolatedStorageScope.User) related, the isolated storage is located at

   XP: %USERPROFILE%\Local Settings\Application Data\IsolatedStorage\
Vista: %USERPROFILE%\App Data\Local\IsolatedStorage\ 
For machine or all users scope (IsolatedStorageScope.Machine) related, the isolated storage is located at
   XP: %ALLUSERSPROFILE%\Local Settings\Application Data\IsolatedStorage\
Vista: %ALLUSERSPROFILE%\App Data\Local\IsolatedStorage\ 
All storage entry points (folders) will be placed under the above location(s). Each of entry point or folder represents a store assigned or automatically created by .NET when an IsolatedStorageFile is first created. Then you can create folders or sub-folders relative to that store location. After that, you can even create another IsolatedStorageFiles under those sub-folders.

Monday, August 24, 2009

Disappointed Again

Yesterday I spoke with my brother about my friend's condition, who is currently fighting for the fatal disease, brain cancer. I am extremely worry about him, especially I can't pay him a visit due to geographical living locations. His radiation therapy is not doing well and he could lose his battle.

My brother immediate reaction makes me even sadder. He shows no compassion. Instead he said, I should prepare to deal with this thing to happen in my life when I get older. Who doesn't know this? No one needs him to remind of this. A person will leave the world eventually. Especially when we get older, such a sad story will echo to our ears and/or surround us more often. However, could he pretend to show some sympathy by simply saying "I am sorry to hear this"? He is disappointed me again!

I've seldom shared any feeling of mine with my family although we try to remain a good relation. Unfortunately, none of my family members understand me or even know what I will feel and think. Since a friend always encourages me to try/share my feeling with my family, it still fails and makes me even more upset. It was not the first time, the second time or the third. I can't remember how many times my families did to me. This episode is just a simpe example from my brother. I am not going to try again. They always hurt my feelings. I would rather keep all to myself or share with strangers who don't know me. Speaking to no one here, I will at least feel a lot better inside.

Health or Job?

I have felt extremely sad lately. But there is nothing I can do. A friend of mine passed out and rushed into the hospital in March. Then he had a brain surgery almost immediately next day and was diagnostics to brain cancer stage 4. The recent radiation seems not helping. According to a friend's messages, he also loses his confidence to survive. Right now, he cuts off people contact or visiting. Since we both are not living in the same country, I am unable to visit him. Instead I am thinking him a lot daily. I am afraid of losing him soon. He is one of my best friends I've ever had. His patient, listening, caring and consideration manner makes me/everyone feel comfortable to stay with him all times. He was "never" sick; he was very health conscious and always kept his health in a good shape. I can't imagine he ran into this fatal disease. Can he survive through this? No one is sure to tell. I cannot deny that the chance is less (although there are plenty of successful stories), especially when he loses his own confidence to fight this. I am not a Christian but I would like to pray for him to re-get his health over. Please, God bless and help him!

For those people who are currently losing jobs, please don't give up. You all definitely will receive a second chance (and more chances) to start your career and life again, and then stay happy. Remember, your life is much, much better than someone's, who is fighting for a fatal disease, losing health or life. No health means no life and no second chance. Please precious what you have now and make wise use of your free time to prepare yourself for your next career.

I also wish everyone healthy and no worry of sickness or disease.

Again, God, if you can hear me, please help and save my friend. Show me your mercy and the miracle. Thank you.

Wednesday, August 19, 2009

Cyberbully and MySpace

MySpace Mom:
The first felong charge case in Missouri. A 49 years old woman Lori Drew posing as a 16-year-old boy on MySpace befriended with a 13-year-old girl Megan Meier first, and then suddenly sent Meier hateful messages and even published her private messages online that led Meier who had a history of depression commite a suicide. Drew was found quilty of three misdemeanors by criminal laws, which have been recently overturned by arguing that violating a Website's terms of service (TOS) is not a federal crime. Although Drew's actions or motives disgust me, I don't agree that violating TOS constitued "unauthorized access" that induces violating federal anti-hacking laws. Harassment may be a better term. Missouri has changed its anti-harassment laws to cover cyberbully.

Craigslist's Casual Encounters:
A 40-year-old woman Elizabeth Thrasher posted a fake "Casual Encounter" ad on Craigslist for a 17-year-old girl with whom Thrasher argued over the Internet (MySpace again). Thrasher was currently out of jail on a $10,000 bond and prohibited from accessing to the Internet. She could face 4 years in state prision in addition to $5000 fine maximum if she was convicted.

Two cases are done by women. What was in those two women's minds? Are they sick or full of retaliation?

Moreover, two cases are somehow related to MySpace, one of popular social networks. Nowadays, the social network gathering has become "real" although we are not physically face-to-face. Conversations and/or arguments without geographical barriers happen every minute or any moment. These two cases are just a simple reflection of real-life scenarios. Whenever there are humans group together in a place, there may be a crime or evil thing to be conducted somehow.

Tuesday, August 18, 2009

Annoying JavaScript Error on IE7

There is nothing wrong with IE. It is the bad work done by the Web developers who did a very bad job. Even Google is not doing a good job either. See its blogger.com and most sites where installed Google Ads.

Since using IE 7, I keep getting javascript pop-up errors all the time. It is very annoying. "Disable Script Debugging" on your IE Internet settings doesn't mean you can eliminate all JavaScript errors. Some errors still continue popping up without your consent. I wish I simply put IE to retire but IE is still one of the popular browsers. I still have to use it for testing.

I am not a IE lover. I personally like to use Mozilla or now called Sea Monkey instead. Unfortunately, most sites don't support Mozilla but IE. Somehow I believe that IE popularity is related to its default distribution by the OSs. It induces users using it regardless of things users dislike.

Would this JavaScript problem be fixed soon? Unlikely, I think. IE 8 has already in the market. Later maybe IE 9, 10, ... Most sites focus on the latest technologies and have never bothered to fix things for the old browsers. Too bad for you if you're still using it! So don't count on them fixing it. Instead, users have to find their ways to deal with it.

Friday, August 14, 2009

Share or Trade?

I am reading news about "Rhapsody connects to Facebook, Twitter." You go and listen to a song you like at Rhapsody, then you post a link into your Facebook profile for sharing. Your friends see it and click on it; the link will bring them to Rhapsody site for further exploration.

Actually you're helping them to do advertisement for free and helping them to get more exposure in public - similar to the effect of "the word of mouth." The more people visit their sites, the more chances for them do business. It is just a marketing tactic. It looks like more and more business going to this direction.

Nowadays, sharing has another meaning attached to it - free advertisement - yeah, you share their content and they will make profit from your "sharing" - fair deal, huh? Or it may be called a trade!

Wednesday, July 22, 2009

Data Binding Expressions and Their Symbols

All data Binding Expressions are evaluated at runtime. There are three ways I know to include data binding expressions in ASP.NET. I don't find that Microsoft has defined any specific terms to distinguish them. For clarify and easy discussion, I would define ones here so that I can discuss and compare them.

These three (3) ways data binding expressions are:


Page-Level Data Binding
<%#  ...  %>

Example:

 <%# Request.MapPath("mytext.txt") %>
 <%# GetUserName() %>
 <%# MyAddress %>
 <%# 1 + 2 * 3 %>

The expression will be evaluated when you call DataBind() of the Page class or any other controls that support it such as the GridView, DetailsView, and FormView.  This expression can be applied to a reference to another control's property, a value of an object property, a member variable or a return value of a function. It can be placed anywhere in the ASPX file whenever it fits. For example,

  <title>
    <%# PageTitle %>
  </title>

  <img src="<%# GetImageFile() %>" alt="" />

  <asp:TextBox ID="txtFirstName" 
               runat="server" Text="<%# GetFirstName() %>" />

  <asp:HyperLink ID="lnkExample" 
                 NavigateUrl="<%# Example.Link.Value %>" 
                 Text="Example" runat="server" />

Page-level data binding is very common and easy to use. It also comes with two methods Eval and Bind. Eval provides readonly capability on data while data with Bind is updatable.

 <%# Eval("LastName") %>
 <%# Bind("FirstName") %>

For the detail how to use them, you can read more on your own.

Control-Level Data Binding
<%$  ...  %>

Example:

 <%$ ConnectionStrings:Northwind %>
 <%$ AppSettings:MyVariable %>

The expression will be evaluated when the page is rendered. There is no need to call DataBind(), unlike the page-level.

In addition, control-level data binding cannot be placed anywhere in the page by itself. Instead, it must be wrapped inside a control tag. The result of the expression is used to set that control's property. For example,

  <asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:Northwind %>"  ... /%>
where the <%$ and %> is used to extract the custom connection string from web.config.

Currently, there are only two build-in expressions available. One is to extract connection string from the web.config (see the above example) and the other is to extract application settings from web.config.

  <asp:Literal Text="<%$ AppSettings:MyVariable %>"  ... /%>

Although you can always make your own custom expressions through CodeDOM (Code Document Object Model), creating a custom expression to use is not an easy task.

Script-Level Data Binding
<%=  ...  %>

Example:

 <%= Request.MapPath("mytext.txt") %>
 <%= GetUserName() %>
 <%= MyAddress %>
 <%= 1 + 2 * 3 %>
 <%= myClass.Name %>
 <%= myClass.Execute %>

  <script language="javascript">
     location.href = <%= MyForwardPageUrl %>;
     ...
  </script>

Similar to the control-level, the expression will be evaluated when the page is rendered. Then, ASP.NET automatically inserts the value of the expression. There is no need to make any call to any DataBind() method either including Page.DataBind(). Similar to page-level, it can be placed anywhere in the markup page.

Monday, July 20, 2009

WebpartManager.ConnectWebparts Error

When executing the WebpartManager.ConnectWebparts() statement, I got the following error:

The ConnectWebParts method cannot be called after connections have already been activated (in WebPartManager.PreRender).

This problem occurred because I connected WebParts in Page_PreRender event.
     this.WebPartManager1.ConnectWebParts(provider, providerConnectionPoint,
                                          consumer, consumerConnectionPoint);

Moving it back to Page_Load event, everything works fine.

dbreader and dbwriter

If you have execution permission error when you run your ASP.NET, assigning dbreader and dbwriter roles to the ASPNET user will not help, especially your application only uses stored procedures. dbreader and dbwriter serve no purpose for this. They are related to table access. In this case, you need the following statement (if you're using SQL 2005).

GRANT EXECUTE ON SCHEMEA::dbo TO ASPNET

Why GRANT EXECUTE ON SCHEMEA?

GRANT EXECUTE ON SCHEMEA::dbo TO ASPNET

By default schema is owned by dbo (any member of the sysadmin fixed sever role), which is different from db_owner (fixed database role).

If you don't specify schema on the table when you create it, the schema will be created under dbo privileges. The schema of the default LocalSqlServer database ASPNETDB is usually under dbo. Most of time, you need to run GRANT EXECUTE ON SCHEMEA statement.

What this statement does is to grant ASPNET

  • to execute stored procedures in the dbo schema.

If you change your mind later after you have granted the EXECUTE permission, you can always use REVOKE to remove the previous granted (or denied) permission, e.g.,

REVOKE EXECUTE ON SCHEMEA::dbo TO ASPNET

You can also use DENY statement to prevent someone from having certain permissions.

Can't View CHM Files

Whenever a CHM file is not viewable, I usually can go Properties of that file, click Unblock and then view the file. But this method suddenly doesn't work for me today because there is no Unblock button available.

I found that all the CHM files under that particular directory are not viewable. They were all working fine in the past and I also remember that I unblocked all those files. I am not sure if it is related to my most recent security update last week. The interesting is that, as soon as I copied those CHM files outside that directory, they become all viewable again. It is weird. Those CHM files are not in the network but my local drive. Well, the good thing is that the problem is solved.

In normal situation, see KB902225 to resolve CHM un-viewable issue.

Sunday, July 12, 2009

Verify who is ASP.NET Logon User

Usually I use Request.LogonUserIdentity.Name to check ASP.NET Logon User. It works for all types of users.

      System.Web.HttpContext.Current.User.Identity.Name
or
      Request.ServerVariables["AUTH_USER"]

are only for Windows Authenticated user. For Internet users (anonymous guest), empty string is expected.

Request.LogonUserIdentity.Name will show you if the user is anonymous.

Monday, June 22, 2009

BeVocal vs Voxeo - Which one is good for a beginner?

Recently I have been learning ccxml and vxml. To begin with, I chose to do ccxml. But I recognized that I had to understand how vxml works before I could do something on ccxml. So in the past 2 weeks, I've begun working on vxml.

I signed up two free accounts with BeVocal and Voxeo respectively. Here are my simple comparison as an IVR beginner.

Category BeVocal Voxeo
Customer Support
and Forum
Worst! I have never got a response from them. I guess they are not entertaining any free account members. If so, they should mention this in their site. In addition, I am still unable to access their news forum discussion groups either. Extremely efficient, fast response. I have no problem to access their forum discussion boards.
Text to Speech (TTS) Sound more natural. I've seldom needed to do some customization in code in order to get a better speech. BeVocal sounds better than Voxeo, especially in reading a long sentence or a paragraph. A short sentence or a few words interpreted by voxeo TTS are okay. Otherwise, there is a tweak work, like manually using <break> or using comma to break the sentence into a few words together so as to make the speech more natural. This could be a problem if the text is instantly interpreted to a speech on the fly as soon as TTS engine receives text from a Web application. Voxeo claims that the speech will be better with their pay voice version. In addition, some words from voxeo TTS are never right to my ears. For example, slash or the punctuation / is always pronounced as flash. The word project sometimes is read as pro-jack or pro-ject.
Voice Recognition Acceptable. Frustrated. You'd better code with DTMF (telephone keybad input). I am not sure if voxeo's voice recognition engine is coded with genetic algorithm so that it could learn in the long run.
HTTP Integration As of my writing now, I still don't know where/what the actual voice URL of BeVocal is. Thus, I cannot forward the application control (using <goto>) back to the particular dialog of the vxml on BeVocal server. I need to duplicate all the scripts on my Web Server in order to continue the application. BeVocal probably has published the HTTP connection information somewhere in their site. However, for this moment, I just want to test and see how my Web application works with voice dialogs.

When you're serving your vxml via HTTP to BeVocal voice server, your vxml file must set CONTENT-TYPE header to application/voicexml+xml. Otherwise, an error is expected.
I like voxeo approach using Web URL as their voice browser URL. It is a lot simpler for a beginner like me. The concept is very simple and easy to implement. With Web URL approach, I can simply use <goto> fetch my vxml files or return to any <form> of the same vxml file. There is no file duplicate needed on my Web server. And I don't need to research how to do HTTP Integration either at my early learning stage.

Voxeo will process your vxml with CONTENT-TYPE header set to either text/html or application/voicexml+xml.
Grammar and Syntax It is hard to say which one will be easy to work with. I cannot tell which one is more straight on the W3C spec either. They are slightly different.

For example, For BeVocal, we must have this; otherwise, it will be error out.
    <vxml version="2.1" xmln="http://www.w3.org/2001/vxml">

For Voxeo, we can have:
    <vxml version="2.1">
or
    <vxml version="2.1" xmln="http://www.w3.org/2001/vxml">


For BeVocal, it accepts the following and your script runs without any problem:
  <form id="q">
    <block> 
    <subdialog name="result" src="#personalInfo">  
      <filled> 
          ... 
      </filled> 
    </subdialog> 
    </block> 
  </form> 
For Voxeo, your scripts will never be run but it won't generate an error for you that makes debugging very difficult. I have left a note to their support team and hope that they will speak to their engineers about this.

To work around this, it is better to follow the W3C specification 100%. If something goes wrong, check the spec first.
How Easy to Test
an Application?
BeVocal displays 1-800 number + pin, a direct number and SIP on every Web page saying for application testing. For unknown reason, I can only use the direct number. The 1-800 number and SIP have never worked for me. Voxeo provides 5 ways to test every application: 1-800 + pin, a direct number, Skype, FWD, SIP and even iNum number. Every method works for me like a charm.
How Many Applications
Can be Tested
at a Time?
One. BeVocal only allows you activating an application for test at a time. Many. Each application will be assigned to different numbers and pin.
Application Debugging BeVocal's Log Browser can be used as a tool to debug your vxml but you cannot view that particular log while you're executing the application. Each log can be reviewed after execution with color highlighting. All errors will be highlighted in red, letting you know exactly which line it is, similar to other programming debugging tool.

Their Vocal Debugger will allow you walking through the script and even pause your application at certain point. The pause is not a break point unlike other programming tool where you can set it beforehand. You only set it when you run the application.

If you don't like to use a phone to test your voice application, you can use their Vocal Scripter. It simulates the dialing process for connection and convert your response in text to voice back to your application. But I am not fond of it. I would like to test the voice quality as well.
Voxeo only provides a single tool called Application Debugger. You can have it open while you are testing your application. When an error occurs, it will highlight it in red. Unfortunately, the error is not exactly what we are looking for in our script. They are mostly Java stack trace error with the line numbers that we don't care. It is good for Voxeo supports or their developers for further diagnostic. I like BeVocal giving me exactly which line of my script is having a problem.

Unlike BeVocal debugger, Voxeo debugger won't allow you walking through the application directly. But it provides the execution messages as if it documents the call scenario so that you can look at the output and see if there is any abnormality.

Their error logs can be retrieved in a later time but as soon as you close your debugger, all the color highlighting is gone forever. The log is in plain text. Within a day, you can easily view it with your browser. Otherwise, you have to download it first because Voxeo will put them in a .GZ file. Because of this, I guess, Voxeo provides another tool called Prophecy Log Search. Still there is no color highlighting. At this moment, I don't find it useful but instead dislike it. To me, the tool is too heavy. The search is slow. JavaScript error is everywhere. It doesn't support both IE 7 and Sea Monkey 1.1.14, which I use intensively for my Web development.

One important thing that I learned within these two weeks is about a shadow variable. In the beginning of my learning, I was confused by this term being used in IVR. A variable is a variable. What does it mean a shadow variable? If I am correct, it is similar to a read-only property of an object. When we use one of the pre-defined tag element such as <record>, we are sure able to access its attributes. But this <record> tag consists of other properties available after the code execution like duration, size, termchar and maxtime. They are all read-only. In IVR world, such read-only properties are called shadow variables.

In closing, as a beginner, I would like to work with voxeo because their support encourages me to do more in their products, which I could not find this with other companies. Although I am frustrated by their voice recognition all the time, I found a way to work around it. Of course, I wish that voxeo could improve it in the future soon.

Sunday, June 21, 2009

Common ASP.NET problems related to IIS

The page cannot be found - return 404 for ASP.NET pages
OK button is grayed out while adding an IIS file mapping
Missing ASP.NET tab on IIS Manager
Parser Error: Could not load type

The page cannot be found - return 404 for ASP.NET pages

Make sure IIS is accepting the correct ASP.NET version. ASP.NET tab on IIS
On Windows 2003, you also need to ensure ASP.NET version is set to Allow for that ASP.NET version in Web Service Extensions. If you don't see ASP.NET extension, follow "Missing ASP.NET tab on IIS Manager" to install and enable it. After that, if you're running into the following error, your ASP.NET page probably has to run some shell command that requires additional permission.
   The compiler failed with error code 128.
   ...
   c:\windows\system32\inetsrv> "C:\WINDOWS\Microsoft.NET\Framework\v3.5\csc.exe" ...
In this case, go to Administrative Tools and select Services:
  • In the Services pane, locate World Wide Web Publishing Service.
  • Right-click World Wide Web Publishing Service, and then click Properties.
  • Click the Log On tab.
  • Click to clear the Allow service to interact with desktop checkbox.
  • Click OK.
Be sure to start the IIS and kill the browser before running the application again.

OK button is grayed out while adding an IIS file mapping

It is a small bug on IIS 5.1 with Windows XP.

To work around this:

After selecting the executable via the Browse... button, click on the textbox itself and the path will then be fully expanded. It in turn enables the OK button. [ref]



Missing ASP.NET tab on IIS Manager

Please ensure you have installed .NET framework first. For ASP.NET 2.0 or later, at the command prompt, do the following to install and enable ASP.NET on IIS:

%WinDir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -i -enable


Parser Error: Could not load type

You may experience the following error on IIS after you've published your ASP.NET application. But everything works fine in the Visual Studio. For example,

Parser Error Message: Could not load type 'SysAdmin.RunBatch'.

  • Check the Application Settings of your Web site or virtual directory, and then make sure there is Application name for it.
    • On IIS, right click the Web site or virtual directory, and then select Properties.
    • At Home Directory of Directory tab, click Create button to create the Application Name if it doesn't exist.
    • Execute Permissions must be at least set to Scripts only.
    • Click Apply and then OK to exit.
  • Check and ensure that the associated bin directory is resided with your aspx pages and Web.config. It is similar to the directory structure when you developed your application.

Friday, June 19, 2009

Add a file extension mapping on IIS for ASP.NET handler

  • Right click the Web site or the virtual directory and then select Properties.
  • Select Configuration button on Home Directory tab (for Web site) or Directory (for virtual directory).
  • On Mappings tab, click Add.
  • For ASP.NET 2.0 or later,
    Executable C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll
    Extension the file extension you want to map, e.g., .simple

    Here is an example.
    Add File Extension to IIS
  • Click OK, then Apply or OK.
  • Exit the wizard

Thursday, June 11, 2009

VMWare: Defrag or convert your 2nd virtual hard disk

In order to defrag or convert the 2nd disk, you need to reference or create the corresponding disk descriptor file that points to your 2nd disk. A disk descriptor file is simply a plain text file with the same extension as your virtual disk (vmdk). Its file size is usually about 1 or 2 KB.

  • Go VMware Server Console (VMware Server v1) or VI (VMware Server v2).
  • Select the VM.
  • Stop/shutdown the VM if it is running.
  • Select Edit Virtual machine settings.
  • Swap your 2nd disk node with the first HD node. Make sure the end result of your 2nd disk is at (0:0) node position:
    • In the Hardware tab, select Hard Disk at (0:0) node if you are using VMware Server v1; or select Hard Disk 1 for VMware Server v2.
    • Change it to other node. For Server v1, click Advance for selection. For Server v2, the selection should be at the right pane and named with Virtual Device Node.
    • Select your 2nd hard disk and change it to (0:0) node position.
  • Click OK and exit Virtual Machine Settings.
  • A new disk descriptor file in plain text is produced and named under your 2nd HD name with a VMDK extension, e.g., W2008My2HD.vmdk.
  • For Server v1, you can directly defrag the VM via the console. Or like v2, you can use virtual disk manager for defragmentation. With VMDK text file, you can do whatever you want with Virtual Disk Manager.

Don't forget to change it back to the original setting when you're done; otherwise, your VM won't boot.

Please remember that there is no need to use virtual disk manager to defrag a virtual machine (VM) if it is created in one big flat file or a set of preallocated 2GB files. Such a VM is only needed to defrag at the Windows level.

I would recommend to use flat or preallocated 2GB type for your 2nd, 3rd, ...and etc hard disk so that you don't have go through this hassle.