Wednesday, June 26, 2013

Why I'm Giving up on Ivy (For This Project)

I have been spending a lot of my free time the last few months working on a card game for Android. By free time, I don't just mean "time when I am not at work," I mean "time while the baby is asleep, everything around the house that needs to be done is done, and I have not other social or family obligations to attend to." I have made a point to make time every week to work on it, but so far my best week has still been less than 10 hours of development time. Needless to say, I am looking for fast solutions to my programming problems, hence part of the reason I have chosen Ivy.

At work, I am a Maven guy. I was introduced to Ivy a couple of months ago by a consultant from Vaadin that visited the company I work for. What I liked about it was how easily it integrates with Eclipse, and how quickly you can pull in dependencies. I especially liked that I could pull in dependencies from the Maven repository, which I was already familiar with. A simple ivy.xml file has significantly less lines than a simple pom.xml file. At the time it seemed perfect for my goals, and for the first few weeks that I used it, I thought it was great.

Problems arose once I decided to split my application into two projects. I mostly did this for ease of testing, and because wrestling with the ADT plugin over what JUnit library I wanted to run my unit tests in somehow caused my Eclipse to break in a way that I couldn't figure out for a couple of days and eventually involved deleting my workspace and re-importing all my code in to fix. When I split my code into an Android project and a core project, I remember thinking "No problem, it should be a breeze to import my core project into my Android project with Ivy, cause Ivy's so simple!" Wrong. Let me share the issues I had while trying to achieve this that have led to me giving up on Ivy for this project.

