Categories
Values

Shortbread family recipe

Yes, you too can make shortbread.

pieces of shortbread in a Pyrex baking pan

This 5-ingredient recipe is considered delicate and time-consuming.

ingredients for shortbread artfully displayed
Ingredients:
1-lb.454 gButter
1-tsp.5 mlPure Vanilla Extract
1¼-Cup285 mlFruit Sugar (no less)
5¾-cups1.35 LCake and Pastry Flour
4-tbsp.60 mlRice Flour

Tools:
  A Large Mixing Bowl
  A Cookie Sheet
  A Large Spoon
  A Spatula
  A Sieve
  2-Cup Measuring Cup
  1-Cup Measuring Cup
  A Teaspoon
  A Tablespoon
  A Fork
  A Knife

Optional:
  A glass of your favorite BEvERage

Let the butter warm to room temperature. If you normally wear a sweater, your room is not warm enough. Don’t even think of using the oven, microwave, or stovetop to warm the butter.

Preheat oven to 275°F (135°C).

Sift 1¼ cups (355 ml) of fruit sugar into 1 pound (454 g) of warm butter.

two-thirds of a cup of fruit sugar
In a mixing bowl, a block of butter and sifted sugar

Use a large spoon to mix to the sugar and butter until the clumps become a well-blended paste. At this stage it is important to know that if you lick your fingers, you must wash and dry your hands immediately before proceeding.

a mixing bowl of crumbled butter
fruit sugar creamed into butter

Add 1 teaspoon (5 ml) of vanilla and blend well with a large spoon. Continue to sift in 4 tablespoons (60 ml) of rice flour.

a teaspoon of real vanilla extract
a box of rice flour, in front a set of four teaspoons artfully displayed

½-cup at a time, sift in the 5¾ cups (1350 ml) of cake and pastry flour. Fold in with a spatula.

A bowl of dough, on the bowl is a sifter with sifted flour on top of the dough
a ball of dough in a bowl with a measuring cup half full of flour and a glass of rye

When your girly man arms are too weak to continue to fold with the spatula, use your fingers to break the clumps into pebbles. Continue to sift in the cake and pastry flour, ½-cup at a time. By the way, that’s pebbles, not sand. If it takes only 5 or 5½ cups (1200 to 1300 ml) to get to pebbles, then stop there.

a photo of a man stirring pastry in a bowl

Gather the pebbles into large clumps (but, I just…) and gently spread out onto cookie sheet using a large spoon. Use a fork to poke holes into the shortbread all the way to the bottom of the cookie sheet. The holes should be no less than ¼“ apart. Reduce oven to 200°F (95°C) and bake for 1 hour. Keep close watch or it will overcook like mine (Mmm, dog biscuits). Cut immediately into rectangles, and let cool.

a shortbread loaf in a baking pan
Categories
Digital Learning Values

Measure with micrometer; mark with chalk; cut with axe

Programme development is often an inverted process.  A lot of thought goes into research and design, while the actual coding is haphazard.  This is why test driven development is so important.

I learned how to code the way I learned how to cook.  I followed a recipe, then I improvised and checked the end result.  I began coding by transcribing programs from Compute! magazine.  This gave me typing skills, concentration, and attention to detail.   Invariably I would make a typo and the code wouldn’t work or would behave differently than written in the article.  After I got the programme working, I would modify the code to see what would happen.  Unfortunately, this lead to bad habits including coding first, then adapting the design to match.

Computer courses in high school and university pretty much reinforced these bad habits by teaching the library of functions first, demonstrating their use, then testing how well they were learned.  With the number of methods and attributes available in the libraries of class object, learning all of them is impractical.  The first and only class that I took in university to invert this behaviour was a software engineering course which focused on the flow of data.  Before any coding was done, before even choosing the language and hardware, the overall highest level black box system had to be designed.  Then step by step, details would be added level by level until it was parsed out into several independent, interrelated objects, each of which could be coded, constructed, attached, or otherwise delegated.  I have been using this approach to programming ever since.

It’s like when video game systems were built in the eighties that had a video screen, a joystick and buttons, and a coin slot.  When the product was ported over to the home console, it didn’t work the same, probably because the whole thing had to be rewritten with the coin slot written out, the integrated joystick written out, the custom electronics written out, the video size and resolution was different.  The design wasn’t thought out to include different architectures.

It wasn’t until recently that I stumbled upon test driven development, shortened to TDD.  This was known when I went to university, but it wasn’t taught.  I am pretty sure that the upperclassmen and professors that taught the courses knew about it, but whether they practiced it did not come out in how they taught the courses.  But it would have helped with their assignments.  A lot of my classmates dropped out of programming because of the length of time they had to spend on debugging their code.  Those who dropped out early, mostly women, were smart to do so because of the bad habits that were reinforced by the teaching methodologies.  Those that took only a few hours a week coding must have known some secret sauce that they learned before university.  I suspect that TDD was that secret sauce.

TDD is a methodology of breaking your code before you write it, then fixing it.  That is, you write a test that supports your design before you write the code that confirms the test in just three or four lines; ten is too many.  Then you spend time modifying the code to make it faster, more general, and more legible.  You could develop your system top down or bottom up, but in the end it takes less time because it takes less debugging.  I could demonstrate by talking about a function that returns the square of a number, entering a test that takes the value of 2 then returns the value 4, and write a function that returns 4 no matter the input, then refactoring, BUT there are a lot of tutorials on the subject so I won’t bother.

So many projects are heavy on the design with not enough spent on the implementation.  Project managers are very easy to please; they are satisfied by the very best.  But programmers that don’t use TDD aren’t doing their very best.  Mistakes creep in initially, then flood in when it’s handed off to another developer.  If designers are measuring the project with a micrometer, we programmers better mark it with our sharpest pencil, rough it out with our sharpest chisels, test it with our best calipers, and sand it down with out best sandpaper with coarse to finer grit.

Categories
Digital Learning

Angular test project continues to deliver

Gary Simon @designcoursecom is another excellent online tutor.  I followed his Angular PWA video and expanded the original Joke page to include 50% Dad jokes and 40% otherwise bad jokes.  Gary Simon’s algorithm brings in jokes one at a time from a Chuck Norris RESTful API.  I sought out more joke APIs and found two that I liked.  One told corny dad-jokes.  Another told really awfully bad jokes, but it comes with a filter.  I selected the API to filter out not-safe-for-work, racist, and sexist jokes.  Then I updated the heading to let me know if the PWA drew from the Chuck Norris Joke stack, the Dad Joke stack, or the Bad Joke stack.

Some of the so-called “Bad Jokes” weren’t all that bad, so I went back into it and just finished changing it up a little.  I remembered that the joke API includes a “category” element that I could leverage.  The categories were Miscellaneous, Programming, Dark, Pun, Spooky, and Christmas.  So, if the category was Programming, Dark, Spooky, or Christmas, I just displayed that followed by “Joke”.  But if the category was Pun, well “Pun Joke” is just redundant.  If the category was Miscellaneous, I just reverted back to “Bad”. 

When I tested that, I got a few spooky jokes in a row, meanwhile the radio was playing Christmas music.  That gave me an idea.  Now until Boxing Day, when the randomizer selects “Bad Jokes”, it will show Christmas jokes.  When October rolls around and if the free host lets me keep it that long, the “Bad Jokes” will be filtered for spooky jokes and dark jokes.

Now, the joke page was built to test how to make a PWA, so I downloaded it to my phone.  It still had the Angular icon, the shield with the capital A. 

a black shield with the capital letter A
a red shield with the capital letter A

I didn’t want to look too far removed from the culture, but I wanted to personalise it.  So, I kept the shield, changed the A to P, and now the app looks like a PWA, but one that I made.

a black shield with the capital letter P
a red shield with the capital letter P

So, let me know what you think.  Remember to like and subscribe.  Just kidding. There’s no subscribe button.

Categories
Values

Privacy Policy

Privacy Policy

Effective date: September 26, 2018

Philip Young Development (“us”, “we”, or “our”) operates the www.philipyoung.ca website (hereinafter referred to as the “Service”).

This page informs you of our policies regarding the collection, use, and disclosure of personal data when you use our Service and the choices you have associated with that data. Our Privacy Policy is managed by the website TermsFeed. The terms generator for Philip Young Development is TermsFeed Privacy Policy Generator.

We use your data to provide and improve the Service. By using the Service, you agree to the collection and use of information in accordance with this policy. Unless otherwise defined in this Privacy Policy, the terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, accessible from http://www.philipyoung.ca

Definitions

  • Service Service is the www.philipyoung.ca website operated by Philip Young Development
  • Personal Data Personal Data means data about a living individual who can be identified from those data (or from those and other information either in our possession or likely to come into our possession).
  • Usage Data Usage Data is data collected automatically either generated by the use of the Service or from the Service infrastructure itself (for example, the duration of a page visit).
  • Cookies Cookies are small files stored on your device (computer or mobile device).

Information Collection and Use

We collect several different types of information for various purposes to provide and improve our Service to you.

Types of Data Collected

Personal Data

While using our Service, we may ask you to provide us with certain personally identifiable information that can be used to contact or identify you (“Personal Data”). Personally identifiable information may include, but is not limited to:

  • Address, State, Province, ZIP/Postal code, City
  • Email address
  • Cookies and Usage Data

