SQLite format 3@  <X@X6KtablecachecacheCREATE TABLE cache ( id VARCHAR(32) PRIMARY KEY, value TEXT NOT NULL, tstamp INTEGER NOT NULL, expires INTEGER NOT NULL ))=indexsqlite_autoindex_cache_1cacheP++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)l/tablerecipesrecipesCREATE TABLE recipes ( id INTEGER PRIMARY KEY AUTOINCREMENT,   -- pid: id of the category in which this row will be placed pid INTEGER NOT NULL, -- is_category: is this recipe a category or not is_category INTEGER NOT NULL DEFAULT 0, -- sortorder: id of the field after which this field will be showed sortorder INTEGER NOT NULL, -- title: title of the recipe title VARCHAR(100) NOT NULL, -- problem: short description of the problem which this recipe solves problem VARCHAR(255) NOT NULL, -- analysis: analysis of the problem (why it occured etc.) analysis TEXT NOT NULL, -- solution: provide one or deveral solutions solution TEXT NOT NULL, -- tstamp: last modification in unix timestamp format tstamp INTEGER NOT NULL, -- date_added: creation date date_added VARCHAR(20) NOT NULL )  recipes Mn<+]'recipes_map_0%list_item_21%list_item_20%list_item_19 #list_item_1%list_item_22 %list_item_13 %list_item_18 #list_item_9#list_item_4#list_item_7#list_item_6#list_item_8#list_item_5#list_item_3 isU +7+!The Menu PluginManualRead the recipes hereStart using it.F71183919073s ]W!WhyWhat is the purpose of CGI::Ex::Recipes?This is a demo application which shows how CGI::Ex::App can be used.You are welcome to download, install and hack on it to get up and running quickly with the framework.F1183906062 -u1M!CGI::Ex::RecipesI want to run that application, but do not know how.If You read this, you are probably running it :).
You must have some prerequisites like a web server, a Perl interpreter, CGI::Ex::App and a few other Perl modules installed on the machine. Nothing much.Search Google for the above keywords to see in what saga you are ;) . this will be a long run.F1183893893 Lo-L9 /! advanced mod_perltodotodotodoF1185669376{ )gY!basic mod_perlI want to run this thing under mod_perl. How?

mod_perl is more than CGI scripting on steroids. It is a whole new way to cr @ !'!sortorder2Seems to workgoodvery goodF1184106111P 5%'!testing real sortingwill it workhope sosee you laterFw1184105177S G'!sortordertesting sortorder is not hardgoodit is workingF1184104718g- ]1!What is this forI want to show lists of recipes in various formats and from different categories, (several levels deep) but I do not know how.Generally this is achieved by making queries to the database and passing the corresponding parameters. You need to learn a little SQL, DBI, Perl, HTML, CSS, JavaScript. Then You can use this knowledge to build your lists and trees.Use the Menu Plugin for CGI::Ex::Recipes. It does not make you learn all this :).Fę1183921436 eate dynamic content by utilizing the full power of the Apache web server to create stateful sessions, customized user authentication systems, smart proxies and much more. Yet, magically, your old CGI scripts will continue to work and work very fast indeed. With mod_perl you give up nothing and gain so much!

-- Lincoln Stein

Well, this is too enthusiastic for me, but we can take it as true :). CGI::Ex uses CGI as default query/request object or whatever is available.

    Apache->request
    #OR
    Apache2::RequestRec
    #OR
    Apache2::RequestUtil->request

The decision is made in a BEGIN block so the performance does not suffer.

1. Use a startup.pl

Say we have startup.pl in /opt/apache2/htdocs/recipes/perl/bin/startup.pl


package ourobscurepname;
BEGIN {
    $ENV{SITE_ROOT} = "/opt/apache2/htdocs/recipes/";
}
use utf8;
use strict;
use warnings;
use lib  $ENV{SITE_ROOT} . "/perl/lib";
use CGI::Ex::Conf;
use Template::Alloy;
use CGI::Ex::Recipes;
our $conf_obj = CGI::Ex::Conf->new({'paths'=>[$ENV{SITE_ROOT}],'directive'=>'MERGE'});
our $conf = $conf_obj->read($ENV{SITE_ROOT} .'/conf/Recipes.conf');
    $conf->{template_args}{INCLUDE_PATH} = $ENV{SITE_ROOT};

our $template_obj = Template::Alloy->new($conf->{template_args});
1;

2. Use an apache configuration snippet like this:

<VirtualHost>
#...
#run recipes as mod_perl script
<IfModule mod_perl.c>
PerlRequire /opt/apache2/htdocs/recipes/perl/bin/startup.pl
<Directory "/opt/apache2/htdocs/recipes">
    # mod_perl mode
    <Files "*.pl">
        SetHandler  perl-script
        PerlOptions +ParseHeaders
        PerlResponseHandler ModPerl::RegistryPrefork
        Options +ExecCGI
    </Files>
</Directory>
</IfModule>

</VirtualHost>

3. Use a index.pl

Say we have index.pl in /opt/apache2/htdocs/recipes/index.pl


package ourobscurepnamebakalalaheheyoidontknome;
CGI::Ex::Recipes->new({ 
    'base_dir_abs' => $ENV{SITE_ROOT},
    <span style="font-weight: bold;color: #008000;">'conf' => $conf,
    'conf_obj' => $conf_obj,
    'template_obj' =>$template_obj,
})->navigate();

F1185643468 LL1 /5a!PATH_INFO parsingHow this thing /edit/8/foo/bar/eeny/meeny/many/moe/ala/bala/nitza works? I wanna understand it and use it.This is the so called PATH_INFO part of the url. it Is exploited by many frameworks these days. it makes urls more human readable.
We use perl regular expretion to parse it and turn it into CGI parmeters which you get from TOTOFğ1185744407 88a #i!MiscellaneaHere we will list various day to day problems.  F$1185995905b?1/!A port is taken, by whom?I am trying to start my apache, but it returns the following errror:
berov@berovi:~> apache2 start
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:8081
no listening sockets available, shutting down
Unable to open logs

As it seems you are running this apache as non root user. This is generally ok. Ah, and you do not use a privileged port.
All seems ok.?!?! the right question is: What process taken port 8081? use the netstat program.
For example:
berovi:/home/berov # netstat -np | grep 8081
tcp        0      0 85.130.22.185:8081      205.188.176.90:5190     ESTABLISHED 5744/pidgin
Obviously pidgin is to blame. restart it and it will most probably choose another port :)
F 1185995698
  • use your standard keyboard to enter multi-byte characters, such as Simplified Chinese, Japanese and Korean etc.;
  • code folding;
  • multi-document editing simultaneously (split windows, multiple tabs)
  • sessions (save state of opened documents for later use), extremely useful for task oriented programming;
  • extendability;
  • customizable
  • scriptability so you can write your own macros and plugins
  • exhaustive range of plugins and tips ( http://www.vim.org/scripts/, http://www.vim.org/tips/ )
  • Premade customization and configurations readyand free for usage and hacking ( http://bcc.svn.sourceforge.net/viewvc/bcc/trunk/home_vim/),
    (svn checkout https://bcc.svn.sourceforge.net:443/svnroot/bcc/trunk/home_vim)
  • SVN/CVS/SVK integration
  • ...
  • And last but absolutely not least is the speed and practically unnoticeable memory consumption, especially compared to the Java based tools.

    Dig deep into this tree and find useful tips for beginners, intermediate and advanced users. Since this subtree of knowledge is still in its early stage, alternatively: