Huddled Masses

You can do more than breathe for free...

Solving the “failed to grant minimum permission requests” error

By Joel 'Jaykul' Bennett on 29-Nov-2010

If you’re getting the error: Import-Module : Could not load file or assembly … or one of its dependencies. Failed to grant minimum permission requests. (Exception from HRESULT: 0×80131417) because you’re trying to load a module from a network share … you need to read the PoshCode wiki page which explains how to use caspol to set the CAS policy for a UNC path file share.

I feel like I should apologize for this post, since it basically just serves to link to that wiki page, but people keep asking, and my blog has better pagerank than the wiki ;-)

Posted in Huddled | Tagged Code Access Security, Import-Module, Network Share, PowerShell, RemoteSigned

Open Source and Community-Developed Software

By Joel 'Jaykul' Bennett on 15-Nov-2010

If you didn’t know that there’s a feeling of community among open source developers, you may have been hiding under a rock for the past several years. However, depending on where you work, and how active you are in hobbyist software development, you may or may not realize how passionate the debates and arguments are about what constitutes open source software.

For all sorts of reasons beyond the scope of this article, the open-source community has long been divided into several camps, which often seem to be defined by people’s feelings are about the Free Software Foundation and it’s leader Richard M. Stallman ;-) but are frequently in substantive disagreement about what it means for software to be open source software.

It’s an all too common situation to find companies publishing software under an OSI-approved open source license and then being attacked by open source developers and community leaders who make the claim that their software is not truly an open source project. The problem goes deeper than just technicalities, and touches on what it really means to be open, and the reason I’m writing this is to suggest that we be more intentional and discriminating about our terminology.

My proposal is simple: In addition to the current definition of “Open Source Software,” which is well established by both the FSF and the OSI, we should define “Community-Driven Software” which is software which goes beyond open source licensing requirements to have what some would call an “open source development model.”

The FSF and OSI each have web pages where they explain at great length what free software and open source software are. They both agree on what the FSF calls (in homage to President Roosevelt):

The Four Freedoms (of software):

  1. The freedom to run the program for any purpose. This means the license can’t discriminate against certain uses, certain people or groups, or against use by people performing certain types of work.
  2. The freedom to study how the software works, and change it to make it do what you wish. This means the source code must be available, and the user must be allowed to modify it.
  3. The freedom to redistribute copies. This means that the software can’t have restrictions about giving copies away (modified or unmodified), and can’t charge royalties or license fees.
  4. The freedom to distribute modified versions. Essentially, this is the freedom to fork the software.

Although their respective pages go on about these at great length, and discuss other terms and conditions, these four freedoms are the simplest definition of what open source software is.

Moving the Finish Line

As more and more corporations have begun to accept the concept of open source software licenses, the community of open source developers, hobbyist, and users have begun to expect more than simple open license terms, and (as I said before), have even begun to claim that an open source license is not enough for a program to be considered open source.

Essentially, there has been a growing group which is redefining open source software to mean software which is developed through a “community process” whereby anyone can potentially submit patches and bug fixes which can eventually be incorporated into the original project. Of course, neither the FSF, nor the OSI, (nor any software license I am aware of) has attempted to define free software or open source as meaning that anyone can contribute alterations to the original project but only that you have the right to fork and create a new project.

I believe that it’s important to the integrity of the open source “movement” and the acceptance by corporations of the concept of not just using open source software but actually creating it, that we not try to redefine “open source” to mean something that it has not meant historically. It’s critical that even as we are, in essence, moving the finish line … we not leave corporations feeling that we have changed the rules mid-game.

There is really no upside to disputes about whether or not a particular software program is “really” open source — these debates alienate developers who must sometimes work very hard to get their corporations to accede even to a limited source code release, and then find their efforts bashed by the very people they thought would be most pleased.

Community-Developed Software

I would like to suggest that we allow the definition of “open source” to be simple, and to mean what it has always meant (software which is provided under legal terms which ensure the four freedoms). But lets push individuals and corporations who release open source software to make sure that they also have a community-driven software development model.

What does that mean? Well, I don’t really want to set that standard in stone myself right now — it’s certainly still being debated by many people — but I want to put something out there as a starting point. Of course, we’re starting from the basis that the project is under an open source software license, but what else is required in addition for a project to be considered a community project? Do we need to know who all the developers with check-in rights are? Are projects in a “benevolent dictator” system with just one authorized check-in user automatically not community projects?

I think we can probably break it down to just two additional freedoms (if we’re willing to twist the concept a little bit). Obviously the four freedoms above are all implied … but additionally, a community project should give you:

  1. Freedom from ignorance:
    • Users should be able to see what’s getting done on the project.
    • External developers should be able to see what still needs doing on the project.
  2. Freedom to contribute:
    • Users should be able to submit bugs and feature requests
    • External developers should be able to submit patches (and see them applied).

Personally, I believe that seeing what’s getting done, and being able to submit patches requires that the development team to be developing on a publicly visible source repository (or at least performing regular pushes to one). If you’re only pushing source to a public repository when you do a release, then users can’t see if there’s any progress happening on the project at all, and even if you’re pushing source once a month or once a week, depending on the speed of development, external developers will be reluctant to submit patches for bugs or features which might already be implemented by someone else.

Additionally, I think seeing what needs doing, and being able to submit bugs and feature requests requires a public tracker that is, at least, connected to the actual tracker used by the development team. There shouldn’t be a censorship layer between developers and users when discussing bugs and feature requests, and the public bug and feature request tracker should be updated when a fix is accepted or a feature is implemented, so that external developers don’t waste time creating patches for issues that are already resolved.

Obviously the point here is that users and external developers need to feel like they’re able to interact with the development team, and external developers should be able to submit patches which can be applied to the project. The idea is that end users and external developers shouldn’t have to go through a PR person or even a single public facing contact, and if I know how to fix a bug, or how to implement a features, I shouldn’t have to fork the project to get my fix applied.

None of that is meant to imply that every submitted feature request or patch will be applied — the development team always has the right to take their software in the direction they think it should go (even if users think they’re wrong). People who completely disagree with the direction a project is taking are still free to fork the project and go a different way.

What do you think?

Posted in Huddled | Tagged Community, Discussion, licensing, Open Source | 2 Responses

WPF Window “Native” Behavior: Metro Window

By Joel 'Jaykul' Bennett on 04-Nov-2010

A couple of years ago I first introduced my native behaviors for WPF to support enhancing WPF applications with behaviors that require PInvoke or hooking the Window’s message processing loop: WndProc. You can read all about it on my previous posts, including the original implementations of my Snap To Screen Edges behavior, and my Custom Chrome for creating windows with buttons on the Aero glass frame like ribbon apps or all those new browsers …

However, I’m writing today because I went back this week to revisit that project because I wanted a “Metro” style Window — basically, something like the Zune client window.

As I was reviewing it, I discovered System.Windows.Interactivity class which came out of Expression Blend, and includes the functionality of my NativeBehaviors attached property with regards to allowing you create new behaviors for WPF elements … and of course, despite being newer, their system has much broader support than mine ;-)

So anyway … long story short: I’ve rewritten my behaviors on top of System.Windows.Interactivity.Behavior and written a MetroWindow behavior that makes my PowerBoots application look roughly like this:

PoshConsole with the MetroWindow behavior

I’m really pleased with the results, and while I was at it I finally fixed a weird glitch in the Snap-To behavior when using the Win+Left or Win+Right keys in Windows 7 to move the window docked from the left of one monitor to the right side of another (or vice versa), and of course this also includes the global hotkeys behavior, and my Quake-console behavior :) The code to make add the MetroWindow behavior along with the SnapTo would be just:


    <i:Interaction.Behaviors>
        <huddled:MetroWindow CaptionHeight="58" ButtonSize="20" />
        <huddled:SnapToBehavior SnapDistance="22" SnapMargin="18" />
    </i:Interaction.Behaviors>
 

I’ll write this up a bit more later when I’m ready to release PoshConsole and the revised Quake behavior, for now you’ll have to be content with the screenshots, unless you want to grab source code.

Posted in Huddled | Tagged Custom Chrome, Metro, PInvoke, Windows 7, WPF

Virtual PowerShell Event Tonight

By Joel 'Jaykul' Bennett on 30-Aug-2010

August 31st at 9PM eastern, we’re having a live IRC chat with author, developer, and Microsoft PowerShell team member Lee Holmes to celebrate the release of the 2nd edition of his book: Windows PowerShell Cookbook. There are more details on the Virtual PowerShell User Group page about joining IRC and about this chat in particular

Posted in Huddled | Tagged Events, User Group, Virtual

I wanted to start my best-practices series…

By Joel 'Jaykul' Bennett on 24-Aug-2010

