I'm using this post to keep track of different kinds of coffee

February 10th, 2021 1 comment

NameRemarksFrench press timeCost
Starbucks Pike Place Medium RoastPersonal favourite so far.  Smells amazing, strong taste, not bitter even when overbrewed5 minutes$2.02/100g
LavAzza Qualita RossaUnusual but delightful strong aroma and flavour without being bitter.  Very fine grind as you would expect from an espresso, but was a hundred percent satisfactory brewed in a French Press.3:30 because it takes time to decant due to the fine grind.  However, it's not overpoweringly bitter if overbrewed.$1.99/100g
President's Choice Colombian Supremo Medium RoastDoesn't smell as strong as coffee should, but is quite flavourful and not very bitter.4 minutes$1.76/100g
PC Organics Medium Dark Roast Whole BeanI'd call this light rather than medium.  The flavour is good but not super strong.4 minutes$2.64/100g
Nabob Bold Full City Dark Ground CoffeeAn excellent dark coffee.No longer than 4 minutes, otherwise it turns bitter.$2.66/100g
President's Choice The Great Canadian Light to Medium RoastAs far as light roasts go, it's good, but it is quite light.$0.91/100g

Wahl Hair Clipper Pulls or Doesn't Cut Hair

October 14th, 2019 No comments

If your Wahl hair clipper pulls hair or simply doesn't cut it, you can correct the problem by adjusting the power screw, probably located on the side of the clipper.

Turn on the clippers.  Turn the screw slowly clockwise until you hear a "clattering" noise.  Then turn the screw counterclockwise until the clipper is as quiet as possible.  The clipper is now adjusted correctly.

If you find that you have to adjust the power screw multiple times during the cut, perhaps the chassis screws have vibrated loose.  Gently tighten all other screws on your clipper, then readjust the power screw.

Another cause of this symptom is that the blade screws are too tight.  They should be snug, but not as tight as possible.

Toro string trimmer loading instructions

August 5th, 2019 1 comment

When loading a Toro string trimmer, the string should be wound in the direction of the arrows.  The cartridge is to be turned in the opposite direction of the arrows.

Bambora process_transaction.asp error: "Declined: Entered Information Cannot Be Authenticated"

April 1st, 2019 1 comment

If you are using Bambora's (formerly Beanstream) process_transaction.asp and receive the error "Declined: Entered Information Cannot Be Authenticated", you may find this frustrating, because although this error appears in their documentation, there's no information about what it means or how to solve it, which is basically useless.

At least one reason this error can appear is if the hashValue variable is not included in your query string.  To make it, use code similar to the following:
$query_string .= "&hashValue=" . sha1($query_string . $your_hash_key);
It may be worth it to note that not only is this error message completely undocumented, the hashValue variable does not appear in the Querystring API documentation.

Elementary School Mental Math Exercises

March 18th, 2019 No comments

Here are the online quizzes that we designed for practicing elementary school math: addition, subtraction, multiplication, division.  Please share if you find them useful.


Automatically print WooCommerce orders

December 27th, 2018 No comments

Disclaimer: this doesn't have an easy solution, and the solutions that do exist are printer-specific, so we're not releasing this as a plugin.  It will almost certainly need to be modified to fit your specifications.

