Blog Home  Sign In RSS 2.0 Atom 1.0 CDF  

  def Softwaremaker() :
         return "William Tay", "<Challenging Conventions />"

  knownType_Serialize, about = Softwaremaker()

 Saturday, September 24, 2011

This might be a little bit different from what this blog is themed towards but it still has a slight tinge of software flavour to it.

Those that know me well will know that I have been dabbling in music for the past year or so. The sound engineering aspects of it, besides the musical genre, fascinates me with all regards to acoustic and digital. I recently had a chance to learn about the lip-sync issues that HDMI threw up. The write-up here is very good and explains why HDMI 1.2, 1.3 are are all poor bandaids on a problem that shouldn't have happened in the first place. RTP packets (in internet VOIP and video) have timestamps and packets that link those to a shared timebase so you can synchronize audio and video. It is therefore strange and unimaginable to me, from an engineering perspective, that the first version of HDMI was released without at least considering the possible variable delays on the two chains. OK, I have digressed.

In any case, I had the chance to encounter this problem straight-up recently when I wire-up all the video devices I had with HDMI because of the many HDMI options my new TV offered me. However, the audio capabilities of my AV receiver remained, at best, at an analog level.

In a nutshell, what happened, was that the the audio delivered through my AV receiver->speakers was processed, and therefore heard, lot faster than what the visuals was processed to the TV. In other words, I heard the crash ahead of the specific moment when the drummer actually crashed on the cymbals.

Contrary to popular belief, this is NOT a lip-sync issue that HDMI 1.3 was designed to solve. The usual culprit in audio lag is due to a TV's video processing, which is constantly trying to send a resolution that matches your TV's native resolution. Most of the workaounds today revolve around getting an AV receiver that allow a time-lag adjustment that enables you to set audio delay by source, in effect, allowing you to calibrate, or slow down, your audio processing to match the *slower* video processing. This works, provided you have enough dough to cough out to get a new AV receiver, with matching speakers probably.

I decided to apply some common sense and see if there is a way to *speed-up* my video processing so it can catch up with the audio processing instead. Now, I am aware that this would probably mean that you may not get the best visuals for your TV. However, to be honest, a lot of the infinite details is not visible to the naked eye, not mine anyways, so I am willing to live with that compromise.

If you are still with me at this point, you would understand that most TVs today come with a "Game-mode". It is designed to reduce the amount of processing involved in producing the image on the screen so that high-speed high-intensity graphical images can be served up fast on your TV. By speeding up the served image, it reduces input lag.

I set my TV to "Game-mode" and true enough, the *calibration effect* was applied and now my video processing could now match my audio processing. The graphics are still superb as visible to my naked eye, just less vivid, which is not something you would care about while watching a live concert DVD, etc.

Till I decide to plonk down money to get an AV receiver that allows me to set a time-lag/delay for my audio-processing, this *free* workaround actually works well and will suffice for now.

Saturday, September 24, 2011 3:11:27 AM (Malay Peninsula Standard Time, UTC+08:00)  #    Disclaimer 
  • Blog reactions

  •  Friday, January 23, 2009

    Yes, really. No fluff. C'mon - has there ever been on this blog.

    SQL Server 2008 really does go well with our Windows Server 2008, especially when you are replications across Wide Area Networks (WAN). Microsoft's internal IT, whom is managing global MSDN sites, did this project and concluded with this study: Geo-Replication Performance Gains with Microsoft SQL Server 2008 Running on Windows Server 2008.

    This is a highly-used reference since being published a couple of months back. Note the case study numbers shows at least 100x improvement in a few cases. I quote some key content from the source.


    The Publisher and Distributor databases for the MSDN applications are located in a data center in Tukwila, Washington. The Subscriber databases are hosted in separate facilities in Washington and California. As shown in Table 1, the team calculated baseline latency of four milliseconds between the MSCOM Ops data centers in Washington; a maximum of 23 milliseconds between facilities in Washington and California; and 150 milliseconds from Tukwila, Washington to Dublin, Ireland.

    Data Center



    Santa Clara



    Tukwila, Washington

    1 ms

    4 ms

    19 ms

    77 ms

    150 ms

    Quincy, Washington

    4 ms

    1 ms

    23 ms

    68 ms

    146 ms

    Santa Clara, California

    19 ms

    23 ms

    1 ms

    79 ms

    156 ms

    Blueridge, Virginia

    77 ms

    68 ms

    79 ms

    1 ms

    84 ms

    Dublin, Ireland

    150 ms

    146 ms

    156 ms

    84 ms

    1 ms

    SQL Server 2005 Running on Windows Server 2003
    The team’s previous attempts to replicate data between Microsoft data centers located in Redmond, Washington, and Virginia by using SQL Server 2005 running on Windows Server 2003 helped reduce latency to a certain extent. But, to account for the real-world demands of the data-centric applications targeted for geographic redundancy, the team decided to conduct further tests on this platform by using the same data center locations.

    The following describes the methodology that the MSCOM Ops team used to evaluate replication performance of SQL Server 2005 running on Windows Server 2003.

    • Tests were conducted between data centers located in Redmond and Virginia—a distance of approximately 3,000 miles.
    • Baseline testing was conducted for transactional replication of both push and pull subscriptions.
    • Push subscription model was used for initial test and pull subscription model was used for all subsequent testing.
    • Rows in database tables were 1K in length.
    • Rows were inserted in increments of 1,000, 10,000, and 100,000.
    • Each test pass was run three times, and run times were averaged.
    • The distribution database was housed on the Publisher in the replication topology for all tests.
    • Tests included “live” data from the MSDN database, including two tables that had schemas identical to those used in production. 
    • Based on a scenario in which the database system was separated into reads and writes, latency was determined during testing to be as high as four seconds.

    Windows Server 2008 and SQL Server 2008
    In late summer of 2008, the MSCOM Ops team initiated testing of the updates to the Database Engine in SQL Server 2008 alongside the improved TCP/IP stack in Windows Server 2008.

    The following describes the methodology that the MSCOM Ops team used to evaluate replication performance of SQL Server 2008 on Windows Server 2008.

    • Tests were conducted between data centers located in Redmond and Virginia—a distance of approximately 3,000 miles.
    • Baseline testing was conducted for both push and pull subscriptions with transactional replication.
    • Push subscription model was used for initial test and pull subscription model was used for all subsequent testing.
    • Rows in database tables were 1K in length.
    • Rows were inserted in increments of 1,000, 10,000, 100,000 and 1,000,000.
    • Each test pass was run three times, and run times were averaged together.
    • The distribution database was housed on the Publisher in the replication topology for all tests.
    • Live data from the MSDN database, including two tables with identical schemas used in production, were included in tests. 
    • The agent profile changes for testing on SQL Server 2008 and Windows Server 2008 were made by using 1,000,000 records, equal to 15.5 gigabytes (GB) of data transfer.

    Test Results Comparison
    Testing showed that using transactional replication with SQL Server 2008 running on Windows Server 2008 dramatically outperformed SQL Server 2005 running on Windows Server 2003. As illustrated in Table 2, the most substantial performance gains occurred when the Publisher and Subscriber were both running SQL Server 2008 on Windows Server 2008. 

    Testing also showed that the scope of the performance gains correlated with the type of replication and the type of data. Push subscription replication of character data with SQL Server 2008 running on Windows Server 2008 yielded a 104 percent increase over SQL Server 2005 running on Windows Server 2003, and pull subscription replication of the same data yielded a 1,298 percent gain. The team noted that changing the PacketSize or ReadBatchSize parameters in the Replication Distribution Agent ( profile during testing did not significantly affect performance; these changes resulted in a savings of less than 60 seconds for replicating 1,000,000 rows of varbinary (max) data equal to 15.5 GB of data moved.

    It should be noted that not all of the disk performance counters were relevant during testing, as the partitioning of the disks to support dual boot and two instances of SQL Server on each partition rendered the disk performance counters questionable. The key take-away from the disk counters is that the distribution database files are “hot spots” during replication, and that the process is input and output intensive. Disk-queue length averaged 150 for the Publisher with the test hardware.

    MSCOM Ops is continuing to drill down into various parameters and variables in subsequent testing to further develop guidance and best practices. However, based on the substantial performance gains witnessed in the initial round of testing, the team believes it is possible to build a geographically redundant, fault-tolerant database system, including a high read and write version.

    Performance Indicators

    Test Scenarios

    SQL Server 2005 on Windows Server 2003 (A)

    SQL Server 2008 on Windows Server 2008 (B)

    Performance Gains or Losses


    CPU Utilization (%)










    Push Replication


    1,000,000 1k character records

    226.12 (minutes)

    110.42 (minutes)


    Pull Replication


    1,000,000 1k character records

    174.87 (minutes)

    12.5 (minutes)


    Linked Server


    10,000 1k character records

    107.6 (minutes)

    113.6 (minutes)


    Push Replication


    100,000 varbinary (max) records

    247.07 (minutes)

    59.13 (minutes)


    Pull Replication Records


    100,000 varbinary (max) records

    223.18 (minutes)

    1.95 (minutes)


    Snapshot Replication

    11.3-GB 10,100,000 1k records

    Not tested

    22.75 (minutes)

    Comparison not available

    Friday, January 23, 2009 12:59:40 AM (Malay Peninsula Standard Time, UTC+08:00)  #    Disclaimer 
  • Blog reactions

  •  Friday, October 24, 2008

    Ahhh ... it has been a while, hasnt it ?

    My life is just torn between working with bits of 2, beats of 4 and nucleotides of 4. But while challenging, it has been really fun. As spoken to a friend today, my passions in life seeks out to expand the comfort boundaries of gray matter, which we called the mind and to constantly challenge and stimulate the brain to learn and absorb new things that one would never think of learning if one boxed themself in a virtual space, which techies like me would call "typecast".

    One example that I highlighted to my friend today, which I respectfully pointed out to them that he falls under, is when he said: "But we tech people are not good at talking to people and engaging them in meaningful conversations ..."

    Typecast alert !

    I ended up talking with him (not to him) for a good 20 minutes and told him we just had a meaningful conversation and that he could hold one really well. I told him that he himself set up this virtual boundary to box himself in. No one did and that he could easily remove this barrier and elevate himself to do and more importantly, to learn new things and behaviors. Instead of having new curiousities about old things, have new questions, passions and interests towards new things.

    Anyways, I wont be talking about my new-found passions here but I will be briefly touching on a topic that many people knew I have passions for (and I still do) - and that is the innards and the plumbings of software technologies.

    I came across types of this type of questions a lot in emails, forum questions and usergroup events:

    openquotes.png I have this WSDL file that looks something like this:

    <?xml version='1.0' encoding='UTF-8'?>

    <definitions name="someCustomer" targetNamespace="urn:someCustomer" xmlns:typens="urn:someCustomer" xmlns:xsd="" xmlns:soap="" xmlns:soapenc="" xmlns:wsdl="" xmlns="">
          <message name="add_someCustomer">
                <part name="resId" type="xsd:string"/>
                <part name="cPortable" type="xsd:string"/>
          <message name="add_someCustomerResponse">
                <part name="add_someCustomerReturn" type="xsd:string"/>
          <portType name="someCustomerPortType">
                <operation name="add_someCustomer">
                      <input message="typens:add_someCustomer"/>
                      <output message="typens:add_someCustomerResponse"/>
          <binding name="someCustomerBinding" type="typens:someCustomerPortType">
                <soap:binding style="rpc" transport=""/>
                <operation name="add_someCustomer">
                      <soap:operation soapAction="urn:someCustomerAction"/>
                            <soap:body namespace="urn:someCustomer" use="encoded" encodingStyle=""/>
                            <soap:body namespace="urn:someCustomer" use="encoded" encodingStyle=""/>
          <service name="someCustomerService">
                <port name="someCustomerPort" binding="typens:someCustomerBinding">
                      <soap:address location="http://foo/bar/someCustomer.php"/>

    However, I need to change the add_someCustomerReturn  type from xsd:string to a complex type.

    I’ve made several tests variants around trying to add a complex type, like the following:

          <message name="add_someCustomerResponse">
                <xsd:complexType name="respType" >
                            <xsd:element name="someStatus" type="xsd:boolean" />
                            <xsd:element name="someResult" type="xsd:boolean" />
                <part name="add_someCustomerReturn" type="typens:respType"/>

    However I always end up having an error like:

    Custom tool error: Unable to import WebService/Schema. Unable to import binding 'customerBinding' from namespace 'urn:customer'. Unable to import operation 'add_customer'. The datatype 'urn:customer:respType' is missing. closequotes.png

    One thing to note is the above "web service" is using: soap:binding style="rpc". While I am not advocating one over another (document/literal), I personally think that if you stripped the religious and philisophical debates, one can certainly build a RPC-style web service using doc/literal encoding.

    The above exceptions funs afoul of what many techies called: Section 5 Encoding

    For the above to be resolved, you need to define a complexType reference by wsdl:part “add_someCustomerReturn” in the schema.
    To do this, you MUST define wsdl:types and add the schema to the WSDL that defines the complex and change the type=”xsd:string” (of the wsdl:part) to the identifying complexType in the schema (encoded in wsdl:types)

    While this is an old article written by Tim, the same principles apply. Do check it out of you need to stimulate your brain: The Argument against SOAP Encoding

    Friday, October 24, 2008 12:58:46 AM (Malay Peninsula Standard Time, UTC+08:00)  #    Disclaimer 
  • Blog reactions

  •  Monday, September 18, 2006

    One of the things in my job that I have been doing and enjoy doing is engaging the customers. Over the past few years, I have learnt from my mistakes and have seen people fall into serious pitfalls that have caused deals (and sometimes, fortunes) to be lost.

    While this may be specific to technology applications and platforms, it can be applied horizontally cross-breadth. I hope I have time to make this a useful series to help the readers. Here is one:

    --- Begin Exchange ---

    When the customer CIO asked a presenter (of the bidding companies): openquotes.png What platform would you go on ?closequotes.png

    You should never answer: openquotes.png We can do both. closequotes.png

    Worst, if the CIO repeats his questions again: openquotes.png Let me ask again, what platform would you go on ? closequotes.png

    You should NEVER NEVER NEVER answer again: openquotes.png We can do both. closequotes.png

    --- End Exchange ---

    Bear this quote in mind first and I will address how it fits in this entire context:

    Gordon Gekko: openquotes.png You stop sending me information, and you start getting me some. closequotes.png 

    Why ?

    • Listen and Think. Dont just hear and read from a pre-arranged script. By answering the same to his repeated questions tells him you think he is deaf. He is NOT. You are. Brain-deaf, that is. If I was too crude, let me put it in a nicer way. You are hearing, but you are NOT listening. If the same customer CIO or his equivalent in the committee has also asked: "What is the ratio of XXX projects to YYY projects your company has done ?" It is very obvious he is asking for an answer and not a level of indirection.


    • Know how the customer thinks, works and is measured. I refuse to believe that a customer CIO has no idea how the world outside functions. He may have no idea how it functions internally, but thats not the point. When he budgets for a project worth xx millions, he knows, pretty much in his head, what he wants as the end-goal. He just cannot put it down in voice and ink so as to play the political battles well and not to offend other people. What he is seeking for is - VALIDATION. That an outside external party thinks the same. The fact that he is there and you are down here means he is smarter, not necessarily capable. Ultimately, see what is at stake. If a project fails because of the wrong use of technology, his job and his pay is on the line and that is probably 3x more than yours. He knows. He just wants someone to sing the same. Do so.

    As an example, I am arguing the customer already has 3 technologies or solutions in mind already before he approaches a public tender proposal situation. He doesnt have none. If he does, the worst thing you can do is assume that. Remember, the product and platform vendors have more resources and more time than you to camp at their site with their marketing agents and lovely legs. Many people dont realize that - Things have already been sold, just not in ink. So when you say, you can do both. Even though it is deemed to be more professional, you are giving away a few things

        1. You are no idea how they work and what is the current state. In other words, you have no intelligence.
        2. You didnt put an effort to discover what is going on in their current environment and the current battles they have. The fact that they are asking for a solution means they have a problem. Find out what that intrinsic problem is.
        3. You cannot make a bet and take that risk. He is, by granting you a project which he is paying millions for. Surely, you can ride that and show him you are taking the same risk as well ?


    • Intelligence, Intelligence, Intelligence. Surely, the account manager, whom the team is supporting must be worth the commission he is paid. Gather the topology, the current state, the internal political battles. Who is the customer CIO sucking up to ? Who is buying the customer CIO the expensive red-wine bottle sitting in his office wine-cellar ? Which favourite prodigal son of the IT department is the customer CIO favourites with and what is he/she complaining out ? Find this out. It is likely, you can piece a good internal scenario, which the customer has to deal with in his daily work, your lesser competitors have no clue about.


    • Go BIG or go home. For goodness sake, take a bet. We do that, every single day in everything we do and the choices and decisions we make. Why cant you do so in front of the customer ? When a customer CIO, not just another IT person, asked you the question above. Like I said, he is seeking validation from a 3rd party.

    While it may be necessary to sing your corporate tune, remember - you are not presenting to your own CIO. It is the customer we are talking about here. If a customer has got a big flashing "We are an XXX shop" in front of their door, you should sing an XXX tune. However, like I said in Point [2], the CIO is not measured by how much he contributes to XXX revenue. He is measured by the ROI of the millions he is spending on this project and you. So, if you say: "We go with YYY", it is likely he will stop staring blankly at his handphone and his ears will perk up and listen.

    Now, if he is anti-YYY because his mother has just slapped him because a stupid YYY patch failed to make it to her PC in time and therefore has lost all her fav bookmarks. Out of professionalism in front of the entire steering committee, he wont stop you and ask you to get out. But you would have gotten his attention when said those magic words. Getting his attention, out of the hundreds of meetings and other solution tender presentations he has to attend that day, is half the battle won.

    Now if are worth the salt your company is paying you, you would address his concerns and answer them methodically. (Excuse me, but arent you an architect/consultant ?). Most importantly, stand up and be counted for. If you have done Point [3], rationalize your decisions to him and justify why you choose YYY. To take a technology-neutral stand, something like that will always be music to a customer's ears:

    You: openquotes.png We choose to go with YYY's engines for this project because we understand that [repeat what your intelligence has gathered for you in this account. Remember to make sure that your solution justifies what your intelligence has gathered or you are screwed ... ].

    However, we also understand some of the public/users/your concerns with YYY's engines such as the skillsets of your mechanics may be that of XXX's as we noticed that there is a recent M&A of your parent company with an unit of XXX. So if you should decide that XXX is what you want, be very rest assured that our company has the same kind of XXX calibre people as YYY ones. Let me share you what projects we have done with regards to the XXX engines ... closequotes.png

    He may not buy them in the end. But I assure you, he will respect you and your company for standing up for what you believe in and for taking a bet, which he is also doing.

    • Think the bigger picture. Dont miss the forest for the trees. So, what if you lose this deal because you stuck YYY in your mouth ? Likelihood is that, you will also lose this if you had said: "We can do both". If you had said the quotes I mentioned above: "We choose to go with YYY's engines for this project because we understand that ... However we also understand some of the public/users/your concerns with YYY's ..." and still lost, it is obvious that the customer is looking for someone who worships XXX as much as he does. Too bad. Move on.

    If you had not failed your maths in school and understood the theories of Probability, you will understand that, in the long run, you will stand an equal chance of winning YYY solution tenders as much as losing the XXX ones. If you dont make a bet, you will never lose or win, in the run.

    To summarize and I quote one of my favourite fictional movie characters, Gordon Gekko, of Wall Street:

    Gordon Gekko: openquotes.png You stop sending me information, and you start getting me some. closequotes.png 

    Remember, the customer CIO is not asking you for information. He probably knows more than you since he has the benefit of all the application, product or technology vendors camping at his office and singing to him everyday. Validate him, Sing his tunes, even better - tell him something he doesnt know yet. For example, we have reasons to believe that XXX may not be suitable because ...

    He will appreciate that. Even, if you UN-validate his thoughts, Trust me (I have learnt), it is likely he will remember you for future references. By adopting a passive ground and not answering and worst, not listening to his questions and concerns, it is likely he will continue looking at his handphone, hoping someone will call and save him and you will be nothing more than a distant memory in his head.

    Monday, September 18, 2006 5:50:21 AM (Malay Peninsula Standard Time, UTC+08:00)  #    Disclaimer 
  • Blog reactions

  •  Monday, December 26, 2005

    One of the things that I thought <Input TYPE=radio> had always lacked is that it only allows it to be specified as part of only ONE group - which is dictated by the NAME attribute.

    Therefore, with this code

    <INPUT TYPE=radio NAME=names VALUE=1>William Tay
    <INPUT TYPE=radio NAME=names VALUE=2>William Gates
    <INPUT TYPE=radio NAME=names VALUE=3>William Tell 
    I can do this: William Tay William Gates William Tell

    However, if I wanted something with a 2-dimensional twist to it such as something like this:

    Please Vote your Favourite Topics via a Preference Gauge

      Order of Preferences
    Topic 1 1 2 3
    Topic 2 1 2 3
    Topic 3 1 2 3

    I will be stuck somewhere in between because while I can select my order of Preferences (in terms of 1, 2, 3) for any of those topics, I cannot prevent other uses from selecting a Preference 1 for more than 1 topic. This kinda distorts the voting statistics as someone may vote a Preference 1 for all topics which is not meant for business functionality intent.

    While, there are a few ways to do this, such as using a combination and tweaking of dropdownlists and other <input type>, I had some trouble searching for the same function to be served via a more intuitive Radio Input Type.

    So, I decided to write a small javascript snippet to be implemented via the onclick event-handler of the <Input TYPE=radio>. The parameters to be passed into the javascript function are all the same for all the radio buttons so it will be very easy to do this programmatically in your favourite language.

    The trick would be to manipuate the VALUE attribute to slot in a second Radio Group name and thereafter, have some javascript code manipuate the other radio buttons. Here is my documentation including the parameters to be passed into the javascript function:

    <INPUT TYPE=radio NAME=n1 VALUE=1_1 onclick="javascript:ClickAnotherRadioGroup(this.value,">

    The Value of the Input Type=Radio must be a delimited string
    The Value to the left of the pre-defined delimiter is the name of the Second Group Name
    This means that while NAME signifies a Radio Group, the x of VALUE=x_actualvalue signifies the Second Radio Group
    (a) - <INPUT TYPE=radio NAME=n1 VALUE=g1_1 onclick="javascript:ClickAnotherRadioGroup(this.value,">
    (b) - <INPUT TYPE=radio NAME=n1 VALUE=g2_2 onclick="javascript:ClickAnotherRadioGroup(this.value,">
    belong to the same Radio Group (n1)
    - <INPUT TYPE=radio NAME=n2 VALUE=g1_1 onclick="javascript:ClickAnotherRadioGroup(this.value,">
    (d) - <INPUT TYPE=radio NAME=n2 VALUE=g2_2 onclick="javascript:ClickAnotherRadioGroup(this.value,">
    belong to the same (but different from above) Radio Group (n2)
    However, (a) and (c) belong to the same radio group as well (g1) WHILE (b) and (d) belong to another group (g2)
    The Value to the right of the pre-defined delimiter is the ACTUAL VALUE of the Input Type=Radio
    Note that if the ACTUAL VALUE of the Input Type=Radio uses the same delimiter, we can change our own delimiter in this function

    Now try this with the Javascript implementation:

    function ClickAnotherRadioGroup(v,n)
     var f = document.forms(0);
     var n2 = v.split("_")[0]; // Retrieving the second grouped value
     for(var i=0; i<f.length; i++)
     if ((f.elements[i].type == "radio") && (f.elements[i].checked) && (f.elements[i].value.split("_")[0] == n2))
       var c1 = f.elements[i].value; var c2 =  f.elements[i].name;
       if ((v == c1) && (n == c2)) {} else
        f.elements[i].checked = false;
    Try this now:

    Please Vote your Favourite Topics via a Preference Gauge

      Order of Preferences
    Topic 1 1 2 3
    Topic 2 1 2 3
    Topic 3 1 2 3

    I hope this snippet will help someone as much as it has helped me.

    Monday, December 26, 2005 3:59:59 AM (Malay Peninsula Standard Time, UTC+08:00)  #    Disclaimer 
  • Blog reactions

  •  Friday, November 11, 2005

    What an awesome Translator !!!

    Where was this a year ago when I had to port something from C# to VB.NET ?

    The next enhancement should have something that translates business requirements to code. I would definitely buy that.

    Friday, November 11, 2005 1:32:31 AM (Malay Peninsula Standard Time, UTC+08:00)  #    Disclaimer 
  • Blog reactions

  •  Tuesday, July 12, 2005

    After so many years, I have finally activated my first PSS call to Microsoft. All these years, I have been prowling Google and MS user-and-newsgroups rendering help and sometimes receiving help as well. Never had I once need to activate a PSS call. Power to the MVPs

    However, I had this pressing problem that couldnt be solved and because of that, I had to skip a few cool demos which kinda sucks.

    The problem revolved around the installation of SP1 on top of Windows Server 2003. It just rolls back halfway during the installation process without giving me a reason why. I also noticed that it happens during the installation of this file cladmwiz.dll, which is strange because I am not running any kind of clusters.

    It was definitely a long and tedious day with a very helpful person from PSS Microsoft. There were language muckups because the APAC PSS center is based out of Greater China and it takes a good 3 minutes just to make sure we get the Case Reference ID correct. Patience is definitely his middle name.

    Finally, we came to the troublespot and found a way to workaround it. The problem were the UDDI Components that was installed on my Windows 2003 Server machine. Apparently, SP1 doesnt like it enough to install itself on top of it.

    Here is the workaround:

    1. Extract this attachment to the target machine.
    2. Extract the sp1 package with the following command line: [sp1 package file].exe -x
    3. Run the following command line on the target server: uddisp.exe install [sp1 path]
    4. Then, uninstall UDDI component through Add/Remove Program
    5. Install the service pack 1 again.

    I hope this helps someone out there as days and days of googling resulted in nothing. This will also save some poor soul from activating the PSS for help.

    Now in the first place, why isnt this documented ? It seems that I am the only one in the world who uses UDDI on Windows Server 2003 SP1.

    You know what ? Somehow, why am I not surprised ?

    Tuesday, July 12, 2005 10:36:27 AM (Malay Peninsula Standard Time, UTC+08:00)  #    Disclaimer 
  • Blog reactions

  •  Saturday, June 18, 2005

    WS-MetadataExchange is used and enabled by default in Indigo and it comes with WS-Policy as well.

    This is one specification that I find really useful because the current convention of using http-get to get the metadata from asmx?WSDL is still a very .NET sort of convention. For my projects, I usually like to put the metadata in a physical file and deploy it as *.wsdl. Other people and toolkits will also have their own naming conventions.

    While using http-get is a very useful convention of retrieving metadata, we cannot assume that all services will support HTTP. In Indigo, it’s common to expose an endpoint that only listens over IPC or SOAP-over-TCP.

    At its current Beta 1 drop, only http / https will be supported. I do forsee that tcp will be supported in the next major drop.

    In Indigo, the WS-MetadataExchange endpoints are added to the (http) service by default at the container-baseAddress/containee-endpointAddress as a mex suffix. You can also choose to define your own custom mex endpoints. Another wonderful thing it supports is that it allows the specifying of a custom metadata file (which I know I will be definitely be using). In other words, instead of getting Indigo to automatically generate the metadata, it will send the requestor to the uri location of the metadata file I specify.

    If you have done some UDDI work before, you would be accustomed to the convention of sending standardized (W3C) SOAP Request messages for querying purposes. WS-MetadataExchange uses the same sort of principles, albeit with different querying implementations.

    Here is how it works. There is no better way to illustrate this than to get really friendly with the wire-layer plumbings. I have a tool here that will give you a good view of the exchange.

    Getting an mcdba certification is not a problem if you have done cisco training as well as other security training programs like mcp but there is no replacement of microsoft training.

    You need to send a standard SOAP request to the listening mex endpoint that goes like this (Replace the square brackets with angle ones)

      [s:Envelope xmlns:s="" xmlns:a=""]
          [a:Action s:mustUnderstand="1"][/a:Action]
          [a:To s:mustUnderstand="1"]http://localhost/servicemodelsamples/service.svc/mex[/a:To]
          [GetMetadata xmlns="" /]
        [!-- OR an Empty SOAP Body will do just as fine --]
        [!-- s:Body /--]

    In the tool I had build, you need to put the a:Action value (in bold above) into the SOAPAction textbox as this has to be propagated up to the HTTP-Headers as a SOAPAction header. This is one of the sticklers of using http to query for any SOAP Web Service. Once you clicked post, you will see a good-looking response with all the metadata of WSDL and WS-Policy in the SOAP body. I took out a lot of details in the constraints of space. You should be able to get the point.

      [s:Envelope xmlns:a="" xmlns:s=""]
          [a:Action s:mustUnderstand="1"][/a:Action]
          [a:To s:mustUnderstand="1"][/a:To]
          [ActivityId xmlns=""]uuid:a55fa135-e1b9-4557-a7c3-39cbf042f85d[/ActivityId]
          [wsx:Metadata xmlns:wsx=""]
            [wsx:MetadataSection Dialect="" Identifier=""]
                [!--WSDL and XSD GUNK--]
                [!--XSD GUNK--]
                [!--WS-Policy GUNK--]

    You will be able to load endpoints, bindings and types dynamically at runtime with such information.

    Do take note that Indigo is extremely strict about the mediaTypes headers and you need to set the contentType of the Http-Headers to application/soap+xml. This can be done in the configuration file.

    Do download it and try it.

    If you think this is a cool new feature in the Microsoft technology space, it is not.

    Web Services Enhancements (WSE) 2.0 also had it. All you need is to send in a "" in the Action of a SOAP Message request to a listening WSE 2.0 service and you will be presented with the WSDL as well. This is what WseWsdl2.exe does you switch in a TCP address.

    Saturday, June 18, 2005 5:08:50 AM (Malay Peninsula Standard Time, UTC+08:00)  #    Disclaimer 
  • Blog reactions

  •  Saturday, June 04, 2005
    Courtesy of Aaron, a technically-brillant dude and a ASP.NET MVP of our Singapore Community.

    With cheap web hosting, you can save more on domain name registration and spend more on the web design as well as the seo services, particularly when you work at home.

    Saturday, June 04, 2005 7:58:14 AM (Malay Peninsula Standard Time, UTC+08:00)  #    Disclaimer 
  • Blog reactions

  •  Wednesday, January 26, 2005

    Got this inkling feeling that these ASCII Character code tables will come in handy one day...

    DEC HEX ASCII   KEY                 DEC HEX ASCII
    0 00 NUL Null CTRL-@   32 20 SPACE
    1 01 SOH Start of header CTRL-A   33 21 !
    2 02 STX Start of text CTRL-B   34 22 "
    3 03 ETX End of text CTRL-C   35 23 #
    4 04 EOT End of transmission CTRL-D   36 24 $
    5 05 ENQ Enquiry CTRL-E   37 25 %
    6 06 ACK Acknowledge CTRL-F   38 26 &
    7 07 BEL Bell CTRL-G   39 27 '
    8 08 BS Backspace CTRL-H   40 28 (
    9 09 HT Horizontal tab CTRL-I   41 29 )
    10 0A LF Line Feed CTRL-J   42 2A *
    11 0B VT Vertical tab CTRL-K   43 2B +
    12 0C FF Form feed CTRL-L   44 2C ,
    13 0D CR Carriage return CTRL-M   45 2D -
    14 0E SO Shift out CTRL-N   46 2E .
    15 0F SI Shift in CTRL-O   47 2F /
    16 10 DLE Data link escape CTRL-P   48 30 0
    17 11 XON, DC1 XON, Device control 1 CTRL-Q   49 31 1
    18 12 DC2 Device control 2 CTRL-R   50 32 2
    19 13 XOFF, DC3 XOFF, Device control 3 CTRL-S   51 33 3
    20 14 DC4 Device control 4 CTRL-T   52 34 4
    21 15 NAK Negative acknowledge CTRL-U   53 35 5
    22 16 SYN Synchronous idle CTRL-V   54 36 6
    23 17 ETB End of text buffer CTRL-W   55 37 7
    24 18 CAN Cancel CTRL-X   56 38 8
    25 19 EM End of medium CTRL-Y   57 39 9
    26 1A SUB Substitute CTRL-Z   58 3A :
    27 1B ESC Escape CTRL-[   59 3B ;
    28 1C FS File separator CTRL-\   60 3C <
    29 1D GS Group separator CTRL-]   61 3D =
    30 1E RS Record separator CTRL-^   62 3E >
    31 1F US Unit Separator CTRL-_   63 3F ?


    DEC HEX ASCII                 DEC HEX ASCII
    64 40 @   96 60 `
    65 41 A   97 61 a
    66 42 B   98 62 b
    67 43 C   99 63 c
    68 44 D   100 64 d
    69 45 E   101 65 e
    70 46 F   102 66 f
    71 47 G   103 67 g
    72 48 H   104 68 h
    73 49 I   105 69 i
    74 4A J   106 6A j
    75 4B K   107 6B k
    76 4C L   108 6C l
    77 4D M   109 6D m
    78 4E N   110 6E n
    79 4F O   111 6F o
    80 50 P   112 70 p
    81 51 Q   113 71 q
    82 52 R   114 72 r
    83 53 S   115 73 s
    84 54 T   116 74 t
    85 55 U   117 75 u
    86 56 V   118 76 v
    87 57 W   119 77 w
    88 58 X   120 78 x
    89 59 Y   121 79 y
    90 5A Z   122 7A z
    91 5B [   123 7B {
    92 5C \   124 7C |
    93 5D ]   125 7D }
    94 5E ^   126 7E ~
    95 5F _   127 7F DELETE

    6Bit-ASCII Table Conversion

    Value Char   Value Char   Value Char   Value Char
    0 A   16 Q   32 g   48 w
    1 B   17 R   33 h   49 x
    2 C   18 S   34 i   50 y
    3 D   19 T   35 j   51 z
    4 E   20 U   36 k   52 0
    5 F   21 V   37 l   53 1
    6 G   22 W   38 m   54 2
    7 H   23 X   39 n   55 3
    8 I   24 Y   40 o   56 4
    9 J   25 Z   41 p   57 5
    10 K   26 a   42 q   58 6
    11 L   27 b   43 r   59 7
    12 M   28 c   44 s   60 8
    13 N   29 d   45 t   61 9
    14 O   30 e   46 u   62 +
    15 P   31 f   47 v   63 /

    Wednesday, January 26, 2005 8:55:30 AM (Malay Peninsula Standard Time, UTC+08:00)  #    Disclaimer 
  • Blog reactions