Contacts in the Browser – 0.2 released – open-mike: Mike Hanson’s blog
Tag Archives: addressbook
Firefox Contacts Demo
Link
VCF based addressbook
I desperately need some kind of central addressbook that is useful to use. I still don’t think its there.
So I continued where I left (if you followed my older postings on it you have a basic idea on the idea) but this time I changed the data format to .vcf.
It means that I can rightclick in Outlook and “send as VCF (complete)” to receive all VCF cards and can then simply browse through them with the help of a Jquery Tree and the VCF reader class. I can make any category / household / company / department hierarchy I want or even multiple.
Next in line is integrating the VCF writer class, that would be a cool next step.
It will take several larger efforts:
- the gui will contain Page Classes such as “administration”, “cards” or “reports” (birthdays!), these will be plugins
- the fields will also be of a plugin type e.g. birthday will consist of an administration part, a reader/data part, a viewer part and a writer part. Any field thinkable e.g. x-facebook will be it’s own plugin so people can easily add plugins for any social network or whatever usage they have in mind
I have the general architecture in my mind but I lack the time to “sit for it”. Dragging the current approach in one web application was a matter of 10 minutes. Still it’s cool that I can blazingly fast skip through my collection of vcards although it feels “i want it now” that i can not edit the data without editing the vcf file itself.
In the long run it will need merging possibilities , import/export and versioning.
I added the current version in an iframe in our home wiki so we have access to all addresses from within the home wiki.
Someone, somewhere, will see the possibilities of this.
Vague idea on my once-to-be addressbook
1. full text seach
2. multiple toolbars e.g. Contacts A-Z, Households A-Z, Companies A-Z, telephone list, birthday calender, user-editable
4. Tree with free editable categories e.g. families, companies,
social networks : functions as folders for contacts
5. list of contacts, represented in different styles, drag-and-droppable to the tree structure
6. attributes of contacts sortable on anything
7. contacts data: integration with mail, phone, photo album, todo list, agenda, etc…
In summary:
- provides relations between contacts
- provides relations between groups
- can handle contacts in multiple groups
- groups have properties as well e.g. households have addresses, anniversaries, etc… (not yet correct in the picture), the tree
should contain everything including the contacts. actually the tree and the green blocks list are the same objects
The Unyk invites start rolling in
I noticed in my mailbox (flooding daily with hundreds of invites for all kinds of things) recently that the amount of invites for www.unyk.com is rising.
Unyk is basically a Plaxo without the extra social features but more thrustworthy in terms of “general stories of annoyed users” when you do a quick scan using google.
Will I use it? No. Not when I have all my contacts attached in Plaxo and I have to send everyone another note that I joined yet another auto-addressbook-updater. I’m getting almost a burn-out for trying to manage my social networks alone.
Plaxo manages the synchronization between my outlook and the outlook of my wife and basically it does that well (apart from the annoying double, triple or quadrupple birthday entries in my agenda).
The only reason why I would step over from Plaxo to another addressbook would be if they would support relational groups. So not a flat table of contacts but really “household A” where I can drag and drop the persons on who live there. Saves a lot of typing of addresses (e.g. company department Z) and is much easier to look at.
What happened to Cortege, the Outlook Contacts Social Network extension?
For many years now I am searching for an extension of Outlook which lets me place my contacts in hierarchies: families, companies, departments, member of social network X and so on.
Somewhere in 2006 I wrote about Cortege, which provided at least a good step in this direction by providing a visual interface to Outlook to do exactly that:
However, now that I tried to check it again it seems that the website of the product (personal-software.com) has gone away so I conclude that the production of the tool was stopped.
Which amazes me since I think this is the one thing which could improve the life of many people. It could become the next big thing: the graphical contact manager.
So… the last thing I see is version 2.0.0.51, what happened? Did someone woke up and bought them out?
How to prevent Plaxo sync overwriting your contact information
Plaxo allows me to keep my addressbook online and regularly synchronize my contacts with my Outlook address database. My outlook addressdatabase is then again synced with among others LinkedIn and my HTC PDA and my Nokia phone which in turn gets synced with my wife’s address database (she is in charge of birthdays).
What I noticed however was that after synchronization some information disappeared from my Outlook!
Suppose I have a contact in my Outlook and I add him to Plaxo. This person then also sign into Plaxo and removes or changes information e.g. a birthday or another personal item, well understandable if this person does not want to have this information online. However after synchronization it then also gets deleted from my personal entry on this person in my Outlook.
Immediately after noticing this I removed the Plaxo synchronization from my Outlook and e-mailed Plaxo support. They gave me the quite simple solution on how to resolve this:
- Enter your Plaxo
- go to "Addressbook" (you really have to be in this screen)
- click on "settings" on the top right (settings are different in each part)
- Click on "addressbook"
- uncheck the checkbox before "Automatically accept updated information in my address book"
This will prevent automatic changes mutating your local addressbook. Each time a contact changes his or hers information you will be given the chance if you either want to accept the changes or not (just like the Linkedin synchronization tool in Outlook).
Ok…. let’s reinstall the Plaxo Outlook synchronization tool again
Addressbook namespace
In the wikipedia under namespaces, I found exactly the things I am doing alongside the negative effects.
Emulating namespaces
In programming languages that do not provide language support for namespaces, namespaces can be emulated to some extent by using an identifier naming convention. For example, C libraries such as Libpng often use a fixed prefix for all functions and variables that are part of their exposed interface. Libpng exposes identifiers such as:
png_create_write_struct png_get_signature png_read_row png_set_invalidThis gives reasonable assurance that the identifiers are unique and can therefore be used in larger programs without fear of identifier naming collisions.
Unfortunately, this technique has several drawbacks:
- It doesn’t scale well to nested namespaces; identifiers become excessively long.
- Individuals or organizations may use dramatically inconsistent naming conventions, potentially introducing unwanted obfuscation.
- Compound or ‘query-based’ operations on groups of identifiers, based on the namespaces in which they are declared, is rendered unwieldy or unfeasible.
- All uses of the identifiers must, in effect, be fully namespace-qualified. Languages with direct support for namespaces usually provide ways for the programmer to declare up front that they wish to use some or all identifiers from a specific namespace, which they can then use without qualification for the remainder of the block.
It does not state however to circumvent the negative side-effects.
Buidling my Addressbook: namespaces
I’ve been test-running my written addressbook now for a week and it works like a dream (see all previous posts beneath).
Whenever I have a) a new contact in e.g. my outlook, my mail or b) just info I want to type along with the contact or c) documents I want to save alongside the contact in whatever hierarcy e.g. company /country/department X, I just create a directory in Total Commander and copy and paste the information in a file called “info.txt” or drag the documents I want to store alongside the person in his directory. Saves me some lotus notes / outlook space. I can handle everything from Total Commander. cool.
So… obviously I have some more wishes. The next thing that must go in is the handling of the field plugins:
A field as “image.avatar” will first be handled by the “image” plugin (which simply makes it a html img tag). This image plugin then simply calls the plugin “avatar”. The plugin “avatar” can then do some extra operations on the first processing layer and return it whereafter the “image” plugin can do some after processing and return the lot for display.
This also allows me for the future to namespace the plugins e.g. “cogmios.image.avatar” will be my avatar plugin, but maybe if you want to write a different plugin you would create “yourname.image.avatar”. You could even wrap my plugins “yourname.cogmios.image.avatar” to do some advanced before or after processing.
However sometimes multiple fields need to be combined e.g. if I would define “hyves_url” and “hyves_name” and “hyves.image.avatar” then these three possible should result in just 1 line in a table, so I have to, I think, pass the complete array of all fields defined for a contact to all plugins each time, currently I’m parsing the given fields one at a time sequentially.
I have to think this through. Actually I would love it if php people out there with some jquery knowledge and interested in creating a text file based addressbook would join in and develop this together. It’s by far not ready for an official open source project but thinking about different strategies is a lot of fun.
I don’t have screenshot now because I did not have time to create a demo database.
I think I:
- need to read all fields in the info.txt file and determine which ones are corresponding to existing field plugin handlers (and which one the user just entered to write a plugin later) (each plugin registers itself by simply defining a constant, the loop checks if the fieldname corresponds to a defined constant).
- put this in an array
- pass the array to each plugin that is installed in the order given in the info.txt so that the user can have a different ordering per contact e.g. social networks on the bottom.
- return the array to know which elements have been used so that e.g. cogmios.hyves.url and cogmios.hyves.name do not generate twice a hyves row in the output table.
This might work. One remaining problem might be that if “avatar” exists as plugin (e.g. normally called via “image” as in “image.avatar”: what to do if someone also wants to create an avatar plugin named “avatar”. In normal OO this is simply prevented by the namespace and regarded as 2 different things e.g. “a.b” and “c.b” are 2 different things. In my file based approach however “b” is one and the same field plugin code. One things I was thinking of one preventing this is to also make the plugin directory hierarchical e.g. place “image.avatar” in “/plugins/image/avatar.inc.php” so someone could create “/plugins/concepts/avatar.inc.php”. This would mean that the constant image.avatar and the functions in there should be image__avatar and image__avatar__display() etc… Basically that I should find a smart replacement of the dot. So that if the user types image.avatar the code behind it would translate it to image__avatar. I have to think about it if the 2 underscores is the best replacement for this. I could even think about letting the user simply entering “image__avatar” instead of “image.avatar” so I don’t have a translation between the two same concept but I think image.avatar is simpler for the user.
And talking about simplicity, I could also try to make just “avatar” being default “image.avatar” so to make it even more simpler for the user. And even to give certain fields a list of possible names which all result in the same plugin being used, could come in handy when I will be importing and exporting to Outlook, to have identical names in both systems.
So why am I typing this here? Because it helps me getting my thoughts straight around it and possibly if you see any errors in my reasoning to correct me if I am wrong
Right after posting this, I might another thing: sections. Which means that sections will be parsed as one entity and possibly with a seperate header. Meaning… that you could define the section “social networks” and then display under a seperate header all social networks the contact is. So then I would have to define a character sequence which would define a section. I think that an opening and closing tag (as in html/xml) is too difficult for the end-user. Probably he or she simply wants only a header.I think I will use ===== HEADERNAME or ##### HEADERNAME in the info.txt to define a section. Must think about it.
Addressbook part 7 – also an agenda
An example of the extensibility of the idea is shown to the left:
Simply by creating directories containing the years, months or dates (or any combination e.g. quarters, you can create any directory structure up to any level you want…it’s your harddisk
) you can create an agenda which you can maintain via notepad or vi…
Another advantage is that you can reuse the field plugins in the info.txt files in the folders e.g. a “date.meeting” will be handled by the same plugin. You can add any fields you want to the days.
Another advantage is that you can copy files in the folders of the e.g. days so you can keep track of the stuff you produce on a day in a date order if that’s of any use and later browse or report on it by simply copying the files in the correct directory e.g. 2007/Januari/15!
You could also create “work agenda” and “private agenda” directory and then let different report plugins handle either the combined dates or the dates of the seperate directory structures.
Simple isn’t it?
You can even drag contacts on a date and then let a directory-handler plugin determine if e.g. the plugin should be added to this date e.g. for a meeting and then popup a dialog.
The last idea makes me rethink the single directory tree structure. Maybe a split screen is handier or a screen where a tree structure is shown in the left and then 2 windows side-by-side for copy and paste actions (like in Total Commander).
Addressbook part 6 – drag and drop
Another thing which would be handy is if I could drag a contact on a directory and the directory would know what to do.
E.g. to the left I could drag “Bob Janssen” to the folder “linkedin.social” and it would create a directory Bob Janssen in the Linkedin Folder and even popup a screen where it would ask me the crucial linkedin data to populate in the info.txt file which is placed in the /hyves.social/Bob Janssen/info.txt (e.g. “invited or member”, “linkedin url”, etc…)
In this way it could be a very quick way to add members to a social network directory.
Some other ideas:
- If the info.txt in Bob Janssens directory contains the field “linkedin” and Bob Janssen is not yet in the linkedin folder it could place Bob there automatically after finding this out, this would make life easier.
- The linkedin Bob Janssen folder’s info.txt would contain a field called “link” which links to the other bits of profile data of Bob around the directory structure. In this way all the profile datas could be combined to see a master profile of Bob. I imagina some tabs where each tab is defined by a report plugin e.g. only contact data tab, full data tab, badminton club information, rss feeds, attachments, etc…
- other files in Bob’s folder could be previewed e.d. word documents, spreadsheets, photographs, urls, rss feeds etc…
Obviously when it works, this application can be used for pretty much everything: bookmarks, recipes, collections, etc… since everything is pluggable on directory, field and report level. It can be a one-stop full life information system.
Addressbook part 5
I’m building a fully text based address book in php while Blogging
The next thing I want to build in my addressbook is a handy calender.
It means however, for now, traversing through all directories on disk and retrieving all dates to put in an array wherafter to display them. There are some things in my mind:
- I could put each plugin field e.g. BIRTHDAY in a hierarchy which I would somehow make OO so to say the plugin BIRTHDAY would inherit properties from the general defined object DATE which would be some kind of superplugin dataformat. Which is a bit unflexible since there will be formats the user wants to add on the fly by just editing a simple textfile (and later on report on it). So…I could also make the decision to require a date to be “DATE__birthday = 16-06-1971″. In this way someone could simply add a line called “DATE__pokergame = 23-03-2008″ and the date will be in the calender with as type “pokergame”. The calender could then have a checkbox list with all the different types on dates it finds to dynamically show them in the calender. The user could also write specific reports depending on the types he adds on the fly. Another advantage would be that he could add just “COLOR__red = likes it” and he could later on write a report to show all people who like all different colors without someone creating a superobject COLOR in the first place. I have the think about the __ maybe that’s not the best characterstring to indicate an object grouping hmmm why dont I just use a dot? “date.birthday = 16.06.1971″ seems logical. Hmmm I could even add an hierarchy of dots “color.red.like = yes” which could show anything someone likes hmmm… I could even use it for the social network information: “tv-serie.lost.like = yes” so I could filter all tv series in the data set.
The most important thing is that someone who edits a text file is not bounded to too much rules.
- I also need to add functionality so the user can flag fields that should not popup in the calender (e.g. death date)
- Because traversing through filestructures and reading all seperate files takes time I have to think about some kind of caching scheme, maybe in a disk based database structure purely for caching it has to register when files have changed on startup to refresh the cache.
Addressbook part 4
I decided to make leaves, like contacts, also directories. Every directory now contains a file called “info.txt” which in a very simple form contains the essential data of the object. E.g.above you see the core information for the household “Bob and Marie Janssen”.
Every contact is also a directory which enables me to store photographs, (todo) lists, e-mails and other files concerning the contact “inside” the contact itself.
Addressbook part 3
The next to think about is the format in which my addressbook files are stored.
When I click on the directory “household Bob and Mary” it probably will have a general text file (holding the general data), a text file describing Bob and a text file describing Mary. Obviously they will hold relations to each other.
I could choose some XML format, JSON format, wiki format, html format or some configuration file alike text files, all would have their advantages and disadvantages. Primarily it should be easy for the user to edit a text file and add e.g. “haircolor” to a contact. But it should also be easy to create a birthday calender which would scan for all date types (e.g. anniversaries on household level and birthdays on contact level), so the contact should be semantically easy to parse.
Intuitively I would discard XML and JSON because users would find it too dificult to enter data to it. Wiki format may be a possibility which would have as advantage that I could somehow integrate it with e.g. dokuwiki in a later phase. It would also allow the user to use specific wiki tags to format the content. However, the part of getting all dates of this file would be somewhat more difficult.
Maybe I should just start with simple text files with each line containing the field, an equal sign followed by the value. I can make things more complex in a next phase.
Addressbook part 2
Using the PHP Jquery file Tree from Cory S.N. LaViska I saved a lot time. I modified it so that directories also become clickable and have their own icons and then changed the alert call to a JSON call to my report.php.
The next step is simple: just let report.php handle the type of item clicked. E.g. on a household display all contacts in the household.