Software: NoteSync

NoteSync has a similar interface to Notational Velocity. In addition, the software synchronizes with Google Docs. Every note is automatically uploaded to Google Docs. If the Google Document is changed, the note in NoteSync will be updated. The pre-order license costs US$4.99.

Screenshots:

bildschirmfoto2010-04-27um11-31-27.png

Application Overview:

Application
NoteSync
Category Note taking
Version Beta 1.0.1
Website: http://www.notesync.com/
Tested on: 27/4/2010, Mac OS X 10.6.3
Technical Details: Built on Adobe AIR, runs on Windows and Mac OS X

Working with NetBeans and Eclipse: Beans Binding and Shared Source Folders in NetBeans

NetBeans and eclipse can work together fairly well. So the strength of both platforms can be leveraged for application development. One way is to share the source folders as discussed in this post. A more advanced approach is to use Maven, which I described in a number of other posts.

A few issues regarding shared source folders are discussed in the following:

Identical package names in multiple projects

In eclipse, packages with similar names can reside in different source folders. For instance, the package de.mxro is both in the source folders /data/mxro/ and /data/portablemxro/.
However, NetBeans is not able work with these two source folders. Only the classes in one of these folders will be recognized.

Solution: rename one of the source packages, e.g. you have afterwards de.mxro and de.mxrox.

Beans Binding

Beans binding in NetBeans is reflected in the project configuration files of the NetBeans project. I was not able to find a way yet, to transfer these configurations to the eclipse project. However, I got beans binding to work after adding the beansbinding jar to the eclipse project – this library is included in the NetBeans installation; I used version „beanbinding-1.2.1.jar. The maven artifact is:

<dependency>
        <groupId>org.jdesktop</groupId>
        <artifactId>
beansbinding</artifactId>
        <version>1.2.1</version>
</dependency>

Shared Source Folders in Multiple Projects

The import and synchronization feature in NetBeans (File / Import / eclipse project) works fairly well. However, there can be issues that some source folders are recognized as test folders (to fix this right-click on project and select preferences and change the source paths). Also, the default encoding for sources in NetBeans is UTF-8 and in eclipse it is Mac Roman. It is advisable to change the encoding in NetBeans to MacRoman before compiling the project.

In eclipse, I share source folders between multiple folders. However, this does not work in NetBeans. Here is a workaround.

NetBeans: Link Data with the User Interface using JavaBeans

The following is a brief description how a java bean can be linked with the UI using NetBeans:

Java Beans are Java objects (see Sun Website), which have a few unique characteristics:

  • have a default constructor without any arguments
  • have a number of properties, which are a set of variables and getter and setter methods (see NetBeans Tutorial).
  • implement property change listeners

The following is a simple example of a JavaBean:

/*
 * A simple JavaBean based on NetBeans tutorial.
 */

package de.mxro.textedit.gdocseditor.gui;

import java.beans.*;
import java.io.Serializable;

/**
 *
 * @author mx
 */
public class GDocsSettings implements Serializable {

    
    protected String password;

    /**
     * Get the value of password
     *
     * @return the value of password
     */
    public String getPassword() {
        return password;
    }

    /**
     * Set the value of password
     *
     * @param password new value of password
     */
    public void setPassword(String password) {
        this.password = password;
    }

    private PropertyChangeSupport propertySupport;

    public GDocsSettings() {
        propertySupport = new PropertyChangeSupport(this);
    }

    protected String username;

    /**
     * Get the value of username
     *
     * @return the value of username
     */
    public String getUsername() {
        return username;
    }

    /**
     * Set the value of username
     *
     * @param username new value of username
     */
    public void setUsername(String username) {
        this.username = username;
    }



    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertySupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertySupport.removePropertyChangeListener(listener);
    }

}

A key disadvantage of JavaBeans is that it is quite time intensive to write their code; involving many repetitive tasks like writing getter and setter methods.

Luckily, NetBeans provides generators for generating JavaBeans code. Going through File/ New a new empty bean can be created.
bildschirmfoto2010-04-20um09-49-54.png
In the source code of the bean, using right-click and „insert code“ …

