Sunday, 24 January 2016

Pilling the cat

So, my little old kitten has heart disease (well, he is 19) and is currently on 3 different types of pills, 4 times a day in various configuration.

Ideally, pilling a cat looks like this:


In reality, if your cat is anything like mine, it is quite annoying for the cat and the person who has to do the pilling.

Now, after some practice, my cat is taking his pills in very good grace (and being very co-operative with it!), however, in retrospect, I wish I had trained him when he was still healthy, because the very last thing a sick animal needs is extra stress when his favorite human has to inflict medication.

So, if you own a cat, now is the time to obtain some placebo pills and a small syringe so you can squirt some water into their mouth easily; and train pilling until the cat is comfortable with it (around 4-5 days).  Once you both have practice, do a maintenance pilling session once in a while.

You may have to start out with the cat burrito method she is showing, and don't be afraid of cat bite, if you copy what she is doing it's impossible for the cat to bite you in this position, as long as you stay firm (but gentle) and do not let the cat wiggle out.

The trick is to disguise it as a chest rubbing cuddle session involving lots of praise and a treat at the end (but not exclusively, some pills must be given on an empty stomach).  This will help you avoid the following scenario, which for a cat with a heart problem is definitely not something to get into:



Happy pilling!

Saturday, 16 January 2016

Fun with TypeScript

I've been asked to check out TypeScript. So, I did! What do I think of it so far? 

Well, it looks dangnabbit good (I like strong typing. Probably my OCD, and why I am not so gone on snake code, although I think/know I'm just being precious, snake is ok, sort of, as I said, would not code a whole one).

But, does TypeScript blend?

I'm going to try and port 'Fail to plan, plan to fail' with a view of making it more generic and turn this into a useful(?) component for other stuff. I _even_ have a cunning plan.

In other news, doing any kind of Android dev is still kind of very slooooow.  I keep meaning to, I've got all the stuff installed on my windows lappie, but, ummm, it just takes so long. I have a list of 35 useful(ish) apps I can think of, mostly stuff that should be quick to make, but quick is relative here. :( By the time this has loaded (eventually), I'm already doing something else (twice over), and it ties my lappie up, so I really need to dedicate one entire machine (and a parking place with nesting space) to it.

Obligatory vid for this post:


Wednesday, 4 November 2015

All about the Teutonic Knights

This post is not about coding, but, I had so much fun with this, I thought I'd share.

The history.  The imdb entry.  The film itself:


Whilst it's in Polish (and sadly lacks subtitles), it still is interesting to watch, and, for the most part, is quite self-explanatory... :-)

If all that is not enough Teutonics for you, there's also this.

(How did I come across this?  By listening to the 'Lesser Bonapartes' history podcast, in particular the episode about rump states.  {Probably the most giggly history podcast series ever})

Tuesday, 27 October 2015

Life is better with hot tea

I make a hot drink.  I go code something.  My drink gets cold.

:(

So, I bought some travel mugs.

The first one had to be returned, it was a Bodum coffee press, which despite the claims made,  is not leak proof and spews hot beverage at times.  Also, the plastic was poorly cured and smelled unhealthy.

I had more luck with the next two models --- they are leak proof and rather good looking.  And they keep the drink warm wherever you take it along with you.

My peppermint tea mug:

You can buy it on Amazon and it's called 'One Click Cup'.
(The somewhat ugly label wipes off with some gentle scrubbing)

My red tea mug:


This you can also buy from Amazon and it's called 'Forge'.

The loop on the purple mug is a nice touch -- you can hook this over a finger and so carry a lot more stuff than you could if you needed to balance a big hot mug, and you can set up a hook on the desk to hang the mug on as well, so it's not in the way and can't fall over. 

Both cups hold 500ml, you can put them safely in your bag, they look cool and they fit into a standard cup holder in the car as well.

Either cup happily deals with a tea bag left in it, and the purple mug is also ok to use with loose Hibiscus or Rosehip tea. 

Happy hacking with spill proof, hot beverages!

Tuesday, 29 September 2015

Tangram for Breakfast

True, you can use software to play Tangram, but it's not as satisfying as the real life hands-on version.

Amazon sells a splendid wooden version for £2.69:

It's the perfect way of (gently) waking your brain up in the morning -- coffee is good, but a Tangram puzzle + coffee is superior.  Also works great if you're stuck on a coding problem -- solve the tangram, and the solution to the other thingy just pops up in your mind a lot of the time.

Try some cats, or a paradox.


Friday, 11 September 2015

A log about writing a logger

So, I finally completed the first cut of my logger, and initially it was a LOT larger than the version in the repository, but after 'test driving', I found that (sadly) all my fancy ideas were just too fancy.

So, it's a pretty small 'opus', and just proves the rule that the shorter a piece of software is, the longer it takes to write.

I found that the ability to define new logging macros, set levels and display options, cherry pick levels to show and defining an output function on the fly really is more than enough for everything that is needed.

Other fails include that my idea to use 'ts -i "%.s"' from moreutils for adhoc profiling didn't really work properly for some reason that I cannot work out why.

If I try to use it with a macro that sets a few printout markers inside a function, all I get is that the expected function printf output stops totally whilst it does it's thing, then I get the total time taken put out on the top line, and everything that I expected to arrive 'peu-a-peu' comes in one go as it's finished doing the time wasting loop test, and it looks suspiciously like it's simply measuring the time it takes for writing to stdout via printf, and that some weird blockage is happening to the stdout output.

Oh well.  Looks like I just have to write something else to have that service :-D




Tuesday, 8 September 2015

The Truth About Git

Just in case you have not seen this yet...


And... for extra added value, you can install magit!

Friday, 28 August 2015

Comments on Comments (1)

(Generosity with questionable benefits) --- from /linux-3.17.1/net/ipv4/ping.c
* Pavel gave all rights to bugs to Vasiliy,  none of the bugs are Pavel's now. 

(History may not repeat, but it will misname things {at least in some versions}) -- /linux-2.4/include/(some versions of)/uaccess.h
* For historical reasons, these macros are grossly misnamed.

(We can't think of much to say here right now, but we're saying something anyway.) --- from Python-2.7.9/Modules/_ctypes/stgdict.c
* XXX blabla more

(What the world really needs is r/codegonewild) -- from git/patch-delta.c
*  /* sanity check */ if (data != top || size != 0) { error("delta replay has gone wild"); }



Sunday, 23 August 2015

A logger for Corinthia

I managed to get the first cut written, and I got use the logmessage scribe.  Took 5 minutes to write the log message, woo!  Profit! :-))

