Tuesday, June 05, 2018

The first Thinking Notebook Release: MindForger 1.42.0

Today, I am happy to announce the first release of MindForger - the 4th generation of my thinking notebook. Rethought, redesigned and rewritten from scratch it becomes the tool I was dreaming about for years.

Although it's the first release, it brings several unique features and there is much more to come.

I didn't choose the date randomly - MindForger is released on the day of my 42nd birthday... and yes, it can confirm answer to the Ultimate Question of life, the Universe, and Everything!

Stay tuned - distribution/platform support, new features and demos will be releases in the upcoming weeks.


Labels: , , , , , , ,

Wednesday, October 19, 2016

Doom in SpaceX HW and SW

Wednesday, September 23, 2015

NASA Space Shuttle Program HW & SW

Friday, April 10, 2015

Fly Me to the Moon: Apollo Program HW & SW

Atom Editor: Emacs key bindings & TWiki syntax theme

After 20+ years I decided to leave Emacs church to a new editor - Atom. In order to be efficient I created Emacs key binding allowing me to use the same shortcuts and TWiki syntax theme to enjoy markup syntax highlighting - Atom is really easy to hack!

Labels: , ,

Thursday, September 25, 2014

Weekly Top 10

Top 10 2014/w36
  • Thomas Bergensen - Final Frontier (Interstellar OST)
  • Speedy J - Red Shift
  • Floex - Gone feat. Never Sol
  • Apparat - Interrupt
  • Calibre - Start Again feat. Chimpo
  • S.P.Y - Lost Orbit feat. Diane Charlemagne
  • Matrix & Futurebound - Magnetic Eyes feat. Baby Blue
  • Rusko Netsky remix - Everyday
  • London Electricity - Electricity will keep me Warm feat. Elsa Esmeralda
  • General Levy
Top 10 2014/w35
  • Matrix & Futurebound - Control
  • InsideInfo - Metamorphosis feat. Miss Trouble
  • Plution & Skyer - Cosmic Rain
  • Dub FX - Made
  • Aphex Twin - Delphium
  • London Electricity - The Plan That Cannot Fail
  • Koven - Make it There feat. Folly Rae
  • Royksopp - Eple
  • Jamiroquai - Half the Man
  • The Smashing Pumpkins - 1979
Top 10 2014/w34
  • Apparat - Negra Modelo (Duplex)
  • London Elektricity - Love The Silence feat Elsa Esmeralda
  • Nero - Me And You
  • Skrillex - First Of The Year (Equinox)
  • Kirsty Hawkshaw - Face to Face [Seba RemiX]
  • Commix - Japanese Electronics
  • Ill Skillz - Be there 4 U
  • Danny Byrd Feat Brookes Brothers - Gold Rush
  • Speedy J - Ping Pong
  • Omni trio - Higher ground
Top 10 2014/w33
  • Tron Legacy - Soundtrack OST - Overture
  • Tron Legacy - Soundtrack OST - The Grid
  • SP:MC & Youngsta - Unidentified (OSMUK011)
  • J:Kenzo - The Roteks
  • Lenzman Feat Riya - Open Page
  • Missy Elliot - Pass That Dutch
  • OutKast - Ms. Jackson
  • LMFAO - Champagne Showers ft. Natalia Kills
  • Adele - Rolling in the Deep
  • New Fish - The Shawshank Redemption Soundtrack
Top 10 2014/w32
  • Blush Response - Blade Runner Soundtrack
  • Floex - Gone feat. Never Sol
  • Etherwood - Weightless
  • U2 - Pride (In The Name Of Love)
  • Mr. Mister - Broken Wings
  • Simple Minds - Belfast Child
  • Queen - I Want To Break Free
  • A-ha - Take On Me
  • Alphaville - Forever Young
  • AquaBabes - Nerikej mi baby
Top 10 2014/w31
  • Thin Red Line - The Corall Atol
  • Basement Jaxx - Never Say Never ft. ETML
  • Les Twins VS. Bones The Machine+Pee Fly vs. Laura+Boubou
  • Top Cat - Ruffest Gun Ark (Chase & Status Remix)
  • Technimatic - Tectonic
  • DJ Fresh - Gold Dust
  • Dub FX 'NO REST FOR THE WICKED' feat. CAde & Mahesh Vinayakram
  • Jimi Hendrix - Hey Joe
  • Sex Pistols - God Save the Queen
  • Psy - Gangnam Style
