--- /dev/null
+output
+*.pyc
--- /dev/null
+PY=python
+PELICAN=pelican
+PELICANOPTS=
+
+BASEDIR=$(CURDIR)
+INPUTDIR=$(BASEDIR)/content
+OUTPUTDIR=$(BASEDIR)/output
+CONFFILE=$(BASEDIR)/pelicanconf.py
+PUBLISHCONF=$(BASEDIR)/publishconf.py
+
+FTP_HOST=localhost
+FTP_USER=anonymous
+FTP_TARGET_DIR=/
+
+SSH_HOST=pwan.org
+SSH_PORT=22
+SSH_USER=jude
+SSH_TARGET_DIR=/home/jude/pwan.org
+
+S3_BUCKET=my_s3_bucket
+
+DROPBOX_DIR=~/Dropbox/Public/
+
+help:
+ @echo 'Makefile for a pelican Web site '
+ @echo ' '
+ @echo 'Usage: '
+ @echo ' make html (re)generate the web site '
+ @echo ' make clean remove the generated files '
+ @echo ' make regenerate regenerate files upon modification '
+ @echo ' make publish generate using production settings '
+ @echo ' make serve serve site at http://localhost:8000'
+ @echo ' make devserver start/restart develop_server.sh '
+ @echo ' make stopserver stop local server '
+ @echo ' ssh_upload upload the web site via SSH '
+ @echo ' rsync_upload upload the web site via rsync+ssh '
+ @echo ' dropbox_upload upload the web site via Dropbox '
+ @echo ' ftp_upload upload the web site via FTP '
+ @echo ' s3_upload upload the web site via S3 '
+ @echo ' github upload the web site via gh-pages '
+ @echo ' '
+
+
+html: clean $(OUTPUTDIR)/index.html
+
+$(OUTPUTDIR)/%.html:
+ $(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
+
+clean:
+ [ ! -d $(OUTPUTDIR) ] || find $(OUTPUTDIR) -mindepth 1 -delete
+
+regenerate: clean
+ $(PELICAN) -r $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
+
+serve:
+ cd $(OUTPUTDIR) && $(PY) -m pelican.server
+
+devserver:
+ $(BASEDIR)/develop_server.sh restart
+
+stopserver:
+ kill -9 `cat pelican.pid`
+ kill -9 `cat srv.pid`
+ @echo 'Stopped Pelican and SimpleHTTPServer processes running in background.'
+
+publish:
+ $(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(PUBLISHCONF) $(PELICANOPTS)
+
+ssh_upload: publish
+ scp -P $(SSH_PORT) -r $(OUTPUTDIR)/* $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)
+
+rsync_upload: publish
+ rsync -e "ssh -p $(SSH_PORT)" -P -rvz --delete $(OUTPUTDIR)/ $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR) --cvs-exclude
+
+dropbox_upload: publish
+ cp -r $(OUTPUTDIR)/* $(DROPBOX_DIR)
+
+ftp_upload: publish
+ lftp ftp://$(FTP_USER)@$(FTP_HOST) -e "mirror -R $(OUTPUTDIR) $(FTP_TARGET_DIR) ; quit"
+
+s3_upload: publish
+ s3cmd sync $(OUTPUTDIR)/ s3://$(S3_BUCKET) --acl-public --delete-removed
+
+github: publish
+ ghp-import $(OUTPUTDIR)
+ git push origin gh-pages
+
+.PHONY: html help clean regenerate serve devserver publish ssh_upload rsync_upload dropbox_upload ftp_upload s3_upload github
--- /dev/null
+'First' post
+############
+
+:date: 2013-07-15
+:tags: meta, shoshin
+:category: meta
+:author: Jude N
+
+My previous provider Thinkhost is currently being rolled into Dreamhost, such that Thinkhost will be shut down at the end of the month.
+Apparently the old pwan.org site was dropped during the account migrations. First I noticed I wasn't receiving any pwan.org email, so I opened a ticket,
+then I realized the entire site was down and opened another ticket.
+
+As far as I can tell all that's left of Thinkhost's tech support department is the liebot sending out the 'someone will get back
+to you as soon as possible' automated ticket responses. Blthhh. After 5 days of no site and radio silence, I finally
+got a response that said pretty much 'You're Dreamhost's problem now.'
+
+By that time, I had already updated my domain records to point to a new VM on `Digital Ocean`_. Bye Thinkhost/Dreamhost or web hosting in general.
+I have a full VM with root access now on a Linux distro of my choice for a third what I was paying for hosting.
+
+I have the site backed up and maybe I'll eventually port some of it over, but I really hadn't been maintaining it, and it was super ugly.
+So in the spirit of shoshin_ I'm rebuilding the site from scratch filled with a beginner's enthusiasm.
+
+I'm getting by with an email redirection service provided by my domain registrar, but the plan is to implement my own mail server
+based on Daniel Petterson's work with respect to `building a gmail replacement`_.
+
+Let's see how this goes.
+
+.. _Digital Ocean: https://www.digitalocean.com/features
+.. _shoshin: http://www.mindfulnessclasses.com/beginnersmind.htm
+.. _Pelican: http://blog.getpelican.com/
+.. _building a gmail replacement: http://dbpmail.net/essays/2013-06-29-hackers-replacement-for-gmail.html
--- /dev/null
+A Password Diversification Plan
+###############################
+
+:date: 2013-07-24
+:tags: security
+:category: security
+:author: Jude N
+
+(TLDR_)
+
+You shouldn't be using the same password everywhere You know this. Everytime `some popular site gets hacked`_ and
+`millions of passwords are lost`_ there's a flurry of news stories telling you `never use the same password twice`_. There's even a `xkcd comic`_ about it.
+
+But let's face it, if you are a reuser, this can be a pretty daunting task. It's like getting in shape or losing some weight:
+it's not something that's going to change overnight. It's going to take some time to switching all your passwords.
+
+With that in mind, here's a plan you can use to move away from password reuse at yuor own pace. As a side effect, it should also get you in the
+habit of using stronger passwords and make it easier to remember to occasional change your passwords..
+
+.. _some popular site gets hacked: https://duckduckgo.com/?q=passwords+stolen&t=canonical
+.. _millions of passwords are lost: http://www.infosecurity-magazine.com/view/32087/50-million-livingsocial-passwords-stolen/
+.. _never use the same password twice: https://duckduckgo.com/?q=never+reuse+passwords&t=canonical
+.. _xkcd comic: https://www.xkcd.com/792
+
+
+Pick a password manager
+-----------------------
+Instead of trying to remember multiple passwords, you should use a password manager. I like keepass_, but `there are others`_ available. Pick one and start using it.
+If you don't like it switch to another one. Here are the important features:
+
+- Cross platform - it should work on all your devices which are likely to prompt for passwords
+- cut&pasting passwords - the plan is to eventually start using long passwords you can't possibly remember, so being able to copy the passwords into your clipboard and paste them into the password field is *very* useful
+- random password generators
+
+Pick a password for the password manager's database. Use a different one from your normal password, since you're getting out of the habit of using the same password everywhere. Try to make it longer than your normal password.
+
+Then enter your current reused password as the first entry. The manager most likely has a 'copy and paste password to the clipboard' feature. For a day or two, get into the habit of copy&pasting your password from the manager instead of typing it manually.
+
+.. _keepass: http://keepass.info/
+.. _there are others: http://lifehacker.com/5042616/five-best-password-managers
+
+Set up Dropbox account
+----------------------
+You can use Dropbox (or an equivilent service) to `distribute your password database`_ across multiple machines and devices.
+
+If you're setting up a new account, don't reuse your default password. If you already have a Dropbox account, change your password.
+Add the new or updated password to the password manager.
+
+Copy your password database into the shared directory. Make sure it's not in a publicly accessible folder.
+Now you can access your password database from any machine or device you can access with Dropbox
+
+If your password manager supports keys, add key support, but don't store the keys on Dropbox.
+This way if Dropbox is hacked and your database is compromised, your database is still safe since the meenie weenies will not have your key.
+
+.. _distribute your password database: http://lifehacker.com/5063176/how-to-use-dropbox-as-the-ultimate-password-syncer
+
+Start Changing your passwords when visiting sites
+-------------------------------------------------
+If you visit a site and can log into a site with your default password, find the place on the site that'll let you
+change the pasword and then set it to a strong password and it to your password manager.
+
+Try to change one or two accounts a day in the beginning, and then ramp up as you get more comfortable with the process.
+
+When adding the new entries in the pasword manager an expiration date of something like 3 months.
+This is to also get yourself into the habit of changing your passwords as well.
+
+Learn to love the password recovery pages
+-----------------------------------------
+The first couple times you add a password into the manager, you may screw it up and need to recover your password for the site.
+This is a hassle, but for most sites it's not really that big a deal so that let that scare you off from changing your passwords.
+
+Still, until you've changed a couple passwords, it might be good to hold off on switching the passwords for important services
+like email, which would be more disruptive if you had to have the pasword reset.
+
+Backup your password database
+-----------------------------
+After the first week or so, backup your password database to a USB drive or burn it to the CD or export the database to a CSV file, print that out and store it in the safe deposit box in your fallout shelter with your lifetime supply of canned creamed
+corn. Whatever your comfortable with. The important thing is you make the backup.
+
+Also set up some sort of weekly reminder to update the backup.
+
+Start using different usernames for new sites
+---------------------------------------------
+If you're also using the same username for all your accounts, you could also start using differnet usernames as well to make it
+more difficult for folks to track you between sites. Your password manager should have a place to store your username, so you could cut&paste that field in addition to your password.
+
+Start deactivating unused account
+---------------------------------
+You probably have lots of accounts that you never use. Instead of changing the passwords for these sites, I suggest closing out the account entirely. Pull down whatever data you want to save from the site, then change your password to something random,and don't bother adding it to your password manager. Then deactivate the account.
+
+Bacn_ is a good source of reminders about accounts you may want to close out.
+
+.. _Bacn: https://en.wikipedia.org/wiki/Bacn_%28electronic%29
+
+
+After a site's been hacked
+--------------------------
+When an online service you're using is hacked, you should update your password on the site right away, making it more random
+if you already aren't using totally random passwrds.
+
+You should also use this oppurtunity to look around and see if there's some other more secure site that you could be using instead, or if your technically inclined, if it's now possible for you to run a local version of this service on your own servers.
+
+Change passwords that are expiring
+----------------------------------
+Since you've been adding expiration dates to the password entries, when the manager starts warning you of an impending expiration, go ahead and
+change the password on the site. By this time you will have been using the manager for a few months, so try making the password longer and more
+cryptic. The password manager probably has the option of creating random passwords for you, so try that out. You should be very used to cut&pasting
+your passwords, so it shouldn't matter to you much by now that you can't remember the password.
+
+.. _TLDR:
+
+Summary
+-------
+
+- Don't use the same password everywhere
+- Use a password manager - back it up regularly
+- Move away from using your reused password slowly at your own pace
+- Close out unused sites that are using the reused password
+- Set expirations on the passwords so you'll remember to change them regularly
+- Moving to more secure sites / self-hosting after sites are hacked.
+
+
--- /dev/null
+#!/usr/bin/env bash
+##
+# This section should match your Makefile
+##
+PY=python
+PELICAN=pelican
+PELICANOPTS=
+
+BASEDIR=$(pwd)
+INPUTDIR=$BASEDIR/content
+OUTPUTDIR=$BASEDIR/output
+CONFFILE=$BASEDIR/pelicanconf.py
+
+###
+# Don't change stuff below here unless you are sure
+###
+
+SRV_PID=$BASEDIR/srv.pid
+PELICAN_PID=$BASEDIR/pelican.pid
+
+function usage(){
+ echo "usage: $0 (stop) (start) (restart)"
+ echo "This starts pelican in debug and reload mode and then launches"
+ echo "A pelican.server to help site development. It doesn't read"
+ echo "your pelican options so you edit any paths in your Makefile"
+ echo "you will need to edit it as well"
+ exit 3
+}
+
+function alive() {
+ kill -0 $1 >/dev/null 2>&1
+}
+
+function shut_down(){
+ PID=$(cat $SRV_PID)
+ if [[ $? -eq 0 ]]; then
+ if alive $PID; then
+ echo "Killing pelican.server"
+ kill $PID
+ else
+ echo "Stale PID, deleting"
+ fi
+ rm $SRV_PID
+ else
+ echo "pelican.server PIDFile not found"
+ fi
+
+ PID=$(cat $PELICAN_PID)
+ if [[ $? -eq 0 ]]; then
+ if alive $PID; then
+ echo "Killing Pelican"
+ kill $PID
+ else
+ echo "Stale PID, deleting"
+ fi
+ rm $PELICAN_PID
+ else
+ echo "Pelican PIDFile not found"
+ fi
+}
+
+function start_up(){
+ echo "Starting up Pelican and pelican.server"
+ shift
+ $PELICAN --debug --autoreload -r $INPUTDIR -o $OUTPUTDIR -s $CONFFILE $PELICANOPTS &
+ pelican_pid=$!
+ echo $pelican_pid > $PELICAN_PID
+ cd $OUTPUTDIR
+ $PY -m pelican.server &
+ srv_pid=$!
+ echo $srv_pid > $SRV_PID
+ cd $BASEDIR
+ sleep 1
+ if ! alive $pelican_pid ; then
+ echo "Pelican didn't start. Is the pelican package installed?"
+ return 1
+ elif ! alive $srv_pid ; then
+ echo "pelican.server didn't start. Is the pelican package installed?"
+ return 1
+ fi
+ echo 'Pelican and pelican.server processes now running in background.'
+}
+
+###
+# MAIN
+###
+[[ $# -ne 1 ]] && usage
+if [[ $1 == "stop" ]]; then
+ shut_down
+elif [[ $1 == "restart" ]]; then
+ shut_down
+ start_up
+elif [[ $1 == "start" ]]; then
+ if ! start_up; then
+ shut_down
+ fi
+else
+ usage
+fi
--- /dev/null
+#!/usr/bin/env python
+# -*- coding: utf-8 -*- #
+from __future__ import unicode_literals
+
+AUTHOR = u'Jude N'
+SITENAME = u'pwan.org'
+SITEURL = 'https://pwan.org/blog'
+
+TIMEZONE = 'Universal'
+
+DEFAULT_LANG = u'en'
+
+# Feed generation is usually not desired when developing
+FEED_ALL_ATOM = None
+CATEGORY_FEED_ATOM = None
+TRANSLATION_FEED_ATOM = None
+FEED_RSS = None
+FEED_ALL_RSS = None
+CATEGORY_FEED_RSS = None
+FEED_MAX_ITEMS = 20
+
+# Blogroll
+#LINKS = (('Pelican', 'http://getpelican.com/'),
+# ('Python.org', 'http://python.org/'),
+# ('Jinja2', 'http://jinja.pocoo.org/'),
+# ('You can modify those links in your config file', '#'),)
+
+# Social widget
+#SOCIAL = (('You can add links in your config file', '#'),
+# ('Another social link', '#'),)
+
+DEFAULT_PAGINATION = 10
+
+# Uncomment following line if you want document-relative URLs when developing
+RELATIVE_URLS = True
+
+PDF_GENERATOR = False
+LOCAL = "C"
+
+TAG_CLOUD_STEPS = 4
+TAG_CLOUD_MAX_ITEMS = 100
+
+THEME = "../pelican-themes/pelican-mockingbird"
+
--- /dev/null
+#!/usr/bin/env python
+# -*- coding: utf-8 -*- #
+from __future__ import unicode_literals
+
+# This file is only used if you use `make publish` or
+# explicitly specify it as your config file.
+
+import os
+import sys
+sys.path.append(os.curdir)
+from pelicanconf import *
+
+SITEURL = 'https://pwan.org/blog'
+RELATIVE_URLS = False
+
+FEED = None
+TAG_FEED = None
+FEED_ALL_ATOM = None
+CATEGORY_FEED_ATOM = None
+TRANSLATION_FEED_ATOM = None
+FEED_RSS = 'feeds/rss.xml'
+FEED_ALL_RSS = 'feeds/all.rss.xml'
+CATEGORY_FEED_RSS = 'feeds/cat.%s.rss.xml'
+TAG_FEED_RSS = 'feeds/tag.%s.rss.xml'
+FEED_MAX_ITEMS = 20
+
+DELETE_OUTPUT_DIRECTORY = True
+
+# Following items are often useful when publishing
+
+#DISQUS_SITENAME = ""
+#GOOGLE_ANALYTICS = ""