Azure’s Service Bus and EnergyNet (PDC Day 0)


On Day 0 of Microsoft PDC, I attended the Software in the Energy Economy workshop. Much to my surprise (and disappointment), we didn’t talk about energy for the entire first half of the workshop. Instead, it was about Azure’s Service Bus. BAD Microsoft!! It was explained to us by Juval Lowy that he wanted to do it entirely on energy but Microsoft forced him to have half of the talk on the service bus. Now I can understand this from Microsoft, but this should have been clear to the people there. Honestly, I would have much preferred to go to another workshop than to learn about the Azure Service Bus. Cool stuff but my current analysis of it is that it’s way too unreliable (I don’t mean bugs, I mean lack of transactional support) and it is simply missing some of the things that I would want/need in such a system, like queues! There are hacks to implement them, but I don’t want to have such an important foundational part of my architectures built on hacks! Anyways, that can be for another day (gotta get to the keynote).

So this is by no means a complete or even a good write-up. This is simply a dump of my notes that I was taking until my battery died, early on in the Energy conversation, and I have yet to even go back and re-read them, much less make them make sense. Just trying to get this out there in case it’s useful to anybody. Luckily, there are a few links in here (and I have some more in my phone that I will add to here later) that provides the slides for the Energy part (is a must have if you are interested in it)! Finally, forgive me as I have yet to master the Word to Wordpress formatting…

Software in the Energy Economy

· Azure Service Bus

o Very heavily based on WCF

o Very high performing over TCP but not HTTP

§ Demos to servers in Texas from LA perform ~70% speed of light (demo was over a cell phone even)

o Very good parallel scaling

§ 1 subscriber performance = 1,000,000 subscribers performance

o Service types

§ One-way

§ Event-based

§ ???? (another one)

o Good for intercepting/proxying public calls

§ Abstract your service calls through the Service Bus

o Network routing

§ You can force clients to always go through the relay

§ You can optionally go to “Hybrid” mode and it will negotiate the network path and use the “best” path, including intranet paths. If it cannot find a better path, it continues going through the relay

o Decent for pub/sub models

§ Standard way requires lots of code duplication, so you’ll have to dynamically build endpoints/operations/events/etc. which involves lots of reflection

o Bad for buffering

§ Buffers for only up to 10 minutes

§ At most, 50 buffered items

§ No transactions so catastrophic failures = complete failure of the buffer with little recourse for recovery or gracefully handling it

o Very bad for queuing

§ Queues were removed and are now nonexistent because they didn’t know how to bill for it.

o No end-to-end transactions

§ All communications do not have guaranteed delivery.

§ Treat as UDPesque communications.

o Requires the services to register before any consumers try to hit it

§ Does not work with IIS or WAS

§ Requires self-hosting or ASE

o Queued Services

§ Juval wrote some pseudo implementation of Queued Services – do not attempt to do this at home!

o Response Service

§ No way to get results or errors (because services are queued)

§ User a Service Buffer and a Response Buffer (i.e. have the client poll the Response Buffer until it finally gets the response)

o Service Bus Security

§ Shared Secret

· No good “easy” security frameworks for this

· Luckily, the WCF Security applies – nothing new

· Tokens (47 random characters) used for authentication

· Servers/clients may use different tokens

· NOT intended for user authentication

· No really good options for doing this on user machines

§ Transport Security

· TCP w/SSL

· WS w/HTTPS

§ Message Security

· Credentials are built into the message

· Recommendation: Message Security with no service authentication (i.e. relay service hits my service anonymously)

§ TCP Message Security

· Service-side cert to protect message

· Client validates cert

· Private/Pub Certs

· Problem is that the relay’s domain (Azure) does not match our cert

· You can get cert for Azure domain and then use partial validation based on names to decide whether or not to trust the cert.

§ TCP Mixed Security

· Does not work with Hybrid

§ One-Way Transfer Security

· Defaults to Transport

· Cannot use Mixed, only Transport or Message Security

· With Message Security, client cannot negotiate service certificate – no direct interaction with service, must specify cert explicitly

§ Transfer Security

· Requires cert for message security

· Reads from config file, else looks locally for cert that matches service namespace

§ Recommendation

· Use Message Security with Credentials

· Creds can be un/pw, cert, or token

Binding

None

Transport

Message

