Parenthood joys and poop

Today, I did some tummy exercises on the floor and my sweetheart was playing with his blocks. While fully in my element, my little one decided to come closer and closer and suddenly I find my face buried in his bum. That by itself wouldn’t be such a big thing, but as it turned out, Wallace pooped shortly before and so I got to fully enjoy that delicate aroma. I guess he didn’t wanna be selfish. He must have figured that I was not feeling well, since after all, I was doing weird movements and my breathing didn’t sound too relaxed either, and therefore shared it with me. I guess poop is just one of many parenthood joys. If you smell it, you feel like running but you can’t, since the baby won’t change itself. If you don’t smell it for a few days, you start worrying. Either way, as parent of a little one, you’re doomed to the joys of poop!

parenthood_joys_and_poop

That made me think of a discussion my husband I had just recently. Let’s face it, when you are a parent of a baby, you frequently smell its bum. You don’t want to, but you still do it. After all, you wanna make sure before changing the diaper again. If you think a bit about it, as soon as you become a mom/dad you turn into a dog (at least when it comes to sniffing butts).

Our little one can also be quite sneaky when he wants to. Sometimes, we can already smell it from a far distance and therefore hold our breathes as long as possible, pick him up, rush to the change room, undress him, and find … an empty diaper. Grrr. He farted again! But how can we be mad, since he smiles like crazy at us. As if to say, ‘Ha, ha, fooled you two again!’.

Morse code typing test Version 2

Here comes my second version for the morse code typing test. This version fixes a few things, but also unfortunately introduces new bigger issues.

OK, first to the fixes and extensions. The character test can now be narrowed down to only a few letters/digits. When I started using the test functionality, I found it overwhelming having to know so many morse codes at once. Limiting the requested letters/digits makes it a whole lot easier for beginners. Furthermore, you can now hide the cheat sheet (which again is more useful for beginners since advanced users will be too fast for even glancing at it anyhow). With version 1, after 60 seconds where over, the input field was not cleared. This has now been fixed.

Additionally, I started a new word test feature which requests full words and not just characters. Unfortunately, this test is faulty, since it does not consider the break between letters (three dits). I’m planning to fix this bug with the next version, since I’m afraid it’s easy to incorrectly learn morse code if this test doesn’t specifically require those breaks. Nevertheless, I put it in here already. You can ignore it and wait for the next version.

Typing test:

Test characters

Test for digits
Test for the characters to

Seconds left:

Correct/Wrong answers:

Show Morse

• – (a)    – • • • (b)    – • – • (c)    – • • (d)    • (e)
• • – • (f)    – – • (g)    • • • • (h)    • • (i)   • – – – (j)
– • – (k)    • – • • (l)    – – (m)    – • (n)    – – – (o)
• – – • (p)    – – • – (q)    • – • (r)    • • • (s)    – (t)    • • – (u)
• • • – (v)    • – – (w)    – • • – (x)    – • – – (y)    – – • • (z)
– – – – – (0)    • – – – – (1)    • • – – – (2)    • • • – – (3)
• • • • – (4)    • • • • • (5)    – • • • • (6)
– – • • • (7)    – – – • • (8)    – – – – • (9)

Test words

Seconds left:

Correct/Wrong answers:

Being more active

Just a few years ago, I was a whole lot more active than now. I used to ride my bike 16 km to and back work for about 2 years no matter how the weather was (though I did regret being on the bicycle a few times, especially when it was -25 degrees or so and my tube needed replacing – so much fun!). When I switched work, I only had a few kilometers to commute anymore, so I started walking to and back instead. After my work moved to a more distant location, I started using the car, since I was pregnant with my little one at that time, and I just didn’t want to risk falling with my bike (and no matter what, falls do happen). Unfortunately, since I can’t say I did much sport since then (apart of running after my little one, carrying him around while doing other tasks, etc., which by itself can be quite physically challenging).

I like being active and I want to be a role model for my little sweetheart, therefore it’s time I started being more active again. Going jogging or cycling is currently no option though (it’s too cold outside for W and he also dislikes being in the stroller).

My long time goal is to do an iron man one day. Therefore, apart from cycling and running, swimming exercise is obviously important. I was thinking of starting to go to a public swimming pool at least once a week with my little one. But first, I wouldn’t really get to swim at all, since who’d look after W in the meantime and furthermore, I just don’t have the money to spend for two memberships right now (and even babies need a membership over here).

After contemplating a while what I could do, I started thinking what else I used to do when I was younger. Juggling balls came into mind. Doesn’t sound like a very strenuous exercise? Yeah, it doesn’t, but after juggling 3 or more balls for over half an hour or so, your arms definitely start getting majorly heavy. I do happen to still own some juggling balls and my little one thinks it’s hilarious when I play with them, so I’m definitely starting this activity again. Of course, lots of times it will end up to be just throwing balls with my sweetheart (or at my hubby 😉 ), but that’s just fine.

Then I thought that I used to do stretches a lot while in junior high. I haven’t done stretches for a while (yes, I know, I should have done them while I was riding my bike a lot) and I can definitely do them while W is awake. All I risk is him laughing at me, but we laught at each other all the time anyhow. So that’s my second little activity I’m going to start doing frequently.

I’m also starting a few tummy exercises again which I can easily do next to W. My tummy muscles have always been extremely week, so I’m not expecting to change that fact anytime soon, but doing a bit a few times a week is definitely better and healthier than not at all.

Star Wars Special Edition Notebook

Against my original plan to post every Saturday about my OpenGL progress, I’m going to write about my new laptop. Let’s face it, getting a new toy – the special edition Star Wars laptop from HP – and setting it up is more exciting at the moment. Apart from that, finally having my own laptop again will make it a whole lot easier and more convenient for me to write my OpenGL programs. I don’t like doing private stuff on my work laptop and since I have Windows 10 on my PC downstairs, I’m frequently having problems working on it remotely.

Star Wars Special Edition Notebook

I originally got a different laptop for Christmas, but as lucky as I am, that one had a buggered up trackpad. After having troubles with the store we bought it from, I told them to keep the damaged notebook and to give us the money back. Then, a couple days ago, I saw this laptop and fell in love with it. Surprisingly, it wasn’t the specs that got me passionate. Let’s face it, the special edition version (particularly the lower end one here in Canada) is not the best and you can find better laptops for the same price. But, you won’t find a similar cool looking laptop 😉 . Me wanting this laptop surprised the heck out of my husband. I’m always just concerned about the quality and specifications and don’t normally ever care about the looks. And on top of that, I’m always claiming to be more of a Treki than a Star Wars fan. Whatever.

So what are the pros and the cons for this laptop? As mentioned, you don’t get the best processor, nor the best hard-drive, nor a dedicated graphics card, nor the most RAM with it (again, I’m talking about the lower end version we can get here in Canada). Nevertheless, I’m not a gamer (don’t play enough to call myself one), so I don’t particularly care about the graphics card as long as the included graphics chipset supports OpenGL 4.4. The laptop doesn’t have a touch screen which generally isn’t really an issue (how many people truly use the touchscreen on a laptop?). The only times when a touchscreen comes handy is when I develop applications I want to run on a tablet/phone as well. Testing touchscreen friendliness directly on your development station is definitely a plus. But it is as it is.

I love the general look of the laptop. The red keys are awesome (especially when lit). I just wish they offered a version that had the Aurebesh characters on the keys. OK, I’m realistic, HP wouldn’t sell a whole lot of those laptops, but Star Wars geeks would go even crazier for such a version. Nevertheless, why didn’t HP at least print the Aurebesh character in small letters next to it? I personally think that’s a big miss.

I was positively surprised about the amount of crapware installed (but I guess, having Lenovo as my work laptop which is known to be the worst when it comes to preinstalled crapware, I can’t quite judge). It comes with a few nice ‘Star Wars specific’ features such as wallpapers, sounds, recycling bin icon, etc. Since it’s easy enough to get rid of all the other stuff HP includes, I don’t mind. Of course, I do prefer signature editions (saves time and therefore money), but since I had such a bad experience with the Windows Store, I now accept having to deal with cleaning up after buying.

I personally like the keyboard layout, I just found it annoying that it doesn’t contain a right control key. I’m using that one a lot in emacs and can’t imagine not using it anymore. Fortunately, SharpKeys came to the rescue and I now use the key next to the right Alt key as Ctrl (where it should be anyhow). Not sure what HP was thinking by replacing the Control key with in my opinion useless key. But at the same time, if you don’t use Emacs, you might hardly use the right Control key anyhow and therefore not mind.

Overall, I just really like the notebook for its looks (very shallow, I admit). In general, if you want a cool looking laptop like for example Alienware, you have to spend quite some bucks. HP’s Star Wars edition is comparatively inexpensive but of course also doesn’t even get close to the specs of e.g. Alienware laptops. Since I haven’t gotten around doing too too much with my new toy, I can’t really write about its performance.

Aurebesh typing test for emacs

A few weeks ago, I posted the Aurebesh typing test. Since I’ve recently started learning elisp, I figured that I should implement the typing test as a feature for emacs.

The code below is terrible with bugs and problems, but heck, it’s my first elisp program after all. My goal is to improve the version over time and to add features such as logging results in a separate file and displaying a progress statistic. To use it, you’ll need to first install the Aurebesh font.

(setq correct 0)
(setq wrong 0)
(setq seconds-left 60)
(setq test-start t)

(require 'widget)

(defun aurebesh-typing-test ()
  "Aurebesh typing test"
  (interactive)
  (get-buffer-create "*Aurebesh typing test*")
  (custom/reset-aurebesh-typing-test-vars)
  (custom/aurebesh-typing-test))

(defun custom/reset-aurebesh-typing-test-vars()
  (setq test-start t)
  (setq correct 0)
  (setq wrong 0)
  (setq seconds-left 60))

(defun custom/aurebesh-typing-test()
  (with-current-buffer "*Aurebesh typing test*"
    (custom/setup-buffer)
    (custom/refresh-seconds)
    (custom/create-line-with-widget)
    (insert "Correct / wrong answers: " (number-to-string correct) " / " (number-to-string wrong) " \n")
    (custom/setup-widget)
    (custom/set-aurebesh)))

(defun custom/setup-buffer()
  (kill-all-local-variables)
  (let ((inhibit-read-only t))
    (erase-buffer))
  (remove-overlays))

(defun custom/refresh-seconds()
  (with-no-warnings
    (goto-line 1)
    (custom/delete-line)
    (insert "Seconds: " (number-to-string seconds-left) "\n")))

(defun custom/delete-line()
  (let ((beg (point)))
    (forward-line 1)
    (delete-region beg (point))))

(defun custom/create-line-with-widget()
  (if (> seconds-left 0)
      (setq randomChar (custom/get-random-char))
    (setq randomChar ""))
  (widget-insert randomChar)
  (widget-insert "\t")
  (widget-create 'editable-field
		 :size 15
		 :correct (string randomChar)
		 :notify 'custom/check-input-value)
  (widget-insert "\n"))

(defun custom/setup-widget()
  (use-local-map widget-keymap)
  (widget-setup)
  (widget-forward 1))

(defun custom/set-aurebesh()
  "Sets the aurebesh font in current buffer"
  (interactive)
  (setq buffer-face-mode-face '(:family "Aurebesh"))
  (buffer-face-mode))

(defun custom/check-input-value(widget &rest ignore)
  "Compare aurebesh input character with requested one."
  (cond
   ((string-match 
     (widget-get widget :correct)
     (widget-value widget))
    (custom/correct-input widget))
   ((not(= (length (widget-value widget)) 0))
    (custom/wrong-input))))

(defun custom/correct-input(widget)
  (if test-start
      (progn
	(custom/start-timer)
	(setq test-start nil)))
  (if (> seconds-left 0)
      (progn
	(setq correct (+ correct 1))
	(custom/next-character widget))))

(defun custom/start-timer()
  "Start Aurebesh test"
  (setq seconds-left 60)
  (setq timer (run-with-timer 0 1 'custom/decrement-seconds)))

(defun custom/decrement-seconds()
  (with-current-buffer "*Aurebesh typing test*"
    (if (> seconds-left 0)
;	(progn
	  (setq seconds-left (- seconds-left 1))
;	  (custom/refresh-seconds)
;	  (widget-forward 1))
      (custom/stop-aurebesh-typing-test))))

(defun custom/stop-aurebesh-typing-test()
  (with-current-buffer "*Aurebesh typing test*"
  (custom/refresh-seconds)
  (cancel-timer timer)
  (custom/set-arial)))

(defun custom/set-arial()
   "Sets the arial font in current buffer"
   (interactive)
   (setq buffer-face-mode-face '(:family "Arial"))
   (buffer-face-mode))

(defun custom/next-character(widget)
  (with-current-buffer "*Aurebesh typing test*"
    (custom/fill-random-character widget)
    (custom/fill-correct-wrong-answers)
    (custom/refresh-seconds)
    (widget-forward 1)
    ))

(defun custom/fill-random-character(widget)
  (with-no-warnings
    (goto-line 2))
  (delete-char 1)
  (if (> seconds-left 0)
      (setq randomChar (custom/get-random-char))
    (setq randomChar ""))
  (widget-insert randomChar)
  (widget-put widget :correct (string randomChar))
  (widget-value-set widget ""))

(defun custom/get-random-char ()
  "Insert a random alphanumeric character.."
  (let ((mycharset "abcdefghijklmnopqrstyvwxyz"))
    (elt mycharset (random (length mycharset)))))

(defun custom/fill-correct-wrong-answers()
  (with-no-warnings
    (goto-line 3))
  (kill-line)
  (insert "Correct / wrong answers: " (number-to-string correct) " / " (number-to-string wrong) " \n"))
  
(defun custom/wrong-input()
  (message "%s" (widget-get widget :correct))
  (widget-value-set widget "")
  (setq wrong (+ wrong 1)))