RIP McCabe's

Jason Paul wanted us to know that there was a sad sign posted on McCabe's this week: 

Sign indicating that McCabes is closing

2023 Proposed Meeting Location List

Intrepid KWLUG members have diligently searched for a new physical home for our group. Thus far we have two candidates that are likely available.

100 Garment Street

Photo of 100 Garment St Room

This is a community meeting room on the third floor of a condo. A KWLUG member lives in the building and has agreed to host us each month.

The building is a 5-10 minute walk from Victoria and King in Kitchener, so is close to downtown.

Capacity: 15 people comfortably, 20 at most. The space is pretty small and there is furniture there we cannot move.

Availability: There is no formal booking system, so there is some chance we could be displaced. However, the host thinks this is not likely.

Reliability: We are reliant on the host to be present for every meeting.

Access: The building is wheelchair accessible. To get to the meeting room one has to be let in the door (there is controlled access) and go up an elevator. It is not clear whether we can put up signs on meeting nights, but the host thinks it may be possible.

Washrooms: There is a washroom right beside the meeting room.

Internet: There is public wifi, and possibly a second wifi we can use for streaming. There is no wired internet available.

Parking: The City of Kitchener operates a parking lot on Bramm Street, which is free after 5pm.This is directly behind the condo complex. There is an underground parking garage at the condo which costs $2.50 for 30 minutes, so the average KWLUG attendee can expect to pay $12.50 per meeting. There is also a small amount of on-street parking on Oak Street.

Transit: there is an LRT station at Victoria and King St.

Streaming/Equipment: We would have to provide a projector, and whatever equipment we want to use for streaming. The host may be able to store some equipment at their condo, but maybe not a lot.

COVID Safety: The room is small. There will not be much interaction with non-KWLUG members. HVAC status is unknown.

University of Waterloo Dana Porter Library

Photo of UW LIB329 Room

This is a classroom space in the Dana Porter library ("the sugar cube") at the University of Waterloo. The specific space is LIB 329. It is being offered by a KWLUG member who works at the university.

Capacity: 25 people. It is a full classroom with row seating.

Availability: It should be fairly reliably available, although there is no booking system. There is another classroom we might be able to use if we are displaced.

Reliability: Unclear. We are reliant on a UW employee, faculty member, or student club to host us. The proposing host has offered to host us, or help look for replacements if they are unable to attend. There are a few other people who work at UW.

Access: The building is wheelchair accessible. There are elevators to the space. We will probably not be able to put up signs. There is a clickable floor plan of the library's third floor to help people find their way around.

Washrooms: There is a washroom on the same floor.

Internet: There is wifi available that requires a name and email to use. People who are affiliated with a university can use Eduroam. There may be some chance of getting our own SSID but this is unlikely. Wired network for streaming might be possible, but is not arranged.

Parking: There is one parking lot -- Lot E, adjacent to the Waterloo-Laurier LRT station at Seagram Drive -- that is free after 6pm. This is about a 700m walk from the library. There are paid parking lots for $5/evening. Lots D and A are the closest to the library.

Transit: there is an LRT station at the university.

Streaming/Equipment: There is a projector with HDMI input. We would have to provide other streaming equipment, and carry it back and forth to meetings.

COVID Safety: The University of Waterloo is a busy campus, so there will be some interaction with students. As of this writing, the university is committed to MERV-13 filters with at least four air exchanges per hour per classroom.

Unlikely Locations

Community Hub at St John the Evangelist

This is not available Monday evenings. It could be a possibility if we were willing to switch meeting nights.

SDG Hub in Downtown Kitchener

This is a new space. The booking fee for the large room is $400/hour. There is a smaller room for less, but they currently do not do evening bookings.

Public library spaces

These may be available but not reliability. Prices vary from $50 at some remote libraries in Kitchener (eg Forest Heights), to $150 for two hours at the Waterloo Public Library.

Churches, Public Schools

In addition to a booking fee we would need to purchase liability insurance. This may be possible but it seemed frustrating the last time we looked because we are not a registered organization.


The space is inaccessible (on the second floor) and there are no large meeting spaces (maybe 15 people at most?). A KWartzlab member would have to host.

The Working Centre

Neither the Queen St Commons building nor St John’s Kitchen is available. The front space at 58 Queen may be available, but it is small and not that accessible.

Other Places to Investigate

Workhaus or other coworking spaces

This would likely be expensive, but may be worth investigating.


These are likely not reliable, and there would be an expectation that people purchase food and drink.

Waterloo Available Spaces

The City of Waterloo publishes a list here:

Requested Topics List

Here are some topics members have requested over the years. Can you present on one or more of them? If so get in touch. You may also request a topic, but please do this on the kwlug-disc mailing list, or during a meeting.

