I've been reworking my old fretboard helper script to be less of a hacked together mess, porting it over to Ember. Part of the script computes pixel widths of frets by using actual fretboard math, that is, the distance of a fret to the bridge of the instrument is L/k^f, where L is the length of the string, k is the constant: 1.0594631, and f is the fret number. It's a little bit gimmicky, but it makes it immediately apparent to anyone who's looked at a guitar before which end is which, because frets are wider towards the head, and any detail that makes something more intuitive is good.
If you need to bind a style to an Ember view, you can do it in the Handlebars template using an unbound helper pretty easily. For my case, creating a table and just defining the initial widths works fine, without having them bound. Tables will resize themselves pretty much proportionally when you change the window size, so it's no big deal.
The problem was that I wanted my views to be TD cells, rather than just some content inside of them. One, it made sense for my application, and two, it simplified some scoping issues. This is easy in Ember, by setting a tagName property on your view (e.g. tagName: "td"). However, there was no place anymore for me to put my unbound helper. It took me a while to resolve this. There are a bunch of things on StackOverflow about ways to circumvent it, and someone wrote a style binding helper, but I read the (always improving) Ember documentation and stumbled onto this bit about binding attributes, which was exactly what I needed.
Just specify "style" as a computed property, give it whatever dependencies it needs, set cacheable if it makes sense, and you're golden.
Incidentally, it seems like cacheable is going to be made default for Ember's computed properties, which makes a lot of sense, I think. There'll be some deprecation warnings in the future, probably whenever you call property(). If you don't know what cacheable does, I believe it just keeps the property from being recomputed unless its dependencies change. I have no idea why you'd want otherwise, really. It's basically equivalent to setting a normal property, and having a propertyDidChange method that observes its dependencies and updates it as necessary. Except it's easier.
The first thing I do when I wake up is generally empty my unread e-mail. In Gmail, there's an option to add a star to e-mails. I do this to whatever e-mail requires some action on my part that I'm not going to do right away. Sometimes the action required is to just read it thoroughly. In any case, this helps put my mind at ease. I have a hard time imagining the kind of anxiety you'd carry around all day if you're one of those people with hundreds of unread messages in your inbox. This generally takes less than a minute for me.
The next thing I do is take a quick look at on reddit. Okay, honestly, I start with r/starcraft, and then click through to r/programming. I don't think I use reddit like most people. I only periodically look at the first page of whatever subreddit. This helps a lot, I think, to keep me from spending all day reading stuff on reddit. Anyway, taking a look at r/programming and seeing people doing interesting stuff or writing educational articles helps to get me look at myself in perspective, and think about how much I have to learn, and it helps to get me inspired to work.
Since I've been working on personal projects, the next thing I do is look at my pomodoro log, assess what happened yesterday, come up with general goals for today, and figure out what my first pomodoro of the day should be, and then I do that pomodoro. If I were working in an office, I'd like to change this as little as possible. If I had to go attend a meeting in the morning instead of jumping into productive work, I'd feel like I'm owed a break, and probably want to goof off until lunch. I'd imagine this is pretty common.
I don't actually have a lunch routine. Working from home, this is easy to gloss over, but I've always had issues with breaking my concentration to get up and eat. I hate doing it. Hate eating. Actually, eating's not that bad, but I resent that I have to do it, so hard. Consequently, I skip meals a lot. This is probably bad. Your brain needs glucose to operate. Brain workers need more. I wonder if I'd be more productive if I didn't drink my coffee black with no sugar. When I know I have to be very productive, I try to stock carby, salty snacks, so I can just open up a sack and put food in my face while I look at the screen. If I have to be productive over a longer span, I tend to order a bunch of pizzas, so I just have them, and can consume them the same way as my snacks. In either case, I just eat enough to not be hungry, and I don't have to struggle with hard weight gain or anything. I think the fattest I ever got was about 160 lbs. (I'm a little under 5'9"), when I was doing regular lunch meetings at RPI.
I've tried candy, like a sack of M&Ms, and that works really poorly. That's a really bad sack to dig into when you're hungry. I ended up just feeling sick. I never buy those anymore.
I write here whenever the mood strikes me. Ultimately, I think it's good for me. I think about my relationship with my own parents, and how I have no idea what they were like when they were younger, and how I don't know a damn thing about the generations before them, and I think about posterity, and I feel good about having some slice of life stuff on record that will give them a better idea about me, and also a better idea of what the times were like that I lived through.
I've been very in touch with my mortality, and started thinking seriously about death when I was around 9. I've never believed in any sort of afterlife, so my perception of myself is very temporary. The idea of a written record is comforting to me.
I'm also refactoring some old code I'd developed to help me learn guitar. I hit a wall with my Chrome extension where it's not playing nicely with JQuery UI (sortable), and just needed to work on something else for a little bit, and come back to it with a clearer head. The original guitar code was hacked together really hastily, and was really just to cement some things I was learning about music theory at the time. The main thing it does is visualize things like chords and scales. Most people who are just starting to learn guitar are instructed to memorize chords, and I think that's awful. It's like trying to learn a language by memorizing phrases. You'll be able to play a song quickly, and maybe that's important to keep some people encouraged, but you won't understand shit.
Music theory, looking at scales and how chords are derived from them, and seeing where chord shapes on a guitar come from, is starting with grammar. It also sets me up to hit the ground running with any instrument, so long as I understand its tuning.
Sleep Like Something
Whenever I'm doing something new, trying to learn a new skill, my tendency is to just practice and drill it like crazy. Just iterate as much as possible. I'll practice just scales on guitar for hours, play a million rounds of multiplayer in video games, cook the same dish over and over for a week, whatever I can manage until I'm exhausted, or feel like I've attained a sufficient level of mastery. I think this is just a personality trait.
When I'm doing this sort of thing, I'll often drive past the point where I'm pretty much exhausted, and generally catch myself if I notice that I'm not improving with successive iterations.
As a programmer, though, this sort of thing can be really bad. Exhausted programming can create more work than it accomplishes, and staring at code looking for bugs when you're barely awake enough to keep your eyes open doesn't accomplish much, either. It's really just a waste of time. You're better off taking a nap, or getting a full night of sleep, and coming back to it when you're sharp.
Still, it's a hard habit to break. When you feel like you're close to a breakthrough, you want to just keep pressing. I'm mostly writing this as a reminder to myself that it's dumb.
I've been having similar problems with using Pomodoros. I'll be in the middle of something when the 25 minutes are up, and I don't want to take my break. I don't know if I'd be more productive if I did. It's hard to say, and hard to really test. Once I know how to do something, doing it again takes infinitely less time. At one point, I had forgotten to commit my code changes for like a week, broke something pretty badly, and rolled back my code, and I think I redid all the work I lost in about an hour and a half.
If you're curious about the title of this post, it's a mess. At some point, my laptop screensaver was just a scrolling marquee that said, "Eat something." At some other point, Jake informed me that his father had a total lack of an odor, and Jake thinks that's why cats take to him, like they find it intriguing. While I was doing some work on Jake's father's laptop, I changed his screensaver to a scrolling marquee that said, "Smell like something." At some point later, this kind of got him into trouble, because he was giving a presentation on a very large screen to a large group, and didn't touch the laptop for a while, and the screensaver came on behind his back, so for a few minutes, the words, "Smell like something," in letters as tall as him, kept scrolling across the screen behind him, to the bewilderment of the crowd.
I think he might have exaggerated the size of the screen, but I really don't know.
Razer Lachesis on Mac
I recently wore out the clutch that interfaces my mouse wheel axle to the gear that handles actually sending scrolling signals. It was a Razer Diamondback I'd gotten years and years ago on woot, for something like $15. They apparently no longer make that mouse, so I ordered a Razer Lachesis to replace it.
One of the things I liked about the Diamondback was that it had so many buttons. It had your standard left click, right click, and middle click one the mouse wheel, and it had rocker switches on either side of it, for a total of 7 buttons, and it was symmetrical, so you could hypothetically use it left or right handed. On OSX, I find these useful for dealing with expose (OSX's show every window on this desktop feature) and spaces (OSX's multiple desktop feature). The top left rocker, I use for back operations (command + [). The lower left rocker for expose. The top right rocker to go to the previous space, and bottom right for the next space. I operate the right rocker switches with my pinky, and this works well enough for me.
FYI, I also use these buttons for StarCraft. I use the right side rocker buttons to add units/buildings to control groups 1 and 2, and one of the buttons on the left to recall group 2, and the other for control group 4. I put unit producing stuff on group 2, so if I need to make units, I can just click that button, hit the hotkey, and I'm all set. I put my main army on group 4, so I can toggle my focus back and forth between each quickly.
The Lachesis has roughly the same layout as the Diamondback, symmetrical, with bigger buttons on the sides, and an additional two buttons below the mousewheel. These are generally used for on the fly sensitivity adjustment, but I figured I'd probably be able to remap them to something I'd do more often.
The problem is that the Lachesis is also kind of an old mouse, and it only has drivers for Windows. I didn't think it would be an issue, because I use LINKTHIS SteerMouse, which let me set up all of my bindings on the Diamondback, and didn't explicitly check for Mac drivers when I was shopping. SteerMouse apparently doesn't read the buttons normally, because the Lachesis has some wacky onboard software, rather than just regular mapping of buttons 1-9. The Lachesis seems to have regular mapping for 5 buttons, and the others have to be bound to mouse-specific functions, like changing the DPI sensitivity, or profile switching, or to macros. By default, the left side buttons are mapped to back and forward, and the right side buttons are just disabled (available for use when you switch to left-handed mode). It took me about a day of fiddling, but I finally got it back to what I'm used to.
The tricky bit was that I had to use Razer's proprietary software to remap the buttons. The only buttons I could remap via SteerMouse were the left, right and middle clicks, and back and forward buttons. So, whichever buttons I assigned to back and forward, I could reassign via SteerMouse. Everything else, had to be either a Razer single key, or macro. To use the macros, I had to figure out the equivalencies between Windows modifier keys and Mac modifier keys. I did this by recording a macro to press every Windows modifier key from left to right, and then hooked the mouse back up to my Mac, and wrote a quick keycode logger. For future reference, control keys are equivalent, the Windows key is equivalent to the Mac command key, and alt is equivalent to option.
I ended up using an F9 single key assignment to the lower left button, and a macro for windows + [ on the top left button (really the macro is Windows key down, left square bracket down, left square bracket up, Windows key up), and then assigned backwards and forward to the right side buttons, and remapped them to what I wanted with SteerMouse. The two buttons below my mouse wheel are currently unused. I'm trying to figure out a good thing to do with them.
At some point, I wrote:
I guess the root of this is, I hate dice. This is especially true in board games, but I have a general distaste for randomness in games. I think 99% of the time, it can be designed out, and you'll have a better game for it, where people don't feel cheated. I'll write about that another time.
I'm not actually going to write about alternatives right now, but I wanted to make some notes about randomness in games.
Generally speaking, the more you have to roll the dice, the less random your ultimate results are. If you consider a game like Bejeweled, there's randomness when you clear pieces, and they have to be replenished to fill the board. In StarCraft 2, Blizzard made a map called StarJeweled, where you basically play Bejeweled head to head to develop currency, and then spend your currency on units that fight on the side. You get a lot of currency for clears that happen as pieces drop down after your initial move, and the more this happens, the bigger your multiplier is. Given that the pieces that replenish the board are random, it's easy to feel like the game is kind of random overall.
In practice, I've beaten teams of my friends over and over again, without any complex decision making or gimmicks in unit production. Purely a function of macro mechanics, having a much higher income from playing the puzzle. If you don't understand the true nature of the game, it's easy to overlook what's really happening.
This is something I think about a lot. The question of understanding what a game is really about. My favorite example of this is Scrabble. People like to look at Scrabble as a game about vocabulary, and new players will tend to just play the longest word that they can, and this is total scrub behavior.
Scrabble is about having more points than your opponent. Sometimes this means playing a word that scores a lot of points. Sometimes it means denying your opponent the opportunity to make a big play, by creating clutter near score multiplier spaces, or only leaving them options that lead out to where you can score big. Competitive Scrabble play involves accounting for tile possibilities, keeping a good mixture of letters in your tray, and positional play. Actual words and vocabulary have almost nothing to do with it.
A game of StarJeweled has randomness every time you make a move, since moves that don't clear some pieces aren't allowed. What the game is really about is managing entropy. The board wants to be in a random state, but every time you clear gems, you influence its composition by removing at least 3 gems from it of one color. When you clear as much as you can of a particular color in an area, you increase the order of that area.
For example, if you make the move indicated by the green arrow, now you have an area of the board with no yellow. If you make the move indicated by the red arrow, you've left a single yellow piece in that area, likely with nothing to connect to later since you've just cleared most of the yellow from that region. That single yellow piece now gets in the way of every other color in that region matching with itself.
If you think about any match 3 game with powerups, one of them is invariably clear everything of one color, and it's basically always the best one, because it removes artifacts that contribute to chaos. When you have the opportunity to use one, don't think about what color is most abundant. Think about what color has the most isolated pieces.
When you consistently clear regions of a particular color, you consistently create more opportunities for the other colors to clear themselves as they fall into place and replenish randomly. You have a higher probability of scoring big, and you create more opportunities to do so in the future. It's self reinforcing.
Any game with heavy random elements really is about managing probability, and increasing your odds of success. The better you are at creating opportunities for yourself, the luckier you'll appear, but luck has nothing to do with it.
US Military Spending is Unnecessarily High
I'm generally not this blunt with my post titles.
There are enough real problems that need work and attention that if you're a fearmonger, I fucking hate you. Please die immediately. No joke. You're the scum of the earth, breeding animosity between good people, and if you killed yourself right now, it wouldn't be soon enough.
Otherwise, happy Cinco de Mayo.
Ember.js classNames Binding
One of the nice things about Ember.js is that you can have objects with computed properties. The classic example is a Person class with a first and last name, and you can have a function that computes the full name by concatenating the other two properties, and mark it as a property with dependencies on the first and last name, and it'll live update your views and stuff whenever any of that changes.
Another thing you can do in Ember is have a view class that has some information about its HTML structure, by specifying a class name.
When the Handlebars template instantiates the view, it'll create an img tag with class="something somethingElse".
Any view class that extends from that class will inherit those class names, in addition to any you add, which is kind of nice, but maybe not always what you want, which can be a headache.
The problem is that sometimes you want to compute the class names, and so far as I can tell, you can't. If classNames isn't specified as a regular array (as opposed to a function that returns an array and is marked as a property), Ember just says it doesn't want to deal with it, and that's shitty.
The alternative is to put the img tag inside your template, have the view be contained in a div (the default), and bind the attribute via the template, or put the logic in the template, which I hate conceptually, and just deal with the bloat.
Incidentally, now very aware of the need to write something to display code samples in a reasonable way. I don't want to use an external service like gists, because I don't want their crap breaking my entries if they decide to drop support.
Update: You can use the classNameBindings properties to bind a set of class names to various properties. I guess that's probably a better design choice, but I'd rather have the flexibility to do what I'd wanted to do initially.
I haven't written in a while, and I think have consequently been goofing off more than I would have been otherwise. Just wanted to make some notes on progress.
I'm getting more comfortable with Ember.js, but there are some architectural bits where I'm outside of my comfort zone, and some other things that I think are faulty with Ember.
I have a formal computer science education, but it was heavy on working bits, like formal languages, automata, assembly language instruction counts, and algorithms, and low on process and patterns. I was never taught to use any kind of source control. We were never really made to use debuggers. We were never taught to create and use unit tests. We never had code reviews. Refactoring was never emphasized. I had one class on design patterns, a la the original Gang of Four patterns, but it was poorly designed. Not enough application. It probably should have been a multiple semester thing.
In any case, there are points on things like MVC architecture that can escape me. Recently, I've been struggling with a bug in Chrome, where a Chrome extension's popup won't fire an unload event consistently. The issue is basically just that I have a list of groups of tabs, and I want to be able to trash individual tabs in place. That is, remove them from their groups. By trash in place, I mean you hit the button to trash the tab, and a half transparent version of the tab stays where it was. The trash button is replaced with an undo button, which you can hit, and then the tab won't be deleted.
Conceptually this is pretty simple, and I already have controls in place to do the same thing for whole tab groups. The problem is that I have a kind of hacky data storage model, where I'm taking the arrays of tabs, and just stringifying their contents, and putting the stringified array into localStorage. localStorage is just a dumb associative array for persistent data on the client side. You can store things under a certain key and retrieve them via that key.
The tab objects that I'm using are just Chrome's tab objects, and while it's easy to tell my TabGroup class to store itself, because of the storage model I'm using (i.e. localStorage["some group title"] = JSON.stringify(tabs);), it's less easy to just drop a tab from one of the groups, and restore it in place.
What I'd wanted to do was just handle the trashing of the tabs in the document, and when the page was going to unload, remove all the tabs that were flagged as trashed, and resave their groups. Not having the standard clean beforeunload hook available made me have this whole debacle where I tried various hacky things to get around it, and considered multiple local database options, all of which seem to be no longer recommended by the W3C for support as part of HTML5.
I've got the storage and retrieval code on the models, which seems to make sense, but should probably be redone so there's a separate layer for data persistence. I think it's overkill though. This was just supposed to be a project to get me familiar with Ember.js, Chrome extensions, and using localStorage, and I'd rather get it done and move on right now.
What I'm doing now is extending the Chrome tab objects with Ember, and using an observer on an "isTrashed" property to just resave the group as individual tabs are trashed or untrashed. It's not ideal, but it might actually be the least hacky solution to this problem.
Also, just a note for future reference, the "didInsertElement" event is hugely important when you're trying to do anything on an Ember view. Messing with the init function is fruitless, because the object is naked. You don't even have access to the objects passed to the create method, so far as I know. I guess init fires too early.
In other news, I've started using the Pomodoro method, to track my activity, and try to increase my productivity. If you're not familiar, it's a method where you work in 25 minute blocks, called a pomodoro, which is short enough that if you think something like, I want a drink, or have to go to the bathroom, it's easy to just wait for the block to be over. Having to get your work done in a finite amount of time can really help focus. I'd noticed that a lot when I was taking the train between Long Island and the city, I'd be super productive. Having my screen in full view of the other passengers probably also helped keeped me from goofing off.
I'm shooting for 10 pomodoros a day, which is only just over 4 hours, which doesn't sound like much, but 4 intensely focused hours of work in a day is pretty good. Tim Ferriss will have you believe that 4 in a week is good. I haven't been hitting 10 all the time. Fostering kittens can be very distracting. They'll be gone by this weekend, though. Good for productivity, but sad.
We raised this litter from before their eyes opened up after being born. Two of them are already back at the shelter, because someone on a kitten waiting list wanted to check them out today, and the other two are with us until Saturday, and will be getting adopted by Crystal's boss, which is good news, because Crystal can vouch for him and the quality of the home they'll be getting. And we can stay in touch and keep up with their development.
I'm actually a little sad that they've all been spayed and neutered. They, and their mother, all have wonderful temperaments. They'll be great pets.
I cook a lot. I started in earnest in college, when I moved off campus, and no longer had a meal plan, so I needed to cook to eat to live. Before then, I just cooked super simple basics, and one marinated chicken recipe that I got from Ella Cho, who is a lovely girl whom I should have been nicer to in high school.
I think one of the first things that anyone learns to make after eggs and toast is chicken parmesan, and by extension, any other thing like that (eggplant, veal, etc.).
I had one of my lapses into drowsiness today after neglecting to eat for 9 or so hours, with some mild physical activity in the middle of the day, so Crystal ended up cooking dinner. She made veal parm, with some thin sliced veal that she likes to get. The thin slicing isn't bad. You take a very tender type of meat like veal, and cut it thin, it compounds the tenderness.
I'm not a picky eater, but I take my cooking seriously, and as a result, I'm fairly observant when I eat foods, looking for what went right and what went wrong. There were things that were good about this meal. The proportions of pasta to cheese to sauce to meat were all about right (overall portion size was too big for our sedentary lifestyles). The veal was cooked well. The thin slicing, in addition to its effect on tenderness helps simplify frying.
A little bit about that: When you're frying, your main issue is going to be the exterior of the food being done at the same time as the interior. For meats that can be eaten rare, this isn't a big deal if you're off a little bit. For foods that aren't safe to eat undercooked, like chicken, this can be a big problem. That's why there are chickens for sale as frying chickens. They're generally in the 3-5 lbs. range, and at regular frying temperatures, your exterior won't be burnt by the time the interior finishes. A thin slice of meat also works this way, with the added bonus that you can cook it a little too much, and it's still tender, because the muscle fibers are cut short.
Anyway, there were things that weren't right that are kind of beginner mistakes, but easy to make. Right up front, the pasta was underseasoned, and the sauce was a poor match with the pasta.
With pasta, the most important thing is salt. If you get the texture a little bit off, it can detract from the dish, but it won't ruin it. Getting your salt wrong will fuck up your whole dinner. You can measure your water and use some percent salt, or you can do what I do and ballpark it, and walk it in as it cooks. Frequently, as it's boiling, take a piece, bite and check for doneness, and while you're doing that, you can also taste the seasoning. It's easier to undersalt and add more than it is to oversalt and try to get it out.
Cooked and seasoned properly, pasta is delicious on its own, and needs only the most basic treatment. If you want to test yourself, add nothing but olive oil and garlic as your sauce, and see how good it is. If you think it's too bland or something, you undersalted. If it tastes salty, you oversalted.
Don't make your pasta less salty and then try to compensate in the sauce. Each should be good on its own, so when combined, they're perfect.
Crystal made a tomato sauce from scratch, which I always encourage. It was chunky, which is fine, as a stylistic choice, but kind of soupy, which can also be okay. When I make a sauce from canned tomatoes, I generally pour off the water, so I don't have to cook it down forever. If I want more tomato essence in the sauce, I can add tomato paste. As a bonus, I can brown the paste in a pan, with garlic and stuff before adding the rest of the tomato, to give it a deeper flavor. In any case, it was a light, thin sauce, which is fine.
The problem was that light sauces don't pair well with fat noodles. She used fettuccine, which is as wide as you'll generally find with dried boxed pasta, short of lasagne noodles, and fairly thick as well. A fat noodle has a lower surface area than the equivalent mass of smaller noodles. This makes each noodle feel more substantial in your mouth, and gives sauce less area to cling to. A light sauce simply can't stand up to a broad noodle. It's almost all pasta, very little sauce. This is easier to overlook when the seasoning's right on the pasta, but grossly exaggerated when the salt is too light.
A richer, or more heavily reduced, tighter sauce will cling better to pasta, making it better suited for fat noodles like fettuccine, giving you a better noodle to sauce ratio as you eat it. Likewise, a thinner sauce won't cling as well to pasta, and will give you a better noodle to sauce ratio on thinner pasta. Think about how overwhelming an alfredo sauce would be on angel hair, and you get the idea.
This article makes me really sad. I mean, not that there's a study being done on it. That's good. Studies are good. Science is good. But the idea of people being anti-science is disheartening.
To get right to the point, I hate faith. The idea of it pretty much disgusts me. That is, to believe in things without evidence, or in spite of counter evidence. My issue is more with the latter. I take particular issue with various forms of Christianity, but faith as this concept, I detest as a whole.
With faith, logic and rationality break down. When you believe something based on nothing, you cannot build a system on top of it that has any integrity. This is dividing by zero in math. If you can divide by zero, any equation is valid, and you can prove anything you want. Anything that appears to make no sense can be explained by divine intervention. Anything that appears to make sense, but is inconvenient to you, can also be explained by divine intervention. The holes faith fills are personal, and arbitrary. Without logical extensions from a common middle ground, you're left with baseless conjecture, and citing authority figures (who may subsist on baseless conjecture and whatever fits their personal agendas). When logic and rationality break down, you get irreconcilable differences, and this is bad for the world.
One of my bigger problems is that people like to talk about faith and God, and point fingers at atheists, to criticize them for not believing in something greater than themselves. It's bullshit. The idea that you're somehow special, and that this greater power loves you, and made you in its image, and you'll enjoy eternal life, etc. is the most egotistical thing I've ever heard. Of all the ways things could possibly be, this would be about the most convenient.
I believe in myself, but more than that, I believe in people and cooperation. I believe in the transience of my existence, but I also believe in the lasting good anyone, including myself, can do for posterity. I look at the world, the technology that exists, and the cities we live in, and I think it's amazing, but not miraculous. God didn't invent our cities or the internet. People did. People who were able to overcome their differences and cooperate. Building on generation after generation of people cooperating before them.
I think nothing destroys cooperation or the potential for cooperation quite like differences in faith, because the conflicts it creates are irreconcilable. Philosophical differences, and differences in personal interests allow for concessions to be made where faith does not. Faith undermines science, which is our greatest ally in developing the understanding of the world that allows us to develop the technology that sustains us as a species -- the technology that could spare future generations the struggle and conflict for resources that cause war and suffering, or could spare future generations from extinction.
Faith also tends to tie closely to the ideas of objective good and objective evil. Absolute morality. Ultimately, I think this is really destructive.
I don't believe in good and evil. I believe in close-mindedness and ignorance. I believe in failures to communicate and stubbornness. I believe in selfishness and irrationality. I believe that morality is completely subjective.
Once you label another party as evil, you close the door on resolving your differences with them. You appoint yourself the moral highground and, in doing so, you trivialize the validity of their beliefs, and to do that is to trivialize their existence. When you do that, you fall into that crowd that most, and probably what you, yourself, would consider to be evil. When you appoint yourself the moral high ground, according to me, you don't deserve the moral high ground.
It makes me profoundly sad that our president (Bush 2) talked about countries belonging to an "Axis of Evil". It's that kind of "we're better than they are" attitude that causes people and nations to hate each other in the first place. World peace won't come of aligning everyone to north on your own moral compass. Peace like that would be fleeting, if achievable at all. People are born every day, and our beliefs can change in an instant from our day to day experiences. Real peace will only come of acceptance. Respecting that people have a right to exist, and a right to their opinions, and accepting that they may not be the same as yours.
I had a conversation with Gabe about how much I hate religion, and how I totally agree with the stance some guy took in some book (I think it was The End of Faith, by Sam Harris, but I haven't read it. It was just something Jake had mentioned to me as he was reading it) that if I could eliminate one of religion or rape, I'd pick religion, hands down. I won't say rape is without its influence in escalating violence in retribution and whatnot, but I don't think it really holds a candle to the maladies of religion.
At some point, I said, that if I changed all of the names in the bible and showed it to a religious person, they'd probably tell me it was the stupidest thing they'd ever seen. At the end of the conversation, Gabe pointed out that eliminating religion probably wouldn't solve all of the problems I associate with it, because religious people might just be irrational by nature. So it's kind of a chicken and egg deal. Are they irrational because religion, or are they religious because they're irrational?
I can't answer that, but I think it would at least be harder to organize them to do terrible shit sans organized religion.
It's a weird time for the web. It's not just for scrappy upstarts anymore. Some of the wisdom of regular software development is seeping into the mainstream web culture, giving you better development environments and such.
But there's also a lot of the stupidity of regular software development, which is itself not that mature of a field. Things that will bloat your product without a reasonable tradeoff, in order to give you a boilerplate.
There's a lot of new tech floating around, on the front end and the back end, and it's difficult to say what will last, and what's a stupid trend.
In my life, I've always tried to resist trends when they weren't strongly justified. I've been described as stylish in the way I dress, but I'm not. I wear solid, boring, colors, in moderately fitted classic cuts. My pants are neither very loose, nor very tight through the leg (I prefer a boot cut). I prefer khaki chinos and dark wool trousers, or black slacks. For tops, I wear basic t-shirts, basic buttondowns, basic sweaters (I wear turtlenecks, though, which have gone in and out of style, but I wear them because they're practical and keep my neck warm). My jackets and coats generally have no lapels. The net effect of this is that my clothes are all interchangeable, so I can compose outfits with zero effort and look well put together, and I won't look back in the way people who lived through the 70s did at their flare pants and disco shirts, and whatnot.
I look at my friends in their heavy rimmed glasses, and trendy hairstyles, and wonder how they're going to feel about them later. I'm content to wear classics and only worrying about replacing them when they wear out.
I worry about wasting time. I'm resistant to spending resources on anything that won't provide me with lasting value. This inspires a trend in purchases I make. I like to invest in skill development, and skip over super cheap entry level stuff, in favor of things that will carry me through intermediate levels.
I bought myself a Kershaw Shun Classic 8" chef's knife when I was in college, barely learning how to cook. Within a little bit of time, my aunt, renowned for her knife skills in her circles, was saying I was better with a knife than she was. By getting an actually sharp knife early on, I skipped over a lot of the development of bad habits I'd have to eventually break had I stuck with the kind of $10 knife you get at a place like Walmart.
Just as a tangent, you can sharpen basically any knife to the point where it will cut well, if you're willing to work for it. When you shell out for higher grade steel, it is somewhat to be able to get a better edge, but the real value is the ease of maintenance that comes out of better metallurgy, i.e. not having to resharpen every day.
I had a lapse of faith in Ember.js recently. I swapped the project back into vanilla JS, and then back to Ember, to give it one more shot. I made a breakthrough in understanding how it works. View hierarchies are a little awkward, and the documentation available is pretty shitty. The trick is specifying bindings in the Handlebars templates. Hopefully, documentation will improve as Ember matures. Will update to GitHub later.
This forum thread is an amazing window into human culture. It starts out with someone just posing that initial question, then everyone laughing at this one guy who doesn't look after he wipes, and then turns into this revelation that there are all these different schools of thought, and everyone thinking the ones who don't do it the same way as them are fucking weirdos.
Personally, I had no idea that so many people wiped standing up (facing in totally arbitrary directions), or wiped from back to front between their legs (or alternating directions), or didn't look at the paper. Mind-blowing.
Do I think that my seated, front to rear, with visual paper inspection method is superior to all alternatives? Absolutely. But that's the thing. Everyone thinks that their method is best, or it wouldn't be their method.
I'll spare you my rationale unless someone asks.
Thinking back, I don't think I ever really blogged very much about current events. Or rather, current events in terms of world news and politics and such. It's not that I don't have a lot of opinions on things. There just isn't a lot that seems particularly actionable on an individual level. But being outspoken is how you get action on a non-individual level rolling. I don't want posterity to think I never gave a crap about important things. So, here's a start.
I think the US political system, and government, to an extent, is broken. There's too much money involved, and Congress, I think, is bought, and that's terrible. Compounding the normal effect of that is the GOP being entirely focused on preventing Obama from being re-elected, rather than doing what's best for the country. I'm not even talking about like, what I, personally, think is best for the country. I'm talking about using their own judgement on what's good, rather than what will make Obama look the worst.
That's the GOP being the GOP though, and probably not really a fixable issue. The money is what concerns me. In some regards, I think small government is good. Personally, I love freedom. The problem is that some people are, frankly, assholes, and will use their freedom to exploit others. So you need some ground rules.
In multiplayer games, designers have to struggle with the idea of slippery slope. That is, when your position compounds itself. Once you start losing, it gets harder and harder to compete. The flipside is that once you start winning, it gets harder and harder to lose. For example, in chess, as you lose pieces, you lose power, and the more pieces you lose, the worse it gets. In games, this isn't always bad. The gameplay is front-loaded, where you develop your position while trying to give nothing away for free, and so long as it doesn't drag out forever where one player is slowly dying, it can be okay. I think wealth kind of works this way, though, and you're born into a position that may be stronger or weaker than others. Anyone who says everyone has equal opportunities in life is full of shit.
Having money makes it easier to gain money. Likewise, being poor makes it harder to put yourself into a position where you can gain money. Things like not being able to afford higher education, or having the capital to start a new business. Being poor puts you into a state of desperation, where you just scramble to make any amount of money that you can subsist on, passing up opportunities for greater growth with slower startup, because you need to eat today.
I love the internet, and I love air travel, and how these things make the world effectively smaller, allowing for greater opportunities for cooperation and advancement in human potential. What I don't love is that these things have forced workers to compete with workers worldwide in a way that isn't reasonable. I couldn't work for as cheap as a Chinese factory worker, because it costs a lot to live in America.
I'm not going to go into how I think that China is prospering on what's effectively slave labor, or the ethics of running a business where you pay workers non-living wages. These things are clearly horrible, and I'll leave it at that. But I will say that this isn't sustainable. If you run a business that makes good products and/or provides good services, if you pay your workers a fair wage, they can buy your products, and it's like you're paying them less, but the economy on a whole gets to grow, and they don't fucking hate your guts.
Maybe I'll just turn this post into a warning.
If you make enormous sums of money on the backs of the masses that you're knowingly exploiting, shit will eventually get ugly. Bullets are still affordable on shit wages, and whatever security measures you can buy aren't going to protect you when you've got millions rioting and gunning for you. Personally, I think it would be better if the mega rich willingly stopped abusing their power over politics, and politicians stopped putting themselves in people's pockets, rather than have some sort of bloody revolution.
I think around summer of last year, I picked up a copy of StarCraft 2, and have been playing it a fair amount since, with Jay and Tae, primarily. If you're familiar with it, I'm currently around a middling gold league player with total shit mechanics on the North American server. I'm not super serious about it, but I enjoy playing and improving at it, if for no other reason, because I can help Jay and Tae improve. I played a fair amount of StarCraft: Brood War, around its release and during college, but was never any good at it. Looking back, none of my friends or I were particularly good, but I didn't realize it at the time.
At the core of this, I think, is the fact that I only ever played with my friends from school, and some of their friends. I never played on the public ladder, and was never really given the perspective to see how truly bad I was. I think this is a really common story. The setting might be different, but the theme is the same.
Here's another version: In high school, I learned a 2 algorithm (and their mirrors) method to solve a Rubik's Cube. I didn't have good turning technique, but I knew when to apply what algorithm to get where I needed to, and I averaged about a minute and a half solve time. I didn't know anyone personally who could do it faster, so I felt pretty good about it, and didn't look at it further.
Years down the line, I looked up some speed solving videos on YouTube, and people were averaging around 10 seconds. I'm not there, largely because I didn't want to invest the time to memorize and practice a ton of algorithms, but I learned the Roux method about 7 algos, and dropped my time to sub 30 seconds. Better than a third of my old time, but I feel like I'm a slow asshole.
I think if you're going to spend time doing something, you might as well try to be good at it. And if you want to be good at something, you owe it to yourself to really know where you stand on the world stage, and not just fool yourself into a lifetime of mediocrity. I think the ability to give yourself the proper perspective is one of the great things about the internet.
Back to StarCraft, I never paid much attention to broadcast sports, growing up, but I watch a fair amount of professional StarCraft 2 tournaments these days. SC: Brood War is practically the national pasttime of Korea, incidentally. You go there, and there are channels that air matches all day. There are pro players treated as serious celebrities. Crystal thinks this is ridiculous.
Crystal, a staunch feminist and occasional football spectator, I thought, would be less prone to this sort of double standard. This is a girl I met playing StarCraft in college, by the way. Somehow, the thought of watching other people play a video game strikes her as crazy. What's funny, is that that's pretty much what I've always felt about regular sports. Primarily because a lot of pro sports fans don't play the sports they watch, at all, and I think team loyalty is totally irrational.
The thing about me watching pro SC2 matches, is that I can apply it. I watch and see things work or not work, and I learn to be better without having to put in training time. Like cooking, a lot of your ability in a strategy game comes from straight knowledge. What's a good timing to attack? What's the most effective unit composition to defend? Pro players marry high level knowledge and the fairly esoteric mechanical skills necessary to execute on it, but anybody can get the knowledge if they just pay some attention.
I guess while I'm on the topic, there was a smallish tournament this past weekend, in Texas, called the Lone Star Clash. Pretty small, invitational, I think largely run by college kids. I don't know what the general experience was, but I saw a lot of technical issues. I mean, that happens. I don't care that much. A lot of the games were very good. Polt vs. Stephano set 2, games 1 and 2, in particular. Super even, crazy swings. This isn't what I wanted to mention.
On one of their streams, one of their casters, a guy who goes by the handle, "Kibbelz," was pretty much infuriating. It's not very often that I wish for other people's failure. I try to do it as little as possible. But fuck this guy. He has close to every verbal mannerism that I hate. Maybe, if you're just some person with these patterns, I just wouldn't want to talk to you, but if you're doing casting as your job, where all you're doing is speaking for an audience for an extended period, I just can't wish you well. These examples are paraphrased, because I can't be bothered to watch this shit again (he starts talking around 0:32:36).
He'll take totally standard things to say, and tack on, "if you will." In SC, expansions are generally referred to by the order in which you take them, with the exception of the one that is most natural for you to expand to first, which is referred to as your natural expansion. He would say things like, "He's sending zerglings to the fourth, if you will". I don't even like this when it's more appropriate, as in, it's kind of a stretch to refer to something in a particular way. It's just so fucking pompous.
He'll phrase things like, "Setting up a wall off, is Polt". This is pretty close to how you talk like Yoda. I can't understand how anyone can compose sentences like that and take themselves seriously. I can kind of see it if you start your sentence prematurely, and realize that you need to retroactively specify a subject, but he does this incessantly.
Whenever he agrees with his co-caster, or the other guy just says like a fact, he'll respond like, "That, it is," or, "That, he does," etc. This is actually basically the same problem as item 2, with a touch of the pompousness problem of item 1.
He uses "literally" in totally inappropriate scenarios. This is pretty common, which is kind of annoying.
There are times where he words things unnaturally, like a kid trying to show off new vocabulary. Pompous, again.
It's reaching a little bit to call this a verbal mannerism, but he cracks a lot of jokes, and none of them are actually funny. There's just some Dunning-Kruger shit going on here or something. I felt so bad for his co-caster, who had to act amused.
I'm not going to pretend I'd be a good caster. I know very well that I'm not some sort of dazzling orator. But I don't need to be to know that this guy sucks at it. To be fair, he might have had some good insight into the game, but I was so distracted by the way he talked, I couldn't really tell. This also isn't just a case of a speaker who needs some practice and polish. That sort of thing is fine. Everyone needs to start somewhere and develop. There was some awkward space he'd have wanted to fill a few times, and that's totally cool.
But this isn't the case of someone just doing some crap like saying "um" or "uh" all the time. He's basically been training his whole life to be this pompous, and it's an indicator of personality, and personality is pervasive. It's not a coincidence, like he developed multiple pompous speaking patterns independently. You develop those if you're pompous.
But if he wanted to prove me wrong, that would be wonderful.
Probably my favorite scene from this movie. I enjoyed this movie because the fighting is a little more practical than you generally see in martial arts flicks. Sloped forearms to protect the head and have strikes slide off, and that sort of thing. The kind of stuff you see in MMA.
I think the part with the little girl was supposed to be sad, but the way the guy was holding her and threw her was totally absurd, so I thought it was funny.
Great suplex at around 2:25.
Incidentally, I'll be the first to tell you that I basically don't know shit about guitars and guitar gear, but these DR Pure Blues strings I put on my electric guitar to replace whatever it was stringed with, stock, sound great. It's like I'm getting free reverb, unamplified. I think they're thicker, though, at least on the high strings. I used to be able to bend them into next week. I can still get a full tone bend on the new strings, probably not a tone and a half, but it's definitely more work.
On any given day, I add about a brazillion articles and videos to my queue of shit to read and watch, and get through maybe a third, and the ones I don't get to nag at me from open tabs that also bog down my computer. I think it's bad for productivity.
I think I'm going to start just dedicating one day a week or every other week where I just read/watch them, and don't even try to get any coding work done. I source a lot of the stuff from r/programming, though, and I'm still going to have to keep an eye on it just because of the nature of reddit, but I'll just queue it, and ignore it.
I wrote a post a while back about categorization and tagging, and how tagging is awesome, but immature. I don't have that much to add, but wanted to document some thoughts I had about it today.
One of the problems with tagging (and categorization) is context. If I write a long rambling post that jumps from topic to topic, the post could end up with a lot of tags. What I think would be smarter is if sections of the post had tags, and you could use them to quickly search for what drew you to the post. Maybe even on a per paragraph basis. Kind of like a book index, without being horrible, and needing to be manually compiled.
Document outlines compiled via headers and stuff is already a thing in HTML. Extending it to tags shouldn't be too hard. I have to think about it some more before I can figure out a good way to implement.
Today, I also looked into accessing user hardware with JS, via getUserMedia (new HTML5 shit), and interfacing it with the Web Audio API. This article was particularly informative.
I was looking into it because I want to tie it into this fretboard thing I coded a while back, to help me learn guitar. The cable that comes with Rocksmith just works as a USB mic when you plug it into a computer, which is handy if you want to do some recording, without worrying about background noise and whatnot. Having put more time into Rocksmith, unlocking all of the mini games, and doing all of the technique challenges, I can say there are some holes, and I'd like to code some exercises for myself to fill them. Specifically, off the top of my head, arpeggios, higher order chords, and chord transition drills over a limited set of chords. I'd also love to incorporate a sheet music or tablature parser, and do up a Rocksmith-esque interface with Three.js, but one thing at a time. For now, this is all on the back burner, until that bridge between getUserMedia and Web Audio is up.
It's been a long time between publishing. I had started one post, and then another long one, and I didn't want to push it to my server until I'd finished both. This is a problem with a flat file like this. I need to get some CMS action going.
Right now I'm struggling a little bit with a Chrome extension that I'm writing to save tab groups. I don't know how much it's the case for other kinds of work, but when you write code in a lot of different languages, or with different frameworks, it's impossible to memorize everything involved, so you use a lot of reference material. On any given project, I'll usually have something like 5-10 tabs open for different function references and stuff.
This creates a problem when you're working on a few things at once and you have like 40+ tabs open and it bogs down your system. Having a simple way to save a group, and restore it later would be great.
Right now I'm dealing with some issues where JQuery UI Sortables and Droppables don't interact very well. That is, I have group headings with collapse/expand controls, and tab lists, which are sortable, but I want to move tabs from group to group. I originally had the tab lists connected, but the behavior was buggy. The placeholders weren't placing themselves correctly. I suspect this might be another Chrome issue. I might end up making a fixed window size, with a 100% div with a scrollbar to sidestep these problems.
Feelings and Crap
Jay threw a party at his place this weekend. Barbecue, booze, fun, games, good people. I spent probably most of my time there making french fries, in a tiny deep fryer, which took forever, because I fry twice, and I'd prepped 5 lbs. of potatoes. I'd brought a large fryer, but we were using fat from a brisket, and it takes a gallon to use my fryer, and there wasn't enough. I'm okay with this. It's difficult to be a good host when you're stuck in the kitchen, and it's also difficult to prep everything ahead of time so you don't get stuck in the kitchen. Jay got to spend time with his guests. Everyone got to enjoy some tasty fries. All 5 lbs. were eaten. No regrets.
When the party was winding down, most of the people gone, Tae played the Da Woo game. Named after a friend of ours from high school, who threw a going away party in the Korean embassy. In a room full of Korean national treasures, and probably around 30 drunk high school kids, the night came to a head in an amazing spectacle where our friend went around the room, one person at a time, saying something nice about everyone there, and talked about the good times they had. It took forever. But it was also pretty touching, but also at times very awkward, insomuch as not everyone there was close to him, so he said things like, "I don't really know you, but I always thought you had cool hair." Also, I'd imagine a lot of people had to go to the bathroom really badly, but didn't want to do it in the middle of it.
So Tae had been drinking a lot of beer, soju, and I think some bourbon, and he does this for a much smaller group of people, but I think it took around an hour or better. Tae took it a step further by giving his opinions on current career situations, and financial advice, and in situations where he didn't know people that well, he forcefully got to know them on the spot, including career details. He asked questions like, "What do you really do?," and, "How do you justify your position?"
Tae also said things like, "I appreciate you, and the idea of you," and threw around a lot of general praise and told people he loved them, which managed to seem sincere in spite of his state, at least to me. He told me I was the smartest guy he knew, which was really flattering considering how smart I think all of my friends are, and my mutual friends with Tae in particular.
There are a lot of different kinds of drunks. Jay gets super excited about everything, and will often say one thing over and over. He will also make statements like, "You're pretty much nacho head." And he sssslurss like a motherfucker. Tae remains articulate and well composed, but is more prone to being insistent and will draw more attention to himself than usual. In many cases, though, people will use a lack of sobriety as an excuse to talk about their feelings and crap. I think this is okay, but I can remember a time before alcohol, when people would talk about their feelings and crap while sober, but now, I think it almost exclusively happens when sloshed. This is what bothers me.
I think it's entirely possible that it's just a phase. Maybe it takes a certain amount of naivety or a certain amount of emotional maturity to speak about your feelings in earnest without a disinhibitor, and this is just the downturn where my contemporaries have a hard time managing it. I think in many cases, the comfort of a spouse is as an exclusive emotional outlet, when you try to hide those facets of yourself from other people.
Personally, I think it's dumb, and a good way to waste your limited lifespan. I will talk to almost complete strangers about my feelings, and my opinions on touchy subjects, and I think it's a good way to accelerate past the quagmire of acquaintanceship. When you open up to someone, they're very likely to reciprocate, and you can develop a deep bond quickly, or decide that you're not interested in pursuing it further, quickly.
By the same token, if you wait until some traumatic crap happens before you tell someone you love and appreciate them, like they're on their deathbed, you're an asshole. Think of how much happier they'd be throughout their life if they knew that.
I like to tell the people I love that I love them, and why as often as is reasonably possible. Incidentally, I don't believe in unconditional love, so there's always a why. This isn't the same as saying that I only love people if they do things for me or give me things. But if I love you, it's because you do things that I appreciate on some level. I love Crystal's overwhelming compassion for animals, which really doesn't affect me much personally, but I think compassion is contagious, and it makes the world a better place for everyone. If it was something she lost, I straight up wouldn't love her as much. It's a condition, and I think it's fair. Actual unconditional love would be meaningless.
Crystal recently injured her shoulder because of a fall she took exiting a pet store with a step down. She has a case to sue them, and we could use the money for her treatment and whatnot, but she refuses to pursue it because it would be a detriment to the rescued animals that they shelter there. I think that's wonderful.
Fix Your Sign
Drove past a Men's Wearhouse today, but the W on their sign was unlit, so it looked like it said, "MENS EARHOUSE". Can you imagine?
I don't know how it is for most people, but since I think about the design and usability of things, I think about the design and usability of everything.
For the record, I love the Korean soup spoon, and I hate the Chinese soup spoon. Maybe it's ignorance from not eating Chinese food all my life, I can appreciate that the nature of Chinese soups is different from Korean soups, but I basically don't like anything about the Chinese soup spoon. To establish the proper context to appreciate how shitty it is, though, let's look at the Korean one first.
In brief, it's very round, shallow, on the end of a long handle, and made out of metal, which is thin at the head. Korean soup is very strongly flavored, generally served very hot, and generally communal. That all considered, the design of the spoon is basically perfect. The long handle part is obvious. Communal soup bowl means you need to reach across the table to fill your spoon. The fact that the head is round, shallow and conductive all lends itself to rapidly cooling the soup down so you can eat it. The shape and material give it as much surface area as possible, and allow it to cool from all sides. The head of the spoon is small enough to comfortably fit into your mouth, and it's also got an easy angle to sip from. The thin head material makes it possible to get all but a few drops of soup from the bottom of the bowl.
In terms of drawbacks, these aren't great for drinking large volumes of soup, because of their low capacity. Since Korean soups are so strongly flavored, this isn't much of an issue. You have a little bit with your rice and it balances well. Also, the straight handle and head profile makes it difficult to access deep areas of a bowl without tilting the bowl, but by the time you're doing that deep, your soup should be cool and light enough to handle the bowl easily. I don't think this is a big problem.
The Chinese soup spoon is very large, generally ceramic (sometimes plastic), with a fairly high eccentricity, with steep sides. The fact that it's deep, huge, and made out of an insulator means you will basically have to blow on it forever to cool your soup down enough to actually eat it. The ceramic material also means that it's thick, and combined with its blocky shape make it awful at getting soup out of the bottom of a bowl. If it's a communal bowl, and you can't just put it to your mouth to drink from it, you can just abandon all hope of finishing your soup. The handle of Chinese soup spoons is a trough, and short. This makes it fantastically easy to let go of your spoon for a second and have it just sink into your soup. The trough shape of the handle makes it really annoying to clean off if that does happen.
If you're using it for something that isn't strictly a liquid, the spoon is too large and too deep to reasonably get the spoon into your mouth, so you generally end up using it in conjunction with chopsticks, to shovel food out of it. It's difficult to put into words how stupid I think this is. Assuming you're doing this, though, the spoon is also awful at scooping things off of a plate, because of the thick sides. It's a lot like using a dust pan that won't lay flat. Maybe I'd be less annoyed about this if Chinese food didn't use medium-long grain rice, as opposed to short grain sticky rice, which you can just pick up in clumps, even with chopsticks.
In my lifetime, I've played a lot of video games. I haven't taken a lot of time to reflect on many of them, but looking back, it makes me a little sad that so many of the games I've played and beat, I only finished for the sake of finishing them, or to see the end of the story. It's a rare and beautiful thing when you play a game, reach the end, and wish you could keep going because the gameplay itself is inherently rewarding.
Off the top of my head, I wish there was more Braid than there was. Playing that game made me feel like I was getting smarter, and I looked forward to every new level as I played through, and every new world with a new mechanic.
What made Braid so strong for me was that there was so little repetition. It introduced a concept, explored what could be done with it, and moved on. At no point during the game, do you feel like, "Oh, blah. Another one of those puzzles ...," with the possible exception of the boss fights. I believe my issue with those was more specifically related to their placement. By the time you got to them, you've already become so accustomed to the world's mechanic that the solution is obvious, and you just feel like you're going through the motions of executing it.
In contrast, most games I play, I consult GameFAQs straight away. It's part that there are so many good big budget games being released, and other obligations, I don't have the time to explore as fully as I did. Sometimes there are missable items, and I don't want to be forced to play through again. But mostly, it's an issue of shit game design.
Contemporary RPGs, for example, have these bullshit crafting systems, almost standard issue. They're recipe-based, and may be somewhat intuitive (e.g. combine two healing items to make a stronger healing item), but there aren't any guarantees, because they're generally not rule-based. Where it stops being intuitive, and where you must know a recipe is totally arbitrary. I'm not sure when it became a common practice, but the producers of these games advertise these deep crafting systems as a selling point. I wonder who really likes these. The fact that it basically makes it necessary for me to play with a reference table open makes me hate them.
Crafting can be done well, but it's rare. An example from a game I've played recently is Persona 4. Rather than your standard RPG leveling, where getting experience translates into improved stats, Persona 4 allows you to craft higher level personas. Your active persona determines your character stats, elemental affinities and weaknesses, and available skills. At any point, you have several of these available to you, and you will have to switch them up as the situation demands.
The crafting system has rules, though, and you can learn these, intuit how to take advantage of them, and develop mastery. It's not perfect, but it's worlds better than the systems in most games.
Just to be specific, skills are inherited from component personas to the fused persona, and which ones are inherited are random, but certain types of skills are impossible to inherit, and certain types are more likely. This means that when you want to fuse a persona with specific skills, you have to use the right components, and then you basically have to roll the fusion over and over until you get what you want. To increase your odds, you can fuse versions of the component personas with junk skills that can't be inherited, and try to get redundant skills on the components to maximize the odds they'll be inherited.
Still, even if you have perfectly crafted components, for a persona that you want to have very specific skills, you can find yourself rerolling the persona for like half an hour. This is stupid, bad design. The people who really want those great skills will roll forever, and you're just wasting their time, and these are the people who would otherwise really love your game. Even if they did a straight purchase using money in the game, and they have to farm for the cash, they're at least playing the game. My spending hours to make one good persona translates to pure resentment. I'm mashing buttons, reading skill lists, and repeating, and hating every second of it.
The designer of the system could have designed in a trade off, where skills have certain weights, and a persona only has a certain capacity, with a reducing multiplier for skills it has an affinity for. Or just leave the trade off out, and let me pick whatever skills I want, so it's the same system, but I'm not trading off my time.
I guess the root of this is, I hate dice. This is especially true in board games, but I have a general distaste for randomness in games. I think 99% of the time, it can be designed out, and you'll have a better game for it, where people don't feel cheated. I'll write about that another time.
There's a Szechuan restaurant that I like in Flushing (Szechuan Gourmet) that makes this fried shrimp that I really enjoy. It's deep fried with some dried chiles, Szechuan peppercorns, and a bunch of other spices, and just comes out on a bed of that stuff. It seems to be floured, and fried with the shell on. Since it's fried, I just eat the whole shrimp, shell, legs, head and all. I can take or leave mapo tofu and other szechuan classics, but I get that shrimp without fail whenever I go there.
Inspired by that, the Superbowl, and some Modern Marvels episode that I saw recently, I decided to make some hot sauce. I used fresh red chiles, just because I had them. If I didn't, I'd have reconstituted some dried tien tsin chiles, and used those. I sweated some garlic and shallots, added the chiles, and cooked it all together with whole cumin, coriander, szechuan peppercorns, star anise, salt, pepper and plain white vinegar. If I had some on hand, I'd have used rice wine vinegar. I threw it all in the blender after cooking for a while, and passed it through a fine mesh strainer. Mixed it with some butter, and tossed some fried wings in it.
The flavor was very good, but it could have taken a lot more heat, due in part to the numbing effect of szechuan peppercorns. I'd seeded the chiles, and it turns out that I could have skipped that, and will in the future.
2/2/2012 - 2:37pm
Recently, some of my friends were considering going to a Skrillex concert, and I was like, "What's a Skrillex?," to which Jay responded, "Dubstep," and I was mostly trolling, but I replied, "What's a dubstep? Is that sexual position?"
But I like to do this sometimes. Make people explain what something is. I find it particularly entertaining for musical genres or subgenres, because it's invariably nonsense.
Jay: But yeah, all I know is that people apparently get mad when you call Skrillex dubstep.
Jay: It's got dubstep elements, but it's got shit that makes it accessible to people who like it when their music doesn't sound like nonsense all the time.
Jay: I think you're supposed to call it electro-house or something.
What the fuck does that mean?
I think that things are what they are and that oldschool strict categorization is basically pointless. I'm talking about things like hierarchical categories, like putting things into folders on your computer.
I can see a case for it in cases where lineage plays a role, like biological classification, but for the general organization of data, it misses the point.
In programming, you deal a lot with different kinds of data structures, and different structures prioritize different things. Sometimes you just want to be able to store as quickly as possible. Sometimes you want to access as quickly as possible. Sometimes you want to store in the smallest amount of space. For a computer, these differences are significant. For a person, none of it really matters.
Why does a person organize their belongings?
So they can find them easily when they need them.
Why are most people so disorganized?
Because physical organization schemes need to be stupendously rigorous to be effective, with context sensitive subschemes, and there are space constraints. Imagine if you could put every one of your belongings on a hanger, and have them all set up on a dry cleaner's carousel. Probably, you'd still have a hard time finding your stuff, because you'd probably try to organize by category, and we don't think in categories. If I have a hacksaw, I don't think Tools -> Cutting -> Saws -> Hacksaws -> Stanley -> 18 inch (This could just as easily be organized as Tools -> Stanley -> Cutting -> Saws -> Hacksaws, etc. and be just as valid). What happens if you don't remember the brand of the saw? Now you have to look in the group for every different brand. What if you're in someone else's system, and you don't even know what a hacksaw is?
I think in terms of its attributes. I probably think of it as "that hacksaw, with the yellow handle".
Now imagine if you had a computerized catalog of your things on the carousel, and could multiple index by tagging them. Now instead of digging through a semi-arbitrary hierarchy, you can do things like just search for things by name. Or you could be looking for a yellow saw, which you've tagged as "yellow" and "tool", or "yellow" and "saw", and you probably only have a couple of yellow tools (or a few more if you like DeWalt). You'd be able to find your things almost instantly, because tagging is about attributes, and attributes are how you index things in your head.
Now you're probably picturing someone you know.
Now you're probably picturing someone else. This time, the qualifiers are in the opposite order (ethnicity then size vs. size then ethnicity), and it works just as well.
Categories are names for sets of attributes. They can be a useful shorthand when you're always dealing with the same kinds of things, and talking to someone who does also, but in any other situation, they're a stumbling block. If I ask what kind of music someone performs and you tell me dubstep, and I've never heard of it, there's nothing in there that's useful information. If you listed the attributes of the music, I could immediately draw connections to things I've heard with similar attributes, and have an idea of what I could expect.
The idea of tag collections as their own tags is something that's worth exploring, though. There are also a lot of practical problems with tags that I've never seen handled well, particularly in visualization (tag clouds aren't actually good), and crowdsourcing. When the general public has the power to tag things, it opens the door to boredom tagging, and SEO assholery.
Yo Dawg, I Heard You Like Caffeine
1/27/2012 - 2:39am
FYI, cold black coffee mixes pretty well with diet cherry colas. I've done it with Diet Cherry Pepsi, and Cherry Coke Zero, and I like them both. (Post title was Jay's response when I told him about this)
1/26/2012 - 12:24pm
This article about making programming fun and games sounds like a pretty bad idea. Competition is a good motivator for some people. It's fucking terrible for others. If the scores have any weight, I can also see people sabotaging each other. I also agree that more code is a really lousy metric.
A programmer's job is primarily to think about problems and come up with solutions. The fact that they write code at all is really just a bonus. Code volume means nothing. Any idiot can write 10,000 lines of code. The programmer's actual job is knowing which lines to write.
I think a better idea is to have the software designer come up with the interface for a class, secret unit tests for it, and then have a bounty board, where people could compete to implement it in a simple pluggable way, with strict quantifiable metrics. This could be company internal or whatever. The bounty can be adjusted to the difficulty and importance of a task, and probably translate to a cash bonus of some sort.
If you don't keep a running score, non-competitives can compete comfortably and enjoy the rewards. I just think a company scoreboard would make some people feel like shit and hurt overall morale.
1/26/2012 - 5:03am
Unity's HUD interface is interesting. Reminds me of OS X's Spotlight, but more fleshed out with app specific options, and processing commands rather than just accessing files. I'm not sure it's strictly better than traditional menus, but it's at least something different. The article touches a few times on how menus give you a nice overview of what options are available, and doesn't really offer a solution for that when you use the HUD.
Incidentally, I'd forgotten how much Ip Man 2 was Chinese Rocky 4.
Make an Actual Point
1/24/2012 - 8:57pm
If you talk about people having drunk Kool-Aid, you're an asshole.
I Don't Get Art
1/17/2012 - 8:37pm
I'm just going to put it out there.
I thought Secret Sunshine (currently available on streaming Netflix) was a shitty movie. I was prepared for your standard Korean drama tropes. People eating. Violins. Nobody being happy. People eating. But they forgot to include revenge. Revenge was replaced with countless pointless scenes, and the shittiest of art school endings.
Somehow, the movie is very highly reviewed.
I waited about 2 hours before I gave up on it culminating in a revenge plot. After that point, I could only imagine what kind of amazing ending would make the movie acceptable. I decided that the only way to salvage it would have been to make her head explode when she was eating those apples, and kind of looking like her head was about to explode.
1/17/2012 - 2:45am
I wouldn't say I drink a lot of coffee, but I do drink a moderate amount when I feel compelled to be sharper than usual. This generally means project crunch times, which I try to avoid as much as possible, because quality of work generally suffers, as does quality of life for that matter. It's a lot better to put in consistent effort, where you're well rested, and not neglecting other aspects of your life. You'll find you're really working when you're working, and really doing other things, when you're doing other things. The 8 hour standard workday is basically retarded. When I'm really pumped doing foundational work on a project with rapid progress, I can focus for 8 hours straight, sometimes up to 18 or so. But on a regular basis? Or when I'm banging my head against a really frustrating problem? Absolutely no way.
Historically, I've generally had a policy of avoiding caffeine, so I had a solid baseline mental sharpness and could reliably use caffeine for an actual boost, rather than upkeep. That said, I try to keep use irregular. I started drinking more of it when I noticed that I was doing better at KenKen (If you have an iPhone, I recommend KenKen Pro by a wide margin over the other versions available, primarily on account of better interface. I think I paid $15 for it, and it's $2 now. For the hours of satisfying entertainment I've gotten out of it, I'd have been happy paying more, still). I believe I was working on some expert level 7x7s that had me stuck, and I bought an iced coffee from Dunkin Donuts on a lark, and I finished something like 5 puzzles that I'd been stumped on for weeks.
As an aside, I love KenKen. As you get better at them, you really feel like you're getting smarter. I never got that out of Sudoku, where I felt there was more tedium, guessing and checking possibilities. With KenKen, I feel like a detective, using mathematical techniques for deduction. I only guess and check when I can narrow something down to two possibilities, and I'm totally stumped otherwise, which has only happened a small handful of times over hundreds of puzzles.
There are just a few notes I wanted to get out there about coffee and brewing. More brewing. I'm not going to pretend to be an expert on bean sourcing, or that I taste/smell blackberries or mahogany or anything. I will say that I drink my coffee black and unsweetened, which makes me a harsher than normal critic of the quality of coffee.
I own a Bunn, which I highly recommend over other types of drip coffee machines. Bunns use a system with a heat regulated water reservoir, with a gravity displacement system, so the amount of water you put in is what you get out, and it's all a consistent temperature. Consistency is important.
The standard drip machine uses a system where water is heated to boiling, and pushed up a tube that runs through the cold water reservoir which causes it to condense and cool somewhat, at which point it's immediately deposited onto your coffee grounds. Depending on the volume of water you start with, its temperature, and things like machine geometry, you can have wildly different results. Most of which are unacceptable.
With our old machine, I couldn't drink my coffee black, because it overextracted all the damn time and it was bitter as hell. If you find that your coffee machine is brewing bitter coffee, it's just going to do that all the time, because it's extracting too much from the beans. It's generally not an issue of you using too much coffee, or the roast being too dark. It's mostly your water being too hot, or brewing too slowly, so undesirables are extracted out of it. If you can't drink your coffee without creamer and/or sweetener, you're probably fucking up at brew time.
The Bunn system actually reminds me a lot of the system we use when we brew beer. We've got a pot with water that we hold at a specific strike temperature, which will raise our hydrated grain temperature to a specific point that's ideal for extracting the sugars we converted from starch without extracting bitter tannins and such from the grain. The inflow (sparge) and outflow (lauter) rates from the grain pot are significant and need to be controlled.
The grain bed when brewing beer is actually important because it acts as a filtration mechanism as liquid passes through it, and the depth of grain and how well settled it is affects the rate of extraction. A deeper grain bed will filter more, and slow down extraction. A more shallow grain bed will tend to brew too quickly, and your brew will be underextracted (and generally more cloudy with particulates). Because of this, I never brew less than a full pot of coffee, because under-extraction isn't any good either (Makes for sour coffee, because acidic components are some of the quickest to be extracted, followed by sweet and bitter components, which would have balanced out the acid, that are extracted later).
It's also important how the inflow is introduced to the grain bed. In brewing, hot water is sprinkled over the grain bed as evenly as possible, to prevent high pressure water from channeling through the bed, creating low resistance tunnels that water can rapidly pass through. Channeling will pull in a lot of small particles, and make your extraction too fast, causing underextraction. My Bunn has a shower head sort of diffuser to spread the hot water over the coffee grounds (I believe you can also call them up and request a lower flow head). I'm not sure if that's normal on other drip machines, but I thought it was worth mentioning.
A lot of people, at the start of a new year, will go on crazy diets and get gym memberships and exercise equipment. A lot of those same people will promptly be off their diets, and not exercising by the end of January. Or perhaps worse, their diet and exercise program will work in the short run, they'll reach their goal weight, and then immediately gain it all back.
The intention and initiative is admirable, but ultimately, I think dieting is stupid, and not the right way to look at the problem. Instead of being like, "I'm going to eat healthy," people should be thinking, "I'm going to eat food," as opposed to, "I'm going to eat total crap," and eating a reasonable amount of either should go without saying. When you're describing your target food as "healthy", you're giving it a qualifier that differentiates it from normal. If your healthy food isn't your normal, it won't stick. Whatever weight you're holding is a result of your lifestyle, and if you want to become and then stay thin and strong, your lifestyle has to reflect that.
Too often, people try to make drastic changes to their diet, and they can't sustain it. They hit their goal weight, and they want to eat whatever they wanted to eat before. It's a lot easier to portion control than it is to cut things out completely, and ultimately, I think it's better for you. People will cut potatoes totally out of their diets, and they're cutting out a super versatile, nutritious, cheap ingredient. What are you going to eat instead that replaces all the potassium and B6 you were getting from potatoes?
Most people don't know the first thing about nutrition, and don't think past cutting out carbs, or whatever kind of screwing with macro nutrient ratios, which are easier to think about. Honestly, I think people as a whole don't have a good handle on nutrition, nutritionists included. Bodies are complicated, and long term studies are difficult, and I think acting like you understand it is fundamentally dishonest. The FDA flip flops its position on basic staples all the damn time.
Personally, I think a diverse diet, with everything in moderation, is the safest bet. When in doubt, I try to eat more peasant foods, like rice and beans, fish, and vegetable heavy stuff, which is basically all traditional Korean food. I think tradition for the sake of tradition is stupid, but in terms of food, there's self evident value there. If it didn't work, those cultures couldn't thrive and develop.
Health is maintenance, and requires diligence if you're prone to unhealthy behavior. It's not a fix you apply periodically. This is something I hate about Western medicine. There's so much focus on treatment of symptoms, and not enough on prevention, and dealing with underlying causes. There is, of course, financial incentive to keep people from being actually healthy if you sell treatment, though.
This wasn't what I wanted to get into.
Since the turn of the year, I've been doing almost non-stop technical reading, and lecture watching. Unlike yo-yo dieting, knowledge and skill development sticks with you. Short of not applying the things you learn and forgetting them, there isn't really a way to fuck it up. I recommend this. Taking care of your health is year-round, but picking up new skills is okay to do as an injection.
So I've been accessing my strengths and weaknesses, and catching up on maintenance reading that's just necessary to work on the web.
A friend of mine recently quit his job at Google, and wanted to do a project to fill the time, which could potentially turn into an income stream, or just account for his time if he were to be asked by a future potential employer. Just prior, Google gutted all of the good stuff out of Google Reader, trying to funnel more people into using Google+. We started working on an RSS reader, with him working on the server side (Ruby on Rails and Sinatra with MongoDB), and me working on the front end. We were using Git and BitBucket, and deploying to Heroku.
The project's currently in limbo. My friend wasn't really ready to deal with working from home and the discipline that it requires. I might pick it up later if HiveMined doesn't pan out well. It's being developed as a direct replacement for Google Reader. Design seems to be a clear rip off, with no enhancements.
In my freelance work, I'm pretty much invariably the sole developer, working full stack, server and client-side. I'm also almost always working on smaller projects, rather than big applications. As such, I've been able to get away with a lot in terms of shoddy documentation, hand-coding everything instead of using frameworks that would help with productivity, and no rigorous version control.
Distributed version control is a big development in the past few years for software development, and makes it a lot easier to have a lot of people working on the same codebase without constantly bumping heads. Before they get into pitching their specific product, this video has a pretty decent overview of what DVCS is about: Fog Creek Kiln
Not knowing how to work with DVC is a big weakness for a programmer, and has been the focus of a lot of my reading and research this past week. I looked into Git and Mercurial, and there are compelling arguments for both, but Git seems to be more widely used, and that's a good reason to learn it by itself. You could make arguments about Esperanto being a better language than English, but more people know English, so it's a more worthwhile communication tool, even if it's totally inferior in terms of expressiveness (I don't know if it is). I've decided to focus on learning Git, and adopting this workflow for future projects. I'll try Mercurial at some later date, just to be fair.
I've worked with Git just a little bit already, and hacking out a feature and documenting the changes has been a nice way to keep focused and productive. It helped that the project was interesting, though. I get bored easily.
The way I generally like to write my classes is more or less like this:
this.publicProperty = publicProperty;
this.someMethod = someMethod; //Makes it public
For simpler projects, this works fine, and keeps things tidy, and keeps me from having to write this.whatever every time I want to access a property from within a method, but all of the private properties don't get inherited. I've tried a lot of different approaches, from some of the best minds in the JS world, but they all feel dirty. Just not in the spirit of the language.
I'm principally opposed to using a shim to make one language act like a different language. I do use JQuery, but I think if anything that makes JS act more like JS. Insomuch as monads are pretty dope, and easy to implement in JS, and more people should use them. I have to think about it. Maybe I can use monads as decorators and work OOP that way.
I've been reading into Responsive Design. As the web becomes more ubiquitous, this is clearly the future, and I'm annoyed with myself for not learning about it sooner. Currently reading Marcotte's book on the same topic, from A Book Apart. I like the idea of concise books, and appreciate that they're written by the foremost experts on these topics, rather than just some douche who wants to cash in on new trends. I think they're a little on the expensive side, though.
Another problem is that I stopped blogging. So this is how I remedy that. Blogging always gave me a certain amount of accountability to make progress. I stopped at some point, because I was attempting to take a break while I designed and built some monolithic perfect system. So I researched everything, had a lot of conflicting information, and just let it paralyze me. Thinking I'd jump back on the wagon when I had a big chunk of free time that never came. Instead, I should have been doing small iterations all the time.
Now I'm starting from scratch like I did in 2000 or so, when I was first learning HTML, just writing all of my markup by hand for now, and I'll add features as I see fit. I'll probably end up using Django for the backend, as I'm partial to Python, and wish I had more excuses to code in it.
I have a lot of old post stubs that I never published. Getting that writing done is probably my first priority before the code development. Fancy engine's no good without content. I am a usability focused guy, and as I add features, I intend to focus on the whys of the design, and try to create better versions of everything. Comments, navigation, and everything else. As granular as possible.
For the record, I hate modern blogging, and circlejerk blogs about blogging, and stupid top 5 list blog posts that serve no purpose other than to drive traffic by appealing to people with short attention spans who want a quick bite of entertainment and want to have opinions spoon fed to them. This blog started as a way for me to document my progress and keep in touch with my friends when I was interning at CentrPort, out of state, and learning a few new languages and techs. I intend to continue in that vein. This blog will be at times inappropriately personal, rife with opinions and justifications for them, and crap I find interesting, or entertaining. I will swear a lot, I will talk about good things I find, and I will document experiments I run in code, cooking, brewing, or anywhere else.
Incidentally, my buddy Jay says he had good success brewing coffee with Korean roasted barley tea.