The Gorilla Logic Blog
Thoughts from the Gorillas

We’ve got Microsoft on the run

January 16th, 2008

If you’ve read anything recently about Microsoft’s Oslo initiative then, like me, you’ve probably realized that Oslo represents a desperate attempt by Microsoft to catch up with our very own Gorilla eXecution Engine (GXE). Like the GXE, Oslo will execute models directly, but whereas the GXE is available today, Oslo will not be available before sometime in 2009.

My sources tell me that Ballmer is completely freaking out about the threat we pose to Microsoft’s very existence.


buy viagra
buy viagra online
viagra online
discount viagra
order viagra
cheap viagra
generic viagra
generica viagra
viagra buy
viagra price
order viagra online
viagra generic
viagra pill
where buy viagra
buy viagra cheap
viagra order
get viagra
buy online viagra
online viagra
viagra sale online
where to buy viagra
cheapest viagra
purchase viagra
cheap viagra online
viagra buy online
buying viagra
buy viagra on
generic viagra canada
prescription viagra
buy viagra norway
generic viagra pack
buy viagra in nevada
buy viagra now online
viagra online buy
find viagra online
buy cheap viagra online
cheap generic viagra
buy cheap viagra
generic viagra online
viagra sale
generic viagra cheap
buy viagra on line
where buy generic viagra
viagra online bestellen
viagra prescription online
generic online viagra
low price viagra
cheapest viagra price
buy generic viagra
viagra uk
viagra online prescription
cheap est viagra
viagra soft tab
viagra discount
viagra cheap
where to buy viagra on line
buying viagra online
buy viagra now
purchase viagra online
viagra pharmacy
natural viagra
buy viagra in canada
viagra paypal
viagra on line
viagra 100mg
viagra without prescription
cheapest place to buy viagra online
generic Cialis
buy cialis
buy cialis online
cialis online
online cialis
order cialis
cheap cialis
discount Cialis
generic cialis price
cialis prescription
buy cialis generic
cialis online discount
cheapest cialis
buy discount cialis
purchase cheap cialis online
order cialis online
cialis for sale
cialis price
purchase cialis
cialis online pharmacy
buy Cheap Cialis
cialis story
generic cialis online
best cialis price
cheapest cialis generic
order generic cialis
low cost cialis
buy cialis generic online
levitra
buy levitra
cheap levitra
levitra online
buy levitra online
order levitra
order levitra online
cialis levitra
generic levitra
online levitra
buy cheap levitra
discount levitra
levitra sale
buy generic levitra
levitra online pharmacy
levitra price
purchase levitra
cheap levitra online
levitra story
levitra on line
levitra prescription
levitra cheap
best price for levitra
buy xanax
buy phentermine
buy lasix
tramadol
buy tramadol
buy tramadol online
tramadol online
cheap tramadol
order tramadol
tramadol hcl
ultram tramadol
tramadol prescription
online tramadol
tramadol sale
purchase tramadol
buy cheap tramadol
order tramadol online
overnight tramadol
tramadol cheap
tramadol pharmacy
discount tramadol
tramadol hydrochloride
tramadol 50mg
cheap tramadol online
generic tramadol
buy clomid
buy prozac
buy cipro
buy diflucan
buy acomplia
buy lexapro
buy flagyl
buy propecia
order propecia
cheap propecia
propecia online
order propecia online
buy propecia online
generic propecia
compare propecia
propecia without prescription
propecia prescription
propecia pill
discount propecia
online propecia
cheapest propecia
get propecia
propecia order
propecia price
propecia uk
propecia cost
propecia sale
purchase propecia
buy cheap propecia
propecia sale online
buy online propecia
online pharmacy propecia
online prescription propecia
buy generic propecia
buying propecia
buy propecia now
buy fosamax
buy kamagra
buy clomid online
buy prozac online
buy cipro online
buy diflucan online
buy acomplia online
buy lexapro online
buy flagyl online

Moe, Larry, and Curly Braces

October 29th, 2007

If you’re new here, this post is part of a more-or-less continuous train-of-thought that begins here.

