<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>terriyu@/media/blog</title><link href="http://terriyu.info/blog/" rel="alternate"></link><link href="http://terriyu.info/blog/feeds/all.atom.xml" rel="self"></link><id>http://terriyu.info/blog/</id><updated>2016-04-09T00:00:00-04:00</updated><entry><title>New mobile friendly theme</title><link href="http://terriyu.info/blog/posts/2016/04/updated-pelican-theme-2016/" rel="alternate"></link><updated>2016-04-09T00:00:00-04:00</updated><author><name>Terri Yu</name></author><id>tag:terriyu.info,2016-04-09:blog/posts/2016/04/updated-pelican-theme-2016/</id><summary type="html">&lt;!-- PELICAN_BEGIN_SUMMARY --&gt;

&lt;p&gt;I noticed that my blog is not mobile friendly, so I changed my Pelican theme
to use Bootstrap version 3, which has a responsive design.  I am now using
&lt;a href="https://github.com/getpelican/pelican-themes/tree/master/pelican-bootstrap3"&gt;pelican-bootstrap3&lt;/a&gt;
with the &lt;a href="http://bootswatch.com/united/"&gt;Bootswatch United&lt;/a&gt; theme.&lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;p&gt;The United theme is inspired by Ubuntu and appears to use similar colors and
fonts. This seemed appropriate, given my support of free open source software.&lt;/p&gt;
&lt;p&gt;I &lt;a href="http://bootswatch.com/help/"&gt;recompiled&lt;/a&gt; the Bootswatch United theme to
increase the base font size from 14 pt to 18 pt.  Maybe some people think
that's big, but I like large text!  The article titles are kind of big on my
phone though.&lt;/p&gt;
&lt;p&gt;To recompile the CSS for a Bootswatch theme, follow the
&lt;a href="http://bootswatch.com/help/"&gt;instructions&lt;/a&gt; here.  The changes I made are
shown in this diff:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;diff --git a/united/variables.less b/united/variables.less
index 1062bbb..15a399a 100644
--- a/united/variables.less
+++ b/united/variables.less
@@ -48,12 +48,12 @@
 @font-family-monospace:   Menlo, Monaco, Consolas, &lt;span class="s2"&gt;&amp;quot;Courier New&amp;quot;&lt;/span&gt;, monospace&lt;span class="p"&gt;;&lt;/span&gt;
 @font-family-base:        @font-family-sans-serif&lt;span class="p"&gt;;&lt;/span&gt;

