3D printing and other software curiosities
by Clinton Freeman

An Open Love Letter to Alexander Calder

21 Aug 2015

Dear Alexander Calder,

This is the first fan letter I have written posthumously, and I’m worried that it might become awkward. But I’m going to push on, mostly because I find writing such a powerful way of learning. I guess that is why they make you write essays at school.

In many ways I’m here because Tom Sachs sent me. I was watching a lecture by Tom when he casually dropped “… all the evidence or what Alexander Calder would term ‘the scars of labor’”. I paused the video and looked up your work. The first photograph I found of your sculptures was instantly familiar. I had spent a couple of minutes mumbling stuff like “I have seen this… Where I have seen your work?” when it smacked me in the face. I ran to the bookcase and dug out the textbook ‘Introduction to Algorithms’.

Photo the cover of the text book introduction to algorithms featuring big red by alexander calder

On the cover, staring out at me was something you created in 1959, Big Red. It was one of those shattering moments that brought me right to the existential ledge. I had spent hours of my undergraduate years studying from Introduction to Algorithms. Why had it taken me over fifteen years to finally consider the cover? It was here I realised the world was filled with dimensions that I had been completely oblivious too. I was hooked. Why was your work on the front of my textbook and who were you?

I found one of the answers from Thomas Cormen, an author of Introduction to Algorithms.

We chose it because it’s a tree drawn the way that computer scientists draw trees. We were hoping to find a Calder mobile with both red plates and black plates, but we couldn’t find one.

The harder question of who you were took much longer. But the more I dug, the more I liked what I found and the more I noticed an unseen thread through my life. Building mobiles in primary school, visiting sculptures in Canberra and Sydney. I’m pretty sure at one point I even had a toy car that sported your livery. As someone who was born five years after your death, it was easy to accept the praise around your work. I mean to be able to look back on my life and easily recall instances of your cultural influence? I think that carries a fair weight, especially considering I live on the other side of the planet.

Photo of Alexander Calders art car, a 1975 BWM 3.0 CSL.

The fact that you were first a mechanical engineer was cool. But I’m biased on that front, the thing I enjoyed learning most was your attitude. Just doing what you loved. You created a huge volume of work, I saw someone estimate it at something like one a day for twenty years? And your attitude towards the ‘establishment’ seemed to reinforce that. Ignoring what you called ‘hubbub’ and even refusing to call your work art? Sticking with just ‘objects’ and letting others label your efforts? I think that is what really set you apart.

 

 

Each time I write one of these letters, I’m left with at least one unanswered question. I wonder who the unnamed engineer was that inspired you into mechanical engineering? Was it something they built? Was it who they were? Why you got into engineering and the tension between your early career and lifelong profession would be a fascinating story. Especially as someone who struggled with early career tensions of their own and is desperately trying to find their calling.

Love,

Clinton Freeman.

 

Analogue.js

17 Aug 2015

Recently I received a typewritten letter. Not printed, but typed on an old school mechanical typewriter. I can’t even remember the last time I received something that had come off a typewriter. Maybe a school report from when I was a kid? This typewritten letter was the catalyst I needed to condense a bunch of half formed ideas into a project. My fourth curiosity

Mechanical typewriters are awesome. Despite excellent legibility, there are all kinds of uncertainty that adds imperfections to your work. How hard you press the key, translates to how well the ink transfers to the page. How the ink bleeds on the page differs depending on character and with variations in the fibres of the page. Oh and typos. There is no hiding those suckers on a mechanical typewriter. You either throw out the whole page, use correction tape or just straight up type over the error. While word processing on a computer scrubs away all these scars and replaces them with the chiseled perfection of a bank statement.

OK. So I was going to show a video of a mechanical typewriter, but I couldn’t get past this amazing commercial for IBM’s Selectric typewriter:

 

 

Loads of people have attempted typewritten fonts for a computer. For example, take a look at ‘Brother Deluxe 1350’. At first glance it looks roughly like it has come off a typewriter, it has ink bleeding and some of the characters are mishit. But, you know that clammy sensation creeping into your mouth right now? That is taste kicking in, it is telling you that something isn’t right. It is telling you that this is terrible fake. If we pull out the letter ‘e’ and type it over and over again, it completely shatters the illusion. Each keypress is not unique and the whole typewriter effect has been destroyed. All we have ended up with is some badly rendered characters.

