A Friend Indeed

Posted on Fri, Aug 12 2016 in Bob's Journal

I saw this disheartening headline the other day: "Only Half of Friendships are Mutual, Researchers Find". If you're someone like myself, who feels they don't have many friends, the take away is that other people don't have that many friends either. At least, not as many as they think. In fact, if you break down the numbers, you have fewer "fake friends" than them.

I propose that we introverts hold a party to celebrate! We can all stand against the wall and avoid making eye contact.


Getting a Leg Up

Posted on Tue, Jul 19 2016 in Miranda Rants

There are many advantages to being me, yet the parents have held one virtue hostage: height. It wouldn't be so bad if it weren't for the parents' carelessness. For example, when they accidentally happen place something out of my reach, which they do with frustrating regularity.

In the past I have been reduced to pointing and trying to make them understand their error, but, as you are only too aware, making the parents see sense is a losing battle. Fortunately, I have found a way to take the high ground in this situation. Literally.

By positioning myself atop objects I can make myself arbitrarily tall. The best part is, if a surface is too high to reach directly, a simple application of logic allows me to bring it to my level. For example, suppose that Mommy has careless left the phone on the back of the couch where it's too high for me to reach. The seat of the couch is too high for me to climb onto directly. What am I to do? I simply grab my chair, push it to the couch, climb into the chair, from there onto the couch, and just like that I have the phone, no parents required.

Naturally, this strategy works with any height. Chairs and boxes can easily be moved to new locations, and even carried to higher heights, if a direct path is not available. If you do try this strategy at home, make sure to do it quietly when the parents are not around. I have faced multiple occasions when the parents, for reasons only they know, removed an important part of my path, or even took me to another room.

Once you have reached the object you desire, there are multiple ways to get back down. If the height is not too great, I prefer the head-first method. It is direct and quick. For larger heights, the best option is to whine loudly until a parent comes and places you back on the floor.


Hermaneutics

Posted on Fri, Jul 1 2016 in Essays and Stories

The crowds were noticeably increased the week before Passover. A destitute widow slowly worked her way through the commotion to drop two copper coins into one of the temple's collection boxes. Jesus called out to his followers: "Look at that widow! Most of these people are only giving a small percentage of their money, but she gave one-hundred percent. Everyone should be more like her. Then we could finally add on that new wing, replace the carpet in the sanctuary, and hire a full-time childcare coordinator."


Jesus called out to his followers: "Look at that widow! Giving money to the very people who are plotting to kill us! She and all the rest of those sinners will burn in hell!"


Jesus called out to his followers: "Look at that widow! Another stupid sheeple, blindly following the religious establishment. Wake up! Fight the system!"


Jesus called out to his followers: "Look at that widow! Putting money into the temple when it is already scheduled for destruction. She should be giving that money to my ministry instead."


Jesus didn't say anything to his followers, because drawing attention to the poor is rude.


Jesus called out to his followers: "Look at that widow! Here's a perfect example of injustice. She is going to starve herself to support the lavish lifestyle of self-righteous religious leaders, because they told her it's God's will."


Jesus called out to his followers: "Hey Judas, that woman just gave away all her dinner money. Go give her a few bucks and a tract."


Jesus is too busy talking to his followers about their big outreach project to notice the widow shuffling by.


Hand Holding

Posted on Mon, Jun 20 2016 in Miranda Rants

The challenges of working with parents are greatly compounded by their inability to follow even the simplest directions. When I want them to go one way they invariably go the other. I had almost accepted this as insurmountable until a recent development opened up the possibility of change. I have discovered that if I grab the parents by the fingers I can drag them anywhere in the house. The key is to lean your weight forward and tug. Every time you gain an inch, plant your feet and repeat the process. In no time you'll have pulled the parents to any room, no conversation required.

One important thing to note is that this process can be done in steps. For example, if I want to go to my toys, I can drag a parent over to the toy, release them, grab the toy, and then resume leading the parent to another room. If your parent loses focus and begins to wander away, whine and grab its leg. That works every time.


Going Native

Posted on Tue, May 31 2016 in Miranda Rants

I'm starting to fear all my time with the parents is having an effect on me. I know, how could someone like me ever be influenced by the likes of them? Still I wonder...

Sometimes I swear they can communicate. Mostly they just babble after their normal fashion, but there are moments when one of them will make noises and the other will perform an action, or one parent will point at something and make the same noise over and over. Odder still, they make those same noises later and act as if I should understand. Worse than that, sometimes I almost think I can. It's as if they're trying to talk. Am I sinking to their level?


Property Rights

Posted on Mon, May 2 2016 in Miranda Rants

Hello my adoring public. I haven't said much recently, but there's a good reason. You know that I always try to keep things positive, and the truth is there's been little positive happening with the parents lately. I feel like they're regressing instead of progressing.