bildschirmfoto2010-04-20um09-51-33.png

… a new property can be added.
bildschirmfoto2010-04-20um09-53-23.png

bildschirmfoto2010-04-20um09-54-36.png

NetBeans further provides mechanisms to easily link these beans with user interfaces (Giudici java.net weblog, 2008). Furthermore, through these beans, the UI can be directly linked with databases (NetBeans Wiki).

Further Resources:

NetBeans Tutorial on GUI/Beans Binding
Java Tutorial on GUI/Beans Binding using NetBeans

Click on Links in Editable JEditorPanes

JEditorPane is a Java Swing component, which allows to display and edit rich text. Supported formats are RTF and HTML. When using HTML, the user can click on hyperlinks embedded in the documents. However, this only works when the JEditorPane is not in edit mode (setEditable(false)).

The following class can be used to alter the behavior of JEditorPane when displaying HTML in such, that hyperlinks are clickable even when the EditorPane is in edit mode. Hyperlinks are activated if the user double clicks hyperlinks in the component.

package de.mxro.textedit;

import java.awt.Cursor;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.JEditorPane;
import javax.swing.SwingUtilities;
import javax.swing.event.HyperlinkEvent;
import javax.swing.plaf.TextUI;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.Element;
import javax.swing.text.Position;
import javax.swing.text.StyleConstants;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;


