Saturday, August 15, 2009

Truth in Worship?

A friend of mine recalled a song which was often sung in a church I previously attended. I hadn't visited in several years, and I completely forgot about this song. It was titled "More than Anything." Since I don't want to deal with the issues of copyright and citing sources, I'll leave it to the reader to look up this song on their own. I will, however, summarize the underlying theological point being made in the first line of the chorus (and resounding throughout the song): "God loves people more than anything."

Another song I remember from these days (again, please look up the lyrics if you're interested) came to our college group from a source I don't remember (I believe it's a Vineyard song, though I'm not positive). It was called "Every Move I Make." In summary, the underlying theological statement was (in accordance to the first line of the song), "Every move I make I make in You, You make me move Jesus."

Two interesting points are being made, during a church service, sung by a congregation to God Who sits upon His throne.

Before I proceed to examine these two songs and their theological ramifications, let me first state this unequivocally: I don't believe there was any intention upon the authors of these songs to cross theological or doctrinal boundaries. Most artists speak from the heart and the seat of their emotions (something which will be addressed later), and their motives often stem from sincerity and openness.

This said, there are two fundamental problems with these two songs, which can be traced (somewhat haphazardly, I'll admit) to a single issue.

More than Anything?



First, let's consider these words: "God loves people more than anything." We know one of the perfections of God is His love. I John 4:7-8 states explicitly,
Beloved, let us love one another, for love is from God, and whoever loves has been born of God and knows God. Anyone who does not love does not know God, because God is love


The nearsighted, and incomplete human experience we know as "love" finds its perfection in God and God alone. Within Him alone does love manifest itself to its fullest extent for because it is an attribute (for lack of a better word) He permits us to experience and apprehend. We do well to consider the love from the Lord and the means in which He reveals this to us.

But the primary theological point of the song isn't the reality of this attribute of God. It pertains to the direction of this particular attribute flowing in its fullest measure from top-down. God's love, according to the song, is expressed only in its perfection after mankind's creation and fall. In essence, God loves people more than anything.

Is this, strictly speaking, true? Does God love mankind more than anything? Does He love us more than Himself? Is there a lack in the unity and perfection of our Triune God in which He must seek the final expression of His love in something other than Himself? I would posit this to be absolutely impossible, bordering on the absurd. To say God loves mankind (fallen or otherwise) either places upon the Lord imperfection or mutability, both of which are Scripturally untenable.

Imperfection


What was God's state prior to the creation of mankind? Such a question is, of course, impossible for us to answer. Before our appearance, we have no knowledge of God's work or expression of Himself. In Scripture we are given glimpses of Him in His eternal Being; we read of occurrences (e.g. Satan's rebellion) in a spiritual reality of which we are not capable of interacting; we are even given insight into certain attributes of God which provide us with imperfect understanding of Who He Is. But, we are not given any glimpse into eternity-past.

Unfortunately, if we are to posit God's love for mankind exceeds His love for anything else, we must first attempt to grasp this as it relates from God as an eternal Being. Does God love us more than Himself? If so, what was the state in the Trinity prior to His creation of mankind? Was there an impenetrable barrier in which God could not express His love in its fullest to Himself? We know the Father loves the Son (John 5:20); was this love incomplete in eternity-past? Did the love of God (a fundamental attribute of His Being, according to the apostle John) grow in greater measure upon this one creative act? If so, this redefines God into a God of development and evolution.

Rather than God being complete within and of Himself, we are forced to accept a God Who, upon the creation and fall of mankind, experienced an altering in the fullness of one of His attributes, the result of which was the fullest expression of love being bestowed from the Creator to the Creator.

Mutability


If we reject the previous assertion (as we should), the next question arises: What was the cause of such change upon the advent of fallen human beings? Did the Lord redirect the expression of His love in its fullest away from Himself (within the Trinity) to His creation? Is there any Scriptural precedence for such a position? According to Scripture, there is not. God has repeatedly revealed Himself to His creation as unchanging and immutable (Malachi 3:6). Unfortunately, this truth as ascribed by Scripture is incompatible with the statement, "God loves people more than anything." If the fullness of God was complete in eternity-past, and God reveals Himself as unchanging, then we can, logically, rely on His completeness after the creation of mankind. To do otherwise results in the same error as previous: God becomes a being of evolution and progress, rather than perfection and completeness.


Every Move I Make?

Scripture is quite clear regarding the eminence of Christ (Colossians 1:15-20):
He is the image of the invisible God, the firstborn of all creation. For by him all things were created, in heaven and on earth, visible and invisible, whether thrones or dominions or rulers or authorities—all things were created through him and for him. And he is before all things, and in him all things hold together. And he is the head of the body, the church. He is the beginning, the firstborn from the dead, that in everything he might be preeminent. For in him all the fullness of God was pleased to dwell, andAW)"> through him to reconcile to himself all things, whether on earth or in heaven, making peace by the blood of his cross.
In Christ, all things are held together. He is the Word of God, present during creation and in Him all things find their life and existence. This is a truly remarkable revelation, providing even greater insight (and therefore inspiring praise and worship) into the creative acts of God (Genesis 1 and 2).

So what's wrong with this statement: "every move I make I make in You, You make me move Jesus"?

The answer is simple: Jesus is not the author of sin, and, therefore, is not present in every act we make. He does not make us move in certain contexts and sinful expressions of our fallen nature.

Scripture is quite clear about the dangers of either ascribing sin to the Lord, or finding means to justify sin with theology (Romans 3:8). According to Romans 5, sin entered into this world through one man, not through an act of the Lord. Justification and redemption from the curse and enslavement of sin has been given through the direct intervention of God, and by these means we are set free. This, however, does not preclude the continued existence of sin.

In lecturing on Romans, Martin Luther coined a phrase which resounded throughout the Reformation: simul justus et peccator. This statement referred to the regenerated nature of sinful man: "simultaneous justified and sinful." Paul's statements in Romans 7 attest to this reality: though fully justified in the righteousness, and death and resurrection of Christ, he still experienced the daily struggle with sin and a nature which is bent away from the Holiness of God.

What does this song commonly used in church services and college groups say about this? It states, without equivocation, every move we make is in Jesus. Quite strictly speaking, this is a preposterous statement. Was Paul's lament regarding his inability to do right a condemnation of Christ moving him to do wrong? Of course not. Indeed, in verse 25 he breaks out into praise of the One in Whom righteousness and justification is found.

The words of this song beg a question: are we moving in Jesus when we are entertaining lustful thoughts? When we lie to our bosses? When we disrespect and dishonor our parents? When we mock and deride? I don't doubt the author of the song would answer with a resounding: not at all!

So What's the Point?


What, ultimately, does this matter? Is it possible the authors of these two songs were speaking with poetic license? Are we not allowed freedom to understand the heart of a song or message, disregarding its technical accuracy?

First of all, I believe the primary motives behind these two songs (judged by the words used) were this:
1. God's love for people is awe-inspiring and unfathomable. The expressions of His love in redeeming the lost are beyond all comprehension, and merit worship and praise.
2. In Christ, all existence is sustained and the changes inspired by the work of the Holy Spirit move us to a greater understanding of the Lord's presence in our lives.

It's possible I've completely missed the mark in interpreting the underlying intent of these songs, but I do wish to give the authors the greatest benefit of the doubt.

Unfortunately, we cannot afford such inaccuracy in the Church.

In Romans 14, Paul provides a strong imperative to those in the church who are "stronger."
Therefore let us not pass judgment on one another any longer, but rather decide never to put a stumbling block or hindrance in the way of a brother.
We are given clear instruction to promote maturity and understanding upon those who are spiritually weaker in the Church. Such weakness may pertain to issues of freedom versus license, times of worship, or doctrinal struggles. Such weakness may also stem from simple ignorance brought upon by spiritual immaturity. Such ignorance should be met with loving knowledge and grace. For these, we must be quite careful not to introduce a Gospel which conflicts with that given by Scripture. Individuals in moment of personal, songful worship may understand the finer nuance of intention in the two, previously mentioned songs. We might hesitate to offer words which are clearly untrue in worship, but this is a point for a different topic. Regardless, spiritually mature believers may be able to distinguish between the true and the hyperbolic.

A corporate service, however, has no such freedom. Ministers and music leaders have no knowledge of the overall maturity of the congregation. In point of fact, they would be safe to assume a wide variety of wisdom, knowledge, and maturity in the local church body. With this in mind, is it reasonable to offer up songs of praise which do not, strictly speaking, adhere to truths in Scripture? Is it more important to elicit a certain emotional reaction, inspired by well-meaning words, regardless of their validity?

To both questions, I would purport, "no." During the local church services, we have a responsibility (one which I fell short of consistently in my previous times in various worship bands) to speak, preach, and sing the truth. God should and will be worshiped in truth (John 3:23-24).

Wednesday, August 5, 2009

Flex and Pure MVC

I learned PureMVC for Flex about a month ago, and was able to successfully migrate all of my Flex projects at work to this new framework. Of course, these projects are relatively small (appx 5000 lines of code at best) but it was the best move I could have made.

Though PureMVC doesn't necessarily guarantee good design and separation of concerns in a project, it certainly provides a nicely decoupled way of utilizing the MVC design scheme.

PureMVC uses what's called a Facade to act as a broker for forwarding notifications from various components. View components (MXML and the ActionScript needed to drive them) are provided to "Mediators" which communicate via the Facade. These mediators translate any events from the UI (e.g. users clicking buttons to load information from a server) into "notifications" which are sent via the Facade to the respective Controller objects.

These Controller objects are known as "Commands". Commands receive the notification from the Facade (and any data passed from the View components) and then use "Proxies" to request data and perform the majority of the business logic for the application.

Sound complicated? It's really not. The typical project may be organized like this:

src
|- controller
|- model
|_ view

Under the "controller" directory, Commands are kept which receive notifications. These commands invoke "Proxies" which are stored in the "model" directory. These proxies request information from remote objects (e.g. servers) and relay data back to the appropriate location. The "view" folder contains two different types of objects: view components and mediators. The view components are simply the user-visible forms and controls in which the user interacts. These have absolutely no connection to any PureMVC components; rather, they are passed (at runtime) to a "Mediator". The mediator listens for events from the view components and then relays the event to the Facade as a notification.

Frankly, it sounds a lot more complicated than it is. Future posts should have some examples for how to assemble a simple User-form in PureMVC

Saturday, June 20, 2009

Conky version 1.0


It's finished! I'm still working on some details: the icons are ok, but I wonder if I could cut this down a bit. I also want to divide this up to all 4 corners of my screen.

Anyway, this is the conky in #! on my laptop. The smudged content in the top is my hostname 'on' my ESSID. If the ESSID isn't available (e.g. no wireless connection), it prints " is disconnected"

Friday, June 19, 2009

Nuts, Conky isn't working right


Here's a snippet of a Conky config I've been working on.

Friday, June 12, 2009

Dependency Injection and Flex

So, a quick note on the progress I've made with Flex. First of all, I wanted a tool to highlight text. So...I spent 3 weeks working through tutorials and examples from some brilliant coders who have already paved this way, worked with several different libraries, and finally found that all my work was for naught; enter, FlexLib. It not only had a great highlighting class, but also contained some moveable Panels, and a nice extensible Tab Navigator...sigh..all that work down the drain.

Anyway, I've heard about Dependency Injections a lot lately, and I finally decided to research what it's about. Wow, I never realized how simple a concept it would be. Having been exposed to different design patterns like Factory Method, this was extremely easy to assimilate.

Dependency Injection works very well with Flex interfaces, and particularly well with Factories. If I have an object A which depends on object B, I could have A instantiate B and maintain a reference to it. Unfortunately, this creates a dependency within A upon B:

private var bInstance:B;
...
bInstance = new B();
bInstance.foo();


In this case, A has a definite dependency upon B's implementation. If B changes 'foo()' to anything else, A will break.

We can partially solve this via a interface, in which A and B agree on B's required methods. In this case, B utilizes an interface, BI, which instructs B to always implement 'foo()'. Thus, A can access B via its instance:

private var bInstance:BI;
...
bInstance = new B();
bInstance.foo(); //guaranteed since bInstance is an instance of type BI


But we still have a problem: A is still relying on the base class of B. What if we wanted to break B into different objects, and 'B' was no longer a valid name? Moreover, what if we moved B to a different library? Enter a factory.

Rather than A creating B, even via its interface, what if the code calling A passed in a reference to B, via its interface? For this, we'll add two new classes. 'Factory' has a 'createBI' function that returns a reference to B via its interface, BI. FooBar is a class which creates A. In this class, the code to create A might look something like this:

a = new A(Factory.createBI());


Whereas the constructor for A might look like this:

private bInst:BI;
public function A(bInst:BI):void {
  this.bInst = bInst;
}


From this point, we've broken the dependency of A to B, and created a new dependency from A to BI. This is a better design and is more extensible: should we need to have different variations of B, as long as they implement the BI interface, A can utilize them.

What's more, 'FooBar' injected the dependencies into A.

That's all there is to it.

Now...my question is...how far can you take this??

Sunday, April 12, 2009

Happy Easter -- Christ is risen indeed!

What a wonderful time of the year for us, as Christians, to remember the glorious resurrection! We worship on Sundays because this was the day of Christ's resurrection from the dead, but it's also, in my mind, important to set time aside on the anniversary of our blessed hope.

I've been thinking about the resurrection more this past year, and I have a thought: one of the strongest proofs of Christ's resurrection lies in the changes the Holy Spirit wrought in the lives of His disciples and those who lived in the ancient world.

At the time of Christ's death, His disciples had fled. The oligarchical religious authorities had, it seemed, succeeded in squelching what they viewed as a blasphemous trend and an affront to their authority. Jesus' friends had abandoned Him immediately after His arrest, and, on that Sunday so long ago, were in hiding. They feared the reprisal of the authorities against those Jesus had taken into His "inner circle," so they sat in their rooms, cowardly and afraid for their own lives.

Don't get me wrong -- I would have done the same...we all would have.

But, within a very short amount of time, these men swept through Israel, Palestine, Asia Minor and to even farther reaches of the known world, spreading the glorious news of Christ's death and resurrection and forgiveness for sin. They baptized and made disciples wherever they went, turning the Jewish society completely on its head. Those who had lived and breathed a fiercely xenophobic and merit-based religious lifestyle were now proclaiming the forgiveness of sins fully apart from works to those outside their respective society. Faith and belief were no longer restricted to a few select practitioners, men, women, soldiers, etc. Instead, all, even small children, were welcomed into the Church.

For those who would purport the existence of explicit "misogynism" in the early church, I would ask they read the New Testament and consider the words of Christ, Who, in a strictly patristic society, reached out to women with His teachings; as well as the apostle Paul, who, though recognizing the difference in role and responsibility between the sexes, also acclaims specific women working alongside men in the church. I would also encourage them to compare Christianity in its day to the other religious institutions at the time: it stands apart in its acceptance of all from different walks of life, and its claims of the abject uselessness of meritorious acts.

In a very short amount of time, the world was drastically and fundamentally changed. No longer basing their religious standing on their capacity to keep Law, give charitably, or act in accordance with goodness, Christians were, rather, displaying chartity and good deeds stemming from an inward change. Rather than working to earn merit, their focus was on being thankful for a gift given while they were still sinners (Romans 3:8), and spreading this good news to everyone they came near.

Christianity spread like a wild fire in its early days, in the face of the most perverse and grotesque persecution and opposition known to man. Under the reign of Domitian, Christian persecution became a matter of state policy; under the reign of Nero, Christians were tortured and ravished as a matter of entertainment. The Jewish religious authorities persecuted and murdered early leaders of the Christian church, casting others into jail.

We know the tomb is empty. Christ rose from the grave (halleluiah!) and we in Him we have a blessed hope. But we need remember one thing: no explanation, no physical evidence, no arguments are sufficient to explain this unprecedented phenomenon. It's not enough for the world to present Jesus' bones and say, "here he is!" Such an occurrence falls drastically short of the historical evidence we have of such a massive personal transformation on behalf of His followers.

What more can we ask for? The proof of Jesus' resurrection and His sending the Holy Spirit need not lie in manifestations of "spiritual gifts;" it need not be sought in an "experience" or a "feeling" or emotion; it need not be based upon the display of miraculous "healings" during televangelist gatherings. Though I don't discount gifts, feelings, or the power of the Lord to heal, we far too often seek for reassurance of His reality in things which focus us inward:
  1. I have this gift
  2. I feel this feeling/sensation
  3. I was healed
Instead, let us turn to the real and historical Jesus as our reassurance and hope. We have the ultimate proof of His resurrection: an empty grave, a missing body, 500+ witnesses, and the greatest spiritual conversion mankind could ever witness.

He has risen indeed!! Happy Easter!!

Wednesday, April 8, 2009

Issues Etc -- Does Satan Exist?

I listened to a great review of the ABC Panel which discussed the existence of Satan. It's in two parts:






These are well worth listening to.

Sunday, April 5, 2009

A few Ofelia Pics

Ok, I wanted to post a few pictures of my kiddo:

She's just so friggin' cute!















She's trying to read like her daddy. Her mommy is also now reading too!















We had a little date to the library on Saturday--she was ready for the blustery weather:















Here she is, trying to distract her daddy while he's sick and working from home:

Musings on Palm Sunday

I had a thought this morning while at church.

Today's the day the Christian church remembers Christ's entrance into Jerusalem, the week before He was crucified by the Romans and rose again from the grave. His entrance into the city was marked by excitement, rejoicing, and (wait for it...) people waving palm branches ().

I remember past Palm Sundays in several churches, watching palm-branch-bearing children parade up and down the sanctuary aisles, while proud parents beamed from their pews, and music and songs rose up from the music team. All in all, they were somewhat emotionally-overcharged services ().

The situation in Jerusalem, however, is pretty hard to understand. During the Triumphal Entry (Palm Sunday), the crowds were ecstatic. They were energetic, excited, and generally overjoyed to welcome Jesus into their city. He entered the gates riding a donkey while they shouted praises (Mark 11).

Less than a week later, they chose a known murderer and insurrectionist over Christ, while shouting "Crucify Him!" (Mark 15). He was sentenced to death by the Romans in accordance with their collective will.

Why the difference?

From what I've learned in my short (and quite inadequate) studies, the nation of Israel (in Christ's day) were not looking for a Savior Who, in sacrificing Himself, would pay the penalty for the sins of God's chosen people. They were awaiting a conquering Messiah who would take his place on David's throne, cast out their Roman invaders, and set Israel in their rightful place. They wanted glorification for their nation-state, and freedom from the Roman government. Christ's entry into Jerusalem sparked off this "revolutionary" mentality. The people were, I believe, looking to Jesus as this Messiah, and their reaction, though ignorant, was based on a self-serving and inadequate understanding of His purpose.

So...with this in mind, why do churches have children parading up and down the aisles on this Sunday, waving palm branches in a [potentially] misguided remembrance of sinful ignorance? Is this a correct observance and remembrance of Christ fulfilling prophecy foretold hundreds of years before? Should we not, perhaps, spend this Sunday reflecting on how we, as fallen human beings, will try to change Christ's purpose into something other than the incredible, and most amazing gift we could ever be given? The nation of Israel wanted Him to free them from the Romans; He was sent to free us from our sin and bridge the chasm between us and the Holy Lord. Their purposes and the Will of the Lord were at odds, and it behoves us to remember this and reflect upon Who Christ IS, and not Who we want Him to be.

Edit: My good buddy Kyle brought up a few good points to consider. Here are some passages to think through as I further ponder the discussion (emphasis mine, obviously):

Luke 19:41-44: 'And when he drew near and saw the city, he wept over it, saying, "Would that you, even you, had known on this day the things that make for peace! But now they are hidden from your eyes. For the days will come upon you, when your enemies will set up a barricade around you and surround you and hem you in on every side and tear you down to the ground, you and your children within you. And they will not leave one stone upon another in you, because you did not know the time of your visitation."'

This would, if nothing else, support the idea that the masses were praising out of expectation of something other than the truth. But...(again, emphasis mine)...

Luke 19:37-40: As he was drawing near—already on the way down the Mount of Olives—the whole multitude of his disciples began to rejoice and praise God with a loud voice for all the mighty works that they had seen, saying, "Blessed is the King who comes in the name of the Lord! Peace in heaven and glory in the highest!" And some of the Pharisees in the crowd said to him, "Teacher, rebuke your disciples." He answered, "I tell you, if these were silent, the very stones would cry out."
It seems, even though they were praising out of ignorance, they were still praising. This is certainly something to consider, and perhaps have a level of understanding for them. Heck, even the disciples didn't understand why Christ had come. They were likewise expecting Him to take His place on the throne of Israel as their conquering Messiah. But...

I think the primary concern I have is the re-enactment itself. I'm not questioning the act of worship itself, but rather the context in which it is taking place. We worship in truth because God has revealed it to us. They worshipped in ignorance because God had not yet revealed it to them.

Of course, I could be making a lot of nothing, and I certainly don't condemn those churches in the past... :-)

Saturday, April 4, 2009

Flex, Emacs, Linux, and Irony

I don't like Adobe. Their software is overpriced, bloated, and often difficult to for me to use. I wouldn't be able to derive $999 of worth from Photoshop, though there are pieces in it I would enjoy working with. Flash has made a lot of bad websites worse, while helping the Browser community ignore some of their past glaring inadequacies in adhering to standardization.

This said, I love working with Flex.

This also said, I refuse to pay for Flex Builder. Though it's not a bad IDE (hey, it's built on Eclipse, my personal favorite), it has a few glaring flaws which I won't go into (for those curious, they lie mostly in the debugger and profiler). I also don't like how little support there is for Linux. I spend 95% of my time at home working in Linux, and I don't particularly appreciate their dumbed-down version of the IDE. It's lacking many of the features I do enjoy (e.g. their WYSIWYG for rapid prototyping), while making certain tasks harder. It took me several hours to get a project assembled, after which I still couldn't create anything but .as files (it kept complaining about the project association).