The quick brown fox jumps over the lazy dog and a few es rendered in the font Brother Deluxe 1350.

The author of Brother Deluxe has actually done a pretty awesome job given the tools at hand. The problem actually lies in the way a computer renders typesetting. Font authors are only ever given one way to represent a lower-case ‘e’. They have no way of expressing all the subtle variations that a mechanical typewriter generates ‘e’.

Some people get around these constraints be generating images where each keypress is unique. Oh. Oh. Oh. And this is where I finally get to use my favorite 90’s argument against flash. “But, that breaks the web… Man.” Images are large to send and search engines can’t read the content. Not to mention being time consuming to create. I just want to peck away at my keyboard and have each key-press rendered uniquely like a typewriter.

Analogue.js is a canvas based typesetter that does just that. Add the 'analogue' class to your element and analogue.js will do the rest. Analogue replaces existing HTML elements with a canvas. It then generates a unique ink-strike for each key-press, along with any misalignment. It even occasionally smudges a character or renders transpositional typos. The underlying font is a digitised version of IBM's Selectric typewriter ('Courier New'). As a result, this paragraph will never have two page views the same\*. Open up a couple of tabs and check it out.

Tom Sachs and Van Neistat inspired this analogue approximation for website text**. So I threw together a more comprehensive demonstration based off their work, ‘Ten Bullets’.

If you wanted to give analogue.js a whirl, the source code lurks on github.

* Given enough characters written on a page. I haven’t worked out the exact number of permutations. But there are many.

** With a bit of Jeff Atwood thrown in to make sure it preserves the googlebot love.

 

Sticker Chart - July

07 Aug 2015

Well that was a flat month. A load of distraction to scare off focus. The chuck on my cordless drill jammed right in the middle of the month and was off on repairs for a whole week. It dragged me into a bit of a funk. Every time I would look around and say ‘I know! I will…’ I ended up blocked by not being able to drill something. Still. I managed to pop out the other side with a pipeline full of work for August.

Create.

No sticker.

I wanted to finish the setup of my workshop this month. I came really close, but I just have a couple of details I want to finish off before declaring it done. However I did restore and upgrade my workbench. I am surprised by the improvement it has made to the whole workshop. At the end of July, the workshop it officially became my ‘happy place’. It reminds me of that scene in Fight Club with the penguin, you know. The narrators power animal? Damn. I need a power animal. My workshop needs a power animal.

Before and after shots of my workbench improvements.

The old workbench got some strengthening, plywood drawers and stainless steel slides. All my hand tools are now organised in some tough cases from Dewalt. They are watertight, ideal for stopping my tools from rusting in the tropical humidity. I added a plywood shadow board for all my consumables and lighting. It is so nice to finally be able to get at what I need without rummaging for 10 minutes through various milk crates.

Workbench with draw slid open and toolbox open.

In the end I spent a week designing, planning and ordering for future projects. Plus cranked out improvements to TriggerTracker for the upcoming show at the Brisbane Powerhouse.

Read.

No sticker.

Distractions struck here too. Spent my research time diving down a whole new alley in my influences chart.

Exercise.

No sticker.

Back on track this month, clocking in 71.3 kms. For a couple of weeks there was a new super yacht moored in the marina, ‘Serenity’. Each time I ran past, I imagined it belonged to Joss Whedon and that he was hiding inside writing a second season to Firefly.

Super Yacht Serenity moored at the Cairns Marina.

 

Influences

24 Jul 2015

School was pretty regimented. Everything from when I could use the toilet to what I could learn was dictated by others. That wasn’t a complaint, I kinda liked school. I mean, sometimes it was awkward and not a lot of fun. But I never ‘hated’ school. I guess I was a bit of an oddball kid and a little inconsistent on the critical thinking front. Behavioral constraint? No question. Yes Sir. You should learn mathematics, while difficult it will be useful. Yes Ma’am. Geography and ‘facts’ about the Murray River? Woah. Hold up there. HOW CAN YOU POSSIBLY SAY THAT? Ten minutes of argument later, I would be sitting outside twiddling my thumbs.

Photo of the "dish" radiotelescope at Parkes, NSW

One thing I should have questioned, was how schools index knowledge. All through school prerequisites dictate what you can learn next. Counting, Addition, Subtraction, Multiplication, …, Linear Algebra, Languages and Logics, Algorithms, etc. It wasn’t until my final years of university that I had figured out how to play the system a little. I needed an six more credit points in physics to pass my degree. I put a lot of research into finding the easiest six credit points I could possibly earn. Oh. Hello. What is this? Introduction to Astronomy, that sounds easy. I went to every lecture. Every single one. Each time wearing the same stupid ear to ear grin. I would roll up on a Friday afternoon to a darkened lecture theatre to watch pictures of different star systems. It tuned into the perfect way to unwind from a week spent struggling with what ever bit bending exercises I was working on.

While reading ‘Steal Like An Artist’, the idea of climbing your own family tree stuck out.

Instead, chew on one thinker – writer, artist, activist, role model – you really love. Study everything there is to know about that thinker. Then find three people that thinker loved, and find out everything about them. Repeat this as many times as you can. Climb up the tree as far as you can go. Once you build your tree, It’s time to start your own branch.

It wasn’t the first time I had heard of indexing knowledge this way. A professor that I had the good fortune of working for was always referring to her academic family. She had cousins, an academic father, an academic grandfather and so on.

Austin Kleon’s Steal Like an Artist just gave me the motivation to have a crack at re-indexing my own knowledge. So I started building my own ‘family’ tree by writing fan letters. It is giving me the chance to form strong opinions on what I really like about a person’s work. So far this is what I have:

It is a bit of an advent calendar I guess, initialed names are my current research front. As I finish another love letter, the initials and their influences get expanded and the family tree grows.

 

How responsive are Estimote iBeacons?

09 Jul 2015

A year ago I first got my hands on a pack of Estimote iBeacons, I spent a bit of time working out their accuracy and quickly fell in love with them. The quick answer. Super accurate, within 10cm when you are 1 metre away.

Chart showing estimote error envelope and how it changes over distance.

What bothered me about the test is that it was static. The phone fixed in place and didn’t move in relation to the Estimote. This wasn’t representative of how iBeacons get used in practice. People holding mobile devices move around the place and ‘happen’ upon an Estimote. The settings I was using would sometimes feel like it took a minute or two before the mobile device registered that it was near an iBeacon. Estimotes are accurate, but sometimes it took a long time for the measurements to catch up with a moving target.

For the sorts of locative applications I write, a sixty second delay is unacceptable. After a bit of tweaking I got everything as responsive as I wanted, but it was a clumsy approach. So how long does it take for Estimote distance measurements to ‘catch up’ with a moving target?

There are four main settings that have an impact on Estimote response time. Two are set within your application and the other two on the Estimote beacon itself. The application side parameters are set with the ‘ForegroundScanPeriod’ method call. You can tell your application how long to spend scanning for iBeacons and how long to wait between scans. Altering these settings can make your application spend more time looking for iBeacons.

For the Estimote itself, the two parameters that affect response time are Broadcasting Power and Advertising Interval. A higher broadcasting power will mean that your phone will be able to hear the iBeacon at a further distance. While a lower advertising interval will send ranging pings more often. Naturally, upping these settings will burn through your Estimote battery at a faster rate. So getting all this right (and optimised for your application) is important. If the advertising interval on your Estimotes is set at 950ms, intuitively you would expect the median response time to also be around 950ms. Well lets find out.

Photo of estimote, iphone and ipad. Ipad displays power table displayed on estimote blog.

To test, I built a little utility application for measuring response times. Placed the Estimote on the ground and measured out some markers. The nearest being 3 metres from the Estimote, this was my target. I then measured out 8 metres and 21 metres from the Estimote. These were going to be my two starting points. The 21 metre starting point being behind a large concrete cyclone resistant home (at this point, I was always out of range of the Estimote).

Walking from one of the starting points, I would walk up to my 3 metre mark and press start on my utility app. This started a timer, which would only stop when the distance returned by the Estimote SDK was between 2.1 and 3.9 metres. This wide error margin is the expected accuracy at this range, as found in my earlier test.

 

 

I did this ten times from each of the starting points for each of the configuration sets I tested. If you are after the raw measurements and stats, you can check out the full dataset and calculations here.

