I’ve been fascinated for the last few months by Disney’s Frozen – more specifically, by the music of it. Yes, having children I know many of the words (though not as well as my three-year-old, who corrects me from time to time. At some point I’d like to look at it more in-depth, but in the interest of shipping, I’ll share my thoughts here.

There’s a pretty good selection for most people – “Frozen Heart” for a men’s chorus; the duets between Anna & Elsa, and Anna & Hans; ‘fun’ solos from Kristoff, Olaf; a ‘fun’ chorus for the Trolls, and, of course, Elsa’s blockbuster “Let It Go.” That last one, in particular, I really like, though I have mixed feelings about the lyrics – while “A kingdom of isolation,” is brilliant in its garden-path syllables (“kingdom of ice…”), I wish “Let it go, let it go, Turn my back and slam the door” at least attempted a slant-rhyme (“slam the do-oar” etc.)

But my overall favorite moment, and the one that sparked this post, is the final, climactic scene.  Anna and Elsa are wandering through the mist and blizzard, while Kristoff rushes to rescue Anna. The music is in the background, but it so perfectly matches the action and emotion of the scene that I find myself rewinding just to rewatch it. While Anna wanders, the music is slow, plodding, and mournful – she’s dying and she knows it. It pans over to Kristoff, and immediately picks up in time and mood with the galloping of his steed’s hooves. It’s a great scene, and a rare moment of true musical, sound, and visual harmony that I don’t see much in film anymore.

<– Part 29 – February 14, 1915  | Part 30 – February 21, 1915 |  Part 31 – February 28, 1915 –>

British ships began a bombardment of Turkish forts in the Dardanelles February 19, testing out defenses and attempting to “force” the straits and reach the Black Sea. Across Europe, the German sub U-28 sunk the neutral tanker Belridge, carrying out the German Empire’s policy of unrestricted submarine warfare.

At the Masurian Lakes, the Russian 20th Corps, left behind to cover the Russian withdrawal, was surrounded February 18 and surrendered February 21, having allowed the remainder of the Russian army to reach defensive positions following their second defeat there.

At Champagne, the French Army continues suicidal counter-attacks.

I’ve mentioned it before, but I just wanted to reiterate: I’ve been much more productive with the pomodoro technique the last few weeks. I use kanbanflow.com to manage it – the combination Kanban board and pomodoro timer works great for me. In the past, by todo list has been pretty random, ad-hoc, and subject to constant changes.

Saturday, I set up my board – my todo tasks for the following week. This will range from “Exercise like this” to “Read this” to “Update that.” Each morning, I make sure my hard-copy planner matches up with what’s on the board, and also do a review of the previous day to see how I did. I DO NOT add anything to the new day’s list that morning – any additions were done on previous days. This means that my list is feature-locked each morning. I feel like this is a little bit of Scrum – Sunday I review my previous week, check to see what I need to do this week, have daily standups to see how I’m going, and check my progress at the same time.

The pomodoro advantage increases productivity first by keeping me focused (“I can focus on this huge task for just 25 minutes”), removing guilt over relaxing (“I’ll check that email in 7 more minutes” [yes, I feel guilty for taking breaks]), and also letting me keep track of my time (“Ugh, I spent 45 minutes reading email? That’s awful!”). I’m still crunching numbers on my productivity last year and so far this year, but when I get to a good point (perhaps end of this quarter) I’ll take a close look at how it’s been.

<– Part 28 – February 7, 1915  | Part 29 – February 14, 1915 |  Part 30 – February 21, 1915 –>

On February 11, Louis Botha took direct command of South Africa’s northern force in its attack against German South-West Africa.

The second battle at the Masurian Lakes continues to rage, with the Russians caught completely off-guard, allowing the Germans to 75 miles in the last week, despite snow drifts 6 feet high. In fact, due to the rapid advance, disordered Russian retreat, and large numbers of Russians taken prisoner, the Germans are able to live off of the abandoned Russian supplies, carrying only ammunition for the guns.

<– Part 27 – January 31, 1915  | Part 28 – February 7, 1915 |  Part 29 – February 14, 1915 –>

Controversy erupted February 1 when the German submarine U-20 fired a torpedo at the hospital ship Asturias, which was clearly marked as such, in violation of international law. Three days later, the German government issued a warning declaring all waters around England and Ireland, including the English Channel, a war zone, and reminding all vessels of the inherent dangers of travel in such a war zone. Additionally, with the use of false flags of neutrality being used by the British, the Germans warned all neutral nations that their ships are at risk when approaching England and may be viewed as an enemy vessel.

On February 3, with the Ottoman attempt to take the Suez canal faltering, they withdraw to prior positions. The 15-20,000 Ottoman force was opposed by nearly 30,000 British defenders; despite several Ottoman brigades successfully crossing the canal, the rest were unable to make any other headway.

In Nyasaland, the British colony in Africa, the Chilembwe rebels have been attacked, Chilembwe himself found dead, by the militia. 300 rebels have been captured, and 40 executed. An additional 30 are thought to have escaped into the neighboring Portuguese colony. The British colonial government, worried about further rebellions, have ordered various punitive measures including mass hut burnings, gun confiscations, and a levy on every African within the troubled areas.

In Persia, Russian General Nazarbekov has launched a counteroffensive against the Ottomans, who successfully are holding Linwe against him.

February 4 saw the Battle of Kakamas, in South Africa. A prominent crossing point on the Orange River, the area is needed by both the Germans and the South Africans to invade the others’ territory. Approximately 1,500 invading Germans were repelled by 6,000 South Africans. The Germans lost 7 dead, 16 wounded, and 16 captured.

The Second Battle of Masurian Lakes began February 7 when the Central Powers launched assaults into northern Poland from East Prussia, surprising the poorly-entrenched and unprepared Russian forces. 100,000 German soldiers, representing nearly 1/3 of the German army, are facing the 220,000 Russians.

Operations on the Western Front in Belgium and Flanders have wound down inconclusively. At Champagne, the back & forth fighting continues.

<– Part 26 – January 24, 1915  | Part 27 – January 31, 1915 |  Part 28 – February 7, 1915 –>

The Allies on the Western Front received early notice of a German attack on Cuinchy from a German deserter January 25. With this notice, several German attacks were repulsed, including one ruse in which German troops claimed (in English) to be engineers. Surprising, such a thing is a legitimate tactic, as defenders are expected to challenge anyone coming from the front, and are only to allow one man to advance.

The fighting in Champagne seems to be winding down, with lands taken from the French Third Army remaining in German hands despite French counter-attacks, including 6 waves that collectively lost 2,400 men. To date, 94,000 French and 46,000 German soldiers are casualties of war.

The three advances from Palestine to the Suez Canal

The Chilembwe Uprising was crushed January 26 after a brief skirmish, and the rebels are fleeing towards the nearby Portuguese colony.

The Ottoman Empire launched an offensive against British defenders of the Suez Canal January 28, with 20,000 attacks advancing in 3 echelons (all advances on the canal). They are opposed by 30,000 defenders, are the attack is imminent.

The German submarine U-20 torpedoed three steamers January 30, without issuing any type of warning. Such an attack has been condemned by many neutral nations.

The German Ninth Army, on the Eastern Front, launched poison gas – xylyl bromide – against the Russian Second Army on January 31, but the wind blew it back on them, and the freezing temperatures rendered it nearly ineffective. The Russians launched a counter-attack but were devastated by artillery fire. 20,000 German and 40,000 Russians fell in one day.

<– Part 25 – January 17, 1915  | Part 26 – January 24, 1915 |  Part 27 – January 31, 1915 –>

German battlecruisers Derfflinger, Moltke, and Seydlitz sailing to Dogger Bank

Opposing forces continue skirmishing at Cuinchy, on the Western front. At Champagne, minor, small German attacks continue, but most focus has shifted to the Eastern front. At Sarikamish, the retreating Turks are confirmed to have suffered 90% casualties, and Enver Pasha has resigned in disgrace.

German armored cruiser Blucher sinking

On January 18, after nearly one month of fighting, Ardahan has fallen to the Russians, as the last Ottoman units are evacuating.

In German East Africa, fighting January 18-19 at Jassin saw the 300 British invaders defending against a German force over five times their size, although British forces swelled with an additional 800 reinforcements. However, after 300 casualties, the British forces surrendered, and their leaders were allowed to return home after promising not to fight anymore. Yet the ammunition and officer losses for the Germans dissuade any further fighting in the field.

Map of the North Sea. Dogger Bank is towards the middle

Later that day, the first zeppelin raid on Great Britain commenced. On the Western front, fighting has erupted at Hartmannswillerkopf, a peak in Alsace. The French Seventh Army faces the German Army Detachment B, both with 15,000 men.

The night of January 23/24 saw 4000 Russian forces attack near Rafajlowa, attempting to cut off a pass through the Eastern Carpathians. The surprise assault took 2 trench lines before the Polish Legions attacked from three directions with bayonets, repulsing the Russians and retaking the trenches.

Last picture of John Chilembwe (left), taken in 1914

In the North Sea, at Dogger Bank, the British Grand Fleet was able to decode German naval transmissions and intercept the German High Seas Fleet on January 24. After a day of fighting, the Germans suffered on Armored Cruiser sunk, one battlecruiser damaged, while the British only suffered serious damage to one battlecruiser. Additionally, the British suffered only 45 casualties to the German’s 1,200. The Germans were outgunned, slower, and unable to escape, but managed to due to a lack of British communication, as well as the general appearance of the battle “getting away” from the British commander, stopping the battle from becoming a rout.

Nyasaland, marked in dark red

On January 23, in British Nyasaland (modern Malawi), years of grievances against forced labor, discrimination, and lack of representation & control of ancestral lands erupted in an uprising led by Christian millenialist preacher John Chilembwe, whose name has been lent to the uprising. An attack on the headquarters of a large business landowner killed 3 colonists, while an attempt to take weapons from a large cache failed during the night. This morning the militia has been raised and assembled, and the uprising seems doomed.

I had originally intended to spend this post discussing Ceedling, and Unity testing, but now I won’t. Why? Over the weekend, I was reading the API guide for Arduino libraries, and realized they’re heavily focused on object-oriented programming. Synthduino was written in a functional style (it’s C) – while I’d used a basic struct to hold together a note’s frequency and duration, all the calls where global functions that accepted either a note or one of its members as a parameter. This was contrary to the API.

 

I did research, trying to find a good unit testing suite for C++. Turns out I’d somehow missed what should have been a top result: Google Test (aka gTest). I had gotten distracted by the Wikipedia list of suites, and gone through there. If only…
Anyway, I’ve spent the last 2-3 days rewriting Synthduino in C++, with classes, and rewriting the test suites. Fortunately, the logic and test data is the same, so I’ve got that going for me. Once I’ve spent more time with Google Test, I’ll try to do a better comparison between it and Ceedling/Unity.

<– Part 24 – January 10, 1915  | Part 25 – January 17, 1915 |  Part 26 – January 24, 1915 –>

Tabriz was captured January 11 by the “Mosul Group” of the Ottoman army.

Russian soldiers gathering the frozen corpses of Turkish soldiers at Sarikamish

In Europe, fighting at Artois ended January 13, as the French assault was halted due to its lack of success.

Japan issued a series of demands to China January 15, which would grant Japan a much larger control of the Asian mainland. China is not expected to comply.

In the Caucasus, the battle of Sarikamish ended January 17. The Turkish General staff reached Erzurum, with orders to the defeated Third Army to follow later. Transports launched from Constantinople with supplies were sunk by the Russian Black Sea Squadron. The end of the three week battle was a complete defeat for the Ottoman Empire, who was unable to halt the Russian advance, and seems impossible to now, with all reserves in the region depleted. Of the 118,000 Ottoman soldiers who marched three weeks ago, only 42,000 remain

A 13-year-old Armenian boy, who fought for the Ottoman Empire at Sarikamish. Despite the genocide perpetrated against the Armenian population, many of them still fought for the Turks

combat-ready. Of the nearly 80,000 casualties, nearly half were killed, an additional one quarter were killed by sickness, 7,000 are prisoners, and 10,000 wounded. Russia suffered 16,000 killed and 12,000 sick, mostly from frostbite. The Turkish commander, Enver Pasha, has been removed from command.

At Ardahan, reports indicate that the Russians have crushed the Turkish defenders, and a full retreat seems to have begun. In the Champagne region of the Western front, minor German probing attacks have begun. Elsewhere on the front, the village of Cuinchy continues to change hands every few days.

Wherein our hero fights the dragons of cross-platform compatibility, libraries not being updated, inadequate documentation, and the fact that Arduino can’t do unit testing natively.

 

Why?

I’m currently working on the new release of my project Synthduino, and I’ve fallen in love with Unit Testing from various Ruby and Ruby on Rails projects I worked on last year. I decided it would be good to bring unit testing to Synthduino, not only to give me a clearer roadmap of development (unit tests help focus effort), but also make sure my work is good quality (as I do want Synthduino to be used).

What?

I briefly considered writing my own framework, but I’m not really comfortable enough in C/C++ to do it, so I looked into frameworks. Based on what I read, I narrowed it down to two options: CppUnit and Ceedling. From what I gathered, CppUnit was the more established of the two, but Ceedling was built on Ruby to use rake. I decided to try them both out.

Where?

My development platform spans 5 computers and 4 operating systems (Ubuntu, Lubuntu, Linux Mint, and Windows 7), with a git server running here. I needed something that would work moderately well on that.

How?

I started out with CppUnit. The biggest issue I ran into was the complete lack of documentation (seriously – is there any? It’s advertised as a “C++ port of JUnit” – am I supposed to use the JUnit documentation?). I looked around online and found a lot of tutorials that all used completely different ways of doing the same things. On top of that, none of them actually worked on any of my machines – every attempt to do anything, no matter how minor, was a long string of compiler errors or stack overflows.

I looked to Ceedling. Off that bat, I did like it more – it came with example projects, and included documentation (though it was hard to find). I liked the ability to use rake, which I’m familiar with, including the ability to set up stubs for everything with an easy rake command. My biggest complaint would still be that the documentation is a little sparse (and online it’s nonexistent). BUT it’s certainly sufficient, so I can’t complain too much. I’m able to get things done, make my tests pass, and so on.

The only bug I ran into was in functions that used printf – I spend about 4 hours tracing stack calls, overflows, missing symbols, and so on until I tracked it down – an error that had been fixed in Unity in August but not found its way into Ceedling until December (after I had downloaded it). Otherwise it’s been great.

 

Next time I’ll actually look at some of the testing.