So, I decided to see if I could create a customized Emacs environment for Flex in Linux. I haven't been too worried about certain features (e.g. debugging, file browsing, and intense code-completion). My primary focus is on syntax-highlighting, template generation, and easy compilation. Obviously, I'm keeping my expectations low for now. Hey, it's either this or log into Windows and use FlashDevelop which is really good, but not good enough to log into Windows.

Anyway, I found two great .el files for integration with Emacs, providing some level of syntax-highlighting and code-completion. Both can be found here: EmacsWiki. The two files are as follows:
1. actionscript-mode: provides a custom ActionScript mode (as it says)
2. nxml-mode: a bundle of files which provide extensive XML support (including MXML)

I was also able to integrate a third .el file which provides customizable templates using hotkey-esque strings: snippet.el.

All of these are searchable on the Emacs Wiki.

Anyway, I got these libraries integrated into Emacs (I also setup ECB, but I haven't used it much yet) and used this great tutorial for creating a "Makefile" for a project: . After this, the coding was pretty easy.

I attached a few screenshots for the basic view of the Bible verse memorization tool I'm developing. It's rudimentary at best, but this mock-up should show a decent view.


This first shot is a simple login screen:


The second is the main GUI with a left-side Accordion control for displaying verse references associated with different Leitner piles (I call them "buckets").


Interestingly, I wrote a similar GUI using PyQT4, which took me about 3 days. The Flex GUI shown in the screenshots took about 20 minutes. I wrote it while watching a movie on TV with my wife, and I bet her I could have it pounded out before a commercial break.

Anyway, I have the data-retrieval code written in Python. I'd like to use the ESV Web Service site as the data-source. I haven't heard back from them on licensing. We'll see how that goes.

So, here's the irony. As I mentioned before, I'm terrible at memorizing verses. Hence, I'm writing this app. Unfortunately, the application is taking more of my time away from memorizing verses...

Go figure...

Sunday, March 15, 2009

New Project in the Making

I'm starting a new project based on some concepts I learned in the flashcard program.

That program is still in beta testing. The basic feature set is ready, but I'm trying to decide if I should delay the 1.0 release to move everything into a database (rather than files).

Anyway, this one will be a memorization tool for Bible verses. I'm terrible at memorizing Scripture, and I really want to improve. Therefore, I'm working on a new utility which will help with my ability to remember.

Instead of randomization and probabilistic weighting for short-term learning (like the previous flashcard system), this one will feature a long-term memorization technique, much closer to the original Leitner algorithm. A GUI (web-based Flex, or desktop AIR, or desktop QT) will be used to select and display verses in a list, associated with a user. The verses being displayed will be weighted according to the user's ability to remember and repeat them. As users are better able to remember, they'll see them less often every day. I have some investigation to do regarding how to do the time calculations (e.g. I guessed a verse right, when should I be asked again), but that's another post altogether.

Anyway, it will be interesting to see how it goes.

Sunday, March 8, 2009

Flex and RIA development

I had a project at work to complete. Our automated testing infrastructure has aged beyond the point of usability, and no money has existed for upgrading to a more recent version, or investing in a different system for automated and manual test deployment, tracking, and maintaining.

One of my coworkers began (several years ago) piecing together a web-based automation utility which would allow us to quickly configure and execute test servers with automated tests. The solution was, conceptually, a combination of Javascript, CSS, and Ajax, in which users could add machines to a table, drag&drop test configurations to each machine, edit the test configurations (e.g. modify the command-line parameters passed to each test), and execute the overall config by sending it to the test automation system as a single CSV string.

His work lasted about 3 months, and resulted in the drag&drop interface.

Shortly after this, another coworker extended upon this work by adding the test config storage and retrieval via Ajax. Users could [in theory] add tests to each machine, edit their respective parameters, and execute said tests. They could also quickly create test configurations which would map directly to their respective automated tests in the version control repository.

The result was pretty good, but fell short in several ways: Ajax calls only worked 70% of the time, resulting in failures to execute tests, save configurations, and retrieve various pieces of information. Each test config was stored as a Javascript file on the web server, which required users to understand Javascript syntax if they wanted to manually add or edit existing configs. It also refused to work in IE.

His work lasted several months as well before he moved on to bigger and better things. I inherited it and took on the work to make it work more consistently with our test infrastructure. This lasted for about 3 months on the system before I decided to investigate other solutions.

Enter Flex.

The original interface put together was quite sound: dragging and dropping test configs to various machines is a great idea, though difficult to implement. I wanted to keep the use model of the system, but move away from pure Javascript.

After hearing some buzz regarding Flex around the office, I decided to take a look and see if it could offer a better solution.

Frankly, I was amazed. Within 3 weeks of starting, and without any prior exposure to Flex and ActionScript, I had completely reproduced all interface functionality, and even added several extensions. Rather than relying on Javascript for test configurations, I was able to introduce XML (a more logical choice, in my opinion) for configuration storage and retrieval. Relying on the Flash player resolved the issues between IE and Firefox (and other browsers which support the issues with storing and retrieving information from the web server.

In short, Flex is a fantastic solution for developing "Rich Internet Applications." The presence of a standardized API (*cough -- javascript!*) and a full-fledged object-oriented language quickly and easily resolved all issues I had with prior implementations.

In essence, though I'm impressed with the usability and functionality of Javascript and CSS, for web apps I'm likely going to stick with Flex and potentially Cappuccino if it's as cool as it looks.

Sunday, January 11, 2009

Flashcards Project Status

For those of you who don't know, I've been working on a new project for the past several months. My initial desire was to create a simple little app which would help me learn Python, and would also facilitate my learning of Classical Greek endings. Verb and noun endings in Greek are vitally important to understand, and there's so bloody many, I felt a learning application would be a fun project.

The last 4 months of coding have been some of the most fun I've had.

Though the project is still in its infancy, and though I'm struggling with massive amounts of scope creep, I have an "alpha" which is almost ready to be released.

Here are the initial requirements/specifications:
1. The system will provide "questions" and allow users to provide "answers"
2. The system will check the user's response and either accept it as a match, or reject it
3. The "questions" posted by the system will initially be in the form of Classical Greek verbs, nouns, or prepositions. Answers will be posted in English.
4. Verbs and Nouns can be put together by the system as a "cross product" of two sets: roots and endings. In other words, the system should be able to take a list of roots and apply endings to each one.
4a. In addition to this, the system should be able to discern the correct answer
5. The system will use Leitner's System (or a modified version) for "learning" which words the user knows and which ones they don't.
5a. The system will provide "questions" for those less-known words more often than those of well-known words
5bi. The system should have a means for accessing less-known words more often than well-known words (see point 8b)
6. The system will provide a means of "hinting" at the answer
6a. The hint system should be configurable
7. The system will provide statistics for the learner to gauge their progress
7b. The system should output information regarding the number of successes, failures, and hints posted or requested by the user
8. The system will allow the user to modify the underlying details of the Leitner Algorithm while currently engaged with the application
8a. The user should be able to modify the number of "piles" (called "buckets") in which the cards are distributed, within the range of '1' or '10' buckets
8b. The user should be able to modify the means in which the buckets are distributed (e.g. 30% of the time, the system will pull cards from the least-known bucket, 5% of the time it will pull from the well-known bucket)
9. The system should use a QT-based GUI for viewing
10. The system should be able to preserve the current state of user-execution
10a. The system should allow the user to save/restore the current state whenever they desire
11. The system should be configurable via XML configuration files, allowing users to "hot-swap" different card-input algorithms
12. The system will provide detailed documentation for use, administration, and flashcard development.
13. The system will host 'hotkeys' for easier navigation

These are the basic requirements. All but 10 and 11 are pretty much finished, though there are a number of defects and design issues which need to be addressed.

One requirement I'd really like to investigate and get working is #11. My buddy Bump suggested this: apparently, the current Flashcard systems don't have very well abstracted algorithms which can be swapped out. I'm not sure what this will mean, but it sounds interesting and fun.

In the meantime, here are some screenshots of the GUI in action. In order they are:
I. The main GUI and dialog for choosing the card "set"
II. The main flashcard GUI -- note the Unicode characters for the Greek words and the statistics in the lower left corner
III. Main flashcard GUI -- posted failure when user guess is incorrect
IV. Main flashcard GUI -- posted hint when user requests
V. Main flashcard GUI -- posted success when user guess is correct
VI. Main Algorithm Admin GUI -- note the Leitner and Hint system administration options












Saturday, January 3, 2009

Brief Update

We just returned from SD yesterday. It was a great trip, albeit pretty short. We flew out from Denver on Tuesday morning and arrived in Sioux Falls (about 45 miles northeast of Freeman) around 1 in the afternoon. All in all, the flight was ok. Our departure was an hour late; apparently, the plane was falling apart and they needed to piece it back together. Such things do not instill massive amounts of reassurance in those of us who are a bit trepidatious when it comes to flying.

We stayed with Jenn's family over the duration. Her family on both sides visited over lunch on the 31st and 1st. I didn't spend much time with her mother's side: it was only the women, and I had the opportunity to have lunch with her younger brother and father. It was a worthy trade off.

We left yesterday morning at 11 and arrived here at 12:30pm. Ofelia did very well throughout the entire trip. The first time she fussed during travel since Tuesday was yesterday as the plane was descending. Other than that, we could tell she enjoyed the adventure immensely. She made friends with people all over the airport and in the plane, her smiles inspiring others everywhere she went. I'm amazed at how much happiness she seems to bring to those around her. She's very friendly, and has a way of endearing herself to everyone. While we were sitting on the plane waiting to take off, she kept peering through the gaps in between our seats, giggling, squeaking, and smiling at the elderly couple behind us. She did the same for several people behind and next to us as well. It was cute, and very fun to watch.

Of course, I was primarily focusing on not freaking out over being 30,000 feet in the air, but that's another tale for another time.

She was also baptized a week ago tomorrow. The ceremony was held in a local Confessional Lutheran Church (Missouri Synod) and we've established a nice relationship with the lead pastor. I don't think the liturgical service is for us, per se, and we have disagreements with Lutheran doctrine, but it was an interesting exposure to a historical side of the Christian church which we hadn't seen prior.

That's all for now.