There are few, but not non-existent, situations in which it may be helpful to print a physical order summary on actual paper for your staff to fill.  This is one way to do it.  Once again, this will NOT work out of the proverbial box; you need to read and understand the code, and modify it to fit your needs.
Plugin Name: WooCommerce Print Orders
Description: Hopefully this will print the orders at the printer in the office.
Author: Mango
Version: 0.1Alpha
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
add_action('woocommerce_order_status_completed', 'wcpo_create', 10, 1);
// I'm going to put the variables up here, but there's no GUI for this.  If you're smart enough to use it, you're smart enough to configure here.
$GLOBALS['wcpo_config'] = array(
 'office_ip' => "toshiba.office",
 'office_port' => "9100",
 'error_email' => "webmaster@example.com",
// Note that some web server firewalls do not allow outbound connections on port 9100.  One way to get around this is to, use your router to forward some allowed port such as 443 to your printer on port 9100.  When using port forwarding, be sure to restrict source IP appropriately so that random people cannot print to your printer.
// Menu item for this.
if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) {
 add_action('admin_menu', 'wcpo_menu');
function wcpo_menu() {
 add_submenu_page('woocommerce', 'Print Orders', 'Print Orders', 'manage_options', 'wc-print-orders', 'wcpo_init');
// Basic UI to enter an order ID and have it print; useful if the internet at the office is down and we need to catch up.
function wcpo_init(){
 echo "<p>Enter the Order ID to print an order</p>";
 echo "<form method='get' action=''><input name='order_id' /><input type='hidden' name='page' value='wc-print-orders' /><input type='submit' /></form>";
 if (isset($_GET['order_id'])) wcpo_create($_GET['order_id']); 
// This is where the magic happens
function wcpo_create($order_id) {
 // First let us load the order, the ID of which is passed as the first parameter of this function.
 $order = new WC_Order($order_id);
 $order_data = $order->get_data();
 if ($order_data['status'] != "completed") return false; // This should never fire, but is here as a failsafe in case something goes horribly wrong..
 // Generate an order summary in HTML format.
 $html = ""
  . "<h2>New Online Order received on " . $order_data['date_completed']->date("F j \a\\t g:i a") . "</h2>"
  . "<p>{$order_data['billing']['first_name']} {$order_data['billing']['last_name']}<br />{$order_data['billing']['company']}</p>"
  . "<p>Phone: {$order_data['billing']['phone']}</p>"
  . "<h3>Items purchased:</h3><p>"
 // Loop through the items so we can include them in the order summary.
 $order_items = $order->get_items();
 foreach ($order_items as $item) $html .= "<b>{$item['quantity']}</b> of {$item['name']}<br />"; 
 $html .= "</p>";
 // Order notes.
 $html .= "<p>" . htmlspecialchars($order_data['customer_note']) . "</p>";
 // Now let's generate a PDF.  I decided to use TCPDF; you can use the library of your choice.  Since our printer can print PDFs, this is a reasonable choice.  Alternately, use pdf2ps to convert your 
 $pdf = new TCPDF('P', 'mm', 'LETTER');
 $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
 $pdf->SetFont('Helvetica', '', 14, '', true);
 $pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true);
 // The following are custom PJL commands that cause our printer to use input tray 3 and output tray 2.  If your printer doesn't support PJL commands, and the default settings don't work for you, there are other ways to do this.  Perhaps default settings for port 9100 may be set from within your printer's configuration.  Or if your printer supports PostScript, perhaps you can find a PPD file that gives you the PostScript commands to use.
 $pdf = ""
  . chr(27) . "%-12345X@PJL\r\n"
  . "@PJL SET TRAY=TRAY3\r\n"
  . "@PJL SET USERID = \"Mango\"\r\n"
  . $pdf->Output("", 'S')
  . chr(27) . "%-12345X"
 // Print it!
 $socket = @fsockopen($GLOBALS['wcpo_config']['office_ip'], $GLOBALS['wcpo_config']['office_port'], $errno, $errstr, 30);
 if (!$socket) return wcpo_error("Order $order_id\n\nCould not open the socket to {$GLOBALS['wcpo_config']['office_ip']}:{$GLOBALS['wcpo_config']['office_port']}.\n\n$errstr ($errno)");
 $written = fwrite($socket, $pdf); // doesn't work with very large files but IDGAF for this.
 if ($written != strlen($pdf)) return wcpo_error("Order $order_id\n\nOnly $written of " . strlen($pdf) . " bytes were able to be sent to the printer.");
function wcpo_error($e) {
 mail($GLOBALS['wcpo_config']['error_email'], "WooCommerce Print Order Summary: Error", $e, "From: {$GLOBALS['wcpo_config']['error_email']}");

InDesign: convert text to outlines when exporting to PDF

September 1st, 2018 No comments

Evan from the InDesign Feedback forum has got it going on.  If your printing company requires text be converted to outlines, there is an automatic way to do it.

He writes: "Go to EDIT >> TRANSPARENCY FLATTENER PRESETS.  Click NEW.  Give it a name you'll remember like 'Outline Everything'.  Check the box for CONVERT ALL TEXT TO OUTLINES and hit OK to save that preset.  Now when you go to export your PDF, in the export options, go to ADVANCED and choose your 'Outline Everything' preset from the 'Transparency Flattener' dropdown menu.  You'll probably have to go back and tweak the settings in your flattener preset a few times to get exactly what you want."

Sonofagun.  It works like a charm.  As another user reports, it only works with the PDF/X-3:2003 standard, but if that limitation is acceptable to you, as it was to us, go for it.

UPDATE: We discovered another necessary step: in order for the transparency flattener to be used, there must be something with transparency in your document.  If your document doesn't have that, just make a small frame with no stroke and no fill (so it won't be seen) and set its opacity to 99%.

Convert audio files to ulaw or sln for use with a VoIP PBX (Updates for 2018)

August 13th, 2018 2 comments

Converting high quality audio files to ulaw is easy, but making them sound good takes some effort.  Keep reading for the technique we use, updated for 2018.


Mango's Guide to Configuring an OBi100, OBi110, OBi202, OBi200, OBi302, and OBi300 ATA

January 18th, 2018 8 comments

OBi100We used Linksys ATAs for many years but upgraded to Obihai when we needed a device with an FXO port.  Obihai has outdone themselves and created some devices that are even more configurable than their older PAP2T, SPA2102, and SPA3102.  OBi ATAs are deficient in only a few ways - for example a mediocre jitter buffer, and no way of routing calls based on Caller ID Name or customizing Caller ID Name.  Fortunately, OBi ATAs' good qualities - particularly their excellent audio and powerful call routing - far exceed their shortcomings and they are what we believe to be the finest ATAs available today.


Do you use an OBi100/OBi110 with Google Voice? The OBi1 series no longer works with Google Voice.  Your options are to switch to one of the many dozens of compatible service providers, buy an OBi2, or build an Asterisk server based on naf's modifications.

Do you want to configure your OBi2 or OBi3 for Google Voice without using the OBiTALK portal? Thanks to naf, now you can: Manual Google Voice configuration for OBi ATA.


How to transfer Bitcoin Cash and Gold out of MultiBit

December 18th, 2017 1 comment

MultiBit is an older Bitcoin wallet that is now unmaintained.  Its developers recommend users move to another wallet.  Transferring your Bitcoin out is easy.  But how do you transfer out your Bitcoin Cash?

Use the following procedures AT YOUR OWN RISK. This worked for us, but we make no guarantee it will work for you.  We tested with MultiBit 0.5.18 and Electron Cash 3.0 for Windows, and Coinomi 3.9 for Android.

1) If you are particularly cautious, transfer your Bitcoin out of your MultiBit to some other wallet first.  That way, if your MultiBit wallet is compromised, your Bitcoin is safe.

2) From within MultiBit, navigate to Export Private Keys.  Enter your wallet password, choose a location for your export file, and choose "Do not password protect export file".  Click the "Export private keys" button.

3) Download and run Electron Cash from https://electroncash.org/.  Create a wallet.  When creating the wallet, choose the option "Import Bitcoin addresses or private keys".

