Site Map - skip to main content - dyslexic font - mobile - text - print

Hobby Public Radio

Your ideas, projects, opinions - podcasted.

New episodes Monday through Friday.



Welcome to HPR the Community Podcast Network

We started producing shows as Today with a Techie 10 years, 10 months, 28 days ago. Our shows are produced by listeners like you and can be on any topic that "are of interest to hobbyists". If you listen to HPR then please consider contributing one show a year. If you record your show now it could be released in 14 days.


Latest Shows


hpr2108 :: Changing the Oil on My Wife's Car

Listen and enjoy as I change the oil on my wife's Honda CR-V


Hosted by Jon Kulp on 2016-08-31 and released under a CC-BY-SA license.
Listen in ogg, spx, or mp3 format. Comments (0)

Since people don’t seem to be adding enough shows, you’re going to be subjected to listening along while I change the oil on the car. This might be fascinating or it might be boring, but in either case I hope it inspires someone else to start uploading more shows. Incidentally, I recorded this whole thing on my phone, I’m doing these show notes on my phone, and am going to upload it from my phone as well, without adding the intro and outro music, showing just how easy it really is (as the saying goes).


hpr2107 :: Makefiles for Everyday Use

I talk about how I use Makefiles in my Lilypond and HTML projects


Hosted by Jon Kulp on 2016-08-30 and released under a CC-BY-SA license.
Listen in ogg, spx, or mp3 format. Comments (1)

In this episode I talk about how I use Makefiles to ease the process of building complicated projects in Lilypond and HTML. You can use Makefiles to run any kinds of commands you want. It does not have to be building actual computer programs. In my case I use them to build musical scores and web pages. Keep in mind I'm not an expert on this, and I'm hoping I will make enough mistakes that it will prompt a series of follow-up episodes by people who actually know what they're talking about.

Here's an example. This is the Makefile for my Counterpoint workbook Gratis ad Parnassum, which I wrote in 2009. Written in a combination of LaTeX and Lilypond, this requires very complicated and long commands to build the workbook, and I found that the only way to do this project in a sane manner was to create a Makefile that would keep track of changes in the files and only rebuild when necessary. It also meant that the only commands I would have to type were very simple, because the long command line options were all stored in the Makefile.

SHELL=/bin/bash
FILE=workbook_main
OUTDIR=out
WEBDIR=htmlout
VIEWER=evince
BROWSER=firefox
LILYBOOK_PDF=lilypond-book --output=$(OUTDIR) --pdf $(FILE).lytex
LILYBOOK_HTML=lilypond-book --output=$(WEBDIR) $(FILE).lytex
PDF=cd $(OUTDIR) && pdflatex $(FILE)
HTML=cd $(WEBDIR) && latex2html $(FILE)
INDEX=cd $(OUTDIR) && makeindex $(FILE)
PREVIEW=$(VIEWER) $(OUTDIR)/$(FILE).pdf >& /dev/null

all: pdf web

pdf:
$(LILYBOOK_PDF)
$(PDF)
$(INDEX)
$(PDF)
$(PREVIEW)

web:
$(LILYBOOK_HTML)
$(HTML)
cp -R $(WEBDIR)/$(FILE)/ ./
sleep 1
sh html-sed-fixes.sh
$(BROWSER) $(FILE)/index.html &

keep: pdf
cp $(OUTDIR)/$(FILE).pdf gratis.pdf
pdftk gratis.pdf update_info gratis.info output GratisAdParnassum.pdf

clean:
rm -rf $(OUTDIR)

web-clean:
rm -rf $(WEBDIR)

