-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path2006_01_27-after_perl_what_revised.html
1426 lines (1393 loc) · 70 KB
/
2006_01_27-after_perl_what_revised.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="en" prefix="og: http://ogp.me/ns# fb: https://www.facebook.com/2008/fbml">
<head>
<title>After Perl, what? (Revised) - S.Lott -- Software Architect</title>
<!-- Using the latest rendering mode for IE -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://slott56.github.io/2006_01_27-after_perl_what_revised.html">
<meta name="author" content="S.Lott" />
<meta name="keywords" content="LAMP,perl,php,java,python,ruby" />
<meta name="description" content="The Problem Perl's old. And Perl is without shame about adopting every syntax gimmick on earth. Consequently, Perl has accreted enough features that Perl programs are hard to read, making them impossible to maintain. More thoughts on this opacity problem in Gadgetopia http://www.gadgetopia.com/post/1919 and Freshmeat …" />
<meta property="og:site_name" content="S.Lott -- Software Architect" />
<meta property="og:type" content="article"/>
<meta property="og:title" content="After Perl, what? (Revised)"/>
<meta property="og:url" content="https://slott56.github.io/2006_01_27-after_perl_what_revised.html"/>
<meta property="og:description" content="The Problem Perl's old. And Perl is without shame about adopting every syntax gimmick on earth. Consequently, Perl has accreted enough features that Perl programs are hard to read, making them impossible to maintain. More thoughts on this opacity problem in Gadgetopia http://www.gadgetopia.com/post/1919 and Freshmeat …"/>
<meta property="article:published_time" content="2006-01-27" />
<meta property="article:section" content="Management" />
<meta property="article:tag" content="LAMP" />
<meta property="article:tag" content="perl" />
<meta property="article:tag" content="php" />
<meta property="article:tag" content="java" />
<meta property="article:tag" content="python" />
<meta property="article:tag" content="ruby" />
<meta property="article:author" content="S.Lott" />
<!-- Bootstrap -->
<link rel="stylesheet" href="https://slott56.github.io/theme/css/bootstrap.min.css" type="text/css"/>
<link href="https://slott56.github.io/theme/css/font-awesome.min.css" rel="stylesheet">
<link href="https://slott56.github.io/theme/css/pygments/native.css" rel="stylesheet">
<link href="https://slott56.github.io/theme/css/html4css1.css" rel="stylesheet">
<link rel="stylesheet" href="https://slott56.github.io/theme/css/style.css" type="text/css"/>
<link href="https://slott56.github.io/feeds/all.atom.xml" type="application/atom+xml" rel="alternate"
title="S.Lott -- Software Architect ATOM Feed"/>
<link href="https://slott56.github.io/feeds/all.rss.xml" type="application/rss+xml" rel="alternate"
title="S.Lott -- Software Architect RSS Feed"/>
<link href="https://slott56.github.io/feeds/management.atom.xml" type="application/atom+xml" rel="alternate"
title="S.Lott -- Software Architect Management ATOM Feed"/>
</head>
<body>
<div class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a href="https://slott56.github.io/" class="navbar-brand">
S.Lott -- Software Architect </a>
</div>
<div class="collapse navbar-collapse navbar-ex1-collapse">
<ul class="nav navbar-nav">
<li><a href="https://slott56.github.io/pages/other-articles.html">
Other Articles
</a></li>
<li><a href="https://slott56.github.io/pages/publications.html">
Publications
</a></li>
<li><a href="https://slott56.github.io/pages/slott-biography.html">
S.Lott Biography
</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
</ul>
</div>
<!-- /.navbar-collapse -->
</div>
</div> <!-- /.navbar -->
<!-- Banner -->
<!-- End Banner -->
<!-- Content Container -->
<div class="container">
<div class="row">
<div class="col-sm-9">
<section id="content">
<article>
<header class="page-header">
<h1>
<a href="https://slott56.github.io/2006_01_27-after_perl_what_revised.html"
rel="bookmark"
title="Permalink to After Perl, what? (Revised)">
After Perl, what? (Revised)
</a>
</h1>
</header>
<div class="entry-content">
<div class="panel">
<div class="panel-body">
<footer class="post-info">
<span class="label label-default">Date</span>
<span class="published">
<i class="fa fa-calendar"></i><time datetime="2006-01-27T00:58:00-05:00"> Fri 27 January 2006</time>
</span>
<span class="label label-default">Tags</span>
<a href="https://slott56.github.io/tag/lamp.html">LAMP</a>
/
<a href="https://slott56.github.io/tag/perl.html">perl</a>
/
<a href="https://slott56.github.io/tag/php.html">php</a>
/
<a href="https://slott56.github.io/tag/java.html">java</a>
/
<a href="https://slott56.github.io/tag/python.html">python</a>
/
<a href="https://slott56.github.io/tag/ruby.html">ruby</a>
</footer><!-- /.post-info --> </div>
</div>
<div class="section" id="the-problem">
<h2>The Problem</h2>
<p>Perl's old. And Perl is
without shame about adopting every syntax gimmick on earth. Consequently, Perl
has accreted enough features that Perl programs are hard to read, making them
impossible to maintain. More thoughts on this opacity problem in Gadgetopia
<a class="reference external" href="http://www.gadgetopia.com/post/1919">http://www.gadgetopia.com/post/1919</a> and Freshmeat <a class="reference external" href="http://freshmeat.net/articles/view/1339/">http://freshmeat.net/articles/view/1339/</a>.</p>
<p>Further, Perl 6 is caught up in political wrangling of the first magnitude. There's the
Larry Wall camp (Apocalypses), Curl, Lua, Monkey, Ponie and Parrot. And there's
further opinions like Rindolf <a class="reference external" href="http://vipe.technion.ac.il/~shlomif/rindolf/%22%20target=%22NewWindow">http://vipe.technion.ac.il/~shlomif/rindolf/%22%20target=%22NewWindow</a>.</p>
<p>Perhaps most limiting, Perl isn't a hotbed of application frameworks [<a class="reference external" href="http://www.haloscan.com/comments/slott/E20060126195803/#66236">Thanks</a> ].
Products include <a class="reference external" href="http://catalyst.perl.org/">Catalyst</a> and <a class="reference external" href="http://maypole.perl.org/">Maypole</a> .
Perl suffers from being one of the first scripting extensions to Apache,
consequently innovation was focused elsewhere. Java, PHP, Python and Ruby all
have the advantage of many sophisticated frameworks that minimize the
programming and consequently, minimize the obscurity of the programming
language.</p>
</div>
<div class="section" id="some-choices">
<h2>Some Choices</h2>
<p>If Perl is too opaque for
ongoing use, and the future of Perl is cloudy, we should probably think about
moving on to another language. So step one is the following
advice:</p>
</div>
<div class="section" id="ditch-perl">
<h2>Ditch Perl</h2>
<p>When we ditch Perl, we'll need to replace it
with some language. Which one? Further, we'll need a plan for retiring working
applications in Perl and upgrading them to something newer and less
opaque.</p>
<p>O'Reilly's LAMP <a class="reference external" href="http://www.onlamp.com/">http://www.onlamp.com/</a> architecture
(Linux-Apache-MySQL-P.*) lifts up three languages: Perl, PHP and Python.
Recently, Ruby has matured to the point where it deserves some consideration.
Finally, there's always Java.</p>
<p>Here's a chart <a class="reference external" href="http://www.jvoegele.com/software/langcomp.html">http://www.jvoegele.com/software/langcomp.html</a> that provides some head-to-head comparison
among these languages. One issue, of course, is that languages express ideas,
and the world of software is big: too big for a single language. There is no
one-language "right" answer. This isn't a trick question. We're going to look
at tradeoffs and priorities: always messy
work.</p>
</div>
<div class="section" id="the-one-true-language">
<h2>The One True Language</h2>
<p>Let's dispose of the
one-language-to-rule-them-all-and-in-the-darkness-bind-them
myth:</p>
<ul class="simple">
<li>We have command languages like the shell
optimized for a few tasks like running programs</li>
<li>We have markup languages (HTML, XML)</li>
<li>We have programming languages for
complex, high-performance processing (C)</li>
<li>We have data query languages (SQL)</li>
<li>We have specialized template languages
for assembling HTML results from data queries and lightweight computations (JSP,
PHP)</li>
<li>We have other programming paradigms
embodied in Haskell, Groovy or
Prolog</li>
</ul>
<p>We have the good-old
general-purpose language (Python, Perl, PHP, Java, Ruby) that can do almost
anything. Doing almost anything translates to doing anything badly and doing
nothing well. For any of the above specific purposes, general-purpose languages
are just too wordy.</p>
</div>
<div class="section" id="the-domain">
<h2>The Domain</h2>
<p>If one language won't solve all of
our problems, we'll need to pick a problem, then pick a suitable language.
Let's focus, then, on web application development. Further, let's look at
someone with a legacy of applications developed primarily in Perl. We need to
look at the alternatives to Perl for web application
development.</p>
<p>Compounding the problem is
the rest of the architecture stack. We can't easily focus narrowly on using
just Apache as the web server. While "bare" Apache had some appeal in the murky
past, the world has matured. CGI and mod_Perl are no longer new; a great deal
of useful infrastructure has arisen, which can reduce the volume of programming
necessary to put dynamic, interactive content onto the
web.</p>
<p>When we look at languages, we're
really looking at a programming environment which includes a web application
framework and a programming language. Our programming language(s), then,
extend, customize and tailor a generic web application for our specific customer
requirements. This will complicate our analysis because we aren't merely
comparing languages, we're really comparing framework +
language.</p>
</div>
<div class="section" id="some-quality-factors">
<h2>Some Quality Factors</h2>
<p>We can't easily evaluate
all of the tools available. However, we can provide some essential criteria
that can be used to narrow the field
rapidly.</p>
<ol class="arabic simple">
<li>Model-View-Controller separation. The data model, the HTML view, and the controls must be
separated.</li>
<li>Object-Relational Mapping with
Persistence. We should be able to bury our SQL in mapping rules. Ideally, it's
generated seamlessly and silently.</li>
<li>RDBMS-agnostic. Any of the MySQL, Postgres, SQLite products (or any of the expensive, commercial products) should be
supported.</li>
<li>Web best-practices: session management, POST-redirect-GET, validation and quoting to prevent SQL/Shell
command injections, etc.</li>
</ol>
<p>Additionally, the number of skilled people is important. Here is the TIOBE programming
community index <a class="reference external" href="http://www.tiobe.com/tpci.htm">http://www.tiobe.com/tpci.htm</a> for the languages we're looking at. We'll
discard C and C++ as being unsuitable for web applications: Python does the
same processing as C (or C++) without the endless (and error-prone) drudgery of
memory management. While popular in general, they aren't applicable to web
applications. Additionally, we'll discard VB and C# because they are
proprietary products and have a cost which exceeds their real value.</p>
<ol class="arabic simple">
<li><strong>Java</strong></li>
<li>C</li>
<li>C++</li>
<li><strong>PHP</strong></li>
<li>VB</li>
<li><strong>Perl</strong></li>
<li>C#</li>
<li><strong>Python</strong></li>
</ol>
<p>(off the list): <strong>Ruby</strong></p>
</div>
<div class="section" id="java">
<h2>Java</h2>
<p>Java is totally dominated by J2EE (Tomcat, JBoss, etc.) as the application framework.
Apache Struts <a class="reference external" href="http://struts.apache.org/">http://struts.apache.org/</a> or Spring <a class="reference external" href="http://www.springframework.org/">http://www.springframework.org/</a> put
an MVC framework on top of J2EE. Toplink, JDO and Hibernate are choices for the
Object-Relational Mapping <a class="reference external" href="http://c2.com/cgi-bin/wiki?ObjectRelationalMapping">http://c2.com/cgi-bin/wiki?ObjectRelationalMapping</a> and Persistence. Plus, there are
pure-persistence packages <a class="reference external" href="http://java-source.net/open-source/persistence">http://java-source.net/open-source/persistence</a>.</p>
<p>Struts can be complex (at first)
because it is a very sophisticated environment which finely partitions the work
among the Action classes, the struts-config definitions, validations, and EJB's
(or POJO's). Struts, however, has the advantage of separating the model, the
view and the control into EJB's, JSP's and Action classes. The EJB's write
themselves, since they are the enduring business facts. The JSP's write
themselves because they are the presentations, done with JSP's HTML template
language. The struts configuration handles the subtlety of transaction flow,
and the most obvious validation rules. What's left? The "business rules" --
validations that can't easily be written as simple XML-encoded rules, and the
actual effect of the web transaction (ordering, canceling, inquiring,
etc.)</p>
<p>Sadly, however, the JSP world was
originally a complete stand-alone application development environment, so it has
a bewildering level of feature-itis. Further, the XML-based JSP's have a number
of extension tag libraries that are a mixed blessing. Yes, forms are very easy
to create. No, you'll never understand all of those JSP tag
libraries.</p>
<p>Java is, however, pure
OO-programming: everything is very clean and precise, and you have the full
power of inheritance and the sophisticated design patterns. Some of the
mystique of EJB's can be eliminated in favor of Plain-Ol' Java Objects (POJO's).
Generally, the complexities of EJB's aren't all that pleasant to deal with, so
I'm a POJO
programmer.</p>
</div>
<div class="section" id="php">
<h2>PHP</h2>
<p>PHP has over 40 individual frameworks <a class="reference external" href="http://www.phpwact.org/php/mvc_frameworks">http://www.phpwact.org/php/mvc_frameworks</a>, <a class="reference external" href="http://dmoz.org/Computers/Programming/Languages/PHP/Scripts/Frameworks/">http://dmoz.org/Computers/Programming/Languages/PHP/Scripts/Frameworks/</a>. How to penetrate the clutter? There is
no quick answer. Just looking at PHP content management <a class="reference external" href="http://dmoz.org/Computers/Programming/Languages/PHP/Scripts/Content_Management/">http://dmoz.org/Computers/Programming/Languages/PHP/Scripts/Content_Management/</a> turns up a huge list. Some sorting is
available at CMS Matrix <a class="reference external" href="http://www.cmsmatrix.org/">http://www.cmsmatrix.org/</a>. However, LinuxWorld <a class="reference external" href="http://linux.sys-con.com/read/86022.htm">http://linux.sys-con.com/read/86022.htm</a> has selected two that merit serious
consideration: <strong>Mambo</strong> <a class="reference external" href="http://www.mamboserver.com/">http://www.mamboserver.com/</a>
and <strong>phpWebsite</strong> <a class="reference external" href="http://phpwebsite.appstate.edu/">http://phpwebsite.appstate.edu/</a>.</p>
<p>When I first looked at PHP (five years ago, in 2000), the language looked like a
clutter of features, and a seemingly-endless library of functions. While it's
nice to have all those functions, I would have appreciated a few packages and
modules to break them into more meaningful chunks. More important to me would
have been a focus on object-oriented programming as the way to build web
applications. However, PHP was originally an HTML template language on
steroids, and seems to remain focused on that
niche.</p>
<p>The frameworkes make PHP more
palatable; separating model, view and control is absolutely essential to
success. Classical PHP (without a framework) is little more than Java JSP, and
has the same basic complexity.</p>
<p>While PHP has class definitions, Mambo doesn't emphasize OO-style examples. On the
other hand, phpWebsite, does seem to land on the OO feature set. The list of
object-oriented MVC frameworks <a class="reference external" href="http://www.google.com/search?q=php+object-oriented+framework">http://www.google.com/search?q=php+object-oriented+framework</a> shows how important it is to promote reuse
and simplification using
objects.</p>
</div>
<div class="section" id="python">
<h2>Python</h2>
<p>Python
has over 30 frameworks <a class="reference external" href="http://wiki.python.org/moin/WebProgramming">http://wiki.python.org/moin/WebProgramming</a>. The question is, which are production
ready and reasonably complete? The answer is to look at frameworks which build
complete content-management solutions. These can then be tailored for on-line
shopping or any other purpose. This is a shorter list <a class="reference external" href="http://wiki.python.org/moin/ContentManagementSystems">http://wiki.python.org/moin/ContentManagementSystems</a> including the following:</p>
<ul class="simple">
<li><strong>Zope</strong> <a class="reference external" href="http://www.zope.org/">http://www.zope.org/</a>,</li>
<li><strong>Nevow</strong> <a class="reference external" href="http://divmod.org/projects/nevow">http://divmod.org/projects/nevow</a>,</li>
<li><strong>Webware</strong> <a class="reference external" href="http://www.webwareforpython.org/">http://www.webwareforpython.org/</a>,</li>
<li><strong>Django</strong> <a class="reference external" href="http://www.djangoproject.com/">http://www.djangoproject.com/</a>.</li>
</ul>
<p>With Python, the object-orientation isn't mandatory, but is almost universal, unlike PHP or Perl.</p>
<p>Zope takes a very interesting approach to creating content as an assembly of elements. The
interaction between the Zope DB, the various page templating tools, and the
Python programming language works out very nicely. Zope is not a rehashing of
other technologies, but a clean and unique approach to web presentation. In
can, consequently, be very uncomfortable to have Zope do so much and you (the
programmer) do so little.</p>
<p>Django is a little more conventional. It has an explicit Model, View, Controller separation
and leans on Struts (to an extent). It has an easy-to-live-with templating
language, full Python programming, and a sophisticated set of built-in
capabilities. It has a model definition capability that takes some getting used
to, but once you work out the details, the default object-relational mapping can
be made to work nicely.</p>
<p>Nevow's approach to mixing Python programming and template insertion makes use of some
slightly extended HTML syntax. This has the pleasant consequence of allowing
someone to design pages in largely "pure" HTML, then slap a few special purpose
tag attributes into things like <tt class="docutils literal"><span></tt> tags, to provide a linkage with
Python programs. Python has the functions, the stan markup extensions provide
the presentation.</p>
<p>WebWare has a Servlet engine (like J2EE web applications), it also has Kid and PSP's, which are
PHP-like (or JSP-like) template pages with Python code inserted. Consequently,
you can use the WebKit servlets and KidKit template pages to build a very robust
Struts-like
application.</p>
</div>
<div class="section" id="ruby">
<h2>Ruby</h2>
<p>Ruby, as the new language, still has
much to prove. It enjoys considerable popularity because it has numerous
features and the Rails web application framework is very powerful. Ruby (like
Python) embodies a DRY - Don't Repeat Yourself - philosophy. There aren't a lot
of external configuration files and additional descriptive material. The Ruby
language (like Python) includes enough introspection that the code can examine
itself to do the various mappings from HTML Form to Object to Relational row.</p>
<p>However, Ruby has one serious
flaw: it is largely opaque. Part of that is the novelty of the language. But
part of it is the very "spare" look, without a lot of punctuation or other
visual cues. Ruby may have the same problem that Perl has. Perl and Ruby may
both be examples of write once programming languages. They may be
unmaintainable.</p>
</div>
<div class="section" id="action-plan">
<h2>Action Plan</h2>
<p>Look closely at PHP and Python for a Perl replacement. Each framework has a "style" or "flavor" that is
difficult to summarize. However, once experienced, it is either compelling or
confusing. There's a lot of room for researching and there's a fine line
between researching and hang-wringing. Here's the
plan.</p>
<ol class="arabic simple">
<li>Download PHP. Take a few
weeks and write some small demo programs in PHP to see how it works, and how
well it fits your mind-set.</li>
</ol>
<p>2. Download Python. Take a few weeks and write some small demo programs in
Python.</p>
<ol class="arabic simple" start="3">
<li>Make the first (and toughest) decision: PHP or Python. PHP will probably be more familiar to a
procedural Perl programming. Python's object-orientation may be hard to fathom.
In the long run, OO allows you to create far more sophisticated programs. But
it can be a difficult programming style to
learn.</li>
<li>Once you've chosen a
language, you can then choose a framework. Download an appropriate combination
of Mambo, PHPWebSite, Django, Nevow, WebWare, and Zope.</li>
<li>Do the tutorials for the products
you've downloaded. You may, at this time, rethink your language choice, and
decide to try the other language and the other frameworks. However, stick to
the tutorials so that you can minimize your investment in technologies that you
won't make serious use of. In some cases, the documentation of the tutorial may
be enough to provide you a hint that the approach doesn't resonate well with
your mental model of web
applications.</li>
<li>Convert something small, safe and reliable to the chosen framework. You will make mistakes. It
won't be easy.</li>
<li>Convert something
else small, safe and reliable. Rework your mistakes in the previous
conversion.</li>
</ol>
</div>
<div class="section" id="conclusion">
<h2>Conclusion</h2>
<p>Perl's opacity makes Perl it's own problem. It's great to write in, but awful to
maintain. Replacing Perl is hard -- you can stick with procedural programming
and choose PHP, or you can make a decision to exploit the power of objects and
choose Python. You can leverage large, expensive, commercial products and
choose Java, also.</p>
<p>More important is the choice of web application frameworks. The idea of a framework is to
structure the application and leverage existing code from other projects as much
as possible. This is the big win in replacing Perl: exploiting
well-thought-out, next-generation frameworks for web applications.</p>
</div>
</div>
<!-- /.entry-content -->
</article>
</section>
</div>
<div class="col-sm-3" id="sidebar">
<aside>
<!-- Sidebar -->
<section class="well well-sm">
<ul class="list-group list-group-flush">
<!-- Sidebar/Social -->
<li class="list-group-item">
<h4><i class="fa fa-home fa-lg"></i><span class="icon-label">Social</span></h4>
<ul class="list-group" id="social">
<li class="list-group-item"><a href="https://fosstodon.org/@slott56"><i class="fa fa-mastodon-square fa-lg"></i> Mastodon</a></li>
<li class="list-group-item"><a href="https://github.com/slott56"><i class="fa fa-github-square fa-lg"></i> Github</a></li>
<li class="list-group-item"><a href="https://stackoverflow.com/users/10661/s-lott"><i class="fa fa-stackoverflow-square fa-lg"></i> StackOverflow</a></li>
<li class="list-group-item"><a href="https://www.linkedin.com/in/steven-lott-029835/"><i class="fa fa-linkedin-square fa-lg"></i> LinkedIn</a></li>
<li class="list-group-item"><a href="https://www.oreilly.com/pub/au/6277"><i class="fa fa-o'reilly-square fa-lg"></i> O'Reilly</a></li>
<li class="list-group-item"><a href="https://www.amazon.com/stores/Steven-Lott/author/B00HNRSLEK"><i class="fa fa-amazon-square fa-lg"></i> Amazon</a></li>
</ul>
</li>
<!-- End Sidebar/Social -->
<!-- Sidebar/Categories -->
<li class="list-group-item">
<h4><i class="fa fa-home fa-lg"></i><span class="icon-label">Categories</span></h4>
<ul class="list-group" id="categories">
<li class="list-group-item">
<a href="https://slott56.github.io/category/architecture-design.html"><i class="fa fa-folder-open fa-lg"></i>Architecture & Design</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/category/books.html"><i class="fa fa-folder-open fa-lg"></i>Books</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/category/foss.html"><i class="fa fa-folder-open fa-lg"></i>FOSS</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/category/management.html"><i class="fa fa-folder-open fa-lg"></i>Management</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/category/news.html"><i class="fa fa-folder-open fa-lg"></i>News</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/category/python.html"><i class="fa fa-folder-open fa-lg"></i>Python</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/category/technologies.html"><i class="fa fa-folder-open fa-lg"></i>Technologies</a>
</li>
</ul>
</li>
<!-- End Sidebar/Categories -->
<!-- Sidebar/Links -->
<li class="list-group-item">
<h4><i class="fa fa-external-link-square fa-lg"></i><span class="icon-label">Links</span></h4>
<ul class="list-group" id="links">
<li class="list-group-item">
<a href="https://getpelican.com/" target="_blank">Pelican</a>
</li>
<li class="list-group-item">
<a href="https://www.python.org/" target="_blank">Python.org</a>
</li>
<li class="list-group-item">
<a href="https://palletsprojects.com/p/jinja/" target="_blank">Jinja2</a>
</li>
</ul>
</li>
<!-- End Sidebar/Links -->
<!-- Sidebar/Archive -->
<li class="list-group-item">
<h4><i class="fa fa-home fa-lg"></i><span class="icon-label">Archive</span></h4>
<ul class="list-group" id="archive">
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2025/Jan/index.html"><i class="fa fa-calendar fa-lg"></i>January 2025 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2024/Dec/index.html"><i class="fa fa-calendar fa-lg"></i>December 2024 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2024/Oct/index.html"><i class="fa fa-calendar fa-lg"></i>October 2024 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2024/Sep/index.html"><i class="fa fa-calendar fa-lg"></i>September 2024 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2024/Aug/index.html"><i class="fa fa-calendar fa-lg"></i>August 2024 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2024/Jul/index.html"><i class="fa fa-calendar fa-lg"></i>July 2024 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2024/Jun/index.html"><i class="fa fa-calendar fa-lg"></i>June 2024 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2024/May/index.html"><i class="fa fa-calendar fa-lg"></i>May 2024 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2024/Mar/index.html"><i class="fa fa-calendar fa-lg"></i>March 2024 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2024/Feb/index.html"><i class="fa fa-calendar fa-lg"></i>February 2024 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2023/Dec/index.html"><i class="fa fa-calendar fa-lg"></i>December 2023 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2023/Nov/index.html"><i class="fa fa-calendar fa-lg"></i>November 2023 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2023/Oct/index.html"><i class="fa fa-calendar fa-lg"></i>October 2023 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2023/Sep/index.html"><i class="fa fa-calendar fa-lg"></i>September 2023 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2023/Aug/index.html"><i class="fa fa-calendar fa-lg"></i>August 2023 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2023/Jul/index.html"><i class="fa fa-calendar fa-lg"></i>July 2023 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2023/Jun/index.html"><i class="fa fa-calendar fa-lg"></i>June 2023 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2023/May/index.html"><i class="fa fa-calendar fa-lg"></i>May 2023 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2023/Apr/index.html"><i class="fa fa-calendar fa-lg"></i>April 2023 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2023/Mar/index.html"><i class="fa fa-calendar fa-lg"></i>March 2023 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2023/Feb/index.html"><i class="fa fa-calendar fa-lg"></i>February 2023 (5)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2023/Jan/index.html"><i class="fa fa-calendar fa-lg"></i>January 2023 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2022/Dec/index.html"><i class="fa fa-calendar fa-lg"></i>December 2022 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2022/Nov/index.html"><i class="fa fa-calendar fa-lg"></i>November 2022 (8)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2022/Oct/index.html"><i class="fa fa-calendar fa-lg"></i>October 2022 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2022/Sep/index.html"><i class="fa fa-calendar fa-lg"></i>September 2022 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2022/Aug/index.html"><i class="fa fa-calendar fa-lg"></i>August 2022 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2022/Jul/index.html"><i class="fa fa-calendar fa-lg"></i>July 2022 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2022/Jun/index.html"><i class="fa fa-calendar fa-lg"></i>June 2022 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2022/May/index.html"><i class="fa fa-calendar fa-lg"></i>May 2022 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2022/Apr/index.html"><i class="fa fa-calendar fa-lg"></i>April 2022 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2022/Mar/index.html"><i class="fa fa-calendar fa-lg"></i>March 2022 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2022/Feb/index.html"><i class="fa fa-calendar fa-lg"></i>February 2022 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2022/Jan/index.html"><i class="fa fa-calendar fa-lg"></i>January 2022 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2021/Dec/index.html"><i class="fa fa-calendar fa-lg"></i>December 2021 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2021/Nov/index.html"><i class="fa fa-calendar fa-lg"></i>November 2021 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2021/Oct/index.html"><i class="fa fa-calendar fa-lg"></i>October 2021 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2021/Sep/index.html"><i class="fa fa-calendar fa-lg"></i>September 2021 (5)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2021/Aug/index.html"><i class="fa fa-calendar fa-lg"></i>August 2021 (5)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2021/Jul/index.html"><i class="fa fa-calendar fa-lg"></i>July 2021 (5)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2021/Jun/index.html"><i class="fa fa-calendar fa-lg"></i>June 2021 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2021/May/index.html"><i class="fa fa-calendar fa-lg"></i>May 2021 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2021/Apr/index.html"><i class="fa fa-calendar fa-lg"></i>April 2021 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2021/Mar/index.html"><i class="fa fa-calendar fa-lg"></i>March 2021 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2021/Feb/index.html"><i class="fa fa-calendar fa-lg"></i>February 2021 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2021/Jan/index.html"><i class="fa fa-calendar fa-lg"></i>January 2021 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2020/Dec/index.html"><i class="fa fa-calendar fa-lg"></i>December 2020 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2020/Nov/index.html"><i class="fa fa-calendar fa-lg"></i>November 2020 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2020/Oct/index.html"><i class="fa fa-calendar fa-lg"></i>October 2020 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2020/Sep/index.html"><i class="fa fa-calendar fa-lg"></i>September 2020 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2020/Aug/index.html"><i class="fa fa-calendar fa-lg"></i>August 2020 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2020/Jul/index.html"><i class="fa fa-calendar fa-lg"></i>July 2020 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2020/Jun/index.html"><i class="fa fa-calendar fa-lg"></i>June 2020 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2020/May/index.html"><i class="fa fa-calendar fa-lg"></i>May 2020 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2020/Apr/index.html"><i class="fa fa-calendar fa-lg"></i>April 2020 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2020/Mar/index.html"><i class="fa fa-calendar fa-lg"></i>March 2020 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2020/Feb/index.html"><i class="fa fa-calendar fa-lg"></i>February 2020 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2020/Jan/index.html"><i class="fa fa-calendar fa-lg"></i>January 2020 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2019/Dec/index.html"><i class="fa fa-calendar fa-lg"></i>December 2019 (5)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2019/Nov/index.html"><i class="fa fa-calendar fa-lg"></i>November 2019 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2019/Oct/index.html"><i class="fa fa-calendar fa-lg"></i>October 2019 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2019/Sep/index.html"><i class="fa fa-calendar fa-lg"></i>September 2019 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2019/Aug/index.html"><i class="fa fa-calendar fa-lg"></i>August 2019 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2019/Jul/index.html"><i class="fa fa-calendar fa-lg"></i>July 2019 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2019/Jun/index.html"><i class="fa fa-calendar fa-lg"></i>June 2019 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2019/May/index.html"><i class="fa fa-calendar fa-lg"></i>May 2019 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2019/Apr/index.html"><i class="fa fa-calendar fa-lg"></i>April 2019 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2019/Mar/index.html"><i class="fa fa-calendar fa-lg"></i>March 2019 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2019/Feb/index.html"><i class="fa fa-calendar fa-lg"></i>February 2019 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2019/Jan/index.html"><i class="fa fa-calendar fa-lg"></i>January 2019 (7)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2018/Nov/index.html"><i class="fa fa-calendar fa-lg"></i>November 2018 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2018/Oct/index.html"><i class="fa fa-calendar fa-lg"></i>October 2018 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2018/Sep/index.html"><i class="fa fa-calendar fa-lg"></i>September 2018 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2018/Aug/index.html"><i class="fa fa-calendar fa-lg"></i>August 2018 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2018/Jul/index.html"><i class="fa fa-calendar fa-lg"></i>July 2018 (5)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2018/May/index.html"><i class="fa fa-calendar fa-lg"></i>May 2018 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2018/Apr/index.html"><i class="fa fa-calendar fa-lg"></i>April 2018 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2018/Mar/index.html"><i class="fa fa-calendar fa-lg"></i>March 2018 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2018/Feb/index.html"><i class="fa fa-calendar fa-lg"></i>February 2018 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2018/Jan/index.html"><i class="fa fa-calendar fa-lg"></i>January 2018 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2017/Dec/index.html"><i class="fa fa-calendar fa-lg"></i>December 2017 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2017/Nov/index.html"><i class="fa fa-calendar fa-lg"></i>November 2017 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2017/Oct/index.html"><i class="fa fa-calendar fa-lg"></i>October 2017 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2017/Sep/index.html"><i class="fa fa-calendar fa-lg"></i>September 2017 (5)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2017/Aug/index.html"><i class="fa fa-calendar fa-lg"></i>August 2017 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2017/Jul/index.html"><i class="fa fa-calendar fa-lg"></i>July 2017 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2017/Jun/index.html"><i class="fa fa-calendar fa-lg"></i>June 2017 (6)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2017/May/index.html"><i class="fa fa-calendar fa-lg"></i>May 2017 (6)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2017/Apr/index.html"><i class="fa fa-calendar fa-lg"></i>April 2017 (6)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2017/Mar/index.html"><i class="fa fa-calendar fa-lg"></i>March 2017 (5)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2017/Feb/index.html"><i class="fa fa-calendar fa-lg"></i>February 2017 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2017/Jan/index.html"><i class="fa fa-calendar fa-lg"></i>January 2017 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2016/Dec/index.html"><i class="fa fa-calendar fa-lg"></i>December 2016 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2016/Nov/index.html"><i class="fa fa-calendar fa-lg"></i>November 2016 (5)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2016/Oct/index.html"><i class="fa fa-calendar fa-lg"></i>October 2016 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2016/Sep/index.html"><i class="fa fa-calendar fa-lg"></i>September 2016 (5)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2016/Aug/index.html"><i class="fa fa-calendar fa-lg"></i>August 2016 (5)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2016/Jul/index.html"><i class="fa fa-calendar fa-lg"></i>July 2016 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2016/Jun/index.html"><i class="fa fa-calendar fa-lg"></i>June 2016 (5)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2016/May/index.html"><i class="fa fa-calendar fa-lg"></i>May 2016 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2016/Apr/index.html"><i class="fa fa-calendar fa-lg"></i>April 2016 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2016/Mar/index.html"><i class="fa fa-calendar fa-lg"></i>March 2016 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2016/Feb/index.html"><i class="fa fa-calendar fa-lg"></i>February 2016 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2016/Jan/index.html"><i class="fa fa-calendar fa-lg"></i>January 2016 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2015/Dec/index.html"><i class="fa fa-calendar fa-lg"></i>December 2015 (5)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2015/Nov/index.html"><i class="fa fa-calendar fa-lg"></i>November 2015 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2015/Oct/index.html"><i class="fa fa-calendar fa-lg"></i>October 2015 (6)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2015/Sep/index.html"><i class="fa fa-calendar fa-lg"></i>September 2015 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2015/Aug/index.html"><i class="fa fa-calendar fa-lg"></i>August 2015 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2015/Jul/index.html"><i class="fa fa-calendar fa-lg"></i>July 2015 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2015/Jun/index.html"><i class="fa fa-calendar fa-lg"></i>June 2015 (5)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2015/May/index.html"><i class="fa fa-calendar fa-lg"></i>May 2015 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2015/Apr/index.html"><i class="fa fa-calendar fa-lg"></i>April 2015 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2015/Mar/index.html"><i class="fa fa-calendar fa-lg"></i>March 2015 (5)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2015/Feb/index.html"><i class="fa fa-calendar fa-lg"></i>February 2015 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2015/Jan/index.html"><i class="fa fa-calendar fa-lg"></i>January 2015 (5)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2014/Dec/index.html"><i class="fa fa-calendar fa-lg"></i>December 2014 (7)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2014/Nov/index.html"><i class="fa fa-calendar fa-lg"></i>November 2014 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2014/Oct/index.html"><i class="fa fa-calendar fa-lg"></i>October 2014 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2014/Sep/index.html"><i class="fa fa-calendar fa-lg"></i>September 2014 (2)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2014/Aug/index.html"><i class="fa fa-calendar fa-lg"></i>August 2014 (1)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2014/Jul/index.html"><i class="fa fa-calendar fa-lg"></i>July 2014 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2014/Jun/index.html"><i class="fa fa-calendar fa-lg"></i>June 2014 (5)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2014/May/index.html"><i class="fa fa-calendar fa-lg"></i>May 2014 (4)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2014/Apr/index.html"><i class="fa fa-calendar fa-lg"></i>April 2014 (3)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2014/Mar/index.html"><i class="fa fa-calendar fa-lg"></i>March 2014 (5)
</a>
</li>
<li class="list-group-item">
<a href="https://slott56.github.io/posts/2014/Feb/index.html"><i class="fa fa-calendar fa-lg"></i>February 2014 (5)