4) Open the private key file you exported in Step 2.  Copy the private key without the timestamp and paste it into Electron Cash.  You can now import your private key and spend or transfer your Bitcoin Cash.

5) Install Coinomi Wallet and create a wallet by following its directions.  Use the Sweep Wallet function with the private key from Step 2 above.  ("Sweep" is a transfer that the receiver initiates using a private key.) This took several hours, but it did work.  Once the transfer completes, you can spend your Bitcoin Gold.

It should be possible to transfer Bitcoin Cash to your Coinomi wallet.  Steps 1-4 were written before we needed to work with Bitcoin Gold.  You can use any reputable and highly-rated compatible wallet.

Using your own YouTube API key to fix Daily Limit Exceeded on Kodi

November 30th, 2017 Comments off

This is an advanced-level document, so comments are disabled.

Navigate to https://console.developers.google.com/apis/credentials and create or retrieve your credentials.  Create an OAuth Client ID with application type of Other.  Then navigate to Library and allow your application to access the YouTube Data API V3.

Use nano to edit ~/.kodi/userdata/addon_data/plugin.video.youtube/settings.xml

You need to change the four values: youtube.api.enable youtube.api.id youtube.api.key youtube.api.secret

Adding a menu item to Confluence (Kodi skin)

November 30th, 2017 Comments off

This is an advanced-level document, so comments have been disabled.

First use the GUI to add the item to your favourites.

Then SSH into your system and cat ~/.kodi/userdata/favourites.xml to find the ActivateWindow syntax.

Next edit ~/.kodi/addons/skin.confluence/720p/Home.xml .  Search (CTRL+W in nano) for item id.  Use the existing syntax as a template and copy the ActivateWindow syntax from above.

Step and Repeat Photography notes

July 22nd, 2017 No comments

We're putting these notes here so we can refer to them next time we have to do a step-and-repeat setup.

  • F4 is an absolute maximum when working with large families, because you may need two rows of people to be in focus.
  • Kids don't stand still, so a 1/100 shutter speed or faster is useful.
  • Overexpose photos by 1/3 stop, then shoot in raw mode so you can adjust exposure slightly later if you need to.
  • Another reason to shoot in raw mode is Photoshop's raw conversion is better than some cameras.
  • If placing watermarks with a Photoshop action, try placing raster images rather than vector; perhaps it would size properly with both horizontal and vertical images.  Haven't tested this yet.
  • Bring along a bell or some toy or something to attract babies' attention.
  • Shoot in aperture priority mode unless you have 100% control over your light.

How to wall mount a Linksys E1200

July 20th, 2017 No comments

The circuit board is smaller than the case.  Simply separate the front of the case from the back, and drill a few holes in a keyhole fashion.

Picture below:


LEDMO Flexible LED Strip Lights - flicker test

June 19th, 2017 No comments

Let's see if these LED strip lights Mango bought from Amazon flicker.  We took a selection of photos with a 1/2000 second shutter speed and compared them.

Looks pretty great to us.  If there's a flicker, our equipment can't detect it.

Now, for comparison, let's do the same test with an incandescent light bulb.

The incandescent bulb actually flickers MORE than this LED strip does.

For the first time ever, retrofitting your troffers with LED T8 tubes is cheaper than fluorescent!

June 15th, 2017 No comments

tl;dr: Hyperikon LED tubes are pretty awesome.  Non-affiliate product link: https://www.amazon.ca/gp/product/B06X8Y6RL3/

If you've been frustrated by the lack of options for LED tube lights, worry no longer.  Hyperikon has the answer.  They don't require a ballast*, they're affordable, they're cUL-listed, and perhaps most importantly, they look great.

*Some models are dual mode internal driver and work with or without a ballast.

The glass tubes contain the style of LED strip that's quickly becoming more and more popular for both residential and commercial uses.  At one end is a tiny driver.


Quick and Easy Scones with a Food Processor

June 4th, 2017 No comments

In food processor's bowl, install 240 grams flour, 1 teaspoon baking powder, 3 tablespoons sugar (optional), and 0.5 to 1.5 teaspoons salt.  Pulse to mix once or twice.  Add 57 grams butter, cut into small pieces.  Blend butter with dry ingredients for a few seconds.  Add 100 grams buttermilk, milk, or water, and 1 egg.  Blend until mixture forms a ball.

