MindMeister Geistesblitz Workflow for Alfred App

I discovered this post introducing an Alfred App workflow for Trello a few days ago. After trying this extension by Miko, I realized how easy it is to create a workflow for Alfred and decided to code a similar (side) project for the Geistesblitz feature of MindMeister.
Prerequisites are the Alfred 2 Powerpack, a (free) MindMeister account and OSX 10.7+. If you have all of these, fetch my Geistesblitz workflow file and install it by double clicking the downloaded file.
Granting write access to your MindMeister default map is the first thing. Type blitz auth into Alfred to authenticate and equip the workflow with permission to modify your default map in the newly opened browser window.
blitz auth
You can now start inserting Geistesblitzes by typing blitz {query}, where {query} stands for the idea(s) you want to add to your default map, e.g. “blitz Create the next big thing”. You can also add multiple Geistesblitzes with one command by delimiting them with a semicolon like “blitz idea1;idea2;idea3”.
blitz {query}
A second feature is ad-hoc creation of new mind maps by typing blitz new {mind map name} (mind map name is optional). The newly created mind map will automatically open in a browser window.
blitz new {mind map name}
Changing the authenticated user can be achieved by typing blitz auth again (login with the new user in your default browser first). Additionally you can also remove the authentication token for blitz from your keychain by typing blitz logout. A keyboard hot key may also be defined beside the text based interface. Use such a short cut to send any selected text to MindMeister without copy & paste and opening the browser. Watch this short video showing the main workflow in action.
You have to define a default map on mindmeister.com if you get the error message “No default map was found for inserting”. Open the mind map you want your Geistesblitzes to be stored in and define it as default map within the map’s properties.
I like Alfred’s non disturbing integration and with Geistesblitz it allows me to quickly take down ideas flashing into my mind during work without drastically interrupting my current task. If you’r not already using Alfred, give the free version a try and buy the power pack as soon as you get hooked! I had a lot of fun coding this little workflow and please leave me a commend if you have any feedback, problems or suggestions.
Introducing 3MF
It’s an exciting day! I want to bring my first open source project to your attention. Once upon a time, my younger me needed a topic for a master thesis. Back then I thought, it would be nice to create something useful, useful for me, for the research group of my professor and maybe for the open source community. The project was set up after a few talks and I’m happy to announce threeMF (or short 3MF).
After working in the mobile software development industry for quite some time now, I’m still fascinated by modern mobile devices and their endless capabilities. As an iOS developer you own a lot of these devices most of them lying around seldom used beside testing. Their potential is not utilized because the majority of our use cases are focused on single devices and user interfaces are not built with the intention to spread most of the time. Distributed systems, user interface interaction or collaboration is nothing new but these topics gain importance with all the latest developments in ubiquitous computing — I mean, 5 years back my Nokia phone was just a phone.
With these thoughts in my mind I wanted to create a small framework combining modern network technologies with some simple patterns and rules to ease the ad-hoc exchange of arbitrary (user-)events between devices. Even if this first implementation of 3MF only works on iOS and OSX it was built with the intention to run on other platforms as well. All used technologies are available on other systems like Android or Windows Phone and I’m highly interested in bringing the framework to other platforms.
About
The Github project page of threeMF says: “The Mobile MultiModal (Interaction) Framework (3MF or threeMF) is a generic and extendable ad-hoc networking framework for easy device discovery, capability checking and pattern based RPC communication.” … and that is what 3MF can do for you. Let’s dive into a Hello World example to make things clearer.
Imagine you want to use several devices to share a key value pair with an arbitrary number of devices on your local network (e.g. iPhones sending data their sensors record). You want to provide this information as shared resource on the network, for others to find and consume, as long as they are around. This use case would involve a lot of code, even if you use excellent technologies like Bonjour, XMPP or ZeroMQ. The work would start at tasks like discovering and managing reachable devices, going over to subscription maintenance and data delivery which would also include the control of network sockets, data validation, serialization, … I’m aware that all these tasks are no magic and we have very capable frameworks and technologies providing all of it. But these tasks also show the potential for a generic solution which may benefit from an unification in a generic framework, a framework to make similar patterns reusable and easy to access for developers without (or less) experience in these fields. This is where 3MF comes into play.
3MF takes the described efforts away and wraps units of sharable information in pairs of so called Commands and CommandArguments. Commands are semantic descriptions of network services provided by a publisher. These commands can either be subscribed by others (push) or invoked (pull) by them to request a result for input parameters.
The command for our key value pair example is already available with 3MF (TMFKeyValueCommand), but it would be very easy to provide your own custom commands with more sophisticated logic (.h/.m). The following code will show how this command can be set up and pushed to subscribers, as well as how to find it and subscribe. All scenarios are always divided into two roles, the provider’s and the consumer’s.
The Provider
A 3MF session always starts with an instance of the facade class TMFConnector, followed by the creation and publishing of command objects. Once a new command is published, other peers in reach will get informed about all new capabilities of the provider — a peer’s capabilities are defined by it’s set of published commands.
#import "threeMF.h"
// create the connector and commands
self.tmf = [TMFConnector new];
self.kvCmd = [TMFKeyValueCommand new];
// publish
[self.tmf publishCommands:@[self.kvCmd]];
Now we can start sending arguments for this command to all subscribers. 3MF will not send anything until the first subscriber is available. The connector is also informing the application about any changes via the TMFConnectorDelegate protocol.
TMFKeyValueCommandArguments *kvArguments = [TMFKeyValueCommandArguments new];
kvArguments.key = @"msg";
kvArguments.value = @"Hello World!";
[self.kvCmd sendWithArguments:kvArguments];
The Consumer
A connector has to be created on every device, also on the consumer. At any point we can now search for other devices providing a set of commands. The connector will discover and manage any 3MF-peer in range starting with it’s availability. State changes of peers are reported with the callback method connector:didChangePeer:forChangeType:. In our case we are not interested in peers without the key value command, and therefore we use startDiscoveryWithCapabilities:delegate: to get only informed about peers providing special capabilities we care about. These “special searches” will get reported with connector:didChangeDiscoveringPeer:forChangeType:.
[self.tmf startDiscoveryWithCapabilities:@[ [TMFKeyValueCommand name] ] delegate:self];
The connector will inform about status changes of every peer with specified commands (when they appear, disappear or change their capabilities). We can subscribe to commands once a device is found and new key value pairs will arrive as long as the subscription is alive and the provider sends data.
- (void)connector:(TMFConnector *)tmf didChangeDiscoveringPeer:(TMFPeer *)peer
forChangeType:(TMFPeerChangeType)type {
if(type == TMFPeerChangeFound) {
[self.tmf subscribe:[TMFKeyValueCommand name] peer:peer
receive:^(TMFKeyValueCommandArguments *arguments){
NSLog(@"%@: %@", arguments.key, arguments.value);
}
completion:^(NSError *error){ /* handle eventual error */ }];
}
}
Subscriptions get automatically cleared if one of the connected devices will disappear from the network or the subscription is closed by one of both sides.
Check out the project on Github and play with the AirDraw sample application if you are curious.
Now its time to ask for your help
The framework is now v0.1. That means, there is a lot of space for improvements in code and documentation of course. I would like to do a short evaluation to get a glimpse on how the framework is received. I’m looking for Cocoa developers taking a look at the framework’s core functionality.
I know that time is always limited and therefore a sample project is provided and I ask you to extend it with two very basic 3MF commands. The Application is called MultiAirCam which will serve as sample and tutorial application once the evaluation is done. It’s an iOS application sharing live camera data of multiple iPhones with multiple iPads. These devices will find each other automatically and iPads subscribe to all iPhone cameras available to display their data in a collection view. iPads can send actions which flip between cameras, turn flash lights on and off as well as request still shots. The iPad UI looks like shown on the screenshot below with two cameras in range.

If you want to do a short tutorial on 3MF and support the project I would like to ask you to do the following:
- Fork the threeMF-eval project
- Read about creating Custom, Publish Subscribe and Request Response Commands
- Build the project and replace all warnings with the necessary 3MF code.
- While building the app please write a diary, take down your thoughts which can point out where improvements should be made (or record some audio, everything helps). Simply create a text document and take down your thoughts after every step marked in the sample project and the time it took you to perform the step. You can copy your diary into the survey at the end of the evaluation.
- Take down the time it takes you to do the evaluation
- Use the sample applications for further insights
- Push your code back to your Github fork
- And finally it would be very kind if you fill out this survey
This evaluation should not take too much time and give me some insights how the framework is received. I’m also planning to put aggregated results of this evaluation into my thesis’s evaluation section.
The only thing left at this point is to thank you all in advance and tell you that I’m grateful for every feedback and your help!
My 2012 in Pictures
This is a cross selection of my 2012 Lightroom catalog before archiving it and moving on with a new one for 2013. Happy new year!
Honey, I shrunk the camera
I sold my complete DSLR gear last week — which was a very hard decisions to make for me. I didn’t do it for the money, neither did I do it because of lost interest in photography. In fact, I would like to do more photography again and asked my self: “What is the reason for not taking so much pictures anymore?”. The answer was: “Because you got lazy and you don’t want to carry all the heavy DSLR gear anymore”. Combine this answer with Chase Jarvis’s statement “The Best Camera Is The One That’s With You” and you get your new camera requirements — you need something small and lightweight with the capabilities of a modern DSLR.
2012 was the year of iPhone photography for me. I enjoyed taking pictures with Instagram but if you have a Canon EOS 5D Mark II and a lot of glass sitting at home, you always want to get more out of the scenes you try to capture. The camera market 2011 / 2012 revealed two exciting releases, the Fujifilm FinePix X100 and Fujifilm X-Pro1. They got praised for their design, size, weight and image quality (especially the X-Pro1 with it’s brand new Fujifilm-designed 16MP APS-C X-Trans CMOS sensor). Their retro look is very appealing, but with only one fixed focal length the X100 feels too restricted for a DSLR replacement and the XPro-1 was is too expensive. There seemed to be place for something between the X100 and the X-Pro1! Fuji saw it the same way - they released the Fujifilm X-E1.
Fujifilm X-E1
The X-E1 fixes most of my problems with the other X models. Its smaller and cheaper than the X-Pro1 but with the same great sensor and it’s interchangeable high quality lenses. After struggling for a while, and finally getting my hands on @wranner’s in Vienna, my order was placed. Taking pictures with this camera is more puristic and feels like “the poor mans Leica”. I guess, it is the place where Fuji wants position these bodies on the market. Pictures out of the X-E1 are stunning, very sharp, rich in detail and the ISO performance of this ASP-C sensor is at least as good as my “old” full frame 5D Mark II, if not better. Size and weight makes it a “all time with you camera” and less “in-your-face” on the street. Furthermore, the available X-mount lenses seem to be very high quality, as all reviewers praise them as outstanding. I got my self the 35mm 1.4 which feels better than my Canon EF 50mm 1.4 and it’s extraordinary sharp, even at 1.4.
“This Fuji lens has the superior sharpness and lack of distortion of the LEICA SUMMICRON-M 50mm f/2, with the speed and superior bokeh of the LEICA SUMMILUX-M 50mm f/1.4 ASPH, and focuses faster, focuses closer and has less light falloff than any of them. Bravo, Fujinon!” — Ken Rockwell
As great as the images out of this camera are, there are downsides. The auto focus is very slow, it often refuses to focus in dark scenes at high ISO and the battery is some kind of a joke. I had to recharge it 3 times the last week taking a few 100 shots (ok, it’s f***ing cold outside at the moment) — ordered two extra batteries. Unfortunately there are also some problems with the RAW conversion in Light Room (respectively Adobe Camera Raw 7.3). ARC is able to read the RAW files but sometimes details get messed up with very strange artifacts. This issue is discussed a lot and Capture One seems to handle the X-Trans sensor’s RAW files better in their latest beta version. Out of camera JPG is the best option for now because the camera internal RAW to JPG conversion seems to work extremely well - Fuji should share this knowledge with Adobe & Co (I guess they already do).
This camera is not for everyone, you have to be familiar with the exposure triangle and enjoy shooting in (half) manual mode. Action shooters may not get happy whit the X-E1 as a primary camera body because of the bad auto focus performance and slow image saving speed. I’m also considering it an expensive camera compared to what you can get for the price of a X-E1 and the 35mm 1.4 prime. For my share, I’m absolutely convinced that the X-E1 (or X-Pro1) is the perfect choice for enthusiasts who want a lightweight DSLR alternative for still, portrait and landscape photography with a great look and feel. The upcoming X-mount lenses also seem very promising and the moment I can get the 14mm 2.8 it will be mine :-).
I’m not surprised that a lot of professionals own an X-Trans based camera as lightweight alternative for their work. Most importantly, this camera is a joy to use and I’m excited again, exited to grab my camera and create.
Sample Images
Some pictures I took with the X-E1 last week. You can also find full resolution images on Flickr.
256 Seconds Later Wallpaper for you iPhone, iPad and Mac
I like landscape shots as wallpapers and always wanted to share some of my pictures as background images. After changing some today this thought crossed my mind again. Feel free to download 256 Seconds Later formatted for your device and leave me a comment if you would enjoy more wallpapers out of my camera (500px, Flickr) “released” in appropriate formats.
Download

For your iPhone or iPad
- iPad retina (2048x2048)
- iPad (1024x1024)
- iPhone retina 4” (640x1136)
- iPhone retina 3.5” (640x960)
- iPhone (320x480)
For your MacBook
- 11” MacBook Air (1366x768)
- 13” MacBook Air / 15” Pro (1440x900)
- 13” MacBook Pro (1280x800)
- 15” MacBook Pro (1680x1050)
- 15” MacBook Pro (2880x1800)















