Of course I found a couple of minor bugs in the logmessage scribe, mostly because I had to use GNU diff instead of git diff, but, I could not be happier.


Translation: if you're happy and you know it just say 'meow'!

Tuesday, 18 August 2015

Tree keeping made easy

If you want snazzy tree views for your project of your local drive files and the remote master repository that you can traverse with a browser, just modify this script and set up a cronjob to keep your trees updated.

How does it look?

Download the file itself, load it into your browser and have fun traversing the tree of the Corinthia GitHub repository. (blogger.com and google.drive won't let me paste the file without crippling the links, fair enough, it's 168 directories (and thus links) and usually people who do this kind of thing would probably be up to no good[1]).  If you just want to see it without working links, it's here.




I think it's nice to have a tree overview --- a picture is worth a 1000 words (as they say).

[1] sadly, saving the document also ninja-edits the original.  So, don't waste your time with pasting lots of links into Google Docs :(

Monday, 17 August 2015

Can't sleep?

Listen to Bertrand Russels's Introduction to Mathematical Philosophy.

You probably still won't fall asleep, but it's more productive and it beats counting sheep...


Sunday, 9 August 2015

Adhoc profiling

./YourProgram | ts -i "%.s"

is a quick way of profiling your code.  Does of course not beat the real thing(tm), but for most purposes, this should give you a rough idea where your code spends it's time.

(You may need to install 'moreutils')

Some hacking music... because otherwise, there is just too much margin left in this blog post.


Sunday, 5 July 2015

Introducing Logmessage Scribe

This is my first python project.

It turns patches into logmessage templates, ready for you to produce a great logmessage.

The source (along with a proper introduction about the project) is parked on Bitbucket and the webapp is hosted on Google Appengine

Enjoy!



Tuesday, 23 June 2015