Alternate: if you have the time, for a slightly better finished product, mix the milk and egg in by hand instead of with the food processor, so that the butter remains in small pieces.

Dough will be sticky.  Coat hands and baking sheet in flour.  Flatten dough into a circle shape and cut pie-style to eight pieces.  Separate pieces and bake at 350F

Flavours may be added after the butter.  For sweet scones, use 0.5 teaspoon salt and generously add raisins, blueberries, cranberries, lemon zest, or lavender.  For savoury scones, use 1.5 teaspoons salt, omit sugar, and add any combination of grated cheese, onions, cracked pepper, hot pepper, herbs, meat, or sun-dried tomatoes.

Mango's A19/800lm LED Bulb Roundup (updated for 2017)

April 8th, 2017 No comments

We decided to compare the top bulbs from the top manufacturers.  We chose candidates by looking at results from internet polls, and comparing them with bulbs easy to find at national retailers.  Here is a summary of our tests, ranked in our order of preference.  All the bulbs we tested are A19 shape, around 800 lumens, and either 2700K or 3000K.  The bulbs are Energy Star rated, unless noted.

Philips 9.5W Warm Glow (Home Depot)
As usual, a Philips light bulb is in first place for our favourite.  This is a pretty great bulb that dimmed silently with a trailing-edge (ELV) dimmer or very quietly with a leading edge dimmer.  Not only did it dim smoothly with no flicker, its colour temperature dropped just like an incandescent bulb.  Barely-detectable EMI.  This bulb used to be expensive but a recent price drop makes this bulb very affordable.

Hyperikon 9.5W 2700K High CRI (Amazon.ca)
This is a decent bulb that dimmed with no flicker or buzz on our trailing-edge (ELV) dimmer, and with no flicker and very quietly on our leading-edge dimmer.  Its startup delay when fully dimmed was noticeable, but not annoying.  One of the few bulbs available in a 4000K colour temperature.

Luminus 10W 3000K High CRI (Costco)
This bulb's dimming performance is mediocre - we noticed flickering at levels below 33% (trailing-edge ELV dimmer) or 25% (leading-edge dimmer) and buzzing at all levels with the leading-edge dimmer.  With the low-end trim adjusted to eliminate the flicker, the bulb didn't have much of a dimming range.  However, it looks great and is silent when not connected to a dimmer.  We recommend this bulb over its 9.5W non-dimmable cousin which has an annoying sporadic flicker.  This 3000K looks very obviously different from 2700k, so don't expect to mix them in the same fixture or even the same room.

Sylvania 8.5W 2700k non-dimmable (Canadian Tire)
If you want an affordable 2700k bulb that looks good and isn't dimmable, go for this one.  $5 is on the expensive side for a non-dimmable bulb, but the light produced by this looks closer to the light produced by a tungsten bulb than Philips's 8.5W non-dimmable bulb.  This bulb's 11,000 hour lifespan prevents it from being Energy Star rated.

Philips 9.5W SceneSwitch (Home Depot)
This is a great new innovative bulb from Philips.  You can't use it with a dimmer, but you don't need it.  Switch between 100%, 40%, and 10% just by turning the light on and off.  Or, choose their model that changes colour temperatures and switch between 2200K, 2700K, and 5000K.  If you want to switch between colour temperatures or don't have a neutral at your switch to install a trailing edge (ELV) dimmer, this is a great option.  It is not Energy Star rated, unsure why though.

Feit 9.5W 2700K Enhance High CRI (Canadian Tire)
We find it difficult to visually tell the difference between 80 and 92 CRI, but our test equipment could.  It is suitable for use in fully enclosed fixtures. This excellent bulb was disappointing only in its greater-than-average electromagnetic interference.