1. Ivy Documentation - There are many complaints about the documentation for Ivy on the inter webs. In truth I thought the documentation was organized well. What makes it difficult to understand is that it is obviously written by somebody to whom English is a second language (at least, I hope that's the excuse!). At the time, I felt like this just comes with the territory of software development these days, and a documenter's ability to write in fluent English is not necessarily an indicator of how helpful the library is going to be. But now the dam is broken and the critiques are flowing. I frequently had to read sentences in the documentation multiple times to understand what was being stated.

2. ANT - Yeah, I should have seen this coming. During my honeymoon with Ivy, I found it so easy to use that I forgot it was a dependency management tool built for Ant. I wasn't thrilled about learning some Ant essentials to build my artifacts, but I had some experience and figured it was a good job skill to learn (although, I think I may have once lost out on a job opportunity partially because my one question for the interviewer during the "do you have any questions for me" section was "why are you guys still using Ant?"). A couple of friends who I complained to about this problem suggested that I use Maven to build my core jar, and import it with Ivy, but I felt dirty just thinking about that, and felt that I should use either one dependency management tool or another.

3. No SNAPSHOTS - This is where the love affair started to end. After getting my core library into my android project, and making my first change to the core library, I built my core again, and resolved my android project and.... my changes weren't pulled in. It turns out by default Ivy will not update a project, or your local cache if there is no change to the revision number. Their expectation is that for every change you make, a new artifact should be created, with a new version number. At least, that's what these paragraphs from their documentation suggest:
To optimize the dependency resolution and the way the cache is used, Ivy assumes by default that a revision never changes. So once Ivy has a module in its cache (metadata and artifacts), it trusts the cache and does not even query the repository. This optimization is very useful in most cases, and causes no problem as long as you respect this paradigm: a revision never changes. Besides performance, there are several good reasons to follow this principle... 
Some people, especially those coming from maven 2 land, like to use one special revision to handle often updated modules. In maven 2 this is called a SNAPSHOT version, and some argue that it helps save disk space to keep only one version for the high number of intermediary builds you can make whilst developing.
It then goes on to describe a property that can be added to your tags to make this work they way people from "maven 2 land" would expect it... which leads into my next point.

4. Ivy  Certainly Does Not Feel Simple - Looking back at the Ivy Home Page, it reads "Apache Ivy is a popular dependency manager focusing on flexibility and simplicity." Flexibility? Yes. There seems to be configurations for everything. Heck Ant itself feels like you're just writing a shell script in xml format. Simplicity I feel I have to disagree with. This being said, I'm not sure if a dependency management tool CAN be simple. Maven is no simple tool itself, and I recall spending plenty of hours, including weekends trying to get projects to build. Of course, at the time I was a junior developer who had never used a dependency management tool in my life. There are a lot of things that Maven does for you automatically that have to be configured in Ivy. By the time I read that in order to get my locally built artifacts to reload each time I resolve I would have to add and extra configuration, I had already had to write special configuration for things that work automatically (if not very easily) in Maven. This includes writing a special resolver in yet another xml file for resolving locally built projects (just happens in Maven), and writing up a publish task in my build.xml file to define how an artifact should be published, after writing up how to build the jar file (Maven just DOES this. It builds a jar for you and publishes it using the groupId and artifactId. And if the default way to built that jar is not to your liking, THEN you can configure it with the jar-plugin).

5. And Then There Were Source Jars...- The final straw for me was tonight when I pressed my trusty "F3" button while selecting a method from my core library. I of course expected to be taken to the source of that method, but was instead shown one of the coding equivalents of the dog from Duck Hunt laughing at you; The Source Not Found page. Oh, and no "Attach Source" button, with a brief message saying it's Ivy's fault you can't attach your own source. I spent the rest of my night looking up and reading multiple Stack Overflow questions from multiple people having similar issues on how to publish and then resolve a jar with a source classifier on it. At some point, this led me to my final reason for dropping Ivy for this project.

6. I Don't Know Ivy - Let's be honest, I hate it when people complain about a tool because they can't figure it out. Sometimes, that's not always the tool's fault. The real reason Ivy is not working for me is because I don't know it.  I could learn Ivy, but since my goal is to develop quickly, my investment in learning Ivy and Ant has long exceeded the time I was willing to budget for setting up dependency management. Later this week I will set it up using Maven because I know it, and am proficient with it (I probably could have set it up in less time then it took me to write this post).

With that thought in mind, I guess it's worth considering who Ivy is written for. I'm sure I will be corrected if I am wrong, but my understanding is that first there was Ant, then there was Maven, and then there was Ivy. I've seen some complaints about Maven, and I'm assuming that there were some long time Ant users who felt that Maven was too auto-magical for them and continued to use Ant. And now Ivy has been written for Ant users. If I'm correct in thinking this way... well, I'm not an Ant user, so I (currently) have not need to use Ivy. Maven works for my needs, and I'm more familiar with it.

I also think it's worth mentioning that I think Ivy is great for single project applications. I have every intention of continuing to use Ivy for proof of concept applications where I just need to throw together a quick, small app. As familiar as I am with Maven, I still feel it's a little verbose for small applications.

So, I tried to be as honest and fair as my experiences with Ivy could allow. Feel free to disagree in the comments, and let me know my level of ignorance for choosing to turn away from Ivy for dependency management.

Saturday, May 18, 2013

Disabling Start Up Applications

This is a little trick that I've recently re-come across. I found this a few yeas back, but whenever I need it (usually when I am trying to fix somebody else's computer) I can never remember it. When I Google for "how to disable applications on start up" the only trick I can find is to remove them from the Start Up folder in the Start Menu. I'll post this here so I can always know at least one place I can find it, and hopefully others can come across it too.

Start Menu -> Run -> type in "msconfig"
Go to Startup tab
deselect annoying start up applications at your own discretion and to your heart's content.

Sunday, December 18, 2011

Sunday, October 30, 2011

Extreme Pumpkin Carving

If you've never heard of extreme pumpkin carving, this link has some great examples. However, please refrain from looking at it until you've looked at my pumpkin so that mine doesn't look so bad.

I have been wanting to try extreme pumpkin carving since I first saw the infamous Predator Pumpkin, but I've been too scared to try it. I've never sculpted or carved anything before, but I'm content with my first attempt at it.


Now, this might look like the Creature from the Black Lagoon, but it was actually supposed to be Cthulu. Fortunately, my wife and her younger sister inadvertently helped my pumpkin look more like Cthulu with their pumpkins.


