I’ll soon be starting a new permanent job, and in preparation I’m making it clear what is my prior intellectual property. In this case, it’s not so I can make “oodles of money” in the future, but it’s actually so I can release it as Open Source.
So what I’ll be explaining here is not something I’ve finished, but an idea which I’ve actually been playing around with for a year or so, but never gotten around to fully implementing. This will also help bring together my thinking on this and hopefully inspire me to really get going on this project :-)
What is funcjure?
funcjure is a “functional syntax wrapper” around Clojure. What do I mean by that? Well, Clojure is a great language, especially if you’re either used to or prepared to adapt to prefix notation. ie instead of typing 1+1, you type (+ 1 1) which although relatively easy to understand, can get a bit harder as things get more complex, like 9+5*7/4+62/6 which would translate as (+ 9 (*5 7) (/ 62 6) etc…
The logical question is Why? (do I have to type prefix notation) The Clojure and Lisp people will say “well, that’s the way it is, so just get used to it”, which I’m fine with as I wrote my first Lisp program over 3 decades go. Even still, I would prefer to use infix notation (which is what we’re taught for maths) and see no reason why we shouldn’t as computers are great at doing the sort of rote translation required to convert infix to prefix notations.
Clojure is a great language, which also has a fantastic ecosystem and community, and is written in Java which has a HUGE ecosystem. Furthermore, Clojure can call Java code, which has helped tremendously by giving Clojure “out of the box” access to so many libraries and products. Finally, because Clojure is a Lisp, its strong point is Symbolic Manipulation which is exactly what is required for translating infix to prefix structures in order to implement funcjure!
What would this look like? Let’s take some typical Clojure and then show what it would look like in funcjure:
"Hello World!" ; Minimal "Hello World!" ; "Hello World!" (println "Hello World!" ) ; Standard "Hello World!" ; println("Hello World!) ; Clojure((println "Hello World")) ; Execute some Clojure code (def a "test") ; Define a variable ; a="test" (def mylist '(1 2 4 5 6)) ; Define a variable list ; mylist='(1 2 3 4 5 6) (println a mylist) ; Print our variables ; println(a mylist) (first (rest '(1 2 3 ))) ; Get the 2nd element of the list ; first(rest('(1 2 3))) (.println System/out "Hello World from Java!") ; System.out.println("Hello World from Java!") ; or Java(System.out.println("Hello World from Java!")) (defn factorial ; Now let's do the classic Factorial function ([n] ; when only one argument is passed in (factorial n 1)) ([n acc] ; when two arguments are passed in, with recursion (if (= n 0) acc (recur (dec n) (* acc n))))) (factorial 6) ; And test it ; factorial(n) = factorial(n 1) ; factorial(n, acc) = if((n==0), acc, recur(dec(n), n*acc)) ; factorial(6)
The overall purpose is to make code much more accessible and ‘natural’ to write as we’re essentially taught infix notation as our “second language” when we study even the most basic mathematics. None of this is really new – in the beginning, things look like our old friend BASIC, with direct assignment and loose typing, which easily map to Clojure. You’ll also notice that access to Clojure and Java is provided by the respective functions. Speaking of functions, these are written similar to Prolog and other languages (eg Erlang) which allow for “pattern matching” in function definitions. In the beginning, the capabilities would be mapped directly to Clojure (as shown above), but eventually it would be nice to go to a full Prolog style, so the factorial function could be written like
factorial(0) = 1 ; The base termination case factorial(n) = n*factorial(n-1) ; Iteration by recursion
which I think is way more elegant.
That’s about it for this post, as this really contains the base concepts for what I’d like to do. There’s obviously a lot more scope and subtlety to this, some of which I’m aware of and probably a lot more which I’m not, but I personally would much prefer to use a language like this and have access to Clojure and Java when needed for efficiency or easy code porting.
What do you think? All comments / suggestions / critiques would be gratefully accepted as I haven’t really done much more work than this, other than having a 1/2 working translator for this syntax which I’m going to (hopefully) get to work on in the next few weeks before I start my job.
WOW! I just realised that it’s been a year since I did a blog post. I knew it had been a while, but I figured around 6 months max… Well, I suppose I needed it, and the good news is that I’M BACK!
I’m not going to go in to what has transpired over the past year since an agile adoption, as it’s quite involved and will come out in some successive posts, but will focus on where I am now and what my Posting Plans are.
Near the end of last year we started planning a return to Australia after almost a decade in the UK – what a BLAST! So many lovely experiences, people, places and new friends :-) Eventually though, it was time to return to Australia as it really is my home and although I may have a few gripes about it, Australia really is an amazing place and as the old cliche goes: I now really appreciate how lucky I am to live in this country after being away so long. That shot above is from my local beach which is 3 mins drive, and I can get in to the city (in the distance) in around 1/2h with a walk and public transport – that’s a pretty good lifestyle.
So what’s in the pipe? A much more varied mix than when I started out doing just “software stuff”:
- Reflections on life in the UK and Europe
- Observations on life in Australia now I’m back
- Reviews of gadgets
- Travelogues as I explore my own country – now I’ve probably seen more of Europe than I have of Australia, so it’s time to correct that
- Process – yes, I’m still on the agile path
- Architecture – looks like that will be my primary area of work still
- Software – which I’m gradually getting back in to, with the current focus being Clojure
- Probably the odd bit of music or photography to round things out
- Anything else anyone would like me to write about…
If you follow me on Twitter (@RiczWest) then you’ll know I was working on an iOS game called ASCIItrek which is derived from Super Star Trek that was written in C. I’ll eventually do a complete rewrite in Swift, but before that I’m taking the existing code and integrating it in to an iOS interface. In order to do this I’ll need to call C code from Swift. The Architect in me however wants to cleanly separate things and use Objective-C as a “bridge”, which as you’ll see later is probably a pretty good idea.
It’s always been “theoretically possible” to do this in earlier releases of Xcode prior to 6.3, but the whole process seems fraught with potential errors and I could never get it fully working. With the recent release of Xcode 6.3 I thought I’d give it a go and am glad I did as it seems to work relatively easily as I’ll describe.
Note: In this post I’ll assume that you’re relatively familiar with coding in Xcode
Firstly, you’ll need to create a project, which is no-brainer – just create a Swift one which we’ll adjust as we go… At the highest level we’ll have some code which acts as a test harness which I just added:
where chopper (tribute to American Chopper :) is an Objective-C method and c_chop is a c one which is invoked from Objective-C. First, the Objective-C one which is relatively simple:
if you just look at the chopper method where I’m basically doing a string concatenation – we’ll get on to the c_chop method after we’ve examined the C code:
which has one basic method/function called chop that like the Objective-C one just prepends the parameter which is obviously more complex in C. The one thing that worries me slightly is the fact that I’m mallocing memory which is passed to Objective-C which I’m kind of assuming will be deallocated – I’ll probably revisit this later…
If you go back to the Objective-C code above for c_chop you’ll see there is a bit of complexity, which is why I think it’s better to wrap a C call in Objective-C. The stringWithFormat: method is just a concatenation, but notice that you have to convert the Objective-C/Swift string to UTF8Sting before passing and then convert the result back with stringWithUTF8String. To me, this is enough reason to have an Objective-C layer interposed between your Swift and C layers.
Hopefully this post has made it easier for anyone else who is on the same path – the code is on GitHub at https://github.com/RiczWest/swocc – feel free to mail me if you have any questions. Later, I’ll be doing another post on C to Objective-C to Swift (which I also need)
PS Having HUGE problems with syncing GIT, which I have just checked and they are a BUG – I will attempt to fix later…
Note: If you think I’m some kind of “Apple Hater”, read My History with Apple at the bottom
Apple seems to be suffering an all-round lack of quality in their software and some would say hardware – what to do? Before we get in to this, let me tell you my tale of woe…
This post has been 6 months or more in the making, but has culminated with the problems I’ve been having with my iPad Air 2 over the past months. It all started so innocently – I was happily using iOS 7 and I’d installed a new App which said “In order to use this, you must use iOS8”. Fine, I thought – it’s been out for a while and there have been a few incremental updates (something like 8.0.3) so I upgraded. From memory, this one was OK, so when 8.1.2 or 3 came out I didn’t really think much and just upgraded, and that’s when my problems started.
It was a bit like a horror movie – you know, everything is fine, the sun is shining – living the good life (on iOS 8.0.3 :). Then, one day (some time in 8.1), something a bit out of place happened – I was finding it hard to close browser tabs – didn’t really think much of it. Unfortunately over the next few days, things got worse! Typing started either not getting the characters or doing multiple characters and it just got worse and Worse and WORSE! Basically, my iPad was bricked. “Luckily”, 8.2.2 had been out for a while so I upgraded, after checking the forums as some people reported it solving the problem.
Then, like a groundhog day, all started coming back with the same pathology – first, an error here or there and after a few days – bricked again. 8.2.3 came out so I went to this – same thing – worked for a while, then bricked. I was at the end of my tether and was at the stage of buying a cheap Android tablet to use at work until Apple fixed things on the iPad. Again, as luck would have it, 8.3 is out and I’ve just upgraded today. I’m not holding my breath though as I know that this bug can surface after days or weeks…
What’s the Problem?
My experience is not unique. In fact, I’m one of the “Lucky Ones” who didn’t have problems with iOS 7. Just Google “iOS problem” and you’ll find there are 194M pages!!! I know there are even more hits for Android (564M) and Windows Mobile problems (264M), but is that really something to compare to? Especially when both those platforms are on a wide range of uncontrolled hardware, whereas Apple is a “closed ecosystem” where they’ve designed every Apple Phone ever made. As a long-time (over 30 years – I started with an Apple II) Apple user I’ve seen an increase in the quality of their software, until the last few years. A bit like my touch problem, they surfaced occasionally, but were not of significance, but now we’re talking about many, releases with the same or worse problems – where will it end? Don’t think iOS 9 will necessarily fix everything as as iOS 8 was supposed to fix the problems of iOS 7!
What’s even worse, the “Crappy Quality Virus” seems to of infected the Mighty OS X. Touch wood and 3 Hail Mary’s I’m actually OK – running Yosemite 10.10.3 and no problems. Again, Googling “OS X problem” gives 264M hits – more than iOS! For both OS’s, there’s now a huge industry around documenting and fixing the various problems – all on platforms that Apple has total control over – THERE IS NO EXCUSE!
What’s the Solution?
As I mentioned at the beginning, I’m not an Apple Hater. In fact, I’m an Apple Lover – I used to have the attitude of buying Apple for anything personal. Unfortunately, I’m now in the situation where if this doesn’t improve I’ll be replacing my iMac with one of the many all-in-one PC’s, and my Tablet with an Android or Windows one. I already have an Android phone as I was about to get a 5, but the company I was working for got pre-release devices and they kept (physically) breaking.
To the solution: I believe this malaise set in with the passing of Steve Jobs. For all his faults, the amazing thing about Jobs was that he got understood the Business, Design, Hardware and Software of making “Insanely Great Products”.
What have we now? We have Tim Cook who’s background is in Sales and Manufacturing and Jony Ive, the reclusive yet internally influential and widely acknowledged design genius (although I do question the “new blue folders” on Yosemite and the Apple Watch). What’s missing?
Hardware & Software
Name the people associated with those… There’s a hardware guy who we see in their videos, but I can’t find him on Google. For software, there’s Craig Federighi and I must admit I thought Phil Schiller was until I looked up Google and found he’s VP of Marketing! Therein lies the problem – there’s no outstanding person across Hardware and Software. Although the ideal would of been to find another Jobs to replace them all, I don’t think that would ever happen. What is needed is someone responsible for “Integrated Design” who can work with Ive, ensure the highest standard of hardware and software is produced to go in to the Objects of Desire that Apple makes and has the same visibility as Cook and Ive.
Why did I write this?
Probably mostly to get all this off my chest and also as a warning of what may happen to Apple if they don’t get back on track. We’ve seen so many companies like IBM and Microsoft fall so far when they lost their way, it would be a pity to see the same happen with Apple…
Finally, I have the tiny hope that someone at Apple sees and relates to it – I’d love to continue the conversation…
As mentioned at the beginning, before anyone thinks of criticising this piece (which you’re free to do after you’ve read this :) here’s a brief history of my (hopefully ongoing) time with Apple products:
- Started with an Apple II
- Used a Lisa – a rich friend had one when I was in my senior school years
- Got caught up in the “PC Revolution”
- Shipped some of the early NeXTs* to Australia, did the Australian product launch, taught NeXT programming, created software for NeXT, attended most NeXTworlds and met Steve Jobs
- Got caught up in the “Java Revolution”
- Employed by a company in the 90’s who used Apple gear, got my own and went to a few WWDCs (before they were hip)
- Have continuously bought Apple products again since the 90’s
- Currently have an iMac, Mac Mini, iPad 2, iPad Air, two Apple iPods and an Apple TV
* For you young’ns, NeXT was what Jobs created after Apple fired him and NeXTstep was the operating system which became Cocoa – all those NS prefixed classes stand for NextStep
I was “doing stuff” on my iMac and got a Notification saying “Why not try the new Memory efficient and Fast Safari?”. Fine – I thought – I’ve just upgraded to Yosemite, so why not give it a go?
Boy, was that a mistake..! The first hint was Safari “Not Responding”
Well that’s probably OK as it’s the first time Safari is staring up in my account, so it’s probably doing a few things…
That’s a bit of a worry – a browser, which should be 2-300M in memory is not only consuming 3G Virtual Memory (I only have 4G real), but it’s now causing other programs like DropBox to “Not Respond”. That’s a serious load on the system!
and it peaked at 5G memory consumption – that’s for a browser!!! The Yosemite image comes on less than that! There is a serious memory allocation bug here, however it’s leveled out, so I decided to just let it run… No difference though, it just stayed at 5G so I had to kill it (after about 10 mins)
and of course everything went back to normal. To be fair, when I restarted it, Sarari, it was consuming less than Mozilla
but there’s only 69M difference… Hmm… What to choose? A stable browser I’ve used for many years, or a “psycho browser” that chewed up 5G of memory on a whim? The choice is obvious!
Anyone who knows about the Broken Windows Theory of Software Development will realise that this is not a good sign. I’m not talking about some obscure utility that I had a problem with, this is the System Browser!
If I was Apple, I’d be worried about it… and I’d posit to say that if Steve Jobs was at the helm, this would of never happened. Unfortunately, the two people that seem to be “running” the company are Tim Cook (who is a classic Delivery Manager) and Jonathan Ives (Absolute Design Legend) don’t seem to understand one critical component to the whole “i-experience” – Software!
Yes, Jobs was a tyrant (I’ve met him and seen him meter justice to others for no good reason) but he did have an understanding of Software Quality, which is something that is sadly lacking with the current management…
This is just a small example of Apple “losing the plot” and anyone who has “upgraded” to the various bad versions of iOS or OS X will know what I’m talking about…
Why did I write this? Because I love Apple products! I’ve been using and programming them since before they were “cool” (2002 – actually 1993 if you count NeXT) and don’t think it’s too late! Apple are starting to go down a slippery slope… If they pick up their game they can still produce “Insanely Excellent” products, but that’s to be determined. If they don’t, then people like me will switch to Windows (which is becoming “not that bad”) or Linux (which I can handle) and everyone else will switch to something else about 5y after…
PS For those who don’t know me, this was written on an iMac and I have an iPad 2 Air, so I’m not an “Apple Basher” ;-)
PPS Another “broken windows” tip – who wants a calculator that has a translucent background on the display???
what if I had a light background behind it? That’s just crazy… Again, broken windows
It’s been quite a while since I’ve posted much, mainly due to a contract which requires me to drive on the M20 and M25 (aka “the carpark” for those outside the UK) and as a result, I just don’t seem to of had the time and energy…
I look forward to getting on something where someone else is doing the driving so I can use my time effectively
Amazingly, it seems like only 7% (4.5 Million) people in the UK use public transport. Given that nearly 1/3 (22 Million) live in the South-East, where transport is generally pretty good, that seems pretty low. No surprise given the number of people on the motorways – I’ll be happy to take one more off them next contract.
So what’s up for 2015 for me and this blog?
For one, I plan to start getting back in to a bit more of a rhythm, both with my posts and the associated (play) work (generally outside “real work”), and I will continue to post based on my experiences – recent and past…
- Lifestyle & Reviews
- Process & People & ScramJet
- Architecture, including Enterprise & SOA aspects
in no particular order. I won’t get in to specifics as much of it is not yet planned, or I’m working on it but don’t want to reveal it until I have enough meat on the the bones so I can be sure it will fly.
- Review of Bob Marshall’s “Thinking Different” happening last year
- Review of the: BMW i3 electric car; Samsung Galaxy Alpha
- Corporate Subversion – in a positive manner of course :-)
and that’s really just the “boring stuff” – there should be some very interesting posts coming as I hit my stride.
I hope you’ve all had a great XMas & New Year break and look forward to some great interactions in 2015!
Today I’m (@RiczWest) starting a new twitter account. It’s called ChangeArc. For those who follow me, you’ll recognise this as my “Blog Name” – so what’s the purpose?
Simple – when I started using Twitter, it was primarily as a bookmarking tool. To some extent I still use it as such, but also for so much more…
There’s one problem though – as I look at a lot of content, that means a lot of tweets, and not everyone likes that, including me! There are a number of great people I’d like to follow, but I can’t because they tweet too much.
To that end, I’m going to start a much lower volume (only a few tweets per day) account which is ChangeArc. So what can you expect apart from less tweets? Extremely high quality tweets that will include any posts I do.
I don’t know how this will evolve, but it will be interesting to see…