I was trying to write the first real post for that series today, but I got really distracted, and instead …

  • Created a Virtual Launch Party for Lee Holmes’ 2nd Edition Windows PowerShell Cookbook
  • Updated my SharpSsh Module (which I wrote about ages ago in Scriptable SSH From PowerShell) to accept PSCredential objects or passwords, use CmdletBinding and have parameter set overrides
  • Updated my JSON Module to support Pipeline binding in ConvertFrom-Json and to call out the fact that it properly supports dynamic objects if you specify PSObject as the type.
  • Updated (and finally released) my Presentation module
  • Updated (and finally released) my PowerTest Module (it now has setup/teardown and supports filtering tests by name and category). This module needs it’s own blog post too, but you can get an idea what it’s about in the first hour of the Live Meeting recording of my Testing with PowerShell presentation.

Now that I mention all that stuff, there’s a few things from last week that bear mentioning too:

  • I wrote a sweet little function to wrap the LoreSoft.MathExpressions assembly, which lets you do all sorts of math inline in the PowerShell console.
  • I also updated my HttpRest module to work with the latest 2.1 release of MindTouch Dream
  • And published my current PowerShell Prompt and PowerShell Profile

And if you haven’t seen them … the week before that I also

  • Published a function for invoking Generic Signature Methods from PowerShell which was something I had previously considered impossible.
  • Made some very nice updated to ConvertFrom-PropertyString which parses ini files and anything like that…
  • Published a trick for getting PowerShell.exe to run in .Net 4 and to allow PowerShell to load binary modules from network paths
  • Wrote a function to generate proxy wrappers for OData Services which was closely followed by a full PowerShell OData Module from Doug Finke

So, I’m giving myself a break.

Posted in Huddled | Tagged News, Quick, Tips | 1 Response

RFC: Information in PoshCode Module Manifests

By Joel 'Jaykul' Bennett on 12-Aug-2010

OK, I’m putting this out there to see if I’ve missed anything that would be useful. This is the list of metadata that we’ll be storing about Modules in the PoshCode repository. It duplicates most of the information in the PowerShell Manifests, but it adds more of information that we feel is important for searching, sorting and organizing … and in the PoshCode Module manifests, wildcards are not allowed for any of the “export” values. The export information in the module is intended to represent the initial state of the module after import: listing all the cmdlets, functions, variables and aliases …

PoshCode Module Manifest Format:

GUID

The globally unique identifier for this module. Helps us tell modules apart :)

Name

The name of this module. Helps us find modules, and helps you guess what they’re for.

ModuleVersion

The version of this module. Together with the GUID, this is the unique key for the module. It should be incremented whenever you release it.

Description

A short description of the module. What it is, what it does, what it’s for.

ModuleType

Tells whether the module is a Script module or a Binary module (if they are both, then they are Binary).

Author

The person(s) who created this module. No organizations here, just people.

Company

A company (if there is one) that created this module or provides support for it.

Copyright

The copyright statement. You should always fill this out and assign copyright to the correct author, group or corporation.

License

The software license(s) that this module can be licensed under. It’s enough to use an acronym like “GPL v2” or “MIT” or “Ms-PL” ... but if you have a custom license you can specify a description of it or the full text of it. Multiple entries are allowed.

LicenseUri

The url(s) for a full copy of the license. If you’re using an open source license you can link to it’s page on opensource.org

Category

We’ll publish our official category list later, but the category is intended to be an assignment to a single category in a hierarchical tree.

Tags

A collection of user-assigned free-text keywords that help to categorize the module and serve as additional search terms.

Homepage

If the module has a home page on the internet, this is the URL. You can use the link to the PoshCode Docs page (which our cmdlets will generate for you) if you don’t have your own page.

Download

This is the link to download the module. If you’re hosting it on PoshCode, we will fill this in. If you’re hosting it elsewhere, this must be a download link. If it’s a commercial module that requires payment, you should leave this link empty unless you have a free trial download. Note: I’m still working on the commercial angle. Would it be helpful to include the price here? If we offered a way to sell your modules through PoshCode, would you use it?

RequiredAssemblies

Assembly names (or relative paths, if the assemblies are included in the module folder) for assemblies that must be loaded before the module will work. These should be the Assembly FullName, not a partial name.

RequiredModules

The names and versions (and GUIDs) of any modules that this module depends on.

PowerShellVersion

The version of Powershell required (2.0, for now).

FrameworkVersion