-@font-size-base:          14px&lt;span class="p"&gt;;&lt;/span&gt;
+@font-size-base:          18px&lt;span class="p"&gt;;&lt;/span&gt;
 @font-size-large:         ceil&lt;span class="o"&gt;((&lt;/span&gt;@font-size-base * 1.25&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; // ~18px
 @font-size-small:         ceil&lt;span class="o"&gt;((&lt;/span&gt;@font-size-base * 0.85&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; // ~12px

-@font-size-h1:            floor&lt;span class="o"&gt;((&lt;/span&gt;@font-size-base * 2.6&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; // ~36px
-@font-size-h2:            floor&lt;span class="o"&gt;((&lt;/span&gt;@font-size-base * 2.15&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; // ~30px
+@font-size-h1:            floor&lt;span class="o"&gt;((&lt;/span&gt;@font-size-base * 2.22&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; // ~36px
+@font-size-h2:            floor&lt;span class="o"&gt;((&lt;/span&gt;@font-size-base * 1.89&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; // ~30px
 @font-size-h3:            ceil&lt;span class="o"&gt;((&lt;/span&gt;@font-size-base * 1.7&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; // ~24px
 @font-size-h4:            ceil&lt;span class="o"&gt;((&lt;/span&gt;@font-size-base * 1.25&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; // ~18px
 @font-size-h5:            @font-size-base&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In short, make changes to variables in &lt;code&gt;variables.less&lt;/code&gt; and then recompile to
get the new CSS files.&lt;/p&gt;
&lt;p&gt;Mostly, I was able to plug in the Bootstrap 3 theme with minimal changes. The
only thing I haven't gotten to work is the
&lt;a href="https://github.com/getpelican/pelican-plugins/tree/master/tipue_search"&gt;Tipue Search&lt;/a&gt;
plugin.&lt;/p&gt;</summary><category term="software"></category><category term="webdev"></category></entry><entry><title>Becoming a new contributor to open source through Outreach Program for Women and OpenStack</title><link href="http://terriyu.info/blog/posts/2013/07/becoming-foss-contributor/" rel="alternate"></link><updated>2013-07-31T00:00:00-04:00</updated><author><name>Terri Yu</name></author><id>tag:terriyu.info,2013-07-31:blog/posts/2013/07/becoming-foss-contributor/</id><summary type="html">&lt;!-- PELICAN_BEGIN_SUMMARY --&gt;

&lt;div style="text-align:center"&gt;
&lt;p&gt;&lt;img alt="Screenshot of my first OpenStack contribution" src="http://terriyu.info/blog/images/first-openstack-contribution.png" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Attracting new contributors and making projects accessible to newcomers is an
important issue to many open source organizations.&lt;/p&gt;
&lt;p&gt;I will describe my experiences becoming a new contributor to open source.  I
hope that this will be useful to 1) people trying to improve the open source
newcomer experience and 2) people who have never worked on open source and are
interested in becoming contributors.&lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;h2&gt;Initial thoughts&lt;/h2&gt;
&lt;p&gt;I've always wanted to develop software, and my friends told me that
participating in open source is a good way to get experience.  About a year
ago, I started looking into open source projects.  &lt;/p&gt;
&lt;p&gt;During this time, I thought about what kind of open source project I'd like to
join.  I came up with a few criteria.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;What is the size of the project and is there a lot of activity?&lt;/em&gt;  &lt;/p&gt;
&lt;p&gt;If it's too small, there might not be enough opportunity for interaction.
If it's too large, I might be overwhelmed. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Am I interested in the goals of the project?&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;I like number crunching and am interested in learning more about core
infrastructure like cloud computing and networking.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Is there any formal effort to welcome newbies, like a mentoring group,
    newbies mailing list, etc?&lt;/em&gt;  &lt;/p&gt;
&lt;p&gt;I never felt like I could just jump in and immediately contribute, at least
not when I was first getting started.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;What programming language and tools does the project use?&lt;/em&gt;  &lt;/p&gt;
&lt;p&gt;I prefer to work in a language I already know and enjoy using, but I might
be interested in learning a new tool if it sounds cool. &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I had experience using &lt;abbr title="free open source software"&gt;FOSS&lt;/abbr&gt; software like &lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt;, &lt;a href="http://miktex.org/"&gt;MikTeX&lt;/a&gt;, and
&lt;a href="http://mercurial.selenic.com/"&gt;Mercurial&lt;/a&gt;, but the projects that had the greatest appeal to me were
the programming language &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; and associated scientific libraries
&lt;a href="http://www.numpy.org/"&gt;NumPy/SciPy&lt;/a&gt;.  I'm excited about scientific computing, so I was
interested in developing tools that I had previously used in scientific
research. &lt;/p&gt;
&lt;p&gt;I found out that Python has a &lt;a href="http://pythonmentors.com/"&gt;mentoring mailing list&lt;/a&gt;, so I
set my sights on contributing to the Python Core.  But then I discovered the 
&lt;a href="https://wiki.gnome.org/OutreachProgramForWomen/"&gt;Outreach Program for Women&lt;/a&gt; and decided to apply for a free open source
software (&lt;abbr title="free open source software"&gt;FOSS&lt;/abbr&gt;) internship there. &lt;/p&gt;
&lt;h2&gt;Applying to Outreach Program for Women&lt;/h2&gt;
&lt;p&gt;The Outreach Program for Women&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2" rel="footnote"&gt;2&lt;/a&gt;&lt;/sup&gt; is unique in that the application process
itself is a simulation of the actual internship.  Applicants spend their time
during the application period learning the tools and culture of &lt;abbr title="free open source software"&gt;FOSS&lt;/abbr&gt;, so that
they can make their first contributions.&lt;/p&gt;
&lt;p&gt;Therefore, applying to the Outreach Program for Women became my first
experience with &lt;abbr title="free open source software"&gt;FOSS&lt;/abbr&gt; as a contributor.  This isn't exactly the same as 
just "walking" into an open source project off the internet, since a program
inherently has more structure and organization.  But I still think much of
my experience is relevant to the "open source newcomer" issue. &lt;/p&gt;
&lt;p&gt;The application period was a month long and I thought that would be plenty of
time to make some decent contributions -- wrong.  I severely underestimated
how much I had to learn, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Learning about over a dozen organizations that were offering internships
    in the program.&lt;/em&gt;  &lt;/p&gt;
&lt;p&gt;I couldn't work with all of them, so I had to read about them and try to
narrow it down to a handful of possibilities using the criteria I discussed
previously.  Usually, I could figure out the overall mission of an
organization, but if I went a level deeper and looked at the different
components of their software project, I got lost in technical jargon. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Installing the Linux operating system&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I was a life-long Windows user and had wanted to try Linux, but had never
gotten around to it in the last 5+ years.  Fortunately, my laptop is a
Thinkpad T400 with an Ultrabay slot,&lt;sup id="fnref:3"&gt;&lt;a class="footnote-ref" href="#fn:3" rel="footnote"&gt;3&lt;/a&gt;&lt;/sup&gt; which made it especially easy to 
install Linux distros.  Still, it took 2-3 days to figure out how to 
partition my hard drive and install the Linux distros (Ubuntu and Debian)
with the basic packages.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Learning how to "install" software in general&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;By install, I mean in the general sense -- not just installing things like
Ubuntu and Devstack (the development version of OpenStack), but also 
situations like when you build a test environment and have to install lots
of dependencies.  Outside of writing and thinking about code, most of my
technical problems had to do with missing dependencies.&lt;sup id="fnref:4"&gt;&lt;a class="footnote-ref" href="#fn:4" rel="footnote"&gt;4&lt;/a&gt;&lt;/sup&gt;  I learned to
fix these issues by searching for the names of packages on the internet
and in the bug trackers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Learning specific version control systems and tools&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;abbr title="free open source software"&gt;FOSS&lt;/abbr&gt; organization use a variety of version control systems and tools,
especially if they've been around for a while.  I encountered Subversion,
Git, and &lt;a href="http://en.wikipedia.org/wiki/Gerrit_%28software%29"&gt;Gerrit&lt;/a&gt; (a code review tool built on top of Git).
Fortunately, I had a little experience using Subversion and Mercurial, but
learning Git on the fly is not ideal&lt;sup id="fnref:5"&gt;&lt;a class="footnote-ref" href="#fn:5" rel="footnote"&gt;5&lt;/a&gt;&lt;/sup&gt; especially if something "breaks."
One organization I worked with used Git, so I thought it was sufficient to
learn Git, but I didn't know they also used GitHub to submit patches via
pull request.  This caused me a lot of trouble because I had cloned their
source repository directly rather than from a forked repo on GitHub.  When I
tried to submit my patch, my Git push failed because my forked repo didn't
know that my local repo existed.  I had no idea how to fix this, and
&lt;a href="http://xor.lonnen.com/"&gt;Christopher Lonnen&lt;/a&gt;, a Mozilla developer, spent an hour on both a
Friday and a Saturday helping me -- I'm glad he was so generous with his
time!  &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Learning the code review process&lt;/em&gt;     &lt;/p&gt;
&lt;p&gt;Submitting patches to fix typos or add documentation was straightforward,
but if it was more complicated, I was lost.  It's not trivial to figure out
how to fit your work into a large code base.  There were things I didn't
know, for instance, that I needed to write or revise a unit test to go
along with a feature/fix, or that I could submit incremental patches
containing partial work.  I was unfamiliar with code style guidelines like
&lt;a href="http://www.python.org/dev/peps/pep-0008/"&gt;PEP8&lt;/a&gt; and submitted code with trailing whitespaces.   &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Learning how to work in virtual environments&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When it comes to helping newcomers get onboard a &lt;abbr title="free open source software"&gt;FOSS&lt;/abbr&gt; project, the focus
seems to be on teaching them about version control and bug tracking
systems which is great, but virtual environments are neglected.  I found
myself using virtualization tools like &lt;a href="http://www.virtualenv.org/"&gt;virtualenv&lt;/a&gt; and
&lt;a href="https://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt; without having any knowledge of why virtualization
was needed or how it works.  It was difficult to find online tutorials on
virtualization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Getting used to IRC and &lt;abbr title="free open source software"&gt;FOSS&lt;/abbr&gt; culture.&lt;/em&gt;  &lt;/p&gt;
&lt;p&gt;Up to this point, I had chatted privately on clients like ICQ/Pidgin/Gchat,
but I had never been in a public chatroom before.  It took me some time to
pick up chat slang like "np", "yw", "o/" and become accustomed to
sitting on IRC channels all day so I could chase people down.  But more than
that, I wasn't sure how to conduct myself on a public channel.  It felt
unnatural and intimidating for the first few days, and that was even with
nice people noticing me on the channel and welcoming me!  Some anecdotes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I had great experiences asking for Linux install help on #ubuntu and
    #debian.  Assistance came immediately, so I'm very grateful to those
    communities.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Also, a huge thank you to &lt;a href="http://wikimediafoundation.org/wiki/User:Sumanah"&gt;Sumana Harihareswara&lt;/a&gt; of the
    Wikimedia Foundation who tagged along as my buddy to a (non Wikimedia)
    software development channel.  I was nervous about "talking" to a bunch
    of strangers on a public channel and her presence as "wing woman"
    alleviated my fears.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sadly, my first day on IRC, I had an interaction with a male that I
    would classify as "marginal stalking."  I informed the operators of the
    channel, and they dealt with the matter swiftly.  It bothered me a
    little, but it would have been much worse if no one had been there to
    take care of me. &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another obstacle was finding things to work on.  For the sake of the application
process, some organizations would come up with "easy" bugs for the applicants,
but I'm not sure if this is the norm.  I recall that when I tried to work with
OpenStack during the application period, they had no idea where to find easy
bugs, at first.  &lt;/p&gt;
&lt;p&gt;I had (what seemed to me) a great background for getting into open source --
strong technical experience from studying science, lots of software user
experience (&lt;abbr title="free open source software"&gt;FOSS&lt;/abbr&gt; and proprietary), strong interest in coding, native English
speaker, familiarity with nerdy pop culture, the right hardware (Thinkpad).  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Even then I had to get over a major hump in order for me to make my first
contributions.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Some of this might have been easier if I had more experience with software
development and Linux.  However, I put off learning Linux for over 5 years
because I never had a real reason to use it!  Working in &lt;abbr title="free open source software"&gt;FOSS&lt;/abbr&gt; was my driving
impetus to learn software development and Linux.  So that is the "chicken and
egg" problem, at least for me personally.&lt;/p&gt;
&lt;h2&gt;Working on OpenStack&lt;/h2&gt;
&lt;p&gt;At the end of the application period, I picked OpenStack as my first choice
organization.&lt;sup id="fnref:6"&gt;&lt;a class="footnote-ref" href="#fn:6" rel="footnote"&gt;6&lt;/a&gt;&lt;/sup&gt;  Happily, I was selected, and shortly afterwards, began
working on OpenStack.&lt;/p&gt;
&lt;p&gt;It's true that I made my first &lt;abbr title="free open source software"&gt;FOSS&lt;/abbr&gt; contributions while applying to Outreach
Program for Women, but those were simple patches like fixing typos and adding
documentation.  Being an OpenStack intern provided me with my first experience
in working on substantial patches that needed to work with a large codebase
and that required significant code review.&lt;/p&gt;
&lt;p&gt;I found out later that OpenStack is not an easy project for newcomers to get
into.  Recently, while I was on IRC, I had an interesting discussion with
someone from India.  The person told me that OpenStack has a "tough"
reputation.  They tried to install Devstack unsuccessfully, and their friends
had the same experience.&lt;/p&gt;
&lt;p&gt;I was lucky to have the help of &lt;a href="http://anteaya.info/"&gt;Anita Kuno&lt;/a&gt;, a recent OpenStack intern
alumnae, who put heroic, generous effort into getting me started.  She showed me
how to install Devstack step-by-step and how to use Gerrit.  When needed, she
talked to OpenStack people on my behalf.  After my very first contribution to
OpenStack's Gerrit system, I had a strange, private interaction on IRC with
someone who saw my patch.  I told Anita about it, and she dealt with the person
immediately.    &lt;/p&gt;
&lt;p&gt;Here at OpenStack, I have my team of supporters.  Besides Anita, I have
&lt;a href="http://julien.danjou.info/"&gt;Julien Danjou&lt;/a&gt; (my mentor), &lt;a href="http://www.jpichon.net/"&gt;Julie Pichon&lt;/a&gt;
(former Outreach Program for Women mentor), and &lt;a href="http://justwriteclick.com/"&gt;Anne Gentle&lt;/a&gt; (OpenStack's
Outreach Program for Women coordinator) as well as past OpenStack interns
&lt;a href="http://vmartinezdelacruz.com/"&gt;Victoria Mart&amp;iacute;nez de la Cruz&lt;/a&gt; and &lt;a href="https://wiki.openstack.org/wiki/Laura_Alves"&gt;Laura Alves&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It goes without saying that having a good mentor is essential.  I'm always able
to get in touch with Julien, no matter how busy he is as Ceilometer Project
Technical Lead.  During the Outreach Program for Women application process, I
interacted with some mentors who seemed "too busy" and found it frustrating, so
I truly appreciate Julien's effort to be available.  It's also very helpful to
have the "team" of supporters I just mentioned.  When someone is busy, I can try
someone else.&lt;sup id="fnref:7"&gt;&lt;a class="footnote-ref" href="#fn:7" rel="footnote"&gt;7&lt;/a&gt;&lt;/sup&gt;  All the people on my "team" work on different things and have
varied backgrounds, which means they have different perspectives.  This is also
extremely educational and useful for me.&lt;/p&gt;
&lt;p&gt;Personally, I've found that good mentoring is not purely based on technical 
knowledge and experience.  While those things are important (and essential to
have in at least one mentor, in my case, Julien), I think good judgment and
thoughtfulness are equally relevant.  People who have less experience can
mentor, too, if they are thoughtful.  They can help out with the things they do
know about and refer me to others when they feel like a matter is outside their
domain of experience.  It's very useful to have a "cultural ambassador" who can
show you around the &lt;abbr title="free open source software"&gt;FOSS&lt;/abbr&gt; community and be a role model for how to behave.&lt;/p&gt;
&lt;p&gt;I'm not saying that technical knowledge isn't necessary at all in mentoring; I'm
merely trying to highlight some other factors which may not be as obvious.&lt;/p&gt;
&lt;p&gt;Beyond mentoring, here are some things I experienced/learned while being a new
contributor to OpenStack:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I wasn't sure how much or how little I could bother people on the
     development channels.  Hypothetically, at what point would I bother people
     to look at my patch?  (In reality, I've always gotten prompt reviews.)  &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I work on OpenStack in a virtual machine,&lt;sup id="fnref:8"&gt;&lt;a class="footnote-ref" href="#fn:8" rel="footnote"&gt;8&lt;/a&gt;&lt;/sup&gt; which gives me peace of mind.
     If the development environment becomes irreversibly screwed up, I can
     always trash my current virtual machine and start a fresh one.  Then
     after installing Devstack, I can resume work on my current patch using
     the command &lt;code&gt;git review -d patch####&lt;/code&gt;.&lt;sup id="fnref:9"&gt;&lt;a class="footnote-ref" href="#fn:9" rel="footnote"&gt;9&lt;/a&gt;&lt;/sup&gt;  The point is that I shouldn't
     fear making mistakes in my local development environment, if it's on a
     virtual machine. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If people know I'm new to software development and the project, it's okay
     to submit an incremental patch.  What I mean is that if I'm not sure what
     I'm doing and the patch can be naturally partitioned, I can submit the
     patch part by part.  For example, if I'm working on a feature in multiple
     back-end drivers, I could divide the patch into 4 parts: 1) test for the
     drivers, 2-4) implementation for each of 3 drivers.  People can comment
     as I submit each part, so that I know I'm on the right track.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I can mark patches on Gerrit as "&lt;a href="https://wiki.openstack.org/wiki/Gerrit_Workflow#Drafts"&gt;drafts&lt;/a&gt;" or use the "work
     in progress" status if my patch is not ready for a major review.  &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It's important to know who to go to when there is a significant issue,
     especially if it's relevant to the entire community.  If I have technical
     issue, I can go to my mentor Julien Danjou.  If I have a non-technical
     issue, I can go to Anne Gentle (OpenStack intern coordinator) or one of the
     Outreach Program for Women coordinators, &lt;a href="https://wiki.gnome.org/MarinaZhurakhinskaya"&gt;Marina Zhurakhinskaya&lt;/a&gt;
     and &lt;a href="http://blogs.gnome.org/gnomg/"&gt;Karen Sandler&lt;/a&gt;.  I hope everyone has someone they can go to, in
     their own &lt;abbr title="free open source software"&gt;FOSS&lt;/abbr&gt; community.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The one important thing I learned about contributing to open source&lt;/h2&gt;
&lt;p&gt;This might sound clich&amp;eacute;d, but I think open source is very much about the
people.  You can learn a lot from internet tutorials, but there are always
unforeseen obstacles and you need people to guide you through them.&lt;/p&gt;
&lt;p&gt;Thanks to many many kind, supportive individuals I was able to &lt;/p&gt;
&lt;p&gt;install Linux, &lt;br /&gt;
repair my Git history, &lt;br /&gt;
survive the Devstack gauntlet, &lt;br /&gt;
fend off weirdos,   &lt;/p&gt;
&lt;p&gt;and most importantly, feel welcome as a bona fide member of the open source
community. &lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;For an interesting take on how to assess open source projects, see
  Mel Chua's blog post "&lt;a href="http://blog.melchua.com/2010/10/08/possesa-fri-5-minutes-of-improvisation/"&gt;5 minutes of improvisation&lt;/a&gt;".&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;I've &lt;a href="http://terriyu.info/blog/posts/2013/06/opw-first-day/"&gt;written previously&lt;/a&gt; about the Outreach Program for Women
  -- explaining what the program is about and how I learned of its
  existence.&amp;#160;&lt;a class="footnote-backref" href="#fnref:2" rev="footnote" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;Thinkpads are among the best supported machines in the Linux world, and
  the secondary slot allowed me to install a second hard drive that I could
  run Linux on, without any risk to my primary hard drive with Windows on
  it.  I also had my RAM maxed out to 8 GB, which was very helpful later
  on, when I ran Devstack in a virtual machine. &amp;#160;&lt;a class="footnote-backref" href="#fnref:3" rev="footnote" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;I recently wrote a OpenStack-related post about &lt;a href="http://terriyu.info/blog/posts/2013/07/installing-devstack-ceilometer/"&gt;how to install Devstack
  and Ceilometer&lt;/a&gt;.  In the troubleshooting sections,
  I mention lots of bugs related to missing dependencies, all of which I
  encountered while trying to install software or run tests.&amp;#160;&lt;a class="footnote-backref" href="#fnref:4" rev="footnote" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;I did go through a very short Git tutorial, but in my opinion, it wasn't 
  sufficient.  The application process put me under time pressure, so I
  wasn't able to do a more thorough tutorial.&amp;#160;&lt;a class="footnote-backref" href="#fnref:5" rev="footnote" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:6"&gt;
&lt;p&gt;You can read my "&lt;a href="|file|why-openstack.md"&gt;Why Openstack&lt;/a&gt;" post to find out why I
  picked them!&amp;#160;&lt;a class="footnote-backref" href="#fnref:6" rev="footnote" title="Jump back to footnote 6 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:7"&gt;
&lt;p&gt;I speculate this is the reason that &lt;a href="https://developers.google.com/open-source/soc/"&gt;Google Summer of Code&lt;/a&gt; requires
  multiple mentors for each intern.  Google Summer of Code is an &lt;abbr title="free open source software"&gt;FOSS&lt;/abbr&gt;
  internship program similar to Outreach Program for Women, but it focuses
  on coding and is restricted to students.&amp;#160;&lt;a class="footnote-backref" href="#fnref:7" rev="footnote" title="Jump back to footnote 7 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:8"&gt;
&lt;p&gt;My post about installing Devstack and Ceilometer includes a section about
  &lt;a href="http://terriyu.info/blog/posts/2013/07/installing-devstack-ceilometer/"&gt;using Vagrant/VirtualBox virtual machines&lt;/a&gt;.  &amp;#160;&lt;a class="footnote-backref" href="#fnref:8" rev="footnote" title="Jump back to footnote 8 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:9"&gt;
&lt;p&gt;This command automatically downloads the patch and creates a branch for
  the patch in your local Git repository.&amp;#160;&lt;a class="footnote-backref" href="#fnref:9" rev="footnote" title="Jump back to footnote 9 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:10"&gt;
&lt;p&gt;The image I used for this post is a screenshot of my very first OpenStack
  contribution.&amp;#160;&lt;a class="footnote-backref" href="#fnref:10" rev="footnote" title="Jump back to footnote 10 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</summary><category term="foss"></category><category term="openstack"></category><category term="opw"></category><category term="software"></category></entry><entry><title>How to install Devstack and Ceilometer on a Vagrant virtual machine</title><link href="http://terriyu.info/blog/posts/2013/07/installing-devstack-ceilometer/" rel="alternate"></link><updated>2013-07-30T00:00:00-04:00</updated><author><name>Terri Yu</name></author><id>tag:terriyu.info,2013-07-30:blog/posts/2013/07/installing-devstack-ceilometer/</id><summary type="html">&lt;!-- PELICAN_BEGIN_SUMMARY --&gt;

&lt;p&gt;DISCLAIMER: THIS INFORMATION IS EXTREMELY OUT OF DATE. &lt;/p&gt;
&lt;p&gt;Ceilometer is a fairly new component of OpenStack, so I thought it would be
helpful to document how I install &lt;a href="https://wiki.openstack.org/wiki/Ceilometer"&gt;Ceilometer&lt;/a&gt; and
&lt;a href="http://devstack.org/"&gt;DevStack&lt;/a&gt;.  Ceilometer monitors and gathers data on other components
in OpenStack.  For example, one could use Ceilometer to measure CPU usage in
order to bill customers.  &lt;/p&gt;
&lt;p&gt;In this post, I'll go through how I install Devstack and Ceilometer on a
&lt;a href="http://www.vagrantup.com/"&gt;Vagrant&lt;/a&gt; virtual machine running 64-bit Ubuntu 12.04 LTS.  Your host
machine should have enough memory, so that it can run a virtual machine with 2
GB RAM.&lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;p&gt;Before getting into details, some disclaimers and explanations.&lt;/p&gt;
&lt;p&gt;I assume that if you want to install Devstack, it's because you're interested in
being a contributor to OpenStack development or because you just want to play
with the code.  Devstack is a shell script that builds an OpenStack
development environment for people developing OpenStack; it's not meant for
production.&lt;/p&gt;
&lt;p&gt;I install Devstack and Ceilometer on a virtual machine.  Why use a virtual
machine?  It's the recommended way to install Devstack.  Cloud infrastructure
software is complex.  Devstack installs lots and lots of dependencies, and you
probably don't want all those dependencies to be installed on your everyday
environment.  Moreover, if Devstack or Ceilometer breaks (which happens pretty
regularly when you develop), it's a lot easier to start over from scratch if
you're working in a virtual machine.  You can simply destroy the old virtual
machine and build a new one, without any effect on your everyday environment.&lt;/p&gt;
&lt;p&gt;I'm using Vagrant because it was recommended to me, but there are plenty of
other ways to run virtual machines.  You are welcome to use your own method,
but this post will only explain how to setup virtual machines using Vagrant.  &lt;/p&gt;
&lt;p&gt;Finally, note the date of this post.  Devstack and Ceilometer are rapidly
being developed, and this information could become deprecated very quickly.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="#install_vagrant"&gt;Install VirtualBox and Vagrant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#configure_vagrant"&gt;Configure Vagrant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#install_devstack"&gt;Install Devstack and Ceilometer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#check_devstack"&gt;Check that Devstack is working&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#configure_ceilometer"&gt;Configure Devstack for Ceilometer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#check_ceilometer"&gt;Check that Ceilometer is collecting data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ceilometer_tests"&gt;Run Ceilometer tests&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="#references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a name="install_vagrant"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;1. Install VirtualBox and Vagrant&lt;/h2&gt;
&lt;p&gt;Vagrant is software for building and distributing virtual development
environments.  It works with many virtualization software packages.
By default, Vagrant uses &lt;a href="https://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt; for its virtualization
software package.&lt;/p&gt;
&lt;h3&gt;Install VirtualBox&lt;/h3&gt;
&lt;p&gt;First, install VirtualBox.  Follow the instructions on the
&lt;a href="https://www.virtualbox.org/wiki/Linux_Downloads"&gt;VirtualBox Linux downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I'm running 64-bit Ubuntu 12.04 and here's what I did.  First, I added the
following line to my &lt;code&gt;etc/apt/sources.list&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;deb http://download.virtualbox.org/virtualbox/debian precise contrib
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Then I downloaded and added the Oracle public key using&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- &lt;span class="p"&gt;|&lt;/span&gt; sudo apt-key add -
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I checked that I had the correct key by examining its fingerprint:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;apt-key finger &lt;span class="p"&gt;|&lt;/span&gt; grep VirtualBox -3
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Finally, I installed VirtualBox by running the commands:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;sudo apt-get update
&lt;span class="nv"&gt;$ &lt;/span&gt;sudo apt-get install virtualbox-4.2
&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;Install Vagrant&lt;/h3&gt;
&lt;p&gt;Download the latest version at the &lt;a href="http://downloads.vagrantup.com/"&gt;Vagrant downloads page&lt;/a&gt;,
as of this writing, v1.2.7.  (The version at the Ubuntu repository is a bit
behind the latest.)  Then install it using your package manager.  On 64-bit
Ubuntu 12.04, I ran these commands to install Vagrant:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;wget http://files.vagrantup.com/packages/7ec0ee1d00a916f80b109a298bab08e391945243/vagrant_1.2.7_x86_64.deb
&lt;span class="nv"&gt;$ &lt;/span&gt;sudo dpkg -i vagrant_1.2.7_x86_64.deb
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;a name="configure_vagrant"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;2. Configure Vagrant&lt;/h2&gt;
&lt;p&gt;Next, create a directory where you will manage your Vagrant virtual machine
(&lt;abbr title="virtual machine"&gt;VM&lt;/abbr&gt;), for example,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;mkdir ~/vagrant_devstack
&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;Install Vagrant box&lt;/h3&gt;
&lt;p&gt;Now you need to pick a "box."  Vagrant uses "boxes" as the base image for
creating a virtual environment.  A box is based on a specific operating system
possibly with additional software and configurations.  Vagrant has official
bare-bones &lt;a href="https://github.com/mitchellh/vagrant/wiki/Available-Vagrant-Boxes"&gt;Ubuntu boxes&lt;/a&gt;, and there are also many other
unofficial boxes at the community page located at
&lt;a href="http://www.vagrantbox.es/"&gt;www.vagrantbox.es&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I recommend sticking to the official boxes.  Devstack officially supports Ubuntu
12.04, so install the 64-bit Ubuntu 12.04 box for VirtualBox:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;vagrant box add precise64 http://files.vagrantup.com/precise64.box
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;(Yes, it's confusing that both my host machine and my Vagrant &lt;abbr title="virtual machine"&gt;VM&lt;/abbr&gt; are running
64-bit Ubuntu 12.04 !  Your configuration may differ.)&lt;/p&gt;
&lt;p&gt;A 64-bit OS is preferred, so that you can assign more RAM to your &lt;abbr title="virtual machine"&gt;VM&lt;/abbr&gt;.  Note that
since we are running a 64-bit guest machine on VirtualBox, you need to make sure
that &lt;a href="http://www.virtualbox.org/manual/ch03.html#intro-64bitguests"&gt;hardware virtualization is enabled&lt;/a&gt; on your host
machine.  This may require you to access your machine's BIOS settings.&lt;/p&gt;
&lt;h3&gt;Create and configure Vagrantfile&lt;/h3&gt;
&lt;p&gt;Create a Vagrantfile using the commands&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/vagrant_devstack
&lt;span class="nv"&gt;$ &lt;/span&gt;vagrant init precise64
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;and you should see the output&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This creates a Vagrantfile in the directory where your Vagrant &lt;abbr title="virtual machine"&gt;VM&lt;/abbr&gt; will be
managed.  The Vagrantfile is the configuration file for your Vagrant &lt;abbr title="virtual machine"&gt;VM&lt;/abbr&gt;. &lt;/p&gt;
&lt;p&gt;We are going to setup &lt;a href="http://docs.vagrantup.com/v2/networking/forwarded_ports.html"&gt;port forwarding&lt;/a&gt; and increase the RAM
by altering the Vagrantfile.  Open the Vagrantfile in your favorite text editor
and see if there are any lines matching&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# Create a forwarded port mapping which allows access to a specific port&lt;/span&gt;
&lt;span class="c1"&gt;# within the machine from a port on the host machine. In the example below,&lt;/span&gt;
&lt;span class="c1"&gt;# accessing &amp;quot;localhost:8080&amp;quot; will access port 80 on the guest machine.&lt;/span&gt;
&lt;span class="c1"&gt;# config.vm.network :forwarded_port, guest: 80, host: 8080&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you find the matching lines, uncomment the last line so that you have&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt; &lt;span class="ss"&gt;:forwarded_port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;guest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you don't have the matching lines, then manually copy and paste the above
line to the Vagrantfile.&lt;/p&gt;
&lt;p&gt;We are using port 8080, but you can use another port, as long as it isn't being
used by another process.  We will need port forwarding later to check that
Devstack is working properly.&lt;/p&gt;
&lt;p&gt;The recommended amount of RAM for Devstack is &lt;a href="http://devstack.org/guides/single-vm.html"&gt;at least 2 GB&lt;/a&gt;.  However,
the default RAM in a Vagrant &lt;abbr title="virtual machine"&gt;VM&lt;/abbr&gt; is 360 MB, so we need to change this.    &lt;/p&gt;
&lt;p&gt;Add the following lines to the Vagrantfile:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="ss"&gt;:virtualbox&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;vb&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;vb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customize&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;modifyvm&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;--memory&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;2048&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;My laptop I work on has 8 GB RAM, and it works fine running a 2 GB
Vagrant/VirtualBox &lt;abbr title="virtual machine"&gt;VM&lt;/abbr&gt;.&lt;/p&gt;
&lt;p&gt;Here is a &lt;a href="http://terriyu.info/blog/code/Vagrantfile"&gt;sample Vagrantfile&lt;/a&gt; that configures both port forwarding
and 2 GB RAM.&lt;/p&gt;
&lt;p&gt;&lt;a name="install_devstack"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;3. Install Devstack and Ceilometer&lt;/h2&gt;
&lt;h3&gt;Boot up the Vagrant &lt;abbr title="virtual machine"&gt;VM&lt;/abbr&gt;&lt;/h3&gt;
&lt;p&gt;We are ready to install Devstack and Ceilometer.  First, create the virtual
environment and boot the virtual machine by running the commands&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/vagrant_devstack
&lt;span class="nv"&gt;$ &lt;/span&gt;vagrant up
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;and you should see the output&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;Bringing machine &amp;#39;default&amp;#39; up with &amp;#39;virtualbox&amp;#39; provider...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 =&amp;gt; 2222 (adapter 1)
[default] -- 80 =&amp;gt; 8080 (adapter 1)
[default] Running &amp;#39;pre-boot&amp;#39; VM customizations...
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Mounting shared folders...
[default] -- /vagrant
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now you can SSH into the machine via&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;vagrant ssh
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;and you should see the output&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
Welcome to your Vagrant-built virtual machine.
Last login: Fri Sep 14 06:23:18 2012 from 10.0.2.2
vagrant@precise64:~$
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Check that your virtual machine has 2 GB RAM:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;grep MemTotal /proc/meminfo
MemTotal:        &lt;span class="m"&gt;2051540&lt;/span&gt; kB
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you see a different number, check your Vagrantfile.&lt;/p&gt;
&lt;h3&gt;Install Devstack and Ceilometer&lt;/h3&gt;
&lt;p&gt;Now that you are logged into your Vagrant &lt;abbr title="virtual machine"&gt;VM&lt;/abbr&gt;, the first thing to do is download
and update the package lists from the Ubuntu repositories:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;sudo apt-get update
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Next, install &lt;code&gt;git&lt;/code&gt; and your favorite terminal text editor, for example,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;sudo apt-get install git vim-gtk
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Clone the &lt;a href="https://github.com/openstack-dev/devstack"&gt;Devstack GitHub repository&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~
vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;git clone git://github.com/openstack-dev/devstack.git
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;then copy the sample &lt;code&gt;localrc&lt;/code&gt; to the top-level of the &lt;code&gt;devstack&lt;/code&gt; repository:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/devstack
vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;cp samples/localrc .
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This file &lt;code&gt;localrc&lt;/code&gt; allows you to configure user-defined variables in the
&lt;code&gt;stack.sh&lt;/code&gt; script which installs Devstack. &lt;/p&gt;
&lt;p&gt;&lt;em&gt;(If you previously installed Devstack using the &lt;code&gt;stack.sh&lt;/code&gt; script, you can
start the installation process for Ceilometer here.  The only difference is
that you won't see the prompt for an admin password.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ceilometer is not enabled by default, so add the following to the end of your
&lt;code&gt;localrc&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;# Enable the ceilometer services&lt;/span&gt;
enable_service ceilometer-acompute,ceilometer-acentral,ceilometer-collector,ceilometer-api
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now you are ready to install Devstack and Ceilometer!  This is a CPU intensive
process, so don't run any heavy programs in the background.&lt;/p&gt;
&lt;p&gt;Run the script to do the installation:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;./stack.sh
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;and you should see the output&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;Using mysql database backend

################################################################################
ENTER A SERVICE_TOKEN TO USE FOR THE SERVICE ADMIN TOKEN.
################################################################################
This value will be written to your localrc file so you don&amp;#39;t have to enter it 
again.  Use only alphanumeric characters.
If you leave this blank, a random default value will be used.
Enter a password now:
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Input a password as directed and sit back as everything is installed for you.
It took about 30 minutes to install on my own &lt;abbr title="virtual machine"&gt;VM&lt;/abbr&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/openstack/ceilometer/"&gt;Ceilometer GitHub repository&lt;/a&gt; will be cloned to your
&lt;code&gt;/opt/stack/ceilometer&lt;/code&gt; directory.&lt;/p&gt;
&lt;h3&gt;I already installed Devstack, but not Ceilometer&lt;/h3&gt;
&lt;p&gt;If for whatever reason you already installed Devstack but have not yet installed
Ceilometer, no problem.  You don't have to create a new &lt;abbr title="virtual machine"&gt;VM&lt;/abbr&gt;.  Skip down to the
part in the instructions where it says you should begin if you previously
installed Devstack.&lt;/p&gt;
&lt;h3&gt;Troubleshooting&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If you have any problem whatsoever while running &lt;code&gt;./stack.sh&lt;/code&gt;, it is a good
    idea to check the logs in the directory &lt;code&gt;/opt/stack/logs&lt;/code&gt;.  The screen
    output from running &lt;code&gt;./stack.sh&lt;/code&gt; is saved there and the logs have names
    like &lt;code&gt;stack.sh.log.&amp;lt;date&amp;gt;&lt;/code&gt;.  The most recent log is saved in the file
    &lt;code&gt;stack.sh.log&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you don't see any logs there, then check your Devstack configuration in
the &lt;code&gt;localrc&lt;/code&gt; file.  There should be a line that sets the &lt;code&gt;LOGFILE&lt;/code&gt;
variable, for example,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;LOGFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$DEST&lt;/span&gt;/logs/stack.sh.log
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;For more info, see the "stack.sh logging" section in the
&lt;a href="http://devstack.org/localrc.html"&gt;Devstack stack.sh documentation&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you see an error immediately after running &lt;code&gt;./stack.sh&lt;/code&gt; like&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;ImportError: No module named netaddr
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;then install the dependency &lt;code&gt;python-netaddr&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;sudo apt-get install python-netaddr
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This is a &lt;a href="https://bugs.launchpad.net/devstack/+bug/1097667"&gt;bug&lt;/a&gt; I've encountered, but it should be fixed now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you see many errors of this type while running &lt;code&gt;./stack.sh&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;ERROR:root:Could not find any typelib for GnomeKeyring
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;then install the dependency &lt;code&gt;gir1.2-gnomekeyring-1.0&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;sudo apt-get install gir1.2-gnomekeyring-1.0
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This is a known &lt;a href="https://bugs.launchpad.net/devstack/+bug/1193164"&gt;bug&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If &lt;code&gt;stack.sh&lt;/code&gt; complains that there is no mongo client, then install
    MongoDB packages that are version 2.2 or higher (this is the current
    requirement for Ceilometer).  If there are Ubuntu MongoDB packages with
    version 2.2 or higher for your operating system, you can install them with&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;sudo apt-get install mongodb-clients mongodb-server
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you are using Ubuntu 12.04 (like we are in this guide), as of this
writing,the MongoDB packages for Ubuntu 12.04 are too old (&amp;lt; 2.2).  In
that case, install the 10gen version &lt;code&gt;mongodb-10gen&lt;/code&gt; by following the
&lt;a href="http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/"&gt;instructions here&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="check_devstack"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;4. Check that Devstack is working&lt;/h2&gt;
&lt;p&gt;On your &lt;em&gt;host&lt;/em&gt; machine (not the &lt;abbr title="virtual machine"&gt;VM&lt;/abbr&gt;), open up your browser and point it to the
forwarded port.  If it was 8080, you would use &lt;code&gt;http://localhost:8080/&lt;/code&gt;.  You
should see the OpenStack dashboard page with a login form:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;div style="text-align:center" markdown="1"&gt;
&lt;img alt="OpenStack dashboard" src="http://terriyu.info/blog/images/openstack-dashboard.png" /&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;To login, provide the username &lt;code&gt;admin&lt;/code&gt; and the corresponding password which can
be found in the &lt;code&gt;ADMIN_PASSWORD&lt;/code&gt; variable of your &lt;code&gt;localrc&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;Go to the project page at &lt;code&gt;http://localhost:8080/project/&lt;/code&gt; and you should be
able to see quotas like &lt;code&gt;Instances Used 0 of 10&lt;/code&gt;, &lt;code&gt;VCPUs Used 0 of 20&lt;/code&gt;,
&lt;code&gt;RAM Used 0 MB of 51,200 MB&lt;/code&gt;, etc.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;div style="text-align:center" markdown="1"&gt;
&lt;img alt="OpenStack dashboard - Project" src="http://terriyu.info/blog/images/openstack-dashboard-project.png" /&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;If you go to the system info page at &lt;code&gt;http://localhost:8080/admin/info/&lt;/code&gt;, you should be able to see all the
enabled services:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;div style="text-align:center" markdown="1"&gt;
&lt;img alt="Openstack dashboard - System Info" src="http://terriyu.info/blog/images/openstack-dashboard-system-info.png" /&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;including &lt;code&gt;nova&lt;/code&gt;, &lt;code&gt;glance&lt;/code&gt;, &lt;code&gt;ceilometer&lt;/code&gt;, etc.&lt;/p&gt;
&lt;p&gt;&lt;a name="configure_ceilometer"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;5. Configure Devstack for Ceilometer&lt;/h2&gt;
&lt;p&gt;We want to enable auditing events for Nova and Cinder, so that Ceilometer can
collect data from them.  As stated in the
&lt;a href="http://docs.openstack.org/developer/ceilometer/install/development.html"&gt;Ceilometer documentation&lt;/a&gt;, do the following.  First, check to
see if the Nova configuration file &lt;code&gt;/etc/nova/nova.conf&lt;/code&gt; contains a line:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;instance_usage_audit = True
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If the line does not exist, add it to the file.&lt;/p&gt;
&lt;p&gt;Second, add this line to the end of the Cinder configuration file
&lt;code&gt;/etc/cinder/cinder.conf&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;notification_driver=cinder.openstack.common.notifier.rpc_notifier
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;if it doesn't already exist.&lt;/p&gt;
&lt;p&gt;&lt;a name="check_ceilometer"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;6. Check that Ceilometer is collecting data&lt;/h2&gt;
&lt;p&gt;We can check that Ceilometer is collecting data by starting up the MongoDB
shell, connecting to the Ceilometer database, and examining the data.&lt;/p&gt;
&lt;p&gt;First, start up the MongoDB shell and connect to the Ceilometer database by
running&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;mongo ceilometer
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;which should produce the output&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;MongoDB shell version: 2.0.4
connecting to: ceilometer
&amp;gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;and leave you at the prompt.&lt;/p&gt;
&lt;p&gt;Ask for the number of samples that have been collected: &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&amp;gt; db.meter.stats().count
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You should get a number greater than 0; I got 19 samples.  As time goes on, the
number will increase.&lt;/p&gt;
&lt;p&gt;The command &lt;code&gt;db.meter.findOne()&lt;/code&gt; should return the information for one sample,
for example,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&amp;gt; db.meter.findOne()
{
    &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;51f85d6a56c02c63d2d503b3&amp;quot;),
    &amp;quot;counter_name&amp;quot; : &amp;quot;image.upload&amp;quot;,
    &amp;quot;user_id&amp;quot; : null,
    &amp;quot;message_signature&amp;quot; : &amp;quot;3986da6d1ac0ef522f11c52dbf76119d9f93c79204fa3ca373017c78acb751a7&amp;quot;,
    &amp;quot;timestamp&amp;quot; : ISODate(&amp;quot;2013-07-31T00:42:17.639Z&amp;quot;),
    &amp;quot;resource_id&amp;quot; : &amp;quot;6fd80822-b6e5-4a8c-8e37-caec037ff19b&amp;quot;,
    &amp;quot;resource_metadata&amp;quot; : {
        &amp;quot;status&amp;quot; : &amp;quot;saving&amp;quot;,
        &amp;quot;created_at&amp;quot; : &amp;quot;2013-07-31T00:42:17&amp;quot;,
        &amp;quot;event_type&amp;quot; : &amp;quot;image.upload&amp;quot;,
        &amp;quot;deleted&amp;quot; : false,
        &amp;quot;container_format&amp;quot; : &amp;quot;aki&amp;quot;,
        &amp;quot;min_ram&amp;quot; : 0,
        &amp;quot;disk_format&amp;quot; : &amp;quot;aki&amp;quot;,
        &amp;quot;updated_at&amp;quot; : &amp;quot;2013-07-31T00:42:17&amp;quot;,
        &amp;quot;name&amp;quot; : &amp;quot;cirros-0.3.1-x86_64-uec-kernel&amp;quot;,
        &amp;quot;min_disk&amp;quot; : 0,
        &amp;quot;host&amp;quot; : &amp;quot;precise64&amp;quot;,
        &amp;quot;protected&amp;quot; : false,
        &amp;quot;id&amp;quot; : &amp;quot;6fd80822-b6e5-4a8c-8e37-caec037ff19b&amp;quot;,
        &amp;quot;checksum&amp;quot; : &amp;quot;c352f4e7121c6eae958bc1570324f17e&amp;quot;,
        &amp;quot;owner&amp;quot; : &amp;quot;728bca2e0c5147e6952427de5a21f90e&amp;quot;,
        &amp;quot;is_public&amp;quot; : true,
        &amp;quot;deleted_at&amp;quot; : null,
        &amp;quot;properties&amp;quot; : {

        },
        &amp;quot;size&amp;quot; : 4955792
    },
    &amp;quot;source&amp;quot; : &amp;quot;openstack&amp;quot;,
    &amp;quot;counter_unit&amp;quot; : &amp;quot;image&amp;quot;,
    &amp;quot;counter_volume&amp;quot; : 1,
    &amp;quot;project_id&amp;quot; : &amp;quot;728bca2e0c5147e6952427de5a21f90e&amp;quot;,
    &amp;quot;message_id&amp;quot; : &amp;quot;0d41abf8-f97a-11e2-b536-080027880ca6&amp;quot;,
    &amp;quot;counter_type&amp;quot; : &amp;quot;delta&amp;quot;
 }
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Running the command &lt;code&gt;show collections&lt;/code&gt; lists all the other MongoDB collections
you can look at, for example,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&amp;gt; show collections
meter
project
resource
system.indexes
user
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The &lt;a href="http://docs.openstack.org/developer/ceilometer/glossary.html"&gt;Ceilometer documentation glossary&lt;/a&gt; defines some of
these terms "meter", "project", "resource", "user".&lt;/p&gt;
&lt;p&gt;You could list all the defined indexes using&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&amp;gt; db.system.indexes.find()
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;which on my &lt;abbr title="virtual machine"&gt;VM&lt;/abbr&gt; gave the output&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;{ &amp;quot;v&amp;quot; : 1, &amp;quot;key&amp;quot; : { &amp;quot;_id&amp;quot; : 1 }, &amp;quot;ns&amp;quot; : &amp;quot;ceilometer.resource&amp;quot;, &amp;quot;name&amp;quot; : &amp;quot;_id_&amp;quot; }
{ &amp;quot;v&amp;quot; : 1, &amp;quot;key&amp;quot; : { &amp;quot;user_id&amp;quot; : 1, &amp;quot;source&amp;quot; : 1 }, &amp;quot;ns&amp;quot; : &amp;quot;ceilometer.resource&amp;quot;, &amp;quot;name&amp;quot; : &amp;quot;resource_idx&amp;quot; }
{ &amp;quot;v&amp;quot; : 1, &amp;quot;key&amp;quot; : { &amp;quot;_id&amp;quot; : 1 }, &amp;quot;ns&amp;quot; : &amp;quot;ceilometer.meter&amp;quot;, &amp;quot;name&amp;quot; : &amp;quot;_id_&amp;quot; }
{ &amp;quot;v&amp;quot; : 1, &amp;quot;key&amp;quot; : { &amp;quot;resource_id&amp;quot; : 1, &amp;quot;user_id&amp;quot; : 1, &amp;quot;counter_name&amp;quot; : 1, &amp;quot;timestamp&amp;quot; : 1, &amp;quot;source&amp;quot; : 1 }, &amp;quot;ns&amp;quot; : &amp;quot;ceilometer.meter&amp;quot;, &amp;quot;name&amp;quot; : &amp;quot;meter_idx&amp;quot; }
{ &amp;quot;v&amp;quot; : 1, &amp;quot;key&amp;quot; : { &amp;quot;timestamp&amp;quot; : -1 }, &amp;quot;ns&amp;quot; : &amp;quot;ceilometer.meter&amp;quot;, &amp;quot;name&amp;quot; : &amp;quot;timestamp_idx&amp;quot; }
{ &amp;quot;v&amp;quot; : 1, &amp;quot;key&amp;quot; : { &amp;quot;_id&amp;quot; : 1 }, &amp;quot;ns&amp;quot; : &amp;quot;ceilometer.user&amp;quot;, &amp;quot;name&amp;quot; : &amp;quot;_id_&amp;quot; }
{ &amp;quot;v&amp;quot; : 1, &amp;quot;key&amp;quot; : { &amp;quot;_id&amp;quot; : 1 }, &amp;quot;ns&amp;quot; : &amp;quot;ceilometer.project&amp;quot;, &amp;quot;name&amp;quot; : &amp;quot;_id_&amp;quot; }
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;These indexes speed up searching and sorting on MongoDB data.&lt;/p&gt;
&lt;p&gt;Type &lt;code&gt;exit&lt;/code&gt; to leave the MongoDB shell and return to bash.&lt;/p&gt;
&lt;p&gt;For more information about MongoDB shell commands, see the
&lt;a href="http://docs.mongodb.org/manual/"&gt;official MongoDB documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a name="ceilometer_tests"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;7. Run Ceilometer tests&lt;/h2&gt;
&lt;p&gt;The &lt;a href="http://docs.openstack.org/developer/ceilometer/contributing/source.html#running-the-tests"&gt;Ceilometer documentation&lt;/a&gt; explains how to setup and run unit
tests.  First, install the package &lt;code&gt;tox&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;sudo pip install tox
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Then install the test dependencies:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;sudo pip install -r /opt/stack/ceilometer/test-requirements.txt
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This will take at least a few minutes to run.  If the dependencies were
installed correctly, you should get a message that looks similar to&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;Successfully installed discover mock swift netifaces sphinxcontrib-pecanwsme docutils oslo.sphinx testscenarios nova dnspython sphinxcontrib-httpdomain
Cleaning up...
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Run the entire test suite in Python 2.7 and check for PEP8 style errors:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /opt/stack/ceilometer/
vagrant@precise64:/opt/stack/ceilometer&lt;span class="nv"&gt;$ &lt;/span&gt;tox -e py27,pep8
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This will take a while.  On my &lt;abbr title="virtual machine"&gt;VM&lt;/abbr&gt;, the tests took 10 - 15 minutes to run.&lt;/p&gt;
&lt;p&gt;If everything runs correctly, you will get a message similar to&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;  py27: commands succeeded
  pep8: commands succeeded
  congratulations :)
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The OpenStack dashboard is working, Ceilometer is collecting samples, and the
unit tests pass.  Congratulations!  You have a working Devstack and Ceilometer!&lt;/p&gt;
&lt;h3&gt;More ways to run tests&lt;/h3&gt;
&lt;p&gt;The Ceilometer unit tests are run using &lt;code&gt;testr&lt;/code&gt; (&lt;a href="https://testrepository.readthedocs.org/en/latest/MANUAL.html"&gt;manual here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;You can also run just the Python 2.7 tests&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;tox -e py27
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;or just the PEP8 tests&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;tox -e pep8
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you don't need to run the whole test suite, you can run a group of tests.
To run the Python 2.7 tests in the &lt;code&gt;tests/storage&lt;/code&gt; directory of the Ceilometer
code, you would execute&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;tox -e py27 -- storage
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you want to run just a single test from &lt;code&gt;tests/storage&lt;/code&gt;, you need to use the
entire file path:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64~&lt;span class="nv"&gt;$ &lt;/span&gt;tox -e py27 -- tests.storage.test_impl_mongodb.MeterTest.test_get_meters_by_metaquery
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Here we're running the &lt;code&gt;test_get_meters_by_metaquery&lt;/code&gt; test for the MongoDB
storage driver.&lt;/p&gt;
&lt;p&gt;Anything after &lt;code&gt;--&lt;/code&gt; is treated as an argument for testr.  Each argument is
treated as a regular expression.  That leads to an interesting scenario.&lt;/p&gt;
&lt;p&gt;When you are running tests in &lt;code&gt;testr&lt;/code&gt; by path, be careful if your specified
path is a substring of other paths.  For example, if you run the test
&lt;code&gt;test_get_meters&lt;/code&gt; using the command&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64~&lt;span class="nv"&gt;$ &lt;/span&gt;tox -e py27 -- tests.storage.test_impl_mongodb.MeterTest.test_get_meters
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;the following tests will be executed -- &lt;code&gt;test_get_meters&lt;/code&gt;,
&lt;code&gt;test_get_meters_by_user&lt;/code&gt;, &lt;code&gt;test_get_meters_by_project&lt;/code&gt;,
&lt;code&gt;test_get_meters_by_metaquery&lt;/code&gt;, &lt;code&gt;test_get_meters_by_empty metaquery&lt;/code&gt; -- because
they all start with &lt;code&gt;test_get_meters&lt;/code&gt; and are counted as matches by the regex
filter.&lt;/p&gt;
&lt;h3&gt;Troubleshooting&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If you see an error message &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;StorageBadVersion&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Need&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;least&lt;/span&gt; &lt;span class="n"&gt;MongoDB&lt;/span&gt; &lt;span class="mf"&gt;2.2&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;then your MongoDB version is too old and you need to install MongoDB
packages that are version 2.2 or higher (this is the current
requirement for Ceilometer).  &lt;/p&gt;
&lt;p&gt;If there are Ubuntu MongoDB packages with version 2.2 or higher for your
operating system, you can install them with&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;sudo apt-get install mongodb-clients mongodb-server
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you are using Ubuntu 12.04 (like we are in this guide), as of this
writing,the MongoDB packages for Ubuntu 12.04 are too old (&amp;lt; 2.2).  In
that case, install the 10gen version &lt;code&gt;mongodb-10gen&lt;/code&gt; by following the
&lt;a href="http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/"&gt;instructions here&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you see the following error while installing the requirements:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;No package &amp;#39;libffi&amp;#39; found
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;then install the missing dependency with&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;sudo apt-get install libffi-dev
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This is a known &lt;a href="https://bugs.launchpad.net/openstack-ci/+bug/1203198"&gt;bug&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you get the following error while installing the requirements:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;RuntimeError: No package configuration found for: nspr
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;then install the missing dependencies with&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;sudo apt-get install pkg-config libnspr4-dev
&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you get this error while installing the requirements that says&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;ERROR: /bin/sh: 1: xslt-config: not found

** make sure the development packages of libxml2 and libxslt are installed **
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;then install the missing dependencies with&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;sudo apt-get install libxml2-dev libxslt1-dev
&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If all else fails, try rebuilding the test environment with the &lt;code&gt;-r&lt;/code&gt; flag:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vagrant@precise64:~&lt;span class="nv"&gt;$ &lt;/span&gt;tox -r -e py27
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This can take anywhere between 15 minutes to an hour depending on the
configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name="references"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;8. References&lt;/h2&gt;
&lt;p&gt;I've mentioned some references to documentation along the way, here's a
summarized list of them, plus a couple more.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://docs.vagrantup.com/v2/"&gt;Vagrant documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is v2 of the documentation for Vagrant.  However, I sometimes find it
 helpful to look at the deprecated &lt;a href="http://docs-v1.vagrantup.com/v1/docs/"&gt;documentation for v1&lt;/a&gt;.
 The v1 documentation sometimes contains details that are not present in the
 v2 documentation and yet are still applicable to the latest version of
 Vagrant.  The Vagrant commands I use most often are &lt;code&gt;vagrant up&lt;/code&gt; (boot up
 the &lt;abbr title="virtual machine"&gt;VM&lt;/abbr&gt;), &lt;code&gt;vagrant ssh&lt;/code&gt; (ssh into the &lt;abbr title="virtual machine"&gt;VM&lt;/abbr&gt;), &lt;code&gt;vagrant init&lt;/code&gt; (create a
 Vagrantfile in preparation for making a new &lt;abbr title="virtual machine"&gt;VM&lt;/abbr&gt;), and &lt;code&gt;vagrant destroy&lt;/code&gt;
 (permanently destroy the data I've accumulated while working in the &lt;abbr title="virtual machine"&gt;VM&lt;/abbr&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.virtualbox.org/wiki/Documentation"&gt;VirtualBox documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://devstack.org/"&gt;Devstack documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Also, check out the &lt;a href="http://devstack.org/stack.sh.html"&gt;code annotations&lt;/a&gt; for the
 Devstack &lt;code&gt;stack.sh&lt;/code&gt; script&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://docs.openstack.org/developer/ceilometer/install/development.html"&gt;Ceilometer documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://docs.mongodb.org/manual/"&gt;MongoDB documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://testrepository.readthedocs.org/en/latest/MANUAL.html"&gt;testr documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</summary><category term="foss"></category><category term="openstack"></category><category term="opw"></category><category term="software"></category></entry><entry><title>Why OpenStack</title><link href="http://terriyu.info/blog/posts/2013/07/why-openstack/" rel="alternate"></link><updated>2013-07-17T00:00:00-04:00</updated><author><name>Terri Yu</name></author><id>tag:terriyu.info,2013-07-17:blog/posts/2013/07/why-openstack/</id><summary type="html">&lt;!-- PELICAN_BEGIN_SUMMARY --&gt;

&lt;div style="text-align:center"&gt;
&lt;p&gt;&lt;img alt="OpenStack community logo" src="http://terriyu.info/blog/images/openstack-cloud-software-vertical-small.png" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Recently, &lt;a href="http://justwriteclick.com/"&gt;Anne Gentle&lt;/a&gt;, the 
&lt;a href="https://wiki.gnome.org/OutreachProgramForWomen/2013/JuneSeptember#OpenStack"&gt;OpenStack Outreach Program for Women&lt;/a&gt; coordinator, told me it
would be interesting to know what made OpenStack appealing to me personally.
I'll try to answer that question here.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;p&gt;A major constraint is simply that I applied to the
&lt;a href="https://wiki.gnome.org/OutreachProgramForWomen/"&gt;Outreach Program for Women&lt;/a&gt; and there are a limited number of
organizations to choose from.  Still, there are 19 organizations and that is a
quite a few to choose from!  Why OpenStack?&lt;/p&gt;
&lt;p&gt;I was interested in working on a project with great impact and that had 
some relevance to my science background.  &lt;/p&gt;
&lt;p&gt;Not to belittle other organizations, but I think it's easy to argue that
&lt;a href="http://www.openstack.org/"&gt;OpenStack&lt;/a&gt; is an extremely important project with broad interest to
many groups.  I counted 61 official corporate sponsors on
&lt;a href="https://www.openstack.org/foundation/companies/"&gt;this page&lt;/a&gt;.  There are many impressive names on the list
ranging from FOSS (Ubuntu, RedHat, Rackspace) to bluechip tech (IBM, HP, Intel) 
to communications (AT&amp;amp;T, Comcast) to storage (Seagate, Hitachi) and many others
that I'm omitting.  Large is not necessarily equal to significance, but this
&lt;a href="http://www.openstack.org/themes/openstack/images/thirdanniversary/os_timeline.png"&gt;infographic&lt;/a&gt; shows how rapidly OpenStack has grown in 3
short years.&lt;/p&gt;
&lt;p&gt;Regarding my interest in science, both
&lt;a href="http://www.openstack.org/user-stories/argonne-national-laboratory-us-department-of-energy/building-high-performance-clouds/"&gt;Argonne National Laboratory&lt;/a&gt; and 
&lt;a href="http://www.openstack.org/user-stories/sdsc/"&gt;San Diego Supercomputer Center&lt;/a&gt; have been using OpenStack, and they are
major national science labs in the USA.  My sister's PhD advisor in linguistics,
when he learned that I was working on OpenStack, remarked that he was glad
because "OpenStack is an important project."  As someone who's enthused about
numerics and computational science, I'm excited about the prospect of scientists
crunching large-scale calculations about the origins of the universe or protein
folding on a FOSS cloud running OpenStack. &lt;/p&gt;
&lt;p&gt;On a personal level, I have observed how deeply embedded cloud computing has
become in our everyday lives.  I was thinking about how much I use Gmail.  I
don't know how I would replace it with a FOSS alternative; it's hard to beat
the security and widespread accessibility of Gmail.  I'm not aware of any FOSS
email tool that can be accessed and synced reliably on desktop browser, POP
email client, tablet, and phone.  I also stream music, host GBs of photos, and
share social media -- all from the (corporate) cloud.  &lt;/p&gt;
&lt;p&gt;Knowing that OpenStack is actively being developed gives me the piece of mind, 
that someday technologically minded people, including myself, could do all 
those things from our own personal clouds or start their own smaller "indie"
versions of Gmail, Facebook, Twitter, etc.  In particular, for government
agencies and scientific labs, it makes more sense (at least to me) to use FOSS
that is more politically neutral, transparent, and accessible to the general
public.  If government funded institutions use corporate clouds, they might get
locked into a particular stack of software.  From my experience with the 
&lt;a href="http://terriyu.info/blog/posts/2013/06/hack-western-mass/"&gt;National Day of Civic Hacking&lt;/a&gt;, I saw how crucial it is
for the government to use FOSS tools, so that vigilant citizens
can examine the data for themselves. &lt;/p&gt;
&lt;p&gt;Moreover, I always want to be expanding my knowledge.  Cloud computing and
software/infrastructure as a service are topics for which I have very little
technical understanding.  I'd also like to learn enough that I explain what
cloud computing is to non-technical friends and family; in general, I'd like to
educate the public about the software they rely on! &lt;/p&gt;
&lt;p&gt;There are a couple more, less lofty reasons that I became an OpenStack
contributor.  I'm interested in getting a job in the software industry, but
don't have any experience working on large scale, multiple user projects.
Working on a project like OpenStack gives me credibility because of its scale,
complexity, significance, and strong reputation. &lt;/p&gt;
&lt;p&gt;Another reason I liked OpenStack was that it used Python, a language I know and
enjoy using.  It's also nice that Python is quite popular in general and
extensively used in the scientific community.  I didn't want to work in a
language I disliked or that was too obscure. &lt;/p&gt;
&lt;p&gt;As I finish writing this post, I realize that I would have wanted to contribute 
to OpenStack even if FOSS internship programs were unavailable.  There are so
many good reasons to contribute to the project, including the fact that everyone
in the community has been so welcoming and supportive.  I just wish they had
publicized themselves more at universities, so I could have known about the
organization sooner.&lt;/p&gt;
&lt;p&gt;Here's to a long life for OpenStack! &lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Since I'm new to open source software, cloud computing, and OpenStack, my
  answer might be a bit naive or technically incorrect.  My apologies in
  advance.&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</summary><category term="foss"></category><category term="openstack"></category><category term="opw"></category><category term="software"></category></entry><entry><title>How I setup Pelican</title><link href="http://terriyu.info/blog/posts/2013/07/pelican-setup/" rel="alternate"></link><updated>2013-07-01T00:00:00-04:00</updated><author><name>Terri Yu</name></author><id>tag:terriyu.info,2013-07-01:blog/posts/2013/07/pelican-setup/</id><summary type="html">&lt;!-- PELICAN_BEGIN_SUMMARY --&gt;

&lt;div style="text-align:center"&gt;
&lt;p&gt;&lt;img alt="Pelican logo and GitHub account" src="http://terriyu.info/blog/images/pelican-800px.png" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;DISCLAIMER: This information may be out-of-date.  This post was written using
Pelican version 3.2 and the themes and plugins in July 2013. However, last I
checked (August 2015), almost everything still works.&lt;/p&gt;
&lt;p&gt;I thought it would be useful to go into greater technical detail about how I
went about setting up Pelican.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;My machine is running Ubuntu 12.04 LTS.&lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;p&gt;Summary:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install Pelican and its dependencies in a virtual environment.  &lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;pelican-quick-start&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;Fork the &lt;a href="https://github.com/getpelican/pelican-themes"&gt;Pelican themes&lt;/a&gt; and
   &lt;a href="https://github.com/getpelican/pelican-plugins"&gt;Pelican plugins&lt;/a&gt; on GitHub
   and clone the forks onto my local machine.  &lt;/li&gt;
&lt;li&gt;Modify Pelican themes to my taste.  I modified the bootstrap theme.&lt;/li&gt;
&lt;li&gt;Make additional directories inside &lt;code&gt;content&lt;/code&gt; directory.&lt;/li&gt;
&lt;li&gt;Modify settings in &lt;code&gt;pelicanconf.py&lt;/code&gt; and &lt;code&gt;publishconf.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Setup &lt;a href="http://www.google.com/analytics/"&gt;Google Analytics&lt;/a&gt;/&lt;a href="http://piwik.org/"&gt;Piwik&lt;/a&gt; 
   and &lt;a href="http://disqus.com/"&gt;Disqus&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Demonstration&lt;/h2&gt;
&lt;p&gt;If you'd like to see some of Pelican's features in action
(Markdown, formatting, &lt;span class="math"&gt;\(\LaTeX\)&lt;/span&gt;, etc.), see my earlier post on
&lt;a href="http://terriyu.info/blog/posts/2013/06/pelican-demo/"&gt;demonstrating Pelican&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Installing Pelican and dependencies&lt;/h2&gt;
&lt;p&gt;To install Pelican and other Python package dependencies in a virtual 
environment, I followed the instructions in the official 
&lt;a href="http://docs.getpelican.com/en/3.2/getting_started.html#installing-pelican"&gt;Pelican documentation&lt;/a&gt;. &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="gp"&gt;$&lt;/span&gt; virtualenv ~/virtualenvs/pelican
&lt;span class="gp"&gt;$&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ~/virtualenvs/pelican
&lt;span class="gp"&gt;$&lt;/span&gt; . bin/activate
&lt;span class="gp"&gt;$&lt;/span&gt; pip install pelican
&lt;span class="gp"&gt;$&lt;/span&gt; pip install Markdown
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Don't use &lt;code&gt;sudo pip&lt;/code&gt; when installing these Python packages in a virtual 
environment, otherwise you'll end up installing them globally which defeats the 
purpose of using virtual environments.&lt;/p&gt;
&lt;p&gt;I wanted to use &lt;a href="http://daringfireball.net/projects/markdown"&gt;Markdown&lt;/a&gt; to write
my blog posts, so I needed to install the Python Markdown package in the last
line.  By default, Pelican uses a 
&lt;a href="http://pythonhosted.org/Markdown/extensions/extra.html"&gt;flavor of Markdown&lt;/a&gt;
that mostly follows 
&lt;a href="http://michelf.ca/projects/php-markdown/extra/"&gt;PHP Markdown Extra&lt;/a&gt;.  I
especially like using the 
&lt;a href="http://pythonhosted.org/Markdown/extensions/footnotes.html"&gt;footnotes extension&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After you're done working with Pelican, you can leave the virtual environment
with&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="gp"&gt;$&lt;/span&gt; deactivate
&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;Running pelican-quickstart&lt;/h2&gt;
&lt;p&gt;Here are the configuration options I used for &lt;code&gt;pelican-quickstart&lt;/code&gt;.  The details
for SSH upload have been anonymized for security reasons.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="gp"&gt;$&lt;/span&gt; pelican-quickstart
&lt;span class="go"&gt;Welcome to pelican-quickstart v3.2.2.&lt;/span&gt;

&lt;span class="go"&gt;This script will help you create a new Pelican-based website.&lt;/span&gt;

&lt;span class="go"&gt;Please answer the following questions so this script can generate the files&lt;/span&gt;
&lt;span class="go"&gt;needed by Pelican.&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt; Where &lt;span class="k"&gt;do&lt;/span&gt; you want to create your new web site? &lt;span class="o"&gt;[&lt;/span&gt;.&lt;span class="o"&gt;]&lt;/span&gt; blog
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt; What will be the title of this web site? terriyu@/media/blog 
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt; Who will be the author of this web site? Terri Yu 
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt; What will be the default language of this web site? &lt;span class="o"&gt;[&lt;/span&gt;en&lt;span class="o"&gt;]&lt;/span&gt; 
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt; Do you want to specify a URL prefix? e.g., http://example.com   &lt;span class="o"&gt;(&lt;/span&gt;Y/n&lt;span class="o"&gt;)&lt;/span&gt; Y
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt; What is your URL prefix? &lt;span class="o"&gt;(&lt;/span&gt;see above example&lt;span class="p"&gt;;&lt;/span&gt; no trailing slash&lt;span class="o"&gt;)&lt;/span&gt; http://terriyu.info
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt; Do you want to &lt;span class="nb"&gt;enable &lt;/span&gt;article pagination? &lt;span class="o"&gt;(&lt;/span&gt;Y/n&lt;span class="o"&gt;)&lt;/span&gt; Y
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt; How many articles per page &lt;span class="k"&gt;do&lt;/span&gt; you want? &lt;span class="o"&gt;[&lt;/span&gt;10&lt;span class="o"&gt;]&lt;/span&gt; 
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt; Do you want to generate a Makefile to easily manage your website? &lt;span class="o"&gt;(&lt;/span&gt;Y/n&lt;span class="o"&gt;)&lt;/span&gt; Y
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt; Do you want an auto-reload &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; simpleHTTP script to assist with theme and site development? &lt;span class="o"&gt;(&lt;/span&gt;Y/n&lt;span class="o"&gt;)&lt;/span&gt; Y
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt; Do you want to upload your website using FTP? &lt;span class="o"&gt;(&lt;/span&gt;y/N&lt;span class="o"&gt;)&lt;/span&gt; N
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt; Do you want to upload your website using SSH? &lt;span class="o"&gt;(&lt;/span&gt;y/N&lt;span class="o"&gt;)&lt;/span&gt; Y
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt; What is the hostname of your SSH server? &lt;span class="o"&gt;[&lt;/span&gt;localhost&lt;span class="o"&gt;]&lt;/span&gt; ip.add.ress
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt; What is the port of your SSH server? &lt;span class="o"&gt;[&lt;/span&gt;22&lt;span class="o"&gt;]&lt;/span&gt; 
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt; What is your username on that server? &lt;span class="o"&gt;[&lt;/span&gt;root&lt;span class="o"&gt;]&lt;/span&gt; username 
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt; Where &lt;span class="k"&gt;do&lt;/span&gt; you want to put your web site on that server? &lt;span class="o"&gt;[&lt;/span&gt;/var/www&lt;span class="o"&gt;]&lt;/span&gt; /somedirectory 
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt; Do you want to upload your website using Dropbox? &lt;span class="o"&gt;(&lt;/span&gt;y/N&lt;span class="o"&gt;)&lt;/span&gt; N
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt; Do you want to upload your website using S3? &lt;span class="o"&gt;(&lt;/span&gt;y/N&lt;span class="o"&gt;)&lt;/span&gt; N
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I enabled article pagination so that I didn't end up with all the posts on a
single page.  The &lt;code&gt;Makefile&lt;/code&gt; is incredibly useful, so I enabled that.  It allows
you to compile the website with &lt;code&gt;make html&lt;/code&gt; or &lt;code&gt;make devserver&lt;/code&gt;.  Usually, when
I want to test my website, I run &lt;code&gt;make clean&lt;/code&gt; (to delete any previously 
generated files), followed by &lt;code&gt;make devserver&lt;/code&gt; to run a fake server on my local
machine.  I find that &lt;code&gt;make devserver&lt;/code&gt; is a better simulation of the website
than &lt;code&gt;make html&lt;/code&gt;.  I'm not sure what the auto-reload &amp;amp; simpleHTTP script is, but
I enabled it just in case.&lt;/p&gt;
&lt;p&gt;When I'm ready to upload my content to the web host, there are a variety of 
options.  I don't enable FTP upload because it's not very secure.  I try to
stick with some transfer method that uses SSH.  You can use &lt;code&gt;make ssh_upload&lt;/code&gt;
which works fine, but I prefer &lt;code&gt;make rsync_upload&lt;/code&gt; which uploads using &lt;code&gt;rsync&lt;/code&gt;
and SSH.  Unlike &lt;code&gt;make ssh_upload&lt;/code&gt; which uses &lt;code&gt;scp&lt;/code&gt; and uploads everything, the 
&lt;code&gt;rsync&lt;/code&gt; command only sends incremental changes, which makes your data transfer 
much more efficient. &lt;/p&gt;
&lt;p&gt;All the &lt;code&gt;make&lt;/code&gt; commands have to be run in the same directory as the &lt;code&gt;Makefile&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Fork and clone the GitHub repos for pelican-themes and pelican-plugins&lt;/h2&gt;
&lt;p&gt;I wanted to modify the official 
&lt;a href="https://github.com/getpelican/pelican-themes"&gt;Pelican themes&lt;/a&gt; and 
&lt;a href="https://github.com/getpelican/pelican-plugins"&gt;Pelican plugins&lt;/a&gt;, and have them
under version control, so I performed the standard procedure of forking the 
GitHub repos and cloning the forks.  My procedure was very similar to the
&lt;a href="https://help.github.com/articles/fork-a-repo"&gt;GitHub help page&lt;/a&gt; except I cloned
using the SSH address rather than the https address.&lt;/p&gt;
&lt;h2&gt;Modify Pelican theme to taste&lt;/h2&gt;
&lt;p&gt;I am using the bootstrap theme.  I modified it in the following way:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Modified &lt;code&gt;static/bootstrap.min.css&lt;/code&gt;&lt;ul&gt;
&lt;li&gt;Increased font size and line height&lt;/li&gt;
&lt;li&gt;Changed sizes and alignment of top bar, sidebar, and content&lt;/li&gt;
&lt;li&gt;Eliminated line in page header&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Modified &lt;code&gt;bootstrap/static/local.css&lt;/code&gt;&lt;ul&gt;
&lt;li&gt;Changed icons to use 
  &lt;a href="http://fortawesome.github.io/Font-Awesome/"&gt;Font Awesome&lt;/a&gt;'s set&lt;/li&gt;
&lt;li&gt;Changed alignment of icons&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Modified &lt;code&gt;static/pygments.css&lt;/code&gt; to use the perldoc colors by
  &lt;a href="http://pygments.org/docs/cmdline/#generating-styles"&gt;generating a CSS stylesheet&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Added code to &lt;code&gt;templates/article.html&lt;/code&gt; for neighboring links.  This means that
  if you are on a post, you will see a link for the previous post and a link
  for the next post.  You need to enable the 
  &lt;a href="https://github.com/getpelican/pelican-plugins/tree/master/neighbors"&gt;neighbors plugin&lt;/a&gt; 
  for this to work. &lt;/li&gt;
&lt;li&gt;Modified &lt;code&gt;templates/base.html&lt;/code&gt;&lt;ul&gt;
&lt;li&gt;Added code for including &lt;span class="math"&gt;\(\LaTeX\)&lt;/span&gt;.  For this to work, you need to enable
  the &lt;a href="https://github.com/getpelican/pelican-plugins/tree/master/latex"&gt;latex plugin&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Added code for including Piwik content&lt;/li&gt;
&lt;li&gt;Altered sidebar links&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Modified &lt;code&gt;templates/index.html&lt;/code&gt; to change look of the more... link in the 
  summaries, got rid of the permalink line, and added the date before each post 
  title&lt;/li&gt;
&lt;li&gt;Modified &lt;code&gt;templates/metadata.html&lt;/code&gt; to use the variable &lt;code&gt;article.locale_date&lt;/code&gt;
  instead of &lt;code&gt;article.date&lt;/code&gt; so that it uses my &lt;code&gt;DEFAULT_DATE_FORMAT&lt;/code&gt; variable
  in &lt;code&gt;pelicanconf.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;templates/piwik.html&lt;/code&gt; (copied from bootstrap2 theme) for Piwik support&lt;/li&gt;
&lt;li&gt;Modified &lt;code&gt;templates/tags.html&lt;/code&gt; to sort tags in alphabetical order &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To sort tags in alphabetical order, use&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;{% for tag, articles in tags|sort %}
&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;Make additional directories inside content directory&lt;/h2&gt;
&lt;p&gt;I made directories &lt;code&gt;2013&lt;/code&gt;, &lt;code&gt;images&lt;/code&gt;, and &lt;code&gt;pages&lt;/code&gt; in the &lt;code&gt;content&lt;/code&gt; 
directory.  This is the way I organized my content.  Posts in 2013 go into 
&lt;code&gt;2013&lt;/code&gt;, photos go into &lt;code&gt;images&lt;/code&gt;, and special non-chronological content goes into 
&lt;code&gt;pages&lt;/code&gt;.  I plan to make a new directory for each year and it would contain the 
posts for that particular year.  The only directory that has to have a specific 
name is &lt;code&gt;pages&lt;/code&gt;.  Pelican treats this name as special.  My 
&lt;a href="http://terriyu.info/blog/pages/about-me.html"&gt;About page&lt;/a&gt; is contained inside the directory 
&lt;code&gt;pages&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For more information about the file hierarchy, see the 
&lt;a href="http://docs.getpelican.com/en/3.2/getting_started.html#kickstart-your-site"&gt;Pelican documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Modify settings in pelicanconf.py and publishconf.py&lt;/h2&gt;
&lt;p&gt;This is my &lt;code&gt;pelicanconf.py&lt;/code&gt; file.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;span class="c"&gt;# -*- coding: utf-8 -*- #&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;__future__&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;unicode_literals&lt;/span&gt;

&lt;span class="n"&gt;AUTHOR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;u&amp;#39;Terri Yu&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;SITENAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;u&amp;#39;terriyu@/media/blog&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;SITEURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;TIMEZONE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;America/New_York&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;DEFAULT_LANG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;u&amp;#39;en&amp;#39;&lt;/span&gt;

&lt;span class="c"&gt;# Feed generation is usually not desired when developing&lt;/span&gt;
&lt;span class="n"&gt;FEED_ALL_ATOM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;span class="n"&gt;CATEGORY_FEED_ATOM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;span class="n"&gt;TRANSLATION_FEED_ATOM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="c"&gt;# Feeds &lt;/span&gt;
&lt;span class="n"&gt;FEEDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;All posts&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;feeds/all.atom.xml&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Category&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;feeds/category&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;OPW&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;feeds/tag/opw.atom.xml&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),)&lt;/span&gt;

&lt;span class="c"&gt;# Social widget&lt;/span&gt;
&lt;span class="n"&gt;SOCIAL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Github&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;https://github.com/terriyu&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Twitter&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;https://twitter.com/terrimyu&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Linkedin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;https://linkedin.com/in/terriyu&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),)&lt;/span&gt;

&lt;span class="n"&gt;DEFAULT_PAGINATION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;

&lt;span class="c"&gt;# Uncomment following line if you want document-relative URLs when developing&lt;/span&gt;
&lt;span class="n"&gt;RELATIVE_URLS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;

&lt;span class="c"&gt;# Formatting for dates&lt;/span&gt;

&lt;span class="n"&gt;DEFAULT_DATE_FORMAT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;%a &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s"&gt; %B %Y&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Formatting for urls&lt;/span&gt;

&lt;span class="n"&gt;ARTICLE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;posts/{date:%Y}/{date:%m}/{slug}/&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;ARTICLE_SAVE_AS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;posts/{date:%Y}/{date:%m}/{slug}/index.html&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;CATEGORY_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;category/{slug}&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;CATEGORY_SAVE_AS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;category/{slug}/index.html&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;TAG_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;tag/{slug}/&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;TAG_SAVE_AS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;tag/{slug}/index.html&amp;quot;&lt;/span&gt;

&lt;span class="c"&gt;# Generate yearly archive&lt;/span&gt;

&lt;span class="n"&gt;YEAR_ARCHIVE_SAVE_AS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;posts/{date:%Y}/index.html&amp;#39;&lt;/span&gt;

&lt;span class="c"&gt;# Show most recent posts first&lt;/span&gt;

&lt;span class="n"&gt;NEWEST_FIRST_ARCHIVES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

&lt;span class="c"&gt;# Specify theme&lt;/span&gt;

&lt;span class="n"&gt;THEME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;/home/terri/pelican/pelican-themes/bootstrap&amp;quot;&lt;/span&gt;

&lt;span class="c"&gt;# Plugins&lt;/span&gt;

&lt;span class="n"&gt;PLUGIN_PATH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;/home/terri/pelican/pelican-plugins&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;PLUGINS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;latex&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;neighbors&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;summary&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c"&gt;# Only use LaTeX for selected articles&lt;/span&gt;

&lt;span class="n"&gt;LATEX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;article&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The configuration file is mostly self-explanatory.  I uncommented the line for
relative URLs.  I also specified custom URLs for article, category, tag, and
year archive, so that the URLs are more concise and don't have any &lt;code&gt;.html&lt;/code&gt;
extension.  For example, instead of &lt;code&gt;posts/2013/06/pelican-setup.html&lt;/code&gt;, I would
have &lt;code&gt;posts/2013/06/pelican-setup/&lt;/code&gt;.  I added lines to show most recent posts
first and to use the &lt;code&gt;bootstrap&lt;/code&gt; theme.  I also enabled the &lt;code&gt;latex&lt;/code&gt;, 
&lt;code&gt;neighbors&lt;/code&gt;, and &lt;code&gt;summary&lt;/code&gt; plugins.  The line &lt;code&gt;LATEX = 'article'&lt;/code&gt; allows you to 
turn on &lt;span class="math"&gt;\(\LaTeX\)&lt;/span&gt; support by adding the line &lt;code&gt;Latex:&lt;/code&gt; in the head of a post.  I
like using the &lt;code&gt;summary&lt;/code&gt; plugin&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2" rel="footnote"&gt;2&lt;/a&gt;&lt;/sup&gt; because I can control exactly how much of each
post is shown on the index page by using markers.  Also, if I set the 
&lt;code&gt;&amp;lt;!-- PELICAN_END_SUMMARY --&amp;gt;&lt;/code&gt; marker before footnotes, then I avoid the
&lt;a href="https://github.com/getpelican/pelican/pull/885"&gt;bug where footnotes appear in the summary&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Below is my &lt;code&gt;publishconf.py&lt;/code&gt; file with the Disqus and Google Analytics 
specifics anonymized.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;span class="c"&gt;# -*- coding: utf-8 -*- #&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;__future__&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;unicode_literals&lt;/span&gt;

&lt;span class="c"&gt;# This file is only used if you use `make publish` or&lt;/span&gt;
&lt;span class="c"&gt;# explicitly specify it as your config file.&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;curdir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pelicanconf&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;

&lt;span class="n"&gt;SITEURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;http://terriyu.info/blog&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;RELATIVE_URLS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

&lt;span class="n"&gt;FEED_ALL_ATOM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;feeds/all.atom.xml&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;CATEGORY_FEED_ATOM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;feeds/category/&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;.atom.xml&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;TAG_FEED_ATOM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;feeds/tag/&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;.atom.xml&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;DELETE_OUTPUT_DIRECTORY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;

&lt;span class="c"&gt;# Following items are often useful when publishing&lt;/span&gt;

&lt;span class="n"&gt;DISQUS_SITENAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;disqus-sitename&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;GOOGLE_ANALYTICS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;google-analytics-id&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;PIWIK_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;url.where.piwik.install.is.located&amp;#39;&lt;/span&gt;
&lt;span class="c"&gt;#PIWIK_SSL_URL = &amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;PIWIK_SITE_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I mostly kept the default file, but added a tag feed.&lt;/p&gt;
&lt;h2&gt;Setup Google Analytics/Piwik and Disqus&lt;/h2&gt;
&lt;p&gt;Just go to the relevant website 
&lt;a href="http://www.google.com/analytics/"&gt;Google Analytics&lt;/a&gt;, 
&lt;a href="http://piwik.org/"&gt;Piwik&lt;/a&gt;, or &lt;a href="http://disqus.com/"&gt;Disqus&lt;/a&gt; and follow the
directions on how to set it up.  Then add the appropriate IDs to your 
&lt;code&gt;publishconf.py&lt;/code&gt; file (see my example file from the last section).  Piwik needs 
to be installed on a server.  The major web hosts 
&lt;a href="http://www.bluehost.com/"&gt;Bluehost&lt;/a&gt; and &lt;a href="http://dreamhost.com/"&gt;Dreamhost&lt;/a&gt; 
support one-click Piwik installs.  Or, if you have a friend who is willing to 
share their Piwik install with you, that also works.  The variable 
&lt;code&gt;PIWIK_SSL_URL&lt;/code&gt; is for extra security and optional.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Top image taken from &lt;a href="https://github.com/getpelican/"&gt;Pelican GitHub page&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Currently, there is an incompatibility between the &lt;code&gt;summary&lt;/code&gt; plugin and 
  the version 3.2 release of the Pelican package.  The &lt;code&gt;summary&lt;/code&gt; plugin in the
  &lt;a href="https://github.com/getpelican/pelican-plugins"&gt;pelican-plugins GitHub repository&lt;/a&gt;
  has been updated to be consistent with the development version of
  Pelican.  Therefore, if you try to use the latest &lt;code&gt;summary&lt;/code&gt; plugin from 
  the GitHub repo with Pelican v3.2, you'll get an error related to the
  &lt;code&gt;DEFAULT_CONFIG&lt;/code&gt; variable.  To fix this, go into your cloned Git
  repo of &lt;code&gt;pelican-plugins&lt;/code&gt; and manually change the code in 
  &lt;code&gt;summary/summary.py&lt;/code&gt;.  Simply replace &lt;code&gt;DEFAULT_CONFIG&lt;/code&gt; with 
  &lt;code&gt;_DEFAULT_CONFIG&lt;/code&gt; in the file.  See this 
  &lt;a href="https://github.com/getpelican/pelican-plugins/pull/33/files"&gt;pull request&lt;/a&gt;
  for reference.&amp;#160;&lt;a class="footnote-backref" href="#fnref:2" rev="footnote" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;script type="text/javascript"&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var align = "center",
        indent = "0em",
        linebreak = "false";

    if (false) {
        align = (screen.width &lt; 768) ? "left" : align;
        indent = (screen.width &lt; 768) ? "0em" : indent;
        linebreak = (screen.width &lt; 768) ? 'true' : linebreak;
    }

    var mathjaxscript = document.createElement('script');
    var location_protocol = (false) ? 'https' : document.location.protocol;
    if (location_protocol !== 'http' &amp;&amp; location_protocol !== 'https') location_protocol = 'https:';
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = location_protocol + '//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
    mathjaxscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'AMS' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: '"+ align +"'," +
        "    displayIndent: '"+ indent +"'," +
        "    showMathMenu: true," +
        "    messageStyle: 'normal'," +
        "    tex2jax: { " +
        "        inlineMath: [ ['\\\\(','\\\\)'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
        "        linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
        "    }, " +
        "}); " +
        "if ('default' !== 'default') {" +
            "MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
            "MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
        "}";
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;</summary><category term="foss"></category><category term="software"></category><category term="webdev"></category></entry><entry><title>Boston WiSE Software Carpentry boot camp</title><link href="http://terriyu.info/blog/posts/2013/06/swc-wise/" rel="alternate"></link><updated>2013-06-27T00:00:00-04:00</updated><author><name>Terri Yu</name></author><id>tag:terriyu.info,2013-06-27:blog/posts/2013/06/swc-wise/</id><summary type="html">&lt;!-- PELICAN_BEGIN_SUMMARY --&gt;

&lt;div style="text-align:center"&gt;
&lt;p&gt;&lt;img alt="Intermediate room at Software Carpentry WiSE boot camp" src="http://terriyu.info/blog/images/swc-wise-800px.jpg" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;    &lt;/p&gt;
&lt;p&gt;I just finished up my stint as a helper at Software Carpentry's 
&lt;a href="http://software-carpentry.org/bootcamps/2013-06-wise.html"&gt;Women in Science and Engineering boot camp&lt;/a&gt;, also known as WiSE.  The
event was held at Microsoft's space in Cambridge Center near Boston from June
24 - 25.  &lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;h2&gt;Background&lt;/h2&gt;
&lt;p&gt;I was not an instructor.  My post will be rather informal and detailed, from a
helper's perspective.  For a formal writeup from an instructor, see 
&lt;a href="http://www.software.ac.uk/blog/2013-06-28-software-carpentry-bootcamp-women-science-and-engineering-boston"&gt;Aleksandra Pawlik's post&lt;/a&gt; for the 
&lt;a href="http://www.software.ac.uk/"&gt;Software Sustainability Institute&lt;/a&gt;.  For a broad overview and perspective
from someone new to Software Carpentry, see 
&lt;a href="http://kaythaney.com/2013/06/28/eating-our-own-dogfood-the-wise-bootcamp/"&gt;Kaitlin Thaney's post&lt;/a&gt;.  Kaitlin is the new director of the new
&lt;a href="https://wiki.mozilla.org/ScienceLab"&gt;Mozilla Science Lab&lt;/a&gt; initiative.  Since Software Carpentry now falls
under Science Lab, Kaitlin is our boss... I think! &lt;/p&gt;
&lt;p&gt;The month before, I had volunteered at the 
&lt;a href="http://terriyu.info/blog/posts/2013/06/swc-umass/"&gt;UMass Amherst boot camp&lt;/a&gt;.  Since I am located reasonably close to 
Boston, I was asked to help out again at WiSE.  The UMass boot camp was a
low-key affair, but WiSE was a special, high-profile event for Software
Carpentry.  Any self-identified woman could register for the event, as long as
she could make it to Boston and pay $20.  This was unusual because up to this
point, we ran boot camps at universities and research institutes with the
participants mostly coming from that particular university/institute.  Moreover,
the WiSE boot camp was three times larger than normal and also had additional 
corporate sponsorship from J.P. Morgan, Microsoft, Intel, NumFOCUS, King 
Abdullah University of Science and Technology, and Python Software Foundation.&lt;/p&gt;
&lt;p&gt;We had 7 instructors, 19 helpers, and approximately 120 participants -- all 
women!  With so many people, we split the group into three rooms: novice, 
intermediate, and advanced.  I was worried that we weren't going to have enough
helpers&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;, but at the last minute, J.P. Morgan sent a bunch of people, 
including some technologists from their Manhattan office.  Thank you, 
J.P. Morgan!  The instructors and helpers came from all over.  Many of us flew
in from across the country, some even internationally from Europe.  &lt;/p&gt;
&lt;p&gt;In addition, Amy Brown, Software Carpentry's admin, came from Toronto to keep us
organized.  She bought snacks, monitored communications, and generally helped to 
make sure things didn't fall apart. &lt;/p&gt;
&lt;h2&gt;Preparations&lt;/h2&gt;
&lt;p&gt;To prepare for the event, we held a conference call the week before, with all 
the instructors and helpers&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2" rel="footnote"&gt;2&lt;/a&gt;&lt;/sup&gt;.  The agenda was on an &lt;a href="http://etherpad.org/"&gt;Etherpad&lt;/a&gt; and we added
notes to it during the call.  &lt;a href="http://idyll.org/~tracyt/"&gt;Tracy Teal&lt;/a&gt;, who I had worked with at the
UMass Amherst boot camp, graciously volunteered her time to lead our merry band
and did her best to organize us over the conference call and the mailing list.  &lt;/p&gt;
&lt;p&gt;The night before the boot camp, the instructional staff caught a little 
relaxation at the Cambridge Brewing Company.  I recall trading stories about 
traveling, Star Trek, and college visits.  It was a great idea to meetup before 
the event started, because the boot camp itself was absolutely hectic.  It was
astounding to me that almost all of the staff traveled from out-of-town.  After
our beer get-together, I was asked to show people to the T stop because I was
the only person who had ever lived in the Boston area.    &lt;/p&gt;
&lt;h2&gt;Boot camp&lt;/h2&gt;
&lt;p&gt;The boot camp ran from 9 am - 5 pm over two days, but we instructors/helpers
arrived at Cambridge Center around 8 am, in order to prepare and help out with 
installation problems.  Since there were so many people, we tried to identify
ourselves as instructional staff by wearing Software Carpentry t-shirts,
buttons, and stickers.  &lt;/p&gt;
&lt;p&gt;I was assigned to help in the advanced room and our instructors were &lt;a href="http://web.mit.edu/jesstess/www/"&gt;Jessica 
McKellar&lt;/a&gt;, Aleksandra Pawlik, and &lt;a href="http://www.sheeri.com/"&gt;Sheeri Cabal&lt;/a&gt;.  Jessica 
taught shell and scientific Python, Aleksandra taught Git, basic Python, and 
testing, and Sheeri taught SQL.  They are all software experts with impressive
credentials.  Jessica is an organizer for the 
&lt;a href="http://www.meetup.com/bostonpython/"&gt;Boston Python User's Group&lt;/a&gt; and on the Board of Directors for 
the &lt;a href="http://www.python.org/psf/members/"&gt;Python Software Foundation&lt;/a&gt;.  Sheeri organizes the 
&lt;a href="http://www.meetup.com/mysqlbos/"&gt;Boston MySQL User Group&lt;/a&gt;.  Aleksandra Pawlik works at the 
&lt;a href="http://www.software.ac.uk/"&gt;Software Sustainability Institute&lt;/a&gt; in England.  The Software 
Sustainability Institute focuses on software in research settings and sounds
very cool.  I wish we had something like that here in the USA.  &lt;/p&gt;
&lt;p&gt;Just like at UMass Amherst, I spent the majority of my time manning the Etherpad
-- taking notes and answering questions in the chat box.  I was worried that 
people might be so "advanced" that they were bored, so I would sporadically 
write comments like "hey did you know that there are non-SQL databases" or 
"check out the history of unit testing" to entertain them.  I don't know if this 
was helpful or not.  In between Etherpadding, I checked to make sure our room
was well-organized and supplied and helped people with their software installs.
During quieter periods, I worked on promotion -- taking photos in each of the
three rooms and sending out a few &lt;a href="https://twitter.com/terrimyu/status/349514214223794176"&gt;tweets&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Panel discussion&lt;/h2&gt;
&lt;p&gt;The evening of the first day, there was a reception and panel sponsored by J.P.
Morgan.  The panel consisted mostly of J.P. Morgan technologists, plus Jessica 
McKellar (Python expert / software engineer) and &lt;a href="http://phd.gccis.rit.edu/weile/"&gt;Wei Le&lt;/a&gt; (computer science 
faculty).  Jessica and Wei were instructor and helper, respectively, in the 
advanced room.  The panel was a discussion of women in software and how
participants can get involved (see &lt;a href="http://www.software.ac.uk/blog/2013-06-28-software-carpentry-bootcamp-women-science-and-engineering-boston"&gt;Aleksandra's post&lt;/a&gt;).  &lt;/p&gt;
&lt;p&gt;Unfortunately, I had to run to meet a friend for dinner, so I 
was only able to listen to the panel introductions.  I did catch a funny remark
by Prof. Le who said,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As a CS faculty, I look forward to work every day. Not true as a grad student.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As a former grad student, this made my day.&lt;/p&gt;
&lt;h2&gt;Problems, impressions, and anecdotes&lt;/h2&gt;
&lt;p&gt;As is usual in these boot camps, installation problems were a major issue.  I
heard reports that there were an unusually high number of install problems, 
partially because a number of people didn't bother installing anything before 
they came.  Even though we provided a Python script to check installation and
asked people to check their IPython version at the end of the first day, we
still had quite a few problems in the advanced room.  IPython notebook problems
ate up the first hour of the second day.  If you participate in a Software 
Carpentry boot camp or any software education event in the future, please please 
check your install as throughly as you can!!!  &lt;/p&gt;
&lt;p&gt;We were a bit disorganized in the advanced room, partially because it was hard
to coordinate efforts with three instructors from different backgrounds.  We 
forgot to set up the Etherpad and to ask for feedback on minute 
cards.&lt;sup id="fnref:3"&gt;&lt;a class="footnote-ref" href="#fn:3" rel="footnote"&gt;3&lt;/a&gt;&lt;/sup&gt;  However, once I realized this mistake, I informed the instructors 
and we rectified the situation quickly.&lt;/p&gt;
&lt;p&gt;I got the impression that our advanced group was pretty bored during the shell 
lessons.  A couple people wanted to know about pretty advanced shell stuff like 
&lt;code&gt;sed&lt;/code&gt; and &lt;code&gt;awk&lt;/code&gt;.  The room perked up a bit when we went on to teaching 
Git.  When we teach Git, I'm always worried that people think GitHub = Git or 
that GitHub is open source software (it's a commercial web service).  Sure 
enough, someone asked if the Python software project used GitHub.&lt;sup id="fnref:4"&gt;&lt;a class="footnote-ref" href="#fn:4" rel="footnote"&gt;4&lt;/a&gt;&lt;/sup&gt;  &lt;/p&gt;
&lt;p&gt;A selection of my personal experiences:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I had a nice chat with a couple women about open source software, R, and 
    Python.  They were interested in doing data analysis.  We all complained
    about how R makes it too easy to do irresponsible research -- you can run 
    R libraries and obtain results that you don't understand. &lt;/li&gt;
&lt;li&gt;I hung out with a participant after the first day and we talked about
    installing Python libraries on Mac OS X.  I told her that we recommend
    all-in-one installers like Anaconda or Canopy to avoid issues during boot
    camps, but that in the long run, you want to be in charge of your software
    and should learn to install the libraries yourself with a tool like 
    Pip.&lt;sup id="fnref:5"&gt;&lt;a class="footnote-ref" href="#fn:5" rel="footnote"&gt;5&lt;/a&gt;&lt;/sup&gt;  We also chatted a bit about machine learning. &lt;/li&gt;
&lt;li&gt;Mixed feedback on virtual machines.  On one hand, a participant gave us a 
    huge thumbs up for the virtual machine (VM).  She was really happy to have 
    everything working out of the box and was running the VM on her Windows 
    laptop.  On the other hand, someone else was very unhappy that she couldn't 
    get superuser access on the virtual machine.  I tried to help her over the 
    Etherpad and even asked the Software Carpentry instructors mailing list for 
    the superuser username and password, but apparently she still couldn't get
    it to work. &lt;/li&gt;
&lt;li&gt;A participant came up to me after the end of the second day and effusively
    gushed about how inspired she was by our teaching.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I learned from my time helping at UMass and tried to put together a list of 
resources and ideas for what people could do after the boot camp.  At the UMass
boot camp, people were really interested in follow up material, but the staff
didn't have any formal list and we ended up pasting in URLs on the Etherpad.
For a high-profile event like WiSE, I hoped that we could be more organized and
that's why I attempted to come up with a collection of resources.  You can see
my list on the &lt;a href="http://software-carpentry.org/blog/2013/06/after-wise.html"&gt;Software Carpentry blog&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;Looking at the minute cards, there were many different opinions on what was
easy vs what was hard and what topics people wanted to cover.  This shows how
difficult it is to teach a large group, even when we separated participants by
level in this particular boot camp!  I think we could have done a better job
presenting the goals of the boot camp.  We should have had formal introductory
and wrap up presentations -- talking about how we want to promote good 
software practices, reproducible research, and open science.  The reality is 
that we simply can't meet everyone's exact needs, but we hope to give an 
overview of good software practices and to inspire people so that 1) they make 
their software a priority and 2) find a community of like-minded scholars. &lt;/p&gt;
&lt;p&gt;Overall, we received lots of positive feedback from the participants and 
apparently enough interest to start a mailing list or Google Group.  I hope the
women from the boot camp continue to educate and empower themselves with 
software.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;We normally desire at least a 2:1 helper:instructor ratio.&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;At that point we didn't know who J.P. Morgan was sending, so they weren't
  on the conference call.&amp;#160;&lt;a class="footnote-backref" href="#fnref:2" rev="footnote" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;For a "standard" Software Carpentry boot camp, we usually ask the
  participants to write 1-2 sentences about what was good and what was bad
  1-2x each day.  The feedback is written on index cards or stickies, and
  we tell them not to spend to long on it -- hence the term "minute cards." &amp;#160;&lt;a class="footnote-backref" href="#fnref:3" rev="footnote" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;Not only does Python &lt;em&gt;not&lt;/em&gt; use GitHub, the project doesn't even use Git as
  their version control system.  They prefer Mercurial!  &amp;#160;&lt;a class="footnote-backref" href="#fnref:4" rev="footnote" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;This is my personal opinion and not necessarily Software Carpentry's 
  official recommendation.&amp;#160;&lt;a class="footnote-backref" href="#fnref:5" rev="footnote" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</summary><category term="education"></category><category term="software"></category><category term="science"></category><category term="service"></category></entry><entry><title>UMass Amherst Software Carpentry boot camp</title><link href="http://terriyu.info/blog/posts/2013/06/swc-umass/" rel="alternate"></link><updated>2013-06-18T00:00:00-04:00</updated><author><name>Terri Yu</name></author><id>tag:terriyu.info,2013-06-18:blog/posts/2013/06/swc-umass/</id><summary type="html">&lt;!-- PELICAN_BEGIN_SUMMARY --&gt;

&lt;p&gt;A couple years ago, while I was in physics graduate school, I found out about an
organization called &lt;a href="http://software-carpentry.org/"&gt;Software Carpentry&lt;/a&gt;.  My
advisor sent me a Nature article about 
&lt;a href="http://www.nature.com/news/2010/101013/full/467775a.html"&gt;poor software practices in science&lt;/a&gt;
and it quoted Greg Wilson, the founder of Software Carpentry.  Around the same
time, I also heard that Software Carpentry was running an online class to teach
scientists software skills.  I signed up and really enjoyed the class -- which
covered Python, shell, version control, object oriented programming, regular
expressions, testing, and databases.&lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;p&gt;I didn't know many people interested in software at grad school, so it was nice
to be able to discuss these topics with the Software Carpentry instructors.  I
remember learning some nice Python tricks from Greg.  &lt;/p&gt;
&lt;p&gt;Since then, I've sporadically kept in touch with Greg.  A couple months ago,
he told me that he was running an onsite (offline) Software Carpentry bootcamp
near me at
&lt;a href="http://software-carpentry.org/bootcamps/2013-05-umass.html"&gt;UMass Amherst&lt;/a&gt; and
asked me if I'd like to volunteer to help.  I agreed and it turned out to be a
fun and illuminating experience.&lt;/p&gt;
&lt;p&gt;I had many thoughts about my experience at the boot camp and Greg Wilson, the
founder of Software Carpentry, asked me to share my thoughts as a blog post.  &lt;/p&gt;
&lt;p&gt;You can see my roughly 2000 word 
&lt;a href="http://software-carpentry.org/blog/2013/06/umass-bootcamp.html"&gt;blog post here&lt;/a&gt; 
on the Software Carpentry website.&lt;/p&gt;</summary><category term="education"></category><category term="software"></category><category term="science"></category><category term="service"></category></entry><entry><title>First day of Outreach Program for Women</title><link href="http://terriyu.info/blog/posts/2013/06/opw-first-day/" rel="alternate"></link><updated>2013-06-17T00:00:00-04:00</updated><author><name>Terri Yu</name></author><id>tag:terriyu.info,2013-06-17:blog/posts/2013/06/opw-first-day/</id><summary type="html">&lt;!-- PELICAN_BEGIN_SUMMARY --&gt;

&lt;div style="text-align:center"&gt;
&lt;p&gt;&lt;img alt="OPW participation logo" src="http://terriyu.info/blog/images/opw-participation.png" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Today is the first day of my internship in the 
&lt;a href="https://wiki.gnome.org/OutreachProgramForWomen"&gt;Outreach Program for Women&lt;/a&gt;&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt; 
(OPW).  I'll be working on the
&lt;a href="http://docs.openstack.org/developer/ceilometer/"&gt;Ceilometer&lt;/a&gt; component of the
&lt;a href="http://www.openstack.org/"&gt;OpenStack&lt;/a&gt; cloud computing project under the 
guidance of my mentor, &lt;a href="http://julien.danjou.info/"&gt;Julien Danjou&lt;/a&gt;, who is the
project technical lead of Ceilometer.  I'm also supported by two more mentors, 
&lt;a href="http://anteaya.info/"&gt;Anita Kuno&lt;/a&gt; and &lt;a href="http://www.jpichon.net/"&gt;Julie Pichon&lt;/a&gt;.
&lt;a href="http://justwriteclick.com/"&gt;Anne Gentle&lt;/a&gt; is the coordinator of OpenStack's OPW
internship program, and 
&lt;a href="https://live.gnome.org/MarinaZhurakhinskaya"&gt;Marina Zhurakhinskaya&lt;/a&gt; and 
&lt;a href="http://blogs.gnome.org/gnomg/"&gt;Karen Sandler&lt;/a&gt; are the coordinators of the
entire Outreach Program for Women.  I'm grateful to them all.&lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;p&gt;I'll defer discussing my work on Ceilometer to another post, but I thought I'd
first write about the internship program itself.  The Outreach Program for Women
started in 2010, as an effort to increase the number of women contributing to
open source software.  As stated on the program's main page:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This program has proved itself to be very effective in improving community
diversity. Women attendance at GNOME's yearly conference, GUADEC, rose from 4%
(6 women) to 17% (41 woman) in 3 years. A recent study showed that 50% of 
newcomers who joined the GNOME project in the last 3 years are women, while 
only 6% of newcomers to all other surveyed FOSS projects are women, with 15% 
being the next highest concentration.&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2" rel="footnote"&gt;2&lt;/a&gt;&lt;/sup&gt; &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In each application round, various open source software organizations suggest
projects, and each project has at least one mentor (who can male or female).
The projects can be on any topic, as long as it is relevant to free open source
software (FOSS).  Many of the projects involve software, but there are also
possibilities for working on marketing, design, and documentation.  &lt;/p&gt;
&lt;p&gt;From 2010 - 2011, the only organization involved was GNOME, but since then OPW
has grown rapidly.  In my application round, there were 19 organizations!  The
organizations were Debian, Electronic Frontier Foundation, GNOME, Joomla, KDE,
Linux Kernel, MediaGoblin, Mozilla, NESCent, Open Technology Institute, OpenMRS,
OpenStack, Perl, Tor, Twisted, Wikia, Wikimedia, WordPress, and Yocto Project.  &lt;/p&gt;
&lt;p&gt;OPW is modeled after 
&lt;a href="https://developers.google.com/open-source/soc/"&gt;Google Summer of Code&lt;/a&gt; (GSoC)
but with a few differences.&lt;sup id="fnref:3"&gt;&lt;a class="footnote-ref" href="#fn:3" rel="footnote"&gt;3&lt;/a&gt;&lt;/sup&gt;  Like GSoC, OPW has an unusual application 
process.  A significant part of the application is collaboration with mentor(s)
and contributing to open source software.  What does that mean?  You can think
of it as starting the internship early -- a pre-internship of sorts.  The 
applicant looks through the list of organizations and their projects.  She
contacts the mentor(s) of the project(s) she is interested in and starts working
with the mentor(s).&lt;sup id="fnref:4"&gt;&lt;a class="footnote-ref" href="#fn:4" rel="footnote"&gt;4&lt;/a&gt;&lt;/sup&gt;  The mentor(s) suggest some small contributions that the
applicant can work on.  A "contribution" can be fixing a typo in documentation
or writing a test in the code, for example.  By collaborating with the mentor
and working on a contribution, the applicant gets a feel for the project and
the mentor, and obtains experience in using the issue tracker/software/tools.&lt;/p&gt;
&lt;p&gt;In my opinion, what's really cool about this process is that it allows the
applicant and mentor to evaluate each other in true-to-life situations.  It
avoids the games you see in hiring processes, like asking logic puzzle questions
or showing off credentials.  Moreover, even if the applicant doesn't succeed in
obtaining a spot, she has learned a lot and can apply again with a strong chance
of succeeding the second time around.&lt;/p&gt;
&lt;p&gt;Last winter 2012, I first heard about OPW on the
&lt;a href="http://anitaborg.org/initiatives/systers"&gt;Systers&lt;/a&gt; mailing list.  Shortly
afterwards, I attended a talk by Cat Allman at a meetup sponsored by Women Who 
Code.  Cat is the manager of outreach for the Open Source Programs Office at
Google and she spoke about how women can get into open source software.  In
particular, she emphasized OPW because it's one of the rare internship programs
which is open to non-students.  The only requirement is the applicant identifies
as a woman, is at least 18, and has not previously participated in OPW or Google
Summer of Code.  This was especially good for me, since I am no longer a 
student.  I spoke with Cat after her talk, and she strongly encouraged me to 
apply for OPW.  &lt;/p&gt;
&lt;p&gt;I didn't have enough time to do the winter 2013 round, but I made it my goal to
apply for the summer 2013 round.  After working hard on my application all of
April 2013, here I am! &lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Top image is &lt;a href="https://wiki.gnome.org/OutreachProgramForWomen/SpreadTheWord"&gt;participation logo&lt;/a&gt; 
  by L. Yu, Eller, Ford, Atanasoska, Muraus, and Zhurakhinskaya &amp;#160;&lt;a class="footnote-backref" href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;&lt;a href="https://wiki.gnome.org/OutreachProgramForWomen/"&gt;Outreach Program for Women main page&lt;/a&gt; &amp;#160;&lt;a class="footnote-backref" href="#fnref:2" rev="footnote" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;OPW is for self-identified women only and doesn't require a project
  proposal.  Also, one can only participate in OPW once.&amp;#160;&lt;a class="footnote-backref" href="#fnref:3" rev="footnote" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;Most people only apply to one project at a single organization, but some
  apply to projects at multiple organizations to increase their odds of
  success.&amp;#160;&lt;a class="footnote-backref" href="#fnref:4" rev="footnote" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</summary><category term="foss"></category><category term="openstack"></category><category term="opw"></category><category term="software"></category></entry><entry><title>Demonstrating Pelican, a static site generator</title><link href="http://terriyu.info/blog/posts/2013/06/pelican-demo/" rel="alternate"></link><updated>2013-06-13T00:00:00-04:00</updated><author><name>Terri Yu</name></author><id>tag:terriyu.info,2013-06-13:blog/posts/2013/06/pelican-demo/</id><summary type="html">&lt;!-- PELICAN_BEGIN_SUMMARY --&gt;

&lt;div style="text-align:center"&gt;
&lt;p&gt;&lt;img alt="Pelican screenshot" src="http://terriyu.info/blog/images/pelican-docs-800px.png" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;When I was setting up this blog, I initially started with 
&lt;a href="http://wordpress.org/"&gt;Wordpress&lt;/a&gt;, but then I discovered that many (tech-savvy)
people were using static site generators.&lt;/p&gt;
&lt;p&gt;It took me some time to understand what that meant.  Most of the common
blogging platforms generate websites dynamically.  Wordpress requires SQL to
manage a database containing your blog content.  When someone loads your blog
URL, Wordpress generates the requested webpage.  Wordpress must be installed on
your webhost/server for this to work.  &lt;/p&gt;
&lt;p&gt;The idea behind static site generators is to have software on your local
machine that creates webpages and then upload these pages to the webhost.  The
webpages have fixed content, hence the description "static site."  You don't
need to install anything on the webhost. &lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;p&gt;For a small personal blog, a static site makes a lot of sense because you&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Avoid the security issues of having software (like Wordpress) installed on
  your webhost&lt;/li&gt;
&lt;li&gt;Don't need to worry about upgrading and maintaining server-side software
  (like Wordpress)&lt;/li&gt;
&lt;li&gt;Can write blog posts in some type of markdown, which is a lot more user
  friendly than composing posts in a browser GUI&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Can exercise version control on the static web content&lt;/li&gt;
&lt;li&gt;Can easily move your website somewhere else because your website is just a
  bunch of static files &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In practice, I wanted my blog to have the following features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ability to write posts in markdown&lt;/li&gt;
&lt;li&gt;Footnotes&lt;/li&gt;
&lt;li&gt;Syntax highlighting, especially for code&lt;/li&gt;
&lt;li&gt;Ability to render &lt;span class="math"&gt;\(\LaTeX\)&lt;/span&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I can show that all of that is possible in
&lt;a href="http://docs.getpelican.com"&gt;Pelican&lt;/a&gt;, a static site generator written in
Python.  (Needless to say, I'm using Pelican&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2" rel="footnote"&gt;2&lt;/a&gt;&lt;/sup&gt; for this blog.)&lt;/p&gt;
&lt;h2&gt;Markdown&lt;/h2&gt;
&lt;h3&gt;Emphasis&lt;/h3&gt;
&lt;p&gt;This is &lt;em&gt;extremely&lt;/em&gt; &lt;strong&gt;important&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Lists&lt;/h3&gt;
&lt;p&gt;Some things I'd like to do someday&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Skate the canals in the Netherlands&lt;/li&gt;
&lt;li&gt;Build my own computer&lt;/li&gt;
&lt;li&gt;Write my own software project&lt;/li&gt;
&lt;li&gt;Finish &lt;em&gt;Baldur's Gate&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Publish an essay&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Top 5 console games&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Paper Mario: Thousand Year Door (Gamecube)&lt;/li&gt;
&lt;li&gt;Prince of Persia trilogy (The Sands of Time, Warrior Within, The Two Thrones) (console/PC)&lt;/li&gt;
&lt;li&gt;Chrono Trigger (SNES/DS)&lt;/li&gt;
&lt;li&gt;Phoenix Wright series (GBA/DS)&lt;/li&gt;
&lt;li&gt;The Legend of Zelda: Twilight Princess (Gamecube/Wii)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Blockquote&lt;/h3&gt;
&lt;p&gt;Some quotes I like:&lt;/p&gt;
&lt;p&gt;Literary&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Having to read a footnote resembles having to go downstairs to answer the
door while in the midst of making love.&lt;sup id="fnref:3"&gt;&lt;a class="footnote-ref" href="#fn:3" rel="footnote"&gt;3&lt;/a&gt;&lt;/sup&gt;  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Self-reliance&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A human being should be able to change a diaper, plan an invasion, butcher
a hog, conn a ship, design a building, write a sonnet, balance accounts,
build a wall, set a bone, comfort the dying, take orders, give orders,
cooperate, act alone, solve equations, analyze a new problem, pitch manure,
program a computer, cook a tasty meal, fight efficiently, die gallantly.
Specialization is for insects.&lt;sup id="fnref:4"&gt;&lt;a class="footnote-ref" href="#fn:4" rel="footnote"&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Images&lt;/h3&gt;
&lt;p&gt;Who can resist cute cats?  (Yes, that is my photo and those are our cats.)&lt;/p&gt;
&lt;p&gt;&lt;img alt="Cats cuddling at night" src="http://terriyu.info/blog/images/cuddling-cats-800x600.jpg" /&gt;&lt;/p&gt;
&lt;h3&gt;Horizontal rule&lt;/h3&gt;
&lt;hr /&gt;
&lt;h2&gt;Syntax highlighting&lt;/h2&gt;
&lt;h3&gt;Inline highlighting&lt;/h3&gt;
&lt;p&gt;Some Python keywords are &lt;code&gt;lambda&lt;/code&gt;, &lt;code&gt;import&lt;/code&gt;, and &lt;code&gt;while&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Block of code&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;factorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;factorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;hr /&gt;
&lt;h2&gt;&lt;span class="math"&gt;\(\LaTeX\)&lt;/span&gt; symbols&lt;/h2&gt;
&lt;h3&gt;Inline LaTeX symbols&lt;/h3&gt;
&lt;p&gt;I &lt;em&gt;always&lt;/em&gt; seem to run out of Greek letters like &lt;span class="math"&gt;\(\alpha, \beta, \gamma\)&lt;/span&gt;.&lt;/p&gt;
&lt;h3&gt;{equation} environment&lt;/h3&gt;
&lt;div class="math"&gt;$$
\begin{equation}
i\hbar\frac{\partial}{\partial t}\Psi = \hat{H}\Psi
\end{equation}
$$&lt;/div&gt;
&lt;h3&gt;{eqnarray} environment&lt;/h3&gt;
&lt;p&gt;Do you know what these equations are?&lt;/p&gt;
&lt;div class="math"&gt;$$
\begin{eqnarray}
\nabla \cdot \vec{E} &amp;amp;=&amp;amp; 4\pi\rho \\\
\nabla \cdot \vec{B} &amp;amp;=&amp;amp; 0 \\\
\nabla \times \vec{E} &amp;amp;=&amp;amp; -\frac{1}{c}\frac{\partial \vec{B}}{\partial t} \\\
\nabla \times \vec{B} &amp;amp;=&amp;amp; \frac{1}{c}\left(4\pi\vec{J} + \frac{\partial \vec{E}}{\partial t}\right)
\end{eqnarray}
$$&lt;/div&gt;
&lt;p&gt;The famous Maxwell's Equations&lt;sup id="fnref:5"&gt;&lt;a class="footnote-ref" href="#fn:5" rel="footnote"&gt;5&lt;/a&gt;&lt;/sup&gt; describing electrodynamics in a vacuum!&lt;/p&gt;
&lt;p&gt;For the eqnarray environment, I noticed that I had to use &lt;code&gt;\\\&lt;/code&gt; instead of &lt;code&gt;\\&lt;/code&gt;
for the line breaks.&lt;/p&gt;
&lt;h2&gt;Source&lt;/h2&gt;
&lt;p&gt;The Markdown file used to generate this post is available 
&lt;a href="http://terriyu.info/blog/code/pelican-demo.txt"&gt;here&lt;/a&gt;.  I had to change the &lt;code&gt;.md&lt;/code&gt; extension
to &lt;code&gt;.txt&lt;/code&gt; to avoid confusing the Pelican compiler.&lt;/p&gt;
&lt;h2&gt;Technical details&lt;/h2&gt;
&lt;p&gt;If you liked this demonstration of Pelican, you can see another post where I
explain how I 
&lt;a href="http://terriyu.info/blog/posts/2013/07/pelican-setup/"&gt;setup Pelican with full technical details&lt;/a&gt;.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;I used to write my blog posts in HTML, in the blogging software's GUI.  I
  constantly fought the software reformatting my edits and changing the
  whitespace.&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Top image taken from 
  &lt;a href="http://docs.getpelican.com/en/latest/"&gt;Pelican documentation page&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:2" rev="footnote" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;Attributed to Noel Coward&amp;#160;&lt;a class="footnote-backref" href="#fnref:3" rev="footnote" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;From &lt;em&gt;Time Enough to Love&lt;/em&gt; by Robert Heinlein&amp;#160;&lt;a class="footnote-backref" href="#fnref:4" rev="footnote" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;In cgs units, of course! &amp;#160;&lt;a class="footnote-backref" href="#fnref:5" rev="footnote" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;script type="text/javascript"&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var align = "center",
        indent = "0em",
        linebreak = "false";

    if (false) {
        align = (screen.width &lt; 768) ? "left" : align;
        indent = (screen.width &lt; 768) ? "0em" : indent;
        linebreak = (screen.width &lt; 768) ? 'true' : linebreak;
    }

    var mathjaxscript = document.createElement('script');
    var location_protocol = (false) ? 'https' : document.location.protocol;
    if (location_protocol !== 'http' &amp;&amp; location_protocol !== 'https') location_protocol = 'https:';
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = location_protocol + '//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
    mathjaxscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'AMS' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: '"+ align +"'," +
        "    displayIndent: '"+ indent +"'," +
        "    showMathMenu: true," +
        "    messageStyle: 'normal'," +
        "    tex2jax: { " +
        "        inlineMath: [ ['\\\\(','\\\\)'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
        "        linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
        "    }, " +
        "}); " +
        "if ('default' !== 'default') {" +
            "MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
            "MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
        "}";
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;</summary><category term="foss"></category><category term="software"></category><category term="webdev"></category></entry><entry><title>Hack for Western Mass</title><link href="http://terriyu.info/blog/posts/2013/06/hack-western-mass/" rel="alternate"></link><updated>2013-06-05T00:00:00-04:00</updated><author><name>Terri Yu</name></author><id>tag:terriyu.info,2013-06-05:blog/posts/2013/06/hack-western-mass/</id><summary type="html">&lt;!-- PELICAN_BEGIN_SUMMARY --&gt;

&lt;div style="text-align:center"&gt;
&lt;p&gt;&lt;img alt="National Day of Civic Hacking logo" src="http://terriyu.info/blog/images/ndoch-800px.png" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;This past weekend, I participated in &lt;a href="http://www.hackforwesternmass.org/"&gt;Hack for Western Mass&lt;/a&gt; as part of the &lt;a href="hackforchange.org"&gt;National Day of Civic Hacking&lt;/a&gt;.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt; This was my first hackathon and initially I was skeptical that you could accomplish much of anything with strangers during a weekend.  But I turned out be wrong.&lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;p&gt;I was truly impressed with the ideas that community leaders and activists came up with including tracking the federal budget, developing a website to encourage local banking, mapping well sites in Western Mass, making a database/website to share information about local seeds.  I worked on a project to &lt;a href="http://hackforwesternmass.org/mapping-safety-net-needs"&gt;map data on impoverished clients&lt;/a&gt; and reference this data with census data.  A woman from the US Census came all the way from Connecticut to help out with the project, which illustrates how important this is.  The census data was used to anonymize client information since we could map client addresses to specific census tracts, which was specific enough for data analysis, but reasonably obscured clients' personal data.  This project was also my first experience working on a software team and it was interesting to listen to all the conversations.  We had two experienced developers and since they understood project management, they really drove the conversation.  In general, I noticed that across all the ideas, there was a common need for websites, databases, mapping, and visualization.&lt;/p&gt;
&lt;p&gt;During the afternoon of the second day, the teams presented their work.  People did great work for the short time period.  The teams that made websites had the most polished projects, whereas teams that had a lot of backend work (like ours) seemed more likely to present incomplete work. &lt;/p&gt;
&lt;p&gt;The number of interesting ideas and the enthusiasm of all involved was a great inspiration to me.  Community building and grassroots activism is important to me and I was very glad to find out that hackers and developers can help these people out.  &lt;/p&gt;
&lt;p&gt;It appears that if you have front-end website/design skills or mapping/visualization skills, you can easily use these skills for social good! There are probably people in your community who need you!&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Top image is official logo from the 
  &lt;a href="http://hackforchange.org/page/press"&gt;National Day of Civic Hacking Logo kit&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</summary><category term="foss"></category><category term="hackathon"></category><category term="service"></category><category term="software"></category></entry><entry><title>First post</title><link href="http://terriyu.info/blog/posts/2013/06/first-post/" rel="alternate"></link><updated>2013-06-04T00:00:00-04:00</updated><author><name>Terri Yu</name></author><id>tag:terriyu.info,2013-06-04:blog/posts/2013/06/first-post/</id><summary type="html">&lt;!-- PELICAN_BEGIN_SUMMARY --&gt;

&lt;p&gt;This is a new blog I’ve started for my work-related activities — which
currently include software development, open source software, and data science.&lt;/p&gt;
&lt;!-- PELICAN_END_SUMMARY --&gt;

&lt;p&gt;My background is mainly in physics, though I also have an undergraduate degree
in electrical engineering. I took the usual beginner programming courses and
wrote scripts in Matlab and Python for scientific research.&lt;/p&gt;
&lt;p&gt;I’m fairly new to software development, despite being a heavy user of software.
This blog will help me keep track of software projects I’m working on and things
I’ve learned.&lt;/p&gt;
&lt;p&gt;I can't guarantee that I'll always be working on software and this blog may
change in the future.  But this is what it is, for now.  Feel free to comment.&lt;/p&gt;</summary><category term="foss"></category><category term="data_science"></category><category term="science"></category><category term="software"></category></entry></feed>