Mixed

Message

Message – Hybrid

· Demos: www.idesign.net/idesign/download/ServiceBusPDC.zip

o Features to come in future releases

§ Buffers

§ Queues

§ Routers

· Withdrawn from November 2009 CTP

· Re-introduced in second release (post 2010)

· Multiple services can subscribe to a router

· Admin administers routers independent of services (??)

· Load Balancing (quasi-round robin) with ~95% efficiency

· Router-to-router subscriptions (N to M subscriptions)

· Hierarchical (cutting off parent cuts off child) – great for admins!

· GREAT for logging implementation – the application can be done without logging (except for exceptions)!

· Can be used as a crude pub/sub BUT…. –>

· Router is limited to how many subscribers it can have (limit was 50)

· Can be used to implement queued pub/sub (i.e. also implements true queues as long as the time limit isn’t a problem)

· EnergyNet

o Slides available at www.idesign.net/idesign/download/EnergynetPDC.zip [EDIT] That previous link seems to be dead but this one seems to work: www.idesign.net/idesign/download/EnergynetPDC2.zip

§ NOT Microsoft’s opinions, just IDesign’s and Juval’s

o Opinion

§ Massive shift in energy use driven by:

· Technology

· Economics

· Peak oil

· World demographics

· Regulation and stimulation

§ Will affect every walk of life

§ Shift is primarily a software problem

§ Requires software system like the internet

· Though bigger in every respect

· Cloud will be enabling technology

§ The next big thing – “will take until 2025 to finish it”

· Will trigger massive boom in software like dot-com (“but three times larger”)

· Tectonic plates have already shifted

§ Not just the US

· Immense export market

o Roadmap

§ The energy economy boom

· Where the investors and the startups are heading

· The new California Gold Rush

§ Current vs Future energy economy

§ Why the energy economy is actually a software problem

§ Emerging Standards

§ Key technologies and skills

o The Energy Economy Boom

o Shoeshine Boy vs The Daycare

§ Joseph Kennedy made his fortune by identifying the 1929 bubble

· Legend has it he was alarmed when getting stock tips from a shoeshine boy

§ But the opposite is probably true at boom formation as well

· The Daycare Syndrome in the Silicon Valley

· Just driving around will do

o The Daycare Syndrome

§ In the school my girls visit are also the kids of

· SVP of SAP who quit to join electric cars startup

· Former CTO of BEA who quit to be ALT-E VC

§ Around in the Silicon Valley

· Founder of PayPal launched the electric sport car company

· Former president of SAP founded electric cars startup

· Kleiner-Perkins

o VC of Amazon, Google, Sun, Netscape

o Now supporting three electric cars startups and many other including smart grid startups

· What my wife said about this seminar

o “Everybody knows that”

o The Energy Economy Boom

§ Investors are all jumping in

· Shifting from info-tech to clean-tech

§ VC poured $2.6 billion in 2007

· Up 400% from 2005

§ VC poured in $5.8 billion in 2008

§ 150 new solar startups

§ ConnectivityWeek

· Energy Information Technology for Sustainability (Santa Clara, CA, June 8-11, 2009)

· Smart Grid, Smart Devices, Smart Services

§ “Google wants US to use 100% Alternative Energy by 2030”

§ IBM, Cisco, Google, Oracle

§ Books: “Green investing”, “The Clean Tech Revolution”, “Profit from the Peak”, “Profiting from Clean Energy”, “Clean Money”, “Apollo’s Fire”

§ “New Bible”: Thomas L Friedman – Hot, Flat, and Crowded (for the mainstream public and media) – “Why we need a green revolution and how it can renew America”

· Gets things both very right and very wrong

§ Summary: All successful tech companies and execs are all jumping into this industry

o The New California Gold Rush

§ It is 1849 and 1942 all over again

§ All eyes are on California

· World’s 8th largest economy

§ “California Green Rush” means severe talent shortage for Energy Companies

§ In 2008 $3.3 billion clean tech investments in California

§ 80% of nation-wide money in the country goes to California

§ California alone has 11 electric cars start-ups

· They make bumper-to-bumper cars

§ Scores of other electric transportation companies

· Bicycles

· Forklifts

· Motorcycles

· Busses

· Components and technologies

· Infrastructure

· Conversions

§ Silicon Valley leading the charge