Emotional about Google Emojis

UPDATE:  After updating my browser, options to turn of the ugly ducklings appeared as a selector drop down next to my hangout name.  Still, if you move options to another place, at least leave a forwarding address! (This is why I hate upgraded stuff.  One forever has to hunt around to figure out wither stuff went --- the only thing I enjoy looking for is Easter Eggs...!)

Update to the update:  The ducks are back.  My side of the chat displays duck free, but now, people sending me emoticons still cause a duck invasion on my screen.  Solution:  revert to the old hangout, lose Hangout groups.  Oh well, there's always IRC for group chats I guess.

8():

If you're using Google hangouts or Gmail, you probably have noticed the invasion of hideous blobs that look like demented rubber ducks, where once classic smilies graced your mails and other utterances.

And there is no way of turning this 'feature' off, neither in gmail nor in hangout.

Ve hav ways and mezzods of making you use our stoopid design.

Nope. Not. Even. For. Free.  And not even if you paid me. Gerrroffff my lawn!!!1!!!

(Why so angry?)

I dunno.  It's an invasion of my personal space, and whilst I'm all for new inventions, I don't like being dictated to.  Plus, did I mention those emojis simply are hideous?

And yes, I also resent the waste of time of me having to research and then set up a new email client.

In case you have no idea what I'm talking about, here is a comprehensive collection of kiddie chic eyesores, in their full gory:



Friday, 5 June 2015

The Ultimate Meat in Sauce Method

Most recipes tell you to cut the meat into cubes, fry 'em and then add veg 'n stuff to the pan, and subsequently cook the entire thing for a longish while, often in a slowcooker.

This sort of works, but does the meat no favours and does not really improve the sauce either.

What people like about the slow method is that it breaks down the connective tissues in cheap cuts, but, there is a much better way of achieving the same effect, whilst keeping your other ingredients in prime condition.

Use a pressure cooker, and do the following with any meat-in-sauce recipe of your choice:
  1. Fry your uncut lump of meat on a medium heat setting until brown on all sides.  
  2. Lift out and place into the steam basket.
  3. Add your stock or water to the pan to just below the basket level, put the trivet in and the meat basket back.
  4. Pressure cook the lump in the steam for 25-45 minutes, depending on size and type.
  5. Set cooked lump aside (and cover so it does not dry out), reserve the stock, wipe the pan dry.
  6. Make your sauce as per recipe, without the meat, but use the reserved (and perhaps reduced) stock.
  7. Pressure cook the sauce for 7-10 minutes on the middle or lower pressure setting, use the quick release of steam.
  8. Take a blender stick to the sauce and veg in the pan (optional)
  9. Cut the meat into bite size pieces and add to the sauce.
Freeze in portions once it's all cooled down; or season and re-heat to eat now.

Why is this better?  Because your meat just cooks so much better as a lump (as in, stays juicier and has a much nicer texture and flavour), and the pressure[1] will take care of any connective tissue much better than a slow cooker.  And your veg and spices are not going to be boiled to death but only the amount of time necessary.  Plus, you get to purée the sauce, so it has a nice consistency. (if you use whole spice to cook, use a spice bag to remove them!)

Also, this method of course works for curries (where you sometimes may not want to use the pressure cooker on the actual sauce, but just for the meat) or Au Vin style sauces.

[1] If you're buying a pressure cooker, be very sure that it does deliver 15psi (or, 1 bar) as the top pressure. Otherwise, you need longer cooking times, which in turn affect the taste of the food.  Lots of pressure cookers don't offer that performance that and price is no indicator of quality here.  Beem (a German company) is a very good brand and I have their 8 litre model which I am very happy with. But Tefal, Tower and Kuhn Rikon all max out at 13 PSI, so always check the manual.  If it does not mention the actual numbers, chances are that the pot will not make the grade.  Moreover, if you use your pressure cooker to can food in WECK jars, 15 PSI is mandatory to produce the high temperatures needed to be safe from botulism.

Saturday, 30 May 2015

Everyone is mad about Mad Max

Me, I staying @ home, writing a new (small) project  in python and to chill out, I listen to a proper real life account of real life 'Mad Max' guys --- truly gory stories written in old fashioned, elegantly worded plain English; read beautifully by a man with a most sonorous and peaceful voice.



And, if you liked that, Mr. Roger Melin has read lots more Librivox books.  This book is next on my list. And this too.

Wednesday, 27 May 2015

Put some colour in your C code

I like colours.

Colours make things easier to spot, especially if you have to look at a few metres of test output bumpf --- looking for something blue or pink is much quicker.

So, I made myself a little color.h file that lives in /usr/include/ where it is available anywhere I need some colour in my code.

You will probably notice the colour names --- I took the liberty of renaming 'green' to 'moss', 'bold green' to just 'green' and 'magenta' to 'purple' and so on.  It's less to type, more descriptive, and, also functions as a small cheat map to understand the weird names the fashionistas in your life use to describe colour shades.

You can find the source for color.h here, note that the test code is present in the file in a comment, ready to be copied into a *.c file.

Enjoy!

                                                 

Monday, 25 May 2015

A fake switch

This post is about a trick from the Dalvik VM Internals video, which was mentioned in the Coursera Android course that is currently running. (maybe the next million years will be more exciting?)
                                         
The claim was that this is the one case where goto isn't evil around minute 33:31 and that it performs better than switch.  Well, does it?  And if so, by how much?

This was the example:

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#define DISPATCH()  \
    { goto *op_table[*((s)++) - 'a']; }

static void interp_old(const char* s)

   static void *op_table[] = { 
   &&op_a, &&op_b, &&op_c, &&op_d, &&op_e };
   DISPATCH();
   op_a: printf("Hell"); DISPATCH();
   op_b: printf("o "); DISPATCH();
   op_c: printf("wo"); DISPATCH();
   op_d: printf("rld!\n"); DISPATCH();
   op_e: return;
}
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
            
Switch is pretty switched on, so let's see how this compares!

The code that does the comparison can be found here.  Results(on my ancient 32 bit Dell):

With gcc -g:
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 
Using default value of 100000.  Usage: ./dispatch #
Sample size = 100000 chars * 100000 iterations. 
Dispatch method:                         0.002152 
Dispatch shuffled method:                0.002144
Goto switch method:                      0.002641
Goto switch method 2:                    0.002351
For loop Switch method:                  0.002667
For loop Switch shuffled method:         0.002660 
Recursive switch method:                 0.010798
Recursive shuffled Switch method:        0.006913
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

With gcc -O3:

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Using default value of 100000.  Usage: ./dispatch #
Sample size = 100000 chars * 100000 iterations.
Dispatch method:                         0.001083
Dispatch shuffled method:                0.001108
Goto switch method:                      0.001338
Goto switch method 2:                    0.001381
For loop Switch method:                  0.001465
For loop Switch shuffled method:         0.001385
Recursive switch method:                 0.001437
Recursive shuffled Switch method:        0.001385
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

So, there is a small difference, but it's really not that big a deal, unless you really are pressed for time and space.

The ever useful gcc manual has an entry about fun with local labels which will tell you more. Still, building this by hand is tedious, even if emacs is your best friend.  

What if you have a huge array of a struct that maps variable A to variable B and also has an optional function pointer F?  What you need is a 'fake_switch' generator, here is my version.  It should be easily adjustable for your taste. 

Goto it ;-)

Ps.: For extra fun, try this C to Assembler translator.  I really like the hover feature they built, but another thing that would be useful is showing the size of the generated code.
                                                                                                                                                                                    

Thursday, 21 May 2015

Today is... 2 Prairial CCXXIII

The French Republican Calendar episode of 'Revolutions' covers fairly much every aspect of user interface design and every potential pitfall and foible possible.

In fact, I think Mike's podcast is probably the TL;DR of most UI  (and application) design books that are out here (and far more fun too).

Enjoy!

Ps.: I'm not sure why the designer eventually was guillotined, but, I'm also not overly surprised ;-D

Monday, 11 May 2015

Fontic Kharma

I should not have seen this bug never before...

$ ./bin/dfconvert get ../gbg_samples/headers.odt foo3.html
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
DFAttribute *attrs: 0x85c15c0 , Tag tags: 1682 , char *value: DejaVu Sans1 ERROR:  no_op should never be called. 
...