Top 10 2014/w30
  • Massive Attack - Teardrop
  • Autechre - Basscadet
  • Nero - Innocence
  • Nu-Tone - Win the Fight (feat. Lisa Milett)
  • Shifter - Timo Maas
  • Jessie J - Nobody's Perfect (Netsky Vocal Remix)
  • Swedish House Mafia - Save The World
  • London Elektricity - Meteorites featuring Elsa Esmeralda
  • James Bond 007 Skyfall by Adele 
  • Undress Me Now - Morcheeba
Top 10 2014/w29
  • The Doors - Riders On The Storm
  • Led Zeppelin - Stairway to Heaven Live
  • Metallica - Nothing Else Matters
  • Nirvana - Smells Like Teen Spirit
  • Red Hot Chili Peppers - Dani California
  • Lenny Kravitz - Are You Gonna Go My Way
  • Pearl Jam - Jeremy
  • Soundgarden - Black Hole Sun
  • Queen - Who Wants to Live Forever
  • Lou Reed - Perfect Day
Top 10 2014/w28
  • Johnny Cash - Folsom Prison Blues - Live at San Quentin
  • Jimi Hendrix - Voodoo Child, Live '69
  • Tony Bennett & Lady Gaga - The Lady is a Tramp
  • Magnetic Man ft Ms Dynamite - Fire (Maida Vale)
  • Dub FX 18/04/2009 'Made'
  • DJ Fresh VS Jay Fay Feat. Ms Dynamite - Dibby Dibby Sound
  • Kiesza - Hideaway (Official Video)
  • Frank Sinatra & Ella Fitzgerald - Moonlight In Vermont
  • Angelina Jordan - Fly Me To The Moon
Top 10 2014/w27
  • Ludovico Einaudi - Fly (Intouchables Soundtrack)
  • Orbital - Halcyon On and On
  • Dub FX & Stamina MC 'Only Human'
  • Example - 'Changed The Way You Kiss Me'
  • The Prodigy - Smack My Bitch Up
  • Skrillex - Ragga Bomb With Ragga Twins
  • Dub Phizix and Skeptical feat Strategy - Marka
  • Crystal Castles - Air War
  • LMFAO - Party Rock Anthem ft. Lauren Bennett, GoonRock
  • Pharrell Williams - Happy

Labels: , , , , ,

Monday, July 07, 2014

KeePass2 to KeePassX

Get KeePass2 to KeePassX convertor from GitHub

Labels: , , ,

Monday, January 27, 2014

BASH History Suggest Box

A command line utility that brings improved BASH command completion from the history. It aims to make completion easier and more efficient than Ctrl-r. Find it on GitHub and YouTube.

Labels: , , ,

Wednesday, January 01, 2014

Ubuntu @ Acer Aspire S7-191

Thursday, June 28, 2012

Concept2 Indoor Rower

After years of running I was facing crisis of motivation, limits of my body and injuries. I cross train more and more and looking for new challenges and personal bests to beat. I have been rowing since I was 10 for 8 years and both on water rowing and erging is the activity I enjoy. Therefore I decided to return back to the roots and get Concept2 indoor rower.

Concept2 is a company with perfect profile and cool history. I have been riding models B, C, D and E of their basically indestructible machines.

Prior Velvet revolution I was even erging on bad copies of model B from the Eastern bloc :-Z

The most interesting alternatives I found are WaterRower (check James Stroud comparison) and RowPerfect. Both are not (that) bad, but I decided to bet on Concept2 as I know it for a very long time; because of the community (log, ranking, challenges, BIRC/CRASH B, ...), old models support (Concept2 supports even oldest models up today) and use of Concept2 by majority of elite rowers.

General consensus is that model D/PM3 is perfect fit for home use, while model E is kind of "Rolls-Royce" meant rather for fitness centers and hotels. Model E is bigger, higher, nicer and ultimately durable. So, after not much deliberation, I decided to invest in my health and became happy owner of Model E/PM4.

