Org-mode is great to serve as knowledge management tool, it also has helped
me increase my personal effectiveness. Recently I have been exploring
org-mode for managing small projects in the business environment,
in which collaboration happens occeasionally between me and the project team members.
In this post I summarised my workflow to organise, manage and monitor a
project. The implementation of this workflow revolves around the
collaboration. I have been practise this workflow for a while and can
see my growth in planing and managing skills.
I use a broad definition of project: as long as a task that requires a series
of sub-tasks to be done, then it is a project. Normally I categories
any tasks that relates to a project into three groups:
the major tasks that must to been done in order to
deliver the project product.
administrative or miscellaneous tasks that keep the project goes
on, like sent out the invoice.
anything that is important to the project and therefore
worthy keeping a record, like meeting notes or decision
made that that impacts the project progress.
Each category has a corresponding top level section or heading. Once this outline is setup, it
is very convenient to view content under these categories,
regardless of what tasks I was working on, either reading emails,
coding, or writing report. Org-mode can scan all the .org
files in a direcotry, and creates a tree-structure, with the file name
being the root, and headings being the nodes.
An intuitive way to locate a any node is to start from the beginning,
the process is same as finding a section in a text book. It can be summarised as:
first, find the right book by its name,
then find the right part,
then narrow down to the right section,
and continue to the section I am interested in. An more pleasure way is
to use fuzzy match supported by Helm package - I can narrow down the
selection by random nodes. For example, as the images below shows, to
locate headline under this article among 40 org files, I only need to search "Small pro",
because there are only three headlines has "Small" in its name, "small
changes", "small talk", and "small project", and "pro" narrow down to
the unique headline.
It saves me a lot of time in remembering where I saved one notes, and
wandering around the files to find something. I only explain a bit of
the features of Helm, if you want to try out, you can find my
configuration here. I recommend a good tutorial if you want to know
Figure 1: Test image
We usually a couple of projects at the same time. Also, create a new
tasks or notes is easy. org-capture-mode would create a temporary
node and by default it will be saved as a subtree in refile.org, or I
can directly re-locate the headline directly to this project using the
locating mechanism above.
These two features are most enjoyable to use, and make me away from
wandering in multiple directories, trying to find the right files, and
therefore increase my productivity. Never under estimate how long you
will spent in finding in one file.
Projects usually come with hard deadlines about the product delivery.
Setting and change deadlines in org-mode is pleasurable with org-deadlineC-c C-d.
It brings up a mini-calendar buffer (shown below), I can use
shift+left and shfit+right to move forward and backward for a
day, or shift-up and shift-down to move between weeks, and hit
RET to select a deadline. Apart from navigating, I can also choose to
type the exact date directly, like "2015-07-25" and hit RET.
Once the deadline is set it will show up in that day's calendar. I
don't want to suddenly realise there is a deadline I had on that day.
So it makes sense to have an early warning period to show the tasks if
it is due in days. This behaviour is governed by the
org-deadline-warning-days variable. In my Emacs configuration, I set
to 30 days. It gives me plenty of time to do any tasks.
I also set deadlines for sub-tasks since it is quite easy to do in
org-mode. But coming up with realistic deadlines is difficult. To me,
it must give enough time to do the task properly, to the PM, it must
be fit in the whole project plan and resource. Both are likely to have
different opinion on how long to implement the new features with
documentation. It is quite important skills to have: to me, it
reflects my understand on the problem and also my own technical
capability, to the manager, it is part of their project plan.
My initial estimation may be far from the actual effort, especially
when the problem domain is new to me, or I haven't done similar tasks
before. The more I do, the better I am good at estimating. At this
stage, I practise this skill seriously, and like to have someone with
more experienced to review my estimation.
To make this task easy for them, I'd present an overall view of the
project time-lines, which clearly shows the period allocate to the
specific tasks. org-timeline will generate a time-sorted view for
all the tasks. The recent feedback I received is that I tend to
overlook the time spent on documentation and tests. Someone with more
than 10 years in software development says they usually takes about 3x
times on these two tasks together than actually coding.
time-line view also provides benchmark to the progress and I check it
frequently to make sure I am on track. It gives the PM a reference for
swapping tasks if some becomes urgent.
Additional to have the early warning system to prevent sudden surprise,
org-mode provides another way of monitoring the project in terms of resource -
the actual time I spent on the project. This feature is quite useful
when I am given a quite loose deadline but with limited resource,
say 150 hours.
Since the sub-tasks are mostly defined in the early stage, whenever I
start to do it, I clock in first by org-clock-in. The clocking will
be stopped once I manually clock out, or clock in to another task, or
the tasks is completed (marked as DONE.) For each clock entry, it
shows start time, end time and duration.
Multiple clocking logs are accumulated, and each entry shows the start
time, end time, and duration. The durations can be added up and tells
me exactly how much time I spent on each tasks. The whole tasks under
the project and aggregated across the whole project, by one single
function org-clock-report (C-c C- C-r).
Table 1: Clock summary at [2015-06-14 Sun 11:17]
TODO Use Emacs's org-mode to Manage a Small Project
DONE add example for org-refile
NEXT add example for org-clock-report
NEXT proof read
NEXT proof read - 2
It is normal to underestimate the complexity of an tasks, and spent
too much time in resolve them, and usually I can catch up the in the
later stage, however if I had the feeling the overall progress has
been affected, I need require more sources from the PM, and the quote
I will give is extra hours I had based on my initial estimation.
That's an quick reaction.
Also, the clock-report table tells me the different between my effort
estimation and the actual time I spent on that tasks.
The above two plots show the same data (included below), and if you are going to present one to summarise your findings, which will you choose? It is very likely you are going to pick the right one, because
the linear increasing feature of bars is pleasant to see,
it is easier to compare the categories, the ones on the right has higher value than the ones on the left, and
categories with lowest and highest value are clearly shown,
In this article I am trying to explain how to specify the plotting orders in ggplot to whatever you want and encourage R starters to use ggplot2.
To create a bar plot is dead easy in R, take this dataset as an example,
to get the plot on the right side, reorder the table by count (it is already been done), then
will do the job. That's simple and easy, it does what you provide. This is completely different to ggplot() paradigm, which does a lot computation behind the scene.
will give you the first plot; the categories are in alphabetically order. In order to get a pleasant increasing order that depends on the count or any other variable, or even manually specified order, you have to explicitly change the level of factors.
create another variable mode.oredered which looks the same as mode, except for the underlying levels are in different. It is set to the order of counts. Run the same ggplot code again will give you the plot on the right. How does it work?
First, every factor in R is mapped into an integer, and the default mapping algorithm is
sort the factor vector alphabetically,
map the first factor to 1, and last to 10.
So emacs-lisp-mode is mapped to 1 and ssh-mode is mapped to 10.
What the reorder script can do is to sort the factors by count, so that ssh-mode is mapped to 1 and org-mode is mapped to 10, I.e. the factor order which are set to the order of count.
How does this affects ggplot? I presume ggplot do the plotting on the order of levels, or let's say on the integer space, I.e. do the plotting from 1 to 10, and then add the labels for each.
In this example, the default barplot function did the job. Usually we need to do extra data manipulation so that ggplot will do what we want, in exchange for the plot good better and may fits in the other plots. Without considering the time constraints, I would encourage people to stick with ggplot because like many other things in life, once you understand, it becomes easier to do. For example, it is actually very easy to specify the order manually with only two steps:
first, sort the whole data.frame to a variable,
then change the levels options in factor() to what ever you want.
To show a decreasing trends - the reverse order of increasing, just use levels = rev(mode). How neat!
a data.frame with longitude, latitude, elevation at a particular recording time,
a one-row data.frame of summary statistics about the workout, includes duration, distance, speed etc.
It comes with a helper function Parse_GPX_all to do the batch process and combine all data.frame together, also add city and country to the summary tables. Then you can see all the activities summary in one table, and use it to query both location and summary table, for example, how many miles did you run last year? How many cities had you run? It meant to make you feel great by showing you have achieved a lot.
Currently it parsing data from RunKeeper and Strava perfectly. .GPX format is generic data format so applying RExercise to data from other apps shuodn't be a problem. If you do, please feel free to contact me, I am extermely friendly to people who do exercise (:d), or sent me a pull request if you already figure out.
I am a search-guy: when I want to know something, I use the search functionality to locate to where has the keyword, and I didn't use my eyes to scan the page, it's too slow and harmful.
Emacs provides powerful functionality to do searching. For example, I use these commands very often (with the key-binds),
isearch (C-s), search for a string and move the cursor to there,
helm-swoop (C-F1), find all the occurrences of a string, pull out the lines containing the string to another buffer where I can edit and save,
helm-multi-swoopM-X, apply helm-swoop to multiple buffers, very handy if I want to know where a function is called in different buffers.
projectile-grep or helm-projectile-grepC p s g, find which files in current project contains a specific string, similar to helm-multi-swoop limits the search to files in project directory.
I love doing searching in Emacs, but the problem is to have to remember all the key-binds for different tasks. Also, sometimes, I forgot about what alternatives I have and usually go with the one that I most familiar with, which usually means not the right one. I sometimes realise I use isearch multiple times to do what ace-jump-word-mode can achieve by just once.
Org-mode Hydras incoming! gives me some idea to group all these functions together, and press a single key to perform different tasks, so this can free my mind from remembering all the key-binds. Also, I can write the few lines of text to reminds myself when to do what, and this potentially can solve problem two.
Here is the hydra implementation for searching:
So next time, when I want to search something, I just press F4, and then it brings up all the choices I have, and I don't need to worry about the key-binds or which to use! That's cool!
I am looking forward simplifying my Emacs workflow using hydra package, the key challenge is to identify the logical similarities among the tasks and then group them together accordingly. For hydra-search(), it is "search something on somewhere".
Version control system is a complex issues, and hard to understand the idea of branching and different types of merging. I merely understand the basic of Git, and it already makes my life a lot easier, I am managing about 10 repositories at this moment without much effort.
But my collages are using SVN as the centre storage for scripts. Switching to SVN is not a problem, I just need few weeks to transfer the knowledge and start to use it. I am reluctant to learn something basic and have duplicated knowledge, also, I use GitHub and Bitbucket which are Git based. But sticking to Git make mine work impossible to work with collauges.
Then I found out the Git developer has already made effort to bridge Git and other version control system, like SVN. The git svn allows me to just Git commands for staging, cherry-picking, pull etc, and then upload to the SVN remote repository with just one command line. I really like the idea of transferring the skills from one system to another without any cost, it makes me believe Git is great and I can continue to use Magit in Emacs!
Here is the basic steps and comments for this work flow: