fletcherpenney.netMultiMarkdown CMShttp://fletcherpenney.net/2010-03-12T05:09:49ZXML::Atom::SimpleFeedMMD-CMS has support for &#8220;make&#8221;2010-02-26T19:55:36-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">MMD-CMS has support for &#8220;make&#8221;</h1><div class="date">02/26/2010 19:55:36</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" --> <p>I&#8217;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&#8217;s <a href="http://www.leancrew.com/all-this/2008/06/my-no-server-personal-wiki&#8212;part-3/">personal wiki</a> project, I decided it was time to learn a little make myself&#8230;. 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&#8217;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 &#8220;round trip&#8221; 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&#8217;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 &#8220;non-standard&#8221; numbering scheme for your header levels you may find that the structure of the resulting documents are not what you expect. For example, the &#8220;children&#8221; of an h2 level section, will by definition be h3. With plain text files, you can specify whatever level you like &#8212; 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 &#8220;generation&#8221;. 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 &#8220;_notes&#8221; field. OmniOutliner allows you to have a &#8220;title&#8221; 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&#8230;. If anyone else uses these features, let me know if there is a workaround for the app you use&#8230; Unfortunately, it appears that these features may only be useful for OmniOutliner users&#8230;</p> <!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2010/02/new_opml_features_added_to_multimar.htmlMultiMarkdown CMS now incorporates &#8220;LESS&#8221;2010-02-13T10:34:37-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">MultiMarkdown CMS now incorporates &#8220;LESS&#8221;</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 &#8220;math&#8221;. 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&#8217;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&#8217;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&#8217;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&#8217;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&#8217;ve been using for anyone who&#8217;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 &#8220;nuclear-option.pl&#8221; script that I added to SimplenoteSync.pl &#8212; 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&#8217;s feedback, I was able to fix some bugs, and improve the script. I even received an email from NV&#8217;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&#8217;t use Notational Velocity (why not?!??!?), and users of other operating systems who can&#8217;t. For these people, SimplenoteSync is still an option.</p> <p>SimplenoteSync.pl is still available. It&#8217;s open source, so anyone can improve it. I&#8217;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&#8217;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&#8217;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&#8217;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&#8217;s announcement of the iPad, and Omni&#8217;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&#8217;t suit my needs, and it wasn&#8217;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 &#8220;pretty&#8221; version. The script is called by git in the post-update hook.</p> <p>We&#8217;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 &#8220;fixed&#8221;2010-01-10T16:35:56-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Sample MultiMarkdown Document for Scrivener &#8220;fixed&#8221;</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&#8217;m even mentioned&#8230;. ;)</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 &#8220;important&#8221; 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 &#8212; 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&#8217;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 &#8220;similar pages&#8221; 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&#8217;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 &#8220;main&#8221; 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&#8217;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&#8217;t think it gets much traffic, and it certainly hasn&#8217;t seen any maintenance from me in a long time&#8230;.</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&#8217;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&#8217;t sure of the best way to do it. Ideally, the system would be intelligent &#8212; 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&#8217;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 &#8220;vector&#8221; 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 &#8220;The Cow jumped over the Moon&#8221; 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&#8217;t need to store a &#8220;0&#8221; 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&#8217;t overwhelmed with 12 similar pages.</p> <p>Back to tags&#8230;. 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&#8217;t being used &#8212; for example, if there is a cluster of closely related pages about &#8220;ice cream&#8221;, 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 &#8212; 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&#8217;t get anything helpful back.</p> <p>I haven&#8217;t changed anything locally.</p> <p>The problem didn&#8217;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&#8217;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&#8217;t know what the problem is. It&#8217;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&#8217;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&#8217;ll notify you if I learn anything new, but I wanted to try to warn everyone about this potential problem&#8230;</p> <!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2009/11/problems_with_simplenotesync.htmlNew &#8220;Similar Pages&#8221; Feature On My Site2009-10-18T17:23:00-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">New &#8220;Similar Pages&#8221; 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 &#8220;Similar entries&#8221; feature that would list a couple of posts that were similar to the one you were viewing. That&#8217;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 &#8220;parallel&#8221; 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&#8230; We&#8217;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 &#8220;verify&#8221; 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 &#8212; <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 &#8220;official&#8221; 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