Newer requests are at the top of the list.

  • NixOS
  • QEMU on the commandline
  • What are the barriers in installing Linux on Android phones and tablets?
  • How to commit to an open source project
  • Work events where groups of people contributed to a project
  • Interviews with open source project leaders
  • Have contests or workshops
    • Capture the flag events?
    • Making a community project together? Like CivicTech?
    • Translating software?
  • Linux at the movies
  • Linux in pop culture
  • "Epic" topics spread over several meetings
  • How do Raspberry Pi computers fit into the Linux ecosystem? What other low powered computers are there, and why should we consider them?
  • What resources (Youtube channels, podcasts, websites...) are most helpful in getting new users familiar with Linux?
  • What are the "best of breed" distros for different niches? For powerful computers? Low-end computers? Audio production? Video production? Security testing?
  • IPv6 tunnel brokering
  • SSL for dummies; Let's Encrypt
  • Managing family photos
  • ElementaryOS
  • RedMatrix, Bitlbee
  • Syslog
  • New-style packaging (Snap, AppImage, Flatpak)
  • What things run Linux? Make a list
  • Static CMSes
  • Ransomware
  • Incident response
  • Packet sniffing

Life in a Terminal Window notes

Paul Nijjar


Kitchener-Waterloo Linux User Group


Why bother with terminal programs in 2019?

  • Maybe your computer is too slow for the modern internet

  • Maybe you have a tiling window manager

  • Maybe you want to get work done in an SSH window (with no X-forwarding)

  • Maybe you hate notifications

  • Maybe you are a dinosaur

  • (Mikalai) Maybe you are working inside containers


  • New users: get a sense of what is available from the terminal
  • Give you nouns to search for, as opposed to keystrokes

  • Experienced users: maybe get a tip or two you did not know before
  • What are the quirks?

  • Me: maybe get suggestions for other useful tools


  • I run old old Debian

  • I am not a computer genius

  • I am not a life hacker/optimizer

  • These are the programs I actually use, not always the ones I ought to use

  • Muscle memory is a walled garden


I did not bother preparing more slides!

What now?

Let's improvise!



  • join a network: wicd-curses
  • surf the internets: w3m
    • no javascript
    • cookies are sketch
    • set a browser with o
    • use another browser with m
    • great interface for forms (opens an editor for text fields)
  • search: duckduckgo with a shortcut
  • read news: newsbeuter/newsboat
    • o to open a news item in a screen
    • supports different profiles via environment variables
    • gets slow on huge archives, but is overall good
  • google calendars: gcalcli
    • Use this with a script to populate Watcamp
  • passwords: yapet
    • uses blowfish encryption
  • mail: mutt
    • configurable
    • supports different profiles
    • forwarding attachments is hard
    • html mails are okay (uses w3m)


  • audio mixing: alsamixer
  • music and videos: vlc
    • no displays: vlc --intf rc
      • bad for seeking
      • great for playing music in the background
    • terminal interface: vlc --intf ncurses
  • get videos and such: youtube-dl
    • install dependencies with apt, but not the script
    • there are flags for smaller videos
    • It works on more than youtube
  • MP3 info: eyeD3
  • view images: sxiv
    • there are many others, but this is smooth and effective

Audience suggestions

  • Painting program: krita
  • Art program: photopea
    • works in a browser but can be containerized
  • avconv: audio editing via a script

Other utilities (not in presentation)

  • look up synonyms/spellings/translations: dict
  • spel wurds: wurdspel script
  • convert PDF to text: pdftotext
  • calculator: bc
  • interactive file explorer: mc
  • look at calendars: cal
  • remember important dates: calendar

Things I wish I had, but don't (yet)

  • XLSX spreadsheet viewer
  • Maybe a DOCX reader/extractor
  • Generic iCal client
  • Twitter client
  • Slack client
  • Maybe a better podcatcher
    • I use gpodder and it is okay but slow
    • newsbeuter/newsboat has support for podcasts
  • web browser for javascript

File Attachments

Addendum to Khalid's Microcontrollers and the Internet of Things (IOT)


Addendum to Khalid's Microcontrollers and the Internet of Things (IOT) presentation (October 1, 2018).

With this blog entry, I thought I would provide some comments as an addendum to Khalid's presentation. 

Please note that these comments are purposely limited in scope. Interested parties are free to contact me and, of course, consult with The Google.

I will start with memory which can be basically classified into two groups, non-volatile memory and volatile memory.

The definitions of non-volatile memory and volatile memory are as follows.

Simply put non-volatile memory retains its data when power is removed.

And volatile memory, usually called RAM, does not retain its data when power is removed.

The non-volatile memory used for program storage these days is Flash memory.

Modern microcontrollers and microprocessors typically do not use EEPROM for program storage.

Modern microcontrollers and microprocessors may or may not use EEPROM and / or EAROM for non-volatile storage of parameters and/or data.

And from the above, now we have some definitions that are needed.