The version of the .Net Framework required. The framework version implies the CLR version, so we’ll just stick to this. I’m still toying with the idea of saying the list is 2.0, 3.0, 3.5, 3.5.1, and 4.0 … rather than allowing the normal version with the full four digits.

VersionChanges

This is either the list of changes in this version, or a complete list of the changes in previous versions.

Exported Cmdlets

The list of (binary) cmdlets exported by this module.

Exported Functions

The list of script functions exported by this module.

Exported Aliases

The list of aliases exported by this module.

Exported Variables

The list of variables exported by this module.

Deprecated things …

I’m leaning against having these items in the PoshCode manifest — they don’t seem to be helpful for finding or sorting or understanding a module.

  • ModuleFile
  • ModuleToProcess
  • FormatsToProcess
  • TypesToProcess

Comments Requested

I’m hoping for feedback about this list, what I might be missing, or if there’s anything in here I should leave out … let me hear it!

Posted in Huddled | Tagged Design, Module Manifest, PoshCode, PowerShell | 1 Response

What Scope Am I In?

By Joel 'Jaykul' Bennett on 06-Aug-2010

In PowerShell the question of scope is too complicated and convoluted. I’m going to try to help you understand it, but I’m not guaranteeing that I will be able to make it seem any simpler than it actually is. Hopefully, I won’t make it more complicated than it inherently is ;-)

In PowerShell you always have three named variable scopes: script, local and global. The default scope is always the same as the local scope, so when you set a variable without specifying the scope, it’s always set at local scope. One thing to note is that you can access these named scopes through the $variable notation, or through the variable drive, so all of the following are equivalent:


Set-Variable var "one" -Scope Local
$var = "one"
$local:var = "one"
Set-Content Variable::Local:Var "one"
 

A side note: the PSProvider drive notation means that when you’re in strict mode, if you want to test for the existence of a variable without causing an error, the simplest way to do it is with Test-Path Variable:Var…

What’s so hard about that?

Well, the question is: what scope are you in “right now” when a line of code is executing from a function or a script …

Sometimes local scope is ALSO script scope, and sometimes, script scope is also global scope. Specifically: when you’re typing at the console, all three scopes are the same.

Let’s write a function to determine what named scope we’re in:


function Get-Scope {
   New-Variable scope_test
   Write-Output @{
      $GlobalScope = [bool](Get-Variable scope_test -Scope global -ea 0)
      $ScriptScope = [bool](Get-Variable scope_test -Scope script -ea 0)
      $LocalScope = $true
   }
}
 

By setting a variable, and then testing the named scopes, we can verify what scope we were in when we set the variable. Of course, there’s no point testing the Local scope, because we already know that is where we are… then we return a hashtable of booleans indicating which scopes are active.

If you dot-source that Get-Scope function, you’ll find the scope that you’re in where you dot-source it:

  • if you do it at the interactive prompt it should tell you all three scopes are set
  • if you do it in a script file it should tell you Local and Script
  • but if you do it in a function, it will always just tell you “local” — and will not tell you if the function is in a script or not … nor how deep you are.
  • and if you do it in a module, the results will depend on whether Find-Scope is defined in the module or not (this is very weird)

So are we done?

Not even remotely. On top of the named scopes, PowerShell also has nested scopes. Each script, function, scriptblock, etc. adds to the nested scopes, and takes you further from the global scope. On top of that, PowerShell has Modules. In a module, scope is flattened. Specifically, in a module, the default scope becomes the Script scope, which in this case is not actually reserved for a single file, but for any scripts, functions, etc that are executed from within that module’s context.

To determine nesting level of the scope, we must do something like this:


function Get-ScopeDepth {
   trap { continue }
   $depth = 0
   do {
     Set-Variable scope_test -Scope (++$depth)
   } while($?)
   return $depth - 1
}

# Test it like this:
. Get-ScopeDepth
&{ . Get-ScopeDepth }
&{ &{ . Get-ScopeDepth } }
 

As long as modules aren’t involved, that will tell you how many scopes there are between you and global scope (and thus, return zero when dot-source from the console commandline).

This falls apart a bit if you’re in a module (in a module, you can’t get to global scope by increasing the scope value — effectively, the highest you can go is script scope, but in reality you can still access global scope by naming it). To determine if you’re in a module, you can simply check for the existence of the $PSScriptRoot variable, or verify that $Invocation.MyCommand.Module is set to something.