We’ve thus far discussed several of the primary pillars of Precision Modeling — derivation expressions, conditional expressions, query expressions, and derived associations — and we’ve used these to help out our hypothetical (and some might say homicidal) customer, arms4less.com (”where you can get regime change for small change!”). We’ve been specifying the business rule stating that customers’ can pay a surcharge to prevent their enemies from purchasing any of the same weapons they’re purchasing themselves. We did this by creating a derived association, enemyProducts, that contains the list of all products we are unable to sell to a particular customer, because they have already been purchased by enemies of the customer who have opted to pay the surcharge:

/enemyProducts : Product = enemies.orders.items[isExclusive].product

Now we just need to somehow use this association to prevent a customer from actually buying any of these enemyProducts. As with the many wonders of Precision Modeling we’ve previously discussed, we can specify such a requirement precisely and concisely (Hey, that rhymes. Our marketing people will be so pleased.) via a little Gorilla UML.

figure8.jpg Notice the constraint expression we’ve attached to OrderItem:

{not product in order.customer.enemyProducts}

In UML, constraints are specified inside curly braces (many have postulated this proves once and for all that Grady Booch is a die-hard Three Stooges fan). Because this constraint is attached to OrderItem, it is specifying that any product associated with an OrderItem cannot also be included in the list of the order’s customer’s enemyProduct’s list.

Our SME, Sarge, inquires as to how we plan to enforce this constraint? “If it gets violated, there needs to be — you know — consquences.” We ensure him that we will be sure to thoroughly test our implementation of this constraint to ensure that the software indeed enforces it. Sarge sighs wistully as he removes his hand from a bulge beneath his flack jacket.

Stu Stern

The enemy of my enemy is my customer

October 5th, 2007

If you’re new here, this post is part of a more-or-less continuous train-of-thought that begins here.

Today we continue looking at query expressions, which I introduced with much hullabaloo last time, but have thus far only given you the smallest taste. The glutinous among you are surely clamoring for more. So let’s eat. But please stop using that use case diagram as a napkin. (Javadoc is much more absorbent).

Sarge has for the first time invited us to the headquarters of Arms4Less.com. After our blindfolds have been removed and our hands untied, we find ourselves seated around a large conference table in a windowless room. Charts around the wall show sales projections and troop strength estimates for the various markets Arms4Less is targeting over the next twelve months.

Last time we looked at how we can derive a value (isTrusted) using a query expression. Let’s consider another such example. Sarge explains to us that Arms4Less prides itself on its high ethical standards. “Like if we sell a particular model of tank to one guy, for a small surcharge of 10%, we won’t sell the same kinda tank to any of his enemies.” We consider this requirement and realize that we need to prevent a customer from ordering any product that has been previously ordered by any of the customer’s enemies. Now many of you are probably wonder how the heck we can express something like this on a lowly class diagram. Doesn’t this require a more procedurally-oriented specification? Something with a little more get-up-and-go than a class diagram? Class diagrams just lay there, you say. We need something that moves, don’t we?

Ha! I laugh at you (with all due respect of course). Do you think I would have wasted this much time blogging about this crap if we could go no further? Consider our latest version of the precision model, below:

figure51.jpg

We have added a new association, enemies, to keep track of a customer’s enemies, and we have added a derived association called enemyProducts that references all the products purchased by a customer’s enemies. Let me clarify a few things about “derived associations”. First, you may be scratching your head about why we’re calling enemyProducts an association at all, since its not represented by a line on our class diagram. Notice however the type of the enemyProducts attribute. It’s a Product. (In fact, as we’ll discuss another time, it’s a list of Products.)

There are multiple ways of representing associations in UML. For example, the following two representations are virtually equivalent.

figure6.jpg

figure7.jpg

On the left, we see that the Employee has a BattleInjury reference called injuries. We see exactly the same thing with the Employee representation on the right, which contains a BattleInjury reference as well. The only difference is the notation being used. On the left we depict the reference with a composite association named injuries, whereas on the right, we decpict the reference with a nested attribute, also called injuries.

A derived association then is simply a derived attribute whose formula evaluates to a list of entities of some type. Let’s look at the derivation expression for enemyProducts:

enemies.orders.items[isExclusive].product

In evaluating the value of this expression for a particular customer, we navigate through the customer’s associated enemies, to their orders and then to the order’s associated items. We then subset (query) the orders to select out those for which enemies have opted for an exclusive deal, and then we navigate from this resulting set to their associated products. The resulting list of products are the ones that we can’t sell to the Customer.