public class MyLinkController extends MouseAdapter implements
MouseMotionListener {

        private Element curElem = null;

        private boolean curElemImage = false;
        private String href = null;

        private Position.Bias[] bias = new Position.Bias[1];

        private int curOffset;
        /**
         * Called for a mouse click event.
         * If the component is read-only (ie a browser) then 
         * the clicked event is used to drive an attempt to
         * follow the reference specified by a link.
         *
         * @param e the mouse event
         * @see MouseListener#mouseClicked
         */
        public void mouseClicked(MouseEvent e) {
                JEditorPane editor = (JEditorPane) e.getSource();
                if ( ((!editor.isEditable()) || e.getClickCount() == 2) 
                                &amp;&amp; SwingUtilities.isLeftMouseButton(e)) {
                        Point pt = new Point(e.getX(), e.getY());
                        int pos = editor.viewToModel(pt);
                        if (pos &gt;= 0) {
                                activateLink(pos, editor, e.getX(), e.getY());
                        }
                }
        }
        // ignore the drags
        public void mouseDragged(MouseEvent e) {
        }
        // track the moving of the mouse.
        public void mouseMoved(MouseEvent e) {
                JEditorPane editor = (JEditorPane) e.getSource();
                HTMLEditorKit kit = (HTMLEditorKit)editor.getEditorKit();
                boolean adjustCursor = true;
                Cursor newCursor = kit.getDefaultCursor();
                if (!editor.isEditable()) {
                        Point pt = new Point(e.getX(), e.getY());
                        int pos = editor.getUI().viewToModel(editor, pt, bias);
                        if (bias[0] == Position.Bias.Backward &amp;&amp; pos &gt; 0) {
                                pos--;
                        }
                        if (pos &gt;= 0 &amp;&amp;(editor.getDocument() instanceof HTMLDocument)){
                                HTMLDocument hdoc = (HTMLDocument)editor.getDocument();
                                Element elem = hdoc.getCharacterElement(pos);
                                if (!doesElementContainLocation(editor, elem, pos,
                                                e.getX(), e.getY())) {
                                        elem = null;
                                }
                                if (curElem != elem || curElemImage) {
                                        Element lastElem = curElem;
                                        curElem = elem;
                                        String href = null;
                                        curElemImage = false;
                                        if (elem != null) {
                                                AttributeSet a = elem.getAttributes();
                                                AttributeSet anchor = (AttributeSet)a.
                                                getAttribute(HTML.Tag.A);
                                                if (anchor == null) {
                                                        curElemImage = (a.getAttribute(StyleConstants.
                                                                        NameAttribute) == HTML.Tag.IMG);
                                                        if (curElemImage) {
                                                                href = getMapHREF(editor, hdoc, elem, a,
                                                                                pos, e.getX(), e.getY());
                                                        }
                                                }
                                                else {
                                                        href = (String)anchor.getAttribute
                                                        (HTML.Attribute.HREF);
                                                }
                                        }
                                        if (href != this.href) {
                                                // reference changed, fire event(s)
                                                fireEvents(editor, hdoc, href, lastElem);
                                                this.href = href;
                                                if (href != null) {
                                                        newCursor = kit.getLinkCursor();
                                                }
                                        }
                                        else {
                                                adjustCursor = false;
                                        }
                                }
                                else {
                                        adjustCursor = false;
                                }
                                curOffset = pos;
                        }
                }
                if (adjustCursor &amp;&amp; editor.getCursor() != newCursor) {
                        editor.setCursor(newCursor);
                }
        }
        /**
         * Returns a string anchor if the passed in element has a
         * USEMAP that contains the passed in location.
         */
        private String getMapHREF(JEditorPane html, HTMLDocument hdoc,
                        Element elem, AttributeSet attr, int offset,
                        int x, int y) {
                Object useMap = attr.getAttribute(HTML.Attribute.USEMAP);
                if (useMap != null &amp;&amp; (useMap instanceof String)) {
                        //hdoc.getMap((String) useMap);

                        // Map m = new Map();

                        if ( offset &lt; hdoc.getLength()) {
                                Rectangle bounds;
                                TextUI ui = html.getUI();
                                try {
                                        Shape lBounds = ui.modelToView(html, offset,
                                                        Position.Bias.Forward);
                                        Shape rBounds = ui.modelToView(html, offset + 1,
                                                        Position.Bias.Backward);
                                        bounds = lBounds.getBounds();
                                        bounds.add((rBounds instanceof Rectangle) ?
                                                        (Rectangle)rBounds : rBounds.getBounds());
                                } catch (BadLocationException ble) {
                                        bounds = null;
                                }
                                
                        }
                }
                return null;
        }
        /**
         * Returns true if the View representing &lt;code&gt;e&lt;/code&gt; contains
         * the location &lt;code&gt;x&lt;/code&gt;, &lt;code&gt;y&lt;/code&gt;. &lt;code&gt;offset&lt;/code&gt;
         * gives the offset into the Document to check for.
         */
        private boolean doesElementContainLocation(JEditorPane editor,
                        Element e, int offset,
                        int x, int y) {
                if (e != null &amp;&amp; offset &gt; 0 &amp;&amp; e.getStartOffset() == offset) {
                        try {
                                TextUI ui = editor.getUI();
                                Shape s1 = ui.modelToView(editor, offset,
                                                Position.Bias.Forward);
                                if (s1 == null) {
                                        return false;
                                }
                                Rectangle r1 = (s1 instanceof Rectangle) ? (Rectangle)s1 :
                                        s1.getBounds();
                                Shape s2 = ui.modelToView(editor, e.getEndOffset(),
                                                Position.Bias.Backward);
                                if (s2 != null) {
                                        Rectangle r2 = (s2 instanceof Rectangle) ? (Rectangle)s2 :
                                                s2.getBounds();
                                        r1.add(r2);
                                }
                                return r1.contains(x, y);
                        } catch (BadLocationException ble) {
                        }
                }
                return true;
        }
        /**
         * Calls linkActivated on the associated JEditorPane
         * if the given position represents a link.&lt;p&gt;This is implemented
         * to forward to the method with the same name, but with the following
         * args both == -1.
         *
         * @param pos the position
         * @param editor the editor pane
         */
        protected void activateLink(int pos, JEditorPane editor) {
                activateLink(pos, editor, -1, -1);
        }
        /**
         * Calls linkActivated on the associated JEditorPane
         * if the given position represents a link. If this was the result
         * of a mouse click, &lt;code&gt;x&lt;/code&gt; and
         * &lt;code&gt;y&lt;/code&gt; will give the location of the mouse, otherwise
         * they will be &lt; 0.
         *
         * @param pos the position
         * @param html the editor pane
         */
        void activateLink(int pos, JEditorPane html, int x, int y) {
                Document doc = html.getDocument();
                if (doc instanceof HTMLDocument) {
                        HTMLDocument hdoc = (HTMLDocument) doc;
                        Element e = hdoc.getCharacterElement(pos);
                        AttributeSet a = e.getAttributes();
                        AttributeSet anchor = (AttributeSet)a.getAttribute(HTML.Tag.A);
                        HyperlinkEvent linkEvent = null;
                        String description;
                        if (anchor == null) {
                                href = getMapHREF(html, hdoc, e, a, pos, x, y);
                        }
                        else {
                                href = (String)anchor.getAttribute(HTML.Attribute.HREF);
                        }
                        if (href != null) {
                                linkEvent = createHyperlinkEvent(html, hdoc, href, anchor,
                                                e);
                        }
                        if (linkEvent != null) {
                                html.fireHyperlinkUpdate(linkEvent);
                        }
                }
        }
        /**
         * Creates and returns a new instance of HyperlinkEvent. If
         * &lt;code&gt;hdoc&lt;/code&gt; is a frame document a HTMLFrameHyperlinkEvent
         * will be created.
         */
        HyperlinkEvent createHyperlinkEvent(JEditorPane html,
                        HTMLDocument hdoc, String href,
                        AttributeSet anchor,
                        Element element) {
                URL u;
                try {
                        URL base = hdoc.getBase();
                        u = new URL(base, href);
                        // Following is a workaround for 1.2, in which
                        // new URL("file://...", "#...") causes the filename to
                        // be lost.
                        if (href != null &amp;&amp; "file".equals(u.getProtocol()) &amp;&amp;
                                        href.startsWith("#")) {
                                String baseFile = base.getFile();
                                String newFile = u.getFile();
                                if (baseFile != null &amp;&amp; newFile != null &amp;&amp;
                                                !newFile.startsWith(baseFile)) {
                                        u = new URL(base, baseFile + href);
                                }
                        }
                } catch (MalformedURLException m) {
                        u = null;
                }
                HyperlinkEvent linkEvent = null;
                String target = (anchor != null) ?
                                (String)anchor.getAttribute(HTML.Attribute.TARGET) : null;

                                linkEvent = new HyperlinkEvent(html, HyperlinkEvent.EventType.
                                                ACTIVATED, u, href, element);


                                return linkEvent;
        }
        void fireEvents(JEditorPane editor, HTMLDocument doc, String href,
                        Element lastElem) {
                if (this.href != null) {
                        // fire an exited event on the old link
                        URL u;
                        try {
                                u = new URL(doc.getBase(), this.href);
                        } catch (MalformedURLException m) {
                                u = null;
                        }
                        HyperlinkEvent exit = new HyperlinkEvent(editor,
                                        HyperlinkEvent.EventType.EXITED, u, this.href,
                                        lastElem);
                        editor.fireHyperlinkUpdate(exit);
                }
                if (href != null) {
                        // fire an entered event on the new link
                        URL u;
                        try {
                                u = new URL(doc.getBase(), href);
                        } catch (MalformedURLException m) {
                                u = null;
                        }
                        HyperlinkEvent entered = new HyperlinkEvent(editor,
                                        HyperlinkEvent.EventType.ENTERED,
                                        u, href, curElem);
                        editor.fireHyperlinkUpdate(entered);
                }
        }

}