I've been quite busy over the past month. Being naturally industrious, I have started collecting treasures around the house. This duty falls to me because the parents are, simply put, terrible at such things. Not only are they very poor observers, but their eyes are so ridiculously far from the floor that they couldn't possibly hope to see anything of value. Realizing their frailty, I have taken it upon myself.

I try to be generous and share some of what I find, but the parents are becoming increasingly vexing. It seems as though every time I find some new treasure, a parent swoops in and steals it. They don't even ask. They just grab it away. If I try to keep it for myself, they actually physically pry it from my hands. And then they act as though somehow I'm the one being bad.

I don't know where I went wrong with them.


Search by State the CiviCRM Way

Posted on Tue, Apr 19 2016 in Bob's Journal

I don't normally write about work, because it's generally both boring and privileged. However, I think this warrants an exception. Enjoy.

The ticket came in as follows:

The following member is in The Netherlands, but is coming up in the Utah state search.

C----- P------
owner, garden designer
Z-------- 94
hoogland, UT 3828GE Netherlands
View Member Profile

A quick glance told me all I needed to know. The text-based abbreviation match was being too greedy. It was my chance to redo the member search the Right Way™.

The website having this problem is built around the CiviCRM platform, which manages all of its members and handles billing. CiviCRM was chosen, mainly, because it is free. However, after being forced to work on it, I think the cost is still too great.

That being said, a search for all members in a state should be simple. CiviCRM provides an API for accessing its data. In addition to that, it provides a developer tool to generate and preview queries against that API. Armed with these, I set to work.

Members are stored as Contacts, so I opened up the API explorer to see what was available. I wanted to make a list of all states and associated countries that had members. Fortunately, each state has a unique numeric ID, so I could use that instead of matching abbreviations like the current search did.

I checked the explorer and was delighted to find that it provided state_province_id, state_province_name, and country for Contacts. This wouldn't be as hard as I had expected. I created a query to search for those fields on all Contacts who were in the Searchable group. Unfortunately, the explorer generated an invalid query using the group's name instead of its ID, so when I ran the query it exploded. I had run into this issue before and already knew the ID, so I copied the query into the search code and replaced the group name with the ID.

I wrote a loop to go through the returned Contacts and make a list of countries with their associated states, then used that list in a drop-down in the search form. I saved my changes and loaded the form. The drop-down showed countries, but there were no states.

Perplexed, I dumped the list of countries I had made, hoping to find my mistake, but it only had countries too. I dumped the result I had gotten from the API. Notably missing from the results were state_province_id and state_province_name. I went to the API explorer, removed the Group, and ran my query on all Contacts. There, as well, the fields I had requested were missing. I undid my changes and started from scratch.

I noticed that while the query did not return the fields I had asked for, it did return one I had not: address_id. I reasoned that I could use this field, along with a MySQL query, to find the states' names and IDs. I created a new API query asking for the address_id of Contacts. Having learned my lesson from the last time, I ran the query in the explorer without a group. The results did not include address_id.

Okay, I had seen address_id in my results before, so I knew it could be returned. It must only appear as a side-effect of one of the other fields, I reasoned. I created queries asking for country, state_province_id, and state_province_name, but address_id was not returned for any of them. Finally, I made a query asking for all three together. address_id appeared in the results. I counted it as a victory.

I made a MySQL query using these IDs in a massive IN clause. The query selected state name, ID, and country. Using the results of that query, I re-created my list of countries and added them to the drop-down input.

Of course, that was only half of the equation. The drop-down showed all of the states, but I needed to find all members that matched the chosen state. Fortunately, the API allowed me to limit queries based on state_province_id. I verified it in the API explorer before writing the code. I passed it the selected state ID and …


Continue reading

What Shall We Do?

Posted on Fri, Apr 15 2016 in Strange Thoughts

Peter explained, with an eloquence he had never before possessed, how the prophecies of David ((Psalms 110:1)) had finally been fulfilled by his Rabbi, Jesus. The songs they sang in their homes had come true in a way no one had expected. Jesus was not only risen but exalted, and from God's right hand he poured out his own spirit on his disciples ((Acts 2:33)). The day's great religious festival ((Acts 2:1)) was forgotten as the crowd of worshipers listened eagerly to this new revelation.

Yet against the backdrop of God's marvelous plan was the evil of the people God has chosen. They had taken their last hope, their rightful Lord, the one chosen by God, and crucified him. ((Acts 2:36)) The listening crowd could not help realizing that perhaps they had destroyed what their nation had waited centuries to see. Were they to be excluded from God's promise? They had to know. Men and women raced forward to find if they still had a place in God's plan ((Acts 2:37)).

Peter was amazed. He had seen the religious throng in the temple as an enemy, but so many were responding to the message of Jesus. His tone changed, no longer telling a hard truth to a disobedient people, but offering comfort to heartbroken sinners.