Usage Data

We may also collect information how the Service is accessed and used (“Usage Data”). This Usage Data may include information such as your computer’s Internet Protocol address (e.g. IP address), browser type, browser version, the pages of our Service that you visit, the time and date of your visit, the time spent on those pages, unique device identifiers and other diagnostic data.

Tracking & Cookies Data

We use cookies and similar tracking technologies to track the activity on our Service and we hold certain information.

Cookies are files with a small amount of data which may include an anonymous unique identifier. Cookies are sent to your browser from a website and stored on your device. Other tracking technologies are also used such as beacons, tags and scripts to collect and track information and to improve and analyse our Service.

You can instruct your browser to refuse all cookies or to indicate when a cookie is being sent. However, if you do not accept cookies, you may not be able to use some portions of our Service.

Examples of Cookies we use:

  • Session Cookies. We use Session Cookies to operate our Service.
  • Preference Cookies. We use Preference Cookies to remember your preferences and various settings.
  • Security Cookies. We use Security Cookies for security purposes.

Use of Data

Philip Young Development uses the collected data for various purposes:

  • To provide and maintain the Service
  • To notify you about changes to our Service
  • To allow you to participate in interactive features of our Service when you choose to do so
  • To provide customer care and support
  • To provide analysis or valuable information so that we can improve the Service
  • To monitor the usage of the Service
  • To detect, prevent and address technical issues

Transfer Of Data

Your information, including Personal Data, may be transferred to — and maintained on — computers located outside of your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from your jurisdiction.

If you are located outside Canada and choose to provide information to us, please note that we transfer the data, including Personal Data, to Canada and process it there.

Your consent to this Privacy Policy followed by your submission of such information represents your agreement to that transfer.

Philip Young Development will take all steps reasonably necessary to ensure that your data is treated securely and in accordance with this Privacy Policy and no transfer of your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of your data and other personal information.

Disclosure Of Data

Legal Requirements

Philip Young Development may disclose your Personal Data in the good faith belief that such action is necessary to:

  • To comply with a legal obligation
  • To protect and defend the rights or property of Philip Young Development
  • To prevent or investigate possible wrongdoing in connection with the Service
  • To protect the personal safety of users of the Service or the public
  • To protect against legal liability

Security of Data

The security of your data is important to us but remember that no method of transmission over the Internet or method of electronic storage is 100% secure. While we strive to use commercially acceptable means to protect your Personal Data, we cannot guarantee its absolute security.

Service Providers

We may employ third party companies and individuals to facilitate our Service (“Service Providers”), to provide the Service on our behalf, to perform Service-related services or to assist us in analyzing how our Service is used.

These third parties have access to your Personal Data only to perform these tasks on our behalf and are obligated not to disclose or use it for any other purpose.

Links to Other Sites

Our Service may contain links to other sites that are not operated by us. If you click a third party link, you will be directed to that third party’s site. We strongly advise you to review the Privacy Policy of every site you visit.

We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.

Children’s Privacy

Our Service does not address anyone under the age of 18 (“Children”).

We do not knowingly collect personally identifiable information from anyone under the age of 18. If you are a parent or guardian and you are aware that your Child has provided us with Personal Data, please contact us. If we become aware that we have collected Personal Data from children without verification of parental consent, we take steps to remove that information from our servers.

Changes to This Privacy Policy

We may update our Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page.

We will let you know via email and/or a prominent notice on our Service, prior to the change becoming effective and update the “effective date” at the top of this Privacy Policy.

You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.

Contact Us

If you have any questions about this Privacy Policy, please contact us:

  • By visiting this page on our website: http://philipyoung.ca/html4/contact.htm
Categories
Values

Philip Young – Cross Platform Developer

Hi. My name is Philip Young and I am a Cross Platform Developer.
I started programming 34 years ago. My first job was when I was 17. I was hired by the school to program a key tracker database on an Apple IIe. Back in those days, the entire system, including the operating system, program, and data, was kept on a 5¼ floppy disk that could hold less information than a single, cellphone photograph. And you try to tell that to kids these days, and they won’t believe you.
I have been into databases ever since.
I have worked on SCO Foxbase. I moved to dBase III, then Clipper. Access introduced me to SQL style queries. I leveraged that knowledge in Active Server Pages, PHP, and ColdFusion. I recently learned SQLite for Android.
I currently have a few projects on the back-burner, but I’m hungry for a project that pays the bills. I have a WordPress site (not this one) that I monitor for intrusions, an online accounting system to build in PHP, a music app to design and an engineering app to put together in Android, and my own website to update in the flavour of the day. I am looking into moving into C# and ASP.NET for my personal site.

If you want to see my resume, go here.