Just a short, simple blog for Bob to share his thoughts.
28 February 2014 • by Bob • FTP, SSL
For this next installment in my series about FTP clients, I want to take a look at WinSCP, which is an open source FTP/SFTP client that is available from the following URL:
For this blog post I used WinSCP 5.5.1, and it was available for free when I wrote this blog post. That being said, WinSCP's author (Martin Prikryl) takes donations. (And I think that it's a worthy cause; I like to support independent development work.)
When you open WinSCP 5.5, you will first see the Login dialog box, which will be empty until you add some sites to the list. The Login dialog allows you to create folders so you can categorize your sites, and the user interface is comparable to what you would expect in a Site Manager for other FTP clients.
![]() |
Fig. 1 - The opening Login dialog in WinSCP 5.5. |
When you are adding FTP sites, you have three choices for the protocol: FTP, SCP, and SFTP; you also have four choices for encryption: No encryption, TLS/SSL Implicit encryption, TLS Explicit encryption, and SSL Explicit encryption. (I'll discuss those later.)
When you open a site for which you did not save the password, (which I highly recommend), you will be prompted for your password.
![]() |
Fig. 2 - The WinSCP 5.5 Password dialog. |
Once your FTP site is opened, the main application window is displayed, and it resembles a two-column file explorer interface with local and remote folders, which you might expect from a GUI-based FTP client. (Note: WinSCP refers to this as it's "Commander" interface.)
![]() |
Fig. 3 - Local and Remote Folders. |
That being said, if you change your application preferences, you can change the user interface so that it uses a single-column file explorer interface with a folder tree, which might be useful if you would rather use the FTP client as a drag-and-drop repository. (Note: WinSCP refers to this as it's "Explorer" interface.)
![]() |
Fig. 4 - Remote Folder Tree and Files. |
WinSCP 5.5 has support for automation through .NET and COM, and documentation about automating WinSCP 5.5 programmatically is available on the WinSCP website at the following URL:
WinSCP .NET Assembly and COM Library
There are several detailed automation examples on the WinSCP website that are written in C#, VB.NET, PowerShell, JavaScript, VBScript, etc., and the documentation is quite good. If you need to do a lot of FTP scripting and you are looking for a good way to automate your FTP sessions, you might want to consider this FTP client.
If you don't want to write a bunch of code, you can also automate WinSCP from a command line, and the documentation about that is available on the WinSCP website at the following URL:
Another great feature about WinSCP is that it can be downloaded as portable executables, which makes it easy to copy between systems. This is a great feature for me since I like to keep a collection of handy utilities in my SkyDrive/OneDrive folders.
WinSCP 5.5 has built-in support for FTP over SSL (FTPS), and it supports both Explicit and Implicit FTPS. To specify which type of encryption to use for FTPS, you need to choose the appropriate option from the Encryption drop-down menu for an FTP site.
![]() |
Fig. 5 - Specifying the FTPS encryption. |
Once you have established an FTPS connection through WinSCP 5.5, the user experience is the same as it is for a standard FTP connection. That being said, I could not find a way to drop out of FTPS once a connection is established, so FTPS is an all or nothing option for your sessions.
True FTP hosts are not supported natively, and even though WinSCP 5.5 allows you to send post-login commands after an FTP site has been opened, I could not find a way to send a custom command before sending user credentials, so true FTP hosts cannot be used.
WinSCP 5.5's login settings allow you to specify the virtual host name as part of the user credentials by using syntax like "ftp.example.com|username" or "ftp.example.com\username", so you can use virtual FTP hosts with WinSCP 5.5.
![]() |
Fig. 6 - Specifying an FTP virtual host. |
This concludes my quick look at a few of the FTP features that are available with WinSCP 5.5, and here are the scorecard results:
Client Name | Directory Browsing | Explicit FTPS | Implicit FTPS | Virtual Hosts | True HOSTs | Site Manager | Extensibility |
---|---|---|---|---|---|---|---|
WinSCP 5.5.1 | Rich | Y | Y | Y | N | Y | N/A |
Note: I could not find anyway to extend the functionality of WinSCP 5.5; but as I said earlier, it provides rich automation features for .NET, COM, and the command-line. |
That wraps things up for today's blog. Your key take-aways should be: WinSCP 5.5 is good FTP client with a lot of options, and it has a very powerful automation story. As I mentioned earlier, if you have to do a lot of FTP automation, you should really take a look at this FTP client.
Note: This blog was originally posted at http://blogs.msdn.com/robert_mcmurray/
28 February 2014 • by Bob • URL Rewrite, SEO, Classic ASP
In December of 2012 I wrote a blog titled "Using Classic ASP and URL Rewrite for Dynamic SEO Functionality", in which I described how to use Classic ASP and URL Rewrite to dynamically-generate Robots.txt and Sitemap.xml or Sitemap.txt files. I received a bunch of requests for additional information, so I wrote a follow-up blog this past November titled "Revisiting My Classic ASP and URL Rewrite for Dynamic SEO Functionality Examples" which illustrated how to limit the output for the Robots.asp and Sitemap.asp files to specific sections of your website.
That being said, I continue to receive requests for additional ways to stretch those samples, so I thought that I would write at least a couple of blogs on the subject. With that in mind, for today I wanted to show how you can add additional content types to the samples.
Here is a common question that I have been asked by several people:
"The example only works with *.html files; how do I include my other files?"
That's a great question, and additional content types are really easy to implement, and the majority of the code from my original blog will remain unchanged. Here's the file by file breakdown for the changes that need made:
Filename | Changes |
---|---|
Robots.asp | None |
Sitemap.asp | See the sample later in this blog |
Web.config | None |
If you are already using the files from my original blog, no changes need to be made to your Robots.asp file or the URL Rewrite rules in your Web.config file because the updates in this blog will only impact the output from the Sitemap.asp file.
My original sample contained a line of code which read "If StrComp(strExt,"html",vbTextCompare)=0 Then" and this line was used to restrict the sitemap output to static *.html files. For this new sample I need to make two changes:
Note: I define the constant near the beginning of the file so it's easier for other people to find; I would normally define that constant elsewhere in the code.
<% Option Explicit On Error Resume Next Const strContentTypes = "htm|html|asp|aspx|txt" Response.Clear Response.Buffer = True Response.AddHeader "Connection", "Keep-Alive" Response.CacheControl = "public" Dim strFolderArray, lngFolderArray Dim strUrlRoot, strPhysicalRoot, strFormat Dim strUrlRelative, strExt Dim objFSO, objFolder, objFile strPhysicalRoot = Server.MapPath("/") Set objFSO = Server.CreateObject("Scripting.Filesystemobject") strUrlRoot = "http://" & Request.ServerVariables("HTTP_HOST") ' Check for XML or TXT format. If UCase(Trim(Request("format")))="XML" Then strFormat = "XML" Response.ContentType = "text/xml" Else strFormat = "TXT" Response.ContentType = "text/plain" End If ' Add the UTF-8 Byte Order Mark. Response.Write Chr(CByte("&hEF")) Response.Write Chr(CByte("&hBB")) Response.Write Chr(CByte("&hBF")) If strFormat = "XML" Then Response.Write "<?xml version=""1.0"" encoding=""UTF-8""?>" & vbCrLf Response.Write "<urlset xmlns=""http://www.sitemaps.org/schemas/sitemap/0.9"">" & vbCrLf End if ' Always output the root of the website. Call WriteUrl(strUrlRoot,Now,"weekly",strFormat) ' -------------------------------------------------- ' This following section contains the logic to parse ' the directory tree and return URLs based on the ' files that it locates. ' -------------------------------------------------- strFolderArray = GetFolderTree(strPhysicalRoot) For lngFolderArray = 1 to UBound(strFolderArray) strUrlRelative = Replace(Mid(strFolderArray(lngFolderArray),Len(strPhysicalRoot)+1),"\","/") Set objFolder = objFSO.GetFolder(Server.MapPath("." & strUrlRelative)) For Each objFile in objFolder.Files strExt = objFSO.GetExtensionName(objFile.Name) If InStr(1,strContentTypes,strExt,vbTextCompare) Then If StrComp(Left(objFile.Name,6),"google",vbTextCompare)<>0 Then Call WriteUrl(strUrlRoot & strUrlRelative & "/" & objFile.Name, objFile.DateLastModified, "weekly", strFormat) End If End If Next Next ' -------------------------------------------------- ' End of file system loop. ' -------------------------------------------------- If strFormat = "XML" Then Response.Write "</urlset>" End If Response.End ' ====================================================================== ' ' Outputs a sitemap URL to the client in XML or TXT format. ' ' tmpStrFreq = always|hourly|daily|weekly|monthly|yearly|never ' tmpStrFormat = TXT|XML ' ' ====================================================================== Sub WriteUrl(tmpStrUrl,tmpLastModified,tmpStrFreq,tmpStrFormat) On Error Resume Next Dim tmpDate : tmpDate = CDate(tmpLastModified) ' Check if the request is for XML or TXT and return the appropriate syntax. If tmpStrFormat = "XML" Then Response.Write " <url>" & vbCrLf Response.Write " <loc>" & Server.HtmlEncode(tmpStrUrl) & "</loc>" & vbCrLf Response.Write " <lastmod>" & Year(tmpLastModified) & "-" & Right("0" & Month(tmpLastModified),2) & "-" & Right("0" & Day(tmpLastModified),2) & "</lastmod>" & vbCrLf Response.Write " <changefreq>" & tmpStrFreq & "</changefreq>" & vbCrLf Response.Write " </url>" & vbCrLf Else Response.Write tmpStrUrl & vbCrLf End If End Sub ' ====================================================================== ' ' Returns a string array of folders under a root path ' ' ====================================================================== Function GetFolderTree(strBaseFolder) Dim tmpFolderCount,tmpBaseCount Dim tmpFolders() Dim tmpFSO,tmpFolder,tmpSubFolder ' Define the initial values for the folder counters. tmpFolderCount = 1 tmpBaseCount = 0 ' Dimension an array to hold the folder names. ReDim tmpFolders(1) ' Store the root folder in the array. tmpFolders(tmpFolderCount) = strBaseFolder ' Create file system object. Set tmpFSO = Server.CreateObject("Scripting.Filesystemobject") ' Loop while we still have folders to process. While tmpFolderCount <> tmpBaseCount ' Set up a folder object to a base folder. Set tmpFolder = tmpFSO.GetFolder(tmpFolders(tmpBaseCount+1)) ' Loop through the collection of subfolders for the base folder. For Each tmpSubFolder In tmpFolder.SubFolders ' Increment the folder count. tmpFolderCount = tmpFolderCount + 1 ' Increase the array size ReDim Preserve tmpFolders(tmpFolderCount) ' Store the folder name in the array. tmpFolders(tmpFolderCount) = tmpSubFolder.Path Next ' Increment the base folder counter. tmpBaseCount = tmpBaseCount + 1 Wend GetFolderTree = tmpFolders End Function %>
That's it. Pretty easy, eh?
I have also received several requests about creating a sitemap which contains URLs with query strings, but I'll cover that scenario in a later blog.
Note: This blog was originally posted at http://blogs.msdn.com/robert_mcmurray/
27 February 2014 • by Bob • Humor
(Note: I found this on my computer, which I had posted to our refrigerator several years ago when my wife and I were going out of town for a few days and I wanted my son, Peter, to remember to put out food for the squirrels while my wife and I were away.)
Bob 21:15 - The lord of the house said to Peter Joshua, "Peter, do you love me more than these?" "Yes, Dad," he said, "you know that I love you." Bob said, "Feed my squirrels."
Bob 21:16 - Again the lord of the house said, "Peter, son of Robert, do you love me?" He answered, "Yes, Dad, you know that I love you." Bob said, "Take care of my squirrels."
Bob 21:17 - The third time he said to him, "Peter, son of Robert, do you love me?" Peter was hurt because his dad asked him the third time, "Do you love me?" He said, "Dad, you know many things; you know that I love you." Bob said, "Feed my squirrels."
(Note: If you don't get the reference, I'm not explaining it to you.)
26 February 2014 • by Bob • Bicycling
Dear Unknown Pickup Truck Driver,
I'd like to personally thank you for failing to see the bicyclist (me) in the clearly-marked bike lane and nearly hitting me. I flipped my bicycle to avoid running into you, so your brain-dead vehicular maneuver restored my belief that some people are too dumb to operate a car. Next time, try hanging up your @#$% cell phone and watch the road.
As luck would have it, I was riding to the hospital where my wife works as a nurse when this mishap occurred, and she used Tegaderm to bandage everything. (Although that was after the painful experience of scrubbing all of the dirt out of the wound.)
On the positive side, this was a great test of the brakes on my new bicycle. (FYI - The brakes work really well; maybe a little too well. But as they say, any landing you can walk away from...)
I should also mention that I'm very fortunate that minor bumps and gashes were the worst of my injuries; I was foolishly wearing neither my helmet nor my gloves when this happened. Both hands were a little bruised and my right arm had several nasty-looking scrapes, but nothing was broken. (And I have learned my lesson; I will always wear my helmet in the future.)
Hashtags: #itsokaythegroundbrokemyfall, #lookicanfly, #itsonlyafleshwound
17 February 2014 • by Bob • Humor
So I watched this video...
And that inspired me to create this image...
Enough said.
16 February 2014 • by Bob • Windows Media Center
Like a lot of Windows geeks and fanboys, I use Windows Media Center on a Windows 7 system as my Digital Video Recorder (DVR) and media library. My system consists of a Dell GX270 computer with a ZOTAC NVIDIA GeForce GT610 video card, and it uses an InfiniTV 6 ETH tuner to receive cable signals. This setup has served us faithfully for years, and it is the center piece of our home entertainment system. If you're not familiar with Windows Media Center, that's because it's a rather hideously under-advertised feature of Windows. Just the same, here is an official Microsoft teaser for it:
But I've done a few extra things with my Windows Media Center that are a little beyond the norm, and one of the biggest items that I spent a considerable amount of time and effort digitizing my entire collection of DVD and Blu-ray discs as MP4 files, and I store them on a Thecus NAS that's on my home network which I use for media libraries on my Windows Media Center. This allows me to have all of my movies available at all times, and I can categorize them into folders which show up under the "Videos" link on the Windows Media Center menu.
That being said, there's a cool trick that I've been using to help customize some of my movies. Some of the movies that I have encoded have some material that I'd like to cut out, (like excessive opening credits and lengthy intermissions), but I don't want to edit and re-encode each MP4 file. Fortunately, Windows Media Center supports Advanced Stream Redirector (ASX) files, which allows me to customize what parts of a video are seen without having to edit the actual video.
Here's a perfect example: I recently purchased the 50th Anniversary Collector's Edition of Lawrence of Arabia on Blu-ray. The film is one of my favorites, and this reissue on Blu-ray is phenomenal. That being said, the movie begins with a little over four minutes of a blank screen while the musical overture plays. In addition, there is an additional eight minutes of a blank screen while the music for intermission is played. This is obviously less than desirable, so I created an ASX file which skips the opening overture and intermission.
By way of explanation, ASX files are XML files which define a playlist for media types, which can be any supported audio or video media. The individual entries can define various metadata about each media file, and thankfully can be used to specify which parts of a media file will be played.
With that in mind, here's what the ASX file that I created for Lawrence of Arabia looks like:
<ASX VERSION="3.0"> <!-- Define the title for the movie. --> <TITLE>Lawrence Of Arabia</TITLE> <!-- Specify the movie's author. --> <AUTHOR>Columbia Pictures</AUTHOR> <!-- List the copyright for the movie. --> <COPYRIGHT>1962 Horizon Pictures (GB)</COPYRIGHT> <ENTRY> <!-- Define the video file for this entry. --> <REF HREF="Lawrence Of Arabia.mp4" /> <!-- Define the start time for this entry. --> <STARTTIME VALUE="00:04:17.0"/> <!-- Define the duration for this entry. --> <DURATION VALUE="02:15:07.0"/> </ENTRY> <ENTRY> <!-- Define the video file for this entry. --> <REF HREF="Lawrence Of Arabia.mp4" /> <!-- Define the start time for this entry. --> <STARTTIME VALUE="02:23:38.0"/> </ENTRY> </ASX>
The XML comments explain what each of the lines in the file is configuring, and it should be straight-forward. But I would like to describe a few additional details:
There are several other pieces of metadata which can be configured, and a list of those are defined in the Windows Media Metafile Elements Reference and ASX Elements Reference.
31 January 2014 • by Bob • FTP, Extensibility
I had an interesting question earlier today which I thought was worth sharing. One of my coworkers was trying to use the code sample from my Programmatically Flushing FTP Logs blog, and he was getting the following error:
Unhandled Exception: System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
at Microsoft.Web.Administration.Interop.IAppHostMethodInstance.Execute()
at Sample.Main() in c:\Projects\FtpTests\Program.cs:line 25
I knew that the code sample in my blog worked perfectly when I originally wrote it, so I figured that my coworker must be doing something wrong. (And every developer has said "It works on my computer..." at one time or other.) But I decided to give him the benefit of the doubt, so I copied the source code from my blog into a new Visual Studio project and I ran it.
Much to my surprise, I saw the same error that my coworker was seeing if I didn't step the code through with a debugger.
When I stepped through the code in a debugger, I saw the following error message:
At this point I was thinking, "What the heck? I know this code was working before..." I started to wonder if we had released a breaking change to the FTP service sometime during the past two years, but then it suddenly dawned on me: I hadn't started the FTP service on my computer.
[Duh.]
That was the source of the problem: I usually have the FTP service configured for manual startup on my development computers, but the FTP methods to start and stop FTP sites and flush the FTP logs do not work when the FTP service is not running. Once both of us started the FTP service on each of our systems the problem went away.
I hope this helps. ;-]
Note: This blog was originally posted at http://blogs.msdn.com/robert_mcmurray/
30 January 2014 • by Bob • IIS, Scripting, IIS Express, PHP
Whenever I am delivering a presentation where I need to use PHP, I typically use a batch file that I wrote in order to rapidly deploy PHP on the system that I am using for my demos. The batch file usually takes less than a second to run, which always seems to amaze people in the audience. As a result, I usually have several people ask me for my batch file after each presentation, so I thought that it would make a good subject for today's blog.
I should mention that I have used this batch file in order to demonstrate PHP with IIS in a variety of scenarios, and one of my favorite demos is when I would borrow someone's laptop and plug in a flash drive where I had IIS Express pre-installed, and then I would run the batch file in this blog to deploy PHP. Next I would launch IIS Express, open a web browser on their system, and then browse to http://localhost/ in order to show that IIS Express was working correctly. Lastly I would write a simple PHP "Hello World" page to show that PHP was up-and-running on their system in a matter of seconds.
That being said, I have to point out that there is a very important prerequisite that you must have in order to follow the steps in the blog: you need to start with a known-good installation of PHP from one of your systems, and I'll explain what I mean by that.
My batch file expects to find a folder containing ready-to-run files for PHP in order to deploy PHP on a new system. I originally obtained my PHP files by using the Web Platform Installer (WebPI) to install PHP, and then I copied the files to my flash drive or some other repository. (Note that WebPI usually installs PHP in the "%ProgramFiles(x86)%\PHP" folder.) If you don't want to use WebPI, you can also download PHP from http://windows.php.net/, but you're on your own for configuration.
Once I have the files from a known-good installation of PHP, I create the following folder structure in the location where I will be storing the files that I use to deploy PHP on other systems:
One thing to note is that the PHP.INI file you use may contain paths which refer to specific directories on the system from which you are copying your PHP files, so you need to make sure that those paths will exist on the system where you deploy PHP.
Here is an example: when I used WebPI to install PHP 5.5 on a system with IIS, it installed PHP into my "%ProgramFiles(x86)%\PHP\v5.5" folder. During the installation process, WebPI updated the PHP file to reflect any paths that need to be defined. At the time that I put together my notes for this blog, those updates mainly applied to the path where PHP expects to find it's extensions:
extension_dir="C:\Program Files (x86)\PHP\v5.5\ext\"
What this means is - if you want to deploy PHP to some other path on subsequent systems, you will need to update at least that line in the PHP.INI file that you are using to deploy PHP. In my particular case, I prefer to deploy PHP to the "%SystemDrive%\PHP" path, but it can be anywhere as long as you update everything accordingly.
The following batch file will deploy the PHP files in the "%SystemDrive%\PHP" folder on your system, and then it will update IIS with the necessary settings for this PHP deployment to work:
@echo off REM Change to the installation folder pushd "%~dp0" REM Cheap test to see if IIS is installed if exist "%SystemRoot%\System32\inetsrv" ( REM Check for the PHP installation files in a subfolder if exist "%~dp0PHP" ( REM Check for an existing installation of PHP if not exist "%SystemDrive%\PHP" ( REM Create the folder for PHP md "%SystemDrive%\PHP" REM Deploy the PHP files xcopy /erhky "%~dp0PHP\*" "%SystemDrive%\PHP" ) pushd "%SystemRoot%\System32\inetsrv" REM Configure the IIS settings for PHP appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='%SystemDrive%\PHP\php-cgi.exe',monitorChangesTo='php.ini',activityTimeout='600',requestTimeout='600',instanceMaxRequests='10000']" /commit:apphost appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='%SystemDrive%\PHP\php-cgi.exe',monitorChangesTo='php.ini',activityTimeout='600',requestTimeout='600',instanceMaxRequests='10000'].environmentVariables.[name='PHP_FCGI_MAX_REQUESTS',value='10000']" /commit:apphost appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='%SystemDrive%\PHP\php-cgi.exe',monitorChangesTo='php.ini',activityTimeout='600',requestTimeout='600',instanceMaxRequests='10000'].environmentVariables.[name='PHPRC',value='%SystemDrive%\PHP']" /commit:apphost appcmd.exe set config -section:system.webServer/handlers /+"[name='PHP_via_FastCGI',path='*.php',verb='GET,HEAD,POST',modules='FastCgiModule',scriptProcessor='%SystemDrive%\PHP\php-cgi.exe',resourceType='Either']" /commit:apphost popd ) ) popd
Once you have all of that in place, it usually takes less than a second to deploy PHP, which is why so many people seem interested during my presentations.
Note that you can deploy PHP for IIS Express just as easily by updating the "%SystemRoot%\System32\inetsrv" paths in the batch file to "%ProgramFiles%\IIS Express" or "%ProgramFiles(x86)%\IIS Express" paths. You can also use this batch file as part of a deployment process for PHP within a web farm; in which case, you will need to pay attention to the paths inside your PHP.INI file which I mentioned earlier.
Note: This blog was originally posted at http://blogs.msdn.com/robert_mcmurray/
30 January 2014 • by Bob • Politics, Rants
Someone recently posted the following image on Facebook, and even though I know they were simply trying to be amusing, I found it highly offensive... (for reasons which I will explain in a moment).
Unfortunately, posting an image such as this reveals how little someone actually knows about how much damage "Flower Power" and the so-called "Love Movement" did to America. While hippies may have been right about some things, (like environmental responsibility and ecological activism), they were dead wrong about most others. Here is a brief summary of a few of the lasting effects that the single generation of 1960s-era youth had on society: an out-of-control drug culture, the unchecked rise in numerous sexually-transmitted diseases, hundreds of thousands of PTSD cases of veterans traumatized by counter-culture attacks, and the embarrassment of our nation in the eyes of the rest of the world.
When you follow the emergence of the hippie movement, it is one that outwardly preached living in harmony with all of society, and yet inwardly its actualization was one of extreme selfishness and unbridled, destructive power. Timothy Leary's invitation to "Turn On, Tune In, Drop Out" encouraged a generation of youth to abstain from any semblance of civil and moral responsibility in favor of seeking personal, self-centered desires. In the span of a few short years, the hippies managed to negate nearly all of the hard-won victories of our country's "Greatest Generation," (those who banded together to survive the Great Depression and win the Second World War). Our country descended from an industrious world leader populated by hard-working, family-oriented citizens to a vicious brood of misguided, distrustful, lazy, addicted, self-worshippers.
Like much of the hippie movement, the so-called "Summer of Love" is something of an oxymoron, because it achieved the opposite of its intended goals. When thousands of lost youths descended on the Haight-Ashbury district of San Francisco, they did so with bold proclamations of free love, uninhibited creativity, and peace-for-all. Yet the size of this group collapsed the infrastructure of the local area, which was unprepared to deal with the sudden arrival of thousands of drugged-out, socially irresponsible vagrants. This should have been one of society's first warnings about the pure selfishness of the hippy mindset, but this event was largely ignored by anyone except other teenagers and twenty-somethings who were tired of listening to their parents telling them to grow up, get a job, and contribute something to society other than folk songs and clouds of pot smoke.
One of the rallying cries for the hippie movement was a general objection to the Vietnam War, and while I agree that anyone in their right mind should oppose war as best as possible, the hippies reacted in the worst possible way. Instead of gathering peacefully across the country, hippies engaged in numerous cases of what would now be referred to as "Domestic Terrorism." In their naïveté, thousands of youths openly proclaimed their support for Marxism/Leninism/Communism to overthrow the government of the United States, even though none of these impressionable youths had ever lived under such oppressive regimes, and many of these same degenerates would not have lasted a year if they had emigrated to the USSR.
Please do not misunderstand me - I fully support the right to peaceful assembly and vociferously objecting to war, both then and now, but there are proper ways to do so - and conversely, there are improper ways to be avoided. For example: hippies used to call my mom in the late 1960s while my dad was stationed in Vietnam, and they would pretend to be the Department of the Air Force calling to inform my mom that my dad had been killed in combat. This happened many, many times - and she would hug my brothers and me as she wept inconsolably for hours; my mom's life was probably shortened by several years due to insufferable grief caused by the heinously evil and unnecessary actions of these particular vermin who called themselves hippies.
There are two things that can be learned from the hippies' response to the Vietnam War:
Tragically, my experiences were not isolated incidents; the history of the Vietnam War on the home front is rife with examples of the complete failure on the part of the hippy movement to make their protests known while still treating veterans returning from battle like fellow human beings. (Many of these veterans were draftees instead of volunteers, and therefore they had no say in their years of military service.)
Some of the most-damaging aspects of hippie culture were the concepts of "Open Marriages," "Free Love," etc. In their efforts to rid themselves of any vestige of what they believed were their parents' outdated sensibilities, hippies managed to convince themselves that committed, monogamous relationships were a thing of the past, and they substituted "Do What Feels Good For You" casual relationships in their place. There is an age-old axiom which states, "Why buy the cow when the milk is free," and in keeping with that notion, the men of the hippy generation managed to convince the women of that era to abandon their morality in what was probably the most-condescending deception of women in the history of the United States. To quote Steve Martin, "Free Love ... was the single greatest concept a young man has ever heard. This was a time when intercourse, or some version of it, was a way of saying hello. About three years later, women got wise and my frustration returned to normal levels (Martin 2007, 100)." Despite the ill-guided assertions that the hippy movement gave birth to the Women's Liberation movement of the following decade, male hippies treated their female counterparts little better than objects for their own, self-desires. As a direct result, a conflagration of sexually-transmitted diseases spread across the country like a raging inferno, divorce rates skyrocketed, and millions of children were forced to grow up in single-parent homes due to the hippy-based philosophy that marriages need not be permanent.
Ultimately the hippy movement was a complete failure of society on both sides of equation: the hippies failed to behave in any fashion which reflects the better ideals of humanity, and the United States' government failed to effectively respond to the subculture which infested much of the Baby Boomer generation. Our nation still bears numerous scars from societal wounds inflicted by the selfish and amoral youth of the 1960s, and history will eventually reveal that their actions irrevocably damaged the fabric of our culture and hastened the demise of our once-great country.
On a personal note - forty-five years have passed since the time when my family was individually targeted and tormented by faceless cowards who publicly preached love for their fellow man while privately living for their own selfish gains. I have neither forgiven nor forgotten the traumatic pain that these so-called "Peace Loving Hippies" caused my family and our nation to suffer.
Martin, Steve. Born Standing Up: A Comic's Life. New York, NY: Simon & Shuster, Inc., 2007.
30 January 2014 • by Bob • SkyDrive
OK - I have to admit, I have used SkyDrive for several years now, and I have learned to become dependent on it because I like having several of my files easily accessible everywhere I go and on every device.
Apparently that was a big mistake on my part, because the SkyDrive team at Microsoft has slowly made SkyDrive a piece of crap. Having just set up my laptop with a brand-new installation of Windows 8.1 (which I installed from scratch), I can honestly say that SkyDrive in Windows 8.1 is now a complete failure as far as I am concerned. So unfortunately I'm probably going to have to switch to a third-party cloud storage application - and that sucks.
Before I discuss what's screwed up with SkyDrive in Windows 8.1, I should first mention that Microsoft used to make Windows Live Mesh, which was much better than SkyDrive. Mesh allowed you to choose any folder on your system and synchronize it across any machine that you specified. (In contrast, SkyDrive only synchronizes folders which are directly beneath the parent SkyDrive folder.) What's more, Mesh had a built-in remote desktop feature that was much like the built-in Windows Remote Desktop functionality - except that it actually worked. (If you've ever tried to manage a firewall and get the built-in Windows Remote Desktop functionality working over the Internet through your firewall and across a NAT, you know what I mean.) Unfortunately Microsoft's long-standing policy appears to be the following: if Microsoft has two competing technologies, choose the lesser of the two and ship that, and then deprecate the better technology. (At least that's what happened with SkyDrive and Mesh.)
Anyway - here are just a few of things things that are screwed up about SkyDrive in Windows 8.1:
In Windows 7, you had to manually choose to install the SkyDrive desktop functionality, so this was an opt-in feature. Of course, I installed SkyDrive, and I used it often. Unlike Windows Live Mesh, you had to drop files in the SkyDrive folder, which was really inconvenient. But that's also the way that DropBox works, so I'm sure that's what the engineers who were designing SkyDrive were trying to emulate.
In any event, after I installed SkyDrive on several of my systems, all of my SkyDrive-based files were physically stored on each of my local systems, and they were adequately synchronized across all machines where I installed SkyDrive. If I wanted to temporarily disable SkyDrive on any system, I could right-click on the SkyDrive System Tray icon and choose to close it.
However, once I installed Windows 8.1, everything changed. First of all SkyDrive is not optional - it's just there, and it appears to be always on. What's worse, my files weren't actually on my laptop anymore; they looked like they were locally stored, but they were more like ghost files which would actually download from the Internet whenever I tried to access a file. This was a pain in the butt for the system utilities which I was storing in my SkyDrive - most of them ceased to function because the EXE would download, but none of the supplemental DLL files would. As a direct result, all of my system utilities failed to run.
After some poking around I discovered that I could right-click on the SkyDrive folder and choose to make it available offline, which worked - albeit with hours of waiting for 25GB of files to download over Wi-Fi. But I need to point out that I had to go out of my way to make SkyDrive work the way that it used to; and more importantly, I had to discover on my own how to make something work the way that it always did in the past. This is known as a "Breaking Change," although I prefer to call that "Bad Design."
But today is when everything went from bad to worse. I needed to go to an appointment, so I brought my laptop with me because I thought that I would be able to do some work while I waited for my scheduled appointment time. I had a folder in my SkyDrive with some work-related files in it, so this seemed like something that should just work.
But it didn't work. In fact, it failed miserably.
What happened is this: I arrived at my appointment and booted my laptop, but when I opened my SkyDrive folder, everything was missing. Needless to say, I was more than a little alarmed. I opened Windows Explorer and navigated to the folder for my user profile, where I saw two folders that were both named "SkyDrive." Since Windows does not allow two folders with the same name in the same directory, I knew that this was a display anomaly which was probably caused by identical desktop.ini files in the two SkyDrive directories. I opened a command prompt and changed directories to my user profile folder, and the directory listing showed two folders: "SkyDrive" and SkyDrive (2)".
So I was correct in my assumption, and I verbally expressed my exasperation on the idiocy of this situation. ("What the heck...? Those stupid sons-of-biscuits...") I could immediately tell that Windows 8.1 had screwed something up, and my life was going to suck until I sorted it out.
I will spare you the details for everything that I tried to do, but it involved a lot of copying & renaming of files & folders - and after several hours of troubleshooting I still didn't have it resolved. But just to make things worse, while I was doing my troubleshooting I discovered that I suddenly had three folders under my user profile: "SkyDrive" and SkyDrive (2)," and "SkyDrive.old". I searched the Internet, and I found out that a lot of users have seen this problem.
A... lot... of... users...
There seemed to be two common consensuses: 1) this was clearly a bug in SkyDrive on Windows 8.1, and 2) SkyDrive now sucks for this reason.
One thing became clear to me: SkyDrive was going to continue to make my life miserable until I got it out of the way long enough for me to fix things. If you do some searching on the Internet, you can find ways to disable SkyDrive through Windows group policy, but I didn't want it permanently disabled - I just wanted it out of the way long enough to sort out the problem with multiple folders. Incidentally, logging out as my user account and logging in as the local administrator account did not make this easier since SkyDrive.exe runs at the system level.
Eventually I had to resort to backing up all of my multiple SkyDrive folders to an alternate location, and then running the following batch file while I manually cleaned up the multiple folders:
@echo off :here for %%a in (explorer.exe skydrive.exe) do ( wmic process where name='%%a' call terminate ) goto :here
Note that I had to put these process termination statements in a loop because Windows would keep restarting both executables, thereby thwarting any repairs that I had managed to start.
Yes, this is a lame and prosaic approach to solving this problem, but releasing a major breaking change to a service upon which you hope everyone will depend is pretty darn lame, too. And making the new service so heinously awful that it's barely usable is unforgivably lame.
Eventually I got everything sorted out, and I would love to be able to write something definitive like, "You need to do X and Y and your system will be better." But truth-be-told, I spent so many hours trying so many things that I cannot be certain which specific steps resolved the issue. And I'm not about to attempt setting up a repro environment to test which steps to take. Sorry about that - but I simply don't want to mess with things now that I have SkyDrive working again.