This class can be assigned to any JEditorPane:

         MyLinkController controller = new MyLinkController();
            editorpane.addMouseListener(controller);
            editorpane.addMouseListener(controller);

Factors for the Emergence of Knowledge

Understanding knowledge as rooted in application implicates understanding knowledge as emergent. Knowledge emerges from how people do things in a social environment (Orlikowski, 2002). Here, I want to suggest a few factors, which have an influence on how knowledge emergences in an organizational context.

Tasks
What we do or don’t do, influences what we will know or not know. Tasks are a natural way to guide what is being done and what not. It can be assumed that knowledge emergences around the execution of tasks.

Processes
Processes as a number of interrelated tasks can provide an overarching framework for the emergence of knowledge in the execution of the individual tasks. These can both reinforce or hinder the processes, which lead to execution of the tasks.

Organizational Structures and Social Networks
The structures of an organization and the social networks provide another framework in which knowledge emergence. For instance, in the interactions between people new distributed capability can be built up in the process of fulfilling a number of tasks, which are not necessarily connected by processes.

Technologies
Technologies provide a framework for the emergence of knowledge in that they channel activities by their capabilities and limitations. For instance, text-centric knowledge emerges from using Microsoft Word, narrative and visual knowledge emerges from using digital camcorders.

Serendipity
Sometimes just totally unforeseen events have a strong influence on the emergence of knowledge. Serendipity, for instance, is sometimes said to have not-negligible influence on the process of scientific discovery (Beveridge, 1980; Rosenman, 2002).