Simply described, Flash, EEPROM and EAROM are different semiconductor technologies that are used to implement non-volatile memory.

I will skip their predecessors PROM and EPROM.

I will also skip the expansion of the acronyms RAM, PROM, EPROM, EEPROM and EAROM. Flash is not an acronym.

Aside: Flash memory technology is also used in USB Flash Memory sticks, hence, the name.

OK!. Now we have the terms microcontroller and microprocessor.

A Microprocessor is a complete processing device made from a small chunk of semiconductor and housed in one package, e.g. Dual In-Line Package (DIP) or Quad Flat Pack (QFP) or other.

Microcontrollers are basically microprocessors (see below) with integrated peripheral devices such as UART, ADC, DAC, SPI, I2C, PWM, etc.

I will skip the expansion of the acronyms UART, ADC, DAC, SPI, I2C, and PWM. I will also skip the explanations of the devices associated with these terms.

The first semiconductor processing device to come along, circa 1970, was the microprocessor, simply described as a small scale processing device without integrated peripherals (see above).

Systems designed around a microprocessor that required one or more peripherals typically implemented this requirement with external devices.

Pentium processors are microprocessors. As are AMD processors. As are the 8080, 8085, 8086, 8088, 80286, 80386 and 80486 predecessors.

Most of the processors used in most cell phones, tablets, notebooks, laptops, etc. are microprocessors, even if these processors may include a small degree of peripheral integration.

Variants of ARM processors may or may not be microcontrollers as the ARM architecture was designed to support a considerable amount of peripheral integration.

Variants of ARM processors may be classified as microprocessors or microcontrollers depending on the degree of peripheral integration.

Last in this blog entry I will describe the GPIO or General Purpose Input Output port.

The GPIO is typically a one bit wide port or physical pin that and be programmed as either a digital (binary) input or output.

As an input the GPIO, when read will return a 0 when the voltage on the pin is Low or near 0 Volts DC, and will return a 1 when the voltage on the pin is High or near 5 DC Volts or 3.3 Volts DC with some devices.

As an output the GPIO, when written with a 0, will output a Low or 0 Volts, and when written with a 1, will output a Low or 5 Volts DC or 3.3 Volts DC with some devices.

Note: GPIO circuitry can be damaged if the voltage applied to the pin exceeds specified limits; same for the current drawn by or sourced from the pin.

Caution: Do not let the smoke out.

There are (and have been) many microprocessors to choose from and study.

There are (and have been) many microcontrollers to choose from and study.

As always, there are exceptions. And opinions which may differ.

- 30 -




New KWLUG meeting locations list

This blog entry collects possible new homes for KWLUG meetings. If you have some options to add, use the contact link to submit them.


  • Parking?
  • Is bookable month after month?
  • Accessibility by bus? Walking?
  • Cost? (Free of charge is ideal)
  • Accessibility for disabilities? Wheelchairs?
  • Has a sound system?
  • Has a projector?
  • Has Internet access? Wired? Wireless?
  • Can accommodate 20-25 people per meeting?

Meta Resources

We went through this exercise when the Heuther Hotel got mad at us. There was a relevant discussion thread on kwlug-disc.

We went through this exercise again in 2019. Here is the discussion thread on kwlug-disc.


There is a site called SpaceFinder Waterloo which lists a bunch of rental spaces. Most of them cost money, however.

Locations to Investigate

These locations have been suggested but nobody has offered to follow up on them yet. If you would like to help then please volunteer to look into one or more of them.


Wilfrid Laurier University

Adam Glauser says that he can likely arrange gratis meeting rooms at Laurier

  • Somebody from Laurier needs to be in attendance
  • Laurier-specific activities like exams can take precedence
  • Transit access is good
  • Gratis parking is unclear

Shopify Plus


(formerly Thalmic Labs)

As of January 2019, North is not available, but Tim Laurence says that it is possible the space will become available within a few months.

Formerly SweetTooth


WLU Faculty of Social Work


(Eric Gerlach or Darcy Casselman might be contacts here.)

Igloo Offices

Treehouse Coworking Space


Jason Eckert is a contact here. WWITPro uses this space.

The space is at Frederick and King. TriOS is willing to let us use the space for no charge.

  • There is a projector, with VGA input
  • There is enough space
  • Doors are locked by mall staff at 7pm, so somebody needs to mind the door
  • Parking is available in the parking lot. Free parking is questionable.

KW Innovation Center

We met here for 6 months. It is the old Boehmer Box building.

  • Access via thumbprint
  • There is a projector onsite but we could not always find it
  • Electrical outlets are scarce
  • The space itself is nice
  • They are no longer willing to book the space for free.


Locations Under Investigation

Somebody has started to look into these locations, and they have not been ruled out yet. Often there are details that are missing about them; please fill in details if you can.

Downtown Community Centre