archive:
tar -cvvf free-counterpoint.tar \
--exclude=out/* \
--exclude=*.tar \
--exclude=*.zip \
--exclude=htmlout/* \
--exclude=workbook_main/* \
--exclude=*midi \
--exclude=*pdf \
--exclude=*~ \
../FreeCounterpoint/*
tar -xvvf free-counterpoint.tar
zip -r free-counterpoint.zip FreeCounterpoint
rm -R FreeCounterpoint

And here is the Makefile for my song collection called Canciones para niños, using Lilypond source files.

SHELL=/bin/bash
piece = lorca
#CPU_CORES=`cat /proc/cpuinfo | grep -m1 "cpu cores" | sed s/".*: "//`
LILY_CMD = lilypond -ddelete-intermediate-files \
                    -dno-point-and-click #-djob-count=$(CPU_CORES)

notes = \
cancioncilla.ily \
cantada.ily \
caracola.ily \
china.ily \
lagarto.ily \
nana.ily \
paisaje.ily \
remanso.ily

.SUFFIXES: .ly .ily .pdf .midi

#CURDIR = $(shell pwd)
VPATH = $(CURDIR)/Scores $(CURDIR)/PDF $(CURDIR)/Parts $(CURDIR)/Notes

%.ly: %.ily
%.pdf %.midi:  %.ly 
$(LILY_CMD) $<
mv *.pdf PDF/
mv *.midi MIDI/

$(piece).pdf: $(notes) 

cancioncilla.pdf: cancioncilla.ly cancioncilla.ily
cantada.pdf: cantada.ly cantada.ily
caracola.pdf: caracola.ly caracola.ily
china.pdf: china.ly china.ily
lagarto.pdf: lagarto.ly lagarto.ily
nana.pdf: nana.ly nana.ily
paisaje.pdf: paisaje.ly paisaje.ily
remanso.pdf: remanso.ly remanso.ily

.PHONY: score
score: $(piece).pdf

keep: score
cp $(CURDIR)/PDF/$(piece).pdf $(CURDIR)/CancionesParaNinos.pdf

archive:
tar -cvvf lorca.tar \
--exclude=*.pdf \
--exclude=*.midi \
--exclude=*~ \
../Canciones/*
tar -xvvf lorca.tar
zip -r lorca.zip Canciones
rm -R Canciones

Links


hpr2106 :: My Podcast Client

A show about my podcast client

Hosted by MrX on 2016-08-29 and released under a CC-BY-SA license.
Listen in ogg, spx, or mp3 format. Comments (1)

This is a show about my podcast client. Apologies for any rough edges as I did it in a hurry to answer the call for more shows


hpr2105 :: 24 - SSL Certificates - Problems

A discussion of the problems with SSL certificates, and some solutions


Hosted by Ahuka on 2016-08-26 and released under a CC-BY-SA license.
Listen in ogg, spx, or mp3 format. Series: Privacy and Security | Comments (0)

I had the opportunity to present a talk on SSL Certificates at our local LUG, the Washtenaw Linux Users Group, which uses some material from a previous HPR episode, but may be of interest to our listeners nonetheless. Because this was a lengthy presentation I have divided it into sections. This is the second section which will explore some of the problems that we have with SSL Certificates, and how we might address those problems. The first section contains our description of how SSL Certificates work.

For more go to http://www.zwilnik.com/?page_id=686


hpr2104 :: Basic Audio Production: Reverb

A very basic description of the reverb effect

Hosted by Nacho Jordi on 2016-08-25 and released under a CC-BY-SA license.
Listen in ogg, spx, or mp3 format. Comments (0)

Here is the calf reverb plugin, neat and with a nice graphic interface (it contains a few parameters that I don’t cover in the podcast, thought).

http://www.audiopluginsforfree.com/calf-reverb/

You can probably download it too directly from your Package Manager


hpr2103 :: DIY Book Binding

With no shows in the queue, Ken rushes in a show on his latest hacks


Hosted by Ken Fallon on 2016-08-24 and released under a CC-BY-SA license.
Listen in ogg, spx, or mp3 format. Comments (0)

I love books, dislike technology when reading about technology, so what to do when the only available option is a pdf or ebook format ?

With a hpr1480 :: Continuous Ink Supply System and 500 pages of A4 paper costing just €3, the option to print out books at home is not only possible but down right affordable. Even more so when when printing booklet format of 4 pages per physical sheet of paper.

Small books of around 100 pages/25 sheets and a long arm stapler works fine, of larger sizes you can get a Comb binding machine but I dislike the sound and feel of these solutions

My solution, a Jig Saw, some wood clamps, PVC Plumbers Glue, and some drywall/plaster board tape (pdf)

Clamping the book and cut in half with a Jig Saw
Clamping the book and cut in half with a Jig Saw.

Clamp both halves together, aligning them together on their uncut edge, and trim the cut edges to give a clean cut
Clamp both halves together, aligning them together on their uncut edge, and trim the cut edges to give a clean cut.

Builders supply stores and DIY shops carry the tape and glue
Builders supply stores and DIY shops carry the tape and glue.

Glue and tape repeatedly and allow to dry
Now apply a liberal amount of glue to the cut edge, apply the tape and let it dry for 30 minutes. Then apply another layer of glue and fold down the excess tape. Apply at least two more applications of glue.


hpr2102 :: AngularJS's ng-repeat, and the browser that shall not be named

A method for optimizing the rendering of items when using AngularJS's ng-repeat directive.


Hosted by Rho`n on 2016-08-23 and released under a CC-BY-SA license.
Listen in ogg, spx, or mp3 format. Comments (0)

Introduction

At my work, we are in the process of revamping our internal call logging system. Moving from .NET and Microsoft’s ASPX pages for both the client side and back end processing, to an HTML5 based Single Page Application (SPA) using AngularJS for the client side interface with a .NET WebAPI service for the back end processing. The main page for both versions contains a list of the current days calls laid out in a table with 9 columns. Users are able to switch to a specific day’s calls by selecting a date via a calendar widget, or by moving one day at a time via previous and next day buttons. By the end of a typical day, the page will contain between 40 and 50 calls.

During recent testing of the SPA client on the proprietary browser we all love to hate, or at least have a love/hate relationship with if you have to support it, I noticed that rendering of a whole days worth of calls would take seconds, freezing the UI completely. This made changing dates painful. As we reload the data any time you re-enter that page (a manual way to poll for new data until we implement either timer based polling or a push service through websockets), the page was almost unusable. The page rendered fine in both Mozilla and webkit based javascript JIT engines, but Microsoft’s engine would choke on it.

After a bit of searching on “AngularJS slow rendering” and “AngularJS optimize”, I found many references about using Angular’s ng-repeat directive when rendering long lists of data (see references below for the main pages I read). I tried a couple of the methods mentioned to optimize the ng-repeat directive. I used the “track by” feature of ng-repeat to use the call’s id as the internal id of the row, so ng-repeat didn’t have to generate a hashed id for each row. I implemented Angular’s one-time binding feature to reduce the number of watches being created (reducing the test day’s number of watches from 1120 to 596), but even these two combined optimizations didn’t have enough effect to render the page in an acceptable amount of time. The next optimization I played with was using ng-repeat with the limitTo filter. This limits the number of items rendered in the list that ng-repeat is looping through. This is particularly useful combined with paging of the data. I set the limitTo option to different values to see how it affected the rendering time. I found that rendering 5 rows was fast and consistent for every day’s worth of data I viewed. From my reading, I knew if I updated the limitTo amount while keeping the array of items the same, ng-repeat would only render any un-rendered items, and not redo the whole limited list.

The Code

<tr ng-repeat="c in results | limitTo:displayRenderSize">

Inside your directive, set an angular.$watch on the list of items to be rendered by ng-repeat. In this example the list is stored in the variable results.

return {
        scope: {
            results: "=",
    },
        link: function (scope, element, attrs) {
            scope.renderSizeIncrement = 5;
            scope.displayRenderSize = scope.renderSizeIncrement;

            scope.$watch('results', function () {
                if (scope.results) {
                    scope.displayRenderSize = scope.renderSizeIncrement;
                    scope.updateDisplayRenderSize();
                }
            });
            scope.updateDisplayRenderSize = function () {
                if (scope.displayRenderSize < scope.results.length) {
                    scope.displayRenderSize += scope.renderSizeIncrement;
                    $timeout(scope.updateDisplayRenderSize, 0);
                }
            }
        }
    }
}

Any time the results are updated. The displayRenderSize variable is reset to render the default number of items, and the updateDisplayRenderSize function is called. This function calls itself repeatedly via angular’s $timeout service ($timeout is a wrapper for javascript’s setTimeout function). It increments the displayRenderSize variable which is being watched by the limitTo filter of the main ng-repeat. Each time the displayRenderSize variable is incremented, the ng-repeat renders the next set of items. This is repeated until all the items in the list are rendered.

The magic happens because ng-repeat blocks any other javascript, which does not effect angular’s digest path, until it is finished rendering. By calling the updateDisplayRenderSize with a timeout, the function doesn’t get called again until after the next set of items is rendered. Making the $timeout delay 0, sets the function to be called as soon as possible after the ng-repeat digest cycle stops blocking. In this instance, the sum of the rendering time for parts of the list is shorter than the sum of the rendering time for all of the list at one time.

Conclusion

There are a couple small glitches with this solution. Scrolling can be a bit jerky as the chunk sized renders cause a series of micro UI freezes, instead of one big long one. Also, if you don’t have a fixed or 100% percent wide table layout, and you don’t have fixed column sizes, the table layout will dance a little on the screen until the columns have been filled with their largest amounts of data. This is the result of the table layout being re-calculated as more data fills it. That being said, overall, this solution works great. It moved the pause from seconds to under half a second or less—making the page go from unbearable to usable on Microsoft’s latest browser offerings.

References

[1] AngularJS Performance Tuning for Long Lists; Small Improvements; Tech blog; blog; viewed: 2016-08-09

[2] Optimizing ng-repeat in AngularJS; Fundoo Solutions; blog; viewed: 2016-08-09

[3] AngularJS: My solution to the ng-repeat performance problem; thierry nicola; blog; published: July 24, 2013; viewed: 2016-0809


hpr2101 :: What's on my podcatcher

Some of the podcasts I listen to

Hosted by Tony Hughes AKA TonyH1212 on 2016-08-22 and released under a CC-BY-SA license.
Listen in ogg, spx, or mp3 format. Series: Podcast recommendations | Comments (0)

A short show about the podcasts I like to listen to.


hpr2100 :: Re-Enable Copy and Paste in Browsers

How to bypass the roadblocks implemented by JavaScript


Hosted by Ken Fallon on 2016-08-19 and released under a CC-BY-SA license.
Listen in ogg, spx, or mp3 format. Comments (0)

This episode deals with the annoying, and frustrating practice of disabling copy and paste on websites through the use of javascript.

For a detailed explanation of the why please read this excellent article by Nicholas Miller Re-Enable Copy & Paste on Annoying Sites That Block It. In this article Nicholas explains that you can set dom.event.clipboardevents.enabled in Firefox to prevent this.

In Chrome, you are going to need to install extensions to get the same functionality. The following ones worked for me:

https://www.troyhunt.com/the-cobra-effect-that-is-disabling/


hpr2099 :: Dat Muzak Showz

Lyle (x1101) and Thaj talk about making music on Linux

Hosted by x1101 on 2016-08-18 and released under a CC-BY-SA license.
Listen in ogg, spx, or mp3 format. Comments (0)

Note, starting any of while doing anything else with audio is probably a poor choice. At least in Linux. Because Linux audio is still slightly Lovecraftian.

Tools Thaj suggested:

  • LMMS,
  • Ardour,
  • Qtractor,
  • Fluidsynth,
  • Hydrogen,
  • Luppp,
  • Guitarix,
  • Rackarack

https://www.youtube.com/watch?v=MPmkd0fgiLU