Strategies and Directions
Strategies and directions set a framework for what knowledge can emerge.

Reward
When a certain path provides more rewards than another, it is a natural decision to prefer the more rewarding way. This can be a powerful channelling mechanism for knowledge emergence.

Personal Abilities, Preferences and Histories
Every person is both enabled and restrained by their unique set of abilities, preferences and experiences. These have strong influence on the emergence of knowledge related to every person.

Cultural Histories
Culture is sometimes understood as shared historically constructed reality. Likewise to the personal abilities and histories, culture is both and enabler and restrainer of knowledge emergence.

Beauty, Coherence and Truth
Beauty, coherence and truth can be further factors influencing the emergence of knowledge. In this context, it simplifies the discussion to understand these terms not as absolute but as socially constructed. In that, these constructs can help in understanding why some ideas seem to be more successful than others (Dawkins, 2006).

A careful consideration and balancing of these factors can lead to an environment, in which the emergence of knowledge can flourish. Of course, some of these factors are easier to actively influence than others.

Programming: Synchronization of Multiple Java Projects between Mac OS X and Windows

Subversion or SVN is a widely used technology to support collaborative software development. It is best described by the two most important commands. The user can commit changes a svn repository. This leads to the changed files being uploaded to the server. The second command is update, which downloads all changes from the server made by other users. Manually triggering these two commands is an essential part of work with Subversion. It is therewith no real-time synchronization solution such as Dropbox (getdropbox.com). However, this might also not be desirable because a software developer might prefer to work with his or her local copy of the software, until it is mature enough to be committed to the repository.

A very strong feature in Subversion is versioning. For every file, changes for all committed versions can be tracked back. These version can be accessed using http or https and some servers provide HTML versions, which can be browsed using a normal web browsers.

Many open source platforms, such as soureforge.net support to manage code repositories using Subversion.

Alternative technologies, who provide similar functionality to subversion are, for instance, CVS or git.

Java Project Structure

The development of Linnk takes place on Windows and Mac OS X. Eclipse is used as primary development platform on both operating systems. The code bases on these two platforms must be synchronized and traceability of the development process requires a robust versioning system. This lead us to explore Subversion as possible technology to synchronize the development.

The code base of Linnk is divided into a number of Java projects. The following figure gives a brief impression of the different projects and their dependencies.

wpid-linnkprojectstructurepng.png

The different projects are integrated by linking their sources. In eclipse, this can be accomplished using the “Link Source” function (available in the right click context menu of a Java project).

wpid-bildschirmfoto2010-04-13um08-40-04.png

This means, for instance, that the project LinnkStandalone is linked to a the source folders of LinnkLib, lightweight_linnk, mxro and lightweight_mxro (The “lightweight” projects consists of classes, which do not have any dependencies to 3rd party Java libraries).

Setting up SVN