With the default Estimote settings (-12dBm broadcast power and a 950ms advertising interval), the median response time was 1300ms. Much higher than the 950ms I was expecting, but the worst case was a whopping 21000ms. This was inline with my experiences, having measurements to debunk earlier anecdotal experiences helped. Keeping the Estimote settings the same, and using 950ms for both the poll time, and poll wait actually made things worse.

By upping the broadcast power to -4dBm, and bumping the advertising interval to 600ms I was able to get a sub second response time. It also dropped that worst case wait down to around 6 seconds. Tolerable for my application, especially considering it is only a rare occurrence.

Chart showing estimote response curves, showing likelihood of accurate distance measurements since arriving at a nominated location.

I’m having a second honeymoon with my Estimotes now that I can configure the right response times for the applications I build. Upping the power and lowering the advertising interval only had a modest impact on the battery life of my Estimotes. They are still claiming to have about two years of juice left.

Warning! Self promotion ahead: Live in Brisbane, Australia? Want to see Estimotes used in a neat little piece of Science Fiction theatre? Tickets for ‘This is Capital City’ are on sale now.

 

Sticker Chart - June

02 Jul 2015

What I am noticing, no matter how much I do in a month, I’m always unhappy with my ‘create’ progress. I’m not exactly sure why that is the case. Maybe it’s because I feel like I’m behind? Maybe it’s because my projects list grows faster than I can create them? Maybe I feel guilty when I don’t have the stamina to concentrate on my monastic goals for a solid eight hours? Whatever the case, I haven’t felt as though I have earned my monthly ‘create sticker’. I hope come the end of the year I manage to land one of those coveted suckers.

Create.

No sticker.

This month was pretty quiet, and was a purely digital month. I didn’t build anything physical, but did get a circular saw for turning plywood into sawdust. Pretty excited, it should speed things up, especially for a couple of bigger projects I have in the pipeline. Instead, this month I blew the dust off a couple of software projects.

  • Signalbox - An experimental signalling server for WebRTC.
  • TriggerTracker - Site specific theatre software for mobile devices.

The vast majority of my time went into TriggerTracker. Sandra Carluccio and her production company Counterpilot are developing an interesting little science fiction work that takes place around the Brisbane Powerhouse. I had a fair chunk of code to write for our first rehearsal that happened last weekend. It went well, it was great to have time to properly test the work. Sometimes it can be a feverish last minute process. Having another couple of months for refinement and polish will make a huge difference.

Interested in how Science Fiction, smartphones and iBeacons blend into a theatre experience? Tickets are on sale now.

Read.

No sticker.

Somewhat ambitiously, I picked a crazy long book. Haven’t finished it yet, I need to set aside more time and headspace for reading.

Exercise.

No sticker.

Missed a couple of runs this month due to a bung knee, but still managed to hit my distance goal for the month (just - 52km).

Photo of the Cairns cruise ship terminal.

 

Sony Xperia E1 Review

24 Jun 2015

For a while now I have been on the hunt for a cheap android handset that features a Bluetooth Low Energy (BLE) radio. Until recently, this new standard was only on the latest and greatest handsets, with matching price tags.

I write custom software for theatre performances and tracking the location of the audience is a big part of the smoke and magic. In these site-specific performances, the audience walks around, rather than sit in auditoriums. While software tracks their location and plays audio and video files from the handset. Before iBeacons became mainstream I did the location tracking with GPS and a home-rolled bluetooth tracking system. Neither of which were as accurate as I would have liked, and the bluetooth system was cumbersome.

I have switched to using Bluetooth Low Energy (BLE) and iBeacons, it is fantastic. Better accuracy, indoors is no fuss and it’s easy to tear down and set up the performance in another location. What was missing were cheap handsets. At $300-$400 for a handset that worked with iBeacons, it put a serious limit onl the audience size we could run on small budgets.

Photo of Sony Xperia E1 handset and packaging

Recently in Australia, Optus put the Sony Xperia E1 on sale at $59 AUD (or $130 USD unlocked from Amazon). YES! It was the right price, but was it any good?

At first glance I was pleasantly surprised. The E1 is a solid phone and will take a tumble better than most smart phones. Not as hardy as those old Nokia bricks, but it certainly won’t bend in your pocket.

But holy crap, the touch screen actually works. A rarity for budget android handsets. Every sub $100 android handset I have ever used has had a touch screen that is so horribly inaccurate it straight up doesn’t work. No. Stuff you. I want to press the letter ‘t’ not ‘e’, you stupid phone. On the E1 however, the touch screen is responsive and accurate. So although it may only have a 4” screen, you aren’t at a big disadvantage because you can still tap on what you are after*!