Brian Bentley is the contact here, via the Bits and Bytes Computer Club.

  • Parking is available
  • Internet would either be City wifi or we would pay for Bits and Bytes internet
  • The room would hold 20-25 people
  • Bookings would be quarter to quarter, but we would likely be able to get the space consistently. (There are no promises, however.)
  • Central downtown Kitchener location (which is good and bad, given construction)
  • There is a projector available
  • The space is accessible

Option 1: become a part of Bits and Bytes

  • Bits and Bytes would become the owner/sponsor for KWLUG meetings
  • The Bits and Bytes board would have to approve any such arrangement
  • Attendees would be expected to purchase Kitchener Group cards ($18.30 for adults, $12 for seniors per year). There are some added benefits to these cards, but they would be mandatory for members. It would be up to meeting organizers to police this.
  • There could be discounts available on these cards for low-income members, but they would have to fill out paperwork.
  • There would be some cross-promotion of the group via the City of Kitchener
  • Technically people under 18 would not be allowed to participate (!)

Option 2: rent the space on our own

  • We would need liability insurance (approximately $3 per meeting)
  • We would need about $80/month to rent the space for 3 hours
  • Parking passes would be available to attendees
  • Nobody would have to buy Kitchener guest cards
  • If we got City of Kitchener Tier 2 funding we would probably solidify our chances of getting the space on a regular basis

44 Gaukel

  • This space holds about 20 people at most.
  • It is on the second floor but there is an elevator.
  • It costs money.
  • Paul looked into this.


This would be at the Tannery building.

  • Maybe problems month after month
  • Free?
  • May need to switch end time to 8:30pm
  • Paul is the contact

Laurentian Room

This is at the Zehrs Laurentian, 750 Ottawa Street South.

The KW-RASC group uses this meeting space.

  • Maybe free? Nope. $75 per meeting.
  • Not that walkable, but good parking
  • Some wifi access available, but you need to authenticate with the captive portal.
  • Paul has made initial contact but needs to follow up

43 Queen Street South, Upstairs

This is a meeting room the floor above the Queen Street Commons.

  • Probably free
  • Probably available even if Paul cannot host
  • Must be out by 9pm sharp (probably a little earlier)
  • Not wheelchair accessible at all
  • Parking is horrible
  • No sound system
  • A projector is probably available
  • Wired or wireless internet should be available

First United Church

Here is a map. The address is 26 William Street West, at the corner of King and William in Waterloo.

The website is

  • Free of charge
  • Few constraints on time
  • It is a church
  • Noisy (lots of echo in the room)
  • No sound system unless we get the gym
  • Does have a projector
  • Lots of parking
  • It is a church
  • Has a kitchen
  • Good accessibility via public transit
  • Wheelchair accessible
  • Bill Switzer is the contact.

University of Waterloo

  • Maybe free of charge? (Lori, Jeff)
  • Parking is bad

Kitchener City Hall

  • Stuart is investigating

Atomic Coworking Space

This is at 119 King Street W

  • Chris Craig is investigating

Kitchener Public Library

Waterloo Public Library

Probably Ruled Out

256 King

  • Owned by The Working Centre
  • Probably not available after hours
  • Parking will be an issue
Tags screenshot

On the mailing list, Raymond Chen told us about his favourite weather app, which can be accessed by typing


on the command line, in a sufficiently large terminal window. He sent a screenshot, but it was too big for the mailing list. Thus I am attaching it here.

File Attachments

Attachment Size
raymondchen-wttr.in_.png 78.11 KB

Notes for website users

Here are a few notes for those who wish to log into the website.

You do not need a website login to access most (all?) content. You want a login if:

  • You are organizing meetings and need to create meeting agendas, podcast/vidcast links, etc.
  • You are doing website administration.
  • You feel a pressing need to use KWLUG's website as a blog.

To get access to the website, talk to one of the meeting organizers or website admins at a meeting or via e-mail. Not everybody gets website access.

To log in, use the Drupal login link at .

To add content, use the "Shortcuts" link you see when you log in. There should be a shortcut to "Add content".

To log out, click on your username in the top bar, and click "Log out".

Be sure to use the correct "Page Category" setting when creating content. For some content types (agendas, podcasts) this is filled for you. For others you need to set the category explicitly (vidcasts, blog posts).

If you do not like the WYSIWYG editor you can change the text format from "Basic HTML" to "Restricted HTML".

KWLUG webhost migration: Tuesday, March 14

KWLUG is switching web hosts on Tuesday, March 14. This site will be unavailable for most of Tuesday afternoon. The mailing lists will also be unavailable during the migration.

We expect that the new, redesigned website will be up and running by Wednesday morning. The canonical status page is Check that page if you are wondering why things are taking so long.

We may also try to publish updates to Twitter and the Fediverse, but we cannot guarantee this.

