Pages

Friday, February 16, 2024

My Tamagoyaki Recipe


Basic Ingredients 

Tamagoyaki Photo1
For a plain, but delicious Japanese omelet:

  • 2 large chicken eggs
  • one teaspoon of dashi
  • one bottle cap of mirin
  • 2 tabs of butter

Basic Hardware

NOTE: A list of exact brands can be found at bottom of page.

  • a frying pan (preferably cast iron, Japanese version of pan is square)
  • a non-metal spatula (the wider the better)
  • a fork
  • a small bowl

Instructions

These should be performed in order, without delay.
  1. Clean your pan surface.  The whole process only works if your pan surface is smooth.
  2. Read all the following instructions before doing anything else.  You have been warned.
  3. Set your pan on a burner at MEDIUM LOW. That's 3 of 10 for most electric stovetops.
  4. While pan comes to temperature (usually takes around 5 minutes to stabilize) combine the eggs, dashi, and mirin in a small bowl.  
  5. Chop the egg mixture against side of bowl with fork to mix.  Thank you, Jacques Pepin.
  6. After pan has achieved temperature, add 1 tab of butter and lift pan off burner.  Roll pan to coat.
  7. If the butter turns brown, your stupid burner is too hot.  Turn it down just a little and think about buying a real stove.
  8. Pour half the egg mixture into the pan and roll the pan to coat consistently. Return to burner.
  9. Watch the egg until there is almost no eggy liquid on top.  It will cook to yellow very quickly.  Do not wait for the entire egg to solidify.  Making tamagoyaki has wiggle room as long as you observe some minor egg liquid.  If the entire thing looks cooked throughout, you have overcooked it.  Try again tomorrow.
  10. Use the wide spatula to release the edges of the omelet, and softly fold in thirds.
  11. Now, scoot the small egg rectangle stack to the back of the pan.
  12. Add the second tab of butter to the open surface, raise pan, and roll to coat.  Professional omelet chefs use a tongue with a buttered paper towel or cloth for this step, but keep egg stack against edge.
  13. Add the second half of the egg mixture to the pan, from one edge to the other side, flowing into the base of the existing tamagoyaki stack.
  14. Watch the egg egg, similar to step 9.  When there is just a little liquid left on the top, fold starting with the existing egg stack in thirds again, snowballing the rectangle into an inch-thick pillow of eggy heaven. 
  15. If your pan has a square edge, park the egg against it for 2 seconds, allowing the liquid that slid out during final fold to encounter the pan and cook prior to serving.
  16. Use your spatula and move final tamagoyaki to plate.  Let it sit for 30 seconds while the omelet's interior solidifies from the heat of all the interior layers.  This is what causes the entire thing to produce: a non-trivial omelet of uniform height, cooked throughout, but without being dry.
  17. Turn off the burner and allow the pan to cool (not on the burner).
  18. Salt and pepper to taste. Give thanks for the blessing you are about to consume. Itadakimasu!
Tamagoyaki Photo2

Fancy Ingredient Options

Always add these after the first phase of egg folding prior to second pour to keep them from destroying the beautiful yellow pillow you worked so hard for.  For easier folding, place them in a line between a boundary of thirds in a very thin layer.
  • Green onions (whites during cooking, and fresh green over the finished product).
  • Shallots (this requires you to get the shallots glassy prior to starting the tamagoyaki).
  • Cheese (cheddar works just fine and produces a nice gooey visual akin to thick hollandaise, but ricotta, and even cottage cheese would be great as a healthier option).
  • Bonito flakes (if you're going there, you may as well go all in).
  • Ham of any kind: thin canadian bacon, country ham, 
  • Hot sauce (for those who don't like heat, Cholula Chili Lime is fantastic on these).
  • Cacique® Crema Mexicana (only 3mg of sodium, adds a richness without making it taste like a giant breakfast burrito).
  • Cilantro (duh)
  • Diced tomatoes.  I create a layer from thinly sliced Campari tomatoes akin to a tart.
  • Nori.  This one is delicious BUT be sure to add it while the egg is still liquid, otherwise the nori will not have enough moisture to fold.  Also, don't use too much.  Enough to cover two thirds of a single egg phase will more than suffice.
  • Sambal Oelek (oh heck yeah, bring on the heat)

Non-obvious Ingredients to be Used in the Future

Tamagoyaki Photo3
These are listed alphabetically to avoid bias (and probably should not be combined, except the plantains and mole... that would probably be fantastic):
  • chilaquilles
  • hashbrowns
  • fried plantains
  • fried rice
  • linquica
  • lox
  • mole
  • sumac
  • tapenade
  • tobiko

Links to Gear


Friday, January 20, 2023

Time to Fire This Back Up

 I snagged a few FlipperZero's from KickStarter, and I've been very surprised to see how much my daughter has engaged hers.  She even updated her firmware following a Youtube video without involving me.  I'm also for empowering her to make executive decisions, and in this case it turned out beautifully.  She applied a fairly scientific method in her reasoning before applying the update.



Thursday, August 27, 2020

Day 9: What a Week

Work Has Been Crazy

To all the teachers out there who have to keep smiling while also having anything else in their life demand their attention, I SALUTE YOU!  We've been having intermittent server woes since Tuesday morning at my j-o-b, but my wife has kindly pointed out we can't do new topics every day, so we've been reviewing things this week that we went over last week: primitives, flow control, basic objects, arrays and collections.

Today We Cover String Manipulation

In her example code, she has been using file names that have reusable folders leading up to their location (to represent sound files in her game).  After a quick lesson in String manipulation, she will be able to simplify all those paths using a variable to cover the destination path.  She is also going to extend her randomized Fight class to choose names of Hero objects from a pool, emulating a gladiator-style tournament.

I'm debating giving her a pop quiz tomorrow.  I love my kid, but I feel like she needs to visually see an indicator of her progress.  The good news is, I have been quizzing her verbally since the day we started and I know it's clicking.  I also installed Eclipse and have started letting her use an IDE to simplify code execution during our lessons.  I still require her to prove she remembers how to compile from the command-line, but being able to modify code and click "run" helps us cover a lot more ground in an hour.

[NEW] Open-Source Library of the Week: JLayer

I have decided to introduce one new library a week for her to get an idea of what is out there, how it is packaged up, and how to search for things you might need.

Name Category License Description
JLayerAudioLGPLmp3 decoder/player/converter
<!--https://mvnrepository.com/artifact/javazoom/jlayer-->
<dependency>
    <groupId>javazoom</groupId>
    <artifactId>jlayer</artifactId>
    <version>1.0.1</version>
</dependency>
JLayer bypasses all the painful parts of Java audio (ridiculous MP3 woes, frame rates, cpu glitches, etc.), allowing you to simply create sound objects and play them. There are no blood sacrifices required, no pro services sound engineers on-hold. It just works the way you expect everything in life to work (but that usually doesn't). It works like it says: simply. 

Be advised: JLayer uses a reciprocal license (LGPL). For clear explanation of what using this type of OSS license requires of you, please go to opensource.org.

Wednesday, August 26, 2020

Day 7/8: Rushed

 I gave her two days to chew on the topics we've covered.

Monday, August 24, 2020

Day 6: Arrays and Collections

Object Evolution

She has recognized and learned how useful instance variables are to her game.  I think part of why she is getting this so quickly is that I introduced her to making her own dice-based games when she was 5.  With games like Pathfinder/D&D, Shadowrun, and Battletech obviously a bit much for someone that age, it was still valuable to get her a few dice and show her how to map out what each of the values mean when rolled (after which we spent hours coming up with insane monsters to randomly run into in our adventures).

Fights usually went something like this:  "roll a d6 when encountering a hostile creature, 1 = creature bored runs away, 2=miss, 3=hit for d4 damage, 4=d10 damage, 5=d20, 6=headshot monster dies."

Within her game's list of components, each:
  • Hero has a name, life, gold, weapon,
  • Weapon has a name, attack, effect,
  • Attack has a name, value, range, 
  • Monster has a name, life, weapon, boss.

She has also realized that she needs to store additional sets of items that may be plural (some obvious, some not-so-obvious):
  • Combo → a list of attacks performed in order that trigger a special attack
  • SpriteList → a set of image tiles that describe movement over time
  • Gang → a group of Monster objects that when killed as a whole drop additional loot
  • LootTable → potential loot drops with chance rates per Monster or Gang


Additional Math Operations

To realize the benefit of sprites and loot, we will also be discussing the modulus operator (%).  The simplest way of performing smooth tiled movement over time is to have a group of sprites for each direction that cycle (independent of CPU speed).  This can be accomplished by utilizing a universe timer, with each object possessing it's own offset (to keep the same object types from visually aligning), and then switching to the next sprite as the universe iterates.  Modulus is used to trigger looping within the fixed sprite list length (using the remainder keeps us from ever stepping beyond the max size).  We will also expand on her understanding of Random, seeds, and how to produce non-trivial random ranges.

Friday, August 21, 2020

Day 5: Basic Objects, Flow Control, and Randomization

Following the Game Theme

She really seemed to enjoy today's lesson.  The running joke is, a good session with dad is 2 hours.  A bad session with dad can't be over soon enough.  Out of 5 lessons, we had two really good sessions, but none of them were what I would classify as bad.  I'm learning what keeps my daughter's attention.  I shouldn't be so surprised to find out she:
  • demands to be the one typing the actual code
  • wants examples to do something, not just output a String
  • and finally, the more obnoxious the better.
Today's lesson consisted of picking up where we left off yesterday, converting the primitives from our main method in our Hero class to instance variables with getters and setters.  She picked up on the notion of the class representing an archetype as opposed to a physical instance MUCH faster than I did (and I was 18 the first time I tried grasping object-oriented programming).

She decided to implement a Hero that could (and would) only attack other instances of the Hero class, and being a hero, would talk smack well in advance of an attack.  After each attack, each instance of the Hero class would then ask the other person to stop (being a Hero and all).  Finally, being heroes, they would refuse to stop fighting once engaged, demanding that each see the fight through to the finish in an honorable fashion (i.e. to the death).

Sound Effects to the Rescue

While attacking (and subsequently being attacked), she decided each Hero would verbalize their might (or their displeasure at being whacked).  At this point, I introduced our first set of external project assets.  I had her open up Audacity and record a handful of threats and a good number of hurt exclamations.  Last year I bought her the most amazing microphone (a Blue Yeti), and it really made today's lesson that much better because of the quality of her recordings.

Using basic if/else-if logic, I had her modify the Hero class to use text threats and complaints by default, with simple overrides for providing sounds when available.  She then added in her sounds and we were off to the races, pitching scenarios and ideas for the apparent game we are going to write now that she realizes this is how games are made.

Randomization FTW

Finally, we created a loop of our two Hero instances hitting each other for the same amount (which proved to be predictably boring).  We quickly moved on to the notion of random max hits with a chance for misses, with a fight ending after at least one of the heroes death (or both if we are really lucky).  She also quickly grasped the need for adjusting the seed for randomization so we didn't see player one repeatedly beat the fire out of player two.  The lesson was a resounding success, and she is overflowing with ideas which I am trying to convince her to write down while she is excited.  Epiphanies are fleeting and should be honored quickly to avoid being forgotten.

Thursday, August 20, 2020

Day 4: Primitives, Variables, and Operators

 Notes from Yesterday

  • The object metaphor already clicks with her.  So proud.
  • Thank you, Notch, for helping sell Java to my kid.
  • Matilda wrote, compiled, and ran her first program today.
  • She keeps asking me all the right questions.


Coding Direction

She seems most interested in games, so we are going to go down that route when exploring object-oriented aspects of the language and polymorphism.  Today, we are sticking with the easy stuff: storing different immediate values in variables and performing PMDAS operations on them.  We'll cap the activity with the introduction of the modulo operation and the magic you can perform with it.


Plan of Attack

While adhering to the curriculum I put together as much as possible, I have left myself some leeway in regard to specific metaphors and elements.  In the case of my daughter, we have already begun having random conversations about in-game items of the same category and those items that might inherit or have overridden characteristics.  Thank you Terraria for spanning all of these and more.  Their wiki with its visually grouped items is especially useful for conveying the usefulness of objects, interfaces, and reused enumerable attributes.
  1. Learn how to store and change attribute values manually and randomly.
  2. Learn how to associate those attributes with a class.
  3. Learn when attribute sets are reusable.
  4. Learn how to combine classes and attributes into more complex objects.
  5. Learn how to dynamically determine type info.
  6. Learn how to use those complex representations to emulate a fight.