So I can check on them I set up a Samsung Galaxy Tab 2 with Skype set to auto-answer. It's permanently plugged in and facing the room, so if I dial in then it will show me the room, allowing me to see and hear them, as well as speak to them. I bought the 10.1" screen because even though they can't really tell it's me on the display it might be a little easier for them if the video is bigger.
Unfortunately the picture quality is a little poor, in part because Skype doesn't have the best encoder setup but also because the Wi-Fi signal in their room is a little weak. But when I call at least they can hear me. Detective Nami investigated right away, and turns to look when I call. Kiba came over when he heard me calling his name, but I'm worried he is disappointed when he can't find me.
]]>I figured it might be related to disabling notifications as I recently turned some off for a few apps. Turns out that's what it was. I had disabled notifications in the Notification Center from the Slickdeals app, but that app was still sending out notifications. When I turned notifications back on for the Slickdeals app in the Notification Center, a whole list of them was displayed in the iOS pull-down menu. Notifications that were previously hidden but still occurring. These notifications were being issued even with the Slickdeals supposedly app force-quit.
To fix this, I had to change my notification settings within the Slickdeals app itself.
]]>Making the images took quite a bit of time, and taxed my iMac for the first time since I last did some serious graphic design work. The images needed to be high quality actual size at 150dpi for a good print result. It took me a while to find source images large enough to work with, and there wasn't a lot of images that large. Luckily the recent Evangelion reboot has come with some excellent high quality artwork. I needed to extract Asuka, Rei, and Mari from the background and then composite them actual size onto an actual size image of my Mini. I would say doing all this took at least a couple dozen hours. The resulting source and final image files take up about 2.8GB and prompted me to ensure I was using GigE for my network connection.
I'm super happy with the results! There are a few blemishes in the application but they're only noticeable up close. From start to finish, this project took me about two months of research and work. The stickers should last about 5 years, maybe longer if I keep my car out of the sun and away from harsh weather.
]]>From both an economic and financial standpoint, these types of taxes (usually excise taxes) are imposed to encourage, discourage, or help pay for the costs associated with a product or service. A common one is the tax on cigarettes.
Cigarettes are taxed because there is an external cost associated with their consumption that will not otherwise be borne by the manufacturer, retailer, or consumer: health problems and the associated cost for treating them.
There are many who consider health care to fall under the category of a social service similar to police, fire, military, unemployment insurance, etc. Truthfully, most of the rest of the first world considers it as such. In fact the UN includes it as a human right, much like the U.S. constitution lists the pursuit of happiness and freedom. In such a situation, barring universal government-provided health care, the current reform bill is a halfway measure towards that.
The tax is thus a mechanism (albeit a somewhat unbalanced one due to its small dollar amount) by which to still rely primarily upon private health insurance companies while moving towards universal coverage. That's also why the majority of provisions in the bill are designed to prevent the private insurers from rejecting applicants or denying coverage.
A different implementation would have been to expand Medicare and Medicaid to cover all citizens and increased taxes or reallocated spending to cover the additional cost. Then the arguments around being forced to buy something would sort of be moot in the same way you are "forced to buy" other government services via taxation. But that couldn't get past the Republicans and the health insurance industry lobbyists.
In one ways, the tax associated with the reform bill is similar to Medicare/Medicaid because it is a progressive tax: the amount you have to pay for not having purchased health care is dependent upon your income. Taxpayers currently pay into Medicare and Medicaid based on their income.
History and economic theory has shown that the universal safety nets provided by government services like the police, fire departments, military, education, and also health care have a net positive effect on economic growth, social stability, and technological advancement. By contrast, environments at odds to that have a net negative effect as seen in the reaction of financial markets to war.
One example of the benefits of support services and safety nets are individuals being more likely to quit their current job to start a new business without having to worry about reduced income affecting their family's health or safety. (e.g. the police, fire departments, military, schools, etc. won't stop providing services to that family.) Likewise, with less basic living necessities riding upon a paycheck, individuals are less bound to indentured servitude.
An argument against this is that providing too many basic services can discourage individuals from actually contributing to society. And this has happened in some countries where social protections and safety nets have gone too far and tipped things upside down. The right balance is to provide enough to keep people safe and healthy without providing enough to satisfy their recreational and entertainment desires. (Plus, there is always a percentage of people who will produce for the sake of producing or advancement of technology.) I don't believe health care risks pushing the balance too far.
]]>In one sentence he says, "No more cruel discrimination against the obese or people with cancer." But then he compares that with optional flood insurance and car insurance costing more for risky drivers. Last I checked there wasn't a whole lof of 'risky' behavior that I can eliminate to seriously reduce my chances for brain cancer, colon cancer, or breast cancer. Black people are more susceptible to certain diseases--can they become less black?
Likewise, there are some risky behaviors that are supposed to, overall, have benefits that outweigh the risks. Such as playing sports, which is more likely to result in broken bones. Have you done a genetic analysis lately to find out if red wine is going to decrease your chance of a heart attack, or instead destroy your liver? Don't like (or can't afford) to eat fish twice a week? Your insurance premiums should go up.
Later on, he talks about everyone getting health care because hospitals treat those without insurance, medicaid (government health care funded by taxes) is available, people pay cash, or doctors will let some people pay less or nothing if they can't afford it. Other than pro-bono work, the rest of those don't seem like amazing options when your child is diagnosed with leukemia. And I kind of doubt the hospital is going to handle that pro-bono.
There are a dozen things we pay for collectively that aren't directly linked to our individual chance of contributing to the need for that thing. Criminals don't pay more taxes to fund the police or justice system. People who buy boxes of matches don't pay more taxes to fund fire departments. Politicians who weaken political relationships with other countries don't pay more for the increased intelligence gathering and military operations that result (maybe they should). The reason is that we know that our civilization is better off with people having the social and financial security and stability associated with those services.
]]>Unfortunately there is one problem with the TV: it does not support static IP network configuration. I was able to get everything working via Wi-Fi and DHCP (in fact this is necessary as the Wi-Fi MAC address is only visible after connected; only the Ethernet MAC address is listed in the device information screen based on my memory) but despite text on the TV setup screens and user manual that implies support for static IP configurations, I was unable enter one.
I ended up spending about one and a half hours on the phone with LG support. The representative was very helpful, and called me back after doing some investigation. But the end result is that the TV only supports DHCP. (I think she got some confusing answers from LG technicians because her explanation on the callback wasn't entirely correct.)
So, we won't be using the SmartTV features of this display. Too bad, since it's Netflix UI should be better than what's on the Apple TV. But, it's okay because we have network access via the Apple TV.
]]>Lately I've found myself harping on the importance of documenting code, program execution, and SCM items (i.e. JIRA issues and Perforce changelists). Documentation can be a controversial topic, particularly when mixing people from opposite camps on the subject. It has even been referred to as a philosophical difference.
Typical arguments against producing documentation for internal consumption tend to fall into the following two categories:
While I could continue to espouse the benefits of good documentation, in many ways the discussion reduces to a disagreement along the lines of he-said/she-said. So instead of proselytizing I will instead provide scientific evidence in support of documentation. It is not a difference of philosophy.
The majority of evidence presented here applies to software developers but the analogous benefits apply o any persons involved in the development process including QA, technical writers, and anyone else that may need to synthesize information about the product. Only evidence indicated as statistically significant is included.
This essay will not cover the benefits of clean code although those benefits may be discussed in the referenced papers. For more on clean code, see Clean Code: A Handbook of Agile Software Craftsmanship [Google Books] or Writing clean code [IBM developerWorks].
To identify the value associated with the variable or attribute of a scientific experiment a metric must be defined. For documentation that metric is comprehension and the resulting benefits of improved comprehension.
Leo Gugerty and Gary M. Olson. 1986. Comprehension Differences in Debugging by Skilled and Novice Programmers. In Papers presented at the first workshop on empirical studies of programmers on Empirical studies of programmers, Elliot Soloway and Sitharama Iyengar (Eds.). Ablex Publishing Corp., Norwood, NJ, USA, 13-27.
Gugerty and Olson conducted an experiment to determine differences in debugging skill between novice and expert programmers. Experts were able to identify and fix the programs in less than half the time (18.2m/17.3m for novices, 7.0m/9.3m for experts), with fewer attempts (4.5/2.2 for novices, 1.9/1.1 for experts), and with less probability of introducing new bugs (23%/30% for novices, 17%/0% for experts). Results indicated this was in large part due to generating high quality hypotheses with less study of the code primarily due to their superior ability to comprehend the program.
Murthi Nanja and Curtis R. Cook. 1987. An analysis of the on-line debugging process. In Empirical studies of programmers: second workshop, Gary M. Olson, Sylvia Sheppard, and Elliot Soloway (Eds.). Ablex Publishing Corp., Norwood, NJ, USA 172-184.
Nanja and Cook studied differences in the debugging process of expert, intermediate, and novice programmers and measured their performance when debugging. Their results support the conclusions of Gugerty and Olson's study: experts relied on superior program comprehension to fix bugs faster (19.8m for experts, 36.55m/56.0m for intermediates and novices) with less code changes (8.83 LOC for experts, 10.33/23.16 LOC for intermediates and novices) and without introducing as many new bugs (1 for experts, 2.33/4.83 for intermediates and novices).
Robert W. Holt, Deborah A. Boehm-Davis, and Alan C. Shultz. 1987. Mental representations of programs for student and professional programmers. In Empirical studies of programmers: second workshop, Gary M. Olson, Sylvia Sheppard, and Elliot Soloway (Eds.). Ablex Publishing Corp., Norwood, NJ, USA 33-46.
Holt et. al. examined the correlation between a programmer's perceived difficulty and complexity of code on that programmer's debugging performance. They found a small but significant correlation between debugging time/attempts and the difficulty in finding information (0.235/0.184/0.237) and the difficulty in recognizing program units (0.291/0.177/0.205). A somewhat less significant correlation was found between difficultly in working with the code and time to debug (0.210) and between program formatting being too condensed and number of debugging transactions (0.197).
Poor comprehension increased the time to fix bugs and correlated with the introduction of new bugs or incorrect fixes.
David C. Littman, Jeannine Pinto, Stanley Letovsky, and Elliot Soloway. 1987. Mental models and software maintenance. Journal of Systems and Software. 7, 4 (December 1987), 341-355. DOI=10.1016/0164-1212(87)90033-1 http://dx.doi.org/10.1016/0164-1212(87)90033-1{info}
Littman et. al. analyzed the development process of experienced programmers tasked with modifying a program and identified two categories for understanding programs.
In their experiment all five developers who used the systematic strategy successfully modified the program while all five developers who used the as-needed strategy failed to modify the program correctly.
Failure to understand global program behavior and interactions between components resulted in incorrect implementation every time.
Hoadley, C.M., Mann, L.M., Linn, M.C., & Clancy, M.J. (1996). When, Why and How do Novice Programmers Reuse Code? In W. Gray & D. Boehm-Davis (Eds.), Empirical Studies of Programmers, Sixth Workshop (pp. 109-130). Norwood, NJ: Ablex.
Among developers who are pre-disposed towards code reuse, comprehension influenced both the frequency of and form of reuse. Two mechanisms of reuse were examined:
An abstract understanding of functions resulted in 65% reuse (both direct and cloned) while only an algorithmic understanding resulted in 12% reuse. Misunderstood functions had low direct reuse of 5% but were reused by cloning 40%.
Code that is not well understood is less likely to be reused. Code that is misunderstood is likely to result in incorrect code.
Beacons are key features in code that indicate the presence of a structure or operation and strengthen the reader's hypothesis of functional behavior. They serve as shortcuts towards comprehension; failing to recognize a beacon requires a developer to spend additional time on comprehension.
Susan Wiedenbeck. 1986. Processes in Computer Program Comprehension. In Papers presented at the first workshop on empirical studies of programmers on Empirical studies of programmers, Elliot Soloway and Sitharama Iyengar (Eds.). Ablex Publishing Corp., Norwood, NJ, USA, 48-57.
Wiedenbeck's experiments found that experienced programmers were able to recall 77.75% of the beacons versus 47.50% of the non-beacons in the code while novices only recalled 13.83% of the beacons and 30.42% of the non-beacons.
Martha E. Crosby and Jean Scholtz and Susan Wiedenbeck. 2002. The Roles Beacons Play in Comprehension for Novice and Expert Programmers. In Programmers, 14th Workshop of the Psychology of Programming Interest Group, Brunel University. 18-21.
Comment beacons indicative of functionality are quickly processed by experienced programmers. Pure code beacons (i.e. important lines of code) require more time to process and might benefit from comprehension aids.
Edward M. Gellenbeck and Curtis R. Cook. 1991. An Investigation of Procedure and Variable Names as Beacons During Program Comprehension. Technical Report. Oregon State University, Corvallis, OR, USA.
Gellenbeck and Cook found that meaningful procedure and variable names resulted in higher rates (52% and 74%) of correct behavior identification compared to combinations with neutral procedure and variable names. However this still shows a large percentage of incorrect identification (48% and 26%) for undocumented source code.
Add documentation beacons (comments, mnemonic hints, or whitespace and formatting) to highlight important operations and logical concepts to speed up comprehension time and ensure proper comprehension.
Stanley Letovsky. 1986. Cognitive Processes in Program Comprehension. In Papers presented at the first workshop on empirical studies of programmers on Empirical studies of programmers, Elliot Soloway and Sitharama Iyengar (Eds.). Ablex Publishing Corp., Norwood, NJ, USA, 58-79.
Plausible slot filling is an attempt to explain an unknown based on existing incomplete knowledge. It is a result of [abductive inference|http://en.wikipedia.org/wiki/Abductive_inference] (i.e. guessing) where one tries to explain something through reversed logical deduction. In other words:
if "Q" and "P implies Q" then "maybe P"
The deduction may be incorrect. In Letovsky's experiment a developer incorrectly guessed that a memory allocation within a database function was for a database record. In another example the developer did not immediately understand why only six elements were displayed when the record array contained seven elements.
Document background information and the purpose of code to prevent incorrect conclusions, even when the issue appears isolated or minor.
Mark Thomas and Stuart Zweben. 1986. The Effects of Program-Dependent and Program-Independent Deletions on Software Cloze Tests. In Papers presented at the first workshop on empirical studies of programmers on Empirical studies of programmers, Elliot Soloway and Sitharama Iyengar (Eds.). Ablex Publishing Corp., Norwood, NJ, USA, 138-152.
A cloze test is a comprehension and vocabulary test where words are removed from a larger body of text. Removed items fall into one of two categories:
In the tests conducted by Thomas and Zweben cloze test error rates for program-dependent items were 41.14%/32.11% while only 12.41%/5.75% for program-independent items. Stated differently, participants had a much harder time deciphering the correct meaning of the code when lacking program-dependent information.
Document considerations (global, external, state) to reduce the chance of incorrect conclusions due to missing context.
Hoadley, C.M., Mann, L.M., Linn, M.C., & Clancy, M.J. (1996). When, Why and How do Novice Programmers Reuse Code? In W. Gray & D. Boehm-Davis (Eds.), Empirical Studies of Programmers, Sixth Workshop (pp. 109-130). Norwood, NJ: Ablex.
Experiments found that students having difficulty summarizing code were less likely to reuse code. Additionally, abstract comprehension resulted in 65% function reuse versus 12% function reuse with only algorithmic comprehension. Code that was not understood either abstractly or algorithmically was cloned 40% of the time which likely resulted in incorrect code.
Documentation should be written towards both abstract and algorithmic comprehension to increase code reuse and prevent incorrect code cloning.
While the benefits and mechanisms of improved development documentation may be clear, it is also important to take action that will result in the production of this documentation.
Herb Krasner, Bill Curtis, and Neil Iscoe. 1987. Communication breakdowns and boundary spanning activities on large programming projects. In Empirical studies of programmers: second workshop, Gary M. Olson, Sylvia Sheppard, and Elliot Soloway (Eds.). Ablex Publishing Corp., Norwood, NJ, USA 47-64.
Krasner et. al. conducted an informal analysis of the communication issues affecting large programming projects and identified areas in which the culture and environment discouraged effective communication. These areas include communication skills, incentive systems, representational formats, rapid change, jargon, information overload, scheduling pressure, and peer/management expectations.
Encouraging the production of documentation and effective communication must be accomplished through a combination of peer pressure and management behavior.
May 21 10:56:55 binibik systemd-logind[979]: New session 21304 of user wesley. May 21 10:56:55 binibik sshd[7714]: subsystem request for sftp by user wesley May 21 10:56:55 binibik sshd[7714]: Received disconnect from 69.53.237.65:11: disconnected by user May 21 10:56:55 binibik systemd-logind[979]: Removed session 21304.
I am using the wonderful Transmit FTP client and version 3 of the client displayed an error dialog stating 'permission denied' while version 4 of the client displayed an error dialog stating the username or password was incorrect.
So both the server logs and client error message was incorrect and therefore misleading. I turned on Transmit verbose logging which showed authentication succeeded. I think the log messages might have indicated something was wrong but there wasn't a clear message indicating so.
Turns out the problem was my sshd_config configuration. The sftp subsystem configuration line was pointing at an old file location that no longer existed. I fixed that so it pointed at the correct location and everything works now.
Subsystem sftp /usr/lib/ssh/sftp-server]]>
My friend Anthony did a great job as our ceremony officiant, reading a script prepared by one of my other friends Matt who unfortunately couldn't make it because he got stuck in Indonesia on business. We had a sand ceremony of red and blue sand that we poured into a heart-shaped vase Christina found in China. Christine, one of Christina's friends, was her maid of honor and Jasmine was her bridesmaid. Calvin was my best man and Dennis was my groomsman. Naomi wore a pretty little white dress and was our flower girl.
Christina was particularly happy with the flowers that we had that day. That was probably the best decoration of the entire celebration. We took all the flowers home and they're all over our bedroom right now. Some of the other stuff didn't go as well: we didn't find out that the room wasn't going to be decorated until the day before and had to make rush arrangements to get that done and the changing room was very small and was primarily the event coordinator's office.
At the reception, Dennis was the DJ and he did a really good job at it. We played 'Eyes on Me' by Faye Wong as the song for our first dance. During our dinner at the sweetheart table we had a special guest because Caitlin came to eat with us. Calvin and my mom said a few words for the toast. Christina didn't like the food that much but other people said it was good. I played a lot with Naomi and Caitlin which was lots of fun, and was happy to see Shannon and Mei-Ling again after over a year since last time.
We all had a good time but we're glad it's all over so we can relax again.
]]>She was the brave one. When she came home with Chie and Niea, she was the first one to come out of the downstairs bathroom and look around. She loved eating Goldfish crackers and tuna. She loved playing with cardboard boxes and string. When I held her like a baby she would grab my arm with both her hands and hold me tight.
The night before she slept with me on the recliner. She climbed out of the kitty bed next to me and fell into the blankets next to me. I held her tight the whole night. During the day I took her on a walk around the neighborhood wrapped in a towel so she could see the trees and leaves and sky, feel the wind, and hear other people and the world. She was too weak to move her head but I know she could see things, and I told her how much I loved her and how much I would miss her.
She died in my arms.
]]>Comments explaining the purpose and operation of code should be written while coding. Special cases and unexpected workarounds should be fully explained. Functions should have their behavior, input and output parameters, return values, and any special considerations documented when declared.
When adding new code or making changes to existing code, spend the time and effort to refactor now instead of later in exchange for completing sooner. This may require you to touch more code than you would like or make minor changes to code unrelated to your specific change or feature addition. Do not copy/paste code to avoid refactoring.
A bug fix or new feature should not be considered complete until unit tests for that code are also complete. Unit tests should exercise both correct and erroneous code paths and incorporate stress tests if possible.
Write functional code in favor over procedural code. Functional code is where the return value and any output parameter values only depend upon the input parameter values. Procedural code depends on information other than the input parameters or has side-effects that affect other code.
Do not require users of a library, module, or class to understand the inner workings or state of that class. This means all state must be private, memory management must be internally managed, and all synchronization must be internally implemented.
Immutable objects have all state information set upon construction and this information cannot be changed. Whenever possible, objects or state containers should be made immutable. Changes to state information require the creation of a new instance.
Use resource acquisition is initialization, or RAII. Acquire resources and initialize instances in constructors and release resources and cleanup in destructors.
When committing a code change, a detailed description of the change should be included. This description should include how the change was implemented, what problems are fixed or the new feature added, and in the case of a fix why the previous code was erroneous.
In some cases the reporter can fully describe the root cause of a bug, but in many cases only the resulting erroneous behavior is known. When the root cause of a bug is uncovered, it should be fully documented in the bug tracker. (When appropriate, this may be handled by copying the source control changelist description into the bug tracker issue.)
When a bug or feature request is marked non-issue or won't fix, a detailed explanation of why it is not an problem or won't be fixed should be included. Any business or technical reasons should be included.
There are some minor differences in the general fee schedule with GoPayment offering slightly better rates for those who pay a recurring monthly fee but slightly worse rates than SquareUp for those who do not. GoPayment's American Express fee is also higher than that of SquareUp. In terms of fees, I think businesses with more volume that primarily this as their payment method would come out ahead with GoPayment.
However I strongly advise against any business actually signing up with GoPayment.
The GoPayment web site has a signup flow but it only works for individuals. It will ask for your personal social security number. I wanted to open a business account with them using my Federal EIN and business banking accounts. That's when things got ugly.
In order to sign up my business with my EIN there were two primary requirements which were that I own at least 50% of the business and that I am over 18 years of age. I'm not entirely sure how Intuit will handle some businesses where there are multiple owners. Maybe it won't be a problem as long as a majority stake signs some paperwork and they use the business' EIN. However that turned out to only be the tip of the iceberg.
First, even though I was opening a business account, they wanted my personal SSN. To do a credit check. Sorry, that's not okay. I told them I wanted to use my EIN and not my SSN for tax purposes. After the customer rep spoke to someone else he came back and said okay, but instead they would need additional documentation. That additional documentation turned out to be my profit and loss statements and tax returns for the past two years (or how long the business had been operational whichever is shorter). Sorry, that's even more not okay. I am not handing over my private company's P&L statements or tax returns to a merchant processing company.
I should close by saying I am so far very happy with SquareUp and it was extremely easy to sign up with them. I was able to do it from their web site, and I did not have to provide sensitive personal or business financial information to do so. And I have never had to provide that sort of information to any of the other merchant processing companies I have used in the past or for Google Checkout, PayPal, or Amazon Payments.
]]>The first thing to fix was the NFS mounts. Obviously I cannot log in at all if my home directory is missing. I have always had a separate local administrator account, to perform system administration duties. This way, I can manage my computer without having any external dependencies like the network or my NFS server.
In OS X Lion, the way to add NFS mounts is via Disk Utility. There is an NFS Mounts... menu item and I simply added my NFS mount back. No problems and this uses automount whereas before I was using static mounts.
To fix the keychain problem, I simply restarted after my initial login. The file permissions were all correct, so I'm not sure what the original problem was. But it worked.
Now for the Trash. It took me a long time to figure out what was wrong, because my ~/.Trash directory existed and had all the correct permissions. Turns out, in /.Trashes on my Mac there was a directory named with my UID. Deleting this directory using sudo and then restarting restored normal trash behavior for my account. Previously it was always asking to delete files immediately. It may have worked as well without restarting but just logging out and back in.
There are two things to take note of. First, I ran Repair Permissions on Disk Utility and it found a lot of things to change. I'm guessing the directory structure and permissions have changed a lot in OS X Lion. Second, the auto-restore of application state, even for quit applications, can cause problems if your NFS mount is missing or flaky. For example, I had a few Terminal windows open and my shells were in NFS mounted directories. While debugging some stuff with NFS and trash, my mounts changed or were unavailable. Opening Terminal in this state would get stuck. (I probably needed my original NFS mounts to be soft rather than hard.)
]]>