The astute reader (or at least most who weren’t out drinking last night) will have noticed we’re essentially navigating multiple paths in parallel when we navigate enemies.orders.items since a customer can have many enemies, each in turn having many orders, and each of those orders having many items. The expression “unions” the results of navigating these parallel paths.

Now, you may recall earlier in this tirade we talked about the importance of precision. In fact, recall that all these techniques we’re using comprise a methodology called Precision Modeling. You can rest assured that I’m not just whipping out arbitrary syntax for each of the formulas we’ve used. All of them are expressed with a formal expression language that are part of what we call Gorilla UML (GUML).

GUML not only has formal syntax definition. It executes! (Sarge says, “Cool! I execute too!”) More on execution later. In our next little visit together, we’ll actually look at using GUML to specify constraints. Using constraints we can complete our specification of Sarge’s business rule preventing a product being sold to a customer’s enemies.

Stu Stern

Power, intrigue, and query expressions

September 24th, 2007

Having looked at how we can use derived and conditional expressions in our class diagrams, we are now ready to consider a construct so powerful that I shudder to think of what could happen if Iran, North Korea, or Microsoft should get hold of it. In fact, I’m taking a huge risk in revealing it here today. If this is my last post, it’s a good bet that I’m in the hands of foreign agents trying to force me into assisting with a diabolical plot involving germs, radiation, and Tomcat 5.5.

Yes, today you are ready to learn about (cue some suitably momentous music) query expressions! Wait! Where are you going? Come back. I’m tellin’ ya. Query expressions are some serious mojo!

Let us feel their power together by returning again to our consideration of the Arms4Less online superstore (”where you don’t need to spend a lot to destroy a lot”). Sarge explains to us that they don’t sell to just anybody. “For the really good stuff, you gotta be somebody we trust — either somebody we know, or a friend of at least two people we know.” We easily capture this notion of who’s trusted as follows.

figure41.jpg We add a Customer entity with an association, friends, referencing customers who are a customer’s friends. We give Customer a boolean attribute, isSomebodyWeKnow, and as well as a derived attribute, isTrusted. The value of isTrusted is derived from the expression:

isSomebodyWeKnow or #friends[isSomebodyWeKnow] >= 2

The []-brackets enclose a selection expression. friends[isSomebodyWeKnow] selects all of the friends of some customer where isSomebodyWeKnow is true. The #-sign is a shorthand for “count”. So, we can see that isTrusted will evaluate to true if the customer is somebody we know or if they have at least 2 friends we know.

When next we meet, we’ll delve into the notion of query expressions more fully. In the meantime, beware of North Koreans toting pirated UML editors….

Stu Stern

Conditional Love

September 7th, 2007

Let’s consider some other amusing things we can do with class diagrams. With a little tape, some string, and a pair of scissors, we can of course convert most class diagrams into a ceremonial tribal mask or a pirate hat. Another fun thing we can do is derive attribute values using conditional expressions.

Let’s return to our example of the Arms4Less online superstore. We’re having lunch with our SME, Sarge, and he’s just finished telling us a funny story about a coup he helped stage a few years back. “So Johnny turns to me and says, whadaya mean, where’s the king? Who do we got tied up in the back of your car?” We laugh appreciatively, and then turn the conversation back to the requirements for the store. Sarge explains how they want to offer various sales incentives, “like 20% off for quantities over 50″. We can easily modify our model to reflect this figure3.jpgrequirement, by adding a new derived attribute called discount to OrderItem, and then modifying the derivation expression on total to reflect any discounting to be applied. We must also add the necessary non-derived attributes, discountQty and discount, to the Product, as shown.

Hopefully, you are beginning to see how much more you could be getting out of your class diagrams if you would just spend a little more time drawing pictures and a little less time writing code. I know how that can be tough with all the pressure you’re getting from religious eXtremists, but as we shall soon see, Precision Requirements Modeling fits very nicely into an Agile approach that even the religious right can love.

In our next installment we’ll really get this party started when we consider how to derive values from query expressions. I know the anticipation will be killing you between now and then, and I’d love to show you right now, but I gotta go write some code.

Stu Stern


blow jobs asian blow job deep throat