Pimki is a Wiki based, GettingThingsDone inspired PIM.
Using an extremely easy and immediate way to organise your data, contextual todo lists, integrated diaries (bliki = blog + wiki), mind mapping and many other nifty features.
Built with Ruby and based on the popular Instiki wiki & Ruby on Rails framework.
Ackbar is an adapter for ActiveRecord (the Rails ORM layer) to the KirbyBase pure-ruby plain-text DBMS. Because KirbyBase does not support SQL, joins or transactions, this is not a 100% fit. There are some changes to the ActiveRecord interface (see below), but it may still be useful in some cases.
Ackbar: ackbar.rubyforge.org
KirbyBase: www.netpromi.com/kirbybase_ruby.html
Rails: www.rubyonrails.com
Pimki: pimki.rubyforge.org
Ackbar’s project goals, in order of importance, are:
As can be seen, the main reason I need Ackbar is so I distribute Pimki across multiple platforms without requiring non-Ruby 3rd party libraries. KirbyBase will work wherever Ruby works, and so will Pimki. That alleviates the need to repackage other bits, end users will not have to install extra software, I have full control on the storage, the storage is in plain text. Just what I need to "shrink wrap" a Rails project for end-user distribution.
Ackbar currently passes through a small bootstrap test suite, and through about 80% of the ActiveRecord test suite. I will never pass 100% of the tests because KirbyBase does not support all required functionality.
Ackbar includes a SQL fragment translator, so that simple cross-database code should be maintainable. For example the following will work as expected,
Book.find :all, :conditions => "name = 'Pickaxe'"
Book.find :all, :conditions => ["name = ?", 'Pickaxe']
Additionally, you can also provide blocks:
Book.find :all, :conditions => lambda{|rec| rec.name == 'Pickaxe'}
or even:
Book.find(:all) {|rec| rec.name == 'Pickaxe'}
Most of these changes are around the find method, bit some apply to update and associations. Basic SQL translation should work the same, but you can always provide custom code to be used. See the CHANGELOG and the tests for examples.
On the todo list is support for mixins. It might even be possible to rig something to simulate joins and eager associations, but that is for a later stage. Transactions will obviously only be supported once they are supported by KirbyBase.
Additionally, there are numerous little changes to the standard behaviour. See the CHANGELOG and the tests for more details. These may cause little heart attacks if you expect a standard SQL database.
It is also worth noting that other plugins that write SQL will not work. You will need to get a copy of them to your /vendors dir and modify the relevant parts.
Simply:
gem install ackbar
or download the zip file from rubyforge.org/projects/ackbar and just stick kirbybase_adapter.rb in the Rails lib dir.
You will then need to add
require 'kirbybase_adapter'
in the config/environment.rb file of your project.
If you plan on multi-database development / deployment, you must require the adapter only if necessary:
require 'kirbybase_adapter' if ActiveRecord::Base.configurations[RAILS_ENV]['adapter'] == 'kirbybase'
This is because Ackbar overrides certain methods in ActiveRecord::Base and others. These methods translate the standard SQL generation to method calls on KirbyBase, and obviously should not be overridden for regular DBs.
Now we go back to our regular scheduled programming, consisting of mostly silence as I actually code more than I write about it. More updates *soon* :-)
I don't know about the vaunted 10x productivity of Rails, but that's only because I haven't done much web-work otherwise. All I can tell you is that for Pimki I added two new features (and a bug fix)... while I was sitting in a meeting and came across the need for them!
As I was taking notes in a lecture (using Pimki on a brand shiny new laptop), I needed to copy a diagram from the whiteboard. Laptop are not notoriously easy in that aspect, but the diagram was simple enough and I know that dot language reasonably well. So as the meeting went I just typed the graph into a page. During a short break I added a new chunk that looked for such embedded graphs, runs GraphViz and replaced the text with the image result. (Well, the short break wasn't quite enough and I did spend that evening fixing this, but the point, man, the point!).
So if you're using Pimki2 and update to the latest CVS snapshot (be warned - still alpha), you can embed a GraphViz diagram in a page with the help of <graph></graph> tags. Just read the help section.
In
another meeting, I wanted to take a note to search google on something.
What better way that to extend the existing external links with a
Google search? Just embed a [g[query string]] in the page and you're laughing.
Of course, just adding more such links is not the full solution I'm after. But until I get a chance to do the full macros, it'll do quite nicely.
Not bad for a couple of meetings in which I also managed to learn a few things :-)
As for the bug-fix, in the upgrade to Pimki2 I managed to miss the ToDo text expansion - the rendering of the text after the todo as part of the page itself. That is not fixed and links to pages, glossary items and the like are displayed correctly.
The next major item on the list is still the backend format. This is also the major holdback in development - almost everything is dependent on how the information is stored. (So if you use Pimki, please fill the user survey at: http://rubyforge.org/survey/survey.php?group_id=447&survey_id=25!)
Currently there are two contenders: SQLite and KirbyBase.
SQLite comes with Instiki-AR, but I think KB may have other advantages
that merit consideration: Import from Instiki can still be acheived
through export/import (and that may be the case anyway with
Instiki-AR); It is a pure-ruby solution, so nothing extra to install;
It uses plain-text to store the data; I like the ruby-blocks format of
querying data. The major disadvantages is of ActiveRecord: KirbeyBase
is not an SQL format and there is no AR adapter for it. This means I
can't learn-by-example from Instiki and that I miss out on all the
existing goodness like the #acts_as_taggble mixin. I will
also lose on changes from Instiki, but since I'm not sure about how
continued integration will work (expect for export/import) anyway, and
that may turn out well in that it will force me to better review each
change in Instiki and get a better understanding of what goes in where.
What I need is mainly time to play with both options. Not a thing I have in bounds, so I'm asking questions on ruby-talk and here. If you have any experience with these issues, please feel free to contact me directly or on the pimki-users mailing list.
With the release on Instiki-AR, I am now faced with a difficult problem: should Pimki remain with madeleine or switch to SQLite?
(Bottom line: I need to know my users better, so if you use Pimki please please please fill this survey!).
When DHH first implemented/released Instiki, it was based around his ideas for how Rails will turn out to be. At the time I was both learning Ruby and looking at ways to better organise myself. So I started hacking Instiki to add navigation, personal productivity and other features. David was not interested in integrating them back into Instiki main, as they reduced the "no step three" installation (the GraphViz dependency) and simplicity on Instiki. I continued to work on it in the dark for awhile, but at the insistence of Gavin Sinclair, I release it publicly on RubyForge (an inssistence I now repay back regarding Gavin's patented CrapCollctor ;).
Going public has really pushed me forward: adding more productivity features at users request, getting exposed to GTD, learning more about proper development and testing practices, better Ruby and Rails knowledge and other goodies. So a big Thank You for all the users who responded over the years! (It also meant continually merging and upgrading with the Instiki source code mainline never knowing the release schedule and contents and the effort required for each upgrade but I'm not complaining I'm just sitting alone in the dark developing this for your eternal gratification and productivity)
Then around Instiki version 0.9.1, DHH was too busy to keep maintainint it and the task was givem to Alexey Verkhovsky. Alexey has release 0.9.2 as a patch release and went to on migrate Instiki to the modern rails. So between the minor release of 0.9.2 and 0.10 Instiki had gone an astounding transformation under the covers, from being based on a precursor of Rails to Rails 0.11! (<rant>When will people realise that 1.0 is not a shameful / all is perfect release, and that major changed to the API should be noted with major version number changes?!?!?</rant>)
I tried for a while to integrate Instiki 0.10 into Pimki, but gave up on this as too problem prone. There was no way I could do it and remain sane. So instead I declared Pimki2 - the new generation of Pimki. (See? major changes => major version and I haven't been smitten with lightning yet). What I did was take a fresh copy of the new Instiki and re-implement all the features. Besides the underlying changes, there is also a big philosophical move: Pimki 1.x was a hack to make it work; Pimki2 is a Get It Right phase, where I try to build it better in a sustainable way. This means better tests (TDD), cleaner code, new fetaures with a more critical view of the feature set etc. The upside is a better piece of software, the downside is that the released version (Pimki 1.8 currently) is still in the old code base.
So we get to the now and point of this post. When I finally had most of the features back to the state they were before, plus a few enhancements and the skeleton of what I want to achieve for a Pimki 2.0 release at an alpha stage...
Alexey goes and releases Instiki-AR - Instiki with an SQL backend...
And then announces that he really doesn't have a lot of time keep maintaining Instiki...And that there's this newfangled I2 thingy anyway - a rewrite of the major features of Instiki in Rails to make a proper Rails-based wiki.
So here are my options, on which I'd really appreciate your feedback (and if you can't be bothered to take the survey, you can always email the pimki-users mailing list or just me):
Pros:
Cons:
Pros:
Cons:
At this stage I'm leaning towards using SQLite. Here are my reasons:
My course of action will be to study the Instiki-AR schemas, play around with them, enhance as necessary and then re-implement the 2.0 features. Timewise, it'll be awhile (patches and help are always welcome :) before Pimki2 will be back to alpha. Once there, I hope the new features will be a lot easier to implement and maintain.
Thanks for reading down to the bottom. Any response, comment or insight on this problem will be much appreciated.
From Bruce Tate and Joel's Forums come a couple of light reading pieces about the state of affairs in the Java world. Not much to add, except that this is why I've made the decision that if I don't get to code Ruby, I'd rather not code (professionally :) at all.
And before anyone points out the diminishing costs of starting-up, I have given this some thoughts. In a time where I was looking to leave my current employer (aka the tar pits of oblivion), this was very appealing. But life has other notions, and I do have some obligations. So I am changing places (next week - woohoo!) to a new employer with a much more supportive environment but minimal coding, and I'll get my fix coding open-source.
On the one hand, it's much less coding than I'd like but on the other hand I get to work on things I have passion for, and at least enjoy the environment during daylight. So expect a continued stream of innovations in Pimki... but at very fluid deadlines :-) I currently have many more ideas than time and I really enjoy this project, so Pimki will remain alive and kicking albeit in slow-motion.
And maybe one day, when life is lessing pressing, I'd get off my butt and start working on that nifty idea...
While I'm waiting for the dust on Instiki's SQLite back-end to settle, I've been doing some front end work for Pimki. First order of the day: better todo display (the other major todo upgrade - making them checkable - depends too much on the storage mechanism).
The most visible change is that the combined Todo view now comes in two flavours: plain list and quadrant view. There is a full documentation in the help section, BTW.
You can now set a few properties on the todo items, besides context. The full syntax is:
todo@context{importance: high, due_date: Dec 23}: buy chrissy prezziesThis
allows you to break your tasks into both urgency (when) and importance
levels. Other properties will be ignored for the moment. One property
that I'll add soon is status, for marking the items as complete. Still need some thoughts about how this should be handled (re display, archiving, etc).
An
additional enhancement is that todo items now automatically pick up the
enclosing page categories as their context. So if you have a todo@home on page with category:garage listed, the context for that todo is both home and garage.
The list view is basically the same as before, tweaked for better display. You can sort the display by name, dates or importance. You can limit the list of displayed items by context. Each item will link back to the page/entry it is set on.
This is inspired by The 7 Habits of Highly Effective People. The idea behind it is that we tend to do important and urgent things first, then move to urgent but not important tasks. Instead, more time should be given to important but less urgent tasks (read this for a bit discussion). This view will collect all the todo items and display them in a table for easy reference on what should be done next.
Currently, the urgency horizon is set at 1 week: if it's due before then it's urgent, otherwise it's not.
Under the hood I've split the Bliki and the Task Tracker into their own controllers. As a testament to the 10x hype with rails this exercise took about 10 minutes per controller, and I ended up with more tests. What I did was use script/generate to create the new controller, then copy over the relevant methods and tests from the Wiki controller to the new one. I added the necessary routes entries, changed a bit of the action names and run the tests. It didn't take long to make everything in the tests pass. I then grep the code to find all the things I haven't changed, added tests (that failed) and fixed the code. So overall the result is better (I hope :).
As I edit the templates and controllers, I also try to modernise the code. Taking advantage of all the built-in Rails functionality makes Pimki less of hack and a lot easier to manage in the long run.
The next things on the list are to streamline the Bliki interface and complete the (AJAX heavy) Task-Tracker front end.
If you are interested in checking Pimki2 while under development, read my last post on how to. Short version: export existing, download, unzip, stop old, start new, import, play. Just don't use it for mission critical data yet :-)
This looks madly cool: MoochiKit
- A lightwight javascript library (moto: MochiKit makes JavaScript suck
less). A highly documented and well tested suite of JavaScript
libraries that will help you get shit done, fast.
I wonder long till it's integrated with Rails? :-)
(from lesscode.org)
If you've got time, go read We are the web
by Kevin Kelly. Fills you with a kind of buzzing energy that makes you excited about the future. (from too-biased).
Backstroke of the West. No comment
(from Bill de hÓra).
Computer update: making progress on installing everything, then
going to customise the beejezus out of it (again) so I have the colors
and keyboard shortcuts and software preferences juuuust right to go
back to development. At least I've got email back.