Kimberly was going for some weird geometric design that ends up looking like R'lyeh. And in case that didn't make it clear enough that this was Cthulu, the viewer would look at my wife's pumpkin and say "Oh, now I get it, that's Cthulu's flying cat!" Cause if Cthulu was going to have a pet cat, it would have wings.

Below is a couple of views of hastily carved wings and my original concept art.






Ok, now you can go look at that link.

Friday, October 21, 2011

Eliana

click to enlarge.

This is the result of a character design, that I tried to turn into piece that ended up as an experiment and learning experience. I originally drew Eliana as a Dungeons and Dragons character (Eladrin Warlord) for my wife. I thought that if I made her pretty enough and if I created a back story for her that would involve her being a princess that my wife would be willing to play. Fast forward a year later, I hadn't been drawing as much as I would have liked and I kept coming across this drawing. I felt that when people saw it they didn't see what I saw when I looked at it, and I had been wanting to try my hand at digital coloring so I decided to use this one. After months of learning, studying, practicing and a little bit of coloring, I made it to this point. I had originally planned to do more with it, as I tried to add more to the picture, I kind of realized that it's very rare and very difficult to add to a picture an emotion or action that you hadn't originally intended to be there from the start. At least, not once you've arrived at this point, and this is the point I was at when I tried to add more.

Anyway, I really pushed my personal limits coloring Eliana. I tried some things that I had never tried before and I feel very satisfied with the results. I also learned a lot on this one. When I started coloring this image, I thought it was going to be one of my best, and by the time I was halfway through, I decided it was crap and I could do better.

Anyway, I can see some things that I like about this image and some things that kind of bother me, but I am curious to see what others think when they see it. What looks good to you? What do you think could be improved?

Oh, and BTW. One thing I learned a little too late is Web Safe colors. In my opinion, the colors look great on my monitor. But when I look on it on my work monitor all the colors look bland and faded, and the skin looks orange. When I look at it on my wife's iPad, it looks kind of in between. Let me know how they look on your screen, I am hoping they look better on more monitors than not.

Saturday, August 27, 2011

Perfectionism: A Flawed Perspective?

At the beginning of a project at work that had a pretty tight deadline, the Project Manager on the customer's side sent out an email describing the importance of avoiding feature creep. At the end he included a quote that said "Perfect is the enemy of good." I don't have time to write a post going as in depth with this subject as I would like to, but at the least maybe it will spark a discussion, or at least give everyone something to chew on.

In my career, and in my personal projects, I have been thinking a lot recently about perfection, and how inefficient it can be. I have been accused from time to time of being a perfectionist, and recently as I have been trying to increase my efficiency at work, and spreading my free time across multiple personal projects at home, I have been questioning the effectiveness of wasting time being perfect. Today, I accidentally came across this blog post which provided some definition on the abstract ideas floating around in my head on the subject. Ironically, I felt that it clarified to me that some of my least favorite flaws about myself probably come from my inability to recognize when myself or others have done a good job, or even a great job, and move on to the next task, rather then getting hung up, upset, or negative because the job isn't "perfect" by my standards.

I am not trying to vindicate shoddy work. Great work does not have to be perfect. Improvement should still always be sought for. We should always be trying for the best that we are capable of doing. But with a little extra mental effort on our part, we might be able to recognize that the best we are capable of in our social lives, career, or personal projects is not just one absolutely perfect task, but instead accomplish a lot of tasks that we perform very well.


Monday, December 13, 2010

Something to Write About

Last time I wrote a non-technical post, I promised that I would have a cool 3D project to show off. Since then I started school, became overwhelmed with work, class, family and homework, quit school, went into a bit of a slump for a while, created new goals for my life, celebrated by playing way too many video games, and have now finally sat down and started working on my project again.

Unfortunately, I still have nothing to show. But to be able to go through all that and still not have abandoned the project is a good sign for me.

The reason why that's relevant to this post is that during all that time I kept telling myself that I did not want to post again until I could show off something from my project, otherwise, I feared those that read this blog would assume that I've given up on it and would have one more entry to add to the list of projects that I start and never finish. For this reason, I didn't feel I could post anything unless it was Something to Write About.*

Last Friday I found something to write about on my kitchen table, where my wife typically leaves cool things for me to write about when they come in the mail. Fortunately for the sake of a chain reaction process that I like to use for an opener for my blog posts, this something was facing down, and this is all I could see:

The first thing I thought when I saw this was "The new 'Tomb Raider!'", followed by "'Lara Croft Reborn?' Does that mean the rumors are..." followed by "A bow? The rumors WERE true!" I think all my wife heard was *gasp*, *gasp!*, *GASP!*

In case you don't know what rumors I'm talking about, about a year and a half ago the concept art below was supposedly leaked**:




After going through this thought process, I turned the cover over and found myself staring into a mostly unfamiliar face:

The accompanying article, written by Meagan Marie, expertly summarized Crystal Dynamic's reasoning's behind the new direction for the franchise, Lara's new look, and the first few moments of game play. I would highly recommend reading the pre-game play part of the article if you can find it as Meagan - while explaining to us the improvements to Lara's character - makes some good points about what it takes to create an interesting character, rather than just a strong, yet hollow character.

A few notes about Lara's new look:

Brian Horton, the Senior Art Director for Crystal Dynamics says that Lara was redesigned from the inside out, rather then taking the original Lara and trying to fit her into a new perspective. This Lara is meant to be thought of as a character, a person that you can relate to, rather than an untouchable sex symbol. In fact, there is special emphasis in the article that a great deal of time went into Lara's eyes, which they were apparently successful at. From the article; "Eye tracking studies of the new Lara versus the old revealed that instead of looking at Lara's arsenal of curves, most participants spent their time gazing at her piercing brown eyes."

Another interesting change to the franchise is that while it still technically fits under the realm of the action adventure genre, Crystal Dynamics is referring to the game as "action survival." The images that accompany the article are dark, and somewhat disturbing. Bodies hanging upside down in burlap sacs, or strung stigmatically over burning candles. Lara seems to be covered in more blood than her usual dirt, and the descriptions of the ways that Lara can kill or hurt herself within the first fifteen minutes of the game make it apparent that the game will be M rated.

While I'm concerned about the M rating, which may stop me from purchasing the game, the article in Game Informer made Crystal's next installment out to have the characteristics of the types of games I want to support on this blog. I've ignored all the Tomb Raider games before Legends, because they seemed to have little more to offer than... well... a curvy woman in short shorts and a tank top. However, after I played Legends at a friend's house (after I had beaten nearly every other game that he owned), I realized that Chrystal Dynamics was building upon what was already there, and adding something of their own. I always felt that behind each scripted puzzle, there was a sense of freedom and adventure. Behind the death of each human there was a moral, or a warning trying to be made. There was something to be said for the fact that most of the enemies were non-human. Unfortunately these contributions were thrown off by making unlockable costumes and bikinis the motivation for replaying the game, or when you control Lara as she effortlessly and shamelessly kills every living person in the second level of Underworld. But there was always a sense that Chrystel Dynamics was trying to express something, which I feel is expressed in these words from Meagan:

To build Lara Croft into a culturally relevant hero worthy of the attention that once came so effortlessly, Crystal must break her first. This Lara isn't a shadow of the predecessor, nor the game a precursor to her later adventures. While she echoes the intelligence, strength, and beauty of Teflon Lara, she is a woman all her own. This Lara won't be invincible. She bleeds and bruises, trembles and cries, but ultimately pushes forward. Her coy and knowing smile may have been replaced with a grimace of pain and fear, but it's all part of the process.

Well, now all I can think of is that all this time I could have spent working on my project instead of writing this. So it might be a while before I write anything substantial again. ^_^

____________________________________________________
* Self Reference, or Recursive Link?

**Here is the comment that accompanied my Facebook post on the subject: "Supposedly Leaked Tomb Raider Concepts... looks like the Dead Space aliens crash landed in the middle of a Renaissance festival that Lara was attending in Silent Hill..." Called it!