· Should it be called Clean Valley?

§ Charge stations all over San Jose in 2010

· Topping off at parking lots, malls, etc.

· RF IDs to utility bills

· Better Place will cover California with battery charging and replacement

· Better Place will cover Silicon Valley in total first

o $1 Billion from cities

o Infrastructure first cars later

§ California is prime solar energy industry

§ 127 solar startups up CA

· And counting

· 80 in Silicon Valley

§ Massive installation in the desert

· Several gigawats in the network

§ Asura in California uses troughs and rotating mirrors

· $0.1/KW

§ eSolar uses modular mirrors and multiple small towers

· 245MW in the works

§ World largest PV plant in the works

§ US largest solar installation on 65m sq ft of commercial building roofs

§ CA is prime for geothermal

· Gets 4% of its power from geothermal

· Operates world largest geothermal field

§ Aspire to lead nation with massive wind projects

§ CA has score of micro wind startups

§ Some ideas are out of this world

§ Cool Earth has a solar earth balloon

§ LS9 uses bacteria to produce fuel (oil)

· Used genetic engineering to refine it

· Can tweak things to eliminate the need to refine the oil

§ Across town Solazyme grows algae for artificial oil and jet fuel

§ Nano tech based batteries for quick charge

· Charge 35kWh in 10 minutes

§ Aggressive policies

· 20% renewable power by 2010

· 33% in 11 years

· 30% car emissions reduction in 8 years

· AB 920

§ Solar tax perks essentially make it free to install solar panels on your roof

· $6k for individuals, more for businesses

o Perception vs Reality

§ When people hear “Clean Energy” they think “green”

§ When they think “green” they imagine tree-huggers

§ Tree huggers are about peace and love

§ Peace and love are good for hippies only

§ The real picture is more about money growing on trees

· About Energy

o 40% is oil

o 70% of oil is for transportation

o 96% of transportation is oil

o 70% of electric is wasted on transportation

· Software and Alternative Energy

o What does Alternative mean

§ Being smart about energy

§ Not necessarily “alternative”

§ Will take decades to replace coal with clean energy

· Required for base load

o Electric cars are nonviable as-is

§ Limited range

§ Long charge time

§ Charging infrastructure

§ Billing

§ Grid cannot integrate large deployments

· There is simply not enough juice in the grid to support electric cars

· Need to triple the energy capacity of all current systems to support it

o Dumb grid cannot rely on

§ Solar and wind for base load

· Incompatible due to their unpredictability

§ Millions of small generators

· Actually put grid at jeopardy

o Only way to solve is with software

· The Power Grid

o 50% is coal

o Multiple independent grids with 3200 utility companies

o Power Grid Today

§ Grid was never well designed or pre-conceived

· Grew organically over time

§ Masive patch work

· As if designed by Rube Goldberg and Wile E Coyote

§ It’s a wonder the lights never flicker

· Compensates with excess capacity



Rendering a Custom ASP.NET Control when Disabled by Parent Container


So I was performing some maintenance work on some webform stuff in an application and ran into a problem where an existing custom control, which I have the source for so I can fix it (yay!), wasn’t properly disabling itself when it was in a container that became disabled. The way it works, it overrides the rendering process and spits out lots of HTML and javascript (eww!) but for the important things for this rendering, it looks at a custom “ReadOnly” property on the control to enable/disable the appropriate things. So essentially the control is always enabled except when that flag is set to false – a bad idea!

For now, I’ve modified that property as follows. I’ve been unable to find a “best practice” way of performing this so here is my implementation:

      public bool ReadOnly
      {
         get
         {
             bool isAParentDisabled = false;
             Control parentControl = Parent;
 
             while (parentControl != null)
             {
                 if ((parentControl is WebControl) && !((parentControl as WebControl).Enabled))
                 {
                     isAParentDisabled = true;
                     break;
                 }
 
                 parentControl = parentControl.Parent;
             }
 
             return readOnly || !Enabled || isAParentDisabled;
         }
         set
         {
            readOnly = value;
         }
      }

Is there a better way to perform this? I’d love to see how you do this!

-Shane



Indianapolis gets T-Mobile 3G!