You may want to check model D/E comparison and PM3/PM4 monitors comparison.

There is a lot of accessories and gadgets - log card allowing you to track all your workouts (I had it in the past while erging in fitness centers around Prague), CBreeze (the perfect accessory with the best 'value for price' ratio), RowPro (for social rowers), ErgLog (Android phones), KinoMap (to row your favorite river/trail), slides, ShoxBox ... and much more.

Before you start erging check the technique and common errors videos. Set the damper (which has the similar function like bike gearing) to 5 (not to 10 - which is the most common beginner error) and experiment from there. Learn about drag factor (allows you to set different machines to the same resistance e.g. older machines have typically lower resistance with the same damper settings). Join a forum and find a training plan like C2 Interactive, Pete's plan or Wolverine plan. I also found very useful French Rowing Federation 2k Strategy and pace calculator.

I follow Concept 2 2k interactive plan 4 days a week with 2 extra sessions of rowing or running and aiming to get to 300km/month+ (again ;-).
Happy erging!

Labels: , , ,

Tuesday, December 06, 2011

MindRaider meets CoachingNotebook

Announcing new release of MindForger that brings integration with MindRaider. MindRaider is a desktop outliner that enables off-line and sharing of your outlines. MindForger is an online companion of MindRaider. With MindForger you can upload your outlines on the web and easily access them from any device. Check MindForger - your Outlines on the Web for more details.

Labels: , , ,

Saturday, December 03, 2011

Google App Engine SDK: HttpClient authentication on localhost

public class AppEngineLocalhostClient {

