armin's blog

SharedSafe build 1831: security fixes

Finally, we are moved the code base into private beta. We changed the license to a new one we got from our lawyer and fixed some serious security problems:

SharedSafe build 1802: usability update

Though I made a two week detour to create a small Silverlight based graph editor, SharedSafe is progressing well and we are finally glad to announce another alpha release. Yes, I know, we planned get into the beta phase weeks ago, but because the Website is not ready yet, it may take another two weeks until we start the private beta. I am sorry for that, but we want to base everything on solid ground.

So what is new?

Some time ago we decided to change the terminology to reflect in a more logical sense what it means to connect local Folders with remote IMAP Folders. We changed the following:

  • A Store is now a Safe
  • A local folder, that is synchronized with a Safe, is now a Linked Folder
  • An exported Safe (a file suffixed with “.sharedsafe”) is now called a SafeKey, and the file extension is also “.safekey”.
    So if you have exported safes lying around, just rename them from *.sharedsafe to *.safekey.

Based on the new terminology, we implemented a new set of Explorer context menus:

SharedSafe_NewSafe_Solid_CutCreate Safe and link to Folder will present you with options to create a new Safe and immediately links the Safe to the selected folder. If the folder already contains files, they will be uploaded immediately.

Direct Manipulation of Cubic Beziers

Though I have ordered a new license on Friday, today my Resharper license run out, so I have time to do write a blog post :)

Bezier_3_bigCubic Béziers are built up from 4 points. A beginning point, an ending point and two spanning points that define the shape of the curve. If the two intermediate points are lying directly on the line connecting the beginning with the ending point, the cubic Bézier is a line.

MMBezierEditing What can be seen in most editing software is the manipulation of the cubic Bézier by dragging their spanning points. This is simple to implement, but does not reflect the user’s intentions. Users don’t care about points that don’t lie on the curve. So for my small graph/concept editor, I wanted to implement a more natural way to modify curves (if you have not seen it, take a look at the blog post about LightConcept).

I’ll try to explain the math by going through the steps that are required to implement the complete bending workflow:

Where is the curve?

Initially there is only a line to hit, but if the user has transformed a line to a curve, we need to find out where it is.

LightConcept, a small concept editor

Introduction

Over the last two weeks I decided to go for one of my ideas and implement a simple concept editor.

It’s online, you can try it here (requires Silverlight), and of course, Feedback is greatly appreciated. If you have trouble using it, come back here, and I’ll show you how it works.

Motivation

My main motivation was to create bezier connectors that can be bent by direct manipulation in a way so that it would feel more “natural”. I hope I’ve succeeded, please tell me if not.

Storage Concept

LightConcept allows you to create a graph. The Silverlight application stores the graph on your hard drive in your user account, no one else can see or edit the graph.

When you visit the site again later, your graph appears again, independent of the Browser you use. Right now, only one graph can be stored per user account.

If the browser or the application crashes, the last 30 seconds of your changes may be lost, but not more. LightConcept tries to get around the typical load / save scenarios. It may support graph export and import in a later version.

Documentation

NodeMenuTo add a new node: Just click once somewhere on the background. You can now type to enter the label.

To edit a label. Click in in the middle of a node.

To move a node. Press the left mouse button over a node and drag it.

What If Widgetland?

The WePad videos at Engadget show so called “live Widgets” that are placed on a large, scrolling plane. These Widgets are small applications that limit their appearance and interaction to one simple specialized visualization or task.

What if these Widgets can be designed to sense their neighbors, spread out connections, exchange data and provide contextual information related to their proximity?

What if these Widgets could be moved, cloned or even transmit themselves to other Planes.

What if these Planes could be infinite in size.

What if these Planes can span multiple devices.

What if these Planes can be accessed by multiple users simultaneously?

Then, wouldn’t we have freed our applications from lock-in stores and communication deprivation?

You do want the maps Widget nearby your address book just automatically show the location of a friend on the map? Don’t you?

Welcome to Widgetland, your ultimate, intelligent Personal Assistant, nothing else needed.

Applications are dead, Widgets are alive.

I had a vision

Companies are dying dinosaurs, money makes no sense anymore, people will exchange assets. It’ll be like once before, all built on technology.

And in this blog post I’ll tell you why and how.

Why do we need Facebook and Twitter? They lock us into their world of constraints and ads. But we don’t need to follow. We don’t need to comply to constraints. Any known social network can be replaced by a peer 2 peer network. An extensible, durable and robust piece of plug-in infrastructure just built on open source code and by developers who care about improving the status quo. It’ll be server-less and spread by using on one basic distribution algorithm, that is, by TRUST. This is the next step, and everyone who sees it, fears it. The works of the plebs. An additional layer of virtualization that isn’t anymore company or hardware bound.

