I wrote this program as a front-end application to handle MJPEG video streams. Originally, it was intended for just Yawcam webcam software but can actually be configured to use any available MJPEG stream including streams that require authentication.
Find Installation Source
PDF2TIFF
I wrote this application to facilitate automation of converting PDF to TIFF format. This application monitors a configured directory for newly created PDF files and converts them to TIFF format and saves to the configured output directory. It also archives the original PDF. This application runs in the system tray and can also be setup to run as a service without a graphical user interface.
BitCalc
Search, Download and Install Windows Updates with VBScript
I have spent a little time today troubleshooting an issue on a WSUS server that manages updates for our network. I couldn’t figure out why updates weren’t being installed on 40+ computers and wanted to test to make sure that WSUS was correctly configured as well as all the client PCs. I did end up figuring out what the problem was after all this work, and it is a little embarrassing to admit. The updates weren’t pushing to clients automatically because not all the updates were approved, and even after approving them I still had an installation issue and discovered it is because they weren’t synchronized to the local repository. *facepalm*
Anyway, here’s a VBScript code snippet that will check for updates and prompt to A) download and B) install.
I tried to document with MSDN reference links where appropriate for those of you who might stumble across this. The script in and of itself is based largely (if not almost completely) off the “Searching, Download and Installing Updates” article from Microsoft.
set updateSession = createobject("Microsoft.Update.Session")
updateSession.ClientApplicationID = "VBScript Updater"
set updateSearcher = updateSession.CreateUpdateSearcher()
updateSearcher.Online = False ' http://msdn.microsoft.com/en-us/library/windows/desktop/aa386525(v=vs.85).aspx
updateSearcher.ServerSelection = 1 ' http://msdn.microsoft.com/en-us/library/windows/desktop/aa387280(v=vs.85).aspx
wscript.echo "Searching for updates..." & vbcrlf
set searchResult = updatesearcher.Search("IsInstalled=0 and Type='Software' and IsHidden=0 and IsAssigned=1") ' http://msdn.microsoft.com/en-us/library/windows/desktop/aa386526(v=vs.85).aspx
WScript.Echo vbCRLF & "Creating collection of updates to download:"
Set updatesToDownload = CreateObject("Microsoft.Update.UpdateColl")
For I = 0 to searchResult.Updates.Count-1
Set update = searchResult.Updates.Item(I)
WScript.Echo I + 1 & "> adding: " & update.Title
updatesToDownload.Add(update)
If update.EulaAccepted = False Then
update.AcceptEula
WScript.Echo I + 1 & "> Accept EULA " & update.Title
End If
Next
If updatesToDownload.Count = 0 Then
WScript.Echo "All applicable updates were skipped."
WScript.Quit
End If
WScript.Echo vbCRLF & "Would you like to download updates now? (Y/N)"
strInput = WScript.StdIn.Readline
WScript.Echo
If (strInput = "Y" or strInput = "y") Then
WScript.Echo vbCRLF & "Downloading updates..."
Set downloader = updateSession.CreateUpdateDownloader()
downloader.Updates = updatesToDownload
downloader.Download()
WScript.Echo vbCRLF & "Successfully downloaded updates:"
Set updatesToInstall = CreateObject("Microsoft.Update.UpdateColl")
rebootMayBeRequired = false
For I = 0 To searchResult.Updates.Count-1
set update = searchResult.Updates.Item(I)
If update.IsDownloaded = true Then
WScript.Echo I + 1 & "> " & update.Title
updatesToInstall.Add(update)
If update.InstallationBehavior.RebootBehavior > 0 Then
rebootMayBeRequired = true
End If
End If
Next
If updatesToInstall.Count = 0 Then
WScript.Echo "No updates were successfully downloaded."
WScript.Quit
End If
If rebootMayBeRequired = true Then
WScript.Echo vbCRLF & "These updates may require a reboot."
End If
Else
Wscript.Quit
End If
WScript.Echo vbCRLF & "Would you like to install updates now? (Y/N)"
strInput = WScript.StdIn.Readline
WScript.Echo
If (strInput = "Y" or strInput = "y") Then
Set installer = updateSession.CreateUpdateInstaller()
If installer.IsBusy = True Then
wscript.echo "Another installation is currently in progress, try later."
wscript.quite
else
WScript.Echo "Installing updates..."
installer.Updates = updatesToInstall
Set installationResult = installer.Install()
'Output results of install
WScript.Echo "Installation Result: " & _
installationResult.ResultCode
WScript.Echo "Reboot Required: " & _
installationResult.RebootRequired & vbCRLF
WScript.Echo "Listing of updates installed " & _
"and individual installation results:"
For I = 0 to updatesToInstall.Count - 1
WScript.Echo I + 1 & "> " & _
updatesToInstall.Item(i).Title & _
": " & installationResult.GetUpdateResult(i).ResultCode ' http://msdn.microsoft.com/en-us/library/windows/desktop/aa387095(v=vs.85).aspx
Next
end if
End If
Google+ Layout: My Opinion
The new Google+ layout gives me nausea, fills me with anxiety and gives me a feeling of rage like no other.
Ok, not so much the rage part, but I do get anxious when I first load Google+ in the new layout format. I scan back and forth through the columns trying to organize and order the posts by latest date/time. Such a pain.
The single column vertical layout is virtually useless as pointed out by Chris Kim A in a Google+ post.
Please fix this. Fix it all.
/rant
Google+: Post Status Updates via SMS
You can update your status via SMS by sending a text to 33669 (United States) or 9222222222 (India). This is only available if you have registered your phone number with your Google+ account.
Register Your Phone Number with Google+
- Hover over the Home menu and click Settings at the bottom. Alternatively, you can click on this link to be taken directly to the settings page.