Like many others, I got my Android G-1 phone a couple days before it was officially released and have been longing for when Indy would finally get 3G coverage. Lo and behold, I get out of the shower this morning to check the weather and my 3G icon is lit up, albeit with only 1-2 bars (out of 4). Did some surfing and it seemed to load quickly just like it has when I’ve traveled to 3G cities (San Diego, LA, Chicago, etc.).

Now the potential bad news. Since then, my phone has gone back to an Edge connection. I don’t know if this is because of a weak signal at my house (border of Fishers and Noblesville near Verizon Wireless Center) or if it was only on temporarily. I suspect they may just be testing it out, turning it on temporarily, and then turning it back off until they’re ready for a widespread “flip-the-switch” date or something like that.

But the good news is, Indy now has T-Mobile’s 3G in a functional manner deployed to at least parts of the city!! :-)

[edit] After doing some testing, I’m finding that there are some locations where I would normally get the full 4 bars of Edge connection (on my G1 Android device) but I only get 1-2 bars of 3G connection. I was concerned at first until I started doing some bandwidth tests. It seems that with a 1-bar 3G connection I get the same transfer speeds as with 4 bars of 3G connection: about 850kbps.



Installing Windows 7 or Windows Server 2008 R2 from USB Stick


With Windows 7 and Windows Server 2008 R2 recently going RTM, I’ve found myself installing them in quite a few different configurations. One configuration that I’ve recently ran into is installing it into a machine with no CD drive of any means. I know I could carry around a USB-based DVD drive but instead, I wanted to have a USB pen drive to install it from. After some research, I found that it was relatively easy to create such a tool!

  1. Either mount the ISO or insert the DVD for Windows 7 or Windows Server 2008 R2 into your computer. Let’s say it’s at D:\
  2. Format your USB stick to FAT32 (I used default settings for everything via the Windows format tool). Let’s say it’s at H:\
  3. Run the following command at a command prompt:
xcopy d:\*.* /s /e /f h:\

At this point, you should be able to boot off of your USB stick (pending proper BIOS settings on the machine you’re booting up from) and it will install Windows off of the flash memory! Easy as that! This has been done from Vista and Win7. I’m not sure about other OSes.

[edit]Am looking into if I’m missing something with making the device bootable. Something seems fishy here…[/edit]



Going to PDC 2009


Yesterday I got the thumbs up that I’m being sent to PDC 2009 by my company! I planned on going whether I was sent or not but it’s nice to not have to foot the bill out of my own pocket this year. In 2005 I was lucky enough that my company covered airfare and hotel while Telerik was generous enough to cover my registration for the conference and the pre-conference. Last year I wasn’t so lucky and had to cover almost all of it out of pocket but that’s what you expect as a contractor.

Here’s what I have to do:
1. Plan the schedule for my trip (will fly my lady out Wed. or Thurs. and make a bit of a vacation out of the rest of the week/weekend)
2. Decide if I’m going to the pre-conference [done, and yes!]
3. Pick my hotel (with this help and others) – Figueroa Hotel is looking nice if they have wifi
4. RSVP for the Palermo party [done!]
5. Find my flight ($300 + $30-$80 checked luggage fees is what it’s looking like for nonstop round-trip, thx Orbitz)
6. Plan my session schedule
7. Buy a dual-core netbook (if they’re reasonably available in time, otherwise I may have to go with an HP dv2z)
8. Don’t forget deodorant!



Pragmatic Spaces ‘09


Pragmatic Spaces 2009 is coming soon.

Known details for now:
1. Limited to 150 people
2. You want to be there
3. There will be GREAT discussions you WON’T want to miss!
4. #pragma09 is something to watch for!

While not directly related to Indy ALT.NET, many of the folks from that community are involved in this event. Alan Stevens will also be an important person for the event.



NAnt – Detect 64-bit or 32-bit OS


I was working with Cody Collins and we ran into a problem recently with detecting whether the OS running was 32-bit or 64-bit from within NAnt. We’re trying to automate the installation of some software that has separate installers for 32-bit and 64-bit and we need to determine which installer to run from NAnt.

The problem begins with NAnt being compiled for 32-bit mode only which means all 64-bit functionality is transparent to it. If it weren’t for that, then we could simply depend on the PROCESSOR_ARCHITECTURE environment variable. So if you try to ask the OS if it’s 64-bit, it will tell you that it isn’t. Luckily there is an IsWow64Process WinAPI call that you can make to determine if you are running in WoW64. From these two pieces of information, you can infer whether or not the OS is 64-bit.

