fletcherpenney.netMultiMarkdown CMShttp://fletcherpenney.net/2010-03-12T05:09:49ZXML::Atom::SimpleFeedMMD-CMS has support for “make”2010-02-26T19:55:36-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">MMD-CMS has support for “make”</h1><div class="date">02/26/2010 19:55:36</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>I’ve been quite happy with using MultiMarkdown-CMS to run my web site. The
main frustration has been when I make a change that requires rebuilding the
entire site. I had to use a bunch of commands to run MultiMarkdown over
various directories and subdirectories in order to rebuild the entire site,
and then remember to rebuild the vector map index so that the similar pages
feature works.</p>
<p>Inspired by the <code>Makefile</code> support in Dr. Drang’s <a href="http://www.leancrew.com/all-this/2008/06/my-no-server-personal-wiki—part-3/">personal wiki</a> project, I
decided it was time to learn a little make myself…. After a little fiddling
around, I created a Makefile that allows me to rebuild my entire site with one
simple command:</p>
<pre><code>make</code></pre>
<p>If there are any text files that do not have a corresponding html file, <code>make</code>
runs the proper mmd2web.pl command to generate the missing page(s). Then it
runs the <code>map_my_site</code> command to rebuild the vector map. The nice thing is
that if there are no new pages, the vector map is left alone.</p>
<p>This means that I can run the make command without fear of unnecessarily
rebuilding anything. If any files have changed, they get rebuilt. If anything
is missing, it gets rebuilt. Otherwise, leave it alone.</p>
<p>A bonus feature is that I can remove all of the html files with a simple:</p>
<pre><code>make clean</code></pre>
<p>Not sure why I would want to do this, but it’s neat that I can.</p>
<p>To use the make command, you will need to change the path to <code>mmd2web.pl</code> in
<code>Makefile</code> to match your system. But that should be pretty straightforward.</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2010/02/mmd-cms_has_support_for_make.htmlNew OPML Features added to MultiMarkdown2010-02-17T10:22:44-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">New OPML Features added to MultiMarkdown</h1><div class="date">02/17/2010 10:22:44</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>For anyone using MultiMarkdown with OmniOutliner or other OPML applications, I
have added additional OPML support to MultiMarkdown.</p>
<p>Specifically it is now possible to “round trip” a document from a plain text
MMD file, to an OPML file containing MMD markup, and back to a plain text file
without corrupting the structure, or the content.</p>
<ul>
<li><code>mmd2OPML.pl</code> is used to convert a plain text file into an OPML file</li>
<li><code>OPML2mmd.pl</code> is used to convert an OPML file into a plain text file</li>
</ul>
<p>The layout of the OPML file is consistent with the structure expected by my
OmniOutliner export <a href="http://github.com/fletcher/Markdown.ooxsl">plugin</a>. This
means that the OPML file can be imported into OmniOutliner, and then exported
back as an OPML, or exported directly within OmniOutliner into a MultiMarkdown
text file (with or without attachments). Which brings up the point that the
attachment support is only for OmniOutliner (at least for now).</p>
<p>I’m not sure what other applications are out there that would be useful for
editing MultiMarkdown in an OPML format, but these new tools make it possible.
Alternatively, it may be helpful to temporarily convert a MultiMarkdown text
file into OPML if only to help reorganize the document quickly.</p>
<p>One limitation of this approach is that if you are using a “non-standard”
numbering scheme for your header levels you may find that the structure of the
resulting documents are not what you expect. For example, the “children” of an
h2 level section, will by definition be h3. With plain text files, you can
specify whatever level you like — in other words the level of the header
(h2, h3) had no intrinsic meaning. In an OPML document, they correlate
directly to the levels of the outline, which obviously cannot skip a
“generation”. In my mind, however, this is a feature, not a bug, and will
probably not be changed.</p>
<p>Additionally, I just discovered that not every OPML tool supports a “_notes”
field. OmniOutliner allows you to have a “title” for each piece of the
outline, and a separate notes field that holds the content. It appears that
there is no standard approach to this. So some OPML apps will simply import
the hierarchy of section titles, but no content…. If anyone else uses these
features, let me know if there is a workaround for the app you use…
Unfortunately, it appears that these features may only be useful for
OmniOutliner users…</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2010/02/new_opml_features_added_to_multimar.htmlMultiMarkdown CMS now incorporates “LESS”2010-02-13T10:34:37-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">MultiMarkdown CMS now incorporates “LESS”</h1><div class="date">02/13/2010 10:34:37</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>I recently re-engineered the CSS and div structure of my layout to work
better. Specifically, I used some ideas from <a href="http://matthewjamestaylor.com/blog/ultimate-multi-column-liquid-layouts-em-and-pixel-widths">Matthew James Taylor</a> to allow
the content to be described before the sidebar, and for the sidebar to be
switched from right to left with a single change. This required adding one
more div to my overall structure, and reworking the math on the CSS to achieve
the proper proportions.</p>
<p>It occurred to me that because of the complicated setup, it would require a
calculator and lots of debugging any time I wanted to change the width of a
column, or the spacing between them.</p>
<p>Which then brought up the idea of using <a href="http://lesscss.org/">LESS</a>. LESS is a way of creating
CSS that allows a bit more flexibility and shortcuts. It also allows the use
of variables and “math”. So I could set up a list of variables to specify the
desired width of the main content, the sidebar, and the margins for each. LESS
then calculates the required settings, and generates the CSS. So a few quick
changes can then reengineer the entire layout, and I don’t have to break out a
calculator. It took some time debugging the changes to get everything worked
out, but I think it works properly now.</p>
<p>If you don’t want to use LESS, you can look at the LESS source, do the
calculations yourself, and then manually update the css. Or you can stick with
the default proportions. But if you use CSS much, it’s worth at least taking a
look at LESS.</p>
<p><em>Note</em>: The only problem I have encountered with LESS so far is that it
doesn’t handle the <code>@media</code> command, so I had to use a separate css file for
print media.</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2010/02/multimarkdown_cms_now_incorporates_.htmlSeveral Updates to MultiMarkdown CMS2010-02-05T13:50:01-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Several Updates to MultiMarkdown CMS</h1><div class="date">02/05/2010 13:50:01</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>There have been many changes to <a href="/multimarkdown/cms/">MMD CMS</a> throughout the
week. I rewrote much of the code to be more uniform, fixed a fair number of
bugs, and streamlined a few things.</p>
<p>The biggest change is in the requirements for how it is hosted. There are now
two branches - the regular branch, and the advanced branch. The differences in
purpose and configuration are detailed on the project page, and in the README.</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2010/02/several_updates_to_multimarkdown_cm.htmlHow to use MMD as your CMS2010-01-31T21:26:19-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">How to use MMD as your CMS</h1><div class="date">01/31/2010 21:26:19</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>A while back I mentioned that I had started using MultiMarkdown to power my
web site, without using a separate CMS. I have now released the software I’ve
been using for anyone who’s interested.</p>
<p><a href="/multimarkdown/cms/">MultiMarkdown-CMS</a></p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2010/01/how_to_use_mmd_as_your_cms.htmlHow to delete all notes from Simplenote2010-01-31T13:25:07-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">How to delete all notes from Simplenote</h1><div class="date">01/31/2010 13:25:07</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>With the recent addition of Simplenote synchronization to Notational Velocity,
I wanted to experiment with the new features and check out my Simplenote
account.</p>
<p>However, I discovered that I had a bunch of notes, duplicates, and other cruft
in my Simplenote account, and I seemed to be unable to delete them. They kept
reappearing.</p>
<p>After trial and error, I was able to figure out how to finally kill them for
good:</p>
<ol>
<li><p>Delete the simplenote application from your iPhone</p></li>
<li><p>Run the “nuclear-option.pl” script that I added to SimplenoteSync.pl —
this script systematically deletes all notes from your Simplenote account.</p></li>
<li><p>In order to prevent the notes from reappearing, you have to start with a
fresh copy of the iPhone app. You can now reinstall it, and connect it to your
Simplenote account using the previous login and password.</p></li>
<li><p>After synchronizing you should have a fresh install. You can now migrate
any old notes over using your method of choice (Notational Velocity,
SimplenoteSync.pl, etc)</p></li>
</ol>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2010/01/how_to_delete_all_notes_from_simple.htmlStatus update on SimplenoteSync2010-01-31T10:32:52-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Status update on SimplenoteSync</h1><div class="date">01/31/2010 10:32:52</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>A few months ago, I wrote the
<a href="/other_projects/simplenotesync/">SimplenoteSync.pl</a> script to scratch a
particular itch. I wanted to use <a href="http://notational.net/">Notational Velocity</a>
on my mac, and <a href="http://simplenoteapp.com/">Simplenote</a> on my iPhone, and I
wanted the same data on both.</p>
<p>So I wrote the perl script, got it (mostly) working, and released it for
others to try out. Thanks to everyone’s feedback, I was able to fix some bugs,
and improve the script. I even received an email from NV’s author informing me
that there would eventually be built-in support for Simplenote
synchronization.</p>
<p>It looks like that has finally arrived. I have not reviewed the code, but I
imagine that for users who just want to synchronize their Notational Velocity
database with Simplenote, the built-in approach will definitely be easier, and
likely more reliable than using SimplenoteSync. For these users, it would
appear that SimplenoteSync is no longer necessary.</p>
<p>There are definitely other mac users of SimplenoteSync who don’t use
Notational Velocity (why not?!??!?), and users of other operating systems who
can’t. For these people, SimplenoteSync is still an option.</p>
<p>SimplenoteSync.pl is still available. It’s open source, so anyone can improve
it. I’ll still answer emails, and of course the
<a href="http://groups.google.com/group/simplenotesync">discussion list</a> is still
around. But I haven’t been using SimplenoteSync myself for quite a while (I
switched primarily to WriteRoom, and will now use Notational Velocity to
directly sync with Simplenote for the occasional use). I’m not actively
developing it, though I will certainly add any bug fixes that I become aware
of.</p>
<p><strong>To summarize, my recommendations are:</strong></p>
<ul>
<li><p>If you use a mac, you really should try out Notational Velocity, and its
support for synchronizing to Simplenote</p></li>
<li><p>Otherwise, you can still use SimplenoteSync and it will continue to work as
well as it has so far</p></li>
<li><p>Please contact me via the discussion list if you have questions about using
SimplenoteSync.pl. If you have difficulty or questions about how to use the
command line, perl, shell scripts, etc then please use google to find more
appropriate resources.</p></li>
</ul>
<p>Thank you to everyone who has used and supported SimplenoteSync.pl, and I’ll
continue to support ongoing users as much as I can!</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2010/01/status_update_on_simplenotesync.htmlAdditional OPML Support for MMD2010-01-30T14:58:36-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Additional OPML Support for MMD</h1><div class="date">01/30/2010 14:58:36</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>When I first started working with MultiMarkdown, I was using OmniOutliner. I
created a plug-in for OmniOutliner that would export an outline into a
Markdown document. The idea was that it made working with complex documents
easy - you could easily move sections around in outline form, and converting
the outline to chapters, sections, etc. was trivial.</p>
<p>Then I began using Scrivener, and let my OO work fall by the wayside.</p>
<p>Then I got back into using TextMate, and stopped using Scrivener.</p>
<p>This week’s announcement of the iPad, and Omni’s subsequent announcement that
they plan a version of OmniOutliner for the iPad at some point got me thinking
about this again.</p>
<p>I wrote a quick perl script that converts a MultiMarkdown plain text file into
an OPML file that maintains the overall structure. It moves the metadata (if
present) to the end of the file, following the convention I established for my
OmniOutliner Markdown export plugin.</p>
<p>So basically, it is now possible to round-trip a document from plain text to
OPML (which is easily imported into OmniOutliner or other outliners) and back
again.</p>
<p>I have no idea when a version of OmniOutliner for the iPad might become
available, but it would be nice to have this ready when it is. And, in any
event, it opens up additional options for using MMD with any OPML capable
outliner.</p>
<p>Check out more information on <a href="/multimarkdown/multimarkdown_and_omnioutliner/">MultiMarkdown and OmniOutliner</a>.</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2010/01/additional_opml_support_for_mmd.htmlRevised Movable Type instructions for MMD2010-01-28T17:24:06-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Revised Movable Type instructions for MMD</h1><div class="date">01/28/2010 17:24:06</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>I have rewritten the page describing how to configure MultiMarkdown when using Movable Type.</p>
<p>Read <a href="/multimarkdown/multimarkdown_and_movable_type/">more</a>.</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2010/01/revised_movable_type_instructions_f.htmlAutomatic postings to MMD discussion list2010-01-26T13:03:33-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Automatic postings to MMD discussion list</h1><div class="date">01/26/2010 13:03:33</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>Whenever I post a new entry to this site, I want to make sure that it is
properly announced. This used to require manually sending out an email to the
discussion list. Then it involved using posterous to update my twitter
account. Then I switched to a home built <a href="/2009/09/multimarkdown_as_cms">CMS</a>,
and I redesigned the work flow.</p>
<p>I use a cgi script to serve up an Atom feed for the site, so whenever it is
called, it automatically provides the latest entries.</p>
<p>I also use <a href="http://twitterfeed.com/">twitterfeed</a> to automatically tweet
whenever a new entry is added to the site. This happens automatically within
about 30 minutes from when the entry is added.</p>
<p>Until today, however, I still had to manually send an email to the <a href="http://groups.google.com/group/multimarkdown">MMD
Mailing List</a>. This involved
copying the text, and remembering to send an email.</p>
<p>I looked into RSS to email solutions, but the free options I found didn’t suit
my needs, and it wasn’t worth paying for when a simple script should do it for
me.</p>
<p>So I added a new script that looks for new entries, and when found sends an
email of the content to the specified address, appending a link to the entry
at the end. It also sends the raw MMD as the plain/text version, and the XHTML
as the “pretty” version. The script is called by git in the post-update hook.</p>
<p>We’ll see how well it works, but it should make it much easier to keep everything in sync!</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2010/01/automatic_postings_to_mmd_discussio.htmlUpdate to SimplenoteSync2010-01-25T15:02:25-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Update to SimplenoteSync</h1><div class="date">01/25/2010 15:02:25</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>I tweaked the SimplenoteSync script at the suggestion of a user, and it
<em>should</em> work on *nix systems (more or less). The date synchronization may not
work, and I am open to suggestions on how to improve it.</p>
<p>Please let me know if it works for you.</p>
<p><a href="http://github.com/fletcher/SimplenoteSync">http://github.com/fletcher/SimplenoteSync</a></p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2010/01/update_to_simplenotesync.htmlSample MultiMarkdown Document for Scrivener “fixed”2010-01-10T16:35:56-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Sample MultiMarkdown Document for Scrivener “fixed”</h1><div class="date">01/10/2010 16:35:56</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>As a few people have noticed, the sample MMD document for Scrivener was saved
using a test version of Scrivener, which made the document incompatible with
older versions.</p>
<p>I created a new version of the document that is compatible with 1.52, the
latest public version as of the time of this writing.</p>
<p>Enjoy!</p>
<p><a href="http://github.com/fletcher/MultiMarkdown-Gallery">http://github.com/fletcher/MultiMarkdown-Gallery</a></p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2010/01/sample_multimarkdown_document.htmlInteresting discussion about the lack of Markdown development2009-12-30T22:02:33-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Interesting discussion about the lack of Markdown development</h1><div class="date">12/30/2009 22:02:33</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p><a href="http://www.red-sweater.com/blog/1078/open-source-obligations">http://www.red-sweater.com/blog/1078/open-source-obligations</a></p>
<p>I’m even mentioned…. ;)</p>
<p>Perhaps I should polish up some of my proposals for a future of Markdown
development and put them out for others to ponder.</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2009/12/interesting_discussion_about_markdown.htmlHappy Holidays!2009-12-25T11:18:22-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Happy Holidays!</h1><div class="date">12/25/2009 11:18:22</div>
<p>Wishing everyone Happy Holidays, and a Happy New Year!!</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2009/12/happy_holidays.htmlReturn of the tag map2009-12-15T10:56:39-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Return of the tag map</h1><div class="date">12/15/2009 10:56:39</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>I had previously written a <a href="/2005/10/tag_categorizer">script</a> to help make
sense of all the tags applied to posts on my site when it was run using
OddMuse. I have recently enabled tags on my home built CMS, and have modified
the TagCategorizer script to help try to make sense of the tags here.</p>
<p>You can see the results by viewing the <a href="/tags/">Tag Map</a>.</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2009/12/return_of_the_tag_map.htmlFreeshell has moved2009-12-07T18:02:07-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Freeshell has moved</h1><div class="date">12/07/2009 18:02:07</div>
<p>My old site at <a href="http://fletcher.freeshell.org/">http://fletcher.freeshell.org/</a> has finally been shut down. I
moved to this new domain 2 1/2 years ago, and moved most of the “important”
content over within a short period of time. I left the old site up partly out
of laziness, and partly because there was still some content on there that may
have been of interest to some people.</p>
<p>I have now moved that vast majority of the content from my old wikis — both
at freeshell, and the old wiki here at fletcherpenney.net. I have <em>not</em> moved
the comments, but I plan to do so at some point. We’ll see.</p>
<p>If you attempted to go to a page at the old site, and were redirected here then please feel free to look around. It may take Google a few days to index the new pages here, so the search function may be limited. But the “similar pages” feature is working, and tags are working for the pages that have them. You can also browse the <a href="/archives/">archives</a>.</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2009/12/freeshell_has_moved.htmlWhat is an OpenID?2009-12-07T16:57:27-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">What is an OpenID?</h1><div class="date">12/07/2009 16:57:27</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p><a href="http://en.wikipedia.org/wiki/OpenID">OpenID</a> is a mechanism for
authenticating individuals using a decentralized approach. Please review the
link for more information, as I would almost certainly not give a clear
explanation.</p>
<p>For this site, however, it means that I don’t actually store any database of
users to authenticate against for submitting comments. You can log in using
any (as far as I know) valid OpenID that follows the standard. You may already
have an OpenID, since various services are already configured to serve as an
<a href="http://en.wikipedia.org/wiki/List_of_OpenID_providers">OpenID provider</a>.</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2009/12/what_is_an_openid.htmlOld web entries migrating to this site2009-12-07T11:19:20-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Old web entries migrating to this site</h1><div class="date">12/07/2009 11:19:20</div>
<p>My web sites have previously used blosxom, then OddMuse, then Movable Type,
and now finally my own custom solution relying primarily on MultiMarkdown and
a few cgi scripts. Between the changes, I have also used two different domain
names.</p>
<p>When I started <a href="http://fletcherpenney.net">this site</a>, I moved much of my
“main” content over, but left behind several hundred pages, some of which
contained some marginally interesting/useful information. It was stored in an
OddMuse wiki, and I didn’t take much time to think about how to easily move
all of the content over, or what to do about forwarding any requests to the
old site.</p>
<p>Over the weekend, I wrote a script to convert the old OddMuse page files into
MultiMarkdown documents suitable for posting to my new site. I was able to
salvage the original creation date (or at least the last modification date)
for the posts.</p>
<p>These posts will appear in the archives filed under their original date. I
have tagged some of them using my new tag support, but they are all indexed
for the similar pages <a href="/2009/10/new_similar_pages_feature">feature</a>. I suspect
that will be how any visitors may stumble across them.</p>
<p>Rather than trying to do anything fancy with my <a href="http://fletcher.freeshell.org">old site</a>, however, I will probably pull the plug
and put a URL redirect that directs visitors to a landing page here. I don’t
think it gets much traffic, and it certainly hasn’t seen any maintenance from
me in a long time….</p>
<p>Over time, I hope to continue to refine my content analysis tools and will
probably further tag and classify this old content to make it more accessible
to others (and myself).</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2009/12/old_web_entries_migrating.htmlNew tag feature enabled2009-12-04T12:22:30-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">New tag feature enabled</h1><div class="date">12/04/2009 12:22:30</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>After rebuilding my site to basically run off of static html files, with a
healthy dose of server side includes, I have been experimenting with how to
add other feature. For example, I used Google’s
<a href="http://www.google.com/cse/">Custom Search Engine</a> to handle searches, I added
a feature to <a href="/2009/10/new_similar_pages_feature">suggest similar pages</a>,
custom <a href="/2009/10/new_atom_feed">atom feeds</a>, and more.</p>
<p>I was also interested in re-enabling tags, but wasn’t sure of the best way to
do it. Ideally, the system would be intelligent — suggesting tags for new
content, providing a mechanism to analyze the tag framework as it grows to
find redundancy, and ensuring that pages are tagged appropriately.</p>
<p>I’ve started working on a system. To back up for a moment, though, I want to
describe the similar pages feature. Basically, it creates a “vector” for each
page in the site that corresponds to the number of occurrences of each word in
the document. The words are stemmed, certain common words are removed, and
everything is lower-cased. For example, a document consisting of “The Cow
jumped over the Moon” would become:</p>
<pre><code>cow 0.577350269189626
moon 0.577350269189626
jump 0.577350269189626</code></pre>
<p>Because of the way the math works, you don’t need to store a “0” for each word
that is <em>not</em> in a given document, but occurs in other documents. This makes
things much easier.</p>
<p>To compare two documents, one simply calculates the cosine of the angle
between the two respective vectors. The closer the vectors align with each
other, the closer the cosine is to 1 (a perfect match).</p>
<p>The way I suggest similar pages is to compare each document with every other
document and calculate their similarities. When a page is shown, this list is
scanned, and matches are found that exceed a certain threshold. I also cap the
list at the top 5 choices so a visitor isn’t overwhelmed with 12 similar
pages.</p>
<p>Back to tags…. I have a routine I can run locally that compares pages to the
overall vector for the pages contained within each tag. In otherwords, I can
find pages that look similar to pages already in a tag with the idea that
perhaps this new page belongs there as well. This can also suggest tags for a
new document that has yet to be posted (thanks, TextMate!).</p>
<p>I still would like to create a tool to visualize the relationships between
pages based on similarities and tags to more formally look for a structure to
the pages and the relationships between them. This might help suggest new tags
that aren’t being used — for example, if there is a cluster of closely
related pages about “ice cream”, that would likely be a tag that should be
added.</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2009/12/new_tag_feature_enabled.htmlAutomatic content sharing2009-11-22T14:02:50-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Automatic content sharing</h1><div class="date">11/22/2009 14:02:50</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>When I redesigned my web site to run primarily as a static site, with a few
cgi scripts to add interactivity, I still wanted to incorporate some of the
aspects of social sites I was using previously.</p>
<p>For example, I liked that <a href="http://posterous.com/">posterous</a> would
automatically update my twitter feed when new content was posted to my old
<a href="http://news.fletcherpenney.net">news site</a>. Movable Type already provided
atom and RSS access to my content, so I also needed to add that.</p>
<p>So basically, I wrote a script that would serve my static content as an atom
feed — easy to do since my content was stored in MMD text and minimally
marked up XHTML files. Easy enough.</p>
<p>Then I used <a href="http://twitterfeed.com/">twitterfeed</a> to monitor that feed, and
when it detects new articles, it adds a comment to my twitter account
announcing the title and a shortened URL.</p>
<p>Using these methods, I simply add a new article to my site. Automatically, the
Atom feed is updated, and within half an hour, an update is posted to my
twitter account (<a href="http://twitter.com/multimarkdown">@MultiMarkdown</a>).</p>
<p>I am currently testing a similar setup for comments on my site (a separate
Atom feed for comments has been around for a while).</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2009/11/automatic_content_sharing.htmlWARNING - Problems with SimplenoteSync2009-11-22T10:00:49-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">WARNING - Problems with SimplenoteSync</h1><div class="date">11/22/2009 10:00:49</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>Over the last few weeks (since some changes were made on the Simplenote
server?) I have noticed files going missing from my local machine.</p>
<p>I have emailed the support team, but didn’t get anything helpful back.</p>
<p>I haven’t changed anything locally.</p>
<p>The problem didn’t start until around the time they announced changes on the
server backend.</p>
<p>My personal solution was to no longer leave Notational Velocity running all
the time. This way, when it launches, it seems to do a better job of noticing
the missing files and asking if I want to restore them (and I say YES).</p>
<p>I assumed it was something I had done wrong (though I’m not sure what), and
after restoring my files everything seemed fine.</p>
<p>This morning I launched Notational Velocity and was warned of deleted files.
It appears that approximately 260 of my 340 files were deleted. I promptly
restored them thanks to Notational Velocity, and then I disabled the cron job
I use to automatically run SimplenoteSync.pl every 15 minutes.</p>
<p>I don’t know what the problem is. It’s possible that there is a bug in my
script, but the timing seems rather coincidental. In any case, until it is
resolved, or the direct integration between Simplenote and Notational Velocity
occurs, I suggest:</p>
<ul>
<li><p>Disable any scripts that automatically run SimplenoteSync.pl</p></li>
<li><p>Make (and maintain) up to date backups of your data (you’re doing this
already, right?!?)</p></li>
<li><p>Quit Notational Velocity before running SimplenoteSync.pl</p></li>
<li><p>run the SimplenoteSync.pl script manually, and verify the count of items in
the folder appears correct before and after syncing</p></li>
<li><p>re-run Notational Velocity after running SimplenoteSync.pl and look for
warnings of any missing files that seem incorrect</p></li>
</ul>
<p>I’ll notify you if I learn anything new, but I wanted to try to warn everyone
about this potential problem…</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2009/11/problems_with_simplenotesync.htmlNew “Similar Pages” Feature On My Site2009-10-18T17:23:00-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">New “Similar Pages” Feature On My Site</h1><div class="date">10/18/2009 17:23:00</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>For a while I have been interested in using computers to analyze the content
of text documents, and how programs are able to find similar documents. I
found a web site that had a “Similar entries” feature that would list a couple
of posts that were similar to the one you were viewing. That’s clearly a
useful feature to help visitors locate content on other pages they may be
interested in.</p>
<p>After much digging around the internet, I was able to find some descriptions
and examples of algorithms to implement such a feature. Basically, I count all
the instances of each word in a given document. These are used to generate a
normalized vector which represents the overall content of the document in
terms of which words are used more frequently. These vectors are calculated
for each document in the site.</p>
<p>Then, the vectors for any given pair of documents on the site are compared
(technically, by using the cosine of the angle between them). The function
generates a number between 0 and 1 that indicates how “parallel” the vectors
are, which correlates to an estimate of how similar the documents are.</p>
<p>I then wrote a quick script to query this database and show similar pages that
match a threshold of similarity, and also limit the number of matches shown so
as not to be overwhelming.</p>
<p>I am really interested in generalizing this to look into how to automatically
tag certain documents, and find new tags I should be using… We’ll see!</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2009/10/new_similar_pages_feature.htmlSimplenoteSync Update2009-10-15T16:51:20-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">SimplenoteSync Update</h1><div class="date">10/15/2009 16:51:20</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>I released an update to SimplenoteSync yesterday that fixes an issue where the
script would download a note just to “verify” it was flagged as deleted, when
it should know this from downloading the index.</p>
<p>Basically, this fix should make the script run faster and hit the server less
often. </p>
<p>It also adds a flag to log network activity - if it seems to be running slow
for you, enabling this flag will let you know each time it hits the Simplenote
web server. They were seeing some increased activity, most of which was
probably from improper user configuration (e.g. running the script too often),
but this will certainly help some.</p>
<p>Please update, and as always — <strong>BACKUP YOUR DATA!</strong></p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2009/10/simplenotesync_update.htmlNew Search Features on My Site2009-10-15T16:25:38-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">New Search Features on My Site</h1><div class="date">10/15/2009 16:25:38</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>For a few weeks I have been using Google to search my site, instead of running
a local search script. Today, I modified it to also search the contents of the
MultiMarkdown and (newly formed) SimplenoteSync discussion groups. In this
way, by running one search query, you can find information related to my
software on any of the “official” places.</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2009/10/new_search_features_on_my_site.htmlNew discussion group for SimplenoteSync2009-10-15T16:20:40-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">New discussion group for SimplenoteSync</h1><div class="date">10/15/2009 16:20:40</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>There is now a discussion list for SimplenoteSync on Google groups. You can
access on the web or by email.</p>
<p><a href="http://groups.google.com/group/simplenotesync">http://groups.google.com/group/simplenotesync</a></p>
<p><a href="mailto:simplenotesync@googlegroups.com">simplenotesync@googlegroups.com</a></p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2009/10/new_discussion_group_for_simplenotesync.html