Additionally, if you’re in a module, you need to define this function in that module for it to work at all.

There’s one more thing you could use to help you learn what scope you’re in, and that is the Get-PSCallStack cmdlet. This will tell you how many commands have been called to get you where you are. It’s usually the same as the Scope Depth, but not when it’s in a script file, etc.

Here’s my finished scope digging function:


function Get-Scope {
   [CmdletBinding()]
   Param(
      [Parameter(Mandatory=$true)]
      [System.Management.Automation.InvocationInfo]$Invocation
   )

   function Get-ScopeDepth {
      trap { continue }
      $depth = 0
      do {
        Set-Variable scope_test -Scope (++$depth)
      } while($?)
      return $depth - 1
   }
   $depth = Get-ScopeDepth
   
   Remove-Variable scope_test
   New-Variable scope_test

   New-Object PSObject @{
      ModuleScope = [bool]$Invocation.MyCommand.Module
      GlobalScope = [bool](Get-Variable scope_test -Scope global -ea 0)
      ScriptScope = [bool](Get-Variable scope_test -Scope script -ea 0)
      ScopeDepth  = $depth
      PipelinePosition = $Invocation.PipelinePosition
      PipelineLength = $Invocation.PipelineLength
      CallStack = Get-PSCallStack
      StackDepth = (Get-PSCallStack).Count - 1
      Invocation = $Invocation
   }
}
 
  • Remember: modules sometimes flatten scope.
  • Remember: when calling this function you should dot-source it, and pass it $MyInvocation

As as side note and counter-example, take for instance this module:


New-Module {
   function test-scope { . Get-Scope $MyInvocation }
   function test-nestedscope { test-scope }
   function test-nestednestedscope { test-nestedscope }
} | Import-Module
 

All three of those functions will return ScopeDepth = 2 (the test-scope function, and the module itself), but the StackDepth will increase correctly. I don’t know why. It’s late, so I’m going to stop writing before I get more confusing.

Posted in Huddled | Tagged PowerShell, PowerUser, Scope, Tips, Variable Scope | 1 Response

PowerShell Scripting Best Practices: Prefix A

By Joel 'Jaykul' Bennett on 29-Jul-2010

I’m starting a new series of blog posts about Best Practices for scripting in PowerShell, and I was going to start at the beginning with a requirement that you should use [CmdletBinding()], but the explanation of that will have to wait for the next post, because a bug in PowerShell 2.0 has surfaced which can only be avoided by carefully following a couple of rules … and I’m going to issue those rules as the prefix for the best practices.

Rule #1: Never use Get-Module -ListAvailable in a module.

You need to run the command outside of your module. The simplest way to do that is to use Invoke-Command { Get-Module -List Available } … that should give you the same output, but without the nasty side effects.

There is a bug in the ListAvailable parameter, which causes PowerShell to mark other modules which are already loaded as being “nested” in your module.

It does that to all modules which have correct manifests, and the problem is that if your module gets unloaded later (using Remove-Module), it removes these nested modules as well … even though the user had loaded them separately.

[new] Edit: 2010-08-05

I should have mentioned this originally (so I’m adding it now): one of the reasons developers were using Get-Module with -ListAvailable was to get information about their own module during the initial load (such as to check module versions, or load data from the PrivateData). If you were doing that, you can use Test-ModuleManifest instead with the path to your manifest: Test-ModuleManifest $PSScriptRoot\ModuleName.psd1

Rule #2: Do not use Import-Module in a module.

If you have a dependency on another module, you should load it by specifying it as a NestedModules in your module manifest.

There is a bug in the way that Remove-Module unloads modules which causes modules which are loaded from inside your module (whether by Import-Module or by Get-Module -ListAvailable), to be unloaded completely even if they’ve been previously loaded in the console (global) scope interactively by the user (or via their profile).

You could possibly make an exception to this rule, if the module is actually in your module’s folder (and thus, not easily loadable from outside your module), but you’re making the assumption that no one will ever use that module outside of your module.

Modules loaded via the metadata file’s NestedModules property don’t have this problem, so you should always load nested modules that way.

Posted in Huddled | Tagged Best Practices, Modules, PowerShell

How to Import Binary Modules from Network Shares

By Joel 'Jaykul' Bennett on 03-Jul-2010

Note: This is from a wiki page I just wrote on Importing Binary Modules from Network Shares which discusses not just the solution below that works for .Net 2.0 but also how to solve the problem on .Net 4.0 (e.g.: in PoshConsole). I will most likely not keep this page up to date, so you should refer to that wiki if you need more information.