Philips 8.5W 2700K non-dimmable (Home Depot)
This bulb is only rated for an oddly specific 10,950 hours instead of 25,000+ like much of the rest of the bulbs we tested.  However, this is offset by its lower power consumption and lower purchase price.  The bulb appears slightly more red than tungsten bulbs so doesn't match perfectly, but is still pleasing to look at.  This bulb produces a barely perceptible buzz, but is imperceptible from more than a foot away.  Also has a slight flicker upon turning on, but then is flicker-free.  Its lifespan prevents it from being Energy Star rated.

You may notice this list is smaller than last year's.  Cree LED bulbs are no longer available in Canada, the Noma bulbs we liked are no longer available and have been replaced by bulbs that have received generally poor reviews, and the Sunbeam bulbs are no longer available (but were replaced at Costco by Luminus)

Using a Zoom H1 recorder to record audio with a pro sound board

April 4th, 2017 No comments

This is our procedure for using a Zoom H1 recorder to record audio from a pro sound board.

Connect the recorder to the sound board.  We used a female XLR to male 1/8" TRS cable.  Connect some headphones to the recorder.

Set the recorder to input level 16.  Set a comfortable listening volume level (for us this was 40).  The reason to use input level 16 is that this is the point at which the peak light most closely matches when audio is actually distorted.  Any lower, and the peak light may not flash when audio is distorted.  Any higher, and the peak light may flash erroneously.

Play the loudest audio you expect to use for your project and adjust the output of your board so that the Zoom H1's peak light does not flash and audio is not distorted.

If you have a dynamics processor, you may wish to stop here.  If not, you may wish to use the Zoom H1 as a rudimentary dynamics processor.  Increase the Zoom H1's input level.  (Note that this will make the peak light inaccurate - you cannot rely upon it at any level other than 16.) The Zoom H1 has an internal limiter, but it is only effective if audio did not peak at level 16.  Try an input level of 25 or even 35, and listen to the results.  This should result in some minor compression, i.e., soft parts of your recording being slightly louder, and brief periods of high volume not being overpoweringly loud.  However, this comes with the downside of the peak light no longer being accurate (so you won't know if audio is distorted until you play it back).

How to fix "Windows cannot load the user's profile but has logged you on with the default profile for the system."

February 11th, 2017 No comments

1) Boot to Safe Mode.


Setting up QoS for VoIP on Tomato routers

January 17th, 2017 2 comments

A question we're asked often is, "Why do I need QoS?"  If your VoIP calls already sound every bit as good (or better) than a POTS call, and you never have dropouts or distorted audio, then you don't need QoS.  On the other hand, if you're a heavy or even moderate user of your internet connection, and you aren't lucky enough to have more bandwidth than you can ever use, it is our opinion that QoS is essential.

The best way we know to use Tomato's QoS system is by rate limiting.  That is to say, when we're done, you will have a slight decrease in speed for regular internet traffic.  However, you should be able to make VoIP calls with perfect audio quality.  We admit that these rules are strict, though they are that way for a reason: we want the non-essential traffic to slow down before the link becomes saturated.  In other words, you sacrifice speed for low latency and jitter.  If they cause too great of a speed decrease for you, you may wish to start with these, verify you have good audio quality, and then relax the rules as appropriate for your specific situation.


How to cook salmon perfectly and quickly

January 11th, 2017 No comments

Roast salmon tastes good, but takes a long time, and it takes even more time to clean your roasting pan afterwards.  Poached salmon doesn't take much time, but has a soggy consistency.

Solution: poach the salmon, then broil it.  Mango writes:

I poach several pieces of frozen wild-caught salmon for 8-10 minutes, covered, in an inch of simmering water.  Then I place them in a lightly-oiled baking pan, season them, and broil for five minutes, checking often to be sure they don't burn.  The result is divine: the taste and texture of a perfectly-roasted piece of fish in 15 minutes, and neither pan scorched, so washing them was no trouble at all.

Operation costs of Instant Pot vs Gas Stove

December 19th, 2016 No comments

