Long time I wrote about a book here.
The Art of Unix Programming by Eric Steve Raymond
well, I honestly like such books on philosophy of Unix, the right way
of doing things on Unix etc ... :)
you may still feel that the review on Amazon where someone said ESR `paints
a 1 sided picture` is right. But there are numerous things which cannot be found
in any other place.
We have "Unix design patterns", "conventions for Unix command line options" etc
The "Rules" of Unix are very neatly explained.
And for the light relief, we have "Rootless root" :), which is also available on
ESR's website, my favorite is the one on GUI :-D LOL!
And I love the cover page image - of the Zen master teaching to the novice :)
And what else ? ... am I forgetting something!?, ... let me read it again! :)
Wednesday, September 08, 2010
Friday, July 16, 2010
AUTOLOAD in C
Recently, I attended a Perl training on Advanced Perl
(actually, I attended just to kill time, and most of the
subject matter being covered there was known to me :) )
and when learning perl modules, I came across AUTOLOAD
In brief, AUTOLOAD is like a default in a module, when one
tries to invoke a function which is not implemented in the
module, perl calls the function with name AUTOLOAD
passing the function name.
Having AUTOLOAD gives rise to interesting uses - atleast in
Perl. One can handle multiple calls in AUTOLOAD giving the
impression that there are lot of functions defined in the
library - especially useful when method names are like
get_a() get_b() get_c() etc.
I was trying to implement this in C, and its pretty
straight forward. All we need is a dynamic library and a
a default handler - which we shall call catch_all()
The only difference here would be, the responsibility
to call catch_all() will be with the invoker of the lib
(maybe this can be hidden behind neat APIs)
Lets create a library with a function and a catch_all
make lib: gcc -c -fPIC sotest.c; gcc -shared -fPIC -o libsotest.so sotest.o
Now for the invoker:
compile: gcc -L. callso.c -lsotest -ldl # Assume current dir, set LD_LIBRARY_PATH
Simple !. isn't it ? :)
(actually, I attended just to kill time, and most of the
subject matter being covered there was known to me :) )
and when learning perl modules, I came across AUTOLOAD
In brief, AUTOLOAD is like a default in a module, when one
tries to invoke a function which is not implemented in the
module, perl calls the function with name AUTOLOAD
passing the function name.
Having AUTOLOAD gives rise to interesting uses - atleast in
Perl. One can handle multiple calls in AUTOLOAD giving the
impression that there are lot of functions defined in the
library - especially useful when method names are like
get_a() get_b() get_c() etc.
I was trying to implement this in C, and its pretty
straight forward. All we need is a dynamic library and a
a default handler - which we shall call catch_all()
The only difference here would be, the responsibility
to call catch_all() will be with the invoker of the lib
(maybe this can be hidden behind neat APIs)
Lets create a library with a function and a catch_all
/* sotest.c */
#include
#include
void name1 ()
{
printf ("\n SOTEST: called %s\n", __FUNCTION__);
}
/* this is our AUTOLOAD method, which takes 1 param - name */
void catch_all (char *name)
{
/* If someone tried to call method hello() in this module */
if (0 == strcmp(name, "hello")) {
printf ("\n SOTEST: called hello()\n");
} else
printf ("\n SOTEST: %s, %s()\n", __FUNCTION__, name);
}
make lib: gcc -c -fPIC sotest.c; gcc -shared -fPIC -o libsotest.so sotest.o
Now for the invoker:
/* callso.c */
#include
#include
int main (int argc, char *argv[])
{
void *handle, (*fp)() = NULL, (*gfp)() = NULL;
char *fname = NULL;
if (argc <>\n", argv[0]);
exit (1);
}
fname = argv[1]; /* The function to be invoked in the lib */
handle = dlopen("./libsotest.so", RTLD_LOCAL | RTLD_LAZY);
fp = dlsym(handle, fname);
if (fp) {
fp(); /* If the named function exists, invoke it */
} else {
gfp = dlsym(handle, "catch_all");
gfp ? gfp(fname): 0; /* call the default handler if not */
}
return 0;
}
compile: gcc -L. callso.c -lsotest -ldl # Assume current dir, set LD_LIBRARY_PATH
Simple !. isn't it ? :)
Thursday, May 25, 2006
[Regex] Mastering ...
Hi all,
I purchased this book "Mastering Regular Expressions", 2nd Ed, by Jeffrey Friedl.
This book treats regex as a language on its own, and explains all the intricacies of crafting a regex, advanced syntaxes, regexes in various languages etc.
After 3-4 chapters, uhf... it's really heavy reading!, since I have lot of work nowadays, just managing to read a page/two per week!
--
Ani
I purchased this book "Mastering Regular Expressions", 2nd Ed, by Jeffrey Friedl.
This book treats regex as a language on its own, and explains all the intricacies of crafting a regex, advanced syntaxes, regexes in various languages etc.
After 3-4 chapters, uhf... it's really heavy reading!, since I have lot of work nowadays, just managing to read a page/two per week!
--
Ani
Friday, May 12, 2006
[General - programming] Language features with dual behavior
Hi all,
Recently while writing some Python ane Perl code, I noticed that the features provided by the language are useful in dual roles. Perl is anyway famous for TIMTOWTDI.
Consider comments - multiline comments.
There is no dedicated multiline comment character-sequence in Perl/Python, but the common(and probably official way) is
In Perl:
Use the perl module documentation(pod) lines
E.g.
=head
... some code ...
=cut
In Python:
Use the triple-quote string
E.g.
"""
... code...
"""
Even though C/C++ provides the /* ... */ sequence, they cannot nest, so generally the
preprocessor is used to get rid of huge lines of code with
#if 0
...code...
#endif
Interesting....
[update-2/6/10]
After a short sprint with Lua, I found even Lua has a multiline string ([[ ... ]]) , similar to the triple-quote strings of Python, which can be turned into a comment with a leading --:
--[[
A multi
line
comment
]]
[update: 21-May-2015]
In bash, the null command can be used for multi-line comments!
: ' some
long boring
stuff
'
--
Ani
Recently while writing some Python ane Perl code, I noticed that the features provided by the language are useful in dual roles. Perl is anyway famous for TIMTOWTDI.
Consider comments - multiline comments.
There is no dedicated multiline comment character-sequence in Perl/Python, but the common(and probably official way) is
In Perl:
Use the perl module documentation(pod) lines
E.g.
=head
... some code ...
=cut
In Python:
Use the triple-quote string
E.g.
"""
... code...
"""
Even though C/C++ provides the /* ... */ sequence, they cannot nest, so generally the
preprocessor is used to get rid of huge lines of code with
#if 0
...code...
#endif
Interesting....
[update-2/6/10]
After a short sprint with Lua, I found even Lua has a multiline string ([[ ... ]]) , similar to the triple-quote strings of Python, which can be turned into a comment with a leading --:
--[[
A multi
line
comment
]]
[update: 21-May-2015]
In bash, the null command can be used for multi-line comments!
: ' some
long boring
stuff
'
--
Ani
Monday, April 24, 2006
Sunday, April 23, 2006
[Quotes] On Programming
http://en.wikiquote.org/wiki/Programming
--
Ani
"C++: where friends have access to your private members." - from the above link ;)
--
Ani
"C++: where friends have access to your private members." - from the above link ;)
Friday, April 21, 2006
AJAX
Hi Guys,
I hope most of you have heard about AJAX. Its the new buzzword
Here are some useful Links:
http://adaptivepath.com/publications/essays/archives/000385.php
http://www-128.ibm.com/developerworks/web/library/wa-ajaxintro2/#resources
We recently ajaxed a blog tool and these resources were very useful.
Those who want to try out AJAX , this would be good place to start.
I hope most of you have heard about AJAX. Its the new buzzword
Here are some useful Links:
http://adaptivepath.com/publications/essays/archives/000385.php
http://www-128.ibm.com/developerworks/web/library/wa-ajaxintro2/#resources
We recently ajaxed a blog tool and these resources were very useful.
Those who want to try out AJAX , this would be good place to start.
[Only me?] It looks like ...
... I am the only one who is posting!
Are all of u busy or lost interest in Blogging already??
Atleast I know the status of a few who are geographically close to me:
Some are lost in TRANSLATIONs and some are lost in a DATABASE of ACTIVE items! ;)
Hmm...
I dont know Reddy's status, Ratish is very busy
--
Ani
Are all of u busy or lost interest in Blogging already??
Atleast I know the status of a few who are geographically close to me:
Some are lost in TRANSLATIONs and some are lost in a DATABASE of ACTIVE items! ;)
Hmm...
I dont know Reddy's status, Ratish is very busy
--
Ani
[Book] Advance Linux Programming
Hi all,
ALP is a well known book in the Linux world, as of now I've completed 3/4 of the book, and I did not get bored at any point. It's really interesting, and highlights on so many concepts that I faintly remember reading from Advanced programming in Unix env by stevens and many unknown.
--
Ani
ALP is a well known book in the Linux world, as of now I've completed 3/4 of the book, and I did not get bored at any point. It's really interesting, and highlights on so many concepts that I faintly remember reading from Advanced programming in Unix env by stevens and many unknown.
--
Ani
Tuesday, April 18, 2006
[General - Inspiring] The mastermind behind the product we work on
Here is a link which describes the founder of Winphoria (Now the Core Networks Division of Motorola) - Murali
http://www.norwestvc.com/portfolio/p_aravamudan.aspx
He has 17 patents and 25 pending!
--
Ani
http://www.norwestvc.com/portfolio/p_aravamudan.aspx
He has 17 patents and 25 pending!
--
Ani
Tuesday, April 11, 2006
SQL 99 - CASE
SQL 99 supports
CASE statement within SELECT
like
SELECT col_a, col_b
CASE col_c
WHEN col_c = 1 THEN 'ONE'
WHEN col_c = 2 THEN 'TWO'
ELSE 'OTHER'
END
FROM tbl;
Probably this does an outer join and a Union, not sure, but this is handy and much easier to use than JOINs.
If any of u know the internals of this , u'r welcome to describe it here.
--
Ani
CASE statement within SELECT
like
SELECT col_a, col_b
CASE col_c
WHEN col_c = 1 THEN 'ONE'
WHEN col_c = 2 THEN 'TWO'
ELSE 'OTHER'
END
FROM tbl;
Probably this does an outer join and a Union, not sure, but this is handy and much easier to use than JOINs.
If any of u know the internals of this , u'r welcome to describe it here.
--
Ani
Monday, April 10, 2006
Subscribe to:
Posts (Atom)