Perl Web Programming
It turns out it’s actually pretty easy to do web programming in Perl using PSGI once I waded through the documentation. The documentation makes things seem complex, but it’s actually pretty easy once you get down to the essentials of what you get as a request and what you need to return.
Maybe I’ll try to write up the tutorial I would have wanted to read.
Firefox Frustration
I’ve been trying out Firefox again since it seems to be the main browser by default in the Fedora repositories. However, I keep getting odd hangs while using it. I don’t know what’s inducing it – it seems to happen when I’m trying to drag tabs around.
So I guess, I’m just going have to learn how to add the repositories to get chromium, or see if I can download Google Chrome directly.
Static Web Site App in Perl
Here is the little app I wrote in Perl using PSGI (specification) to serve my website.
Currently I am running it using Starman but that may change if I get Apache up and configured for virtual hosts.
my $app = sub {
$doc_root = "./public";
my $env = shift;
$path = $env->{PATH_INFO};
$file = $path;
$error = 0;
$file =~ s/\.\.//g;
if ($file =~ m(^/$)) {
$file = "index.html";
}
if (-f "$doc_root/$file") {
open FILE, "$doc_root/$file";
} else {
$error = 1;
}
if (! $error) {
return [
'200',
[ 'Content-Type' => 'text/html' ],
\*FILE,
]
;
} else {
return [
'200',
[ 'Content-Type' => 'text/plain' ],
[ "Error - Path was; $file" ],
]
;
}
}
Perl Web App Update
So with the above code, I no longer have to map to the exact files that I was wanting to serve. I think I’ve got security set so that only the document root and below is accessible. Howerver, I"m kind of a newbie at this, so I might have left a huge gaping hole for hackers to enjoy.
PSGI / WSGI / Rack
Having spent the day playing around with PSGI, I became curious about the alternatives (and inspirations) in the Ruby and Python space. It’s pleasing to discover that their concepts are basically the same as the Perl implementation. That’s cool, because it means I could begin programming web apps according to those specifications without having to learn a whole new framework of thinking.
That means that if I want to play around with web programming in Ruby, I can reuse most of this learning that I’m doing so far in Perl. Which is nice, because while I haven’t been a big fan of Rails, I do like Ruby, and I like PSGI, so from a brief glance at Rake, it looks like I would like it as well.
If it came down to doing web stuff in Ruby, maybe I could work on the Rake layer of web stuff, and my friends could work in Rails.
Perl Table Of Contents Script
I reworked the table of contents script from the other day to be a little less ugly. Now instead of stringing together Perl commands on the command line, the shell script calls this simple Perl script:
#!/usr/bin/env perl
@output = [];
while (<>) {
if (/^###/) {
$date = $ARGV;
chomp;
s/### //;
push @output, qq(<a href="index.html#$date">$_</a><br>\n);
}
}
print foreach (reverse @output);
I think this is a lot cleaner than what I had previously:
perl -lne '
/^###/ && print "$ARGV:$_";
' * | perl -e '
@ls = <STDIN>; print foreach (reverse @ls);
' | perl -lpe '
s/### //
' | perl -lna -F: -e'
print qq(<a href="index.html#$F[0]">$F[1]</a><br>)
' > ../toc.middle
Anyway, so far I’m happy with the change.
Emacs Frustration
I’m getting annoyed with the way Emacs is mixing tabs and spaces in my writing and code. I’m going to have to go look up how to keep it from doing that again. That and fixing the broken backspace / Ctrl-H behavior are two things that I have to re-figure out each time I really start using Emacs in a particular environment.
In particular, this is a pain, because when I try to indent code so that Markdown will treat it specially, Emacs makes it all kinds of weird with mixed spaces and tabs, which then confuses Markdown as to where the lines should actually be.
So for example, the above (first) Perl snippet, the if statement should be indented (and it is visually in the Markdown source). But because it’s indented with tabs, where the surrounding lines are indented with spaces (Emacs doing, not mine), it doesn’t translate the indentation correctly to the code block.