Recently, Mango used an Instant Pot for the first time and immediately became enamoured with it.  Pressure cooking is pretty convenient for a few reasons.  Sometimes it's faster than stovetop cooking, you never have to worry about your pot boiling over, and if you follow the directions, you don't have to worry about scorching.

Having an analytical mind, Mango was curious what cost more to operate: the electric Instant Pot, or a natural gas stove.

Mango measured the natural gas and electricity consumption used to cook equivalent amounts of rice and multiplied it by the cost of the utility.  The results: $0.0042 for the Instant Pot and $0.0126 for the gas stove.  So if gas is cheaper than electric, why is the electric Instant Pot cheaper?  Our guess is because it's more efficient and does not allow heat to escape as a stovetop pot does.  We had to boil our rice on the stove for four minutes to get the same result as an Instant Pot in manual mode for one minute (NPR for 20 minutes following).

Remember this is based on one person's utility bill, and one recipe, but even still, it illustrates that the Instant Pot is a very cost-effective tool.

How to withdraw CAD or USD from your Skrill account

December 14th, 2016 No comments

A company owed Mango a non-trivial sum of money.  After much effort, he finally convinced them to pay him...but they insisted on using Skrill.

For the non-Europeans, Skrill is a payment service much like PayPal, but popular in Europe.  Unfortunately, it's not popular in Canada or the USA, and Mango does not regularly do shopping in Europe.  So he needed to transfer the funds from Skrill to a Canadian bank account.  While possible, Skrill only does wire transfers to Canada, and, only in Euros.  This means that Mango would have to pay two currency conversion fees and two wire fees (sending and receiving).  All together this totalled about 9% of the balance.

Instead, Mango used his Skrill account to buy Bitcoin from a British dealer called Cubits.  He then transferred the Bitcoin to a Canadian dealer called QuadrigaCX.  He sold the Bitcoin for US dollars (QuadrigaCX also sells Canadian dollars but he needed US dollars for this project) and transferred them to his US dollar account at a Canadian bank.

The cost?  If Mango had sold the Bitcoin immediately upon transferring it to the Canadian dealer, 5%.  More than it should be in 2016, but less than the cost of a wire.  Since Mango is frugal, and Bitcoin was going up at the time, he waited a while before selling his Bitcoin, making the cost of the transfer zero.

This is not a recommendation nor endorsement for either of these Bitcoin dealers, just a report of success from one customer.

Now let's look at what it could have cost if the company had simply purchased Bitcoin, leaving Skrill out.  The least expensive way to fund a Cubits purchase costs 0.8%.  QuadrigaCX charges a 0.5% commission on the sale.  For approximately 1.3%, you can send funds from Europe to North America quickly, easily (once you know how), and securely.  If, unlike Mango, you don't have to pay for currency conversion, a wire transfer becomes cheaper around the $2000 mark.  One day, when everyone carries a Bitcoin balance and converting from local currency to Bitcoin is a thing of the past, funds transfers will be nearly free.

We're deliberately leaving details out of this post, because this is not something that should be attempted by someone who doesn't know what they are doing.  For example, you should know how Bitcoin works, what a wallet is, and how to secure it.  If you don't, the concepts are not hard to learn with a little research.  If you do, it's worth it to consider Bitcoin as a method of transferring funds internationally.

WooCommerce event ticket sales report

December 14th, 2016 No comments

For several years we've been using WooCommerce for general admission event tickets.  For this we've been using an open source ticketing system.  It works, sort of.  The number of bugs we have to find and fix increases at every show.  The most critical one we found this year was a bug that displays show times incorrectly.  This is problematic for obvious reasons.  When we reported this to the company's developers, their suggestion was to stop selling tickets until after Daylight Saving's Time.  This plus many other annoyances led us to decide to reinvent the wheel.

We dispensed with the plugin, and decided to use only the built-in features of WooCommerce with a custom report that displays the order for each product (show).  This custom report proved to be somewhat of a challenge - WooCommerce's documentation is ridiculous at times - but we're more confident in our code than the barely-working plugin we were using before.