A colleague was trying to write a calculation tool on IIS logs. I recommended him to try the text file driver from Microsoft Jet. He couldn't get it going. The error is:
Cannot Update. Database or object is read-only
Error code is -2147217911 or 0x80040E09
Turns out the file has an extension of ".log". Once I changed it to ".txt" everything works. Can't find an explanation though.
Monday, November 26, 2007
Wednesday, November 21, 2007
gotcha
We got caught in the production system yesterday.
Turns out the problem is that we use System.IO.Path.GetTempFileName() to, well, get a temporary file name to use in a directory. This method, if you read the documentation (which I did not), states that
Creates (emphasis mine) a uniquely named, zero-byte temporary file on disk and returns the full path of that file.
So there is a side-effect by calling this method. But that's not all. In the remarks it said:
The GetTempFileName method will raise an IOException if it is used to create more than 65535 files.
So the production system failed because this method has been called more than 65535 times.
Lessons learned:
(1) RTFM!
(2) the method should be renamed CreateTempFile.
Turns out the problem is that we use System.IO.Path.GetTempFileName() to, well, get a temporary file name to use in a directory. This method, if you read the documentation (which I did not), states that
Creates (emphasis mine) a uniquely named, zero-byte temporary file on disk and returns the full path of that file.
So there is a side-effect by calling this method. But that's not all. In the remarks it said:
The GetTempFileName method will raise an IOException if it is used to create more than 65535 files.
So the production system failed because this method has been called more than 65535 times.
Lessons learned:
(1) RTFM!
(2) the method should be renamed CreateTempFile.
Tuesday, November 13, 2007
indoor trainer
I have always resisted the idea of riding a trainer in the house. It never appeared to be interesting nor effective, until this year.
It started out having a cold winter this January when I have to stop commuting for a few weeks.
In the fall when soccer season starts it is obvious that I will have less time riding in daylight.
Then there was some discount trainer emails flying around.
So being the cheap bastard that I am, instead of buying a new one, I sourced an old noisy trainer for $20 from a friend.
I've started riding on the trainer and it feels different. The 12s or zone 2s seem to be harder on the trainer than on the road. I've tried a small amount of 14s just to see how it feels and it seems harder as well.
On the entertainment front I found some old Japanese animation series that I normally would not watch sitting down. It works and time flys by a bit better than a regular Hollywood movie.
I probably need to set up a fan as I am sweating like a pig.
The lesson learned is that it is not boring when you don't want it to be boring.
It started out having a cold winter this January when I have to stop commuting for a few weeks.
In the fall when soccer season starts it is obvious that I will have less time riding in daylight.
Then there was some discount trainer emails flying around.
So being the cheap bastard that I am, instead of buying a new one, I sourced an old noisy trainer for $20 from a friend.
I've started riding on the trainer and it feels different. The 12s or zone 2s seem to be harder on the trainer than on the road. I've tried a small amount of 14s just to see how it feels and it seems harder as well.
On the entertainment front I found some old Japanese animation series that I normally would not watch sitting down. It works and time flys by a bit better than a regular Hollywood movie.
I probably need to set up a fan as I am sweating like a pig.
The lesson learned is that it is not boring when you don't want it to be boring.
Tuesday, October 23, 2007
Another weird problem
This time it is in our development environment. We are integrating with an external report engine and one of my tasks is to look at some performance statistics to see if we need extra hardware to support the report services. The reporting engine is still a 32-bit process so I wrote a bit of code to thunk down from our 64-bit .Net code to 32-bit before calling the reporting service.
After that I hook up our test/performance harness to make the system run 100 reports. That CPU was under siege for well over 10 minutes. After same tuning and monitoring I realized the CPU was not spent in the reporting process (nor our application services for that matter), it was the 64-bit version of rundll32.exe. Out comes the Sysinternals Process viewer. It turns out rundll32 was running:
rundll32.exe ntprint.dll "printer name"
The process is trying to install a printer. I tried it manually and we don't have the printer driver locally. So I guess this process failed repeatedly but kept trying. I looked up some documentation and found the option to turn off the printing portion of the report and everything works like charm. Just another day in the office...
After that I hook up our test/performance harness to make the system run 100 reports. That CPU was under siege for well over 10 minutes. After same tuning and monitoring I realized the CPU was not spent in the reporting process (nor our application services for that matter), it was the 64-bit version of rundll32.exe. Out comes the Sysinternals Process viewer. It turns out rundll32 was running:
rundll32.exe ntprint.dll "printer name"
The process is trying to install a printer. I tried it manually and we don't have the printer driver locally. So I guess this process failed repeatedly but kept trying. I looked up some documentation and found the option to turn off the printing portion of the report and everything works like charm. Just another day in the office...
Wednesday, October 03, 2007
tracing in asp.net
I am trying to use the trace.axd viewer to view page traces. I changed the <trace enabled='true' > tag in web.config and all I get was
--------------------------------------------------------------------------------
Server Error in '/xyz' Application.
--------------------------------------------------------------------------------
Trace Error
Description: Trace.axd is not enabled in the configuration file for this application. Note: Trace is never enabled when
Details: To enable trace.axd, please create a tag within the configuration file located in the root directory of the current web application. This tag should then have its "enabled" attribute set to "true".
--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.832; ASP.NET Version:2.0.50727.832
--------------------------------------------------------------------------------
Turns out I have to restart the worker process in order to get it to work. Turning it off has no such problems though.
--------------------------------------------------------------------------------
Server Error in '/xyz' Application.
--------------------------------------------------------------------------------
Trace Error
Description: Trace.axd is not enabled in the configuration file for this application. Note: Trace is never enabled when
Details: To enable trace.axd, please create a
--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.832; ASP.NET Version:2.0.50727.832
--------------------------------------------------------------------------------
Turns out I have to restart the worker process in order to get it to work. Turning it off has no such problems though.
Interesting piece of news
I just came across this piece of news from the office pantry. What is interesting to me is that the deal is made on the cycling roads rather than on the golf course. Cycling being the new golf in the corporate world someday?
Thursday, September 27, 2007
I blew it!
I put my lunch on a plate, throw it in the microwave and about a minute later, there was a loud crack. The plate was split into two down the middle. First time in my life I have broken a plate like that... how bizarre.
Tuesday, September 18, 2007
Network problem
Ever since late July I have been involved to diagnose a performance problem. After a few weeks of back and forth, dicing through the numbers and adding instrumentation to our code, it boils down to network delays in our .Net remoting calls. At that point I should have throw my hands up and pass the problem to the Network engineers. Unfortunately that person was on vacation and I need to carry on. After a bunch of trials and errors and flipping around options on the network driver level, the problem seems to be related to SNP/TOE. So next time you see a network slowdown, check if SNP/TOE is turned on.
Thursday, September 06, 2007
it might be obvious for others
This is definitely not obvious for me.
I did some performance tuning for our web app and cached some pages a while back. I did this:
<%@ OutputCache Location="Any" Duration="3600" VaryByParam="none"%>
I was going through the IIS logs as see that the page in question is still being requested a lot. Changing it to
<%@ OutputCache Location="Any" Duration="3600" VaryByParam="None"%>
does the trick. It seems implicit and I have definitely seen other people using the lower case version. But the attribute is CASE-SENSITIVE!!!
I did some performance tuning for our web app and cached some pages a while back. I did this:
<%@ OutputCache Location="Any" Duration="3600" VaryByParam="none"%>
I was going through the IIS logs as see that the page in question is still being requested a lot. Changing it to
<%@ OutputCache Location="Any" Duration="3600" VaryByParam="None"%>
does the trick. It seems implicit and I have definitely seen other people using the lower case version. But the attribute is CASE-SENSITIVE!!!
Monday, August 27, 2007
Things I did on Sunday
Or things I did not do on Sunday.
The first event of the day was the Team Time Trial. Before I go on vacation I was pretty gung-ho on doing this as it sounds like fun. I was asking around to gather interest and form a team. Unfortunately there was not a lot of interest and after my vacation, I lost a lot of fitness and gave the idea up. I then signed up to help out in the race. A few days before the race a couple of cat 4s were looking for a 4th member. I replied, wanting to ride on condition the race director agrees. Then the race director came back saying he needs me to marshal the race, thus making it impossible to race. I have no qualms about the decision and helped the team find a 4th member. This team won the race. I was happy for them and was happy that I didn't drag the team down as I was not in good form.
After the race, a coach hosted a cycling garage sale at his house not far from the race venue. I was carpooling, the driver wanted to drop by so I went to take a look as well. It was like going to a candy store. Wheels, helmets, sun glasses, jerseys, jackets, bags, you name it. Everything useful for a cyclist is available. I picked up some old team jerseys for cheap and bought two nice shimano wheels off him. I had no intention of buying anything but ended up being one of his biggest customers that day.
I was excited and Sunday night started to assemble up the Pinarello. With the extra wheels the work is easier as I can take my time to tune up the bike while riding on the current bike. No single point of failure makes things easier to transition.
The most important lesson for the day: that front and back skewers have different lengths. Pull a rear skewer to fit a rear wheel - it is longer.
All in all a good day.
The first event of the day was the Team Time Trial. Before I go on vacation I was pretty gung-ho on doing this as it sounds like fun. I was asking around to gather interest and form a team. Unfortunately there was not a lot of interest and after my vacation, I lost a lot of fitness and gave the idea up. I then signed up to help out in the race. A few days before the race a couple of cat 4s were looking for a 4th member. I replied, wanting to ride on condition the race director agrees. Then the race director came back saying he needs me to marshal the race, thus making it impossible to race. I have no qualms about the decision and helped the team find a 4th member. This team won the race. I was happy for them and was happy that I didn't drag the team down as I was not in good form.
After the race, a coach hosted a cycling garage sale at his house not far from the race venue. I was carpooling, the driver wanted to drop by so I went to take a look as well. It was like going to a candy store. Wheels, helmets, sun glasses, jerseys, jackets, bags, you name it. Everything useful for a cyclist is available. I picked up some old team jerseys for cheap and bought two nice shimano wheels off him. I had no intention of buying anything but ended up being one of his biggest customers that day.
I was excited and Sunday night started to assemble up the Pinarello. With the extra wheels the work is easier as I can take my time to tune up the bike while riding on the current bike. No single point of failure makes things easier to transition.
The most important lesson for the day: that front and back skewers have different lengths. Pull a rear skewer to fit a rear wheel - it is longer.
All in all a good day.
Thursday, August 23, 2007
a little bit of history
As the Canucks are getting ready to launch their new logo and jersey, let me share a little story about their previous jersey launch.
I joined a small software company in 1997, replacing a guy who went to a big game development studio. It was all in good terms and this developer was in touch with the few of us. A few days before the jersey launch one of my colleagues received a email from this guy with the Canucks whale logo in an attachment. This ex-colleague was not on the hockey team but somehow got hold of the logo. We were admiring the logo and another colleague came by, saw the picture, called his girlfriend and forwarded the email over to her. This person worked for CKVU and it was a matter of minutes when Don grabbed hold of the picture and ran a story at their six o'clock news.
So this little company played a pivotal role in leaking on the logo last time.
I joined a small software company in 1997, replacing a guy who went to a big game development studio. It was all in good terms and this developer was in touch with the few of us. A few days before the jersey launch one of my colleagues received a email from this guy with the Canucks whale logo in an attachment. This ex-colleague was not on the hockey team but somehow got hold of the logo. We were admiring the logo and another colleague came by, saw the picture, called his girlfriend and forwarded the email over to her. This person worked for CKVU and it was a matter of minutes when Don grabbed hold of the picture and ran a story at their six o'clock news.
So this little company played a pivotal role in leaking on the logo last time.
Thursday, August 16, 2007
A race
I was finishing my morning ride and spinning to the office when I met Gord on Macdonald and Cornwall. Gord is a strong rider and the president of the cycling club. We exchanged pleasantries and he took off. I continue spinning away but there was always an urge to go after Gord's wheel. I lost sight of him after the uphill section and was surprised to see him in front, slowed by the lights. I almost caught him at Burrard but the light turn green before I could reach him. Gord took off again. This time it is a struggle because of 2 weeks' vacation I lost a lot of fitness. The climb up the Burrard bridge is a challenge when you want to push but your HRM disagrees with you. At the end I decide to go with my HR zone and let him go.
Little did I know that he was caught up in traffic lights again and I caught him around Smithe. This time I have the legs to ride away from him and did not see him again. He looked at me from his Subaru in disgust as I smiled and waved bye bye.
Little did I know that he was caught up in traffic lights again and I caught him around Smithe. This time I have the legs to ride away from him and did not see him again. He looked at me from his Subaru in disgust as I smiled and waved bye bye.
Sunday, August 05, 2007
caught
I know it is inevitable, but the moment of truth is still surprising. My son has been growing up and he has reached the first milestone: we now officially have the same shoe size. I now can test fit shoes for my son!
Tuesday, July 24, 2007
there are racers and there are racers
Last Saturday on the club ride we had time to chat because of a good number of flats along the way. One topic of discussion was wheel weight and how one guy bought a used wheel with a Powertap. The rear wheel weighs 1700 grams alone and he rebuilt the Powertap with a lighter rim and it saved him 200 grams.
Then yesterday during the weekly criterium race I can't help but notice one guy on a bike that squeals. After the race I was asking him whether he notices the noise from his bike. He said he ignores the noise. Another guy rolled by and pointed out that he spokes are loose and rubbing.
It just surprises me how extreme people are: either they care about every gram they carry or they are totally insensitive about savings to make their bike go faster. Go figure.
Then yesterday during the weekly criterium race I can't help but notice one guy on a bike that squeals. After the race I was asking him whether he notices the noise from his bike. He said he ignores the noise. Another guy rolled by and pointed out that he spokes are loose and rubbing.
It just surprises me how extreme people are: either they care about every gram they carry or they are totally insensitive about savings to make their bike go faster. Go figure.
Thursday, July 05, 2007
How odd
We were playing a card game at home - a variation of slap jack where we call the cards from Ace to King and slap when the card matches the call. I have played this game lots of times and for the first time in my life, the whole deck was dealt and non of the cards matched! So what is the probability of a set of cards that does not match their ordinal position at all? I have to think about calculating that...
Tuesday, June 12, 2007
surprise at home
As I was riding home last night, I heard some unfamiliar sound as I was rolling into the driveway: it was the sound of drums and cymbals. From the direction of the sound, my neighbours over on that side have no young kids, and the drum sound was from a beginner.
So as I opened the door, the drum side was coming from within! My 12 year old son and his two buddies was having a jam session! Their school has a talent show in about 2 weeks and they were getting together to practice. Being first timers the singer brought the lyrics, about 2 bars of music for one hand and the drummer brought his (rental) drum set. My son was struggling to play the few notes the singer brought along. So my music and superhero instincts kick in, sort them out. Reverse engineer the song for the basic chords, give my son a basic pattern to play, settle them in a practice tempo, and about 2 hours later they got the basic pattern going. They will be going into an audition today so let's see what happens.
Several interesting observations:
- figuring out what chords to use is way easier than it was when I was in highschool. An mp3 and the slider in the computer makes life soooo easy.
- the band is a bunch of piano players venturing out to different instruments. Just like when I was in my band.
- 12 year old kids these days know what they want to do. I would say they are way smarter than when I was 12.
I had fun and saw them had fun too.
So as I opened the door, the drum side was coming from within! My 12 year old son and his two buddies was having a jam session! Their school has a talent show in about 2 weeks and they were getting together to practice. Being first timers the singer brought the lyrics, about 2 bars of music for one hand and the drummer brought his (rental) drum set. My son was struggling to play the few notes the singer brought along. So my music and superhero instincts kick in, sort them out. Reverse engineer the song for the basic chords, give my son a basic pattern to play, settle them in a practice tempo, and about 2 hours later they got the basic pattern going. They will be going into an audition today so let's see what happens.
Several interesting observations:
- figuring out what chords to use is way easier than it was when I was in highschool. An mp3 and the slider in the computer makes life soooo easy.
- the band is a bunch of piano players venturing out to different instruments. Just like when I was in my band.
- 12 year old kids these days know what they want to do. I would say they are way smarter than when I was 12.
I had fun and saw them had fun too.
Monday, June 04, 2007
Road Race
I have taken a full Cycling BC race license this year. So I thought it might be a good idea to do some races that require a full license. This being the closest to home and the timing is favourable so I signed up and went for it yesterday.
Here are the positives:
I had fun.
I finished the race.
I contributed - I was telling people how to ride paceline to go faster.
I need to work on these...
Climb faster.
Turns
Positioning myself in the pack.
I was extremely tired after the race but felt much better towards the end of the day. I was going through flickr trying to find photos of myself but couldn't find anything...
Anyways more training. Onwards and Upwards.
Here are the positives:
I had fun.
I finished the race.
I contributed - I was telling people how to ride paceline to go faster.
I need to work on these...
Climb faster.
Turns
Positioning myself in the pack.
I was extremely tired after the race but felt much better towards the end of the day. I was going through flickr trying to find photos of myself but couldn't find anything...
Anyways more training. Onwards and Upwards.
Thursday, May 17, 2007
Race 2
I did the 2nd criterium on Tuesday. This time I am more relaxed and focussed on keeping myself in the front 3rd of the pack. The race has more people this time (probably 25 to 30) and it was a bit crowded when we start. As expected the crowd thins out as some 1st timers cannot keep up with the pace and the climbs. The pace was a little quicker than the previous races I've seen as there are more people and more people trying to lead the pack.
There was some confusion in the middle of the race. The women's races were running at the same time and their cat1-3 pack caught us. People were yelling to move away so that the women can pass. There was a bit of confusion and there were people trying to sit in the women's pack as well as trying to break away using the women's pack as a decoy. A couple of us decide to chase the breakaway down creating more
confusion in the race. After a lap or two the race official called a "neutral lap" to let the women's group ride away. That suits me fine because I was pretty close to blowing up trying to chase the breakaway. Somewhere in the middle of the confusion was the prime lap and I don't even know exactly which lap it was.
At the last lap I was in the front group of 10 or so riders. I saw there were 2-3 riders from the same team so I rode next to one of them and said I was going to try to lead him off. Then I dive down the hill going all out thinking he would follow me. But I think I was going too fast and he knows that I wouldn't succeed. I
went all out for about 30 seconds or so and saw the pack or right behind me, probably less than 20 feet away. There was a right hand turn and I wasn't prepared to make the turn at that speed. So I braked, let the people pass, as finished the race last. When I went home my kids asked me how I did. I said I had fun and my wife said "you didn't do well, did you?" I smiled and walked away.
There was some confusion in the middle of the race. The women's races were running at the same time and their cat1-3 pack caught us. People were yelling to move away so that the women can pass. There was a bit of confusion and there were people trying to sit in the women's pack as well as trying to break away using the women's pack as a decoy. A couple of us decide to chase the breakaway down creating more
confusion in the race. After a lap or two the race official called a "neutral lap" to let the women's group ride away. That suits me fine because I was pretty close to blowing up trying to chase the breakaway. Somewhere in the middle of the confusion was the prime lap and I don't even know exactly which lap it was.
At the last lap I was in the front group of 10 or so riders. I saw there were 2-3 riders from the same team so I rode next to one of them and said I was going to try to lead him off. Then I dive down the hill going all out thinking he would follow me. But I think I was going too fast and he knows that I wouldn't succeed. I
went all out for about 30 seconds or so and saw the pack or right behind me, probably less than 20 feet away. There was a right hand turn and I wasn't prepared to make the turn at that speed. So I braked, let the people pass, as finished the race last. When I went home my kids asked me how I did. I said I had fun and my wife said "you didn't do well, did you?" I smiled and walked away.
Tuesday, May 15, 2007
weird side effect
Thursday, May 03, 2007
SQLException
Our test server got this Exception a zillion times when we did our performance test:
System.Data.SqlClient.SqlException: An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: TCP Provider, error: 0 - Only one usage of each socket address (protocol/network address/port) is normally permitted.)
Unfortunately Google as of today reveals very little information about this. To make a long story short this is created by one of the guys mistakenly adding the connection string with "Pooling=false;". This caused a humongous amount of connections, probably flooding the network and popping up the exception.
System.Data.SqlClient.SqlException: An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: TCP Provider, error: 0 - Only one usage of each socket address (protocol/network address/port) is normally permitted.)
Unfortunately Google as of today reveals very little information about this. To make a long story short this is created by one of the guys mistakenly adding the connection string with "Pooling=false;". This caused a humongous amount of connections, probably flooding the network and popping up the exception.
Subscribe to:
Posts (Atom)