Cody and I were able to come up with the following scripts to determine this.

Note: This runs unmanaged code and does not protect you from crashes there – this could be better but this should get you 90% of the way there. This has been tested on Windows XP (32-bit), Windows 2003 (64-bit), Windows Vista (32-bit and 64-bit), Windows 2008 (32-bit), and Windows 7 RC (64-bit). Not an exhaustive test but it covers many of the bases.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<property name="Is64BitOperatingSystem" value="false" />
<property name="Is64BitProcess" value="false" />
<property name="IsWow64Process" value="false" />
 
<target name="DetectOperatingSystemArchitecture" depends="DetectIfWow64Process,DetectIf64BitProcess">
	<description>
		This will detect whether the current Operating System is running as a 32-bit or 64-bit Operating System regardless of whether this is a 32-bit or 64-bit process.
	</description>
	<property name="Is64BitOperatingSystem" value="${IsWow64Process or Is64BitProcess}" />
 
	<choose>
		<when test="${Is64BitOperatingSystem}">
			<echo message="The operating system you are running is 64-bit." />
		</when>
		<otherwise>
			<echo message="The operating system you are running is 32-bit." />
		</otherwise>
	</choose>
</target>
 
<script language="C#" prefix="MyWin32Calls">
	< code>
		< ![CDATA[
			[System.Runtime.InteropServices.DllImport("kernel32.dll")]
			public static extern bool IsWow64Process(System.IntPtr hProcess, out bool lpSystemInfo);
 
			[Function("IsWow64Process")]
			public bool IsWow64Process()
			{
				bool retVal = false;
 
				IsWow64Process(System.Diagnostics.Process.GetCurrentProcess().Handle, out retVal);
 
				return retVal;
			}
			]]>
	< /code>
</script>
 
<target name="DetectIfWow64Process">
	<description>
		Detects whether we are currently in a WoW64 process or not.
	</description>
 
	<property name="IsWow64Process" value="${MyWin32Calls::IsWow64Process()}" />
	<echo message="Setting the [IsWow64Process] property to ${IsWow64Process}." />
</target>
 
<target name="DetectIf64BitProcess">
	<description>
		Detects whether we are currently in a 32-bit or 64-bit process (not necessarily what the OS is running). Note that as of the time of this writing, this will ALWAYS return false because NAnt is compiled to run in 32-bit mode only.
	</description>
 
	<!-- This can return x86, x64, AMD64, or IA64 as of the time of this writing. This works for a 32-bit process in a 64-bit OS because the OS makes the 64-bitness transparent to the process in this environment variable. -->
	<property name="Is64BitProcess" value="${environment::get-variable('PROCESSOR_ARCHITECTURE')!='x86'}" />
	<echo message="Setting the [Is64BitProcess] property to ${Is64BitProcess}." />
</target>

On a 64-bit OS, it has the following output:

D:\bin\deleteme\nanttest>build DetectOperatingSystemArchitecture
NAnt 0.85 (Build 0.85.2344.0; rc4; 6/2/2006)
Copyright (C) 2001-2006 Gerry Shaw
http://nant.sourceforge.net
 
Buildfile: file:///D:/bin/deleteme/nanttest/test.build
Target framework: Microsoft .NET Framework 2.0
Target(s) specified: DetectOperatingSystemArchitecture
 
   [script] Scanning assembly "lsbw4oxa" for extensions.
 
DetectIfWow64Process:
 
     [echo] Setting the [IsWow64Process] property to True.
 
DetectIf64BitProcess:
 
     [echo] Setting the [Is64BitProcess] property to False.
 
DetectOperatingSystemArchitecture:
 
     [echo] The operating system you are running is 64-bit.
 
BUILD SUCCEEDED
 
Total time: 0.2 seconds.
 
 
D:\bin\deleteme\nanttest>

Happy NAnting!!!

*heads off to the IndyALT.NET meeting on Continuous Integration now…*



Truncate Logs for SQL Server 2008


I had previously posted how to Truncate Logs for SQL Server 2005. Unfortunately, this method does not work in SQL Server 2008. The reason is because the “WITH TRUNCATE_ONLY” command is no longer in SQL 2008. Assuming you run in full recovery mode, the new script to do this is:

1
2
3
4
5
6
7
8
USE [{DatabaseName}]
GO
ALTER DATABASE [{DatabaseName}] SET RECOVERY SIMPLE
GO
DBCC SHRINKFILE({TransactionLogLogicalName})
GO
ALTER DATABASE [{DatabaseName}] SET RECOVERY FULL
GO

Simply setting the database mode into simple recovery mode performs the actual truncation but the file is not shrunk by that. DBCC SHRINKFILE will take care of that second step. And don’t forget to put it back into full recovery mode at the end!!

-Shane



How to identify the user your ASP.NET app uses to authenticate as


I was recently asked how to identify the user your ASP.NET application uses to authenticate as. This can be a simple question or a bit more involved. Let’s start with the simple answers first.

Default Accounts:
Windows XP, Windows 2000, and earlier (you should NOT be caring about earlier!):
ASPNET – this is created automatically by the .NET Framework

Windows Vista, Windows 2003, and newer:
NETWORK_SERVICE

Overridden Examples:
Just because that is the default, it doesn’t mean that it is that way for your application. The first place to check is in the Advanced Settings for your Application Pool. This should tell you the account your application will default to if you don’t override it within your application.

Next, you can check your web.config to see if you’re application is impersonating a user. This is the next level of defaults to check. (and perhaps machine.config too, but you should probably NOT be overriding it there!) This will override the above defaults.

Now that you have checked there, the next thing to do is identify what type of IIS Authentication is being used. If anonymous, then you’re done – it will default to the above defaults in that overriding order. If you’re using ASP.NET impersonation, then that should default to the above as well. If you’re using Basic, Digest, Forms, or Windows authentication, then the authentication will be based on the user that the end-user logs in as.

Things can get even trickier if you do things in code, but generally this will figure it out for you.

-Shane



What am I up to?


I usually keep to technical topics on here but this one is going to take a step back.

In the past I have been a consultant through nearly my entire career. I have gone into new [to me] businesses, listened to what they wanted, helped them learn what they needed, helped them determine the correct solution for their need, often helped create these solutions or worked with the teams who created the solutions, helped the companies implement and deploy these solutions, helped with training, helped with post-deployment support, and anything else you can think of that goes with the territory. I have worked on single-person projects and have worked with teams ranging from 2 to 15 people. I have participated as a supporting developer, the lead developer, a supporting architect, the lead architect, a business analyst, and even a project manager on these different teams.

For the past year and a half, I have been working with the Indiana State Supreme Court on a project called eCWS. On this project I was the architect and lead developer in a team with 8 developers. My team and I designed, created, and maintained this entire system from scratch and won at least 3 international awards with the project. As of the time I rolled off of this project about a month ago the system had logged approximately 1 million citations and warnings, consisted of a laptop-based and PDA-based client (both of which were rock-solid and easily maintainable), a web-based client system, as well as some web-based server components while integrating with various electronic court systems (and of course most of these systems shared a common code-base to keep the code manageable).

Also, for the past year, I have helped to create the Indianapolis ALT.NET user group and have acted as the president of the user group. I have attempted to push a wonderful movement in furthering the community’s education on best practices and broadening the community’s range of thinking to more outside-the-box tools and techniques. As we are now, we are one of the most active and organized ALT.NET user groups in the world (and we’re about to step things up to the next level)!

For the past month I have done some consulting work for an older client of mine while waiting for negotiations and planning for “the big one” to come through. I’ve been ready to advance my career and, in doing so, will be stepping out of the consulting role I have been so successful in for years. Beginning today I will be joining the EnerGenuity team here in Indianapolis. EnerGenuity currently has a great software suite that keeps their customers happy (which include Fortune 500 and other companies). My official title, I think, is something like Technology and Product Development Manager (for the first time I’ll have a legitimate title and not one that I make up on-the-spot as so many software developers/consultants do!). In short, I will be leading the IT team for EnerGenuity. This is sure to be a challenging and rewarding experience in my life and I think EnerGenuity and I are a great match for each other! I think I have so much to offer and they have so much they need and the details in both of these seem like an absolutely perfect match!

So… that’s about it. Just thought I’d give you an update of what I was up to. :-)

-Jax

Next Page »

Jaxidian Update is proudly powered by WordPress and themed by Mukkamu