Almost every author of a binary module has probably had someone ask about this at some point, because there’s always someone who has their user profiles stored on a network location, and therefore installed their modules on that network path and can’t get them to load because they get a warning that .Net “Failed to grant minimum permission requests.”

Before we get into this any further let me just say: by far the simplest thing to do is to create a local folder on your local hard drive, add that to your environment PSPathModules variable, and just install your modules there.

Other than that, the solution depends on the version of .Net that you’re using (you can tell by checking the $PSVersionTable.CLRVersion

The .Net 2.0 framework (and 3.0 and 3.5 and 3.5 SP1)

The problem is not a PowerShell problem at all, it’s a .Net problem. The .Net framework 2.0 (remember that PowerShell targets 2.0, and is actually based on .Net 1.1) didn’t trust assemblies loaded from network shares. You can fix that for an individual assembly or for a whole share using the Caspol tool.

A complete discussion of that tool and it’s myriad command-line options is beyond me, but for a simple solution, you can run this command specifying the server and share you want to load from (in my example the “Modules” share on the “ProfileServer” server).

Set-Alias CasPol "$([Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory())CasPol.exe"
CasPol -pp off -machine -addgroup 1.2 -url file://\ProfileServer\Modules\* FullTrust

Hopefully the only thing that needs explaning there is that 1.2 is the default “Local Intranet” group, and that CasPol.exe is in your Framework Runtime directory. Once you’ve run that, you’ll be able to import any modules that are in subdirectories of that share.

Note: You must run the version of CasPol.exe which is in the lcation defined by the GetRuntimeDirectory() command (it’s important to use the same version as the runtime you want to be affected).

You can read more about importing binary modules from network shares, including how it changed in .Net 3.5 SP1 and why it’s not automatically fixed in .Net 4 over on the PoshCode wiki. :)

Posted in Huddled | Tagged .Net4, CAS, FileShare, Modules, Policy, PowerShell, PowerUser, Security, UNC

What posts should I update?

By Joel 'Jaykul' Bennett on 20-Jun-2010

Someone asked me this week about this old post about custom ICompareers, and wondered if I could rewrite it for PowerShell 2.0 and wrap it in an advanced function … and it made me think: I really should update some of my old posts from PowerShell 1 and the preview releases of 2 so that they are accurate and useful. I thought I’d throw this out there and let you guys who read my stuff tell me which ones I should update first — I’m likely to get sick of it after just a few of them, so it’s important that I update the ones you want the most first ;-)

Based on traffic I’m going to pre-select these three, but anything else is fair game too:

  • Trap Exceptions in PowerShell
  • Scriptable SSH in PowerShell
  • PowerShell Modules

Posted in Huddled | Tagged Blogging, HuddledMasses, PowerShell | 5 Responses

« PreviousNext »

Lijit Search

I Diigo...

    Tags

    .Net .Net 2008 Scripting Games Automation Bugs Design Development Funny Gadgets GeoShell GUI Huddled Masses Internet licensing Microsoft Modules My Software News Personal PInvoke Pipeline Politics PoshCode PoshConsole PowerBoots PowerShell PowerShell Functions PowerTips Rants Recommender Repository Scripting ShowUI Software Solutions Textile Tips User Group UserInterface WalkThrough WebHosting Windows 7 WordPress WPF Xml

    About Huddled Masses

    This is web site is dedicated to the musings of Joel Bennett (aka Jaykul) about technology, software, software development, the web, and the world.

    Any resemblance of the views expressed and the views of my employer, my terminal, or the view out my window are purely coincidental. The resemblance between them and my own views is non-deterministic. The question of the existence of views in the absence of anyone to hold them is left as an exercise for the reader.

    P.S.: I occasionally link to things I think are great. When I do, I occasionally find a "referral code" so I can make a little cash. I promise that I don't link to anything just because of that cash (I wouldn't cross the street for the amount of cash those links bring in, never mind write a whole blog post) ... but I do not promise that things I link to will stay great as time passes, nor that you will agree with me about their greatness!

    Archives

    • April 2012
    • February 2012
    • January 2012
    • October 2011
    • August 2011
    • July 2011
    • June 2011
    • March 2011
    • February 2011
    • January 2011

    Copyright © 2012 Joel Bennett.

    Powered by WordPress and Hybrid.