"It is not too late! Even now you can turn from your headlong flight into oblivion. Instead, be baptized into the name of Jesus, and he will forgive you and you will also have access to his spirit ((Acts 2:38))."

Peter and the disciples continued to teach the crowd for hours, and many began to follow Jesus that day. ((Acts 2:41)) They would not fall under the judgment that hung over their generation. ((Acts 2:40))


Stronghold - Westtown

Posted on Tue, Apr 5 2016 in Bob's Journal • Tagged with FRC

The Krypton Cougars arrived at their second competition with only one obstacle standing between them and total domination: themselves. The new pickup system (also known as the old shooter) had been designed without measuring if a ball sitting on the floor would touch the intake wheels. Testing revealed that the new metal base-plate would hit the ball first, knocking the ball away repeatedly. After much deliberation, and a sometimes contentious discussion about what shape the cut should be, the team decided to cut off an inch from the front.

With their robot now even more unstoppable than before, they had it weighed and inspected. Once their radio was configured to be plugged into the field, they got in line for their first practice match. Finally they reached the front of the line, eager to test their new design. "Sorry guys, that's all the matches we have time for tonight."

Undeterred, they returned the next morning and stood in line again. When they finally played their long-awaited match, the new arms performed as anticipated, getting hit early in the match, bending the shooter and causing significant damage to the robot. Back in the pits, the team decided that making the same mistake a second time wasn't quite enough. They removed the angled intake bars from the aluminum arms, leaving only two short tusks in front. Since each tusk was one-inch-square, the pickup mechanism's width was now approximately the same as the ball, making collecting a ball from the field nearly impossible. The team saw that their pickup design was good and took the robot to the practice field to see how great their shooter was.

The team stood, waiting by the field as team after team tested their robots. "Where are we on the list?"

"List?"

"Yeah, the list where you sign up for a time slot to test your robot. You did sign up for that?"

"Oh." The team reserved for a time slot and eventually tested their shooter. They scored two high goals, out of dozens of attempts, and their joy was beyond containing as they shouted for joy while the other teams stood silently for the national anthem.

Practice time was over and the main event began. In their first match, the Krypton Cougars got off to a great start, easily clearing the defense in front of them, and slamming full-speed into their opponent's wall, an effective, if unplanned, intimidation technique. Delighted, the team scurried into line for their second match.

The second match was equally successful, with another intimidating autonomous, until a head-on collision with an opposing robot sheered through two aluminum brackets like they were tissue paper, leaving the shooter hanging by its wires. Without enough time to fix the brackets before their next match, the team used bungee cords to strap the shooter to the robot and went back on the field. Unfortunately, they neglected to strap down the duct-taped-on limit switch, and left it laying on the field like a deceased orange long-tailed rat.

Their next match wasn't until after lunch. They worked feverishly to make new brackets (They hadn't brought replacement parts). Far too quickly lunch was over, and matches resumed. Their match approached and the team continued reattaching the parts they had disconnected. The match before theirs began, and the team still hadn't finished. Duct tape and zip ties flew as the team strapped down every loose piece they could find. It was time for their match to start, and the team deployed code to the robot as it rolled towards the field.

When officials finally made them stop working on the robot, it drove well and the shooter worked, mostly. After the match, the team found that the limit switch had come unsoldered again. They re-soldered it, but then the arm would only move down, until it reached the bottom switch, at which point it wouldn't move at all. The team checked the top limit switch, but it wasn't closed. Figuring it had short-circuited, they removed it entirely, but the arm still didn't move. Closer inspection revealed solder between the solder pads, creating a tiny short-circuit. The team melted the solder off the pads, but didn't have time to attach the …


Continue reading

Stronghold - Preview

Posted on Wed, Mar 30 2016 in Bob's Journal • Tagged with FRC

"Let's check the robot's camera feed."

Click. The robot blinks to life. Eric waits at the programming laptop for the wireless connection.

"Hey, this motor isn't plugged in."

Click. The robot goes dark. Thirty seconds pass.

"How are we supposed to check the camera without power?"

"Oh yeah. Eric, we turned off the robot."


"It's ridiculous how we have to relearn the same lessons every year. We should write down what went wrong and go over it at the beginning of next season."

"Connor, we did that this season, and look what happened."

"Oh yeah. But, like, the arm outside of the robot. Every year we have one and every year it gets broken. We even made this year's arm from quarter-inch steel, and it still got destroyed. We shouldn't be extending outside of the bumpers."

Twenty feet away, Tory and Gavin work feverishly to attach new aluminum arms to extend outside the bumpers.


"Gavin did a terrible job taping these wires. I can do better."

Connor grabs the scissors and cuts through the delicate encoder wires taped inside.


"Henry, that motor is already attached."

"What?" Henry asks, tugging it from the robot and snapping the data cable.