asb@ubuntu:~$//blog.andrewsomething.com/2019-04-04T00:00:00-04:00Setting Up a Domain with SSL on DigitalOcean Kubernetes using ExternalDNS and Helm2019-04-04T00:00:00-04:002019-04-04T00:00:00-04:00andrewsomethingtag:blog.andrewsomething.com,2019-04-04:/2019/04/04/external-dns-with-ssl-on-k8s/<p>A little while back I <a href="https://github.com/helm/charts/pull/11257">added support</a> for DigitalOcean to the ExternalDNS Helm chart, and I wanted to share my notes on how to use it. <a href="https://github.com/kubernetes-incubator/external-dns">ExternalDNS</a> is an extremely convenient tool that allows you to dynamically control <span class="caps">DNS</span> records for your Kubernetes resources just by adding an annotation. In …</p><p>A little while back I <a href="https://github.com/helm/charts/pull/11257">added support</a> for DigitalOcean to the ExternalDNS Helm chart, and I wanted to share my notes on how to use it. <a href="https://github.com/kubernetes-incubator/external-dns">ExternalDNS</a> is an extremely convenient tool that allows you to dynamically control <span class="caps">DNS</span> records for your Kubernetes resources just by adding an annotation. In this post, I’ll walk through how to install it with Helm and use it to point a domain at a Kubernetes service. I’ll also cover setting up <span class="caps">SSL</span> using a DigitalOcean managed <span class="caps">SSL</span> certificate on the load balancer.</p>
<p>First, a few assumptions:</p>
<ul>
<li>You have access to a Kubernetes cluster with kubectl</li>
<li>You have the <a href="https://helm.sh/docs/using_helm/#installing-the-helm-client">Helm client installed locally</a></li>
<li>Helm has been configured in the cluster using <a href="https://helm.sh/docs/using_helm/#tiller-and-role-based-access-control">a service account with the correct permissions</a></li>
<li>You have <code>doctl</code>, the DigitalOcean <span class="caps">CLI</span>, <a href="https://github.com/digitalocean/doctl#installing-doctl">installed locally</a></li>
<li>You have a <a href="https://www.digitalocean.com/docs/networking/dns/how-to/add-domains/">domain hosted on DigitalOcean</a></li>
</ul>
<h2>Installing ExternalDNS with Helm</h2>
<p>With all of that in place, the first thing to do is install ExternalDNS into the cluster. You will need to <a href="https://www.digitalocean.com/docs/api/create-personal-access-token/">generate a DigitalOcean <span class="caps">API</span> token</a> for it to use. It’s best to create a token specifically for this service rather than using one you may have in your local environment. Then run the following command replacing <code>$DO_API_TOKEN</code> with the token you generated:</p>
<div class="highlight"><pre><span></span>helm install --name external-dns \
--set digitalocean.apiToken=$DO_API_TOKEN,provider=digitalocean,rbac.create=true \
stable/external-dns
</pre></div>
<p>You can verify that it has been successfully installed by running:</p>
<div class="highlight"><pre><span></span>$ kubectl get pods -l <span class="s2">"app=external-dns"</span>
</pre></div>
<p>When ready, the output should look something like this:</p>
<div class="highlight"><pre><span></span>NAME READY STATUS RESTARTS AGE
external-dns-68bfc948b-jhhrq 1/1 Running 0 34s
</pre></div>
<h2>Generating a DigitalOcean Managed <span class="caps">SSL</span> Certificate</h2>
<p>Next, use <code>doctl</code> to generate an <span class="caps">SSL</span> certificate managed by DigitalOcean making use of their Let’s Encrypt integration. Giving it a name and replacing <code>example.com</code> with your domain, run:</p>
<div class="highlight"><pre><span></span>doctl compute certificate create --name k8s-cert \
--type lets_encrypt --dns-names example.com
</pre></div>
<p>The output will include an <span class="caps">ID</span> that looks something like <code>9r3e053d-da5e-4390-b7b8-0fs23486e41q</code>. You’ll need that in the next step.</p>
<h2>Deploying the Kubernetes Service</h2>
<p>Now you are ready to deploy your service to the Kubernetes cluster. For this example we are using an <span class="caps">NGINX</span> container for the deployment, but that could be any application running in your cluster. The important part for this exercise is the LoadBalancer Service. Here is the full example:</p>
<div class="highlight"><pre><span></span><span class="n">kind</span><span class="o">:</span> <span class="n">Service</span>
<span class="n">apiVersion</span><span class="o">:</span> <span class="n">v1</span>
<span class="n">metadata</span><span class="o">:</span>
<span class="n">name</span><span class="o">:</span> <span class="n">https</span><span class="o">-</span><span class="k">with</span><span class="o">-</span><span class="n">cert</span>
<span class="n">annotations</span><span class="o">:</span>
<span class="n">external</span><span class="o">-</span><span class="n">dns</span><span class="o">.</span><span class="na">alpha</span><span class="o">.</span><span class="na">kubernetes</span><span class="o">.</span><span class="na">io</span><span class="o">/</span><span class="n">hostname</span><span class="o">:</span> <span class="s2">"example.com"</span>
<span class="n">service</span><span class="o">.</span><span class="na">beta</span><span class="o">.</span><span class="na">kubernetes</span><span class="o">.</span><span class="na">io</span><span class="o">/</span><span class="k">do</span><span class="o">-</span><span class="n">loadbalancer</span><span class="o">-</span><span class="n">redirect</span><span class="o">-</span><span class="n">http</span><span class="o">-</span><span class="n">to</span><span class="o">-</span><span class="n">https</span><span class="o">:</span> <span class="s2">"true"</span>
<span class="n">service</span><span class="o">.</span><span class="na">beta</span><span class="o">.</span><span class="na">kubernetes</span><span class="o">.</span><span class="na">io</span><span class="o">/</span><span class="k">do</span><span class="o">-</span><span class="n">loadbalancer</span><span class="o">-</span><span class="n">certificate</span><span class="o">-</span><span class="n">id</span><span class="o">:</span> <span class="s2">"9r3e053d-da5e-4390-b7b8-0fs23486e41q"</span>
<span class="n">spec</span><span class="o">:</span>
<span class="n">type</span><span class="o">:</span> <span class="n">LoadBalancer</span>
<span class="n">selector</span><span class="o">:</span>
<span class="n">app</span><span class="o">:</span> <span class="n">nginx</span><span class="o">-</span><span class="n">example</span>
<span class="n">ports</span><span class="o">:</span>
<span class="o">-</span> <span class="n">name</span><span class="o">:</span> <span class="n">https</span>
<span class="n">protocol</span><span class="o">:</span> <span class="n">TCP</span>
<span class="n">port</span><span class="o">:</span> <span class="mi">443</span>
<span class="n">targetPort</span><span class="o">:</span> <span class="mi">80</span>
<span class="o">---</span>
<span class="n">apiVersion</span><span class="o">:</span> <span class="n">extensions</span><span class="o">/</span><span class="n">v1beta1</span>
<span class="n">kind</span><span class="o">:</span> <span class="n">Deployment</span>
<span class="n">metadata</span><span class="o">:</span>
<span class="n">name</span><span class="o">:</span> <span class="n">nginx</span><span class="o">-</span><span class="n">example</span>
<span class="n">spec</span><span class="o">:</span>
<span class="n">replicas</span><span class="o">:</span> <span class="mi">1</span>
<span class="n">template</span><span class="o">:</span>
<span class="n">metadata</span><span class="o">:</span>
<span class="n">labels</span><span class="o">:</span>
<span class="n">app</span><span class="o">:</span> <span class="n">nginx</span><span class="o">-</span><span class="n">example</span>
<span class="n">spec</span><span class="o">:</span>
<span class="n">containers</span><span class="o">:</span>
<span class="o">-</span> <span class="n">name</span><span class="o">:</span> <span class="n">nginx</span>
<span class="n">image</span><span class="o">:</span> <span class="n">nginx</span>
<span class="n">ports</span><span class="o">:</span>
<span class="o">-</span> <span class="n">containerPort</span><span class="o">:</span> <span class="mi">80</span>
<span class="n">protocol</span><span class="o">:</span> <span class="n">TCP</span>
</pre></div>
<p>Let’s look a little closer at the <code>annotations</code> section:</p>
<div class="highlight"><pre><span></span> annotations:
external-dns.alpha.kubernetes.io/hostname: "example.com"
service.beta.kubernetes.io/do-loadbalancer-redirect-http-to-https: "true"
service.beta.kubernetes.io/do-loadbalancer-certificate-id: "9r3e053d-da5e-4390-b7b8-0fs23486e41q"
</pre></div>
<p><a href="https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/">Kubernetes annotations</a> are just metadata attached to a Kubernetes object. They can be used for anything from specifying a maintainer for the service to a git commit hash or other release information. They can also be used to pass on information to controllers. In our case, both the <a href="https://github.com/digitalocean/digitalocean-cloud-controller-manager">DigitalOcean Cloud Controller Manager</a> and the ExternalDNS controller are watching for services created with these annotations. Breaking down each one:</p>
<ul>
<li><code>external-dns.alpha.kubernetes.io/hostname</code> - Specifies the domain name to be assigned to the service</li>
<li><code>service.beta.kubernetes.io/do-loadbalancer-certificate-id</code> - Specifies the <span class="caps">ID</span> of the DigitalOcean managed <span class="caps">SSL</span> cert</li>
<li><code>service.beta.kubernetes.io/do-loadbalancer-redirect-http-to-https</code> - Configures the load balancer to automatically redirect clients from <span class="caps">HTTP</span> to <span class="caps">HTTPS</span></li>
</ul>
<p>After replacing the domain and certificate <span class="caps">ID</span> in the full example and saving it to a file, apply the configuration with:</p>
<div class="highlight"><pre><span></span>kubectl apply -f path/to/https-with-domain.yaml
</pre></div>
<p>Now let’s take a quick look at the logs for ExternalDNS by running:</p>
<div class="highlight"><pre><span></span>kubectl logs \
`kubectl get pod -l app=external-dns -o jsonpath="{.items[0].metadata.name}"`
</pre></div>
<p>When the record has been successfully configured, you will see two lines like:</p>
<div class="highlight"><pre><span></span>time="2019-04-04T01:19:11Z" level=info msg="Changing record." action=CREATE record=example.com ttl=300 type=A zone=example.com
time="2019-04-04T01:19:12Z" level=info msg="Changing record." action=CREATE record=example.com ttl=300 type=TXT zone=example.com
</pre></div>
<p>You might be wondering why it created two records. ExternalDNS uses <code>TXT</code> records to mark records that it manages. It will not modify any records without a corresponding <code>TXT</code> record.</p>
<h2>Wrapping It Up</h2>
<p>With our service successfully deployed, it will now be available at the configured domain with <span class="caps">SSL</span>. If we redeploy the service latter, the <span class="caps">DNS</span> record will persist even if the underlying <span class="caps">IP</span> address were to change. If you’re looking for more detail, here’s some further reading for you:</p>
<ul>
<li><a href="https://github.com/digitalocean/digitalocean-cloud-controller-manager/tree/master/docs/controllers/services/examples">Examples with additional configuration details for DigitalOcean load balancers using Kubernetes annotations</a></li>
<li><a href="https://github.com/helm/charts/tree/master/stable/external-dns#configuration">The full list of configuration details for the ExternalDNS Helm chart</a></li>
</ul>A Few Recent DigitalOcean Tools2017-04-04T00:00:00-04:002017-04-04T00:00:00-04:00andrewsomethingtag:blog.andrewsomething.com,2017-04-04:/2017/04/04/recent-digitalocean-tools/<p>Obligatory comment about how it’s been quite awhile since the last time I’ve blogged…</p>
<p>With that out of the way, I wanted to share a few things that I’ve done recently that might be useful for others. In particular, there are a couple <a href="https://www.digitalocean.com">DigitalOcean</a> related tools that …</p><p>Obligatory comment about how it’s been quite awhile since the last time I’ve blogged…</p>
<p>With that out of the way, I wanted to share a few things that I’ve done recently that might be useful for others. In particular, there are a couple <a href="https://www.digitalocean.com">DigitalOcean</a> related tools that might come in handy.</p>
<h2>fabric-digitalocean</h2>
<p>As I’ve written before, <a href="http://www.fabfile.org/">Fabric</a> is a great tool for automating some basic systems administration tasks. Recently, I wrote <code>fabric-digitalocean</code> in order to make it easier to use Fabric with DigitalOcean Droplets. It provides an <code>@droplets</code> decorator for use in your Fabfiles. It can take a list of Droplet IDs, a tag, or a region as an argument. Then, using the DigitalOcean <span class="caps">API</span>, these arguments are expanded to provide Fabric with a list of hosts.</p>
<p>More and more, <a href="https://www.digitalocean.com/company/blog/droplet-tagging-organize-your-infrastructure/">tagging</a> is becoming an important way to interact with DigitalOcean resources. For example, <span class="caps">DO</span> Load Balancers use tags for service discovery, and the <a href="https://www.digitalocean.com/company/blog/introducing-monitoring/">newly released Monitoring</a> functionality allows you to create alert policies based on tags. If you’re already using tags across your fleet, the ability to run tasks on instances based on how they are tagged is extremely convenient.</p>
<p>As a quick example, this Fabfile could be used to run the <code>uptime</code> on all Droplets tagged “production”:</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">fabric.api</span> <span class="kn">import</span> <span class="n">task</span><span class="p">,</span> <span class="n">run</span>
<span class="kn">from</span> <span class="nn">fabric_digitalocean.decorators</span> <span class="kn">import</span> <span class="n">droplets</span>
<span class="nd">@task</span>
<span class="nd">@droplets</span><span class="p">(</span><span class="n">tag</span><span class="o">=</span><span class="s1">'production'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">example</span><span class="p">():</span>
<span class="n">run</span><span class="p">(</span><span class="s1">'uptime'</span><span class="p">)</span>
</pre></div>
<p>It can be installed via <code>pip</code> with:</p>
<div class="highlight"><pre><span></span>pip install fabric-digitalocean
</pre></div>
<p>The source is <a href="https://github.com/andrewsomething/fabric-digitalocean">available on GitHub</a>. I’d love to hear any ideas you might have for other integration points between Fabric and the <span class="caps">DO</span> <span class="caps">API</span>.</p>
<h2>DigitalOcean monitoring agent Ansible role</h2>
<p>While Fabric obviously still has a place in my toolkit, <a href="https://www.ansible.com/">Ansible</a> has taken on a growing role in how I manage my infrastructure. It is flexible enough for both running one-off tasks and standing up services fully under configuration management.</p>
<p><a href="https://www.digitalocean.com/company/blog/improved-graphs/">In Janurary</a>, DigitalOcean released an <a href="https://github.com/digitalocean/do-agent">open-source monitoring agent</a>. It’s used to power both the graphs displaying Droplet metrics as well the new Monitoring and alerting features. You can optionally install the agent when creating new Droplets. Though if you have an existing fleet, it can be a bit tedious to install it on all of your currently running instances.</p>
<p>When I was backfilling the agent onto my existing Droplets, I wanted a single Ansible role that I could use regardless of the underlaying distribution. I was also eager to see what it takes to get something up on Ansible Galaxy, their hub for sharing and distributing roles. So I put together a role to install the agent on all supported distros and made it <a href="https://galaxy.ansible.com/andrewsomething/do-agent/">available there</a>.</p>
<p>You can install it with:</p>
<div class="highlight"><pre><span></span>ansible-galaxy install andrewsomething.do-agent
</pre></div>
<p>Once installed, an example playbook simply looks like:</p>
<div class="highlight"><pre><span></span>- hosts: all
become: true
roles:
- andrewsomething.do-agent
</pre></div>
<p>The source is also <a href="https://github.com/andrewsomething/ansible-role-do-agent">available on GitHub</a>.</p>Package Management with Fabric2015-08-03T22:45:00-04:002015-08-03T22:45:00-04:00andrewsomethingtag:blog.andrewsomething.com,2015-08-03:/2015/08/03/fabric-package-management/<p>Recently, I’ve been using <a href="http://www.fabfile.org/">Fabric</a> quite a bit. It is simple, Pythonic, and I’ve grown to enjoy using it for automating basic systems administration tasks when a full-fledged configuration management system is more than you need for the job.</p>
<p>For the most part, Fabric keeps to the basics …</p><p>Recently, I’ve been using <a href="http://www.fabfile.org/">Fabric</a> quite a bit. It is simple, Pythonic, and I’ve grown to enjoy using it for automating basic systems administration tasks when a full-fledged configuration management system is more than you need for the job.</p>
<p>For the most part, Fabric keeps to the basics, e.g. executing remote shell commands and uploading files. There are <a href="https://github.com/fabric/fabric/issues/461">quite a few sets of tools</a> that have popped up to extend it, but unfortunately there no is “official” contrib library. Many of these project serve very specific use cases like deploying a Django application and duplicate certain functionality.</p>
<p>One thing that I’ve become a bit frustrated with is copying around convenience functions into multiple Fabfiles. In particular, I end up cargo culting functions related to package management. So to finally rid myself of these, I’ve created <code>fabric-package-management</code>.</p>
<p>The source is on <a href="https://github.com/andrewsomething/fabric-package-management">GitHub</a>, and you can install it <a href="https://pypi.python.org/pypi/fabric-package-management/0.1">from PyPI</a> with:</p>
<div class="highlight"><pre><span></span>sudo pip install fabric-package-management
</pre></div>
<p>The aim is to provide basic primitives for package management with Fabric. Its focus is intentionally narrow. The 0.1 release only offers support for Apt, but I hope to see it grow support for more distributions. It could potentially add an abstraction layer for cross distro support.</p>
<p>Here’s a quick example of using it to update all your DigitalOcean servers:</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">digitalocean</span>
<span class="kn">from</span> <span class="nn">fabric.api</span> <span class="kn">import</span> <span class="n">task</span><span class="p">,</span> <span class="n">prompt</span><span class="p">,</span> <span class="n">env</span><span class="p">,</span> <span class="n">settings</span>
<span class="kn">from</span> <span class="nn">fabric.operations</span> <span class="kn">import</span> <span class="n">reboot</span>
<span class="kn">from</span> <span class="nn">fabric_package_management</span> <span class="kn">import</span> <span class="n">apt</span>
<span class="n">USER</span> <span class="o">=</span> <span class="s1">'username'</span>
<span class="k">def</span> <span class="nf">get_hosts</span><span class="p">():</span>
<span class="n">token</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getenv</span><span class="p">(</span><span class="s1">'DO_TOKEN'</span><span class="p">)</span>
<span class="n">manager</span> <span class="o">=</span> <span class="n">digitalocean</span><span class="o">.</span><span class="n">Manager</span><span class="p">(</span><span class="n">token</span><span class="o">=</span><span class="n">token</span><span class="p">)</span>
<span class="n">droplets</span> <span class="o">=</span> <span class="n">manager</span><span class="o">.</span><span class="n">get_all_droplets</span><span class="p">()</span>
<span class="n">hosts</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">droplets</span><span class="p">:</span>
<span class="n">hosts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">ip_address</span><span class="p">)</span>
<span class="k">return</span> <span class="n">hosts</span>
<span class="nd">@task</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">run</span><span class="p">():</span>
<span class="n">hosts</span> <span class="o">=</span> <span class="n">get_hosts</span><span class="p">()</span>
<span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="n">hosts</span><span class="p">:</span>
<span class="k">with</span> <span class="n">settings</span><span class="p">(</span><span class="n">host_string</span><span class="o">=</span><span class="n">h</span><span class="p">,</span> <span class="n">user</span><span class="o">=</span><span class="n">USER</span><span class="p">):</span>
<span class="n">apt</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="n">apt</span><span class="o">.</span><span class="n">upgrade</span><span class="p">()</span>
<span class="k">if</span> <span class="n">apt</span><span class="o">.</span><span class="n">reboot_required</span><span class="p">():</span>
<span class="n">prompt</span><span class="p">(</span><span class="s2">"Reboot required. Initiate now?</span><span class="se">\n</span><span class="s2">Yes/No?"</span><span class="p">,</span>
<span class="s2">"response"</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="s2">"No"</span><span class="p">,</span>
<span class="n">validate</span><span class="o">=</span><span class="sa">r</span><span class="s1">'yes|Yes|YES|no|No|NO'</span><span class="p">)</span>
<span class="k">if</span> <span class="n">env</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s2">"yes"</span><span class="p">:</span>
<span class="n">reboot</span><span class="p">()</span>
</pre></div>
<p>Hope you find this useful!</p>DigitalOcean Indicator2014-04-25T18:45:00-04:002014-04-25T18:45:00-04:00andrewsomethingtag:blog.andrewsomething.com,2014-04-25:/2014/04/25/digitalocean-indicator-release/<p><img alt="DigitalOcean Indicator screenhot" src="//i.imgur.com/ssV10vC.png"></p>
<p>The other weekend I took some time to play around with the <a href="https://developers.digitalocean.com/">DigitalOcean <span class="caps">API</span>,</a>
and this is what resulted. The <a href="https://github.com/andrewsomething/digitalocean-indicator">DigitalOcean indicator</a> allows you to monitor and
manage your droplets directly from your panel. You can:</p>
<ul>
<li>Quickly see which droplets are active.</li>
<li>Reboot, power on, and/or power down you …</li></ul><p><img alt="DigitalOcean Indicator screenhot" src="//i.imgur.com/ssV10vC.png"></p>
<p>The other weekend I took some time to play around with the <a href="https://developers.digitalocean.com/">DigitalOcean <span class="caps">API</span>,</a>
and this is what resulted. The <a href="https://github.com/andrewsomething/digitalocean-indicator">DigitalOcean indicator</a> allows you to monitor and
manage your droplets directly from your panel. You can:</p>
<ul>
<li>Quickly see which droplets are active.</li>
<li>Reboot, power on, and/or power down you droplets.</li>
<li>Copy your droplet’s <span class="caps">IP</span> address with a click for easy access.</li>
</ul>
<p>You can install it on Ubuntu from my <span class="caps">PPA</span>:</p>
<div class="highlight"><pre><span></span>sudo add-apt-repository ppa:andrewsomething/digitalocean
sudo apt-get update
sudo apt-get install digitalocean-indicator
</pre></div>
<p>It leverages <a href="https://github.com/koalalorenzo/python-digitalocean">python-digitalocean</a>, an <span class="caps">API</span> wrapper by <a href="https://github.com/koalalorenzo">Lorenzo Setale</a>. It’s
also package for Ubuntu in my <span class="caps">PPA</span>.</p>Introducing StackBrowser (and random thoughts on the new Ubuntu SDK)2013-09-12T21:57:00-04:002013-09-12T21:57:00-04:00andrewsomethingtag:blog.andrewsomething.com,2013-09-12:/2013/09/12/introducing-stackbrowser-and-random-thoughts-on-the-new-ubuntu-sdk/<p><img alt="" src="//blog.andrewsomething.com/images/2013/09/kazam_screenshot_00000.png"></p>
<p>If you follow me on Google+, you already know about this, but it seems
like it’s time to introduce this to a larger audience. Mostly an excuse
to play with the new <a href="http://developer.ubuntu.com/get-started/">Ubuntu <span class="caps">SDK</span></a>, I’ve created StackBrowser. It
allows you to explore the StackExchange network natively on Ubuntu …</p><p><img alt="" src="//blog.andrewsomething.com/images/2013/09/kazam_screenshot_00000.png"></p>
<p>If you follow me on Google+, you already know about this, but it seems
like it’s time to introduce this to a larger audience. Mostly an excuse
to play with the new <a href="http://developer.ubuntu.com/get-started/">Ubuntu <span class="caps">SDK</span></a>, I’ve created StackBrowser. It
allows you to explore the StackExchange network natively on Ubuntu
Touch. It’s written in pure <span class="caps">QML</span>/ JavaScript.</p>
<p><img alt="" src="//blog.andrewsomething.com/images/2013/09/kazam_screenshot_00001.png"></p>
<p>Currently you can:</p>
<ul>
<li>Browse and view recent questions</li>
<li>Search questions by tag</li>
<li>Browse, search, and view users</li>
</ul>
<p>The roadmap for future releases includes a “convergence” layout (i.e
tablet/desktop view) and accessing your global inbox.</p>
<p>StackBrowser is available in the Ubuntu Touch Software Center. It can be
tested on a 13.10 Ubuntu desktop system, or on earlier releases if you
have the <span class="caps">SDK</span> installed, by grabbing its source from <a href="https://launchpad.net/stackbrowser">Launchpad</a>:</p>
<div class="highlight"><pre><span></span> bzr branch lp:stackbrowser
cd stackbrowser
qmlscene stackbrowser.qml
</pre></div>
<p>You can of course <a href="https://bugs.launchpad.net/stackbrowser">report bugs there</a> as well.</p>
<p><img alt="" src="//blog.andrewsomething.com/images/2013/09/kazam_screenshot_00002.png"></p>
<h2>Some random thoughts on the <span class="caps">SDK</span> and Ubuntu Touch apps</h2>
<ul>
<li>I’ve enjoyed working with Qml for the most part. It’s really quick
and painless to build a nice <span class="caps">UI</span>. StackBrowser, admittedly not a very
complex app, was built in a hour here and an hour there over the
course of just a few days.</li>
<li>Though I think that I’ve still got a lot of learning to do about the
“Qml way,” if such a thing exists. I guess maybe the term I’m
looking for is ”declarative nature.”</li>
<li>I’d much rather write code in Python than JavaScript. <a href="https://plus.google.com/102795169786046713434/posts/imZAq7pcdR8">Hopefully that will be possible.</a></li>
<li>Relatedly, it feels like once an app becomes sufficiently ambitious,
you need to use C++.</li>
<li>There are some very simple things you can’t do in Qml/<span class="caps">JS</span> like write
a file to disk.</li>
<li>There are places where there are strange holes in what you can do
with Qml. For instance, you can <a href="http://qt-project.org/doc/qt-5.1/qtmultimedia/qml-qtmultimedia5-cameracapture.html">take pictures</a>, <a href="http://qt-project.org/doc/qt-5.1/qtmultimedia/qml-qtmultimedia5-camerarecorder.html">record video</a>,
and <a href="http://qt-project.org/doc/qt-5.1/qtmultimedia/qml-qtmultimedia5-mediaplayer.html">play media</a> all using pure <span class="caps">QML</span>.<a href="http://askubuntu.com/questions/338610/access-microphone-record-sound-from-qml">Yet, I can’t find any way to record audio with just <span class="caps">QML</span>.</a> Maybe I’m missing something?</li>
<li>I’ve got an idea for a location aware app, but<a href="http://askubuntu.com/questions/344831/how-to-access-geolocation-information-on-ubuntu-touch">I’ve found the docs to be very wanting.</a></li>
<li>There’s a lot of great work going on in <a href="https://launchpad.net/ubuntu-phone-coreapps">the core apps project</a>,
and it is very much a community effort.</li>
<li>The focus right now seems to be on the velocity of the development,
but I’d like to see the core apps project become a more cohesive
project (i.e. run more like say <span class="caps">GNOME</span> or <span class="caps">KDE</span>) and more integrated
into Ubuntu governance.</li>
<li>I miss the larger collection of standard widgets available in Gtk.</li>
<li>Relate to the two above points,<a href="https://lists.launchpad.net/ubuntu-phone/msg03972.html">I’ve noticed</a> a couple place where
some core apps have different implementations of the same thing
(e.g. location selection) with different visual styles and different behaviors.</li>
<li>Maybe it’s just because most of my contributions to free software
have been packaging things for Debian and Ubuntu, but the fact that
people are being encouraged to bundle dependencies in click packages
make me feel dirty.</li>
<li>That said, just clicking a button in QtCreator and attaching the
result to a webform was extremely simple.</li>
<li>My app was available to install just a few hours after submission.
Wonder how that will scale?</li>
</ul>
<p>Wow, that was a bit stream of conscience like…</p>Introducing Bug 2 Trello2013-06-13T19:35:00-04:002013-06-13T19:35:00-04:00andrewsomethingtag:blog.andrewsomething.com,2013-06-13:/2013/06/13/introducing-bug-2-trello/<p>For some time now, I’ve been using <a href="https://trello.com/">Trello</a> to organize my free
software contributions. My main use is to give me a cross-project view
of what I’m working on. As most of my contributions stem from packaging
software for Debian and Ubuntu, I end up working on and …</p><p>For some time now, I’ve been using <a href="https://trello.com/">Trello</a> to organize my free
software contributions. My main use is to give me a cross-project view
of what I’m working on. As most of my contributions stem from packaging
software for Debian and Ubuntu, I end up working on and following bugs
across many different hosting projects (e.g. Launchpad, Debian’s <span class="caps">BTS</span>,
GitHub). Each does a decent job (some better than others) of displaying
and prioritizing issues within a certain project. Though a bug that is
critical in a project that I’m only tangentially interested in might be
a lower priority from me personally than a wishlist issue in a different
project. So Trello has been extremely helpful in giving me a global view
of how I should be spending my limited time across projects. Though
putting information from all of these different places into Trello can
be tedious…</p>
<p>So that’s why I created <a href="https://chrome.google.com/webstore/detail/bug-2-trello/aomnoofmdnaccffobkddehcmdihggcke">Bug 2 Trello,</a> a Chrome extension to add
bugs/issues to a Trello board.</p>
<iframe width="560" height="315" src="//www.youtube.com/embed/MMgeP0DH9c4" frameborder="0" allowfullscreen></iframe>
<p>It currently supports Launchpad, GitHub, SourceForge, Google Code,
BitBucket, and Debian’s <span class="caps">BTS</span>. There is also support for some Bugzilla
instances. This support currently requires that the <span class="caps">JSON</span>-<span class="caps">RPC</span> interface
is available. It is known to work with with Wikimedia, Mozilla, <span class="caps">KDE</span>,
Apache, and Redhat. It is known <em>not</em> to work with <span class="caps">GNOME</span>, Kernel.org,
and Novell.</p>
<ul>
<li>Install it from the Chrome
Store: <a href="https://chrome.google.com/webstore/detail/bug2trello/aomnoofmdnaccffobkddehcmdihggcke">https://chrome.google.com/webstore/detail/bug2trello/aomnoofmdnaccffobkddehcmdihggcke</a></li>
<li>Report bugs: <a href="https://github.com/andrewsomething/bug2trello/issues">https://github.com/andrewsomething/bug2trello/issues</a></li>
<li>Grab the
code: <code>git clone git://github.com/andrewsomething/bug2trello.git</code></li>
</ul>
<p>Bug 2 Trello is licensed under the <span class="caps">MIT</span> License.</p>Introducing TypeCatcher2012-11-11T23:00:00-05:002012-11-11T23:00:00-05:00andrewsomethingtag:blog.andrewsomething.com,2012-11-11:/2012/11/11/introducing-typecatcher/<p><img alt="" src="//blog.andrewsomething.com/images/2012/11/typecatcher_0012.png"></p>
<p>After helping to review applications for the Ubuntu App Showdown, I had
the urge to take another look at the state of quickly, Ubuntu’s quick
starter for app development. So here we have <a href="https://launchpad.net/typecatcher">TypeCatcher</a>. It allows
you to search, browse, and download Google webfonts for off-line use.
You can …</p><p><img alt="" src="//blog.andrewsomething.com/images/2012/11/typecatcher_0012.png"></p>
<p>After helping to review applications for the Ubuntu App Showdown, I had
the urge to take another look at the state of quickly, Ubuntu’s quick
starter for app development. So here we have <a href="https://launchpad.net/typecatcher">TypeCatcher</a>. It allows
you to search, browse, and download Google webfonts for off-line use.
You can preview fonts with adjustable size and text.</p>
<p>It was mostly written in one Sunday afternoon a few months back. Though
I put it aside for awhile, mostly out of my inability to come up with a
name for it. The delay did allow me to flesh it out a bit. For the most
part I was quite happy with quickly. The templates really do get you up
and running fast. Though as I’m extremely comfortable with both bzr and
Debian packaging, I didn’t really employ its ability to hide those parts
from users.</p>
<p>(As a side note, on place where quickly fell a bit short for me was
renaming the project. Sometimes you just want to start hacking and then
think about naming later, but quickly uses your project name in file
names and classes all over the place. It would be nice to bake project
renaming into its <span class="caps">UI</span>. There is already a <a href="https://bugs.launchpad.net/quickly/+bug/667492">bug report about this on
Launchpad</a>including a renaming script in the comments.)</p>
<p>After dogfooding the app writing tools, I think I’ll probably test
the <a href="http://developer.ubuntu.com/publish/">submission process</a> for the Ubuntu Extras repository as well. For
now though, you can install it for Ubuntu 12.10 from my <span class="caps">PPA</span>:</p>
<div class="highlight"><pre><span></span>sudo add-apt-repository ppa:andrewsomething/typecatcher
sudo apt-get update && sudo apt-get install typecatcher
</pre></div>
<p>You can also grab the source from bzr on Launchpad:</p>
<div class="highlight"><pre><span></span>bzr branch lp:typecatcher
</pre></div>
<p><a href="https://bugs.launchpad.net/typecatcher">Bugs and feature requests</a> welcome there as well.</p>
<p>And of course, who doesn’t love screenshots:</p>
<p><img alt="" src="//blog.andrewsomething.com/images/2012/11/selection_005.png">
<img alt="" src="//blog.andrewsomething.com/images/2012/11/typecatcher_003.png">
<img alt="" src="//blog.andrewsomething.com/images/2012/11/typecatcher_004.png">
<img alt="" src="//blog.andrewsomething.com/images/2012/11/typecatcher_006.png">
<img alt="" src="//blog.andrewsomething.com/images/2012/11/typecatcher_002.png"></p>Automation with Google Apps Script2012-03-11T19:56:00-04:002012-03-11T19:56:00-04:00andrewsomethingtag:blog.andrewsomething.com,2012-03-11:/2012/03/11/automation-with-google-apps-script/<p>I maintain a <a href="http://andrewsomething.wordpress.com/2011/08/19/ubuntu-release-calendar/">GCal of the Ubuntu release schedule</a>, and I just updated
it to contain the proposed schedule for the Q-series. As you can
imagine, adding all those events by hand can be annoying. Luckily you
can use <a href="http://code.google.com/googleapps/appsscript/guide.html">Google App Script</a>, which is more or less JavaScript for the …</p><p>I maintain a <a href="http://andrewsomething.wordpress.com/2011/08/19/ubuntu-release-calendar/">GCal of the Ubuntu release schedule</a>, and I just updated
it to contain the proposed schedule for the Q-series. As you can
imagine, adding all those events by hand can be annoying. Luckily you
can use <a href="http://code.google.com/googleapps/appsscript/guide.html">Google App Script</a>, which is more or less JavaScript for the
Google Cloud, to automate tasks like this.</p>
<p>I could have probably come up with something to automate the entire
process start to finish, scrapping the wiki every few days and pushing
out updates. But this isn’t something that I have to do all that often,
so I just wanted to write something quick and simple. Here’s what I
ended up with:</p>
<div class="highlight"><pre><span></span><span class="kd">var</span> <span class="nx">EVENT_ADDED</span> <span class="o">=</span> <span class="s2">"EVENT_ADDED"</span><span class="p">;</span>
<span class="kd">function</span> <span class="nx">sheet2cal() {</span>
<span class="kd">var</span> <span class="nx">sheet</span> <span class="o">=</span> <span class="nx">SpreadsheetApp</span><span class="p">.</span><span class="nx">getActiveSheet</span><span class="p">();</span>
<span class="kd">var</span> <span class="nx">startRow</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="c1">// First row of data to process</span>
<span class="kd">var</span> <span class="nx">numRows</span> <span class="o">=</span> <span class="nx">sheet</span><span class="p">.</span><span class="nx">getLastRow</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="c1">// Number of rows to process</span>
<span class="kd">var</span> <span class="nx">dataRange</span> <span class="o">=</span> <span class="nx">sheet</span><span class="p">.</span><span class="nx">getRange</span><span class="p">(</span><span class="nx">startRow</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">numRows</span><span class="p">,</span> <span class="mi">5</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">data</span> <span class="o">=</span> <span class="nx">dataRange</span><span class="p">.</span><span class="nx">getValues</span><span class="p">();</span>
<span class="kd">var</span> <span class="nx">cal</span> <span class="o">=</span> <span class="nx">CalendarApp</span><span class="p">.</span><span class="nx">openByName</span><span class="p">(</span><span class="s2">"Ubuntu Release Schedule"</span><span class="p">);</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">data</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="o">++</span><span class="nx">i</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">row</span> <span class="o">=</span> <span class="nx">data</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
<span class="kd">var</span> <span class="nx">tstart</span> <span class="o">=</span> <span class="nx">row</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
<span class="kd">var</span> <span class="nx">title</span> <span class="o">=</span> <span class="nx">row</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
<span class="kd">var</span> <span class="nx">desc</span> <span class="o">=</span> <span class="nx">row</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
<span class="kd">var</span> <span class="nx">tstop</span> <span class="o">=</span> <span class="s2">""</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">eventAdded</span> <span class="o">=</span> <span class="nx">row</span><span class="p">[</span><span class="mi">4</span><span class="p">];</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">eventAdded</span> <span class="o">!=</span> <span class="nx">EVENT_ADDED</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// Prevents sending duplicates</span>
<span class="nx">cal</span><span class="p">.</span><span class="nx">createAllDayEvent</span><span class="p">(</span><span class="nx">title</span><span class="p">,</span> <span class="nx">tstart</span><span class="p">,</span> <span class="p">{</span><span class="nx">description</span>:<span class="kt">desc</span><span class="p">});</span>
<span class="nx">sheet</span><span class="p">.</span><span class="nx">getRange</span><span class="p">(</span><span class="nx">startRow</span> <span class="o">+</span> <span class="nx">i</span><span class="p">,</span> <span class="mi">5</span><span class="p">).</span><span class="nx">setValue</span><span class="p">(</span><span class="nx">EVENT_ADDED</span><span class="p">);</span>
<span class="nx">SpreadsheetApp</span><span class="p">.</span><span class="nx">flush</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p>This iterates through a spreadsheet where the first column is the
event’s date, the second one is the title, and the third is the
description. It also checks a fourth column to make sure the event
hasn’t already been added, marking events added as it goes. It is
closely based on the <a href="http://code.google.com/googleapps/appsscript/articles/sending_emails.html">example</a> of how to send emails from a spreadsheet.</p>
<p>To add a script like this, go to <strong>Tools > Script editor…</strong> in your
spreadsheet. This will open an <span class="caps">IDE</span> where you can write, run, and debug
your script. If you want, you can add a custom menu on your
spreadsheet’s tool bar to trigger the script with something like:</p>
<div class="highlight"><pre><span></span><span class="kd">function</span> <span class="nx">onOpen() {</span>
<span class="kd">var</span> <span class="nx">ss</span> <span class="o">=</span> <span class="nx">SpreadsheetApp</span><span class="p">.</span><span class="nx">getActiveSpreadsheet</span><span class="p">();</span>
<span class="kd">var</span> <span class="nx">menuEntries</span> <span class="o">=</span> <span class="p">[</span> <span class="p">{</span><span class="nx">name</span><span class="o">:</span> <span class="s2">"Add to calendar"</span><span class="p">,</span> <span class="nx">functionName</span><span class="o">:</span> <span class="s2">"sheet2cal"</span><span class="p">}</span> <span class="p">];</span>
<span class="nx">ss</span><span class="p">.</span><span class="nx">addMenu</span><span class="p">(</span><span class="s2">"Scripts"</span><span class="p">,</span> <span class="nx">menuEntries</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
<p>You can also set scripts that will be <a href="http://code.google.com/googleapps/appsscript/guide_events.html#TimeTriggers">triggered at specific time
intervals</a>, <a href="http://code.google.com/googleapps/appsscript/class_urlfetchapp.html">communicate with other services</a>, and do things like
<a href="http://code.google.com/googleapps/appsscript/class_utilities.html#jsonParse">parse <span class="caps">JSON</span></a>. This opens up a lot of possibilities.</p>
<p>For instance, I’m on a team that is using <a href="https://trello.com/">Trello</a> for internal
organization and task tracking. <a href="http://kevinpelgrims.com/blog/2012/03/06/project-progress-tracking-with-google-docs-and-trello">Kevin Pelgrims has a great example</a>
of integrating Trello and Google Docs to track project progress over
time that I’ve started using.</p>“Formalities are boring.”2011-11-09T06:33:00-05:002011-11-09T06:33:00-05:00andrewsomethingtag:blog.andrewsomething.com,2011-11-09:/2011/11/09/formalities-are-boring/<p><img alt="Old Faithful" src="http://farm3.static.flickr.com/2785/4264882098_d5bf67f2dc_m.jpg"></p>
<p>I’ve been following <a href="https://lists.ubuntu.com/archives/ubuntu-desktop/2011-November/003393.html">the discussion</a> around the potential switch from
Banshee back to Rhythmbox for Precise, and I really don’t have all that
much to add. Though I did come across <a href="http://www.robpvn.net/2011/11/08/ubuntu-either-doesnt-know-how-important-theyve-become-or-they-dont-care/">an interesting post</a> from an
upstream Tomboy developer that deserves some wider attention. He argues
that “upstreams …</p><p><img alt="Old Faithful" src="http://farm3.static.flickr.com/2785/4264882098_d5bf67f2dc_m.jpg"></p>
<p>I’ve been following <a href="https://lists.ubuntu.com/archives/ubuntu-desktop/2011-November/003393.html">the discussion</a> around the potential switch from
Banshee back to Rhythmbox for Precise, and I really don’t have all that
much to add. Though I did come across <a href="http://www.robpvn.net/2011/11/08/ubuntu-either-doesnt-know-how-important-theyve-become-or-they-dont-care/">an interesting post</a> from an
upstream Tomboy developer that deserves some wider attention. He argues
that “upstreams would be more than happy to do a lot of stuff for Ubuntu
if only Ubuntu actually let them know what they wanted in some sort of
predictable fashion.”</p>
<blockquote>
<p>Ubuntu either doesn’t know how important they’ve become, or they don’t
care. Developers in upstream apps know that getting exposure in Ubuntu
means an incredible influx of new users, which in turn leads to new
bug reporters, which finally means new contributors. It’s well known
that each of these groups is an order of magnitude smaller than the
last, so making sure the user group is as big as possible is vital for
an application. And because upstream knows this, they are willing to
bend over backwards to accommodate Ubuntu’s wishes.</p>
</blockquote>
<p>He also tells a story about Tomboy nearly being dropped last cycle due
to depending on a number of libraries that the desktop team wanted to
drop form the <span class="caps">CD</span> images. He goes on to suggest that formalizing the
procedure around these sorts of things would reduce a lot of confusion
and let upstreams know where they stand.</p>
<p>This seems entirely reasonable to me. The Banshee issue aside, it would
be great if there was a formal announcement at some set point in the
cycle where the targeted development goals for the platform are laid out
in one place. If you follow closely this information is already
announced, but it is in a trickle of different messages to the devel and
desktop lists. The idea would be to compile this information into one
clear widely-publicized announcement. It would be early enough in the
cycle that upstreams, derivatives, and other stake holders would have
time to react. It would also make clear that any discussion before that
point is just that, discussion not decisions. The existing <a href="https://wiki.ubuntu.com/FeatureDefinitionFreeze">Feature
Definition Freeze</a> would probably make for a nice fit.</p>Fun with graphs2011-10-09T20:01:00-04:002011-10-09T20:01:00-04:00andrewsomethingtag:blog.andrewsomething.com,2011-10-09:/2011/10/09/fun-with-graphs/<p>For awhile now, I’ve felt like the ubuntu-motu mailing list has been a
shadow of its former self. It turns out that empirical data backs up
this feeling. I produced a histogram of mailinglist volume over time:</p>
<p><img alt="motu" src="//blog.andrewsomething.com/images/2011/10/motu.png"></p>
<p>I also figured I should take a look at ubuntu-devel:</p>
<p><img alt="devel" src="//blog.andrewsomething.com/images/2011/10/devel.png"></p>
<p>That graph …</p><p>For awhile now, I’ve felt like the ubuntu-motu mailing list has been a
shadow of its former self. It turns out that empirical data backs up
this feeling. I produced a histogram of mailinglist volume over time:</p>
<p><img alt="motu" src="//blog.andrewsomething.com/images/2011/10/motu.png"></p>
<p>I also figured I should take a look at ubuntu-devel:</p>
<p><img alt="devel" src="//blog.andrewsomething.com/images/2011/10/devel.png"></p>
<p>That graph raises the question what happened at the end of 2006. Of
course, that was when ubuntu-devel-discuss was started:</p>
<p><img alt="devel-discuss" src="//blog.andrewsomething.com/images/2011/10/devel-discuss.png"></p>
<p>I’m not sure what this all means, but I do find it interesting in the
context of some recent discussion on the direction of the Ubuntu community.</p>
<hr>
<p>You can find the python code I used in a <a href="https://gist.github.com/1273952">GitHub gist</a>. It takes an
mbox file and produces a histogram using <a href="http://matplotlib.sourceforge.net/">matplotlib</a>. It is
shamelessly based off of <a href="https://gist.github.com/913543">code by Takafumi Arakaki</a> that was
designed to plot a histogram of the commit frequency of a Mercurial or
Git repository by reading newline separated unix time via <span class="caps">STDIN</span>. I just
rewrote the <code>read_dates()</code> function. If someone has a simpler way of
doing the date conversion, I’d love to see it. What I did was a bit convoluted.</p>Ubuntu Developer Membership Board Election2011-08-23T12:57:00-04:002011-08-23T12:57:00-04:00andrewsomethingtag:blog.andrewsomething.com,2011-08-23:/2011/08/23/ubuntu-developer-membership-board-election/<p><img alt="Voting Machine" src="http://farm3.static.flickr.com/2727/4345526574_5450a74a3f.jpg"></p>
<p>An election for a recently opened spot on the <a href="https://wiki.ubuntu.com/DeveloperMembershipBoard"><span class="caps">DMB</span></a> has just begun.
While all the names of those nominated are familiar to me, I still need
some more information to make a decision. All of the candidates
are eminently qualified. Unfortunately, the call for votes didn’t
include any …</p><p><img alt="Voting Machine" src="http://farm3.static.flickr.com/2727/4345526574_5450a74a3f.jpg"></p>
<p>An election for a recently opened spot on the <a href="https://wiki.ubuntu.com/DeveloperMembershipBoard"><span class="caps">DMB</span></a> has just begun.
While all the names of those nominated are familiar to me, I still need
some more information to make a decision. All of the candidates
are eminently qualified. Unfortunately, the call for votes didn’t
include any statements of intent from the candidates. Votes will be
accepted through 2011-09-06 12:00 (presumably <span class="caps">UTC</span>). So perhaps we’ll
hear from the candidates themselves. Until then, to save others a little
bit of Googling, here are their Launchpad profiles and Ubuntu wiki pages:</p>
<ul>
<li>Charlie Smotherman (porthose) - <a href="https://launchpad.net/~cjsmo">Launchpad</a> - <a href="https://wiki.ubuntu.com/CharlieSmotherman">Wiki</a></li>
<li>Micah Gersten (micahg) - <a href="https://launchpad.net/~micahg">Launchpad</a> - <a href="https://wiki.ubuntu.com/micahg">Wiki</a></li>
<li>Stefano Rivera (tumbleweed) - <a href="https://launchpad.net/~stefanor">Launchpad</a> - <a href="https://wiki.ubuntu.com/StefanoRivera">Wiki</a></li>
<li>Dave Walker (Daviey) - <a href="https://launchpad.net/~davewalker">Launchpad</a> - <a href="https://wiki.ubuntu.com/davewalker">Wiki</a></li>
</ul>Ubuntu Release Calendar2011-08-19T23:39:00-04:002011-08-19T23:39:00-04:00andrewsomethingtag:blog.andrewsomething.com,2011-08-19:/2011/08/19/ubuntu-release-calendar/<p><img alt="Calendar" src="//blog.andrewsomething.com/images/2011/08/vcalendar.png">One thing I’ve been missing recently has been having the
Ubuntu <a href="https://wiki.ubuntu.com/ReleaseSchedule">release schedule</a> in my calendar. <a href="https://launchpad.net/~vorlon">Steve Langasek</a> used to
provide <a href="http://people.ubuntu.com/~vorlon/UbuntuReleaseSchedule.ics">one in ical format</a>, but it wasn’t update for Natty nor
Oneiric. <a href="http://fridge.ubuntu.com/calendars/fridge/">The Fridge</a> has a calandar containing a schedule of events
for #ubuntu-meeting, but that doesn …</p><p><img alt="Calendar" src="//blog.andrewsomething.com/images/2011/08/vcalendar.png">One thing I’ve been missing recently has been having the
Ubuntu <a href="https://wiki.ubuntu.com/ReleaseSchedule">release schedule</a> in my calendar. <a href="https://launchpad.net/~vorlon">Steve Langasek</a> used to
provide <a href="http://people.ubuntu.com/~vorlon/UbuntuReleaseSchedule.ics">one in ical format</a>, but it wasn’t update for Natty nor
Oneiric. <a href="http://fridge.ubuntu.com/calendars/fridge/">The Fridge</a> has a calandar containing a schedule of events
for #ubuntu-meeting, but that doesn’t include the release schedule.
It’s also a bit too high volume for me to want to keep it in my main calendar view.</p>
<p>So without further adieu, I am announcing that I will be maintaining a
public Google Calendar for the Ubuntu release schedule.</p>
<ul>
<li><span class="caps">HTML</span> - <a href="http://goo.gl/q4yZV">http://goo.gl/q4yZV</a></li>
<li><span class="caps">ICAL</span> - <a href="http://goo.gl/TUzUd">http://goo.gl/TUzUd</a></li>
</ul>
<div>
Please feel free to subscribe to it.
</div>Can i haz answers?2011-07-14T03:12:00-04:002011-07-14T03:12:00-04:00andrewsomethingtag:blog.andrewsomething.com,2011-07-14:/2011/07/14/can-i-haz-answers/<p><a href="http://askubuntu.com/"><img alt="AskUbuntu" src="//blog.andrewsomething.com/images/2011/07/otop6.png"></a></p>
<p><a href="http://askubuntu.com/">AskUbuntu</a> is continuing to grow. According to the
Stack Exchange <a href="http://stackexchange.com/sites">site directory</a>, we have:</p>
<ul>
<li>17k Questions</li>
<li>31k Answers</li>
<li>19k User</li>
<li>21k Visits/Day</li>
<li>81% of questions have accepted answers</li>
</ul>
<p>While 81% puts us into the same league as Stack Overflow and Super User,
we still have hundreds of questions without …</p><p><a href="http://askubuntu.com/"><img alt="AskUbuntu" src="//blog.andrewsomething.com/images/2011/07/otop6.png"></a></p>
<p><a href="http://askubuntu.com/">AskUbuntu</a> is continuing to grow. According to the
Stack Exchange <a href="http://stackexchange.com/sites">site directory</a>, we have:</p>
<ul>
<li>17k Questions</li>
<li>31k Answers</li>
<li>19k User</li>
<li>21k Visits/Day</li>
<li>81% of questions have accepted answers</li>
</ul>
<p>While 81% puts us into the same league as Stack Overflow and Super User,
we still have hundreds of questions without any answer at all. In fact,
about 10% of all are questions are <a href="http://askubuntu.com/unanswered">unanswered</a>. Here’s just a handful
of them:</p>
<ul>
<li><a href="http://askubuntu.com/q/14042/570">How to restrict / limit the number of <span class="caps">RDP</span> sessions?</a></li>
<li><a href="http://askubuntu.com/q/48371/570">How do I configure a fingerprint scanner?</a></li>
<li><a href="http://askubuntu.com/q/42144/570">How to set up a Serial-to-Ethernet Converter With a Virtual Serial Port?</a></li>
<li><a href="http://askubuntu.com/q/43318/570">How do I share files with a Mac?</a></li>
<li><a href="http://askubuntu.com/q/32926/570">Where are debug symbols for backported packages?</a></li>
<li><a href="http://askubuntu.com/q/44806/570">Anyone using <span class="caps">KVM</span> with Spice protocol on Ubuntu?</a></li>
<li><a href="http://askubuntu.com/q/46840/570">Check if pendrive is persistent?</a></li>
</ul>
<p>Killing some free time on the internets? How about you stop looking at
lolcatz and answer a few questions that slipped through the cracks? How
about starting with mine:</p>
<p><a href="http://askubuntu.com/q/53014/570">Why use sbuild over pbuilder?</a></p>
<p><img alt="StackExchange Error Lolcat" src="http://blog.stackoverflow.com/wp-content/uploads/error-lolcat-problemz.jpg"></p>GPG key transition2010-09-24T22:21:00-04:002010-09-24T22:21:00-04:00andrewsomethingtag:blog.andrewsomething.com,2010-09-24:/2010/09/24/gpg-key-transition/<p>I’ve recently set up a stronger (4096R) OpenPGP key, and will be
transitioning away from my old (1024D) one. The old key will continue to
be valid for some time, but i prefer all future correspondence to come
to the new one. I would also like this new key …</p><p>I’ve recently set up a stronger (4096R) OpenPGP key, and will be
transitioning away from my old (1024D) one. The old key will continue to
be valid for some time, but i prefer all future correspondence to come
to the new one. I would also like this new key to be re-integrated into
the web of trust. Please find here <a href="http://people.ubuntu.com/~andrewsomething/key-transition-2010-09-24.txt">a statement signed with both
keys</a>, certifying the transition.</p>
<p>The old key was:</p>
<div class="highlight"><pre><span></span>pub 1024D/6286FB6D 2007-11-03 Key fingerprint = 62EE D4F4 6D46 BE9E FF02 220A 2F89 3E7C 6286 FB6D
</pre></div>
<p>And the new key is:</p>
<div class="highlight"><pre><span></span>pub 4096R/D53FDCB1 2010-09-24 Key fingerprint = 6EB2 23D7 D71E 67A5 3C93 A7DA 3B56 E2BB D53F DCB1
</pre></div>
<p>To fetch my new key from a public key server, you can simply do:</p>
<div class="highlight"><pre><span></span>gpg --keyserver pgp.mit.edu --recv-key D53FDCB1
</pre></div>
<p>If you already know my old key, you can now verify that the new key is
signed by the old one:</p>
<div class="highlight"><pre><span></span>gpg --check-sigs D53FDCB1
</pre></div>
<p>If you don’t already know my old key, or you just want to be double
extra paranoid, you can check the fingerprint against the one above:</p>
<div class="highlight"><pre><span></span>gpg --fingerprint D53FDCB1
</pre></div>
<p>If you are satisfied that you’ve got the right key, and the UIDs match
what you expect, I’d appreciate it if you would sign my key:</p>
<div class="highlight"><pre><span></span>gpg --sign-key D53FDCB1
</pre></div>
<p>Lastly, if you could upload these signatures, i would appreciate it. You
can just upload the signatures to a public keyserver directly:</p>
<div class="highlight"><pre><span></span>gpg --keyserver pgp.mit.edu --send-key D53FDCB1
</pre></div>
<p>Thanks!</p>Doctors Without Borders Haiti Emergency Response2010-01-14T04:43:00-05:002010-01-14T04:43:00-05:00andrewsomethingtag:blog.andrewsomething.com,2010-01-14:/2010/01/14/doctors-without-borders-haiti-emergency-response/<p>Please excuse this break from your normally scheduled Ubuntu programing…</p>
<p><a href="https://donate.doctorswithoutborders.org/SSLPage.aspx?pid=197&hbc=1&source=ADQ1001E1D01"><img alt="Support Doctors Without Borders in Haiti" src="http://www.doctorswithoutborders.org/images/donate/button-haiti-earthquake-480.png"></a></p>
<p><a href="http://www.doctorswithoutborders.org/aboutus/">Doctors Without Borders/Médecins Sans Frontières (<span class="caps">MSF</span>)</a> is
an independent international medical humanitarian organization. If you
can spare even a few dollars to help in the emergency efforts under way
in Haiti, I strongly recommend giving what you can to …</p><p>Please excuse this break from your normally scheduled Ubuntu programing…</p>
<p><a href="https://donate.doctorswithoutborders.org/SSLPage.aspx?pid=197&hbc=1&source=ADQ1001E1D01"><img alt="Support Doctors Without Borders in Haiti" src="http://www.doctorswithoutborders.org/images/donate/button-haiti-earthquake-480.png"></a></p>
<p><a href="http://www.doctorswithoutborders.org/aboutus/">Doctors Without Borders/Médecins Sans Frontières (<span class="caps">MSF</span>)</a> is
an independent international medical humanitarian organization. If you
can spare even a few dollars to help in the emergency efforts under way
in Haiti, I strongly recommend giving what you can to <span class="caps">MSF</span>.</p>UDS-L, Dallas Day One2009-11-17T04:56:00-05:002009-11-17T04:56:00-05:00andrewsomethingtag:blog.andrewsomething.com,2009-11-17:/2009/11/17/uds-l-dallas-day-one/<p>Well, I finally made it to a Ubuntu Developer Summit. It’s been great to
put some faces on the names I interact with on mailing-lists and read in changelogs.</p>
<p>I don’t really have much to pontificate on so this will be quick, but
there are a couple things …</p><p>Well, I finally made it to a Ubuntu Developer Summit. It’s been great to
put some faces on the names I interact with on mailing-lists and read in changelogs.</p>
<p>I don’t really have much to pontificate on so this will be quick, but
there are a couple things to share.</p>
<p><a href="https://edge.launchpad.net/~elementaryart/+archive/ppa"><img alt="elementary" src="//blog.andrewsomething.com/images/2009/11/icons.png"></a></p>
<p>My roommate ending up being Daniel Fore, designer of the
elementary icon set that the Humanity icons are based on. So I was able
to help get them up on a <a href="https://edge.launchpad.net/~elementaryart/+archive/ppa"><span class="caps">PPA</span>.</a></p>
<p>You can grab packages based on the latests Bazaar trunk for Karmic.</p>
<p>I mostly focused on attending sessions on bug management and distributed
development today. I saved copies of the gobby notes for each session I
attended: <a href="http://people.ubuntu.com/~andrewsomething/uds-l/notes/">http://people.ubuntu.com/~andrewsomething/uds-l/notes/</a></p>
<p>The plenary session demoing <a href="https://wiki.ubuntu.com/Quickly">Quickly</a> made me excited to dive back
into <a href="http://www.diveintopython.org/">python</a>. The videos aren’t up yet, but there are previous
<a href="http://ubuntu.mirocommunity.com/video/84/getting-started-with-quickly">screen-casts</a> showing it off.</p>Bazaar Explorer 0.9.0 Now in PPA2009-11-04T04:26:00-05:002009-11-04T04:26:00-05:00andrewsomethingtag:blog.andrewsomething.com,2009-11-04:/2009/11/04/bazaar-explorer-0-9-0-now-in-ppa/<p><a href="http://doc.bazaar-vcs.org/explorer/en/"><img alt="bzr icon" src="http://doc.bazaar-vcs.org/explorer/en/_static/bazaar-explorer-64.png"></a></p>
<p>One of the things that I’ve always loved about bzr is that it is a
powerful yet intuitive solution for version control. Now <a href="http://doc.bazaar-vcs.org/explorer/en/">Bazaar
Explorer</a>, a wonderful cross-platform Qt-based <span class="caps">GUI</span> front-end to
the Bazaar <span class="caps">VCS</span>, is making it even easier. Whether you’re just getting
started with <span class="caps">DVCS</span> or …</p><p><a href="http://doc.bazaar-vcs.org/explorer/en/"><img alt="bzr icon" src="http://doc.bazaar-vcs.org/explorer/en/_static/bazaar-explorer-64.png"></a></p>
<p>One of the things that I’ve always loved about bzr is that it is a
powerful yet intuitive solution for version control. Now <a href="http://doc.bazaar-vcs.org/explorer/en/">Bazaar
Explorer</a>, a wonderful cross-platform Qt-based <span class="caps">GUI</span> front-end to
the Bazaar <span class="caps">VCS</span>, is making it even easier. Whether you’re just getting
started with <span class="caps">DVCS</span> or you just prefer a graphical environment, you should
really check it out. (You can take a tour <a href="http://doc.bazaar-vcs.org/explorer/en/visual-tour-gnome.html">here</a>.)</p>
<p>[<img alt="bzr-exploer screenshot" src="http://doc.bazaar-vcs.org/explorer/en/_static/home-page-screenshot.png">]</p>
<p>There’s been a Windows installer for Bazaar Explorer for awhile, and of
course the source code is over there on <a href="https://edge.launchpad.net/bzr-explorer">Launchpad</a>. Even though
Bazaar’s plugin system makes it simple to install it on Linux from
source, it just doesn’t feel like it’s keeping with the theme of making
things easy. So I went and packaged it for Ubuntu!</p>
<p>You can now grab it from the <a href="https://edge.launchpad.net/~bzr-explorer-dev/+archive/ppa">Bazaar Explorer <span class="caps">PPA</span></a>. It should be
entering Debian Unstable and Ubuntu Lucid in the near future, but we
want to give you <span class="caps">PPA</span> users the chance to kick the tires first. Just add
<strong>ppa:bzr-explorer-dev/ppa</strong> to your system’s Software Sources.</p>
<p>There are packages for Karmic, Jaunty, Intrepid, and Hardy in the <span class="caps">PPA</span>,
but please note that as bzr-explorer depends on bzr (>= 1.14) and qbzr
(>= 0.11), users of Ubuntu releases before Karmic will also need to add
the <a href="https://edge.launchpad.net/~bzr/+archive/ppa"><span class="caps">PPA</span> for Bazaar Developers</a>. Also be aware that Hardy users might
have some issues as parts of Explorer (e.g. the Preferences dialog)
depend on Qt/PyQt 4.4. (See:<a href="https://bugs.launchpad.net/bzr-explorer/+bug/429549">Bug #429549</a>). That said, every thing
should be working smoothly in Karmic.</p>U.K. National Lottery Winner!2009-10-05T20:43:00-04:002009-10-05T20:43:00-04:00andrewsomethingtag:blog.andrewsomething.com,2009-10-05:/2009/10/05/u-k-national-lottery-winner/<p>Well, not really….</p>
<p>For some reason, my spam folder doesn’t contain the usual Viagra, porn,
and Nigerian prince emails. The most frequent spam I receive generally
is letting me know that I just won £1,000,000 in the <span class="caps">U.K.</span> National
Lottery. As I’ve only been in …</p><p>Well, not really….</p>
<p>For some reason, my spam folder doesn’t contain the usual Viagra, porn,
and Nigerian prince emails. The most frequent spam I receive generally
is letting me know that I just won £1,000,000 in the <span class="caps">U.K.</span> National
Lottery. As I’ve only been in the <span class="caps">U.K.</span> once, and I certainly never
played the lottery while there, I assume they are a <a href="http://www.national-lottery.co.uk/player/p/help/yoursecurity/commonscams.ftl">scam</a>.
(<a href="http://xkcd.com/570/">Although, there might actually be some lottery official out there who
doesn’t understand why I don’t want to collect my money.</a>)</p>
<p>Well, the other day I opened an email from a British company that began:
“Congratulations!” This time I’m pretty sure it wasn’t a scam. The good
folks at Canonical accepted my sponsorship request for<a href="https://wiki.ubuntu.com/UDS-L"><span class="caps">UDS</span> Dallas</a>! As
this will be my first <span class="caps">UDS</span>, I’m incredibly excited. I just booked my
tickets, and can’t wait to finally meet you all in meatspace.</p>
<p>See you in Dallas!</p>Ubuntu 9.10 Countdown Banners2009-10-02T17:15:00-04:002009-10-02T17:15:00-04:00andrewsomethingtag:blog.andrewsomething.com,2009-10-02:/2009/10/02/ubuntu-9-10-countdown-banners/<p>As I’m sure you all know by now, Ubuntu (and friends) 9.10 Beta images
were released yesterday. What you might not know is that the countdown
banners have also been released. You can grab them <a href="http://www.ubuntu.com/getubuntu/countdown">here</a>.</p>
<h3>Option 1 - “Stars” by <a href="http://thorwil.wordpress.com/">Thorsten Wilms (thorwil)</a></h3>
<p><img alt="" src="http://www.ubuntu.com/files/countdown/910/countdown-9.10-1/27.png" title="Karmic Coutdown Stars"></p>
<div class="highlight"><pre><span></span><span class="nt"><script</span> <span class="na">type=</span><span class="s">"text/javascript"</span> <span class="na">src …</span></pre></div><p>As I’m sure you all know by now, Ubuntu (and friends) 9.10 Beta images
were released yesterday. What you might not know is that the countdown
banners have also been released. You can grab them <a href="http://www.ubuntu.com/getubuntu/countdown">here</a>.</p>
<h3>Option 1 - “Stars” by <a href="http://thorwil.wordpress.com/">Thorsten Wilms (thorwil)</a></h3>
<p><img alt="" src="http://www.ubuntu.com/files/countdown/910/countdown-9.10-1/27.png" title="Karmic Coutdown Stars"></p>
<div class="highlight"><pre><span></span><span class="nt"><script</span> <span class="na">type=</span><span class="s">"text/javascript"</span> <span class="na">src=</span><span class="s">"http://www.ubuntu.com/files/countdown/display.js"</span><span class="nt">></script></span>
</pre></div>
<h3>Option 2 - “The spotlight” by <a href="http://ubuntuteen.blogspot.com/">Andrew Higginson</a></h3>
<p><img alt="" src="http://www.ubuntu.com/files/countdown/910/countdown-9.10-2/27.png" title="Ubuntu Karmic Countdown Spotlight"></p>
<div class="highlight"><pre><span></span><span class="nt"><script</span> <span class="na">type=</span><span class="s">"text/javascript"</span> <span class="na">src=</span><span class="s">"http://www.ubuntu.com/files/countdown/display2.js"</span><span class="nt">></script></span>
</pre></div>
<h3 style="text-align:left;">Option 3: Simple image (for those who can’t use javascript)</h3>
<p><img alt="" src="http://www.ubuntu.com/files/countdown/static.png" title="Karmic Countdown Static"></p>
<div class="highlight"><pre><span></span><span class="nt"><a</span> <span class="na">href=</span><span class="s">"http://www.ubuntu.com/"</span><span class="nt">><img</span> <span class="na">src=</span><span class="s">"http://www.ubuntu.com/files/countdown/static.png"</span> <span class="na">width=</span><span class="s">"180"</span> <span class="na">height=</span><span class="s">"150"</span> <span class="na">alt=</span><span class="s">"Ubuntu: For Desktops, Servers, Netbooks and in the cloud"</span> <span class="na">border=</span><span class="s">"0"</span> <span class="nt">/></a></span>
</pre></div>The Web (and Ubuntu) Can Make a Difference2009-08-21T19:27:00-04:002009-08-21T19:27:00-04:00andrewsomethingtag:blog.andrewsomething.com,2009-08-21:/2009/08/21/the-web-and-ubuntu-can-make-a-difference/<p>The week of September 14-21, 2009 is <a href="http://mozillaservice.org/">Mozilla Service Week</a>, brought
to you by the good folks behind Firefox and Thunderbird. They’ve
partnered with <a href="http://www.idealist.org">Idealist.org</a>, a non-profit jobs listing site, to link
service-minded techies with non-profit organizations in need to their help.</p>
<blockquote>
<p>We’re looking for people who …</p></blockquote><p>The week of September 14-21, 2009 is <a href="http://mozillaservice.org/">Mozilla Service Week</a>, brought
to you by the good folks behind Firefox and Thunderbird. They’ve
partnered with <a href="http://www.idealist.org">Idealist.org</a>, a non-profit jobs listing site, to link
service-minded techies with non-profit organizations in need to their help.</p>
<blockquote>
<p>We’re looking for people who want to share, give, engage, create, and
collaborate by offering their time and talent to local organizations
and people who need their help.</p>
<p>Mozilla believes everyone should know how to use the Internet, have
easy access to it, and have a good experience when they’re online. By
utilizing our community’s talents for writing, designing, programming,
developing, and all-around technical know-how, we believe we can make
the Web a better place for everyone.</p>
</blockquote>
<p>Spread the word:</p>
<ul>
<li><a href="http://www.spreadfirefox.com/affiliates/homepage?category=54&locale=41#getbuttons">Put a badge on your blog.</a></li>
<li><a href="http://mozillaservice.org/img/flyers/en/Mozilla_Service_Week_Flyer_Letter_format.pdf">Post a flyer at your school or workplace.</a></li>
</ul>
<p>The <a href="https://wiki.ubuntu.com/NGO">Ubuntu <span class="caps">NGO</span> Team</a> is also working on making Ubuntu a great
platform to help non-profits. Check out <a href="http://daniel.holba.ch/blog/?p=462">Daniel’s recent post</a>for some
updates on our work, including efforts to <a href="http://daniel.holba.ch/blog/?p=478">make life with Ubuntu easier
for organizations working in places with out cheap and accessible Internet.</a></p>Congratulations Launchpad Team!2009-07-21T18:56:00-04:002009-07-21T18:56:00-04:00andrewsomethingtag:blog.andrewsomething.com,2009-07-21:/2009/07/21/congratulations-launchpad-team/<p><img alt="lp-logo" src="//blog.andrewsomething.com/images/2009/07/lp-logo1.png"></p>
<p>I am sure you’ve all seen this already, but I just wanted
to add my congratulations every one involved in the <a href="https://lists.launchpad.net/launchpad-users/msg05118.html">open</a>
<a href="http://blog.canonical.com/?p=192">sourcing</a> of <a href="http://blog.launchpad.net/general/launchpad-is-now-open-source">Launchpad</a>!</p>
<p>After the friendly and inclusive nature of the Ubuntu community,
Launchpad and Bazzar really are responsible for deepening my involvement
in development. I find …</p><p><img alt="lp-logo" src="//blog.andrewsomething.com/images/2009/07/lp-logo1.png"></p>
<p>I am sure you’ve all seen this already, but I just wanted
to add my congratulations every one involved in the <a href="https://lists.launchpad.net/launchpad-users/msg05118.html">open</a>
<a href="http://blog.canonical.com/?p=192">sourcing</a> of <a href="http://blog.launchpad.net/general/launchpad-is-now-open-source">Launchpad</a>!</p>
<p>After the friendly and inclusive nature of the Ubuntu community,
Launchpad and Bazzar really are responsible for deepening my involvement
in development. I find <span class="caps">LP</span> much more welcoming and user-friendly than
Debian’s <span class="caps">BTS</span> (though I really love and depend on <a href="http://packages.qa.debian.org/"><span class="caps">PTS</span></a>), Bugzilla, or
Trac. It’s cross-project intregration is really a killer feature. Bazzar
both introduced me to <span class="caps">DVCS</span> and convinced me of its supriority to
Subversion. I also just find it so much more user-friendly than other
solutions such as <span class="caps">GIT</span> (although admittedly I have no experience with Mercurial).</p>
<p>I’m glad that the platform that has encouraged me to contribute to open
source has finally become open source itself (soyuz included!).</p>GNOME-Colors in Karmic2009-07-08T06:59:00-04:002009-07-08T06:59:00-04:00andrewsomethingtag:blog.andrewsomething.com,2009-07-08:/2009/07/08/gnome-colors-in-karmic/<p><img alt="GNOME-Colors" src="//blog.andrewsomething.com/images/2009/07/gnomecolors.png"></p>
<p>With hundreds of thousands of downloads on <span class="caps">GNOME</span>-Look, <a href="http://www.gnome-look.org/content/show.php/GNOME-colors?content=82562"><span class="caps">GNOME</span>-Colors</a>
(and its friends <a href="http://www.gnome-look.org/content/show.php/Shiki-Colors?content=86717">Shiki-Colors</a> and <a href="http://www.gnome-look.org/content/show.php/Arc-Colors+GDM-Walls?content=88305">Arc-Colors</a>) is with out a
doubt one of the most popular themes around for the <span class="caps">GNOME</span> desktop. It’s
no surprise with six different color themes and the ability to match
you icon theme …</p><p><img alt="GNOME-Colors" src="//blog.andrewsomething.com/images/2009/07/gnomecolors.png"></p>
<p>With hundreds of thousands of downloads on <span class="caps">GNOME</span>-Look, <a href="http://www.gnome-look.org/content/show.php/GNOME-colors?content=82562"><span class="caps">GNOME</span>-Colors</a>
(and its friends <a href="http://www.gnome-look.org/content/show.php/Shiki-Colors?content=86717">Shiki-Colors</a> and <a href="http://www.gnome-look.org/content/show.php/Arc-Colors+GDM-Walls?content=88305">Arc-Colors</a>) is with out a
doubt one of the most popular themes around for the <span class="caps">GNOME</span> desktop. It’s
no surprise with six different color themes and the ability to match
you icon theme, <span class="caps">GTK</span>+ theme, <span class="caps">GDM</span> theme, and wallpaper. Victor (aka
perfectska04) has put together a wonderful set, and it’s about time that
they are in the Ubuntu archives.</p>
<p>I’m pleased to announce that they are now all just a simple apt-get
install away in Karmic.</p>
<p>The meta-packages <strong>gnome-colors, arc-colors, and shiki-colors</strong> will
pull in all six color variations. For those with low bandwidth or
expensive connections, you can also just install single variations:
gnome-{brave, dust, human, noble, wine, or wise}-icon-theme,
shiki-{brave, dust, human, noble, wine, or wise}-theme, and arc-{brave,
dust, human, noble, wine, or wise}. There’s also a Xfwm/Xfce4 theme: shiki-colors-xfwm-theme.</p>
<p>For those still running Hardy, Intrepid, or Jaunty, we’re also running a
<a href="https://launchpad.net/~gnome-colors-packagers/+archive/ppa"><span class="caps">GNOME</span>-Colors <span class="caps">PPA</span></a> where you will always be able to grab the latest versions.</p>
<p>So much thanks to Victor for the themes and being so open to making
changes upstream that made things easier for us to package and Benjamin
Drung for all his work to make this happen.</p>Ubuntu NGO Kicking Off!2009-06-24T22:50:00-04:002009-06-24T22:50:00-04:00andrewsomethingtag:blog.andrewsomething.com,2009-06-24:/2009/06/24/ubuntu-ngo-kicking-off/<p><em>Ubuntu <span class="caps">NGO</span> will be having its first meeting this Friday, <a href="http://www.timeanddate.com/worldclock/fixedtime.html?month=6&day=26&year=2009&hour=15&min=0&sec=0&p1=0">26th June
2009, 15:00 <span class="caps">UTC</span></a> in <a href="http://webchat.freenode.net/?randomnick=1&channels=ubuntu-ngo">#ubuntu-ngo on irc.freenode.net</a></em></p>
<p>A little over a month ago, Daniel Holbach asked <a href="http://daniel.holba.ch/blog/?p=422">who was using Ubuntu in
their <span class="caps">NGO</span>?</a> In the time that’s passed, a group of Ubunteros has
coalesced …</p><p><em>Ubuntu <span class="caps">NGO</span> will be having its first meeting this Friday, <a href="http://www.timeanddate.com/worldclock/fixedtime.html?month=6&day=26&year=2009&hour=15&min=0&sec=0&p1=0">26th June
2009, 15:00 <span class="caps">UTC</span></a> in <a href="http://webchat.freenode.net/?randomnick=1&channels=ubuntu-ngo">#ubuntu-ngo on irc.freenode.net</a></em></p>
<p>A little over a month ago, Daniel Holbach asked <a href="http://daniel.holba.ch/blog/?p=422">who was using Ubuntu in
their <span class="caps">NGO</span>?</a> In the time that’s passed, a group of Ubunteros has
coalesced around the idea of making Ubuntu a great platform for NGOs,
non-profits, and charities. Whether they’re using Ubuntu in their back
office, their web server, or giving out refurbished computers loaded
with Ubuntu, we want to focus on the specific needs they face and how
Ubuntu can help meet them.</p>
<p>I’m especially excited about this new initiative as over my life I’ve
been involved with a number of non-profit and advocacy organizations. I
see this project as a way to tie together two things I’m involved with
that seem separate but come from similar motivations, making the world a
better place and give back to community. It’s a natural fit for the
Ubuntu community as well. The same things that motivate so many of us to
contribute to Ubuntu motivate others (and some of us) to work for and
volunteer at NGOs.</p>
<p>There are a lot of possibilities with this, and it’s just starting to
take shape now. It’s a great time to join in and help shape the group
and our goals. Come to the meeting. <a href="https://launchpad.net/~ubuntu-ngo">Join the team.</a> Check out the
<a href="https://wiki.ubuntu.com/NGO">wiki page</a> and see some of the <a href="https://wiki.ubuntu.com/NGO/Actions">things we’ve already started working
on</a>.</p>
<p>Some of the things we’re interested in are:</p>
<ul>
<li>Finding out about NGOs that are using Ubuntu right now and sharing
their stories.</li>
<li>Studying different use cases.</li>
<li>Documenting of best practices.</li>
<li>Looking at work that some LoCo teams have already done and
encouraging connection between NGOs and LoCos.</li>
<li>Investigating ways to deal with regions without Internet access.</li>
<li>Packaging a <span class="caps">CRM</span> solution for non-profits.</li>
</ul>
<p>That last point is something that I’ve already begun working on. We’ve
started packaging <a href="http://civicrm.org/">CiviCRM</a>, an open-source constituent relationship
management solution designed specifically to meet the needs of advocacy,
non-profit and non-governmental groups. Our packaging branch is host on
Launchpad: <a href="https://code.edge.launchpad.net/~ubuntu-ngo/civicrm/ubuntu">lp:~ubuntu-ngo/civicrm/ubuntu</a> If you’re interested in
pitching in, there’s a <span class="caps">TODO</span> file in /debian and a watch file to pull the
upstream source. I’d be particularly grateful if someone with experience
packaging with dbconfig-common took a look.</p>
<p>This is a great opportunity to get in a the beginning of an important
project! Our first meeting is this Friday, <a href="http://www.timeanddate.com/worldclock/fixedtime.html?month=6&day=26&year=2009&hour=15&min=0&sec=0&p1=0">26th June 2009, 15:00 <span class="caps">UTC</span></a>
in <a href="http://webchat.freenode.net/?randomnick=1&channels=ubuntu-ngo">#ubuntu-ngo on irc.freenode.net</a></p>
<p>Got any ideas? Let me know in the comments!</p>A Few Ubuntu-related Ubiquity Scripts2009-06-10T19:04:00-04:002009-06-10T19:04:00-04:00andrewsomethingtag:blog.andrewsomething.com,2009-06-10:/2009/06/10/a-few-ubuntu-related-ubiquity-scripts/<p>Awhile back I hacked up a few Ubuntu releated scripts for Ubiquity. No,
not the Ubuntu installer. The Firefox add-on. Now that I have one of
these fancy blog thing-a-majigs, I figured I’d share them with all of
you. Hopefully some one else will find them useful.</p>
<p>To make …</p><p>Awhile back I hacked up a few Ubuntu releated scripts for Ubiquity. No,
not the Ubuntu installer. The Firefox add-on. Now that I have one of
these fancy blog thing-a-majigs, I figured I’d share them with all of
you. Hopefully some one else will find them useful.</p>
<p>To make a long story short, <a href="http://labs.mozilla.com/projects/ubiquity/">Ubiquity</a> is <span class="caps">GNOME</span>-Do for your browser.</p>
<p>I’ve got a number of simple scripts that you can use with it to do
Ubuntu related tasks in Firefox:</p>
<ul>
<li>AptURL - Install a package using AptURL. If you’re reading a post
about a package, just highlight the package name and call Ubiquity.
No need to open a terminal or package manager. Usage: <code>apturl
[package]</code></li>
<li>Debian Package Search - One of the sites I end up using the most in
my <span class="caps">MOTU</span> work is http://packages.debian.org/ This brings it just a
keystroke away. Usage: <code>debian-packages [package]</code></li>
<li>Launchpad Ubuntu Package Search - You guessed it. Search Ubuntu
packages on <span class="caps">LP</span>. Usage: <code>lp-packages [package]</code></li>
<li>Launchpad Team and People Search - What do you think it does? Usage:
<code>lp-team-and-people [team or person]</code></li>
<li>Launchpad Ubuntu Bug Search - Simular to the two above…
<code>lp-ubuntu-bug [bug \# or description]</code></li>
<li>Ubuntu Man Page Search - Read the man page! Usage: <code>ubuntu-man
[package]</code></li>
<li>Ubuntu Package database searcher- This one searches
packages.ubuntu.com It was written by David Futcher (<a href="https://edge.launchpad.net/~bobbo">bobbo</a>), and
it was what inspired me to make all the others. Usage:
<code>ubuntu-packages [package]</code></li>
<li>Report Ubuntu Bug - Report a bug in a Ubuntu package on Launchpad.
(Although, chances are you should really be using Apport.) Usage:
<code>ubuntu-report-bug [package]</code></li>
</ul>
<p>You can grab them with:</p>
<div class="highlight"><pre><span></span>bzr branch lp:~andrewsomething/+junk/ubiquity-commands
</pre></div>PPAs and Daily Builds2009-06-10T05:46:00-04:002009-06-10T05:46:00-04:00andrewsomethingtag:blog.andrewsomething.com,2009-06-10:/2009/06/10/ppas-and-daily-builds/<p>So earlier today I was throwing together a script to publish bzr
snapshots to a <span class="caps">PPA</span>. My use case was pretty simple. It’s a debian native
package. So the packaging and upstream are one and the same, so no need
to merge branches or make sure patches apply cleanly …</p><p>So earlier today I was throwing together a script to publish bzr
snapshots to a <span class="caps">PPA</span>. My use case was pretty simple. It’s a debian native
package. So the packaging and upstream are one and the same, so no need
to merge branches or make sure patches apply cleanly. Basically just
pull, build, and publish with a little bit of magic to set the versions correctly.</p>
<p>But as I know there are a number of PPAs publishing snapshots of
upstream sources, I wanted to take a look around and see what others are
using. Unfortunetely, there doesn’t really seem to be a location
pointing to a list of projects or with general information on how to go
about doing this. So here are some of the things I came across, just to
put it one place. Maybe it’s time for a wiki page?</p>
<p>First of all, <a href="https://edge.launchpad.net/~james-w">James Westby</a> is up to something really exciting with
bzr-builder (a plugin for bzr written in python) and Daily Debs. The
basic idea is to make doing nightly builds of upstream projects almost
trivial by using simple recipe files while bzr-builder does all the
heavy lifting. A recipie file could look as simple as this:</p>
<blockquote>
<div class="highlight"><pre><span></span>branch lp:foo
merge lp:foo/debian-pkg
</pre></div>
</blockquote>
<p>I can’t wait to see where this is going and to hear more about the
discussions around it at <span class="caps">UDS</span>.</p>
<p>You can find the spec here: https://wiki.ubuntu.com/DailyUpstreamBuildsPOCSpec</p>
<p>The code for bzr-builder is here: https://code.edge.launchpad.net/~james-w/bzr-builder/trunk</p>
<p>And a <span class="caps">PPA</span> of bzr-builder made with bzr-builder is here: https://edge.launchpad.net/~dailydebs-team/+archive/bzr-builder</p>
<p>Some of the most used daily build PPAs are probably the <a href="https://edge.launchpad.net/%7Eubuntu-mozilla-daily/+archive/ppa">Mozilla Daily
Builds</a> and <a href="https://edge.launchpad.net/%7Echromium-daily/+archive/ppa">Chromium Daily Builds</a>. Along with the
<a href="https://edge.launchpad.net/%7Egwibber-daily/+archive/ppa">gwibber-daily</a> <span class="caps">PPA</span>, these are run by <a href="https://code.edge.launchpad.net/%7Efta">Fabien Tassin</a>. The bash
scripts he uses to produce them can be found here: https://code.edge.launchpad.net/~fta/+junk/ppa-scripts</p>
<p><a href="http://amarok.kde.org/wiki/User:Apachelogger/Project_Neon">Project Neon</a> has a <a href="https://edge.launchpad.net/~project-neon/+archive/ppa"><span class="caps">PPA</span></a>delivering nighly builds of Amarok and
other <span class="caps">KDE</span> goodies. The build scripts are written in Ruby and hosted on
<span class="caps">KDE</span>’s svn: http://websvn.kde.org/trunk/extragear/multimedia/amarok/supplementary_scripts/neon/</p>
<p>Anyone else doing something cool? Know where to find some more examples?</p>Reflections on being an Ubuntu Universe Contributor2009-06-01T13:15:00-04:002009-06-01T13:15:00-04:00andrewsomethingtag:blog.andrewsomething.com,2009-06-01:/2009/06/01/reflections-on-being-an-ubuntu-universe-contributor/<p>Last week I made the big leap from “contributor” to “developer.” At the
most recent <span class="caps">MOTU</span>-Council meeting, my application to become a Master of
the Universe was approved!</p>
<p>Now, I want to take a minute and think about the Ubuntu Universe
Contributor (aka Ubuntu Contributing Developers) program, how we …</p><p>Last week I made the big leap from “contributor” to “developer.” At the
most recent <span class="caps">MOTU</span>-Council meeting, my application to become a Master of
the Universe was approved!</p>
<p>Now, I want to take a minute and think about the Ubuntu Universe
Contributor (aka Ubuntu Contributing Developers) program, how we can
better utilize it, and ultimately encourage more people to get involved
in Ubuntu development. But first of all, what is the <span class="caps">UUC</span> program anyway?</p>
<p>On the<a href="https://wiki.ubuntu.com/UbuntuDevelopers">wiki page</a>, Ubuntu Contributing Developers and their roles are
described as:</p>
<ul>
<li>Are members of the universe-contributors team in Launchpad</li>
<li>Are collectively responsible for the maintenance of most of the
packages in Ubuntu (the universe and multiverse components)</li>
<li>Merge new versions from Debian, work on bugfixes and new packages</li>
<li>Continue with sponsored uploads</li>
<li>Participate in technical discussions with other Ubuntu developers,
providing ideas and feedback</li>
</ul>
<p>That’s pretty vague. A lot of people who aren’t UUCs do merges, work on
bug fixes, and get uploads sponsored. The qualifications for joining are
even more so. You have to meet the requirements to be an <a href="https://wiki.ubuntu.com/Membership">Ubuntu
Member</a> and submit an application to the the <span class="caps">MOTU</span>-Council.</p>
<p>We need to be more clear on both the goals of the team and what it takes
to join. But this becomes a bit of a sticky issue. We shouldn’t be
placing hard metrics on the requirements for joining. Joining should be
about the quality not quantity of uploads and connecting contributors to
the development community not quizzing them on technical aspects.
Becoming an <span class="caps">UUC</span> doesn’t give you upload rights, but it does make you an
Ubuntu Member. So while it is a development centered path to Ubuntu
Membership, its really a community designation not a technical one.</p>
<p>So how about who is an <span class="caps">UUC</span>? Looking at the <span class="caps">UUC</span><a href="https://edge.launchpad.net/~universe-contributors/+members">members list</a>, you see
that there are 16 individuals on the team. Including Chow Loong Jin
(<a href="https://edge.launchpad.net/~hyperair">hyperair</a>), who just joined, congrats! Of those, nine of us have
gone on to make <span class="caps">MOTU</span>. So there are only seven proper Ubuntu Universe
Contributors. So, it seems that becoming a <span class="caps">UUC</span> is a good step to
becoming a <span class="caps">MOTU</span>, but still not all that many people are using the
program. In fact, more people have become MOTUs this year so far than
have become UUCs.</p>
<p>According to <a href="http://thc.emgent.org/utu/utu_jaunty.php">Ubuntu Top Uploaders list</a>, 395 people uploaded at least
one package in Jaunty (although it’s not a completely accurate count as
some people have more than one listing due to using more than one email
address). Of those, only about 100 people uploaded more than 10
packages. The top 25 all have over a hundred uploads. The level of
involement is amazing, but it is also extremely top heavy. We need to
shift that curve down.</p>
<p>For me, the main goals of the <span class="caps">UUC</span> program should be to draw reoccurring
contributors further into the community and acknowledging them for the
work they have already done. It’s about both retaining contributors and
increasing their involvement. The more connections someone has with a
project the more likely they will continue to contribute and increase
their level of commitment. Someone who gets a few patches sponsored into
Ubuntu but doesen’t get involved in the community may well switch
distributions when they have an issue and take their contributions with
them. Someone who becomes engaed in the community will stick around and
help solve the issue.</p>
<p>We also need to be making it easier for contributors to navigate the
sometime bureaucratic processes involved with getting patches sponsored
into Ubuntu. <a href="http://drowninginbugs.blogspot.com/2009/06/action-items-from-uds-barcelona.html">Dan Chen has already talked</a>about some of the plans
coming out of <span class="caps">UDS</span> Barcelona, including a new Launchpad group to take on
this issue, ubuntu-reviewers.</p>
<p>As every one who went to <span class="caps">UDS</span> is now home, I expect we’ll hear alot more
about the discussions that went on there. I’m looking forward to it, and
hope to find ways that I can help make the plans made there a reality.</p>
<p>So, if you’ve read this far, what are you’re thoughts? Have you
contributed to Ubuntu? What was the most annoying part? Have you
considered joining the Ubuntu Universe Contributor team? What’s stopped you?</p>“Because humans need Oxygen.”2009-05-30T06:53:00-04:002009-05-30T06:53:00-04:00andrewsomethingtag:blog.andrewsomething.com,2009-05-30:/2009/05/30/because-humans-need-oxygen/<p><a href="http://www.gnome-look.org/content/show.php?content=105873"><img alt="Breathe Icon Theme" src="//blog.andrewsomething.com/images/2009/05/breathe.png"></a></p>
<p>The Ubuntu Artwork community just made the first official beta release
of the Breathe Icon Theme. It’s a refresh of the Human icon theme using
Oxygen as a base. The idea is to create as modern a set as Oxygen but
with that distinctly Human feel.</p>
<p>You can grab …</p><p><a href="http://www.gnome-look.org/content/show.php?content=105873"><img alt="Breathe Icon Theme" src="//blog.andrewsomething.com/images/2009/05/breathe.png"></a></p>
<p>The Ubuntu Artwork community just made the first official beta release
of the Breathe Icon Theme. It’s a refresh of the Human icon theme using
Oxygen as a base. The idea is to create as modern a set as Oxygen but
with that distinctly Human feel.</p>
<p>You can grab the 0.43 release on the <a href="http://www.gnome-look.org/content/show.php?content=105873"><span class="caps">GNOME</span>-Look page</a> or on the
<a href="https://wiki.ubuntu.com/Artwork/BreatheIconSet">Ubuntu wiki</a>. You can also check out the source on <a href="https://launchpad.net/breathe-icon-set">Launchpad</a>.</p>
<p>It’s being developed by community members over on the <a href="https://lists.ubuntu.com/mailman/listinfo/ubuntu-art">Artwork Team
list-serve</a>. Drop by, join in and share your ideas.</p>
<p><a href="http://creativecommons.org/licenses/by-sa/3.0/us/"><img alt="Creative Commons License" src="http://i.creativecommons.org/l/by-sa/3.0/us/88x31.png"></a>
The Breath Icon Theme is licensed under a <a href="http://creativecommons.org/licenses/by-sa/3.0/us/">Creative Commons
Attribution-Share Alike 3.0 License</a>.</p>Testing Ubuntu+1 and the Fourms2009-05-22T18:41:00-04:002009-05-22T18:41:00-04:00andrewsomethingtag:blog.andrewsomething.com,2009-05-22:/2009/05/22/testing-ubuntu1-and-the-fourms/<p>Ubuntu+1 has an active user based which needs to be better utilized.
Over at the Ubuntu Forums, there is a <span class="normal"><a href="http://ubuntuforums.org/forumdisplay.php?f=359">Karmic Koala
Testing and Discussion</a> sub-forum. While it’s mostly users helping
each other through the bumpy adventure of running the development
release (along with some people engaged in …</span></p><p>Ubuntu+1 has an active user based which needs to be better utilized.
Over at the Ubuntu Forums, there is a <span class="normal"><a href="http://ubuntuforums.org/forumdisplay.php?f=359">Karmic Koala
Testing and Discussion</a> sub-forum. While it’s mostly users helping
each other through the bumpy adventure of running the development
release (along with some people engaged in seemingly never ending
complaining about the default theme), it’s a great</span> opportunity
for engaging users in the testing and development process. Some people
are there simply due to a desire to be running bleeding edge packages,
but most truly care about making Ubuntu better.</p>
<p>One attempt to get people involved is the reoccurring sticky thread at
the top of the forum:<strong><a href="http://ubuntuforums.org/showthread.php?t=1161570">Contributing to Karmic Koala.</a></strong>It appears in
each development release’s Testing forum. The guide originally was
produced by 23meg in the Gutsy cycle, and I refreshed it for the
Intrepid one. Nullack has gotten it together for the last two cycles,
and a number of others have contributed. The thread attempts to
familiarize users with the <a href="https://wiki.ubuntu.com/UbuntuDevelopment">Ubuntu Development process</a>, and points
out ways for people to contribute, from <a href="https://help.ubuntu.com/community/ReportingBugs">filing bugs</a> and <a href="https://wiki.ubuntu.com/Testing/ISO/Procedures">testing <span class="caps">ISO</span>
images</a> to <a href="https://wiki.ubuntu.com/DocumentationTeam">contributing documentation</a> and <a href="https://wiki.ubuntu.com/Bugs/HowToFix">fixing bugs</a>.</p>
<p>Yet, I think there is more that can be done from the developer side in
order to engage these intrepid users (and I don’t mean 8.10). Most
discussions and calls for testing new features in Ubuntu+1 happen on
<a href="https://lists.ubuntu.com/mailman/listinfo/ubuntu-devel">ubuntu-devel</a>, and I’m not proposing moving it to the forums. Yet,
the habits of most developers are quite different than those of most
users. There’s a reason that more people seek support on forums than on
mailing lists. Over on the forums, we have an audience of users running
Ubuntu+1 who love running the most recent packages and love to let you
know what they think about them. It’s the perfect audience for calls for
testing new features, ect. I’ve seen a few devs pop up there with such
requests, but there’s a lot of missed opportunities.</p>
<p>During the Jaunty cycle, I was able to get helpful feed back on a number
of my uploads by asking users in the forum to test a package in my <span class="caps">PPA</span>
before submitting it for the official archive. Additionally, just by
lurking around, I caught a few packages that almost sneaked into the
release broken due to the python transition.</p>
<p>While I don’t expect developers to hold the user’s hand and provide
support for running the development release, simple things like
cross-posting call for testing to the forums could go a long way to
better taking advantage of an under used resourse.</p>
<p>A big thank you to all those brave enough to run the development branch!</p>
<p><span class="caps">P.S.</span> Always remember, the is no guarantee that Ubuntu+1 will not eat you
babies, destroy all your data, or make your computer explode.</p>print “Hello, World!”2009-05-20T22:59:00-04:002009-05-20T22:59:00-04:00andrewsomethingtag:blog.andrewsomething.com,2009-05-20:/2009/05/20/print-hello-world/<p>Alright, I’ve been a Ubuntu Member since last October, and I haven’t set
up a blog to be syndicated on Planet Ubuntu yet. That changes now. There
hasn’t been an UbuntuOne post in almost two days. I just couldn’t let
that happen. Let me tell you …</p><p>Alright, I’ve been a Ubuntu Member since last October, and I haven’t set
up a blog to be syndicated on Planet Ubuntu yet. That changes now. There
hasn’t been an UbuntuOne post in almost two days. I just couldn’t let
that happen. Let me tell you what I think!</p>
<p>Alright, I’m just kidding. You don’t have any reason to care what I
think about anything since chances are you have no idea who I am. So,
please allow me to introduce myself…</p>
<p>My name is Andrew, and I’m an <a href="https://edge.launchpad.net/%7Euniverse-contributors" title="The Ubuntu Universe Contributors are collectively responsible for the mainten...">Ubuntu Universe Contributor</a> (aka
Ubuntu Contributing Developer). I’ve been an Ubuntu user since Feisty
and an active contributor since the Hardy cycle. I also maintain a <a href="http://qa.debian.org/developer.php?login=a.starr.b%40gmail.com">few
packages</a> directly in Debian. You can find out more about my specific
contributions on my <a href="https://wiki.ubuntu.com/Andrewsomething">wiki page</a> or on my<a href="https://launchpad.net/~andrewsomething/">Launchpad profile</a>. I’ll
also be up in front of the <span class="caps">MOTU</span>-Council on May 28th, as I’ve finally
<a href="https://wiki.ubuntu.com/Andrewsomething/MOTUApplication">applied to become a <span class="caps">MOTU</span></a>!</p>
<p>So why start a blog? Well, I’m not sure how much I’ll end up posting
here, but I’d like to think that some of the things I’ve gone through in
my journey into the world of Ubuntu development will be helpful to
others thinking about diving in…</p>