Daniel's Stuff

I write code

Category: Programming

Titanium Appcelerator == yuck

After spending considerable time recently working on a fairly simple iOS app using Titanium Appcelerator I have come to the conclusion that I am never going to use it again if I can avoid it.  The app size isn’t too much of a problem, but the fact that even this simple app crashes on startup on some devices makes me very nervous.  I was hesitant to use the product at the start of the project, but the client wanted to be able to produce an Android app from the same code base, so I agreed.  I suspect that I would have been able to build both apps from scratch using the native tools by now even though I’ve never made a production Android app before.  Live and learn I guess.

The first stage of my port of pegged to Swift is successful :)

I have managed to get the Objective-C version of pegged to spit out a parser using Swift rather than Objective-C 🙂

It’s getting late, so I really should get some sleep.

I finally figured out what was causing the compiler to crash.  The following code will crash the Swift compiler unless the inout parameter to the block type is removed.

typealias MathFunction = (a: Double, b:Double, inout x:Int) -> Double
var counter = 0
class Executor {
    var fn: MathFunction
    init(fn: MathFunction) {
        self.fn = fn
    }
    func execute(a: Double, b: Double) -> Double {
        return fn(a: a, b: b, x: &counter)
    }
}

PIC32 Prototyping

I’ve been thinking for a while that prototyping stuff with the DIP PIC32 parts should be easier, so I built something over the weekend to make that a reality. 

Instead of this:

IMG_0103

I can now start with this:

IMG_0099IMG_0102IMG_0100IMG_0101

It is just the bare minimum to get a DIP PIC32 part up and running with USB support.  I’m pretty happy with the results so far.  Now all I need to do is get a USB boot loader that fits in under 3Kb and I can use the Chipkit32 stuff with these little guys 😉

 

Objective-C to Java and back again via JNI and Unix pipes

I’ve been working on a piece of software for some time now that is almost ready for a public release.  For part of it I needed to connect to various databases, some of which are only accessible via JDBC.  My problem is that my app is written in Objective-C.  For the first version of my app this wasn’t a problem as Apple was promoting their brand new Objective-C to Java bridge and everything worked really nicely.  That was until a couple of years ago when Apple decided to deprecate the Java bridge.  I rewrote that code to use JNI and all was good.  Then Apple brought out the Mac App store but announced that it would not accept any apps that link directly to the JVM.  This causes a problem for me as without the JDBC drivers the usefulness of my app is greatly reduced.

I looked into various ways of embedding the JVM into my app, but the problem with doing that was that it increased my app from less than 10Mb to around 100Mb.  I wasn’t too happy about that to say the least, so I looked into providing a way to make my app optionally use the system JVM allowing the Java support to be turned off.  This worked pretty well unless the machine didn’t have a JVM installed in which case my app would refuse to load due to linkage failures.  So, I had the bright idea to use Apples “new” XPC feature.  I reorganised my JNI code to allow it to be called from an XPC process and found that the security settings meant that the JVM could not access any of the JDBC driver files in my app bundle. I got around that by using a folder shared with a process group.  This allows the JDBC drivers to be loaded, but then I found that for some reason the JNI code that had been running very nicely for a couple of years didn’t like running inside an XPC process and would fail randomly with strange errors.  On top of that I found that the process of going from Java, through JNI to Objective-C, then from the XPC process over to the main app was very slow and was especially noticeable with some of my larger data sets.

In desperation I decided to abandon the JNI code altogether and see if I could communicate from the main app to the java code in some other way.  In the end I created a Java JDBC connector that communicates with the main app via a pair of Unix pipes.  I have found this to amazingly fast and extremely reliable.  Instead of the data going through several transformations from Java, through to JNI and then to Objective-C and so on it now goes directly from the Java code in a special serialised format directly into the Objective-C code via the pipes.  It works really well 🙂

Success!

Time for bed.  I’ve successfully hacked an app I need for work to do something it is not supposed to do 🙂  A little reverse engineering, byte patching and single stepping through machine code and I now have it being quite naughty 🙂

Hopper Disassembler

I’ve been using a new disassembler a lot over the last couple of weeks called Hopper.  I’m finding it to be well worth the money.  So much so that I initially purchased it through the Apple App store, and then purchased it again directly from the developer so I could get access to the latest version more quickly.

It has many of the features of IDA Pro at a fraction of the cost!

JRuby, Rails and Development mode

Well, that was fun…  I spent quite a bit of time today beating my head against a “memory leak” only to remember that JRuby + Rails + Development mode = very leaky.  Switch to production mode and the problem goes away.

A simple little Rails app with one controller and one model is all that is needed to exercise the problem.  Run rails in development mode, and hit it with requests, memory usage soon skyrockets and the app starts to fall over.  Switch to production mode and the same app runs really nicely 🙂

Funky Clock 2 is up and running

Funky clock is installed and working really nicely 🙂

I had a little trouble with the digital inputs as the pull down resistors I used were 100K instead of 10K.  Also for some reason I was unable to read port E2 at all.  Once I moved that input to port C4 and replaced the resistors everything started working as expected 🙂