I signed up for BlogExplosion some time back just to see if my tiny little blog might get more traffic. It has, but nothing remarkable. I didn't imagine it would. It's a good thing I am not doing this for the traffic, as I would have given up long ago. I started this blog as an outlet for my frustrations in dealing with Microsoft .NET as a development platform, and also as a forum where I could post solutions to problems that I encountered, and imagined others would encounter at some point too.
But since signing up for BlogExplosion, I have been surfing various blogs. That's what you do. You surf blogs, and it earns you credits which earns you hits in other users surfing safari. So, at first, I did what I imagine most BlogExplosion users do. I clicked for the next site, waited for the countdown to end, and clicked for the next site. Rinse, Lather, Repeat.
Here more recently, though I have been to take time, and actually read the first several posts on each site. I have found a lot of interesting sites by doing this. More than I could ever keep up with. There are so many blogs on so many topics, it is utterly amazing. Whatever you want to read about. It's there.
I wonder how much time everyone spends reading, or writing on blogs. It has to be a staggering number.
Wednesday, August 31, 2005
Here A Blog, There A Blog
Here They Go Again
Last year, there were those that blamed President Bush for the hurricanes that hit Florida. Well, I hate to say this, but, here they go again.
A Political Observation
This is not meant to stereotype political views of individuals in any way, but I was reading this blog entry today, and then later, this other blog entry. I had many of the same thoughts as the second blogger while reading the first blogger's entry. There are a lot of good folks in this world, and, of course there are bad folks too. The bad, though, seem to get a lot more attention these days.
The thing I find most intriguing is that most individuals who are left of center politically claim to care about people more than those who are on the right. Yet, I find that those same individuals are the first to complain about everyone and all the wrong in the world, and yet do nothing to correct it (except complain). However, I find the very opposite to be true of those who are on the right of center politically. They are the first to point out the good things that are being done in the world, and how things are getting better.
Now these are just observations of one person, though some may claim they are stereotypes. I am sure there are those that are just the opposite of what I have just described on each side of the political divide. I just wanted to share an observation from my experiences.
DTV
I have recently started watching MacTV. They have some great stuff on the site for Mac fans. From this site, I found a link to a great little Internet TV client, DTV.
From the DTV Site:DTV is a new, free and open-source platform for internet television and video. An intuitive interface lets users subscribe to channels, watch video, and build a video library.
Monkey Dance
I was chatting with my cousin last night, and he sent me a link to a parody of Steve Balmer's now infamous "Monkey Dance". The parody is quite well done. Enjoy!
Tuesday, August 30, 2005
Oldest Known Photograph
Set Focus to First Input Element
Here's a nifty little javascript function I wrote to set the focus to the first input element within an HTML document, or within the specified element in the HTML document.
function setFocus(el)
{
if (!el)
el = document.documentElement;
var children = el.childNodes;
var i = 0;
for (i = 0; i < children.length; i++)
{
if (setFocus(children[i]))
return true;
}
if (el.tagName == "INPUT" ||
el.tagName == "SELECT" ||
el.tagName == "TEXTAREA")
{
if (el.tagName == "TEXTAREA") {
if (el.readOnly == false && el.disabled == false)
el.focus();
}
else {
if (el.disabled == false)
el.focus();
}
return true;
}
return false;
}
Free Registration Code For Opera Browser
You can get a free registration code to run the Opera web browser without ads. This offer is only valid from 12am Tuesday, August 30, 2005 to 12am, August 31, 2005. Simply send an e-mail to registerme@opera.com. Get one while they last!
Monday, August 29, 2005
Coffee - It Does A Body Good!
According to this article:A study has found that coffee contributes more antioxidants - which have been linked with fighting heart disease and cancer - to the diet than cranberries, apples or tomatoes.
This is great news for an avid coffee drinker, such as myself.
Sunday, August 28, 2005
MRI
I had my MRI Friday evening. It went well. I have never had an MRI, so I wasn't quite sure what to expect. My doctor asked if I was claustrophobic. He also mentioned it had a lot of clanging and loud noises, and asked if that would bother me. Well, neither have before, so I didn't think they would bother me now.
Luckily, I can still say I am not claustrophobic, and loud noises still do not bother me. If you are claustrophobic, or loud noises do bother you, and you have to have an MRI, I suggest you have them sedate you. The space is quite close, and the noise can get quite loud, even with the earplugs. For me, it wasn't so bad. It lasted about 45 minutes or so. I kind of felt like Hannibal Lecter in "Silence of the Lambs". They had me lay down on this narrow conveyer belt like thing. They put my head in this harness, and brought over top a couple of layers of supports to hold my head in place during the MRI. These are what reminded me of Hannibal Lecter. If you are afraid of being confined in any way, or claustrophobic, you'd be in misery during this test.
I just laid there, most of the time with my eyes closed. Not much to look at except a white surface while in the MRI tube. The doctor mentioned I might get to listen to some music, but no such luck. That would have been nice. It would have at least kept me from being bored.
I should find out the results from the test Monday, but what I am wondering most about is "Did this give me a magnetic personality?"
The Computer's Better Than A Parfait
Who knew? Well, I didn't until I saw this latest switch ad, starring Will Ferrell. You'll need a Mac or PC with QuickTime 7 in order to watch.
Friday, August 26, 2005
Seven Band Names Impossible To Book
I didn't come up with this list, but it is quite funny.
Call WebService Method Using HttpWebRequest
I hacked together a quick function for calling a method in a WebService using the HttpWebRequest object in .NET. This method will return the result from the method call as a string, which you can then convert to whatever appropriate type you need. If the web method does not return a result, the method returns an empty-string. If the method fails for some reason, it returns null. I know, I should throw an exception, but this is a quick-n-dirty function.
public string MakeWebMethodRequest(string url, string webMethod, object [] parameters)
{
bool returnsResult = false;
string ns = "";
string [] paramNames = new string[0];
try
{
if ((!url.StartsWith("http://")) && (!url.StartsWith("https://")))
url = "http://" + url;
if (!url.EndsWith("?wsdl"))
url += "?wsdl";
System.Net.HttpWebRequest httpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
httpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)";
httpWebRequest.Timeout = 300000;
httpWebRequest.Accept = "text/xml; charset=utf-8";
System.Net.HttpWebResponse httpWebResponse = (System.Net.HttpWebResponse)httpWebRequest.GetResponse();
StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream());
string result = streamReader.ReadToEnd();
streamReader.Close();
XmlDocument xDoc = new XmlDocument();
xDoc.LoadXml(result);
ns = xDoc.GetElementsByTagName("wsdl:definitions")[0].Attributes["targetNamespace"].Value;
if (!ns.EndsWith("/")) ns += "/";
foreach (XmlNode xNode in xDoc.GetElementsByTagName("s:element"))
{
if (xNode.Attributes["name"].Value.CompareTo(webMethod) == 0)
{
XmlNode complexNode = xNode.FirstChild;
if (complexNode.HasChildNodes)
{
XmlNode seqNode = complexNode.FirstChild;
if (seqNode.HasChildNodes)
{
//parameters...
paramNames = new string [seqNode.ChildNodes.Count];
int i = 0;
foreach(XmlNode child in seqNode.ChildNodes)
{
paramNames[i] = child.Attributes["name"].Value;
i++;
}
}
}
break;
}
}
foreach (XmlNode xNode in xDoc.GetElementsByTagName("s:element"))
{
if (xNode.Attributes["name"].Value.CompareTo(webMethod + "Response") == 0)
{
XmlNode complexNode = xNode.FirstChild;
if (complexNode.HasChildNodes)
{
returnsResult = true;
}
break;
}
}
}
catch
{
return null;
}
string xml = "";
xml += "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
xml += "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ";
xml += "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" ";
xml += "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
xml += "<soap:Body>";
xml += "<" + webMethod + " xmlns=\"" + ns + "\">";
if (parameters != null)
{
if (parameters.Length == paramNames.Length)
{
for (int i = 0; i < parameters.Length; i++)
{
xml += "<" + paramNames[i] + ">";
if (parameters[i].GetType().ToString().CompareTo("System.String") == 0)
{
xml += parameters[i].ToString().Replace("&", "&").Replace("<", "<").Replace(">", ">");
}
else
{
xml += parameters[i].ToString();
}
xml += "</" + paramNames[i] + ">";
}
}
}
xml += "</" + webMethod + ">";
xml += "</soap:Body>";
xml += "</soap:Envelope>";
try
{
System.Net.HttpWebRequest httpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
httpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)";
httpWebRequest.Headers.Add("SOAPAction", "\"" + ns + webMethod + "\"");
httpWebRequest.Timeout = 300000;
httpWebRequest.Method = "POST";
// add the content type so we can handle form data
httpWebRequest.ContentType = "text/xml; charset=utf-8";
httpWebRequest.Accept = "text/xml; charset=utf-8";
// we need to store the data into a byte array
Byte [] postData = Encoding.UTF8.GetBytes(xml);
httpWebRequest.ContentLength = postData.Length;
System.IO.Stream tempStream;
tempStream = httpWebRequest.GetRequestStream();
// write the data to be posted to the Request Stream
tempStream.Write(postData, 0, postData.Length);
tempStream.Close();
System.Net.HttpWebResponse httpWebResponse = (System.Net.HttpWebResponse)httpWebRequest.GetResponse();
StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream());
string xmlresult = streamReader.ReadToEnd();
streamReader.Close();
if (returnsResult)
{
XmlDocument xDoc = new XmlDocument();
xDoc.LoadXml(xmlresult);
string result = xDoc.GetElementsByTagName(webMethod + "Result")[0].InnerText;
return result.Replace("&", "&").Replace("<", "<").Replace(">", ">");
}
else
{
return "";
}
}
catch
{
return null;
}
}
Wednesday, August 24, 2005
A.L.L.A.H.
Now, this is funny... at least to me. Apprently, the Nation of Islam, and The Nation of Gods and Earths believe that Allah stands for "Arm, Leg, Leg, Arm, Head".
You just can't make this stuff up.
Van Halen's Pretty Bad Woman
Well, the station I listen to most often at work has decided to play the Van Halen version of Pretty Woman again. And let me say, "IT'S HORRIBLE!" I usually change the station during the terribly long intro which is very painful to listen to, and I rarely come back to the station till later in the day. I stuck it out today, but I won't be doing that again. My ears hurt.
Google Talk
Well, Google have added another item to their lineup... Instant Messaging! You can download their client or you can set it up for GAIM and Adium, and several other IM clients. Google have provided instructions for configuring several clients.
Monday, August 22, 2005
Scrolling Tip For Mac OS X
Here's two cool tricks I learned about today. The scrollbar on Mac OS X has two arrows, like any other scrollbar. You can opt to have these arrows next to each other on the scrollbar, and when you do, you can hold down on one to start a scroll, and while holding down, move to the other one, and the scroll will instantly change direction. Not earth shattering, but useful to know. One thing though, these arrows are always at the bottom. This can be changed however. You can open a terminal, and type the following command, and all windows with scrollbars that are opened from this point forward will have the set of arrows at both ends of the scrollbar. Rather nifty.
defaults write "Apple Global Domain" AppleScrollBarVariant DoubleBoth
Friday, August 19, 2005
RegisterHiddenField
If you happened to be wondering about my previous post, it came about as a result of the RegisterHiddenField() method of the Page class in .NET. It doesn't work as expected. In Internet Explorer, it works fine since the ID and Name properties of the elements in the DOM are treated the same when only the Name property is provided. However, that does not work as expected in other browsers such as Firefox and Opera.
<sarcasm>Way to go Microsoft! You're the best!</sarcasm>
Name == ID?
Someone please explain how this works in Internet Explorer? Firefox works as expected, but Internet Explorer happily goes on just like the hidden input actually has its ID property set.
<html>
<script language=javascript>
function foo() {
alert(document.getElementById('testElement').value);
}
</script>
<body>
<input type='hidden' name='testElement' value='stacey'>
<input type='button' onclick='foo();' text='push me' value='push me'>
</body>
</html>
Thursday, August 18, 2005
Quicken Loans Equals Funny Math
I keep hearing these ads on the radio for Quicken Loans. Today, I hear one, and they proclaim I can get a 1.9% APR for a $200,000 loan, and my monthly payment would be somewhere between $300 and $400 per month. I don't recall the exact figure, but an estimate is enough for my purposes here.
So let's do some math. Real simple math.
$400 * 360 payments (30 year loan) = $144,000
I may not be the world's best mathematician, but even I know that $144,000 does not equal $200,000! So what's the catch? There is some serious fudging of numbers in these ads. If you go to the website, and you try and get a similar loan, you can't get any of the calculators to achieve the numbers they claim. I never thought you could, and simple proves you can't. I think that someone needs to get them for FALSE ADVERTISING!
Wednesday, August 17, 2005
Gas, Iraq, Terrorists
That being said, I think we have played right into the hands of what the terrorists wanted. They cannot stand us, and they want to bring us to our knees. They are also very patient, and very methodical in everything they do. I don't think that they could bring us to our knees militarily. Yes, they'll win some battles, but not the war. Not in the case of who has the stronger military. They could never win that, and they know it. So, how can they beat us? They can beat us from within.
I'm not talking about them blowing up a school or numerous buildings, or anything like that. I am talking about them beating us, by having us beat ourselves. They know we are "The Land of the Free", and as such, we take great pride in our freedom. So much to the point that we tolerate most anything. In our great land, you can do what you want, and think what you want. But along with that comes a lot of debate, and arguing, etc, etc. So what do the terrorists do to bring us down? They need to divide us to conquer us. They attack us, and we are united. For a time. But now, that united feeling has subsided, and our pride is taking over once more. Just like the terrorists wanted. We start a war with them. Just what they wanted. They know they can't win the war, but they know they can drag it on for a long time. Look at the war with Israel. They have been fighting one another for centuries.
So, we are in a war that we know is going to last for a long time. Our enemy is very patient, and very methodical. And as a result, we have a divide coming across the country. We are the "Land of the Free", afterall, and everyone has an opinion. The war drags on, and as it does, the oil companies fear the price for oil is going to rise drastically. It has risen some, so they start to raise prices. People start complaining, and start to place blame. The blame goes to the one who started the war, the President. His administration works harder to try and end the war sooner, but that hastiness causes mistakes to be made. More lives lost. More of an outcry in our country. We want our troops home sooner. Things get more tense over in Iraq. More unrest, and more terrorist attacks. Attacks pop up elsewhere, in other countries. The unrest continues, and the gas prices continue to raise.
Now, where am I going with all of this? Well, as you can see, this cycle of unrest, public outcry, and economic uncertainty is going to continue. And as it does, the price for gas will rise. And as the price of gas rises, so do consumer products. Consumer products we need. Our food and clothing and essentials rise. All of these items rely on gas for transporting them to each of us all over the country. Eventually, prices are going to get so high that we cannot afford our essentials.
And at that point, we fall. Just like the terrorists wanted from the beginning. All of this with very little effort on their part. We have done it to ourselves.
Think about it.
Tuesday, August 16, 2005
How Bad Have You Got It?
I love my Mac, and yes they are little more pricey than PC's, but there is no way I would have went through this to get a Mac laptop for $50. I wouldn't go through that even if they were paying me to take them off of their hands.
My favorite quote:Jesse Sandler said he was one of the people pushing forward, using a folding chair he had brought with him to beat back people who tried to cut in front of him.
"I took my chair here and I threw it over my shoulder and I went, 'Bam,"' the 20-year-old said nonchalantly, his eyes glued to the screen of his new iBook, as he tapped away on the keyboard at a testing station.
Microsoft One Ups Apple
Well, this is interesting. Apparently, Microsoft has a patent to the iPod. Read more here.
My favorite quote from the article is this:David Kaefer, Microsoft's director of intellectual property licensing, said it was open to letting other firms patent its innovations.
He said: "In general, our policy is to allow others to license our patents so they can use our innovative methods in their products.
<sarcasm>
Isn't that just the nicest thing ever? Microsoft is always looking out for the little guy.
</sarcasm>
Oh The Irony
Attempting to visit The Unofficial Apple Weblog, and I am greeted with the following error message:
Microsoft VBScript compilation error '800a03e9'
Out of memory
/b-c/design-22/posts.asp, line 0
Configuring An ASP.NET Application With A Home Directory Located On A Share On Another Computer
That has to be longest heading for any of my blog entries, but it's what I finally figured out how to do, and thought I would post about my experiences, and a short HOWTO on the subject for those who may be struggling much like I have been for the past day or so.
Suppose you have two servers. One exposed to the outside world, and one on your internal network. Now, also suppose that you want the server exposed to the outside world to run an ASP.NET application, but the resources (files) for this ASP.NET application are on a share on the internal server. That's the situation that I have.
It all seems easy enough. Create the website on the externally-exposed server with its home directory pointing to the share on the internal server, right? Wrong. In the ASP days, this works fine, but in the days of compiled ASP.NET applications, it's not so simple.
Here's a quick checklist of how to get it to work.
1. Create a virtual directory on your website, and point it to the share on the internal server where the ASP.NET application exists. For example, if your ASP.NET application is in the folder "MyGreatWebApp" on the share "MyWebShare" on the server "BIG_SERVER", then the virtual directory would point to:
\\BIG_SERVER\MyWebShare\MyGreatWebApp
2. Set the permissions on this virtual directory to read and execute.
3. Locate machine.config on the web server. It should be in the following folder, or something similar:
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG
4. Edit the file, and make sure the following entry is there:
<identity
impersonate="true"
userName=""
password="" />
5. Open Administrative Tools\Microsoft .NET Framework 1.1 Configuration
6. Navigate to Runtime Security Policy\Machine\Code Groups\All_Code. Right click All_Code, and select New. Type a name for your new policy, and click Next. Choose URL from the drop list. We now need to give it the path to our shared folder. So, using our shared folder from above, we have the following:
\\BIG_SERVER\MyWebShare\MyGreatWebApp\*
Click Next. Choose Full Trust, and click Next. Click Finish.
7. On your externally exposed web server, locate the folder C:\WINDOWS\Microsoft.NET and make sure that everyone has Full Control to this folder, and all of its contents.
8. Open a command prompt on the externally exposed web server, and issue the command iisreset, and your ASP.NET web application should now work as expected.
Now, while this works, it doesn't leave me with the best of feelings. It seems that there are a lot of security issues with this. I need to do some more work to determine if this can be locked down more, but I am doubtful that I will be able to lock it down much more than this. In any case, if you must have this setup, these instructions will get you where you need to be, and if anyone has more to add on this subject, feel free to comment. I'd love to hear of better ways to do this. It seems like a lot of work for something that used to be quite simple, and it also seems to open up some secure doors that weren't' very secure to begin with.
Monday, August 15, 2005
GarageBand Rocks
I am starting to appreciate the one iLife software component that has no "i" -- GarageBand. I never envisioned myself using it. I am not musically inclined in the least, and I never thought I would need to create music loops. That's its main selling point, or so I thought.
I decided to fire it up the other day to see if I could truncate a clip of music I had into something that would work. Seemed like a good fit for it. And it was. It went quite well, despite the fact that I never once opened a help file. Since that time, I have thought that this little gem could be used to create some "extended" mixes of some tunes.. Perfect for those slideshows, when there just isn't a tune long enough on it's own to fit the show, and when you don't want to just start back at the beginning and you don't want to trim photos down any. So I decided to try my hand at that.
It was easy. Imported the song I wanted to extend into GarageBand. Then started looking through it for a good spot to extend. Found that. Then I needed a spot that matched it... A little more listening, and I had it. Copied the segment I want to the end, and it just flows right on through. Did a quick import into iTunes from GarageBand, and my tune is now ready for use wherever I want.
GarageBand Rocks!
Thursday, August 11, 2005
Empty Dataset
Ever need an empty dataset? Probably not, but if you ever have the need of an empty DataSet object in an ADO.NET application, try the following:
DataSet ds = new DataSet();
DataTable dt = new DataTable("emptyTable");
ds.Tables.Add(dt);
Wednesday, August 10, 2005
More Bluetooth Mouse Info
I decided to do a search for others experiencing the same Bluetooth mouse trouble as myself, now that I know it's the batteries. I found this thread over at mymac.com. You just need to know what to look for.
Tuesday, August 09, 2005
Apple Support Is Terrible
Well, today I decided to call Apple support for some help with my Bluetooth mouse. As it turns out, my 90 days of complimentary support have run out, or so they say. I should have had one more day, but they wouldn't budge. Nevermind I have never called them, not even once, for anything. All she would say is that I could look on the support site online. Well, I have done that over and over, and found nothing.
The good news is though that I did solve my mysterious Bluetooth mouse problem, and I am going to post the solution here for all the world to know, in spite of Apple's reluctance to tell me. And after you read the solution, you will be just as amazed as I was that the support person would not tell me to check this one thing.
So, by now, you are definitely wondering what I did to solve this problem with my Bluetooth mouse. But first, for the unknowing, here's a quick recap of what happened prior to it not working:
I purchased my Mac, complete with Bluetooth keyboard and mouse, and happily used them for about 3 months.. Maybe a little less. Tiger OS X 10.4.2 update comes out. I update. After which, my batteries die. The update finishes, and I reboot. I replace my dead batteries with new ones. The mouse syncs up, but now it doesn't track. Only the button clicks are acknowledged.
So, that brings us back to tonight. I started thinking. Could it be the batteries? Nah, I just recharged them. The Bluetooth status shows they have plenty of juice. But on a whim, I try another set of rechargeables. This time, something odd happens. The mouse syncs up with the computer, and like before, only the click is recognized, but this time, the optical led light is no longer flashing. Hmm... that's odd. So, let me try something radical. Let me pull 2 batteries from my Bluetooth keyboard. They are, afterall, much more used. They are still the same ones that it came with over 3 months ago. I put them in, turn on the mouse, and...... IT WORKS!!!
OK, so what gives? It turns out, as the astute electrician will note, rechargeable batteries only have 1.2V each, while the alkaline batteries it came with have 1.5V each. So, apparently, I cannot use rechargeable batteries in my mouse, and I am going to assume I cannot use them in the keyboard either.
So, for the past few weeks I have been suffering with a wired USB mouse when I could have been enjoying the Bluetooth mouse.
Now, what I want to know is this: Why couldn't Apple support tell me, make sure you have 1.5V batteries. That doesn't seem like a big deal. Surely they could have told me that. I mean, they did give me the website for online support. Doesn't seem like a far stretch to at least give the end user that bit of info to try, and it not cost them for a support call.
Just for the record, this information cannot be found on Apple's support site. You read it here first! And it didn't cost you anything. On second thought, that'll be $150. ***smiles***
Thursday, August 04, 2005
A Dad And Son Polar Bear Go Fishing...
The young bear asked, "Dad, am I a full-blooded polar bear?"
His father replied, "Sure son, you're full blooded."
The young bear asked, "Are you positive that I'm 100% polar bear, Dad?"
"Yes, son, I'm sure. Your mother's a polar bear, I'm a polar bear..."
"But Dad, are you sure there's not a little brown bear in me?"
"Yes son, I'm sure."
"Are you really sure, Dad, that there's not just a little black bear in me?"
"Yes, son, you're all polar bear."
"Maybe just a little grizzly bear in me, Dad?"
"No way, son, no way," replied the papa bear. "Why are you asking these questions?"
The little polar bear replied, "Because, Dad, I'm freezing."
Wednesday, August 03, 2005
It's The End Of The World As We Know It (And I Feel Fine)
Listening to this song today on the radio, and a thought occurred to me. What is the ratio of words in this song to the length of the song? So I counted the words (and this doesn't count the number of times that the chorus is repeated) and I found that it has 370 words. I fired up iTunes, and found the length of the song is about 4 minutes, so that would be 240 seconds. Doing the math, and we find that we have a little more than 1.5 words per second. Now, if you figure in the repeats, we probably have closer to 2 words per second.... Pretty amazing, if you ask me. Anyone got a song with more words per second?
iMovie Camera Flash Effect
Last night, while working on the VBS (Vacation Bible School) closing program video, I figured out an easy way to do a camera flash effect in iMovie. It's pretty simple. A Wash-In transition is used. Wash-In for those who don't know is a transition that fades in from white. So, put the photo where you want it in your movie, and then add a wash-in transition before the photo. I use a length of 4 frames for the transition. Then add a sound-effect to one of the audio tracks. Works great, and when used in moderation can add some spice to your videos.