Once the migration is complete old RSS feeds should work, but there may be a bunch of duplicated entries in your feeds. Unfortunately iCal feeds will break.

Drupal 8 Website Transition Issues Page

There is a testing version of the new KWLUG website available at . Please explore the new website and report issues using the Contact Us page.

What Should Work

  • Meetings, blog, podcasts, vidcasts and other content all have been transferred.
  • Meeting and presentation nodes have been merged.
  • All old links to nodes should work (via redirects in the case of presentations).
  • Attachments should work (but all attachments are visible, which is different).
  • Menus are set up and should work on mobile and desktop displays
  • Many podcasts/vidcasts are associated with their meeting nodes (please report incorrect or missing associations).
  • If you block Javascript from most sites (notably Cloudflare) but not, your menu will be expanded. (will not fix, probably).

What Does Not Work (Yet)

  • For logged in users, the admin toolbar does not work in Midori
  • Meeting locations from May 2007 to June 2009 need to be checked

What Has Been Fixed

Fixed in production

  • Laptop Rescue Missions show up as being held at 7pm, not 4pm (we will fix this in the final version)
  • The "Other Places to Find Us" block is missing (we will recreate it in the final version)
  • Links on the "mailing lists" page are broken (we will fix this when the mailing lists are migrated)

Fixed in rc1

  • Old RSS feeds on the current site need to be redirected to new ones
  • Maybe the site shows up blank in Firefox for Android? We need confirmation reports of this. (Confirmed that this works. Thanks Khalid and Chris.)
  • The site is not SSL by default?

Fixed in alpha 2

  • When Javascript is turned off the menu is fully expanded.
  • On Internet Explorer 11, the logo is stretched out. (Oh IE. Never change.)
  • Changed the colour of the bikeshed (site background) to make it darker blue

Feature Requests

  • KWLUG Planet of associated bloggers (waiting for more KWLUG members to sign up)
  • iCal feeds for meetings (waiting for Drupal 8 iCal support to improve).
  • Organizational pages accessible to meeting organizers only

Site Goals

  • Making the site mobile-friendly.
  • Reorganize the site to make it easier to find the information people care about.
  • Focus on meetings as the central organizing force, associating information like podcasts and vidcasts with their meeting pages.
  • Reduce the use of the website as a multi-user portal of content creation. People can still use KWLUG as a blogging platform if they want, but so few people used this functionality it is not helpful to keep it as central functionality.
  • For security reasons, only provide accounts to people actively creating content for the site.
  • Preserve as much historical information as feasible, because some of the old content is interesting to look at years later.
  • Keep all user accounts of those who have created content; get rid of all others (most of whom were spam).

Links for the WatCamp Calendar demonstration, 12 September 2016

I just know people will be asking for these links during the WatCamp Calendar presentation...

Main WatCamp site:

The Calendar:

The HTML-only Calendar:

(added Monday, 12 Sept 2016) WatCamp's GitHub page:


GNU social presentation notes

Hi all: I've completed my presentation notes; if you have any questions, confusions, clarifications or requests for additional stuff let me know by about 3:00pm on Monday.

See you all Monday night! Bring your laptops, phones, and other web-enabled devices so you can join in the demonstration.


File Attachments

Attachment Size
gnusocial Presentation Notes.odt 31.41 KB

Continuing Adventures with Ubuntu and Apache

Continuing Adventures with Ubuntu and Apache.
In a previous blog post "Installing LAMP on Ubuntu 11.04 aka The Natty Narwhal" I documented my start with Ubuntu and the Apache webserver suite.

This blog post was updated a few times as the installation was updated.
Recently, I went through another update exercise and instead of updating the previous blog post, I elected to make another blog post.

I am sure that this is "old hat" to many on this list.
But this work is not "old hat" to me.
And I would suspect that I am not alone in this.

As I recall, the previous updates to Ubuntu and especially to Apache were not trouble free.
I had been running Ubuntu 12.04 LTS since the last update in 20140525 or so.
(My bad: The other blog post does not explicitly say when 12.04 LTS was up and running.)
For some time I had been seeing Ubuntu notices that 14.04 was available. And when I tried to execute the update I saw an error message informing me that the Apache webserver was interfering with the update process. Fearing having a broken system I deferred the update for a while.

A few days ago, I bit the bullet and decided to update both Ubuntu and Apache starting with Ubuntu.
To update Ubuntu and according to various bits of advice on stackoverflow, askubuntu, apachefriends and elsewhere I needed to disable the Apache webserver.
ref: sudo service apache2 stop
ref: sudo update-rc.d apache2 disable
After a few runs at the update exercise the update from Ubuntu 12.04 LTS to 14.04 LTS was successful. The reasons why a few runs at the update exercise and details of which now elude me.

It may be needless to say that the the update to 14.04 LTS was not smooth as it could be.
But compared to the exercise in updating Apache the Ubuntu update was a whole lot smoother.