The devices that you already own can build the next Internet. Servers will degrade to just stupid data routers, eventually completely replaced by wireless transmission networks.

Disruptive technology often starts by the seemingly powerless but just-a-little smarter components. This time it’s your notebook, your smart phone and your android based TV. You thought you need a million Google servers to find information and to store your mails and send them out to your buddies, … hell not anymore, they tricked you to sell ads!

The Internet just works without constraints as long we care. Don’t give it up. Go against Censorship. Governments – the organizations that solely purpose is to protect physical borders and ensure resource availability – are powerless in the virtual domain. There are no borders anymore. You already can talk to all the people around the world if you wanted to, you just need to realize the potential in that fact.

SharedSafe build 1708

I’ve just distributed build 1708 to our download server. You should get the update notification the next hour or so.

My lovely alpha testers, this is probably one of the last versions tagged with “alpha” in its name.

This version is mainly a stabilization release. We extended our test suite and fixed a number of edge cases where files disappear or change dates while a synchronization is running.

We polished the “recent changes” window somewhat: It now contains a Notification link that switches to a list of recent notifications. This way, multiple notifications can be presented at a time.

FixConflicts Additionally, the explorer context menu appears when you click on change item with the right mouse button. This lets you resolve conflicts directly from within the recent changes list.

And, finally, the layout of our website is ready and we are starting to prepare the content for the private beta. If your are not yet a registered alpha tester, you are welcome to join the private beta by following us on Twitter or Facebook.

For the next iteration we plan to extend the licensing system to feature build-time relative licenses (which we decided to use for the private beta) and a clarification text that shows what is actually exported if you want to share files. These are minor points, so we will mainly focus on the website for the next few days.

The struggle for Identity

Since I started my own company, live is different. I could not believe that it feels like a never ending roller coaster, but now it seems to accelerate, and – I am afraid – this is only the beginning.

Everything takes longer than expected, but it does not matter, because we decided to stay.

Nothing counts more than finishing the next milestone, the next thing we want to get out. No loud voice – we have nothing to show you yet  - but every day with new motivation and self-encouragement.

And this perspective seems to change everything. Now, any new day is also a completely different day. There is no repeating work; there are no stupid things to do; we are struggling to work out the right strategy to create products that pay off.

But something else is going on: My Identity seems to change.

Frustrations are getting more common, but so are small successes. Over and over again, this shifts my perspective who I am and what I really want.

For example: it shifts my Identity seeing how I fail at answering a Stackoverflow question just because I am not thinking detailed enough about a particular topic, thereby recognizing that I seem to be a more pragmatic guy:

If I have to, I can dig into the details, but essentially, they are not important to me, but the results are.

Another one is the scale of our application we are developing, it is large – relative to our small company – and I wish every day, that we had started a little smaller, because the next great thing may look like a toy. But ours isn’t one. I am sorry, we are not lean, we are Germans, and we tend to over engineer. Our app will have most of the features people need, in the first version, and we took a long time to develop it. Sigh. Perspective shifted and my Identity changes again. Am I stalled being German, just kidding... not sure.

Konstruktor Generator Functions

Beginning with revision 9, Konstruktor supports explicit generator functions:

To register a function, the method Builder.generator<TargetType>(Func<IScope, TargetType>) can be used.

Whenever “TargetType” needs to be constructed, the generator function is called, for example:

Konstruktor

I don’t actually need field and property injection from a dependency injection framework, do you?

And are XML configurations really required? Isn’t a small, tiny constructor injector sufficient?

For me, it must support

  • Constructor Injection
  • Automatic generation and injection of Func<> or Func<,> generators.
  • Open Generics, … sometimes you need that.
  • Lifetime management through IDisposable (at least for the root scope)

and it should be thread-safe.

Yesterday I’ve taken a look at StructureMap and Autofac, but both frameworks confused me a lot and I had a hard time finding out how they actually behave and if they support my needs. So, I decided to write my own, and here is it on google code:

In Konstruktor, there are two concepts, the Builder and the Scope:

  • The Builder contains all your rules
  • A Scope stores all the objects that the Builder instantiates

To get started, a builder needs to instantiated, and then rules are added. When the set up of the builder is finished, a scope is generated and objects can be resolved (all the Examples are also available in the Konstructor.Test project):

Syndicate content