tag:blogger.com,1999:blog-59938099221632664532024-02-07T18:07:10.182-08:00brian's blogOK, so I finally have a blog. Now what?brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.comBlogger37125tag:blogger.com,1999:blog-5993809922163266453.post-526677484940460622017-11-04T07:38:00.000-07:002017-11-04T07:54:04.167-07:00NFaiLure<a href="http://boston.cbslocal.com/2016/10/27/nfl-ratings-national-anthem-protests-poll/">Ratings are in the cellar.</a><br />
<a href="https://sports.yahoo.com/nfl-fans-burning-jerseys-rage-teams-support-protests-143519640.html">Fans are burning their stuff.</a><br />
<a href="http://www.sfgate.com/sports/article/are-nfl-stadiums-more-empty-viewership-decline-12299868.php">Stadiums are half-empty.</a><br />
<a href="https://www.theguardian.com/sport/2017/nov/01/papa-johns-nfl-protests-sponsorship">Sponsors are getting worried.</a><br />
<br />
So how in the world did the NFL, <i>the NFL</i>, make such a mess of things?<br />
<br />
What do you suppose is behind the appeal of professional athletics?<br />
<br />
I think the sports fan tries to find some way to identify with the athlete: so that the athlete’s victory somehow is the fan’s victory as well. So maybe the athlete’s hometown is my hometown too. Or maybe he went to the same school as I did. Or maybe his birthday’s in November, and mine is too.
<br />
<br />
Over the last several years, it’s become harder and harder for the fan to identify with the professional athlete. Not even considering the vast difference in financial/lifestyle, I recall several years ago when it seemed that every week there were reports of an football player beating his wife/girlfriend/child, and NFL’s response was a series of commercials with players looking at the camera in disappointment and telling the camera (or the fans, I suppose) to quit beating their wives/girlfriends/children. I’d venture that for the vast majority of the fans, beating each other is not a normal way of life.<br />
<br />
I love our country. I love its flag. With the ongoing anthem-kneeling controversy, I really don’t know how to identify with them anymore. They are showing their hatred and disdain for what I love.<br />
<br />
I’d suppose I'd just as soon watch a matchup between the Taliban and North Korea. :-)brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-64647746134014744862016-05-25T09:04:00.001-07:002016-05-25T15:41:15.285-07:00Android: WiFi ADB<br />
<br />
It's great being able to debug code on a real live Android device. Typically, though, your device needs to be tethered to your host computer. Now ADB has a facility to connect wirelessly, so you can debug code on your device without a physical connection to it. To do this, you need to know the IP address of the device, and follow these steps: <br />
<ol>
<li>Connect the device to your computer via USB; make sure ADB can see it (ie, make sure it shows up in the command 'adb devices').</li>
<li>Enter the command 'adb tcpip 5037'</li>
<li>Enter the command 'adb connect <ip address>:5037'</li>
</ol>
You're now free to disconnect your device. Go ahead and disconnect the device, and you'll still see it in the response to 'adb devices', and you can use all the other adb commands as well (shell, push/pull, etc).<br />
<br />
Here's a Ruby script that'll do all this for you: <br />
<br />
wifiadb.rb <br />
<code># get the IP address of the device<br />
if ARGV.length == 0<br />
port = 5037<br />
print "PORT not specified: defaulting to 5037\n"<br />
else<br />
port = ARGV[0]<br />
end<br />
wlan0 = `adb shell netcfg | find /i "wlan0"`[/(\d{1,3}\.){3}\d{1,3}/]<br />
printf "The device's IP address is " + wlan0 + "\n"<br />
system("adb tcpip " + port.to_s)<br />
system("adb connect " + wlan0 + ":" + port.to_s)<br />
</code>
<br />
<br />
Now all you need to do is run wifiadb.rb. It'll figure out your device's IP address and run the necessary commands. <br />
<br />
For more information: <br />
Android Debug Bridge: <a href="https://developer.android.com/studio/command-line/adb.html%C2%A0">https://developer.android.com/studio/command-line/adb.html</a><br />
Ruby: <a href="https://www.ruby-lang.org/en/">https://www.ruby-lang.org/en/</a>brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-74758825844719477372013-02-27T14:33:00.002-08:002013-02-27T14:42:21.861-08:00Mothers PowerBall 4Lights Kit: A Review<div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: Tahoma; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">This is a review of <a href="http://www.mothers.com/02_products/07250.html" target="_blank">Mothers PowerBall 4Lights Headlight Restoration Kit</a><br />
</div>
<br />
<div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: Tahoma; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
The headlights lenses on my wife's car (2003 Toyota Camry) were looking pretty dull and gray. It makes sense that clear headlights are better for safety and visibility, and clear headlights look better than dull headlights as well. My mechanic offers a headlight restoration service, and I knew I could buy new lenses for about $50 each. I've seen headlight restoration kits for sale, but I would wonder "do they really work?" and not want to risk the twenty bucks or so to find out. I read a review of restoration kits on Consumer Reports, and it seemed that for the most part these kits will work well enough, in other words, they will to some extent make an improvement to headlight lenses.</div>
<div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: Tahoma; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<br /></div>
<div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: Tahoma; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
I decided to go ahead and try out the Mothers' Powerball 4Lights Headlight Restoration Kit, which I bought for a little over $20 at our local Walmart. Here's what I found.</div>
<div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: Tahoma; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<br /></div>
<div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: Tahoma; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
The bottom line: take a look at the before and after pictures. I'm pretty happy with the outcome.</div>
<div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: Tahoma; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
</div>
<div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: Tahoma; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjY-ACK2X-gol4LdHfCnOvOSHnmsTX9nEClRET2I_2XikeDq6nzFkZ1WGEXWwWK4JuoQmYmfGpM7tlc3yz5h11Kdi5hU8odgKHUBdHhaEtJPJiMQOdSn-hCq0jC9yEYzE2gF6B25IfRElU/s1600/2013-02-02+15.45.28.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjY-ACK2X-gol4LdHfCnOvOSHnmsTX9nEClRET2I_2XikeDq6nzFkZ1WGEXWwWK4JuoQmYmfGpM7tlc3yz5h11Kdi5hU8odgKHUBdHhaEtJPJiMQOdSn-hCq0jC9yEYzE2gF6B25IfRElU/s1600/2013-02-02+15.45.28.jpg" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Before 4Lights</td><td class="tr-caption" style="text-align: center;"><br /></td></tr>
</tbody></table>
The kit I bought included liquid polish, a polishing cloth, the buffer bit for your power drill, and for use in extreme cases, sanding pads. Even though I thought my lenses were in fairly bad shape, I wound up not having to use the sanding pads.</div>
<div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: Tahoma; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
</div>
<div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: Tahoma; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<br />
I started by opening the hood of the car, so that polish wouldn't get splattered all over the hood of the car, and I taped off the area around the lenses. It was cool outside that day, so I happened to be wearing a jacket. You definitely want to use safety glasses too, because the polish will get splattered all over the place, especially as you first get the hang of running the drill.</div>
<div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: Tahoma; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<br /></div>
<div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: Tahoma; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcQ1s6DtASvRvWur5cKc46pzLLRT3oOVPWjfiKEwlflH0AdiHnOgDODBF68CHk04JlSWcqMPmf32GeU-ORtqgZY0Z_w-hnz9dKitfs4bYqdGWF6FDtVVFCf9xZSbYu9rJobnfkDSYsEvYu/s1600/2013-02-02+16.30.20.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcQ1s6DtASvRvWur5cKc46pzLLRT3oOVPWjfiKEwlflH0AdiHnOgDODBF68CHk04JlSWcqMPmf32GeU-ORtqgZY0Z_w-hnz9dKitfs4bYqdGWF6FDtVVFCf9xZSbYu9rJobnfkDSYsEvYu/s1600/2013-02-02+16.30.20.jpg" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">After 4Lights</td><td class="tr-caption" style="text-align: center;"><br /></td></tr>
</tbody></table>
I basically followed the instructions: clean the lens, install the buffer bit on your drill, put a blob of polish on the it, and get to work. Try to keep the bit speed down to minimize splatter, and just go back and forth with the polisher over the lens, and add a little more polish every now and again. It took me about 20-30 minutes per lens. Let dry for a few minutes, and then polish them with the supplied cloth.</div>
<div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: Tahoma; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<br /></div>
<div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: Tahoma; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
I like that everything I needed was included (except the drill, of course). I like that there is enough polish that I could do a second vehicle if I needed.<br />
<br />
I'm happy with the Powerball 4Lights Restoration Kit. I think you will be to. </div>
brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-52953386114772279212012-12-04T16:33:00.001-08:002012-12-06T12:46:09.465-08:00The Motorcycle Bug<span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px;"><div style="-webkit-line-break: after-white-space; -webkit-nbsp-mode: space; word-wrap: break-word;">
<span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUs2xMGWtKcgWi8cnDFqLTQq_P3yygL2fAHwGn-AUMyOdXdS44YLl0VRAS1jq2QmI5R7kpomqh6up0z-QVftIEDMzsE082iudJob3YZHSHrgEfa5PWDhvlSo6bgkscEJNc36Fkce3Oqsjb/s1600/20121204172027.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUs2xMGWtKcgWi8cnDFqLTQq_P3yygL2fAHwGn-AUMyOdXdS44YLl0VRAS1jq2QmI5R7kpomqh6up0z-QVftIEDMzsE082iudJob3YZHSHrgEfa5PWDhvlSo6bgkscEJNc36Fkce3Oqsjb/s1600/20121204172027.jpg" height="240" width="320" /></a><span style="color: #010101;">This is what I did when I got bit by the motorcycle bug:</span><br />
<span style="color: #010101;"><br /></span><span style="color: #010101;"><b>1. I read a lot. </b> There are a bunch of good books at the local library. I read a couple of "Motorcycle for Dummies"-type books, as well as a series I really liked called <a href="http://www.amazon.com/Proficient-Motorcycling-Ultimate-Guide-Riding/dp/B0064XGUFQ/ref=sr_1_fed1_2?s=books&ie=UTF8&qid=1354667051&sr=1-2&keywords=proficient+motorcycling+hough" target="_blank">Proficient Motorcycling</a> by David Hough (there are two books in that series.)</span><br />
<span style="color: #010101;"><br /></span><span style="color: #010101;"><b>2. I took the MSF class.</b> I found about rider educati</span><span style="color: #010101;">on from</span> <a href="http://www.msf-usa.org/" target="_blank">www.msf-usa.org</a> <span style="color: #010101;">. They'</span><span style="color: #010101;">ve got a lot of good reading material there too. I signed up for the course and I took the class at our local community college. There are several "types" of class, and I took the Beginner RiderCourse. When you [successfully] complete the class, you get a card, which might be worth an insurance discount to you. The class covers the types of situations you need to be aware of, and how to deal with them.</span><span style="color: #010101;"><br /></span><span style="color: #010101; font-family: inherit;"><br /></span><br />
<span style="color: #010101; font-family: inherit;">The class cost $235 (when I took it), and it was well worth it. I had zero experience to speak of, and I want to learn things the right way. It's a three day course: Friday evening, and all day Saturday and Sunday. There are some videos to watch, book work, and discussion. The fun part is riding. They supply small (250cc range) motorcycles that you use to develop skills, and practice driving around the range (a parking lot). You'll practice quick stops, swerves, etc. You don't venture out into traffic. </span><br />
<span style="color: #010101; font-family: inherit;"><br /></span>
<span style="color: #010101; font-family: inherit;">To take the class, you'll need gloves, a DOT-approved helmet, something long-sleeved, and over-the-ankle footwear. This particular class offered helmets to borrow, but in my group, everyone had his own gear. </span><br />
<span style="color: #010101;"><br /></span><span style="color: #010101;"><b>3. I got my gear. </b> I bought riding gloves, a full head helmet, a riding jacket. I wear all the gear all the time. My jacket is a Tourmaster Intake II. It is a mesh jacket, with a water/wind liner and a thermal liner. During the summer, people ask "don't you get hot in that?" No more so than a car without air conditioning.</span><br />
<span style="color: #010101;"><br /></span><span style="color: #010101;"><b>4. I ask questions. </b> There are a couple of riders at my office here, and they are a great resource; I've still got a lot to learn. There are good on-line motorcycle rider communities, where you can continue learning. </span><br />
<span style="color: #010101;"><br /></span><span style="color: #010101;"><b>5. I practice.</b> When I first got my bike, I had the previous owner drive it to my house. The first couple of days all I did was drive it around the block a few times. I learned that it's tough to start of from an incline, for example :-) After I felt more comfortable I ventured out on the road. I try to ride as much as I can. The experts recommend you continue to take some time driving around a parking lot to get better at handling, continue practicing quick stops, swerves, etc.</span><br />
<span style="color: #010101;"><br /></span><span style="color: #010101;"><b>6. I got my full license.</b> My state requires a rider to have at minimum a Motorcycle Learner's Permit; the basic restriction of which is that one cannot ride after dark. Here in SC, one can get a permit after passing a written test. One of the findings from the Hurt Report is that having a full license reduces your chances of being in an accident. I suppose it's because if you've shown that you can handle the bike good enough for the test, you can handle it good enough on the roads to keep out of trouble. The riding test here consists of several maneuvers. I practiced for a couple of months, and then passed the riding test. In some states, successfully completing the MSF Intermediate RiderCourse allows you to waive the riding test at your local DMV. Of course, you'll have to check for yourself.</span><span style="color: #010101;"><br /></span><br />
<span style="color: #010101;"><br /></span></span></div>
</span><div class="separator" style="clear: both; text-align: left;">
<span style="color: #010101;"><span style="font-family: inherit;"><b>7. Of course, I bought a motorcycle!</b> I bought a lightly-used 2006 Honda Shadow VLX. It's a 600-cc bike, and reviewed very well as a fine "beginner bike." What I like about it is that it's small enough for me to control, but large enough to put on the interstate without being blown all about. It's a fantastic bike. </span></span></div>
<br />brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-21282655435264085552012-10-30T08:09:00.003-07:002012-10-30T08:25:07.768-07:00Hacked about #schackedI'm hacked about #schacked. <br />
<br />
Last Friday, October 26, news broke that the South Carolina Department of Revenue was hacked, and a few million Social Security Numbers, and a few hundred thousand credit and debit card numbers, were exposed to hackers. The breach affects residents who filed tax returns going back for almost fifteen years. 15 YEARS!<br />
<br />
There's a twitter hashtag, <a href="https://twitter.com/search?q=%23schacked&src=hash">#schacked</a>, for people wanting to follow the events.<br />
<br />
I'm irritated about several things:<br />
<br />
<b>1. That it happened.</b> Not only that it happened, but that it has been happening. Apparently, there have been numerous system breaches going on for months. <br />
<br />
<b>2. The bad guys had a 16-day head start.</b> The state admits that it knew about the breach sixteen days before informing the public. <br />
<br />
<b>3. The costs to the state (ie, taxpayers) is "capped" at $12 million dollars.</b> Presumably this does not include the additional cost due to the head start the bad guys had. The $12M divided by the 4.5M population works out to a little less than $3 per person, if that makes you feel any better.<br />
<br />
<b>4. SC's helpful suggestions.</b> These include getting a free activation code for Experian's ProtectMyID alert. It took a day or two for me to get through to get the code. It was a laughably simple code, and there's not a clear reason why the code could not have been posted online, instead of forcing millions of people to call a toll-free number. And now to protect my information, I have to enter it into yet another system. <br />
<br />
<b>5. The blame game.</b> When the news of the breach broke, residents had to call a toll-free telephone number to get the code. For me, I got busy signals until Saturday afternoon, at which time I got a recording which provided the code. The code did not work for me until Monday. With potentially millions of people affected by this, one would naturally expect wait times and busy signals. But at today's press conference the governor implied it wasn't the millions of affected residents causing the busy signals, it was the relative handful of journalists trying to cover the story. Additionally, the governor says that the social security numbers were not encrypted because the "industry standard" is that those numbers aren't encrypted.<br />
<br />
News<br />
<a href="http://www2.wspa.com/news/2012/oct/30/26/experts-say-credit-monitoring-being-provded-sc-wil-ar-4836674/">http://www2.wspa.com/news/2012/oct/30/26/experts-say-credit-monitoring-being-provded-sc-wil-ar-4836674/</a><br />
<a href="http://www.dispatch.com/content/stories/national_world/2012/10/30/hack-has-s-c--folks-open-to-id-theft.html">http://www.dispatch.com/content/stories/national_world/2012/10/30/hack-has-s-c--folks-open-to-id-theft.html</a><br />
<a href="http://www.dispatch.com/content/stories/national_world/2012/10/30/hack-has-s-c--folks-open-to-id-theft.html">http://www.postandcourier.com/article/20121030/PC16/121039950/haley-hacking-8220-absolutley-bizarre-8221-state-costs-for-monitoring-capped-at-12-million&source=RSS</a>brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com1tag:blogger.com,1999:blog-5993809922163266453.post-51960674252467251822012-10-12T14:55:00.001-07:002012-10-12T14:56:29.906-07:00Stellarium and the Barlow Lens<span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px; font-family: Arial; font-size: 14px;">In <a href="http://brismith66.blogspot.com/2012/08/stargazing-on-cloudy-night.html" target="_blank">Stargazing on a cloudy night</a> I wrote about configuring Stellarium's Oculars plugin so that Stellarium can show you what you'll see through your very own telescope. With the Oculars plugin you describe your telescope as well as your eyepieces.</span><br />
<div>
<br /></div>
<div>
What about the Barlow lens? Essentially, a <a href="http://en.wikipedia.org/wiki/Barlow_lens" target="_blank">Barlow lens</a> is a device which increases the focal length of your telescope, thereby increasing the magnification of the image in the eyepiece. In other words, an eyepiece which gives you 50x without a Barlow will give you 100x with a 2x Barlow.</div>
<div>
<br /></div>
<div>
I have a 3x Barlow lens to go along with my scope: the Orion SkyScanner 100mm. Its focal length is 400mm, so when using the 3x Barlow with an eyepiece, it's as if my focal length is 1200mm. To use Stellarium's Oculars plugin with this particular setup, I just added a second telescope with the same parameters as the original telescope, but with the longer focal length. So in my case, I now have <i>two</i> telescopes, the SkyScanner 100, and the SkyScanner w 3x. </div>
<div>
<br /></div>
<div>
I went out on the evening of October 11, and drew a sketch of Albireo, using the Barlow with a 10mm eyepiece:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia6Jqj2LPqE-0ZNLPMxUETiKJ8pGFupqIQnie0vY2j-X0pHQCr3zs6dXHvinDvIfjl4sDnOKZWTSiywfe9CCKHuy9TzNp8O5dZqyiwYBGYzGhbiBRyd5gYyo4MEm7s3RnHjTwhkgN48NcI/s1600/g_albireo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="248" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia6Jqj2LPqE-0ZNLPMxUETiKJ8pGFupqIQnie0vY2j-X0pHQCr3zs6dXHvinDvIfjl4sDnOKZWTSiywfe9CCKHuy9TzNp8O5dZqyiwYBGYzGhbiBRyd5gYyo4MEm7s3RnHjTwhkgN48NcI/s400/g_albireo.jpg" width="400" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Here's a screenshot from Stellarium with the same setup:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPUXRXdW3OPDLwwaxoskZd1X2_rcU7k0I30KxqR-KHeZA10MAfNnZJUU_DihdYegjXCMRdoST_7wXyAHzOus4li7PyiQO-Eaof-DBUUl4yFK1ENXpzEmCu-kwczW-tdf5Zb_P2fc5EczEu/s1600/g_albireo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="318" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPUXRXdW3OPDLwwaxoskZd1X2_rcU7k0I30KxqR-KHeZA10MAfNnZJUU_DihdYegjXCMRdoST_7wXyAHzOus4li7PyiQO-Eaof-DBUUl4yFK1ENXpzEmCu-kwczW-tdf5Zb_P2fc5EczEu/s400/g_albireo.png" width="400" /></a></div>
<br />
<div>
<span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px;">It's pretty cool how Stellarium can show you what you'll see when looking through your own scope. </span></div>
brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-30154156840833273932012-08-24T15:52:00.000-07:002012-08-24T15:54:31.621-07:00Stargazing on a Cloudy Night<span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; border-collapse: separate; font-family: Arial; font-size: 14px;"></span><br />
<div style="-webkit-line-break: after-white-space; -webkit-nbsp-mode: space; word-wrap: break-word;">
Over the last year or so I've become interested in backyard astronomy. Growing up in south Florida, I was always fascinated by the rocket launches out of Cape Canaveral. I remember having one of those cheap "department store" refracting telescopes, but it wasn't worth using for anything more than looking at the moon.<br />
<div>
<br /></div>
<div>
So last year I started reading more about astronomy, and even wound up buying a nice budget-friendly telescope, the Orion SkyScanner 100mm. It's a right nice little scope, and something I enjoy doing is going out on a clear night and taking a look at what's out there. When I head out, I tell my wife I'm going to go listen to "the heavens declare the glory of God." (Psalm 19:1)</div>
<div>
<br /></div>
<div>
The scope comes with a version of "Starry Night," a software planetarium package. It appears to be well regarded, but I run Ubuntu Linux on the machines at home. For a while I tried to get Starry Night to run under WINE, but to no avail. So I went hunting for planetarium software which runs under Linux. I found <a href="http://www.stellarium.org/">Stellarium</a> which I think is a fantastic package. It is open-source, and available for Linux, Mac, and Windows. </div>
<div>
<br /></div>
<div>
One of the neat things about planetarium software is that if it knows where you are, it can tell you what <i>your</i> night sky looks like. So go ahead and download Stellarium, and configure it for your particular location. Take a look at a constellation or two, and then go outside to see if you can find them for real.</div>
<div>
<br /></div>
<div>
Stellarium includes a number of "plugins" which add to its functionality. I found that with the "Oculars" plugin, I can configure Stellarium to show the sky exactly as it appears through my telescope. I'm going to show you how to do that yourself; it's a fairly straightforward process. But before you begin, you are going to need to collection a little information:</div>
<div>
<br /></div>
<div>
<ul>
<li>What's the aperture and focal length of your telescope? Mine is 100mm, focal length 400mm</li>
<li>For each eyepiece, what is its focal length and apparent field of view (aFOV)? I'm going to define two eyepieces, one 10mm eyepiece (aFOV=52) and one 20mm eyepiece (aFOV=52 as well). You can find aFOV information by looking at the technical specifications for the eyepiece. You can find this at the manufacturer's website, or you can use one of the many online calculators. For example under the Specs tab <a href="http://www.telescope.com/Accessories/Telescope-Eyepieces/10mm-Orion-E-Series-Telescope-Eyepiece/c/3/sc/47/p/100299.uts?ensembleId=78">here</a> you will see the focal length and apparent field of view for the 10mm eyepiece I have.</li>
</ul>
</div>
<div>
<br /></div>
<div>
Now let's begin</div>
<div>
<ol>
<li><b>Enable the plugin.</b> In Stellarium, open the Configuration window and select the Plugins tab. One of the plugins should be titled "Oculars." Feel free to email a thank you note to its author, Timothy Reaves. Down at Options, click "Load at startup," then click "Configure"</li>
<li><b>Add your telescope. </b> Click the Telescopes tab. You will see a couple of predefined telescopes. Click the Add button. You'll see a new entry called "My Telescope." Change its name to something you might prefer, and then enter its focal length and diameter. For my telescope, the focal length is 400, and diameter is 100. My particular telescope is a reflector, so I need to click "Horizontal Flip" and "Vertical Flip" so the image Stellarium presents is like what I'll actually see.</li>
<li><b>Add your eyepieces.</b> Click the Eyepieces tab. Click the Add button. You'll see a new entry called "My Ocular." Change its name so something you'd prefer, like perhaps "Orion 10mm". Enter the parameters you found for the ocular, ie, the aFOV and focal length.</li>
<li><b>Test.</b> Click on any particular target in the sky, then select Ocular View (Ctrl-O [O as in Ocular]). Once in Ocular View, to select your particular telescope, click Alt-O, scroll to "Select telescope," and select the telescope you want to use. Do the same for the ocular. What you see in now should be pretty much like what you see with this particular telescope/eyepiece combination outside. Stellarium will also show the view parameters in the upper left of the screen.</li>
</ol>
</div>
<div>
<br /></div>
<div>
I use Stellarium configured for my telescope to help me plan star-hopping to various targets. I can "aim" Stellarium at my starting point, then switch to ocular mode, then along with a star atlas star-hop to my target location. Knowing what my waypoints will look like in Stellarium helps me know what they are going to look like through the telescope outside. And I can stargaze anytime I want, even on a cloudy night.</div>
</div>
brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-78037513141914437502012-08-13T14:38:00.000-07:002012-08-13T14:38:59.290-07:00Adobe Flash WoesMy wife's computer recently started giving her grief. The browser had started to report that "the plugin could not be loaded" on Flash-using sites (ie, Facebook, and most of our 8-year-old daughter's play sites). It is a somewhat elderly machine (AMD Athlon XP 2600+), but it had been running Ubuntu 10.04 LTS (Lynx) nicely for quite some time. I've used Firefox for years, and that was the browser running on that machine too.<br />
<br />
I had heard said that Adobe was no longer going to provide Flash for Linux (outside of Chrome), and so I thought I'd try two Flash alternatives: Lightspark and Gnash. The very nice Flash-Aid Firefox plugin made this attempt very straightfoward. However, although the plugins loaded and reported their version numbers to Adobe's test site (http://www.adobe.com/software/flash/about), Facebook said I needed to upgrade the plugin. So the latest Adobe plugin didn't work, and the alternatives worked, but they were too far back.<br />
<br />
Let's try a new browser. I read that Google Chrome had "integrated" Flash support, so I thought I could just download and go. So I downloaded Chrome, but the flash plugin still would not run.<br />
<br />
Sigh. I suppose it's time to upgrade the OS. I had gotten out of the habit of upgrading that particular machine because,<br />
<br />
1. If it ain't broke don't fix it,<br />
2. I had had a pretty messy upgrade experience once with that particular machine.<br />
3. And now that I was several revs back, I'd have to step through each new version to get up-to-date.<br />
<br />
So after each version upgrade, I'd try Firefox and Chrome (and Chromium too) to see whether Flash sites would load. 10.10 -- Nope. 11.04 -- Nope. 11.10 -- Nope.<br />
<br />
I started to wonder whether I had some kind of incompatibility with my card (an old nVidia GeForce 5200 [I <i>told</i> you this machine was old]) and Flash. I saw references to weird behavior (like the Smurf effect), but none of the fixes for those issues addressed the problem I was having.<br />
<br />
In one of the debian forums, there's a thread titled "New Bug: Google Chrome - Couldn't initliaze plug-in" The originator was describing something very similar to what I'm experiencing. The hero of that post asked whether his CPU supported SSE2 instructions. Sure enough<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">cat /proc/cpuinfo | grep flags </span><br />
<br />
implied that my CPU doesn't. The poster also said he thought the 11.1.102.63 didn't have the problem which was affecting the latest version.
I downloaded the archive, pulled out libflashplayer.so, and put it into /opt/google/chrome/plugins.<br />
<br />
That solved the problem!
brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-31122912286712086842012-03-20T16:29:00.003-07:002012-03-20T16:42:46.203-07:00Customer Service Patterns II've written a few times about customer service experiences, several great experiences (the "I Appreciate..." series), and one particularly bad one (the "<a href="http://brismith66.blogspot.com/2011/11/fighting-expedia-conclusion.html">Fighting Expedia</a>" series). I've been thinking about what made the great ones great and the lousy one, well, lousy.<br /><br />In the good experiences, the companies would do things they didn't <font style="font-style:italic;">have</font> to do, while in the bad experience, the company went out of its way to avoid doing what it said it was going to do.<br /><br /><ul><li>D'Addario could've said "here's your missing A string;" <a href="http://brismith66.blogspot.com/2012/03/i-appreciate-what-daddario-did-for-me.html">instead</a> they sent me two new sets.</li><li>GSI Outdoors could've said "tough luck on the broken lid," <a href="http://brismith66.blogspot.com/2011/11/i-appreciate-what-gsi-did-for-me.html">instead</a> they sent me a new lid for free.</li><li>KBC could've said "that'll be 15 bucks for the new plate," <a href="http://brismith66.blogspot.com/2011/04/i-appreciate-what-kbc-did-for-me.html">instead</a> they sent me a new helmet plate for free.</li></ul><br />In each of these cases I wouldn't have been disappointed with the companies if they did their minimum, because they were not obliged to do anything more than that. What made the experience great (and memorable) was that they did more than they had to.<br /><br />Expedia, though, said "book this trip, and we'll send you a gift card." (They didn't <font style="font-style:italic;">have</font> to offer the card.) But after we booked the travel, they made claiming the offer a frustratingly difficult and exasperating experience. (And memorable too, in its own way.)<br /><br />Of course, with effort we can think of adequately satisfactory customer service experiences in which a company would do what it said it was going to do to resolve an issue. Satisfactory, if unremarkable.<br /><br />The good companies did what they did not have to do.<br />The adequate companies did only what they had to do.<br />The lousy company resisted doing what it said it was going to do.<br /><br />What have you noticed about good and bad customer service?brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-51286011124238266192012-03-17T10:00:00.001-07:002012-03-17T10:00:43.303-07:00I appreciate what D'Addario did for meI play classical guitar. I really enjoy it; it's my golf. <br /><br />I go through a set of strings several times a year, and I always use D'Addario Pro-Arte strings: they play nicely on my Alhambra 6P. <br /><br />Something unusual happened at last string change: the set I bought had two Ds, but no A. I took a picture and posted a tweet about it, then ran out to the music store to buy another set. <br /><br />When I got home, there was a reply from D'Addario offering to send two new sets of strings. I gave them my address, and they shipped them to me.<br /><br />Thanks D'Addario! I appreciate it.brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-7712753101800579132011-11-30T17:26:00.000-08:002011-11-30T17:51:26.402-08:00Fighting Expedia, The Conclusion<span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-family:Arial;font-size:100%;" ><div>Well it finally arrived.</div><div><br /></div><div>After four months, after being told</div><ul><li>You have to follow a link (which didn't exist) on a web page</li><li>Your trip actually didn't qualify for the offer</li><li>Please hold, your call is very importa... click</li><li>Our offices are closed (in the middle of a weekday afternoon)</li><li>It's not our fault; it's the card handler's fault</li></ul><div>the card finally arrived. </div><div><br /></div><div>I think I'm going to go buy a bottle of Advil.</div></span><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8bqEwFiz3jsoghzhgTq5fBv-ucbMtMzwEtYqNUbRNWu6SFWzBoJEyK1J9wlSGdwm46fHIXx13EG9lCi9cgv3DYnhNRcfmG9PIXlwTjbYzc3UZ4BpHbEgM5xmnmnB4Xa5MHLxveupKkhDq/s1600/card.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 131px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8bqEwFiz3jsoghzhgTq5fBv-ucbMtMzwEtYqNUbRNWu6SFWzBoJEyK1J9wlSGdwm46fHIXx13EG9lCi9cgv3DYnhNRcfmG9PIXlwTjbYzc3UZ4BpHbEgM5xmnmnB4Xa5MHLxveupKkhDq/s320/card.jpg" alt="" id="BLOGGER_PHOTO_ID_5680971307925415714" border="0" /></a>brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-79082984105059307642011-11-10T17:53:00.000-08:002011-11-10T18:10:01.431-08:00I Appreciate What GSI Did For MeThis is something that happened a little while ago, and I've been meaning to tell you about it. Here goes.<br /><br />You know I really enjoy coffee. All kinds. I've had French Press coffee before, but didn't have a press to do it myself.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigTnkTZ56b9b6-zvSxkH791bFEXmISIT2tMiLVOv4bgpqtQppMM-IuH4RwsG9khjIJZ6h-6-bToYQVL-1DbaeuRxAGfw9O8uguGgd6PLt6eQTNF6t-aaUWAd0Cp0wFK5KUcQH3ykHAHHYD/s1600/GSI0033.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigTnkTZ56b9b6-zvSxkH791bFEXmISIT2tMiLVOv4bgpqtQppMM-IuH4RwsG9khjIJZ6h-6-bToYQVL-1DbaeuRxAGfw9O8uguGgd6PLt6eQTNF6t-aaUWAd0Cp0wFK5KUcQH3ykHAHHYD/s320/GSI0033.jpg" alt="" id="BLOGGER_PHOTO_ID_5673552682217315090" border="0" /></a><br />We were at <a href="http://www.mastgeneralstore.com/">Mast General Store</a> and in their camping section I found <span class="blsp-spelling-error" id="SPELLING_ERROR_0">Lexan</span> presses by<a href="http://www.gsioutdoors.com/"> <span class="blsp-spelling-error" id="SPELLING_ERROR_1">GSI</span> Outdoors</a>. I liked the idea of a shatter-resistant carafe, instead of glass (I've gone through numerous glass espresso carafes). So I bought the press. Works great, good coffee.<br /><br />Not long after I bought it, I broke the lid. Sigh. I wrote the company, asking whether I could buy a new lid. They wrote back, and said all I had to do was call them, and they'd send me a new lid. So I did, and they did too.<br /><br />Thanks <span class="blsp-spelling-error" id="SPELLING_ERROR_2">GSI</span>! I appreciate it.brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-42087591087100778592011-11-09T11:02:00.000-08:002011-11-09T20:17:00.534-08:00Fighting Expedia, Chapter 2Well I wish I had something better to report. Right after I posted the last installment, I got a Twitter message from @Expedia, saying "sorry to hear you're having problems, please give us a call." I spoke again with Corey, and he again apologized, asked me to be patient, blamed various system failures, etc. I told him I'd wait to see what shakes out from BBB.<br /><br />On October 8, two weeks after I filed the complaint from BBB, I got a response from Expedia through BBB, the essence of which was, sorry for the trouble, please be patient, it's not our fault, etc. I was particularly irritated by Expedia's statement: "If the card has not been received within the next two weeks then we may visit other options for this customer but we must have proof that the customer has not received the promotional item at that time."<br /><br />BBB asked whether I was satisfied with their response and wanted to close the case (Seriously?) I said "No," because Expedia hadn't actually done anything. I think the case should be closed when they do what they had promised.<br /><br />On October 18, I got an email from Expedia saying that the card was on its way!<br /><br />Perhaps it's a good idea that I didn't hold my breath, because as of yesterday, November 8, the card hasn't arrived.<br /><br />On November 1 I checked the status of the case and saw I had gotten a response (tagged "FINAL RESPONSE FROM BUSINESS") to my rejecting their earlier response (from October 8). It said they were sorry that I declined their earlier response, and they said the gift card was "resubmitted" on October 17. And because they're sorry for the inconvenience, they were giving me a $50 coupon to be used for future travel booked through Expedia. All I'd have to do is create an account with them (I used a guest account for the July trip), then call one of their reps with my case number to apply the coupon to my account.<br /><br />Right.<br /><br />BBB asked whether I was satisfied, and I replied "No," saying that all I want is the gift card, the coupon is worthless, and considering all the grief this has been ("your trip doesn't qualify," "you didn't click the [non-existent] link," "we're closed," on hold until disconnected, etc) I just would rather not do business with them at all. <span style="font-weight: bold;">There are plenty of other ways to book travel.<br /><br /></span>The moment the card arrives, I'd be happy to consider the case resolved.<br /><br />Imagine my surprise when I later log in to BBB to view the case, and find its status is "Closed."<br /><blockquote><br /><span style="font-family:arial;"><span style="font-weight: bold;">11/01/2011 JAF BBB</span> BBB judged complaint addressed</span><br /><span style="font-family:arial;"><span style="font-weight: bold;">11/01/2011 Otto BBB</span> Inform Consumer - Case Closed AJR</span><br /><span style="font-family:arial;"><span style="font-weight: bold;">11/01/2011 Otto BBB</span> Inform Business - Case Closed AJR</span><br /><span style="font-family:arial;"><span style="font-weight: bold;">11/01/2011 Otto BBB</span> Case Closed AJR</span></blockquote><br />So I sent BBB a note asking "what gives?" I would have expected that the case would stay open until the case was actually resolved ie, that Expedia had done what they said they would do). BBB replied saying that they don't just hold cases open, but they said I could open another case if the card doesn't come. Thanks, BBB.<br /><br />So after a month or so of trying to go the BBB route, BBB has not been a whole lot of help resolving the issue, and the card hasn't arrived.brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-27767021953166556022011-09-29T16:33:00.000-07:002011-09-29T17:14:06.348-07:00Fighting Expedia<span style="color: rgb(0, 0, 0);font-size:130%;" ><span style="font-family:times new roman;">Retailers often entice customers into a purchasing decision by offering a rebate, bonus, or other type of promotion. The retailer expects, however, that a portion of their customers will not follow through on claiming the rebate. There's even a term for it: "breakage."</span><br /><br /><span style="font-family:times new roman;">Back in July my wife and I made a reservation through Expedia for a stay in St Petersburg, Florida. We had a great time, no problem there. When we made the reservation, however, Expedia had an offer for a $50 Gas Card on completion of the stay. We thought, "That's nice, it'll help cover the cost of the gas to get there."<br /></span><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" style="font-family: times new roman;" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcoLWaPAd6Bt0sabhJRb_38DD9vH5vE3BpALTQkXoFIaQBYM5IO2GVMuNjGd_O3xFqjBO2SM0OAlWTfPGLUdd9yHccbfS2hQe9IyqSgedNhMxFBf2-NvdbvIY-42gE_-79ksD38UsclGkH/s1600/expextra.jpg"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 288px; height: 227px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcoLWaPAd6Bt0sabhJRb_38DD9vH5vE3BpALTQkXoFIaQBYM5IO2GVMuNjGd_O3xFqjBO2SM0OAlWTfPGLUdd9yHccbfS2hQe9IyqSgedNhMxFBf2-NvdbvIY-42gE_-79ksD38UsclGkH/s320/expextra.jpg" alt="" id="BLOGGER_PHOTO_ID_5657932058559176338" border="0" /></a></span><span style="color: rgb(0, 0, 0);font-size:130%;" ><br /><br /><span style="font-family:times new roman;">When we got back home, we went to the Expedia site to find out how to claim the $50 gas card. Their emailed response to our inquiry told us to follow a link, which actually did not exist. So when I called their customer support line, I was informed that our trip did not qualify for the $50 gift card. I pointed out that it did, and the rep forwarded me up the chain. That next rep dropped my call. I was sitting at the computer while on hold, and I posted a tweet: something like "I'm having a hard time solving a problem with @expedia" (I had later deleted the post). Very soon after that I got a message inviting me to call them, and they actually gave my wife a phone call about the issue. I called Expedia back and spoke at length with one of their reps, who apologized profusely and blamed various system failures, and promised that we'd receive the gas card within the next week or two (the itinerary status screen said the estimated delivery was 8/26). About this time (August 2) I made a post saying that I was happy with how Expedia was helping to solve the problem, and deleted the earlier post about the original issue. (I've not deleted the happy post: it's shown below.)<br /></span><br /><a style="font-family: times new roman;" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9rUL_i2m8Md_al6b_64Vi0SW6GeizYC8BY35JOLp-32tAPNIPm06LX89JMNL8XIR33x3VVEGcYr0D556sOH9yihpdXklsCxSP7P9Oz3QSpP04wHvKn8STvVkDpoIBVSSa6ktNr7U2jiI0/s1600/happytweet.jpg"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 58px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9rUL_i2m8Md_al6b_64Vi0SW6GeizYC8BY35JOLp-32tAPNIPm06LX89JMNL8XIR33x3VVEGcYr0D556sOH9yihpdXklsCxSP7P9Oz3QSpP04wHvKn8STvVkDpoIBVSSa6ktNr7U2jiI0/s320/happytweet.jpg" alt="" id="BLOGGER_PHOTO_ID_5657934726147102498" border="0" /></a></span><span style="color: rgb(0, 0, 0);font-size:130%;" ><br /><br /><span style="font-family:times new roman;">Fast forward to today, about a month past the delivery date. There's no sign of the gas card. I called Expedia, trying to contact the same rep I had spoken with two months prior, but instead the operator sent me to their "Tier 3 Service Department". After a few minutes on hold, a message on an answering machine informed me that their offices were closed (it was 3PM Eastern), and told me to leave a message. So I did. I gave them my name, itinerary number, and phone number. </span><br /><br /><span style="font-family:times new roman;">It started to seem to me that they were not going to fulfill the offer, and there was nothing I could do about it. </span><br /><br /><span style="font-family:times new roman;">Except complain. And I generally don't like complaining.</span><br /><br /><span style="font-family:times new roman;">First stop: Google. A search for "expedia gas card problem" will show you a lot of people have similar issues. </span><br /><br /><span style="font-family:times new roman;">Next stop, the Better Business Bureau. I was very surprised to find the BBB gives them an A+ rating. Wow. How'd they manage that? Anyway I filed a complaint, and I got a message back from BBB saying they've forwarded the issue to Expedia. I should hear something by middle of next month.</span><br /><br /><span style="font-family:times new roman;">One of the things the BBB complaint asked for was what did I want Expedia to do. My response was basically, just honor the gas card like they said they would. But I still hate all the aggravation they have caused. What should they do to make that right?</span><br /><br /><span style="font-family:times new roman;">Takeaways: </span><br /><span style="font-family:times new roman;">1. Try not to let the promise of a Free __________ unduly influence a purchase decision. Have you ever noticed how tough it can be to claim a rebate? To use those frequent flier miles?</span><br /><span style="font-family:times new roman;">2. Try to be reasonable; try to be patient.</span><br /><span style="font-family:times new roman;">3. Don't be afraid to involve the BBB, especially dealing with a BBB accredited business.</span><br /><span style="font-family:times new roman;">4. You have more influence than you think you do.</span></span>brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-21724227899683598402011-06-07T18:12:00.000-07:002011-06-07T18:17:31.159-07:00Let's Reduce Teen Unemployment<a href="http://www.cbsnews.com/stories/2011/06/04/eveningnews/main20069017.shtml">Unemployment among teens is 24%</a>.<br /><br />Let's reduce teen unemployment. Here are a couple of thought experiments, and then a suggestion.<br /><br />1. Pretend you are holding a garage sale this Saturday. You've got a lot of stuff to get rid of, and so you decide to make things simple on your neighbors, you will price each individual item at $10. At the end of the sale, you might have $20-$30, and a ton of your unsold stuff.<br /><br />2. Pretend that all the gas stations in your state decide to sell gasoline at $10 per gallon. What will happen is that everybody is going to complain, some people will drive across the border to get to cheaper gas, some people won't drive at all, and a few desperate souls will endure the new expense. The gas stations, though, will find they aren't selling much gas anymore.<br /><br />Price floors create surplus.<br /><br />A minimum wage law is a price floor for workers. A minimum wage law is going to create surplus workers, that is, unemployment.<br /><br />What if the minimum wage law were only to apply to workers over 21 years old? What if an employer were free to pay a teenaged worker a minimum of say 75% of minimum wage? (I'm suggesting a minimum, not a maximum wage.) What would happen to teen unemployment? My guess is teen unemployment would drop like a rock.brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-683972969424770952011-05-30T12:14:00.000-07:002012-10-10T05:47:20.549-07:00iPhone Development: Accessing SOAP Services with WSDL2ObjC Part IIIHas it been that long? My how time flies. Last time I wrote about WSDL2ObjC, we built a program which used a SOAP service to return us a barcode image. This time we're going to look at asynchronous calls, and we're going to build a small app which tells us what the current weather conditions are for a particular ZIP code.<br />
<br />
Asynchronous calls are nice because we don't have to wait for them to complete. We issue the call, and then continue with whatever task we were performing. If we make a call from the same code that handles our user interface, our UI does not hang while we are waiting for completion of the call. I'm going to start this tutorial from scratch; I don't assume that you have gone through the <a href="http://brismith66.blogspot.com/2010/05/iphone-development-accesing-soap.html">first</a> or <a href="http://http//brismith66.blogspot.com/2010/07/iphone-development-accessing-soap.html">second</a> tutorials. But you can go through them, if you'd like.<br />
<br />
A silver lining to the fact it has taken me so long to get to this third tutorial is that I will be using Apple's [relatively] new Xcode 4 to write the app.<br />
<br />
Here's what we need:<br />
<ul>
<li><a href="http://code.google.com/p/wsdl2objc/">WSDL2ObjC</a> I'm using WSDL2ObjC-0.7-pre1.zip for this tutorial. You can get this from the project's home page.</li>
<li>A web service to consume. We're going to use the "Weather" service (http://wsf.cdyne.com/WeatherWS/Weather.asmx) which will, given a zip code, provide the local weather conditions for that zip code. </li>
</ul>
Let's go.<br />
<br />
<span style="font-weight: bold;">1. Generate the code stubs with WSDL2ObjC.</span><br />
Start WSDL2ObjC. In the first field, enter the name of the source WSDL. You can specify a local file, or a web address. For this demo, enter <span style="font-weight: bold;">http://wsf.cdyne.com/WeatherWS/Weather.asmx?wsdl</span><br />
In the second field, specify a directory on your machine into which WSDL2ObjC will write the new code. When you click "Parse WSDL", you will see a few messages, one of which should say that it is generating Objective C code into the output directory. Check the target directory to make sure your files are there.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgox59WGOy-ge3Ma8_MKjNje1LIZ9JO0b0tmuqHNw0KSljQ-H9M0r2NzMyPcDD81jGda4YG65Yibs26NbC-p8oF2LYDyiekg4_4oFUyEKkNMPzxG2sLJz2RDGJRHHeVJp5ZUE1qzxp9cQ7p/s1600/Screen+shot+2011-05-18+at+4.58.56+PM.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5612596041868236434" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgox59WGOy-ge3Ma8_MKjNje1LIZ9JO0b0tmuqHNw0KSljQ-H9M0r2NzMyPcDD81jGda4YG65Yibs26NbC-p8oF2LYDyiekg4_4oFUyEKkNMPzxG2sLJz2RDGJRHHeVJp5ZUE1qzxp9cQ7p/s320/Screen+shot+2011-05-18+at+4.58.56+PM.png" style="cursor: pointer; display: block; height: 146px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
<span style="font-weight: bold;">2. Create the project in Xcode.</span><br />
Start Xcode and create a new View-based application. Call it anything you would like. In the .h file for the controller, add an action method called <span style="font-style: italic;">query</span>, and several UITextField outlets for the fields we're going to use: zip, city, conditions, temp, humidity, and wind.<br />
<br />
While our app is making the SOAP call, we are going to start up a UIActivityIndicatorView and tell it to spin, and when the call has completed, we're going to stop the spinner. Add another outlet called spinner, and it's of type UIActivityIndicatorView. Your .h file should look something like this:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>
@interface SoapWeatherViewController : UIViewController <WeatherSoapBindingResponseDelegate>
{
UITextField *zip;
UITextField *city;
UITextField *conditions;
UITextField *temp;
UITextField *humidity;
UITextField *wind;
UIActivityIndicatorView *spinner;
}
@property (nonatomic, retain) IBOutlet UITextField *zip;
@property (nonatomic, retain) IBOutlet UITextField *city;
@property (nonatomic, retain) IBOutlet UITextField *conditions;
@property (nonatomic, retain) IBOutlet UITextField *temp;
@property (nonatomic, retain) IBOutlet UITextField *humidity;
@property (nonatomic, retain) IBOutlet UITextField *wind;
@property (nonatomic, retain) IBOutlet UIActivityIndicatorView *spinner;
-(IBAction)query;
@end</code></pre>
<br />
<br />
Because we want our class informed when our SOAP call completes, we are going to designate it as being the delegate for the call, so we want it to implement the WeatherSoapBindingResponseDelegate protocol.<br />
<br />
Now in the .m file, add lines to @synthesize our IBOutlets, and make sure you dealloc the UITextFields and UIActivityIndicatorView in dealloc.<br />
<br />
Let's write the query method. This is the event that will occur when we click the "What's it like" button in the app. Let's just write boilerplate for the moment:<br />
<br />
<span style="font-size: 85%;"><span style="font-family: courier new;">-(void)query { }</span></span><br />
<br />
<span style="font-weight: bold;">3. Build the UI</span><br />
Double-click the XIB file for your controller to load it into Interface Builder. You will want to add a button to the NIB; title it "What's it like?" and wire its Touch Up Inside event to the query action. Add several UITextFields and labels, and connect all the outlets. And finally, add an Activity Indicator View.<br />
<br />
It should look something like this when you're finished:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbQ8aXjPc59PVuLImz3PFj0h3G-xo5P0V_fJutzHkFEzz2b2459lWDqoCK8A8mvJ46CBvup6uIeXfK4FDRW_ZEkFz0F7s1EU5FTP9tWhCuVGPJsgirH1_9bKucr4PBb0mxIXwgZBYpC1Ca/s1600/Screen+shot+2011-05-30+at+4.02.40+PM.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5612602791572979282" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbQ8aXjPc59PVuLImz3PFj0h3G-xo5P0V_fJutzHkFEzz2b2459lWDqoCK8A8mvJ46CBvup6uIeXfK4FDRW_ZEkFz0F7s1EU5FTP9tWhCuVGPJsgirH1_9bKucr4PBb0mxIXwgZBYpC1Ca/s320/Screen+shot+2011-05-30+at+4.02.40+PM.png" style="cursor: pointer; display: block; height: 202px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
<span style="font-size: 100%;"><span style="font-weight: bold;">4. Pull in the WSDL2ObjC generated code.</span><br />Let's pull in the code WSDL2ObjC wrote for us. In "Other Sources," add a new group named "Weather". With Finder, drag all the files that WSDL2ObjC created into the new group. Tell Xcode to copy the items into the destination folder.<br /><br />Take a look at Weather.h. There's a ton of stuff in there: definitions for bindings, responses, requests, etc. This code represents the data that WSDL2ObjC pulled out of Weather's WSDL.</span><span style="font-size: 100%;">Before compiling, we have to do two things to our build target: Double click on the project name to bring up the build settings.</span><br />
<ul>
<li><span style="font-size: 100%;">In the Other Linker Flags section, add<span style="font-weight: bold;"> -lxml2 </span>to the Linker Flags.</span></li>
<li><span style="font-size: 100%;">In the Other C Flags section, add <span style="font-weight: bold;">-I/usr/include/libxml2 </span></span></li>
</ul>
<br />
<span style="font-weight: bold;">5. Write</span><br />
Time to write some code. Open the .m for your controller, and #import "Weather.h". Now let's write our query method:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>-(void)query
{
[zip resignFirstResponder];
WeatherSoapBinding *binding = [[Weather WeatherSoapBinding] initWithAddress:@"http://wsf.cdyne.com/WeatherWS/Weather.asmx"];
binding.logXMLInOut = YES;
Weather_GetCityWeatherByZIP *parms = [[Weather_GetCityWeatherByZIP alloc] init];
parms.ZIP = self.zip.text;
[binding GetCityWeatherByZIPAsyncUsingParameters:parms delegate:self];
[spinner startAnimating];
[parms release];
}
</code></pre>
<br />
<span style="font-size: 85%;"></span><span style="font-size: 85%;"><br /></span>Zip calls resignFirstResponder so the keyboard will go away. We then create a binding and associate it with our service endpoint. We then create a request, fill in the blanks, then call the service.<br />
<br />
The point of an asynchronous call is that we don't have to wait for it to finish. We don't have to halt our user interface, we can carry on with other tasks, etc. But we <span style="font-style: italic;">do </span>have to tell the binding what to do when the call is finished. We give it an object which implements the WeatherSoapBindingResponseDelegate protocol (which conveniently is the controller itself [see the .h file]).<br />
<br />
Declaring the controller as something which implements WeatherSoapBindignResponseDelegate means we have to write code for that method. Here it is<br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>#pragma mark -
#pragma mark WeatherSoapBindingResponseDelegate methods
- (void) operation:(WeatherSoapBindingOperation *)operation completedWithResponse:(WeatherSoapBindingResponse *)response
{
[NSThread sleepForTimeInterval:5.0];
// step 1 fill in the blanks.
for (id mine in response.bodyParts)
{
if ([mine isKindOfClass:[Weather_GetCityWeatherByZIPResponse class]])
{
self.city.text = [[mine GetCityWeatherByZIPResult] WeatherStationCity];
self.conditions.text = [[mine GetCityWeatherByZIPResult] Description];
self.temp.text = [[mine GetCityWeatherByZIPResult] Temperature];
self.humidity.text = [[mine GetCityWeatherByZIPResult] RelativeHumidity];
self.wind.text = [[mine GetCityWeatherByZIPResult] Wind];
}
}
// step 2 shut off the activity indicator, because we're done!
[spinner stopAnimating];
}
</code></pre>
<br />
When the call completes this method is called. We sleep for five seconds (to enjoy watching the spinner), then fill in the blanks with the results of our query. Finally, we stop the activity indicator.<br />
<br />
<span style="font-weight: bold;">6. Run.</span><br />
Save everything. Build and run the application. Enter your zip code into the field, then click "What's it like." You should see the spinner start spinning:<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ9urmae-AJ1gV3vvLiliGE4oF4tTgYAGPCFgkoGJ7pJ53Q0EB3bH-VejoMTlhufkSRYXtbFi_GKIFhnOM_YmmzNAk_rfyR9ZyOmlKzV-nWBQfgJ7lqsRBhw5nIrIonADq4ZrpQ6gFGqJ3/s1600/Screen+shot+2011-05-18+at+8.02.57+PM.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5612601030915795234" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ9urmae-AJ1gV3vvLiliGE4oF4tTgYAGPCFgkoGJ7pJ53Q0EB3bH-VejoMTlhufkSRYXtbFi_GKIFhnOM_YmmzNAk_rfyR9ZyOmlKzV-nWBQfgJ7lqsRBhw5nIrIonADq4ZrpQ6gFGqJ3/s320/Screen+shot+2011-05-18+at+8.02.57+PM.png" style="cursor: pointer; display: block; height: 320px; margin: 0px auto 10px; text-align: center; width: 170px;" /></a><br />
After about five seconds, you should see the weather for that location:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjY3wSS6hn8z5xRNqKN7j1HkT67mvZ1VVcx1cGepona4nkVwaXQDKAgzx8RgRjGdkNWjGgeCYebUORuSbbIRLLbFB-WGFjv0ZOxbgl8U7FeGUbOg0RhFaYGQMtqzSI5hO9X6W9xOFyMJmpI/s1600/Screen+shot+2011-05-30+at+4.38.17+PM.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5612611821593899586" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjY3wSS6hn8z5xRNqKN7j1HkT67mvZ1VVcx1cGepona4nkVwaXQDKAgzx8RgRjGdkNWjGgeCYebUORuSbbIRLLbFB-WGFjv0ZOxbgl8U7FeGUbOg0RhFaYGQMtqzSI5hO9X6W9xOFyMJmpI/s320/Screen+shot+2011-05-30+at+4.38.17+PM.png" style="cursor: pointer; display: block; height: 320px; margin: 0px auto 10px; text-align: center; width: 170px;" /></a>It's about 90, with a gentle breeze at the moment. Great weather for a motorcycle ride!<br />
<br />
Hope this has been helpful; let me know what you think.brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com10tag:blogger.com,1999:blog-5993809922163266453.post-12426834880395293232011-04-18T19:49:00.000-07:002012-12-06T12:46:31.872-08:00I appreciate what KBC did for me<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh55sQhQYtf-oI_UjSgsHkPJkIudr2MH8PybE51JqgP2iuBX5W25D_MsQ4nrjxqHlpvDDX6OqU5U37MHZNkjOryZbVFcwmzhdT_wHRLM0ZymIwCmsNudxly01eCpk5mP6hyphenhyphen9v1CLCepEft/s1600/20110417202645.jpg"><img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 240px; height: 320px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh55sQhQYtf-oI_UjSgsHkPJkIudr2MH8PybE51JqgP2iuBX5W25D_MsQ4nrjxqHlpvDDX6OqU5U37MHZNkjOryZbVFcwmzhdT_wHRLM0ZymIwCmsNudxly01eCpk5mP6hyphenhyphen9v1CLCepEft/s320/20110417202645.jpg" alt="Maria models my VR-1" id="BLOGGER_PHOTO_ID_5597121797457455314" border="0" /></a><br />I really like my KBC VR-1 helmet. Very light and comfortable, it was a great purchase from my local bike shop. I <span style="font-style: italic;">never</span> ride without it. A few months ago my left base plate broke, so the visor would tend to fall off if I tried to open it. The bike shop didn't carry replacement plates for that helmet, and although I looked online for a replacement plate, I was unable to find one for that particular helmet. Replacement plates for other helmets ran about ten bucks, so I knew what I could expect to pay when I found one.<br /><br />So I wrote the company, asking them where I could get a plate. They said I could get one from KBC themselves, and they sent me a set for free. I received the new plates (they sent me one for each side) and now my helmet is as good as new.<br /><br />Thanks, KBC! I appreciate it very much.brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-9767670121105574432010-07-30T13:16:00.000-07:002012-10-10T05:47:01.651-07:00iPhone Development: Accessing SOAP Services with WSDL2ObjC Part IIIn my last post we built a basic exerciser for WSDL2ObjC. It's time to talk about complex SOAP data types. What we're going to do today is build a program which uses complex SOAP types. I'll start this tutorial from scratch, so you don't have to go through the<a href="http://brismith66.blogspot.com/2010/05/iphone-development-accesing-soap.html"> first tutorial</a> to get here.<br />
<br />
Here's what you need to get started:<br />
<ul>
<li><a href="http://code.google.com/p/wsdl2objc">WSDL2ObjC</a>. I'm going to use WSDL2Objc-0.7-pre1.zip for this tutorial. You can get this from the project's home page.</li>
</ul>
<ul>
<li>A web service to consume. For this tutorial, we'll use the "Barcode" service (http://www.webservicex.net/genericbarcode.asmx). This service will accept a complex SOAP datatype defining various options to generate a barcode, and will return data which represents the barcode image.</li>
</ul>
<br />
Let's go.<br />
<br />
<span style="font-weight: bold;">1. Generate the stubs with WSDL2Objc.</span><br />
Start WSDL2ObjC. In the first field, enter the name of the source WSDL. You can specify a local file, or a web address. For the barcode service, enter<span style="font-weight: bold;"> http://www.webservicex.net/genericbarcode.asmx?wsdl</span> In the second field, specify a directory into which WSDL2ObjC will create the new files. You can use the Browse button to specify a particular directory. When you click "Parse WSDL," you will see a few messages, one of which should say it is generating Objective C Code into the output directory. Check the target directory to make sure your files are there.<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1x09BndY8WVxZMzimEntB7NF11osI_jP18jY3sog_2u8sb3LtvGebtB6uEu3maa99YKVMaB6H-u6X6AAxs0c1LWw6KQsqFNnLZR4bL8xziqv0rD4rYdS1cLwvxV29mI7y-wt6611bWU0n/s1600/Screen+shot+2010-07-30+at+4.49.15+PM.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5499838936367558130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1x09BndY8WVxZMzimEntB7NF11osI_jP18jY3sog_2u8sb3LtvGebtB6uEu3maa99YKVMaB6H-u6X6AAxs0c1LWw6KQsqFNnLZR4bL8xziqv0rD4rYdS1cLwvxV29mI7y-wt6611bWU0n/s320/Screen+shot+2010-07-30+at+4.49.15+PM.png" style="cursor: pointer; display: block; height: 134px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><span style="font-weight: bold;">2. Create the project in Xcode.</span>Start Xcode and create a new View-based Application. Call it anything you'd like. In the .h file for the controller, add an action method called <span style="font-style: italic;">buttonPressed</span>, and then two outlets called <span style="font-style: italic;">dataToEncode</span> and <span style="font-style: italic;">barcodeImage</span>.<br />
<br />
<span style="font-size: 85%;"><span style="font-family: courier new;">... UIViewController {<br />UITextField *dataToEncode;<br />UIImageView *barcodeImage;<br />}<br /><br />@property (nonatomic, retain) IBOutlet UITextField *dataToEncode;<br />@property (nonatomic, retain) IBOutlet UIImageView *barcodeImage;<br /><br />-(IBAction)buttonPressed:(id)sender;</span></span><br />
<br />
In the .m, add the lines to @synthesize dataToEncode and barcodeData, then add the boilerplate for buttonpressed:<br />
<br />
<span style="font-size: 85%;"><span style="font-family: courier new;">-(IBAction)buttonPressed:(id)sender<br />{<br />}</span></span><br />
<br />
Save these files, then open the controller's NIB with Interface Builder. Place a text field and a button on the View. Call the button "Test" or whatever you want, place the field anywhere you want, and add "Data to encode" as a placeholder, if you want. Add a UIImageView. Mine looks like this:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ-qlV4tUW2D5gV4AfEv67P7hG_Kqmuk4uvXDL48ZlYUZRdvrNobXmnQ8RWbm3NuO-_yOETRM1HpVJ9XBY9C2j916pKvKNzFZS5ST92ExaNVvGV69mKQzWiLtIZpvN1g8ccbg-zewxnTHM/s1600/Screen+shot+2010-07-30+at+6.03.51+PM.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5499838945973279778" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ-qlV4tUW2D5gV4AfEv67P7hG_Kqmuk4uvXDL48ZlYUZRdvrNobXmnQ8RWbm3NuO-_yOETRM1HpVJ9XBY9C2j916pKvKNzFZS5ST92ExaNVvGV69mKQzWiLtIZpvN1g8ccbg-zewxnTHM/s320/Screen+shot+2010-07-30+at+6.03.51+PM.png" style="cursor: pointer; display: block; height: 320px; margin: 0px auto 10px; text-align: center; width: 213px;" /></a>Now hook the button's Touch Up Inside event to the buttonPressed action, and connect the dataToEncode outlet to the UITextField, and connect the barcodeImage outlet to the UIImageView. Save the file and close Interface Builder.<br />
<br />
Go ahead and build and run, just to make sure everything's OK so far. I expect everything to be OK, but it doesn't hurt to check.<br />
<br />
<span style="font-weight: bold;">3. Pull in the WSLD2ObjC generated code.</span><br />
Let's pull in the code WSDL2ObjC wrote for us: in the project add a new Group named "BarCode SOAP classes". With Finder, drag all the files that it created into the new group. Tell Xcode to copy the items into the destination folder.<br />
<br />
Take a look at Barcode.h. There's a ton of stuff here: definitions for bindings, responses, requests, etc. This code corresponds to the data that WSDL2ObjC pulled out of BarCode's WSDL.<br />
<br />
Before compiling from this point we have to do two things to our build target: open the Targets group, right-click your target, then select "Get Info," and then "Build." Do the following:<br />
<br />
<ul>
<li>In the Linking section, find "Other Linker Flags." Add the <span style="font-weight: bold;">-lxml2</span> to the Linker Flags.</li>
</ul>
<ul>
<li>In the GCC 4.2 - Code Generation section, find "Other C Flags." Add <span style="font-weight: bold;">-I/usr/include/libxml2</span> to Other C Flags.</li>
</ul>
<br />
<span style="font-weight: bold;">4. Write</span>.<br />
Let's write some code. Open the .m for your controller. #import "Barcode.h". Now let's write our buttonPressed method:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>
- (IBAction)buttonPressed:(id)sender
{
BarCodeSoapBinding *binding = [[BarCode BarCodeSoapBinding] initWithAddress:@"http://www.webservicex.net/genericbarcode.asmx"];
binding.logXMLInOut = YES;
BarCode_BarCodeData *params = [[BarCode_BarCodeData alloc] init];
params.Height = [NSNumber numberWithInt:125];
params.Width = [NSNumber numberWithInt:225];
params.Angle = [NSNumber numberWithInt:0];
params.Ratio = [NSNumber numberWithInt:5];
params.Module = [NSNumber numberWithInt:0];
params.Left = [NSNumber numberWithInt:25];
params.Top = [NSNumber numberWithInt:0];</code><code> </code><code>params.CheckSum = NO;</code><code> </code><code>params.FontName = @"Arial";</code><code> </code><code>params.BarColor = @"Black";</code><code> </code><code>params.BGColor = @"White";</code><code> </code><code>params.FontSize = [NSNumber numberWithFloat:10.0];</code><code> </code><code>params.barcodeOption = BarCode_BarcodeOption_Both;</code><code> </code><code>params.barcodeType = BarCode_BarcodeType_Code_2_5_interleaved;</code><code> </code><code>params.checkSumMethod = BarCode_CheckSumMethod_None;</code><code> </code><code>params.showTextPosition = BarCode_ShowTextPosition_BottomCenter;</code><code> </code><code>params.BarCodeImageFormat = BarCode_ImageFormats_PNG;
</code><code> </code><code>BarCode_GenerateBarCode *request = [[BarCode_GenerateBarCode alloc] init];</code><code> </code><code>request.BarCodeText = [dataToEncode text];</code><code> </code><code>request.BarCodeParam = params;
</code><code> </code><code>BarCodeSoapBindingResponse *resp = [binding GenerateBarCodeUsingParameters:request];</code><code> </code><code>for (id mine in resp.bodyParts)</code><code> </code><code>{</code><code> </code><code> </code><code>if ([mine isKindOfClass:[BarCode_GenerateBarCodeResponse class]])</code><code> </code><code> </code><code>{</code><code> </code><code> </code><code> </code><code>UIImage *barcode = [UIImage imageWithData:[mine GenerateBarCodeResult]];
</code><code> </code><code> </code><code> </code><code>[barcodeImage setImage:barcode];</code><code> </code><code> </code><code>}</code><code> </code><code>}
</code><code> </code><code>[request release];</code><code> </code><code>[params release];
}</code></pre>
<br />
We create a binding, then associate it with the Barcode Generator service endpoint. We then create a request, fill in the blanks, then call the service. The service returns a BarCodeSoapBindingResponse which we save in resp.<br />
<br />
Now about that request. If you look at the definition of BarCode_GenerateBarCode you'll see it has two parts: BarCodeText, a NSString representing the data to encode, and BarCodeParam, which is an object representing a set of parameters affecting the barcode I'm going to get. BarCodeParam covers things like dimensions of the image, the barcode symbology to use, etc. You can see how I set the parameters. Now how did I know what to set each to? In the WSDL definition you can see each element and its type, so I know which parameters need a number, which need a string, and so forth. If you look in Barcode.h that WSDL2ObjC generated, you will also find enum values for options like which barcode symbology to use, image format to return, etc.<br />
<div>
<div>
<br />
The response type has a field called <span style="font-style: italic;">bodyParts</span>. The code runs through bodyParts, looking for the response to the call. It then builds a UIImage based on the PNG data I asked for, and sets barcodeImage's data to that.<br />
<br />
<span style="font-weight: bold;">5. Run.</span><br />
Save everything. Under the Run menu, bring up the console, then build and run. Enter data into the field, then click the "Test" button. In the console, you should see the outbound request, and then the response. And in the simulator, of course, you should see your barcode.<br />
<br />
<a _pzdmykllumy="" aaaaaaaaadi="" angle="[NSNumber" barcode="[UIImage" barcode_barcodedata="" barcode_generatebarcode="" barcode_generatebarcoderesponse="" barcodeimage="" barcodeimageformat="BarCode_ImageFormats_PNG;" barcodeoption="BarCode_BarcodeOption_Both;" barcodeparam="params;" barcodesoapbindingresponse="" barcodetext="[dataToEncode" barcodetype="BarCode_BarcodeType_Code_2_5_interleaved;" barcolor="@"Black";" bgcolor="@"White";" checksum="NO;" checksummethod="BarCode_CheckSumMethod_None;" fontname="@"Arial";" fontsize="[NSNumber" for="" height="[NSNumber" href="http://4%2Ebp%2Eblogspot%2Eco%20-%20%28IBAction%29buttonPressed:%28id%29sender%20%7B%20BarCodeSoapBinding%20*binding%20%3D%20%5B%5BBarCode%20BarCodeSoapBinding%5D%20initWithAddress%3A@/" id="" if="" in="" left="[NSNumber" logxmlinout="YES;" m="" mine="" module="[NSNumber" net="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" params="[[BarCode_BarCodeData" ratio="[NSNumber" request="[[BarCode_GenerateBarCode" resp="[binding" s1600="" showtextposition="BarCode_ShowTextPosition_BottomCenter;" tfnaymlysqi="" top="[NSNumber" tqpaoiyjc="" uiimage="" width="[NSNumber"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5499838941692604674" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUYKSo-k5Z9NaXj3wcazpgCC1B39Ta3ctXgsVJQSfIb5lyVaflq8Ai7joildQ0_6WN_Ro2zpFh7BsdsG1r8s9uKIp2riqOG_2qrUThVVbsE-u-qwmZSCvbk0Z-h9X2BA7DNkwsla0YRFeH/s320/Screen+shot+2010-07-30+at+6.02.37+PM.png" style="cursor: pointer; display: block; height: 320px; margin: 0px auto 10px; text-align: center; width: 172px;" /></a><br />
And that's all there is to it. Next time, we'll talk about asynchronous calls.<br />
<br />
As always, let me know what you think.<br />
<br /></div>
</div>
brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com6tag:blogger.com,1999:blog-5993809922163266453.post-63331168282007608992010-05-05T10:07:00.000-07:002012-10-10T05:46:37.148-07:00iPhone Development: Accessing SOAP Services with WSDL2ObjCI needed to access a SOAP-based web service from the iPhone. There are a wide variety of opinions on how to go about this: "One word: Don't" was one poster's reply to a related question at <a href="http://stackoverflow.com/">Stackoverflow.com</a>. Some people suggest writing one's own routines, while others suggest trying various code-generating tools. One I found was called <a href="http://gsoap2.sourceforge.net/">gSoap</a>, but apparently there is a <a href="http://www.lasmanis.com/opensource/gsoap-on-iphone">fair amount of work yet to do</a> to get it working with the iPhone. I found <a href="http://code.google.com/p/wsdl2objc">wsdl2objc</a> which generates Objective-C code from a WSDL so you can call SOAP services. I want to show you how I used WSDL2ObjC to access a SOAP based web service.<br />
<br />
Here's what you need to get started:<br />
<ul>
<li>WSDL2ObjC. I'm going to use WSDL2ObjC-0.7-pre1.zip for this tutorial. You can get this from the project's home page.</li>
<li>A web service to consume. For this tutorial, we'll use the "LocalTime" service (http://www.ripedevelopment.com/webservices/LocalTime.asmx) which will, given a zip code, provide the local time for that zip code.</li>
</ul>
<br />
Let's go.<br />
<br />
<span style="font-weight: bold;">1. Generate the stubs with WSDL2ObjC.</span><br />
Start WSDL2ObjC. In the first field, enter the name of the source WSDL. You can specify a local file, or a web address. For here, enter <span style="font-weight: bold;">http://www.ripedevelopment.com/webservices/LocalTime.asmx?wsdl</span> In the second field, specify a directory in which WSDL2ObjC will create the new files. You can use the Browse button to specify a directory. When you click "Parse WSDL", you will see a few messages, one of which should say it is generating Objective C Code into the output directory. Check the target directory to make sure your files are there.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjox1ug5xzo1ehcqKH53dYl5ASEiPABBbXZ0FI15S8LfgDmbiLTHSdqBz3bEGbCKy9F_NqUY6vWDP9PN3ENBHJSeTBoloe8VuFsW5XpBAcU_lpKAWSG_7e5g7Fj3DbWHjnPyRpFJW10EOXR/s1600/w2objscreen.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5467837221346725106" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjox1ug5xzo1ehcqKH53dYl5ASEiPABBbXZ0FI15S8LfgDmbiLTHSdqBz3bEGbCKy9F_NqUY6vWDP9PN3ENBHJSeTBoloe8VuFsW5XpBAcU_lpKAWSG_7e5g7Fj3DbWHjnPyRpFJW10EOXR/s320/w2objscreen.png" style="cursor: pointer; display: block; height: 120px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a><br />
<span style="font-weight: bold;">2. Create the project in Xcode.</span><br />
Start Xcode and create a new View-based Application. Call it anything you want. In the .h for the controller, add an action method called <span style="font-style: italic;">buttonPressed</span>, and an outlet called <span style="font-style: italic;">field</span>:<br />
<span style="font-size: 85%;"><span style="font-family: courier new;"><br />... UIViewController {</span><br /><span style="font-family: courier new;"> UITextField *field;</span><br /><span style="font-family: courier new;">}</span><br /><br /><span style="font-family: courier new;">@property (nonatomic, retain) IBOutlet UITextField *field;</span><br /><span style="font-family: courier new;">- (IBAction)buttonPressed:(id)sender;</span><br /><span style="font-family: courier new;">@end</span></span><br />
In the .m, add the line to @synthesize field, then add boilerplate for buttonpressed:<br />
<span style="font-family: courier new; font-size: 85%;"><br />- (IBAction)buttonPressed:(id)sender<br />{<br />}</span><br />
<br />
Save these files, then open the controller's NIB file with Interface builder. Place a text field and a button on the View. Title the button "Test" or whatever you want; stretch the field out about 3/4 the way across the view. Here's what mine looks like:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGKwzKJ8PIbQ42-6Wk51kC6cf9tJpEgH2Xzzmyx7xtVOBnuULJ7djTCgD7BXVD3NpAmZD2U4XB5v9kF3w1mL07DzY1gXA6fKs5-7UZn8s5D7PG_z-EoIR19ZUEmeOROnFWnKvD647rdnxj/s1600/Screen+shot+2010-05-05+at+11.48.13+AM.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5467837366376513042" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGKwzKJ8PIbQ42-6Wk51kC6cf9tJpEgH2Xzzmyx7xtVOBnuULJ7djTCgD7BXVD3NpAmZD2U4XB5v9kF3w1mL07DzY1gXA6fKs5-7UZn8s5D7PG_z-EoIR19ZUEmeOROnFWnKvD647rdnxj/s320/Screen+shot+2010-05-05+at+11.48.13+AM.png" style="cursor: pointer; display: block; height: 320px; margin: 0px auto 10px; text-align: center; width: 206px;" /></a><br />
<br />
Now wire the button's Touch Up Inside event to the buttonPressed action, and connect the field's outlet to field. Save and close Interface Builder.<br />
<br />
Go ahead and build and run, just to make sure everything's OK so far. I expect it is, but it doesn't hurt to check.<br />
<br />
<span style="font-weight: bold;">3. Pull in the WSDL2ObjC generated code.</span><br />
Let's pull in the code WSDL2ObjC wrote for us: in "Other Sources," add a new Group named "LocalTime". With Finder, drag all the files that it created into the new group. Tell Xcode to copy the items into the destination folder.<br />
<br />
Take a look at LocalTime.h. There's a ton of stuff there: definitions for bindings, responses, requests, etc. This code corresponds to the data that WSDL2ObjC pulled out of LocalTime's WSDL.<br />
<br />
Before compiling from this point, <span style="font-style: italic;">make sure</span> you have followed the instructions in the wiki page UsageInstructions (ie, the linker flags properties and frameworks). You find UsageInstructions at the WSDL2ObjC project home page. Incidentally, the first character of the Other C Flags property is the capital letter I as in India. You're welcome.<br />
<br />
<span style="font-weight: bold;">4. Write.</span><br />
Let's write some code. Open the .m for your controller. First thing you need to do is #import "LocalTime.h" Now let's fill in the buttonPressed function. Here it is:<br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>
- (IBAction)buttonPressed:(id)sender {
LocalTimeSoapBinding *binding = [[LocalTime LocalTimeSoapBinding] initWithAddress:@"http://www.ripedevelopment.com/webservices/LocalTime.asmx"];
binding.logXMLInOut = YES; // to get logging to the console.
LocalTime_LocalTimeByZipCode *request = [[LocalTime_LocalTimeByZipCode alloc] init];
request.ZipCode = @"29687"; // insert your zip code here.
LocalTimeSoapBindingResponse *resp = [binding LocalTimeByZipCodeUsingParameters:request];
for (id mine in resp.bodyParts)
{
if ([mine isKindOfClass:[LocalTime_LocalTimeByZipCodeResponse class]])
{
field.text = [mine LocalTimeByZipCodeResult];
}
}
}</code></pre>
<br />
<br />
The first thing we do is create a binding, and associate it with ripedevelopment's web service endpoint. We then create a request object, fill in the blanks, and then call the service. The service returns a LocalTimeSoapBindingResponse, which we save in resp.<br />
<br />
LocalTimeSoapBindingResponse has a field called bodyParts. The code runs through bodyParts, looking for the response to the call. It then stores the result in the field for us to see.<br />
<br />
<span style="font-weight: bold;">5. Run.</span><br />
Save everything. Under the Run menu, bring up the Console, then build and run. Click the "Test" button on the Simulator. You should see the outbound request, a response of 200, then... Uh oh, "Unexpected response MIME type to SOAP call:text/xml"<br />
<br />
What we're going to do here is switch the MIME type from <span style="font-style: italic;">application/soap+xml</span> to <span style="font-style: italic;">text/xml</span>. You can use Xcode's search and replace; you should find four occurrences of <span style="font-style: italic;">application/soap+xml</span> Change them all to <span style="font-style: italic;">text/xml</span>.<br />
<br />
Now when you rerun the app, and click the "Test" button, you should see the messages in the console, and then you should see the date appear in the field.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjdgnroO_ygMQZCwrc6DDWYIq-l-rRocIGnNUUN7KUm3KtR4wH76aSn0Swh5EJDAY2r5gT60RJuTMolQc6HVUddnoOMSgS9ZplfMlq0ZqA7eDHpuhL_zUb0ZB0pw0ZtSpkxaeAJzfR0GRg/s1600/soapdone.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5467923033857750626" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjdgnroO_ygMQZCwrc6DDWYIq-l-rRocIGnNUUN7KUm3KtR4wH76aSn0Swh5EJDAY2r5gT60RJuTMolQc6HVUddnoOMSgS9ZplfMlq0ZqA7eDHpuhL_zUb0ZB0pw0ZtSpkxaeAJzfR0GRg/s320/soapdone.png" style="cursor: pointer; display: block; height: 320px; margin: 0px auto 10px; text-align: center; width: 166px;" /></a><br />
So there you have it. Now I know I didn't show how to make an asynchronous call, nor did I talk about complex types. That's what next time is for.<br />
<br />
Let me know what you think.brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com50tag:blogger.com,1999:blog-5993809922163266453.post-44869307719441930982010-04-14T16:34:00.000-07:002010-04-15T04:36:08.370-07:00Me and my cholesterolIn consideration of the hyperlitigiousness of many in our society, I am NOT suggesting that you or anyone else go fiddling with their blood chemistry outside of the close supervision of their doctor. My only intent in this particular post is to relate a personal anecdote.<br /><br /><a href="http://www.americanheart.org/presenter.jhtml?identifier=1516">Cholesterol</a> and <a href="http://www.americanheart.org/presenter.jhtml?identifier=4778">triglycerides</a> are fatty substances that exist in the body. They are used by the body for several vital functions: cell building, myelin-sheaths for your nerves, body metabolism, and so on. They're <span style="font-style: italic;">supposed</span> to be there.<br /><br />The problem is when there is too much there. In short, excess cholesterol and triglycerides make a mess of things, and can lead to heart attack and stroke. These fats come from two sources: the food we eat, and the body itself.<br /><br />Some of us, like well, me, tend to run high on these numbers, despite halfway decent eating habits. I knew I had a tendency to high cholesterol and high triglycerides on account of my parents. When my <span style="font-style: italic; font-weight: bold;">40-year-old</span> cousin suffered a stroke, I decided to get my blood checked. The results were not good:<br /><br />Total cholesterol: 212<br />HDL: 36<br />LDL: 121<br />Triglycerides: 311<br /><span style="display: block;" id="formatbar_Buttons"><span class="down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"></span></span><br />Yikes. Time to do something.<br /><br />I tend to be cautious of brand-name pharmaceuticals in general, especially heavily-marketed brand-name pharmaceuticals. If I had a chronic condition, I would prefer to try to control the condition with diet and exercise, then OTC offerings, then generic pharmaceuticals, then brand-name. (Perhaps I'll try to explain that in a blog post someday). I was doing most of the right things pertaining to diet and exercise. The doctor I had at the time (note on the past tense of the verb) said I basically didn't have much choice, and signed me up for a heavy dose of a particular prescription. I wasn't comfortable with this, and decided to see if there was something else I could do.<br /><br />I did a little digging and discovered research involving Niacin, and discovered it has been used for decades as a heart medication, and I also found studies examining its effects on hyperlipidemia. The studies I read referred to tests of dosages from 1500mg/day up to 3000mg/day, and so I figured if I tried it at 1000mg/day, I'd be below even the minimum dosage seen in the tests.<br /><br />I discovered that straight niacin causes a temporary, though unpleasant, reaction called "the flush" similar to a sunburn. I also found that "slo-release niacin" really wasn't recommended because of its effects on the liver. I found reference to "Inositol Hexanicotinate" (also called "No-flush") is a type of niacin which doesn't cause the flush, and doesn't irritate the liver. I found 500mg capsules at the local supermarket, and started taking one at breakfast, and one at dinner. <br /><br />I started going to a new doctor, and told him what I was up to. He sent me to get a blood profile to see how I was faring.<br /><br />Total cholesterol: 217<br />HDL: 52<br />LDL: 118<br />Triglycerides: 233.<br /><br />Nice. About a 40% increase in my HDL, and a 30% decrease in my triglycerides.<br /><br />I had my blood checked again a few months ago, and I'm still doing pretty good:<br /><br />Total: 197<br />HDL: 53<br />LDL: 102<br />Triglycerides: 210.<br /><br />The triglycerides could still spare to come down a couple of notches, but I'm working on that. <br /><br />I don't know why I feel compelled to tell you all about me and my cholesterol, but there you go.brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-63715107603188760772010-03-19T08:40:00.000-07:002010-03-19T08:43:13.486-07:00Church Life: Assembling or Shopping?Going to church this Sunday? Yeah? Good for you. Why are you going?<br /><br /><ul><li>To worship</li><li>To hear God's word preached</li><li>To see my friends</li><li>To hear some good music</li><li>To assemble, after all, Hebrews 10:25 says to not forsake assembling with each other.</li></ul><br />Assembling... Assembling...<br /><br />I think that for the most part, we don't assemble anymore. I think we shop. I think this because of the reasons one might hear from people who, instead of going to church, are leaving it.<br /><br /><ul><li>Doctrine is so dull.</li><li>Preaching is so dull.</li><li>The music is so dull.</li><li>I'm not being fed.</li><li>I can't thrive.</li><li>They don't have puppet shows for the kids.</li><li>I hate quail: it tastes like chicken.</li><li>Manna again? how boring, you'd think God could do something more spectacular than that.</li></ul><br />I think in large part we have no more commitment to our local church than we do to the place where we buy our milk and eggs: "I'm going to shop here today, and I'll leave the second I find a better deal, or something more convenient, or better customer service."<br /><br />Going to church this Sunday? Yeah? Good for you. Why are you going?brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-10164841803584693252010-02-10T16:31:00.000-08:002011-11-09T20:18:03.126-08:00Convenience: Fee vs Free<div id=":9u" class="ii gt" style="font-family:times new roman;"><div> <span style="font-size:100%;">My daughter's school bill was due. Ordinarily, my wife would drive over to campus and <span>drop </span>a check <span>off at </span>the business office. "Can't we pay it online?" she asked. "Don't see a reason why not," I said. So I went to the college website and followed the steps <span>for</span> paying a bill online. <span>Right u</span>p <span>to </span>the point when they said they were going to charge me $15.00 as a "convenience fee." <span style="font-style: italic;">That's</span> not very convenient.<br /><br /></span> <div> </div> <div><span style="font-size:100%;">What a stupid <span>idea</span>: "convenience fee."<br /><br /></span></div> <div> </div> <div><span style="font-size:100%;">Digressing for a moment, it reminds me of the time I was replacing something in my wife's car, which was supposed to be located in <span>what the manufacturer termed the </span>"convenience center." I envisioned a nice friendly little compartment, easily accessible, where I would be able to locate and replace the gadget in question. I turned out to be buried deep in the dashboard, behind various wires<span>, </span>levers<span>,</span> and other <span>junk</span>, and I about dislocated my arms trying to reach around everything to get to it. "Convenience Center." Hardy-<span class="blsp-spelling-error" id="SPELLING_ERROR_0">har</span>. Good one. I bet the engineers had a great laugh coming up with that name.<br /><br /></span></div> <div> </div> <div><span style="font-size:100%;">Anyway, not long after this (the convenience fee<span> episode</span>) I <span>saw an example of </span>real convenience, for free. I had a handful of Starbucks <span class="blsp-spelling-error" id="SPELLING_ERROR_1">giftcards</span> of varying amounts, most of which I had received as gifts from the recent holidays. I don't go to Starbucks all that often, so cards <span>can </span>wind up riding around in my wallet for months at a time. However, I do ordinarily go and register the cards at their website. Recently I noticed the website allows you to transfer balances from one card to another, so you can "roll" all your cards into one. "That's convenient, I wonder how much they charge you?" the cynic in me thought. Turns out, it's free. No charge. Glad we could help.<br /><br /></span></div> <div> </div> <div><span style="font-size:100%;">What a great idea<span>: Convenience. For Free.</span></span></div></div> </div>brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-46513404031771008612009-12-28T16:56:00.000-08:002010-06-03T06:31:43.181-07:00Fish, Birds, and GodFish. Cheap ones cost about a buck and a half at the local pet store. We bought three of them and a small aquarium earlier this year. They were ostensibly for our youngest daughter, so naturally their care and feeding fell upon me. I couldn't help being saddened the other day when I found one of them had died. I wanted to replace him, but not unless I got a clean bill of health for my tank's water, so I took a sample down to the pet store for analysis. I learned the water had an ammonia problem, and I have to follow a particular regimen to bring the water back to good, and hopefully the other two fish will survive the ordeal.<br /><br />This passage from Matthew 10:29-31 (ESV) came to mind:<br /><br /><blockquote>"Are not two sparrows sold for a penny? And not one of them will fall to the ground apart from your Father. But even the hairs of your head are all numbered. Fear not, therefore; you are of more value than many sparrows."</blockquote><br />My eldest daughter said "I'm sorry Dad." When the Matthew passage came to mind, it dawned on me that if God cares about birds, then He probably cares about fish as well. But that's not the point of the passage. The point is that if God cares about a sparrow, then he <span style="font-style: italic;">really</span> cares about his child. Really really cares. Cares like crazy. And so, child of God, do not be afraid.brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-71056207220648996492009-10-27T15:48:00.000-07:002010-09-21T17:22:22.136-07:00The Burgermeister Meisterburger is an Environmentalist Wacko!There's been a lot of news lately for those of us wondering what we can do to save the planet from global warming. <br /><br /><a href="http://www.timesonline.co.uk/tol/news/environment/article6891362.ece">According</a> to Climate chief Lord Stern, “Meat is a wasteful use of water and creates a lot of greenhouse gases. It puts enormous pressure on the world’s resources. A vegetarian diet is better.” He assures us that eventually it'll be quite normal for us to inquire about the carbon content of our food. Perhaps they can put that information on the nutrition panel.<br /><br />And Robert Vale of New Zealand<a href="http://tvnz.co.nz/back-benches/s-time-dine-dog-2522085"> tells us</a> in his book "Time to Eat the Dog" that pets are not eco friendly, and that we apparently need to swap Fido out for something a little more palatable. Apparently, a fish causes the same amount of carnage to our planet as two mobile phones. I had two mobile phones, and I have three fish. I wonder whether I should flush the phones or the fish.<br /><br />So we need to give up meat, and pets. Got it.<br /><br />I've been thinking about the impact toys have on the environment. Think about it: all the carbon emitted to produce them, the plastic, the batteries they consume, the lead in their paint--really, they are basically boiling cauldrons of toxic carcinogenic polluting choke hazards. We really ought to ban them. Really.<br /><br />Which got me thinking about the Burgermeister Meisterburger, the grouchy villain of the children's classic "Santa Claus Is Comin' to Town." He fell and hurt himself, blamed the toy over which he tripped, and banned them all. He was not going to be happy until everybody was miserable. Much like Vale, Stern, and others. The Burgermeister must be an Environmentalist!brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0tag:blogger.com,1999:blog-5993809922163266453.post-87960600792002082142009-10-22T16:01:00.000-07:002009-10-22T16:05:43.621-07:00Enjoying a Starbucks ViaI really enjoy coffee. I don't however consider myself a coffee snob: I'm not one who'll say "oh, I never drink so-and-so<fill in="" the="" blank="">, it's total garbage." But times have to be pretty tough for me to opt for the instant coffee. I'll take one of those "coffee single" dunk-the-bag-in-boiling-water contraptions if I'm going to be without easy access to my favorite caffeinated beverage: camping, company travel, the end of the world, etc. But powdered instant coffee? Blech. Only if I'm <span style="font-style: italic;">really</span> desperate.<br /><br />A few weeks ago Starbucks introduced their Via instant coffee. They said I would not be able to tell the difference. Yeah sure, I thought, and at a buck a cup, I'm not going to bother to find out.<br /><br />I found myself at my neighborhood Starbucks, and was buying a drink on a gift card someone had given me, and because I had some room left over on the card, I decided to buy the three-pack.<br /><br />At the house, I decided to give it a try. I dumped the packet out into my mug, and the first two things I noted were that it is ground almost as fine as flour, and that it smelled really good. I then heated up some water and poured it in, and gave it a good stir. I tasted it, and really was surprised at how good it is, and that I really would not have guessed it was instant. So, if you like Starbucks coffee in general, you're probably going to like Via.<br /><br />I still have a touch of sticker shock, though. At a dollar a cup, it's wildly more expensive than most any kind of homebrew, let alone powdered instant. You get to make the cost/benefit decision. For me, I envision myself with a couple of packs the next time I go camping, or perhaps find myself going somewhere where good coffee isn't nearby.<br /></fill>brismithhttp://www.blogger.com/profile/00141311042336579161noreply@blogger.com0