- On the right pane, if you haven’t registered your number you will see an Add Phone Number. Follow these instructions.

Once you have registered your number, you are all set.
SMS Cheat Sheet
| Share With | Example |
| Specific Circle | +work I am calling off. |
| Public | +public Hello, world! |
| Extended Circles | +extended Hello, world! |
| Specific Person | +rjkreider@gmail.com Hi Rich, this is for your eyes only! |
Note: By default, all posts will be shared with Your Circles.
I wonder if they will add picture posting; that would be a nice feature!
Additional information can be found at Google’s SMS page.
Happy SMSing!
Change Google+ Stream Layout
If you don’t like the look of your Google+ stream since the update was rolled out yesterday, you can easily change it back to a vertical layout. Keep in mind that it isn’t the original layout, but at least it’s vertical again. I admit, it is taking some getting used to for me; it is a little overwhelming first thing in the morning before my coffee!
Step 1. Click on the More menu item at the top of the stream.
Step 2. Choose the vertical layout option in the Stream Layout section of the menu.
Now you have a nice vertical layout for your Google+ stream.
RAID & IOPS Calculator
I have been working on a tool recently that can help with sizing of storage solutions at a very basic level. Previously, I had created an Excel “Cheat Sheet” for RAID calculations, IOPS calculations and more.
Calculations
- IOPS to MBps and vice versa
- RAID Sizing (0,1,5,6,10)
- Disks Required for Given IOPS
- Workload IOPS based on IO Size, IO Type, IO Read% and IO Write%
Formulas
Here are some of the formulas I use for calculations to build this application.
| Calculation | Formula |
| IOPS | IOPS = 1 / (average latency (in sec) + average read/write seek time (in sec)) |
| Total Raw IOPS | Number of Disks * IOPS Per Disk |
| Total Functional IOPS | ( (Total Raw IOPS * Write%) / (RAID Penalty)) + (Total Raw IOPS * Read%) |
| IOPS to MBps | (IOPS * IO Size) / 1024 |
| MBps to IOPS | (MBps / IO Size) * 1024 |
| Disks Required | (total required IOPS * read%) + (total required IOPS * write% * RAID penalty) / IOPS |
Reference Sheet
| RAID Write Penalty | |
| RAID | Penalty |
| RAID-0 | 0 |
| RAID-1 | 2 |
| RAID-5 | 4 |
| RAID-6 | 6 |
| RAID-10 | 2 |
| Disk IOPS | |
| Device | IOPS |
| SSD | 400-7,000+ |
| 15,000 RPM SAS | ~175-210 |
| 10,000 RPM SAS | ~140 |
| 10,000 RPM SATA | ~125-150 |
| 7,200 RPM SATA | ~75-100 |
| 5,400 RPM SATA | ~50 |
| RAID Levels | |
| RAID | Disks Required |
| RAID-0 | 2 |
| RAID-1 | 1 |
| RAID-5 | 3 |
| RAID-6 | 3 |
| RAID-10 | 4 |
| RAID Level Detailed | ||||
| RAID Level | Definition | Redundancy | Performance | Drawbacks |
| RAID-0 | Data Striping. By definition RAID level 0 is not RAID because it does not provide data redundancy. Data is striped across all drives without parity. | None. If a drive fails all data is lost. | High. Provides the best performance and storage efficiency in I/O intensive environments because there is no parity related overhead. | No Data Redundancy. |
| RAID-1 | Disk Mirroring. Data is written to a primary disk and a secondary disk. Identical data is stored on both disks. | A mirrored set of drives is created. | High performance in read intensive applications. If one drive is busy data can be accessed from the secondary disk. High write performance because of no parity overhead. | High cost per megabyte because double the amount of drives is required to achieve desired capacity. |
| RAID-5 | Data Striping with Distributed Parity. Data is striped across a group of disk drives with distributed parity. Parity information is written to a different disk in the array for each stripe. | Parity is distributed across the disks in the array. Data is regenerated in the event of a drive failure. | High performance in small record, multiprocessing environments because there is no contention for the parity disk and read and write operations can be overlapped. No write bottlenecks as with RAID 4. | Distributed parity causes overhead on write operations. There is also overhead created when data is changed, because parity information must be located and then recalculated. |
| RAID-10 | Implemented as a striped of mirrors. | A striped array (RAID 1) of mirrored drive pairs (RAID 0) is created. | High performance because data is striped and there is no parity overhead. | High cost per megabyte because double the amount of drives is required to achieve desired capacity. |
Resources
These websites were useful in collecting and helping to create the formulas as well as inspiration for an “all-in-one” type of tool.
Google All Access Music Service Launches
Google launched their streaming music service, All Access, today at Google I/O 2013.
You can sign up for a 30 day trial of the service and if you enjoy it, you can pay only $7.99 monthly if you sign up by June 30, 2013. After June 30, the service will cost $9.99 per month.
Google All Access takes the best from Pandora, Spotify and other online music streaming services and more.
Features
- Enjoy unlimited listening to millions of songs
- Create personalized radio from any song or artist
- Listen to radio with unlimited skips
- Get smart recommendations based on your tastes
- Store up to 20,000 of your own songs in your locker
- Access your music anywhere without syncing
- Experience music without ads
- Buy new music on Google Play (18M+ songs)
I’m a fan for ad-free music streaming and one of the cool features is the ability to share a song you purchase with a friend for so they can play it. The friend can play the track one time.
Head over to the All Access page and take a look for yourself and get setup with a free 30 day trial!