There are many different SVN servers available. As a first test, we used the free server VisualSVN for windows (http://www.visualsvn.com/). Using the GUI, a user needs to be set up and at least one “repository”.

For eclipse on Windows and Mac are plugins for Subversion available (Subclipse for Mac OS X and Subversive on Windows). Projects in eclipse can be shared using the option “share projects” (also available on the right click context menu). After the plugins are installed, the wizard for sharing a project offers the option “SVN”.

wpid-bildschirmfoto2010-04-13um08-51-12.png

In the following dialog steps, the repository URL must be chosen (this can be obtained from VisualSVN) and a project name. After a project is set up, the options for updating and committing the project are available.

Problems

In synchronizing the two projects between the Mac OS X and Windows machines, a number of problems aroused:

  • When the whole project is committed, Eclipse wants to synchronize the project meta-data (e.g. “.project”). This is not desirable as this meta-data contains, for instance, local paths, which are not transferrable between different computers.
  • The SVN synchronization seemed to be problematic for projects using Google’s GWT technology. The google plugin constantly complies new versions of the JavaScript files, which pose difficulties in synchronizing between the projects on different computers.

Solution

After initially uploading the projects to the SVN server (or downloading them on the other computer respectively), we disconnected the projects from SVN in eclipse. Rather than using the build in features in Eclipse to commit and update projects, we wrote simple scripts to do the committing and uploading.

Mac OS X:
Parameterized for update and commit: ./svnmanager.sh update or ./svnmanager.sh commit

# svn script for eclipse projects on MacBook

command=$1

# these folders are to be commited/updated with svn
folders=(/Volumes/local/online/Programmierung/eclipseMacBook/Default/Linnk \
/Volumes/local/online/Programmierung/eclipseMacBook/Default/LinnkLib/Linnk \
/Volumes/local/online/Programmierung/eclipseMacBook/Default/LinnkLib/LinnkResources \
/Volumes/local/online/Programmierung/eclipseMacBook/Default/LinnkLib/LinnkArchive \
/Volumes/local/online/Programmierung/eclipseMacBook/Default/LinnkNetBeanGUIs/linnknetbeanguis \
/Volumes/local/online/Programmierung/eclipseMacBook/Default/LinnkWebEditorFramework/linnkwef \
/Volumes/local/online/Programmierung/eclipseMacBook/Default/LinnkWebEditorFramework/lib \
/Volumes/local/online/Programmierung/eclipseMacBook/Default/leightweight_linnk/leightweight_linnk \
/Volumes/local/online/Programmierung/eclipseMacBook/Default/leightweight_mxro/leightweight_mxro \
/Volumes/local/online/Programmierung/eclipseMacBook/Default/teentalk/teentalk )

for folder in ${folders[@]}
do
if [ "$command" = "commit" ]
then
svn $command -m "macbook commit" --username "mroh004" --password "XXXX" $folder
fi

if [ "$command" = "update" ]
then
svn $command --username "mroh004" --password "XXXX" $folder
fi
done

Windows:

Windows does not have a built in SVN client. A client, which supports the command line functions of SVN, is the SilkSVN client (www.sliksvn.com/en/download)

For committing:

@ECHO OFF</pre>
rem Commits

"c:\Program Files\SlikSvn\bin\svn" commit "C:\eclipseWorkspace\leightweight_mxro\leightweight_mxro" -m "Commit from STF-428-DSK06" --username "mroh004"

"c:\Program Files\SlikSvn\bin\svn" commit "C:\eclipseWorkspace\leightweight_linnk\leightweight_linnk" -m "Commit from STF-428-DSK06" --username "mroh004"

"c:\Program Files\SlikSvn\bin\svn" commit "C:\eclipseWorkspace\LinnkLib\Linnk" -m "Commit from STF-428-DSK06" --username "mroh004"
"c:\Program Files\SlikSvn\bin\svn" commit "C:\eclipseWorkspace\LinnkLib\LinnkArchive" -m "Commit from STF-428-DSK06" --username "mroh004"
"c:\Program Files\SlikSvn\bin\svn" commit "C:\eclipseWorkspace\LinnkLib\LinnkResources" -m "Commit from STF-428-DSK06" --username "mroh004"

"c:\Program Files\SlikSvn\bin\svn" commit "C:\eclipseWorkspace\LinnkNetBeanGUIs\linnknetbeanguis" -m "Commit from STF-428-DSK06" --username "mroh004"

"c:\Program Files\SlikSvn\bin\svn" commit "C:\eclipseWorkspace\LinnkWebEditorFramework\linnkwef" -m "Commit from STF-428-DSK06" --username "mroh004"
"c:\Program Files\SlikSvn\bin\svn" commit "C:\eclipseWorkspace\LinnkWebEditorFramework\lib" -m "Commit from STF-428-DSK06" --username "mroh004"

"c:\Program Files\SlikSvn\bin\svn" commit "C:\eclipseWorkspace\teentalk\teentalk" -m "Commit from STF-428-DSK06" --username "mroh004"

The script for updating is similar, just “commit” is changed to “update” and the “-m …” parameter is removed.

Reach of Personal Knowledge Management

Personal knowledge management or personal information management is a distinct cross-disciplinary stream of literature. Personal information management in an organizational setting is a special case, as the management of personal information should be aligned with organizational knowledge management efforts. In this article, we provide a framework, which can help understanding the context of personal knowledge management in an organizational setting, by illustrating the different levels of “reach” (for a discussion for reach and range see Weill and Broadbent, 1998, p. 91) for personal knowledge management.

wpid-scopeofpersonalknowledgemanagementpng.png
Framework: Reach of Personal Knowledge Management

This framework is informed by the notion of knowledge on different units of aggregation. Tiwana (2002, p. 42) describes how knowledge is aggregated on different levels. Individuals accumulate knowledge but if they collaborate in a team context or in their department, knowledge on a team level is created. Teams can collaborate with other teams, which leads to knowledge being created on the organizational level. The organization itself can be part of a business network that exchanges and creates knowledge.

Similar levels can be found in multilevel research. Multilevel research tries to provide robust frameworks to guide studies in choosing a unit of analysis. Multilevel research proposes that “organizational entities reside in nested arrangements” (Hitt et al., 2007). Hitt et al. (2007), for instance, describe individuals as nested within groups, which themselves are nested in subunits, organizations, interorganizational networks and environments.

Each of the levels or units of aggregation are of importance for knowledge management: knowledge is managed by individuals (Lansdale, 1988; Kim, 1993), between individuals in direct interaction (Thompson and Walsham, 2004; Orlikowski, 2002 among others), between individuals in teams (Walz et al., 1993; Eppler and Sukowski, 2000), between groups/teams in an organization (Carlile, 2002; Tanriverdi, 2005) and between organizations (Dyer and Nobeoka, 2000). The following table summarizes different scopes of researchers in investigating knowledge and knowledge management that correspond to the different units of aggregation.

Scope Literature
Individual/Self Analysis of how individuals use emails to organize their knowledge (Whittaker and Sidner, 1996)Analysis of how individuals organize their knowledge using hierarchical file structures (Barreau and Nardi, 1995)

How individuals can store and retrieve knowledge using information technology (Lansdale, 1988)

Partner Knowledge transformation in an organization (Carlile and Rebentisch, 2003)Knowledge shared in face-to-face meetings (Orlikowski, 2002)
Team Processes in team knowledge management (Eppler and Sukowski, 2000)Knowledge management of a software development team (Walz et al., 1993)
Organization/ Business units Knowledge of the organization emerges from knowing individuals (Thompson and Walsham, 2004)New product development project across multiple departments (Carlile, 2002)

Measure of knowledge management capability across business units in large firms (Tanriverdi, 2005)

Knowledge-intensive projects in an multinational organization (Orlikowski, 2002)

Business Network Knowledge Sharing Network of Toyota and its suppliers (Dyer and Nobeoka, 2000)Knowledge sharing in small alliances of limited number of firms and of multiple businesses and institutional entities such as universities (Ciborra and Andreu, 2001)

Multiple organizations integrate their decision support and enterprise resources planning systems (Shafiei and Sundaram, 2004)

Organizations increase their knowledge in a collaborative effort (Levinson and Asahi, 1996)

An organizational knowledge network must consider and be able to represent all of these levels. As posed by multilevel research, all of these levels interact with each other. It is thereby a futile approach to build an exclusive ‘personal knowledge network’ or exclusively looking at an optimal structure for business networks. An effective organizational knowledge networks must be composed of elements from all these different levels. Any solution for personal knowledge management should not only consider the personal information, but must also consider the further reaching levels to be of use for the individual.

Related Literature

Literature with tag Personal Information Management
Literature with tag Personal Knowledge Management
Blog post on PIM articles in the Communications of the ACM