Restarting the Apache webserver was successful.
ref: sudo update-rc.d apache2 enable
ref: sudo service apache2 start

Continuing with the Apache update is where I ran into some real troubles.
Recalling that I had troubles with Apache updates over the past few years I saved a copy of /etc/apache2 in /usr (i.e. outside of /etc).
Again referring to the usual reference websites (see above) I executed apt-get.
ref: sudo apt-get install apache2
And, as I feared, I wound up with a broken system.

Apache simply would not start and, at times, would return error messages like:
The following packages have unmet dependencies: [ edit ]
Unable to correct problems, you have held broken packages.
The error messages referred to problems with the installation of php5.
Using our old sage, The Google, I looked for advice.
Somewhere there was a suggestion to use aptitude instead of apt-get.
No luck.

After attempting some repairs I trashed the broken /etc/apache2 installation.
And attempted to attempted a fresh install, again using apt-get.
And, in another run at this, using aptitude.
Result: "you have held broken packages" and again with references to php5.

I attempted to restore /etc/apache2 from a git repo created and maintained by etckeeper.
(Ref: discussions re: etckeeper in the KWLUG email list. And thanks to all who contributed.)
Result: "you have held broken packages" and again with references to php5.
Evidently, the issues with php5 are outside of /etc/apache2

I was not having much success with these repairs and looked again to The Google.
And I came across an entry about ppa repositories and how these can interfere with apt-get and aptitude.
After running through the advice given near the end of this askubuntu post it looked like the issues with php5 were solved.
And after I restarting the Apache webserver (an important step) the Apache webserver was running without errors.

Testing with /var/www/test.php containing <?php phpinfo(); ?> and executing FF: //http:/localhost/test.php.
The Apache phpinfo page is displayed.

My Linux PC is now running Ubuntu 14.04 LTS.
And Apache 2.4.7 is running - with php5

The apache2.conf file in the new install of /etc/apache2 does not have any of the local configurations that were in the configuration file prior to the update.
TODO: Restore the apache2.conf file as required from either the saved copy of the old /etc/apache2 or from the git repo created and maintained by etckeeper.
From a tip as seen on askubuntu re: fqdn below:
"It's a personal preference that keeps my configuration changes separated from the distribution package. So updates are less complicated."
sudo update-rc.d apache2 < enable : disable >
sudo service apache2 < start | stop | restart >
Re: errors with servers-fully-qualified-domain-name
service apache2 restart
Restarting web server apache2
apache2: Could not reliably determine the server's fully qualified domain name, using for ServerName
Ubuntu 14.04:
echo "ServerName localhost" | sudo tee /etc/apache2/conf-available/fqdn.conf
sudo a2enconf fqdn
Re: etckeeper
From the KWLUG list:
On 2010-02-26 13:08, Andrew Cant wrote (re: etckeeper)
> So I have not see any big benefits yet, but it requires little effort
> to maintain, and having the history of my changes makes me happy.

Chris Irwin presents btrfs

Chris Irwin presents btrfs
Apr 14, 2015 kwlug-2015-04-15-btrfs
Jul 7, 2015 kwlug-2015-07-06-btrfs-again
For more info, see: and

The Raspberry Pi revitalized my inner geek

As a single guy (AKA geek) just out of school, I tried to keep up on all the cool and upcoming tech. Over the past 15 years, I got married, had a kid, had several different roles at work and pursued a few different hobbies which steered me away from a lot of the fun I used to have with technology. I kept up enough to be proficient at work and to be the go-to tech guy of friends and family but I didn't have the drive or time to experiment as much.

The Raspberry Pi has piqued my interest again in some experimentation. It's an affordable way to mess around with a cool piece of technology and teach others about programming, hardware and open source software. I noticed the next meeting will be discussing the Pi so I won't go into it too much - attend the meeting to find out more. I may see you there if I get off work early enough.

Video editing using ffmpeg and ImageMagick

Sometimes, you want to edit multiple videos in a similar way. For that, I've found that the best way is to create a script that you can run consistently on those videos and get a consistent ouptut. For example, recordings from a conference or a day by day video log of your family vacation.

I have created some scripts using ffmpeg and ImageMagick for my some of my videos, saving me hours in the process.

The main advantages I've found are:

  • Consistency: I don't have to remember what I did to a video. It is all in the script
  • Time savings: Execute the script with the right parameters and go for dinner, let the computer work.
  • Control: I can execute just a portion of the script, play around with the options and be limited only by my imagination.

In this posts I will show some of the commands I've found most useful, these are very basic commands that can be improved by people more creative than me.

For this example I will use a script I created to edit my Toastmasters videos. You can find the full script attached to this post along with an explanation of each one of the components of the script

To test the script, just extract the attached sample file and execute the following command

./ sample.prm