As for specs, it is well rounded for only sixty bucks. Android 4.4, 1.2GHz processor, 512MB Ram and 4GB storage. Plus the oh-so-sweet Bluetooth 4.0 that I use all the time. The Xperia E1 has more than enough grunt to power site-specific theatre performances. We can live mix a soundtrack based on a persons location and trigger narrative at pre-defined locations.

The only thing noticeably missing is a front-facing camera. But at $60 it is pretty hard to complain about that.

The big thing I don’t like is common to all Sony phones. To leverage off their existing brands (like playstation and walkman), Sony built their own versions of many standard apps. But for whatever reason (legal or technical) the Google equivalents still kick around on the device. Expect to get asked if you want to do this with ‘Walkman or Play Music’ a LOT. But that problem is common even in more expensive Sony handsets, so again it is pretty hard to nit pick. Recently Sony dropped the brands and went with simpler and more descriptive names (I.e. walkman became music). It makes me wonder what value remains in rolling their own custom applications.

All in all Sony have done very well with the Xperia E1. You get lots of phone for only $60. They are light years ahead of any cheap handset I have used in the past and when used in site-specific theatre? Awesome.

I give the Sony Xperia E1 4.5 stars out of 5.

4.5 stars out of 5.

* I’m also a little biased towards smaller form factors – never been a fan of phablets.

 

An Open Love Letter to Jeff Atwood

21 Jun 2015

Dear Jeff Atwood,

For seven or eight years you have unwittingly been a mentor of mine. So I guess it is your fault that I still suck… But at least I now suck in public. Nervous Laughter. Opening a fan letter with obscure in-jokes? Risky. But stick with it, I hope this letter instills you with a little extra motivation. Your blog has given me plenty of motivation over the years, so it is way overdue that I try and repay some of that debt.

 

 

This talk you gave in 2012 is brilliant. You managed to distil decades of writing articles and software into a concentrated 25 minute hit of your ethos. I still re-watch it, especially when I have utterly sucked and got kicked in the guts by my own mistakes. I didn’t intend for this to be a confessional, but yeah. It is normal for developers to watch this talk while crying and eating ice cream… Right?

A photo of a software developer crying and eating ice cream while watching how to stop sucking and be awesome instead.

Woah. Oversharing. Actually, that brings me to the other thing I always enjoy about your work. You never seem to take yourself too seriously. There is always plenty of room for a joke. As someone who enjoys the Jeff Atwood experience over the Internet, this humour imbues your avatar with humanity. One of many skills that allows your personality to survive the transmogrification into the digital world. A process, which for most is brutally dehumanising. No matter where you lurk on the Internet, it is clear. “Hi. I’m Jeff and I am an actual living, breathing person.”

I like how your mega projects are about empowering others with similar skills. Making social interactions function on the Internet in a similar way as they do in the analog world. You don’t need to take a long trawl through comments on YouTube to realise that this is long overdue.

I’m really happy to see you continue along this path with Discourse after leaving StackOverflow.

 

 

So thank you. Your the reason why I’m not afraid of falling over in public anymore. Your blog has inspired a few of my projects, and also into taking the leap of choosing my own adventure.

Love,

Clinton Freeman.

P.S. Appologies that this website ended up so much like yours asthetically. It wasn’t a conscious decision. Well some of it was directly inspired. But I just kept removing things that obscured content and ended up in a similar place. I guess reading a website for almost a decade rubs off in more ways than you realise.

 

The 4chan Test For Website Griefing

11 Jun 2015

In the early days of Stack Overflow, Jeff Atwood and Joel Spolsky hosted a podcast covering the rationale behind their design decisions. In those early days, Jeff and Joel talked about the community of developers they wanted on Stack Overflow. One of my favourite recurring themes during this time was around griefing (and trolling). Joel offered this neat little analogy:

This is exploiting the system basically to play a different game than the game other people in the system want to play. You’ve got a bunch of people playing chess, but you want to play “Throw the chess pieces all over the park!”

Sketch of cliche action film paraphernalia by Nicholas Allen.