 public String authenticateAtLocalhost(
     String username, 
     boolean asAdmin, 
     String redirectUrl) throws Exception {
  HttpClient httpClient = new DefaultHttpClient();
    ClientPNames.HANDLE_REDIRECTS, false);
  HttpPost httpPost = new HttpPost("http://localhost:8888/_ah/login");
  String email = URLEncoder.encode(username, "UTF-8");
    new StringEntity(
      "email=" + email + 
      "&continue=" + redirectUrl + 
  HttpResponse response = httpClient.execute(httpPost);
  String authenticationCookie 
   = response.getFirstHeader("Set-Cookie").getValue();
  return authenticationCookie;

 public static void main(String[] args) throws Exception {
  AppEngineLocalhostClient client = new AppEngineLocalhostClient();
  String username="test@example.com";
  boolean iWantToBeAdmin = true;
  String afterLoginGetMeToThisUrl 
   = URLEncoder.encode("http://localhost:8888", "UTF-8");
  String authenticationCookie = client.authenticateAtLocalhost(
  // ... access the REST interface authenticated
  HttpGet httpget = new HttpGet("http://localhost:8888/rest");
  httpget.addHeader("Cookie", authenticationCookie);
  // ...  
When developing a Google App Engine application using SDK on localhost you sometimes need to authenticate programatically. For example in case that your application has a REST-style interface like CoachingNotebook. It took me a bit of time to determine how exactly to do that - lets save it for you.

Labels: , , , , ,

Monday, May 30, 2011

Google App Engine: Deployment Ensuring Sustainable Evolution

I use Google App Engine for Java since it was relased. I did a few smaller projects like Facebook application for behej.com backed by AppEngine in the past. Recently I started to use AppEngine more seriously. Therefore I had to define environments and procedures that are closer to these that are commonly used in the enterprise environment.

I defined 3 environments:
  • Development
    • This is where I do actual development of the application apart to localhost. There are no restrictions on changing the code and data. Data might be screwed (even intentionally) and/or deleted. The purpose of this environment is to enjoy the freedom of development and testing AppEngine features and APIs online.
    • It is separate AppEngine application deployed at the URL like http://foo-development.appspot.com
  • Pre-production
    • I use pre-production instance to verify that new version of the application (that I plan to release) works with the production data and that the upgrade will be smooth and easy. The data are replicated from production to pre-production only from time to time. Therefore there is always a slight difference which is perfectly OK, because this instances is not supposed to be backup. For the replication of the data I use REST interface of my application. 
    • Alternatively you may consider for example incremental pull-style (replica is pulling data from the master) replication of the data using TX backed Tasks (copy only if TX succeeds).
    • This is also separate AppEngine application deployed at the URL like http://projectname-preproduction.appspot.com
  • Production
    • This is where the production version of the application runs and where real users are working with the real data. 
    • This is obviously separate AppEngine application deployed at the URL like http://projectname.appspot.com
There are a couple of AppEngine features that could be used to define these environments. For example namespaces. After I compared different pros and cons I decided to go with the option described above. It gives me the highest level of isolation and data separation. Therefore it seems to be the most robust and safe solution. I also defined upgrade procedures that differ based on the type of the change and its impact:
  • Presumption
    • AppEngine supports multiple versions of the applications to be deployed. Note that these applications share the same storage. Let me presume that the production application is deployed as version 1 and this version is made default.
  • New version upload
    • Upload new version of the application - version 2.
  • Test upload
    • Make the final check that the application works as expected by accessing and testing it at http://2.foo.appspot.com
  • Release
    • Make the version 2 the default.
This is zero downtime upgrade. You don't have to define new version each time you deploy a new application version - I rotate just 3 versions as shown in the diagram above.

In case of a major release, that includes data model change (find the definition of the major release in the best practices paragraph below), there might have to be a scheduled maintenance window:
  • Presumptions 
    • The same as above.
  • Disable the access 
    • Disable the access to the application and display maintenance info page to users.
    • AppEngine storage can be also switched to read-only mode from the administration console. 
  • Backup
    • AppEngine provides no backup. Fortunately there are a couple of doable options:
      • Copy data using Datastore Admin (experimental)
        • With Datastore Admin tool You can safely copy data between different applications. This tool can be used to migrate from Master/Slave to HRD datastore, but also for a backup.
      • Export the repository using:
        • Bulk loader tool (yes, it works with Java).
        • Alternatively with your own backup service (for example REST-based) and tool - as I do.
      • Snapshots
        • Although AppEngine doesn't support snapshots (yet ;-) you can easily implement them yourself. For example by creating set of "snapshot" variants of your persistence beans. By adding 'snapshot' field to these beans you can even maintain multiple snapshots. Again you can use namespaces in this case.
        • This is in place (scope of single application) backup and/or transformation. 
    • The backup can include only entities (and entity instances) impacted by data model changes. Typically there is no need to dump whole storage. 
  • Transform (if needed)
    • Based on the size of the repository transformation to the new data model schema can be performed:
      • Offline on the exported image which requires subsequent drop of the all affected datastore tables and import of the new image. 
      • In-place transformation that is realized by running a set of statements (export/drop/import not required).
  • Deploy new application code
    • The same steps as above - new version upload, test and release.
  • Enable the access
    • Switch off the maintenance info page and enable the access to application again.
The procedure described above is pretty expensive as the amount of the data grows. You have to basically pay for re-imaging the application (requests, bandwidth, read and write operations). Such approach obviously becomes unusable once your storage size is bigger than small.

Zero downtime could be achieved for example using 2 isolated applications, data replication and DNS reconfiguration. I'm not that far yet. 

Let me also mention data model change best practices. They enable in place upgrades and work with any size of the storage. It might be obvious, but it is worth to remind. The motivation is to minimize the impact of changes you do (e.g. avoid maintenance windows):
  • Do not change field names
    • If there is really need for such a change, rather create a field with new name, deprecate the old one and define an administrative task that will copy the data from the old field to new field and/or default value. 
  • Do not change fields data types
    • Use deprecation in the same way as above.
  • Do not delete fields 
    • Simply deprecate them.
  • Make the fields optional (if possible)
    • This guideline might be translated to - allow null values on the persistence tier, because it can make your upgrades doable on top of AppEngine repository. For example consider that you want to introduce a new field and compare boolean vs. Boolean. The datastore upgrade will fail in the first case.
  • Use major releases to purge your data model
    • Major application release is opportunity to remove all deprecated fields, polish your data model and do the transformation of the data.
My application is opened to users for several months and I'm still in learning new tricks and improving the procedures described above. The obvious motivation is to  make sure that the application will run without any problems and outages .

Labels: , , ,