This script does the following:

  1. Creates a few seconds of introduction video with a still image and information about the video (Title, speaker, date, etc)
  2. Creates a few seconds of closing video with a still image and credits and disclaimers
  3. Extracts a portion of the input video for editing as individual PNG frames
  4. Fades out the introduction image into the first 3 seconds of video
  5. Overlays some slides at certain points in the video
  6. Reassembles the video from the modified frames. adds the audio and attaches the introduction and closing.

It receives as parameters a file that contains the actual editing parameters:

  • INPUTFILE : Path to the file we want to edit
  • LOGO : Path to a file that will serve as the cover for the introduction
  • LOGOLENGHT : Lenght in seconds in which the introduction should show
  • SPEAKER : Name of the speaker
  • TITLE : Title of the speach
  • DATE : Date of the speach
  • SCENESTART : Time where the section of video I want to extract starts (can be as ss or as hh:mm:ss.fff)
  • SCENEDURATION : Time where the section of video I want to extract ends (can be as ss or as hh:mm:ss.fff)
  • PROJECT : Short name for the project. It will be used to name temporary files and the output file

Here is an example of my parameters file:

SPEAKER="Raul Suarez"
TITLE="The dreaded empty page"
DATE="July 28, 2011"

Extract Video:
Extracts a portion of video from the input file converting the video to frame files one PNG file per frame and splitting the audio to to an mp3 file

mkdir -p "${OUTPUTFILE}-frames"
ffmpeg -loglevel quiet -threads 4 \
-f image2 -y "${OUTPUTFILE}-frames"/frame%d.png \
-acodec copy -sameq -y "${OUTPUTFILE}.mp3"

-loglevel : defines how verbose I want the console output
-threads : If allows using multiple cores in a multicore processor. Can speed up some tasks
-i : The name of the input file
-ss : Indicates when does the segment of video we want start
-t : Indicates the duration of the segment of video we want
-f : Format of the output. In this case the format is image as we are extracting to one frame per file
-y : Overwrites files without asking
"${OUTPUTFILE}-frames"/frame%d.png : This part of the command tells ffmpeg to extract each frame to a file named frame1.png, frame2.png, etc
-acodec copy : extract the audio without re-encoding
-sameq : do not loose quality (may not be necessary here but I left it just in case)
"${OUTPUTFILE}.mp3" : is the name of the audio file we are saving

I could have done this with three commands, which is more readable, but takes more time

# Extract the video
-acodec copy -vcodec copy -sameq -y "${OUTPUTFILE}-1.mpg"

# Split the audio to preserve it
ffmpeg -i "${OUTPUTFILE}-1.mpg" -acodec copy -sameq -y "${OUTPUTFILE}.mp3"

# Convert the video to frame files one PNG file per frame
mkdir -p frames
ffmpeg -i "${OUTPUTFILE}-1.mpg" -f image2 -y frames/frame%d.png

Create Introduction
Uses the ImageMagick convert command to create the introduction image by merging the logo file with the titles for the video

convert ${LOGO} -gravity Center -font DejaVu-Sans-Book \
-pointsize 20 -fill gray -draw "text 1,21 'Talk of the Town Toastmasters'" \
-fill white -draw "text 0,20 'Talk of the Town Toastmasters'" \
-pointsize 50 -fill gray -draw "text 2,72 '${SPEAKER}'" \
-fill white -draw "text 0,70 '${SPEAKER}'" \
-pointsize 30 -fill gray -draw "text 1,131 '${TITLE}'" \
-fill white -draw "text 0,130 '${TITLE}'" \
-pointsize 20 -fill gray -draw "text 1,171 '${DATE}'" \
-fill white -draw "text 0,170 '${DATE}'" \

ImageMagick can, in a single instruction add multiple lines of text. It has different ways of doing this. For this example I used the "draw" command. To see other methods you can go to

This command gets the ${LOGO} file and overlays the text on top of it.

As you can see in this example, I have two "draw" commands for each line, I do this to create a "gray shadow" effect on the text.

The resulting image will be saved as "${OUTPUTFILE}-intro.png"

Create video from an image adding a silent sound track

ffmpeg -loglevel quiet -threads 4 \
-loop_input -i "${OUTPUTFILE}-intro.png" -qscale 1 -r 29.97 -t ${LOGOLENGHT} \
-ar 48000 -t ${LOGOLENGHT} -f s16le -acodec pcm_s16le -i /dev/zero -ab 64K -f mp2 -acodec mp2 \
-map 0.0 -map 1.0 -sameq -f mpegts -y "${OUTPUTFILE}-intro.mpg"

The first section of the command defines the video portion of the file

-loop_input will loop over the following file to create the output
-r : The output video will be 29.97 frames per second. This is the framerate for NTSC

The second portion defines the audio portion of the file: The silence. It is important to add a sound track or we will have problems concatenating at the end.