You got the sense that Jeff and Joel wanted to create a welcoming place for all walks of developers. They had first hand experience with communities that had devolved over time. They thought Stack Overflow would need to rise above those issues to succeed.

 


 

Fast forward a year or so and I decided to make a website to help settle arguments with my wife.

Yeah I know. What a stereotypical software engineer response. Disagreements with my wife? I need a website!

Picking a movie we both enjoyed was pretty difficult, we needed information to make the decision easier. So I made a movie rating website to determine if a movie was something that men liked, or one that women would prefer.

Seeing as the rating was all vote based, I wanted as many votes as possible. I didn’t want to watch Pride and Prejudice again, there had to be good stuff that we would both enjoy. So I designed the website with a low barrier to entry. It didn’t have any sign up requirements or captcha’s or anything like that. Just buttons for your voting preference.

Old sketch of mypickflick from around the time it was submitted to reddit.

With almost no checks in place, I wondered how long it would take before people started throwing chess pieces around the place. So a friend of mine submitted it to Reddit. Twenty minutes later ‘Debbie Does Dallas’ was the number one film women enjoyed. It had something like 100 times the votes of all the other films combined. For a grief, it was pretty hilarious.

So I installed a movie pre-populated blacklist and the request “No pornographic movies please.” It was enough to resolve the current forms of griefing. I was telling my friends about the improvements, and we talked about a more difficult test. We needed people from a place with little or no rules, a place where moderation or censorship is largely avoided. A few moments later it was on 4chan.

Well, things got interesting. Someone wrote a vote spamming script that would systematically reverse the lists. The script preserved vote the tallies exactly, but everything was back to front. Not as funny as the first grief, but impressive. Someone had put some real effort into griefing an obscure corner of the Internet I had created. More coding later, and I had some vote limits in place to reduce this sort of spamming.

I maintained the website till a few months ago, retiring it to focus on little projects I could build in a month. But the 4chan test for griefing is one I won’t forget. Need to find unexpected sources of griefing? Just paint a target on your project and take it to the corners of the Internet with little or no rules.

* Awesome sketch by Nicholas Allen.

 

Sticker Chart - May

04 Jun 2015

My parents came and visited for a couple of weeks in May. It was great, we spent a heap of time hanging out and exploring around Cairns.

Create.

No sticker.

Over the last couple of months I have been digging around the works of Tom Sachs and Van Neistat. I wrote a couple of fan letters as a way of better understanding their work. While studying Van Neistat’s work I found myself wondering “Where in the world is Van Neistat?”. In recent years he has become a digital ghost. I had been toying with the idea of a long post that lined all the bread crumbs up, making it easier for others to answer a similar question. Then in the comments to my fan letter, Van replied to my fan letter, and I found a lot more people wondering the same question. So I decided to go the whole hog and created a digital museum.

http://van.neist.at/

Oh alright. I guess that is just a millienal way of saying I created an old school GeoCities fan site.

I also knocked up a better solution for our outdoor shoe storage. The heavy rains up here were flooding our shoes on occasion. We also needed a better place for storing our big arse tropical strength golf umbrellas.

 

 

Finally finished up the second half of the third curiosity. A sunrise / sunset simulator light system thing for my aqarium. The planted aquarium has become a bit of a full time hobby. Between snail outbreaks and algae blooms, our poor plants have been struggling. Hopefully I’m starting to get on top of it now.

 

 

Writing was weak, so no sticker this month. Working on the didactics for the Van Neistat museum soaked up most of my writing juju this month. I completed only one article.

Read.

Mr Magoo Sticker.

Four Colours Suffice: How the Map Problem Was Solved - Robin Wilson

Tells the story of how a long standing mathematical problem was solved.

Can every map be coloured with at most four colours in such a way that neighbouring countries are coloured differently?

In many ways I found the history of the four colour problem more interesting than the proof itself. Especially the rise of computing within mathematics and how computers powered the solution. I also enjoyed the little stories behind famous mathematicians such as Euler and Möbius.

Excercise.

Atom Ant sticker.

Went to Cape Tribulation for a weekend. I love that place. Light drizzly rain and Gomez set the mood for a super fun evening run. Clocked up 78.8km for the month and I am almost back on track for my yearly goal.

Photo along the beach north from Cape Tribulation.

Photo along a jungle path crossing Cape Tribulation.

 

Copyright Clinton Freeman Ⓒ 2007-2015