Wow, Drivel 2.0 is amazing :)
Wow, Drivel 2.0 is amazing :)
When you define your own GObject class, you have to define 2 casts macro (instance cast and class cast). So you write :
#define MY_TYPE (My_Type_get_type())
#define MY_TYPE(inst) (G_TYPE_CHECK_INSTANCE_CAST((inst), MY_TYPE, My_Type))
e.g :
#define GTK_TYPE_LABEL (gtk_label_get_type ())
#define GTK_LABEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_LABEL, GtkLabel))
Now have a look at My_Type_get_type() declaration and definition. My_Type_get_type() always return the same GType. So if you write multiple cast, only one call to My_Type_get_type() is really necessary. But gcc is a good servant and does what you ask him : calls My_Type_get_type() whenever you call it. Think about this kind of loop :
for( ... ) {
GtkWidget* widget= ...;
gtk_box_pack_start(GTK_BOX(hbox), widget, ...);
}
To avoid such a waste, you have to tell gcc that all calls to My_Type_get_type() return the same GType.
GType My_Type_get_type (void) G_GNUC_CONST;
e.g:
GType gtk_label_get_type (void) G_GNUC_CONST;
Yes, it's that simple. Just add a G_GNUC_CONST attribute, and gcc will optimize all your to My_Type_get_type(), therefore all your MY_TYPE(inst).
Be smart, don't forget G_GNUC_CONST when you create your GObject class :)
Of course, glib and gtk+ already do this kind of optimization.
#include <stdbool.h> #include <stdio.h>#include <glib.h>
int main() { float f; gboolean gb; bool b;
f = 0.5f; gb = f; b = f;
printf("gboolean %d\n" "bool %d\n", (int)gb, (int)b);
return 0; }
Ouput :
gboolean 0 bool 1
0.5f is converted to int 0. But 0.5f is obsviously not zero and therefore should be evaluated as TRUE. So be carefull with gboolean.
NB: <stdbool.h>, bool, true and false are C99.
char buf[magic]; /* enough to hold "plop" */are still 0k. I'll try to be less lazy and always code :
char buf[sizeof "plop"];
U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX UTF-8 : 0xC3 0xAEIn French, circumflexes '^' on vowels often replace old French 's' :
I'll soon make a control-based desklets on it.
I'd like to get the C backend used by GNOME battstat applet (supports only ACPI/APM, but i steel haven't been able to contact its maintainer. I think I'll have to provide a full patch to get a chance to get PMU support in ...
LibGTop
I'm working hard on libgtop. Fixed a nasty bug on Linux/Sparc64.
I've been granted access to 5 Solaris (sparcs) machines in a German University, and started to fix Solaris support. I still haven't decided if this will go 2.8.1 or 2.9.0 ...
Today, i've wasted one hour debugging a network app : receive an UDP packet, unpack it and insert data into a PostgreSQL database. Quite simple. The program sending data is written in C.
I was getting a pg error about bad queries. So i added a try...except and a print statement on exception. Everything looked OK, i didn't understand what was wrong. So i opened a psql shell and a python shell, dumped there my query. Ran fine. I was crazy. I spent 15 minutes sending packet and watching my error log ...
Then repr came !(Python lib)
so i replace my print 'Query was %s' % (my_query,) by print 'Query was %s' % (repr(my_query),) ... there were some non-printable chars in my data (C '\0' grrrr /me stupid). repr displays them, str doesn't.
Next time, i'll be more carefull with string and i'll use repr each time i'll need to print data in an error messages.
Benchmarks files and results DNABench.py doesn't provide the time module
time python ~/Python/tmp/DNABench.py found AAAGTAAGCC at 1000000 it took 0 miliseconds found AAATGAAAAAG at 1048960 it took 1071 miliseconds found GAAAAAGTAAG at 1085441 it took 1947 miliseconds found TCTAAAAATAG at 1179694 it took 4075 miliseconds found ACGTGATGTAG at 1204636 it took 4697 miliseconds found AATAGATTCGG at 1548576 it took 13325 miliseconds found TCGTACAAATG at 1576094 it took 14024 miliseconds found CGGACGTGATG at 1599255 it took 14524 miliseconds found ATTCGGACGTG at 1689064 it took 16926 miliseconds found AGATTCGGACG at 1859204 it took 20982 miliseconds found TGATGTAGTCG at 1984902 it took 23993 miliseconds found AAATAGATTCG at 2000000 it took 24339 miliseconds Python regex took 24339 millisecondsreal 0m24.459s user 0m19.622s sys 0m0.067s
time python /home/benoit/Python/tmp/DNABenchPsyco.py found AAAGTAAGCC at 1000000 it took 1 miliseconds found AAATGAAAAAG at 1048960 it took 309 miliseconds found GAAAAAGTAAG at 1085441 it took 631 miliseconds found TCTAAAAATAG at 1179694 it took 1220 miliseconds found ACGTGATGTAG at 1204636 it took 1529 miliseconds found AATAGATTCGG at 1548576 it took 4442 miliseconds found TCGTACAAATG at 1576094 it took 4645 miliseconds found CGGACGTGATG at 1599255 it took 4800 miliseconds found ATTCGGACGTG at 1689064 it took 5372 miliseconds found AGATTCGGACG at 1859204 it took 6490 miliseconds found TGATGTAGTCG at 1984902 it took 7377 miliseconds found AAATAGATTCG at 2000000 it took 7480 miliseconds Python regex took 7480 millisecondsreal 0m7.714s user 0m5.654s sys 0m0.029s
time bin/IronPythonConsole.exe /home/benoit/Python/tmp/DNABenchIron.py Python regex took - millisecondsreal 0m44.932s user 0m0.060s sys 0m0.044s
Ok. obviously Psyco wins. IronPython is damn slow, so my shell experience was more than a feeling.
Btw, as you can see, i have a bug to report because IronPython doesn't find any DNA subsequence ...
System.Type st = typeof(Stack);sweet.
System.Type st = my_stack.GetType();
obj.__class__KISS
(setq skeleton-pair t) (global-set-key "[" 'skeleton-pair-insert-maybe) (global-set-key "{" 'skeleton-pair-insert-maybe) (global-set-key "(" 'skeleton-pair-insert-maybe)
very nice :D
New HTML Parser: The long-awaited libxml2 based HTML parser code is live. It needs further work but already handles most markup better than the original parser.
Keep up with the latest Advogato features by reading the Advogato status blog.
If you're a C programmer with some spare time, take a look at the mod_virgule project page and help us with one of the tasks on the ToDo list!