Mattias Rost

Researcher and Coder

ProtoDB as an ORM - ProtoORM?

Posted on 2013-10-25

I believe coding should be seen as a craft, and as such there has to be as little between your creativity and executing on the creativity as possible. One such obstacle when it comes to most development of web applications, is the need to create a database structure. For years now I have been using different iterations of my own set of help functions in PHP. It started with some getters for fetching an array of rows from a MySQL query in one go, and later it evolved into what I called ProtoDB, which is available on GitHub. The core point of ProtoDB is that it creates the database structure as you code it. Setting some value for a column in a table will create that column if it does not exist, and will create the table if the table does not exists. This allows you to stay in the code editor and still work with a database. (Optimizing can always be done later.)

However, sometimes it can be nice to use a simple ORM, in order to group model functions together in an object oriented way. Most ORMs however (that I have seen), still require the database structure to be in place. The tables need to exist, and have the columns needed for the ORM to map to this structure. I have therefore started to expand on ProtoDB to create a basic ORM on top of it, which gives you the flexibility of ProtoDB and the benefits of an object oriented architecture of an ORM.

For now there is only one class Model that is the base of everything else.

[php]
namespace ProtoORM;
use \DB;

class Model {
public static function create($row); // row is an associated array of values for columns given by the keys
public static function find($id); // gets the model object with the given id
public static function all(); // gives you an array of all objects in the table
public function save(); // updates the table or inserts a new row
}
[/php]

From this it is easy to create a new model, for instance a User:

[php]
class User extends ProtoORM\Model {
protected $table = "users"; // sets the table name
}

// create a new user
$user = User::create("name"=>Mattias);
$user->save();

// later we can set some more info
$user->age = 31;
$user->role = 'dev';
$user->save();

$user = User::find($user_id);

[/php]

The points of this is that the table 'users' does not need to exist before running this code. Everything will be added to the database structure as need. This is obviously only the beginning, and I aim to expand on it as I keep using it in some of my current projects.

I am also thinking about also implementing some kind of automation of migration files, in order for groups of people to work together in early stages of design.

 

Internships in the Populations programme

Posted on 2013-06-06

If you're a PhD student working with things such as ubiquitous and mobile computing, statistics and inference, and formal modelling and analysis, the project I'm working in is offering internships! It's preferably over the summer, but not restricted to it.

The Populations project is trying to advancing the design process and underlying science of mobile applications. We do this by designing, building and studying mobile apps through large deployments, and investigate new methods and analysis tools that allow us to advance this area of research and practice. If you're interested in reading more you should check out the call.

Informing Future Design workshop at MobileHCI

Posted on 2013-05-06

I'm co-organizing an upcoming workshop for MobileHCI this year. It is on the topic of "Informing Future Design via Large-Scale Research Methods and Big Data". It is loosely based on previous workshops I have co-organized on Research in the Large. This year it goes beyond evaluation and instrumentation of app stores (which in my view have been a big theme for the previous workshops) and looks at how we can find new ways of incorporating large deployments as means to inform design. This means not only to iteratively improve existing systems and design ideas, but to use it in the ideation process of new ideas.

The deadline for the workshop submission is on May 10th and MobileHCI will be in Munich on August 27-30th. Check workshop web site for more info.

Android WebView and File Input

Posted on 2013-04-18

While working on a web app that I wanted to embed in a WebView on Android to create a native app (hybrid), I encountered some problems with file input. The app is a simple one that allows users to upload photos, and shows a list of friends photos. (Instagram anyone?)

These days file input on mobile devices works pretty ok on iOS and Android devices. Adding <input type='file' /> will create a file input, and clicking it will let the user pick a file from your phone. At least from Chrome or Safari. However, when putting this in a WebView, it is currently not handled for you automatically.

Googling around to figure out what is going on reveals that this is something that has to be implemented by yourself by overriding a couple of functions in an instance of WebChromeClient. Unfortunately there are still a couple of issues with this. First of all, the functions that has to be overridden har undocumented. Second of all, returning the files seem to be devoid of file type, which is not necessarily a problem for everyone, but that was a problem for me.

First of all, the functions that has to be overridden are:

mWebView.setWebChromeClient(new WebChromeClient() {

@SuppressWarnings("unused")

public void openFileChooser(ValueCallback<Uri> uploadMsg, String AcceptType, String capture) {

this.openFileChooser(uploadMsg);

}

@SuppressWarnings("unused")

public void openFileChooser(ValueCallback<Uri> uploadMsg, String AcceptType) {

this.openFileChooser(uploadMsg);

}

public void openFileChooser(ValueCallback<Uri> uploadMsg) {

mUploadMessage = uploadMsg;

pickFile();

}

});

The three functions illustrate a progression of Android, where the last one is for early versions of android, and the last one is for Android 4.1+. Potentially then, this might change in the future.

The use of this then is to return the value in mUploadMessage by calling its callback.

Picking the file is easy enough using an intent call.

Intent chooserIntent = new Intent(Intent.ACTION_GET_CONTENT);

chooserIntent.setType("image/*");

startActivityForResult(chooserIntent, RESULTCODE);

 

And you return the file in onActivityResult:

protected void onActivityResult(int requestCode, int resultCode, Intent intent) {

mUploadMessage.onReceiveValue(intent.getData());

mUploadMessage = null;

}

 

(Note: There's not error handling here, so remember to include that!)

So far so good. This will cause the file input data set, so we can submit it from a form, or access it from javascript.

What I needed this image for, was to both update a picture on the web page, and also to upload this data later on. The way I solved this was to use HTML5 local file reading through a FileReader object, and then reading the data using readAsDataURL

var reader = new FileReader();

reader.readAsDataURL(file);

reader.onload = function(e) {

var dataurl = e.target.result;

}

So we got dataurl as a URI object, which will be on the form "data:image/png;base64,...". Or so is it normally. Problem is that from at least Android 4.2.2 (On my Nexus 4), the file object that is returned to javascript from Android does not have the file type set. (file.type===undefined). This makes the data URI to be invalid as it only describes binary data: "data:base64,...". This caused major problems for me, but I managed to fix it. Fortunately the filename is set correctly, and so I can use the file ending. From that I can reform the dataurl to create a correct one

dataurl = "data:image/" + file.name.split('.').slice(-1)[0] + ";base64," + dataurl.split(',')[1];

The rest of the script then works. You can use the dataurl to set the image src ($("#theimage").attr('src',dataurl); and you can upload it as a string.

I'm guessing there might be a fix for this to get Android to pass a file with the correct type set, but without that fix, this one seems to work.

 

Defended Mobility is the Message

Posted on 2013-03-13

On Monday I finally defended my PhD thesis – Mobility is the Message: Experiments with Mobile Media Sharing. The opponent was David Ayman Shamma from Yahoo! Research. He did an amazing job presenting his interpretation of my work, and we engaged in a lively discussion about the thesis. It was followed by questions from the committee, and the audience.

Now I've just got back to Glasgow, where I am visiting Matthew Chalmer's group doing work in the Populations project at the University of Glasgow. I've been here since february and it's been a super exciting environment so far with great energy! I'm determined that great stuff will come out of what we are doing right now. But more on that another time...