-ar : audio sampling frequency of the audio
-f : format, Note how when the format and codec are before -i, they refer to the input format, if they are after, they refer to the ouptut format.
-acodec : Audio codec
-i /dev/zero : This is where we take the "silence". Of course, if you want a real audio file you can use it here.
-ab : Audio bitrate

Finally we assemble the input video and audio into the ouput file

-map : These map parameters say: take the first channel of the first input (video) and the first channel of the second input (audio)
(I've explained the rest of the parameters in previous commands)

This is equivalent to the following three commands

# create proper lenght of silence
ffmpeg -ar 48000 -t ${LOGOLENGHT} -f s16le -acodec pcm_s16le -i /dev/zero -ab 64K -f mp2 -acodec ac3 -y silence.mp2

# Create still logo video
ffmpeg -loop_input -i "${OUTPUTFILE}-Logo.png" -qscale 1 -r 29.97 -t ${LOGOLENGHT} -y -f mpegts "${OUTPUTFILE}-logo1.mpg"

# Assemble still logo and silence
ffmpeg -loglevel error -i "${OUTPUTFILE}-logo1.mpg" -i "silence.mp2" \
-vcodec copy -acodec copy -map 0.0 -map 1.0 -sameq -threads 4 \
-y -f mpegts "${OUTPUTFILE}-intro.mpg"

The exit video is created in a similar way

FadeOut introduction
You may be wondering why we extracted all the frames to PNG files. The main reason is that it allows us to manipulate them however we want using ImageMagick. We can rotate them, mix, change colors, add overlays. Your imagination is the limit.

In this case I am disolving the intro image progressivelly into the corresponding input video frames.

mkdir -p "${OUTPUTFILE}-frames2"
for i in {1..90}; do
percent=$(echo "scale=3; ${i}*100/90" | bc )
convert -compose dissolve -gravity center -define compose:args=${percent} \
-composite "${OUTPUTFILE}-intro.png" "${OUTPUTFILE}-frames"/frame${i}.png "${OUTPUTFILE}-frames2"/frame${i}.png

for i in {1..90} : The loop will operate in the first 90 frames (3 seconds at 29.97 frames per second ~ 90 )
percent=$(echo "scale=3; ${i}*100/90" | bc ) : calculates the percentage we want to use to disolve. From 0 to 100% in 90 steps
The convert command disolves the "intro" image into each of the frames applying the corresponding disolve percentage.
Each of the resulting frames is written to another temporary folder.

Overlay an image
If you want to overlay an image on a section of video, you need to calculate the starting and ending frames so you can loop through those images doing the overlay:

I created a function to do the overlay, so I can overlay different images at different points in the video:

overlayImage () {
# Overlays an image on top of each frame in a range.
START_FRAME=$(echo "scale=0; ${3}*29.97/1" | bc )
END_FRAME=$(echo "scale=0; ${4}*29.97/1" | bc )

for (( i=${START_FRAME} ; i<=${END_FRAME} ; i++ )) ; do
convert -compose dissolve -gravity ${GRAVITY} -define compose:args=90 \
-composite "${OUTPUTFILE}-frames"/frame${i}.png "${FILE}" "${OUTPUTFILE}-frames2"/frame${i}.png

The overlayImage function receives as parameters

  • The image we want to overlay
  • The relative positioning (gravity)
  • The start time on the section of video in seconds
  • The end time of the section of video in seconds

The loop disolves the overlay image into each of the frames for the section of video we want

Reassemble the video

# Copy the modified frames on top of the original frames
cp "${OUTPUTFILE}-frames2"/frame*.png "${OUTPUTFILE}-frames"

# Reassembles the frames and the audio into an output video
ffmpeg -loglevel quiet -threads 4 \
-r 29.97 -f image2 -i "${OUTPUTFILE}-frames"/frame%d.png \
-i "${OUTPUTFILE}.mp3" -acodec copy \
-map 0.0 -map 1.0 -sameq -f mpegts -y "${OUTPUTFILE}.mpg"

# Concatenates the introduction, video and closing
ffmpeg -loglevel quiet -threads 4 \
-i concat:"${OUTPUTFILE}-intro.mpg"\|"${OUTPUTFILE}.mpg"\|"${OUTPUTFILE}-exit.mpg" \
-r 29.97 -sameq -y "${OUTPUTFILE}.mp4"

And that's it. As you can see, with small modifications to these commands you can edit your video however you want.

If you search the internet you will find plenty of examples for ffmpeg for example

While the ImageMagick documentation is the best source for more examples.

While you can do it using a GUI video editor such as Kino, Cinelerra or final cut. I found that the flexibility and repeatability of scripting it simplified my life.

I hope it simplifies yours too.

If you have any comments you can email me at

rarsa --at--

File Attachments

Attachment Size
sample.tar_.gz 4.83 MB