text:
Bosnia and Herzegovina
Alberta, Halifax, Montreal, Ottawa, Peterborough, Toronto, Vancouver, Victoria
Costa Rica
Czech Republic
Saudia Arabia
Trinidad and Tobago
United Kingdom
Belfast, Edinburgh, Glasgow, London, Nottingham, Oxford, York
United States
Atlanta, Baltimore, Chicago, Detroit, Duke University NC, Houston, Las Vegas, Lawrence KS, Los Angeles, Lubbock TX, Manhattan KS, New Orleans, New York City, Pittsburgh, Twin Cities
I was walking alone around the Cascade Station outdoor mall in Portland, OR. Behind me and to my right I hear a male voice.
"You walk really fast."
Not sure and hoping it's not directed at me I continue.
"You walk really fast."
The voice and comment make me more uncomfortable.
I ignore.
I'm Asian so I know this is for me. I look over and glare.
He is a man wearing yellow glasses and a camo jacket. He yells, "Why are you so stuck up!"
I hurry into the nearest store.
I was standing outside a club waiting for a cab, when two men in suits pass by. One taps me on the side, near my breast, and says "hey beautiful." I point at him and shout, "Hey! You! Don't touch me! Don't touch women on the street!" He kept saying "I didn't touch you, I didn't touch you," (my response: "yes you did, asshole!") as I pointed him out to a completely apathetic crowd. There were even cops nearby, and they did nothing. Nobody even seemed to notice at all.
no comments
I grew up in a small town of 1500 people, it wasn't really an everyone knows everyone kind of place, or if it was I didn't notice because my family minded our own business for the most part and didn't do much socially in town. I was maybe seventeen and I was pumping gas at the only gas station we had. It was spring I think, I was wearing a pink top with short sleeves and jeans and a grey jacket. It was warm out so I started taking my jacket off when some guys sped past me down the main street and shouted "Ow!" out their car window at me. I had my back to them but I didn't turn around because I was sure it was just some high school jerks making fun of me. I didn't feel like I was attractive enough to merit an "Ow!" just for taking my jacket off so they must have been making fun of me. I didn't turn around because I wanted them to think I didn't heard them, I didn't want to give them any satisfaction, not that it mattered, they had already driven away. It didn't upset me too bad at the time, I didn't feel like I was a particularly pretty girl back then but I wasn't really bothered by my plainness. I didn't feel demeaned or harassed, some guy was being a jerk and then he was gone, that's all. I didn't know I'd remember it forever as the first of many catcalls I would hear over the next decade or so but that's how I think of it now. As an introductory lesson to gritting my teeth and ignoring the harassment I would soon experience on a regular basis. It didn't start for me in the big city, walking near a construction site in a short skirt, or running in the park in a tank top. It was a small town of 1500 people and I was taking my jacket off.
I was nineteen and I had an apartment in the city about a half hour from home. It was my first place of my own and I loved living alone, I have always craved independence. I didn't know a lot of my neighbors, I kept to myself. One day I was walking to the mailbox, just about five minutes from my front door. I was wearing jeans and a purple shirt with short sleeves and a flower embroidered over the left shoulder. A car went by me driving too fast, and a middle aged person (I can't bring myself to call him a man because he isn't one) put his head out the passenger window and bellowed at me "Whoo! Hey, girl! Look at them titties!" I was nineteen. I was a teenager and a middle aged person had just loudly and publicly commented on my breasts in the rudest, grossest way possible. I didn't ignore him, I couldn't, I turned and watched the cowards speed away. I was just shocked. I wanted to put a rock through their window. I couldn't. They were gone. There was nothing I could do. Its been ten years and I still think of that day, that guy, the thing he said to me, how I wanted to call him out, hurt him, break his car. How even if he hadn't sped away I wouldn't have done any of those things. I would have turned my back, gone home. I was nineteen and he was bigger than me and scary. I was a few steps from my mailbox, there was a man there checking his mail. He said "That wasn't very polite." No it wasn't. I was so embarrassed. I agree, "Yeah", I said. I went home.
I was twenty seven and had lived and traveled around and pretty much heard it all. The honking horns, the drive by shoutings, on the street, on the bus, on my bike, strange men commenting, hollering, commanding, Hey girl, hey beautiful, you're gorgeous, nice dress, smile, smile, smile, nice tits, nice legs, smile, you're hot, where you going, wow, smile, where you going, I'll take you, sweetheart, baby, shorty, great body, smile, honey. And I've been ignore, ignore, ignore, ignore, ignore, for years I'm ignoring. FOR YEARS I'm ignoring. But this one day, this one guy, this one fucking guy really put me over the edge. I was walking to the bus stop, I was in a good mood. I had injured my leg a few weeks before and was finally off crutches and happy to be walking again. It was daytime on a moderately busy street and I was crossing when a truck stopped, he was friendly. "Where are you going? I'll drive you." I was friendly, too. "No thanks, I'm not going far." I was wearing a yellow tank top with denim shorts and sunglasses. I passed by his truck, I was walking away. He said "Your tits really bounce when you walk." My middle finger shot up over my shoulder without missing a beat, without turning around. I've heard this shit before, asshole, you're not ruining my day. I was walking away. He said sarcastically, angrily, "Yeah, I was really gonna rape you in the ass." I was walking away. It was daytime, I wasn't scared but I was mad. What if this wasn't a busy street on a sunny day? What if it was dark and empty? Then I might have gotten in that car, I might have been put in that car. The anger in that person's voice because I didn't get in his car, it was like I had robbed him of something he deserved. I will never forget his rage, his childishness, his entitlement. He wasn't my first harasser or my last but he sure gave me something to remember him by. I told some friends, I never forgot, I found some support, found some women like me, I found out that most women are like me but a lot have it worse. I found out I'm done ignoring and I'm looking for solutions.
I was twenty eight, I was walking home, the ATM wasn't working, I was frustrated. I was wearing a jean skirt and striped yellow halter top, I was sweaty and gross. A truck went by, honked his horn at me and turned into the gas station across the street. Not today, guy. Not today. I barely waited for traffic to let up before I crossed and made a beeline for the red pickup. He was watching me approach, I don't know if he was happy or scared to see me coming at him. "Hey, did you just honk your horn at me?" He got really flustered. "I was just saying hello." he said " You're very pretty," I told him that's not a nice way to say hello, that its so rude, I should be able to walk from here to there without hearing that. He was apologetic, embarrassed. I felt a little bad after, it isn't his fault no one ever told him women are people and deserve to be respected, not honked at. Then I got mad at myself for feeling bad because a grown up person should know better and it is his fault. That was the first time I ever confronted a harasser but not the last. I wish I could say I had confronted all of the ones that came after red pick up truck guy but I haven't. Most of them drive away, a lot of them are bigger than me, I'm almost always alone when it happens. I flip people off more than any other small town girl I know. Sometimes I ignore still. But if I feel safe enough, if they stay in the area I try to call them out as much as possible. Maybe some of them will listen and one less woman or girl will have to endure one less holler. Or maybe it just makes me feel better. Whatever, fuck these guys.
Yesterday, I'm twenty nine, riding the train, a drunk man is talking a woman, asking her if she has a boyfriend and when she's going to dump him. He asks to sit next to her but she says she's getting off the train. I wonder if that's her real stop or if she'd rather walk than sit next to this guy. After she leaves he slurs a conversation with another young woman who is being more polite than I would. When its his stop he puts a hand out for her to shake and when she gives him hers he brings it up to his lips and kisses it and then rubs her head like she's a dog before he exits. She looks a little shaken, runs her fingers through her hair and moves to my side of the train. I feel guilty, I should have said something to him, told him to leave her alone, spoken up because she wouldn't or couldn't. She looks troubled, I wonder if this is the guy she will never forget. That she'll think about, get angry about, wish she would have told him to fuck off, wonder if he would have hit her if she did. He was a foot and a half taller than her and large and drunk in the afternoon. I don't think I'll forget her. I get off the train and man asks me for a lighter, I don't have one, sorry, as I'm walking away he tells me I have an impeccable body. I'm wearing a white t shirt and shorts. I tell him he needs to keep those comments to himself, that it isn't nice constantly hear things like that every time I leave the house. He's confused, I walk away.
2 comments
I have zero tolerance for anyone who makes overtly sexual comments to woman, especially if they don't know them, however like most of us I guess I used to feel that bowing my head and not saying anything was helping me.
It wasn't and it wasn't helping them realize their idiotic ways either.
So on my usual trip home I encountered the same general comments on a section home near the local pub… no surprises there. However this time I decided to comment back…
Mid 40's Creep: "Hey looking good, all you need now is a smile!"
Although I would have usually kept walking I turned and I said "And all you need is to loose the creepy attitude, but have a nice day…" With a gigantic smile on my face that screamed sarcasm and my middle finger raised high.
I got called a bitch after saying it… And again I turned and said "Well maybe if you weren't such a disrespectful asshole I wouldn't need to be. Now have a lovely lonely evening sir." Again with the biggest smile I could.
He didn't know what hit him…
Proudest Moment Ever!!!! Gonna do this from now on… Smiles and Sarcasm seemed to work against these brainless creeps.
no comments
I was walking across the USC campus parking lot in the middle of the day when a middle-aged man called to me from the sidewalk. He was standing with a parking guard. He said, "Excuse me, young lady, aren't you going to say hi to two handsome men?", gesturing to the guard and himself. They were both smirking. I smiled and kept walking and he called after me, "That's better, sweetheart."
It doesn't matter where or you are, if you are not "controlled" by men, they feel the need to establish their power. What they don't realize is, that makes them all the more powerless.
one comment
Was walking thru Times Square after work at 11pm Saturday Sept 20, looking down texting my boyfriend (not that it should matter but I was wearing somewhat baggy jeans and a blousy three quarter length Tshirt) when an apparent comedy club ticket seller with no teeth (short guy in a black hat and suit jacket) shouted at me "Hey you should smile!" And I flipped around and told him no thank you he continued talking saying he was a comedian and wanted "me" to smile.
Then a block later on 46th and 7th a guy standing in a group of two guys and a girl at a hot dog stand, repeatedly yelled to me "hey miss! Hey miss!". I ignored him thinking he either wasn't talking to me and if he was I wasn't about to entertain him. He then yelled "hey BITCH!" I stopped , turned around, glared at him and said excuse me!? He laughed in my face, as well as the other two guys and girl while he bragged to them "told you she'd turn around". I was so angry and shocked I just continued on my way home.
no comments
Catcalled by a boy, about 8, who was congratulated by his father.
no comments
A tale about my evening commute home and my adventures with creepy smarmy guy and skulking threatening guy on the same bus.
I was on the bus home 22/09/14 about 6:30 this evening and this guy came up the stairs, immediately clocked me and came and sat RIGHT next to me. There were double vacant seats behind me and he was literally RIGHT UP AGAINST ME. I gave the passive agressive sort of shifting further away and he had the nerve to turn to directly face me with a creepy smile on his face and say "thank you". (ew) I set my face to bitch resting and stared out of the window while keeping an eye on his cell phone which he was playing around with a lot. I could see him very often turning and staring at me, it was pretty scary I had no idea what this creep might try so I got my keys locked between my fingers of one hand and made it very clear by hardening my expression further that I didn't want to be bothered.
He then suddenly leaned in close, I leapt a mile and he started whispering "do you have the time?" He was both holding a bloody phone and had the clock on the sign in plain sight. I made a snarling face and pointed to the clock and said loudly "Its 6:44." Making people look around at us, it also made me feel slightly more in control as he then shrunk back and started grumbling into his phone.
I got off a stop early just in case he tried following me so I could run into the nearby bar if need be and so stood up waiting for him to let me past but he stretched his knees further forward and grinned at me signalling for me to step over him. Really angry by this point I barged straight into his legs taking care to rake the heels of my chunky boots hard across his shins and forcing him to spin round to the side letting me past. He made a hissing sound and I felt pretty smug and empowered about it.
BUT THEN I was going down the steps and this guy was standing in the stairwell taking up the entire space and glowering up at me from under his baseball cap, his feet stretched forward covering the whole floorspace. He made a kind of sneering face at me as I came nearer and it was clear he wasn't going to move and I would have to clamber around him like a bloody idiot. I decided not to rock the boat, he looked like a regular at Pentonville so made to step over one outstretched leg – but purely by accident ended up losing my balance and bringing my trusty boot slamming down onto his toes. He cried out and said something like "argh, bitch!" I'm not sure, I was already hurrying out of the bus and straight into the bar, there wasn't any need though as he didn't seem to follow me off.
I was pretty scared and angry at the time at these two creeps who try to threaten and letch on random women but looking back at it now I'm grinning like an idiot as in my small way I was able to reclaim a bit of control and give them a gift from the karma gods. Enjoy the single life fellas!
Craving a late night cup of joe from the Starbucks in the Duke Hospital, my friend and I waited on the corner to cross the five-lane deserted street. Entranced in our conversation, we hardly noticed the car slowing to a stop on our left. Before making their right turn, the men in the car decided it would be appropriate to halt mid-turn and comment on our "asses" and "how fine" we are and that they would love to "give us a ride." I wonder how could they even see our asses, considering it was the middle of winter and we had on more layers than an onion. Scared, we didn't make eye contact or reply, hoping they would just go on their way. Luckily, they kept on driving, while we ran across the road into the safety of the hospital.
no comments
I was walking my dog at around 11 pm in a family housing area on a military base when a male at a house across the street, presumably there for a party or something, started hollering at me about my "tiny shorts" and walking around by myself at night. I didn't hear anyone else in the group either encourage or discourage him. I considered yelling back at him, or even just flipping him off, but decided against it for my safety as I was approaching a darker and less populated area. Just goes to show street harassment is an across-the-board issue.
no comments


text:
This offseason has been like no other in Flyers' history. With a huge changeover in talent and leadership, there is great potential for something great to happen for the 2011-2012 Flyers. However, as history has shown, there is also ample opportunity for disappointment. For every Ron Hextall, there is a Dominic Roussell.
Here is a look back at the eight biggest disappointments in Flyers history.

subset: commoncrawl


text:
Fortress Forever.
Type. Online FPS remake of TFC.
Now many of you will say why play this when we have TF2? Well it plays very differently and its the source version of TFC for fans of that game who didn't like what they changed with TF2. It's a very well made polished mod with little bugs and I thought it was fantastic but the only problem is lack of players which came about because of TF2.
Great mod that needs to be played atleast once by all the TF fans and Online shooter fans alike.
Overall Score. 4/5
Type. Online FPS.
The problem with this game is it's all rather "meh" and doesn't feel that much like Stargate but the weapons and the character models which are poorly animated. I expected explosions and vehicles and just the epicness of StarGate and Instead I got an under average FPS that played more like an old 90's TDM.
Overall Score. 1/5
Zombie Panic! source
Type. Coop zombie FPS.
Source has yet another Zombie mod which does nothing new and still has poor levels, character models, AI and Animations. I wouldn't really bother with this game or Zombie Master because you can get the same fun on CSS zombie mod servers and they have more people playing and set on better mechanics with better level design. Really when L4D comes out all these crap zombie mods will die away but until then Source seems to have a whole bunch of unoriginal crap ones.
Don't bother.
Overall Score 1/5
Garry's Mod
Type. Create your own content sandbox Editor for Source.
It's hard to describe Garry's Mod but it is a editing tool that lets you use the source engine to create stuff and some people have even created game mods out of it, Including another zombie mod :D yeyyyyy! lol... Theres lots of tools aswel which let you change the facial expressions of characters and use physics to build contraptions. It's just really hard to explain because theres so much you can do and people use it to create movies like the famous and best game film ever made, War of the Servers.
It's a really fun mod that lets you play through all your source games using it and even go on multiplayer. However if you have no imagination then I suggest not playing it because theres no base structure of a game. So my only complaint is it can be hard to find the fun because of this as you have to create it every time you play.
Overall Score 4/5
Dystopia 1.1
Type. Cyber Punk Online FPS.
Theres lots of customization with this game and it's well polished and nicely done but I never understand what I was really doing with this game because it doesn't try to explain anything and theres lots of windows coming up at once. The shooting mechanics and weapons all seem like your average FPS too and doesn't try to do anything special but it just seems like to me they pushed the boat on the customization. I never gave this game a long play because I just didn't find it fun but you might so give it a try.
Overall Score. 3/5
Type. Online FPS.
This game reminded me of BF2 where you have a commander leading the team but then it also reminded me abit of Quake Wars where you have to lead your main vehicle through the level and it's like a mobile base. MY main problem however is professional games have done this type of Strat mixed in with FPS much better. Also the level design was pretty piss poor and the character models and animations were the same. I'll be honest I only play for an hour or so but I didn't really like it all that much but I can't really fault it for being really bad but just not worth playign while there are better games.
Overall Score. 2/5
Type. Platform Puzzler.
I thought this game was great and I loved the look of everything been hand made with cardboard and paper then coloured in and joints held together with butterfly pins. It reminded me of being back at lower school and all the materials we'd use to make pictures and that. I really liked the idea behind the game but.......... I found it annoying because the game is pretty hard and you get past a part that took you ages and then you die and have to start the whole level all over again. Also I found the controls to be kinda clumsy at times like with the combat side of you.
Overall Score. 3/5.
Goldeneye Source
Type. Online FPS remake of N64 classic.
I loved how they added jump into this game and it's a weel made remake but again lacks abit of polish. Theres not very many people playing only about two or three servers that are populated so that lets it down abit. However getting into the game it's a great laugh with friends talking about the good old Goldeneye days but the game is really just a gimmick and wont hold interest for too long. Also it doesn't have the feel of the old game because 3 other mates arn't sitting in the same room with you playing but the good side to this is you can have more than 4 people in multiplayer now :D
Overall Score. 2/5
Pirates, Vikings and Knights II 2.1
Type. Melee Online FPS.
I had great fun with this mod and the classes are all well done and you can have some crazy fun battles. However like many mods I don't find the visuals appealing and it is quite buggy. Also I'd still rather just play Dark Messiah for melee combat even though this game got the combat feel done much better than AoC that I played before. So if your dream is to fight with Pirates, Vikings and Knights then i spose this mod has the niche in the market.
Overall Score. 2/5
Weekday Warrior
Type. Adventure Game.
I loved this mod because it brought back old skool adventure game type gameplay but put it in source and makes use outta stuff like physics. I really liked the mini games in it too and how the whole game feels jam packed with fun with lots of different gameplay elements, I really liked how they did a metal gear solid style sneak park of the game. The best thing about it however is the witty and funny writing which is important to any adventure game and they got it right on the money. My only fault (which is a big one) is how the game controls and instead of point and click you use the WASD keys to move around. This sounds fun in theory but its very akward in this game and it feels rather too fats and just off. Also the characters can just stand there doing nothing at time which feels abit lifeless and in adventure games normally they're animated much better. That said though Weekday Warrior is a fantastic mod that everyone needs to play.
Overall Score. 4/5


text:
This course contains the basics of Sap BoCourse introduction
Resolving join problems in a schema 4
This describes the types of problems that can arise as you create joins between the tables in your schema. It explains how you can detect and resolve these join problems to ensure that the join paths taken by queries run on the universe return correct results
Here the variable $INSTALLDIR is the install root path for the data access files used by Designer and Web Intelligence. This is the Business Objects installation path with the operating system sub directory that contains the Designer executable and the data access drivers.
Under Windows$INSTALLDIR = ... Business Objects Business Objects Enterprise 12.0 < win32_x86. For example C: Program Files Business Objects Business Objects Enterprise 12.0 win32_x86.What is a join path problem?
A join path is a series of joins that a query can use to access data in the tables linked by the joins.
Join path problems can arise from the limited way that lookup and fact tables are related in a relational database. The three major join path problems that you encounter when designing a schema are the following:
You can solve all these problems by creating aliases (a copy of a base table), contexts (a defined join path), and using features available in Designer to separate queries on measures or contexts.
This briefly defines lookup and fact tables, and describes the types of join path problems that you can encounter using these tables. It explains how you can use aliases, contexts, and other Designer features to resolve join path problems in your universe schema.
In Designer, you typically create joins between lookup tables and fact tables.
What is a Lookup Table
A lookup (or dimension) table contains information associated with a particular entity or subject. For example, a lookup table can hold geographical information on customers such as their names, telephone numbers as well as the cities and countries in which they reside. In Designer, dimension and detail objects are typically derived from lookup tables.
What is a Fact Table
A fact table contains statistical information about transactions. For example, it may contain figures such as Sales Revenue or Profit. In a universe, most but not all, measures are defined from fact tables.
What Types of Join Paths Return Incorrect Results?
Queries can return incorrect results due to the limitations in the way that joins are performed in relational databases. Depending on how the lookup and fact tables in your table schema are related, join paths can produce instances where a query returns too few, or too many rows. The following types of join paths can produce incorrect results:
Detecting and Solving Join Problems
Designer provides a number of methods for detecting and solving join problems.
You can use the following methods to detect and solve join path problems:
Most join path problems can be solved by creating an alias or implementing a context. You can use the automatic loop detection tools in Designer to identify loops in the schema, and automatic context detection to identify where Chasm traps occur. However, to resolve fan traps, you have to be able to visually analyze the schema and create aliases and if necessary contexts manuallyDefining aliases
Aliases are references to existing tables in a schema. An Alias is a table that is an exact duplicate of the original table (base table), with a different name. The data in the table is exactly the same as the original table, but the different name "tricks" the SQL of a query to accept that you are using two different tables.
The Beach universe schema contains two alias tables; Resort_Country (the alias for the Country table) and Sponsor (the alias for the Customer table).
How are Aliases Used in a Schema?
You use aliases for two main reasons:
Tip: Another possible use of aliases is to create an alias for each table as it is inserted into the schema. You then build the schema using the alias tables, not the original base tables. You place the base tables together away from the main universe structure. This allows you to give meaningful names to tables, and prevents the need to rebuild major sections of a universe structure should a base table need to be aliased at a later stage.
Using aliases to solve loops
The most common use of aliases in universe development is to solve potential loops in the use of common tables. A loop is a set of joins that defines a closed path through a set of tables in a schema. Loops occur when joins form multiple paths between lookup tables You use an alias to break a loop by providing alternative table for an original lookup table that is being used for multiple query paths.
Using aliases to solve fan traps
Aliases are also used to solve potential fan traps. These can occur in a serial one-to-many join path that can return inflated results when aggregates are summed at the "many" end of the joins.
Creating Aliases
You can create aliases manually, or let Designer automatically detect potential aliases that will solve a join path loop.
You need to create an alias manually to solve a fan trap. You also create aliases manually if you are creating a schema using only aliases and not the base tables.
Creating an alias manually
To create an alias manually:
The Creating an Alias box appears. It prompts you to enter a name for the new alias.
Note: The name that you give to an alias should be relevant to the role of the alias to distinguish it from the base table. For example, Resort country is an alias for Country. Resort Country is used for queries returning data for resort countries, the base table Country is used in queries returning data for customer countries.
Tip: To avoid confusing base tables with aliases, you can display the alias with the name of the base table it represents in the table title as follows: Select Tools > Options > Graphics, and then select the Aliased Name check box.
Renaming an alias
You can rename an alias at any time. Alias and table naming conventions are RDBMS dependent. You can rename an alias directly by renaming the table, or from a list of aliases in the universe.
Renaming an alias directly
To rename an alias directly:
The Rename Table dialog box appears.
The availability of the Owner and Qualification fields is database specific. If they are active, then you can modify these as necessary.
Renaming an alias from a list
To rename an alias from a list:
Deleting an alias
You delete an alias in the same way that you delete a table. If you have defined objects using the alias, you must modify these objects before you delete the alias, so that they use another table, or delete the objects if they are no longer necessary. If you do not modify or remove the objects using a deleted alias, queries using those objects will generate errors in Web Intelligence.
To delete an alias:
Right click an alias and select Clear from the contextual menu.Or
Click an alias and press the DELETE key.
If any objects use the alias, the following message appears:
If no objects use the alias, you do not receive a confirmation box. The alias is deleted immediately.
The alias is deleted from the Structure pane.
Contexts are a collection of joins which provide a valid query path for Web Intelligence to generate SQL.
How are Contexts Used in a Schema?
You can use contexts in a universe schema for the following purposes:
Using contexts to solve loops
The most common use of contexts is to separate two query paths, so that one query returns data for one fact table, and the other query returns data for another fact table. You use contexts to direct join paths in a schema which contains multiple fact tables. Aliases are not appropriate in such schema.
Using contexts to solve chasm and fan traps
Contexts are also used to solve potential chasm traps. These can occur when two many-to- one join paths converge on a single table. Multiple rows can be returned for a single dimension causing inflated results. Contexts can split out the query so that the correct number of rows are returned for the dimension. Contexts can also be used with aliases to solve fan traps.
Using contexts to determine AggregateAwareness incompatibility
You can use contexts to exclude objects that are not compatible with an object using the @AggregateAware function in its definition, from being used in a query with the aggregate aware object. .
Creating a Context
You can let Designer automatically detect contexts, or you can create contexts manually.
If you are using a context to resolve a loop or a chasm trap, you should always let Designer detect the contexts. However, for solving a fan trap (another join path problem), you may have to manually build a context.
Note: When you create one or more contexts, all joins must be included in one or multiple contexts. If a table is linked by a join that is not included in a context, the join will not be considered when a query is run.
The following procedures describe how you can create a context automatically an manually.
Creating a context automatically
To create a context automatically
The Candidate Contexts box appears. It proposes candidate contexts for your schema. These candidate contexts may be necessary to solve either loops or a chasm trap, as chasm traps exist at the branch where two contexts meet.
The contexts are listed in the Contexts pane when List mode (View > List Mode) is active. The context for invoice Line is shown below.
Creating a context manually
To create a context manually:
The New Context box appears.
You have the following options when creating the context:
Designer checks the selected joins for any loops.
The context is created.
Editing a context
You can use a context editor to modify the following properties of a context:
You can also check the context for any unresolved loops.
Editing context properties
To edit context properties:
The List pane appears above the Structure pane. It contains list boxes for all the
tables, joins, and contexts in the Structure pane.
The Edit Context box appears.
The modifications appear in the context.
Deleting a context
You can delete a context at any time from the Context list in the List pane. If you are adding or deleting a table or join within a context, you should delete the context before making the modification to the table or join.
Once the modification is complete, you can either manually recreate the context if it is being used to solve a chasm trap, or use Detect Contexts to automatically detect a new context if it is being used to resolve a loop.
Deleting a context from the Context list
To delete a context from the context list:
The context is removed from the list.
Updating contexts
Contexts are not updated automatically when the universe structure is changed. If you add or remove any tables to the structure, or if you add or remove any joins, you must update all the contexts.
If you have made only a simple change to the structure, you can update the joins that are included in each context manually using either the Edit Context box or the List pane. However, if you have made significant changes to the universe structure, you should delete the current contexts and re-create them.
Join Paths that Prevent Context Detection
A one-to one-cardinality positioned at the end of a join path can prevent Context Detection in Designer from detecting a context. You resolve this problem by changing the cardinality of the table at the end of the join path to one-to-many.
Example: One-to-one cardinality preventing context detection
The schema below shows a table Sales_Extra_Info that contains particular information about each sale. It is joined by a one-to-one join to the Sales table.
When you visually examine the join paths, there are clearly two contexts in this schema; a reservations context, and a sales context. However, when you automatically detect contexts on this type of join path (Tools > Automated Detection >Detect Contexts), you receive the following message:
Designer has not considered the one-to-one join at the end of the join path in the context detection, so does not consider that there are two contexts.
Changing cardinality to allow the context detection
You solve this problem by setting the cardinality of the join linking Sale_Extra_Info to Sales to one-to-many. It can also be many-to-one, the important factor is not to have the one-to -one join at the end of the join path.The schema below now has a one-to-many join at the end of the join path.
When you run Detect Contexts, the two contexts are detected as shown below:
How do Contexts Affect Queries?
Depending on how you allow Web Intelligence users to use the objects defined on schema structures, contexts can lead to three types of queries being run:
You can run these types of queries in Web Intelligence to test the SQL generated by the contexts. If any of these query types produces an error, or returns incorrect data, you need to analyze the concerned join paths.
Ambiguous queries
An end user is prompted to choose between one query path or another. This occurs when a query includes objects that when used together do not give enough information to determine one context or the other.
When a query is ambiguous, Web Intelligence displays a dialog box that prompts the user to select one of two contexts. When the user selects a context, the corresponding tables and joins are inserted into the SQL query.
Example: Running an ambiguous query
A Web Intelligence user runs the following query:
Give me the services used by each age group of visitors for each resort:
When the query is run, a dialog box appears asking the user to choose a context, in this case either the Reservations or Sales context:
The user must choose if they want information for services reserved by age group, or services paid by age group. If they select the Reservations context, the following SQL is generated:
SELECT Service.service, Age_group.age_range, Resort.re sort FROM Service, Age_group, Resort, Customer, Reserva tions, Reservation_Line, Service_Line WHERE ( Resort.re sort_id=Service_Line.resort_id ) AND ( Ser vice.sl_id=Service_Line.sl_id ) AND ( Customer.age between Age_group.age_min and Age_group.age_max ) AND ( Customer.cust_id=Reservations.cust_id ) AND ( Reservation_Line.res_id=Reservations.res_id ) AND ( Reservation_Line.service_id=Service.service_id )
The joins referenced by the other context (Sales) do not appear in the SQL.
Inferred queries
A Web Intelligence query is run without prompting an end user to choose a context. The query contains enough information for the correct context to be inferred. For example, a user runs the following query:
Give me the number of future guests by age group for each available service:
When the query is run, the data is returned without prompting the user to select a context. The Future Guests object is a sum on the Reservation_Line table, which is part of the Reservations context. Web Intelligence infers that the Reservation context is the one to use for the query.
Incompatible queries
Objects from two different contexts are combined in a query. The two Select statements are synchronized to display returned data in separate tables.
Example: Running an incompatible query
A Web Intelligence user runs the following query:
Give me the total number of guests company wide by age group and the months that reservations were made.
When the query is run, no prompt appears as Web Intelligence infers the use of both the Sales and Reservations contexts. The Select statements for both contexts are synchronized as follows:
The query is split into two parts:
When retrieving the results of the two queries, Web Intelligence combines the results (using Age Group). It then displays the results in two tables in the same report as follows
To allow incompatible queries to be run in Web Intelligence, you must select the Multiple SQL statements in Designer for each context option. This is described below.
Selecting Multiple SQL statements for each context
To select Multiple SQL statements for each context:
The Universe Parameters dialog box appears.
The SQL page appears.
In a relational database schema, a common type of join path that returns too few rows is called a loop.
What is a Loop?
A loop is a set of joins that defines a closed path through a set of tables in a schema. Loops occur when joins form multiple paths between lookup tables. An example of a loop is shown below.
The schema contains two linked sets of information:
These two sets of information are linked in a common join path forming a loop. The lookup table Country can be the country where a resort is situated, or the country in which a customer lives.
Why loops in a universe schema and not in the database?
In a database, multiple paths between tables may be valid and implemented to meet specific user requirements. When each path is included individually in a query it returns a distinct set of results.
However, the schema that you design in Designer often needs to allow queries that include more than one path, which a relational database may not be designed to handle, so the information returned can be incorrect.
The rows that are returned are an intersection of the results for each path, so fewer rows are returned than expected. It is also often difficult to determine the problem when you examine the results.
How Does a Loop Affect Queries?
If you created a universe based on the above structure, any query run against the tables in the loop would return only results where the country values for resorts and the country values for customer origin are equivalent. This double restriction on the shared lookup Country table returns fewer rows than expected.
Example: Loop returns incorrect results
You create the following objects using the schema that contains the above loop:
You run the following query in Web Intelligence:
For each resort country, give me the number of guests from each country that stay at each resort.
You would expect the following type of result:
For the resorts in France and the US, you have the number of German, Japanese, and US visitors staying in resorts in those countries.
However, when you run the query using the universe containing the loop, you receive the following results:
This suggests that only visitors from the US stayed in resorts in the US. No other visitors came from any other country.
What is the loop doing to the query?
The joins in the Structure are used to create the Where clause in the inferred SQL of a query. The purpose of the joins is to restrict the data that is returned by the query. In a loop, the joins apply more restrictions than you anticipate, and the data returned is incorrect.
The Where clause created by the loop is shown below:
WHERE ( Country.country_id=Resort.country_id ) AND ( Resort.resort_id=Service_Line.resort_id ) AND ( Ser vice_Line.sl_id=Service.sl_id ) AND ( Service.ser vice_id=Invoice_Line.service_id ) AND ( Sales.inv_id=Invoice_Line.inv_id ) AND ( Cus tomer.cust_id=Sales.cust_id ) AND ( City.city_id=Cus tomer.city_id ) AND ( Region.region_id=City.region_id ) AND ( Country.country_id=Region.country_id ) AND ( Service_Line.service_line = 'Accommodation' )
The following two joins are both applying a restriction to the Country table:
Country is serving two purposes:
This creates a restriction so that data is returned only when the resort country is the same as the customer country. The resulting report shows only the number of visitors from the US who visited resorts in the US.
Depending on the nature of the loop, you can resolve the loop in Designer using either an alias to break the join path, or a context to separate the two join paths so that a query can only take one path or the other.
How does an alias break a loop?
An alias breaks a loop by using the same table twice in the same query for a different purpose. The alias is identical to the base table with a different name. The data in the alias is exactly the same as the original table, but the different name "tricks" SQL into accepting that you are using two different tables.
Note: You can resolve the loop satisfactorily by creating only one alias table in the example we have been using. The Region join uses the original Country table, while the Showroom join uses the alias table. However, you could create a separate alias table for each join in the original table. In some relational database systems, this is necessary.
Example: Breaking a loop with an alias
The schema below is the same schema that contained the loop above. It shows a join path in which the Country lookup table receives only the "one" ends of two joins, so it can be used for the following two purposes in the join path:
You create an alias for Country and rename it Country_Region. The two "one" ended joins are now separated as follows:
The schema now appears as shown below:
When you run the same query that produced too few rows in the previous example:
For each resort country, give me the number of guests from each country that stay at each resort.
The Where clause for this query is now:
WHERE ( City.city_id=Customer.city_id ) AND ( City.region_id=Region.region_id ) AND ( Country.coun try_id=Region.country_id ) AND ( Resort_Country.coun try_id=Resort.country_id ) AND ( Cus tomer.cust_id=Sales.cust_id ) AND ( In voice_Line.inv_id=Sales.inv_id ) AND ( In voice_Line.service_id=Service.service_id ) AND ( Re sort.resort_id=Service_Line.resort_id ) AND ( Ser vice.sl_id=Service_Line.sl_id ) AND ( Service_Line.ser vice_line = 'Accommodation' )
There is now one join applying a restriction on the Country table and another join applying a restriction on the Resort_Country table. The loop has been broken.
When the query is run, the following table is returned:
How does a context resolve a loop?
A context resolves a loop by defining a set of joins that specify one specific path through tables in a loop. It ensures that joins are not included from different paths within the same SQL query.
You often use contexts in schema that contain multiple fact tables ("multiple stars") that share lookup tables.
Example:Resolving a loop with a context
The schema below contains statistical information about sales and reservations. The statistics relating to each type of transaction are stored in the fact tables Sales and Reservations. The schema contains a loop as a join path can follow the sales path or the reservations path to get service information.
If you created an alias for the Customer so that you had a Customer to Reservation join and a Customer_Sales to Sales join, you break the loop, but if you want to add a City table to the schema, you end up with a loop again as shown below:
You must continue creating aliases for each new table you add to the schema. This is difficult to maintain, and also ends up proliferating the number of similar objects using each table in the universe.
The only way to resolve this loop is to leave the loop in place, and create a context that specifies one or the other path around the schema. This ensures that queries answer questions for one transaction or the other, such as: Is the customer information needed from the perspective of sales or reservations
In the example, you can follow two different paths from the Customer table to the Service table:
The Reservation_Line context appears :
The Sales_Line context appears:
You then create different sets of objects from the tables in the different contexts. Users can then run either Reservation queries or Sales queries, depending on the objects they select.
Visually Identifying Loops
You can use the following guidelines to help you analyze your schema to determine whether an alias or context is appropriate for resolving loops.These can be useful to understand your schema, but you should use Detect Aliases and Detect Contexts to formally identify and resolve loops.
Automatically Identifying and Resolving Loops
You can use Designer to automatically detect loops and propose candidate aliases and contexts that you can insert in your schema to resolve the loops.
Cardinalities must be set before detecting loops
Before using the automatic loop detection and resolution features, all cardinalities must be set for all joins in the schema.
It is good design practise to either define cardinalities manually, or manually validate each cardinality that Designer proposes when using the automatic routine.
You can set cardinalities in two ways:
Designer Features to Detect and Resolve loops
You can use the following features in Designer to identify and resolve loops:
General method for identifying and resolving loops
A general procedure for detecting and resolving loops is given below. The sections that describe the step in detail are also given.
Note: If you are resolving loops for a schema that already has objects defined on the tables, then you must redefine any objects that now use an alias and not the base table.
Detecting and creating an alias
You can use Detect Aliases, to automatically detect and indicate the tables causing loops in the active universe. Detect Aliases proposes candidate tables that you can edit, and insert in the schema.
Note: Before using Detect Aliases, verify that all the tables in schema are linked by joins, and that all cardinalities are set.
To detect and create an alias:
The "Candidate Alias" dialog box appears. The left pane lists the table or tables that need an alias. The right pane lists proposed aliases that can be inserted to break the loop.
A suggested name for the candidate alias is listed in the right pane.
A message box prompts you to confirm the creation of the alias.
The alias appear in the Structure pane.
Detecting and creating multiple aliases
Sometimes when you create an alias, you need to create additional aliases to accommodate new join paths. When using Detect Alias, if Designer detects the need for further aliases, the following dialog box appears when you click the Create button.
In such a situation, two options are available to you:
Detecting and creating a context
You can use Detect Contexts to automatically detect the need for a context.
Detect Contexts also proposes a candidate context. You can edit the candidate context before it is implemented.
To detect and create a context:
The Candidate Contexts dialog box appears. The proposed contexts appear in the left pane.
The tables included in the candidate context are highlighted in the schema.
The context name appears in the Accepted Contexts pane. You can remove any context from the right pane by selecting it, and then clicking the Remove button.
The Rename Context dialog box appears. Type a new name.
The contexts are listed in the Contexts box in the Universe window.
If your universe contains a loop that could be ambiguous for a user, you should always give a name to the context resolving the loop that is easy for users to understand. It should be clear to a Web Intelligence user what information path is represented by a context
Automatically detecting loops
You can detect loops in your universe using Detect Loops. This is a feature that automatically checks for loops in the schema, and proposes either an alias or context to solve the loop.
Detect Loops is useful to run quick checks for loops in the schema. It also proposes aliases and contexts to resolve detected loops; however, you have less control over the order that the alias and contexts are created than if you used Detect Aliases and Detect Contexts to resolve a loop.
Note: You can also use Check Integrity to automatically check for errors in universe structures, including joins, cardinalities, and loops. Check Integrity proposes solutions to any errors it discovers.
To detect loops in a schema:
The Loop Detection box appears. It indicates how many loops have been detected and proposes a possible solution.
The detected join path that forms a loop is simultaneously highlighted in the Structure pane as follows:
Creating aliases and contexts automatically
Designer proposes a candidate alias or a context to resolve a loop when you run Detect Loop. You can choose to insert the candidate alias or implement the candidate context directly from the Detect Loops box.
To create an alias using Detect Loop:
The Detect Loops box appears. It indicates one or more loops detected in the schema, and proposes a candidate alias or context for each loop.
An alias is automatically inserted in the Structure pane. It is joined to the table that table that is causing the loop in the schema.
Creating a context using Detect Loop To create a context using Detect Loops:
The Detect Loops box appears. It indicates one or more loops detected in the schema, and proposes a candidate alias or context for each loop.
This loop is not covered by any context.
The Candidate Contexts dialog box appears.
The tables included in the candidate context are highlighted in the schema.
The context name appears in the Accepted Contexts pane. You can remove any< context from the right pane by selecting it, and then clicking the Remove button.
A context confirmation box appears.
The contexts are listed in the Contexts box in the Universe window.
Examples of Resolving Loops
The following are worked examples showing you how to do the following:
These schemas are not based on the Beach universe. They use a schema based on a Shipping company and show another perspective of certain loop resolution.
Creating an alias to break a loop caused by shared lookup tables
A sales database holds information about products sold to customers on a worldwide basis. These customers can:
For example, a customer residing in the UK can order a vehicle and then ask for it to be shipped to Brazil.
The schema for this type of database is as follows:
You can interpret this schema as follows:
The tables and their columns are shown below:
You run a query to obtain the following information:
The SQL to extract this data is as follows:
When executed, this SQL returns incomplete results; only those customers who requested a shipment to their country of residence are returned. The customers who chose another country for shipment are not returned.
The returned rows are an intersection of both the customer's country of residence and the destination country of the shipment. Instead of generating the full results shown below
The SQL returns only these results:
You can break the loop by inserting an alias. The first step in creating an alias is to identify the lookup table having more than one purpose in the database structure.
Identifying multi-purpose lookup tables
The COUNTRY table is used to look up both the customer's country of residence and the shipment destination. This type of table is called a shared lookup table.
You create an alias in the schema called DESTINATION.
The three original joins still exist but the loop has been broken by the DESTINATION alias so there is no longer a closed join path.
Referencing the shared lookup table and alias in the FROM clause
You now need to reference the table name twice in the From clause, the first time with its ordinary name and the second time with an alias; so the original name is suffixed with an alternative name.
The resulting SQL is as follows:
Creating an alias to break a loop caused by shared lookup tables
A sales database holds information about customers living in different countries. These customers can place orders for goods that can be delivered by a number of couriers or shipping companies.
In this database, the names of the countries and shippers have been normalized into lookup tables. Normalization is a process that refines the relationships of tables by removing redundancies.
For structural reasons, rather than two lookup tables, only one lookup table (SYSLOOKUPS) was created with a code, description and type field. The type field indicates the particular type of information the record holds; for example, country or shipper.
Referred to as a "flexible lookup," this type of table often appears in schemas automatically generated by CASE tools.
The schema and table layout are shown below:
The SYSLOOKUPS table serves more than one purpose so you have to create as many aliases as the table has domains (distinct values for the type field). Based on the two purposes that are represented in the SYSLOOKUPS table, you can create two aliases, COUNTRY and SHIPPERS.
The resulting schema is shown below:
In Designer, you create the object Customer's Country defined as COUNTRY.DESCRIPTION and the object Shipper defined as SHIPPERS.DE SCRIPTION.
The corresponding joins would be:
Using self restricting joins to restrict results
Once you have defined the objects, you now need to restrict each alias so that it returns only its own domain information and not that of the others.
For example, if you wanted to know the names of the shippers who dispatched two orders to customer 101, you would expect two rows to be returned.
However, the following SQL
would produce the results below:
The query has returned the names of countries and shippers. Both "Man With a Van" and "USA" share code 1 while "France" and "Parcel Fun" share code 3.
You can correct the error as follows:
Problems using restrictions
When you add the restriction to either the object's Where clause or to the existing join between the alias and the CUSTOMERS/ORDERS table, this can produce the following problems:
Determining when an alias is not appropriate to break a loop
Creating an alias to resolve the loop described above is not the optimal solution. In this case, the use of contexts is a better solution. The following example describes why aliases are not appropriate, and why contexts are a better solution in this case.
If you try to identify the lookup table used for more than one purpose, it is not clear if it is the PRODUCTS table, or the CUSTOMERS table.
If you decide to create two aliases for the PRODUCTS table as shown :
The two aliases are ORDERED_PRODUCTS and LOANED_PRODUCTS.
This could be confusing for users as they are more likely to understand products, and not ordered products or loaned products.
If you also decide to add a COUNTRY table to indicate that the products are manufactured in several different countries you would have to join it directly to the PRODUCTS table.
The resulting schema would be as follows:
In the schema above, it was necessary to create two new aliases, ORDERED_ PRODUCTS _COUNTRY and LOANED _PRODUCTS _COUNTRY. The use of aliases is obviously an unsatisfactory and complicated solution for this particular schema.
In this case, you should create contexts.
Creating a context to resolve a loop
A database contains information about customers who can either buy or rent products. In this database, there are two different ways to present the relationship between the customers and the products:
This database has the following type of schema:
If we wanted to run a query that returns only a list of customer names and a list of products, we could use the ORDER and ORDER_LINES table. The result would be a list of products ordered by each customer.
By using the LOANS and LOAN_LINES tables, we would obtain a list of products rented by each customer.
This schema contains a loop that causes any query involving all six joins simultaneously to result in a list made up of both products sold and rented to customers. If a product has been sold, but never rented to a customer or vice-versa, it would not appear in the list of results.
Using an alias and context together to resolve a loop
You can use contexts and aliases to resolve loops in a universe. The following example shows how to use both aliases and contexts together in a loop resolution.
A universe has the following schema:
You can use aliases and contexts to resolve the loops as follows:
The resulting schema appears as follows:Resolving Chasm Traps
A chasm trap is a common problem in relational database schemas in which a join path returns more data than expected.
What is a Chasm Trap?
A chasm trap is a type of join path between three tables when two "many-to-one" joins converge on a single table, and there is no context in place that separates the converging join paths.
The example below shows a part of the Beach universe schema. The three tables have been separated from the rest of the schema to illustrate the chasm trap. It uses the same Club connection for data. The Service table receives the one ends of two one-to-many joins.
You will get incorrect results only when all the following conditions exist:
The following is an example that shows how queries that are run when all the above conditions exist return a Cartesian product.
Example: A chasm trap inflates results without warning
Using the schema above, a Web Intelligence user runs the following separate queries:
The user now runs a query that includes both paid guests and future guests:
The following results are returned:
The number of guests that have used, and future guests who have reserved to use the Sports service has increased considerably. A Cartesian product has been returned and the results are incorrect. This can be a serious problem if undetected. The above example could lead a manager at Island Resorts to think that sporting activities at the resorts are a more attractive service to guests, than the actual figures would indicate.
How does a chasm trap inflate results?
The chasm trap causes a query to return every possible combination of rows for one measure with every possible combination of rows for the other measure. In the example above, the following has occurred:
The following example examines in detail how a chasm trap returns a Cartesian product:
Example: Examining the Cartesian product of a chasm trap.
We need to examine the rows that are returned by the queries to make the aggregated figures. In our example, we can do this by adding the dimensions Days Billed and Days Reserved to the queries to return individual transaction details.
The Number of Guests report appears as follows:
The Number of Future Guests report appears as follows:
The two reports show the following number of transactions:
When the two dimensions are both added to the query, the following results are returned:
The query returns every possible combination of Number of Guests rows with every possible combination of Number of Future Guests rows: the Number of Guests transactions each appears twice, and the Number of Future Guests transactions each appears three times.
When a sum is made on the returned data, the summed results are incorrect.
Unlike loops, chasm traps are not detected automatically by Designer, however, you can use Detect Contexts (Tools > Detect Contexts) to automatically detect and propose candidate contexts in your schema.
Detect Contexts examines the many to one joins in the schema. It picks up the table that receives converging many to one joins and proposes contexts to separate the queries run on the table. This is the most effective way to ensure that your schema does not have a chasm trap.
You can also detect chasm traps graphically by analyzing the one-to-many join paths in your schema.
If you do not run Detect Contexts, nor spot the chasm trap in the schema, the only way to see the problem is to look at the detail rows. Otherwise there is nothing to alert you to the situation.
Detecting a Chasm Trap
You can find chasm traps by using Detect Contexts to detect and propose candidate contexts, and then examining the table where any two contexts diverge. This point where two contexts intersect is the source of a chasm trap.
If you have two fact tables with many to one joins converging to a single lookup table, then you have a potential chasm trap.
Resolving a Chasm Trap
To resolve a chasm trap you need to make two separate queries and then combine the results. Depending on the type of objects defined for the fact tables, and the type of end user environment, you can use the following methods to resolve a chasm trap:
Each of these methods is described in the following sections.
Using contexts to resolve chasm traps
You can define a context for each table at the "many" end of the joins. In our example you could define a context from SERVICE to RESERVATION_LINE and from SERVICE to INVOICE _ LINE.
When you run a query which includes objects from both contexts, this creates two Select statements that are synchronized to produce two separate tables in Web Intelligence, avoiding the creation of a Cartesian product.
When do you use contexts?
Creating contexts will always solve a chasm trap in a universe. When you have dimension objects in one or both fact tables, you should always use a context.
Using contexts to solve a chasm trap
To use contexts to resolve a chasm trap:
When you run queries on the tables in the chasm trap, the query is separated for measures and dimensions defined on the affected tables.
Using Multiple SQL Statements for Each Measure
If you have only measure objects defined for both fact tables, then you can use the Universe Parameters option Multiple SQL statements for each measure. This forces the generation of separate SQL queries for each measure that appears in the Query pane.
This solution does not work for dimension and detail objects.
The following table describes when you can use Multiple SQL Statements for Each Measure and when you should avoid its use:
To activate Multiple SQL Statements for Each Measure:
A fan trap is a less common problem than chasm traps in a relational database schema. It has the same effect of returning more data than expected.
What is a Fan Trap?
A fan trap is a type of join path between three tables when a "one-to-many" join links a table which is in turn linked by another "one-to-many" join. The fanning out effect of "one- to-many" joins can cause incorrect results to be returned when a query includes objects based on both tables.
A simple example of a fan trap is shown below:
When you run a query that asks for the total number of car models sold by each model line, for a particular customer, an incorrect result is returned as you are performing an aggregate function on the table at the "one" end of the join, while still joining to the "many" end.
Example: A fan trap inflates results without warning
Using the schema above, a Web Intelligence user runs the following query:
The following results are returned:
This result is correct. However, the end user adds the dimension Model ID to the query as follows:
The following report is created with the returned results:
The Sale Value aggregate appears twice. Once for each instance of Model_ID. When these results are aggregated in a report, the sum is incorrect. The fan trap has returned a Cartesian product. Wendy bought two cars for a total of $57,092.00, and not 114,184.00 as summed in the report. The inclusion of Model_ID in the query, caused the Sale Value to be aggregated for as many rows as Model_ID.
The fan trap using dimension objects in the query is solved by using an alias and contexts. The following schema is the solution to the fan trap schema:
The original query which returned the Cartesian product for Wendy Craig, now returns the following table when run with the above solution:
How Do You Detect a Fan Trap?
You cannot automatically detect fan traps. You need to visually examine the direction of the cardinalities displayed in the table schema.
If you have two tables that are referenced by measure objects and are joined in a series of many to one joins, then you may have a potential fan trap.
How Do You Resolve a Fan Trap?
There are two ways to solve a fan trap problem.
Using aliases and contexts to resolve fan traps
You create an alias table for the table producing the aggregation and then detect and implement contexts to separate the query. You can do this as follows:
To use aliases and contexts to resolve a fan trap:
For example, SaleValue in the previous example is an aggregate of the Sale_Total column in the Sales table. You create an alias called Sale_Total for Sale.
If you create a one-to-one join, Designer does not detect the context, and you must build the context manually. In most cases you can use a one-to-many which allows automatic detection and implementation of contexts.
For example you create a one-to-many join between Sale and Sale_Total.
For example the original SaleValue object was defined as follows: sum (SALE. SALE_ TOTAL). The new definition for SaleValue is: sum (Sale_ Total. SALE_ TOTAL).
The Candidate Contexts box appears. It proposes the candidate contexts for the join path for the base table and the new join path for the alias table.Note: If you have used a one-to-one join between the alias and the base table, then you need to create the context manually.
The contexts are created in the schema. You can view them in the Contexts pane when List Mode is active (View > List Mode). The context for the join path CLIENT>SALE>SALE_MODEL appears as follows:
And a second context for the CLIENT>SALE>SALE_TOTAL join path:
Using Multiple SQL Statements for Each Measure
If you have only measure objects defined for both tables at the many end of the serial one- to-many joins, then you can use the Universe Parameters option Multiple SQL Statements for Each Measure. This forces the generation of separate SQL queries for each measure that appears in the Query pane. You cannot use this method to generate multiple queries for dimensions. If an end user can include dimensions from any of the tables that reference the measure objects in the query, then you must use an alias and context to resolve the fan trap.Detecting join problems graphically
You can visually detect potential chasm and fan traps in your table schema by arranging the tables in the Structure pane so that the "many" ends of the joins are to one side of the pane, and the "one" ends to the other. The example below shows the Beach universe schema arranged with a one to many flow from left to right.
Potential chasm trap
The potential chasm traps are shown below:
Both of these join paths have been separated using the contexts Sales and Reservations.
Potential fan trap
A universe schema for a car sales database is shown below:
The potential fan traps involve the following tables
Tip: Once you have populated your schema with the necessary tables, don't start defining objects immediately. Allow some time to move tables around so that you have the all the one-to-many joins in the same direction. Designer is a graphic tool, so use the visual capabilities of the product to help you design universes. An hour or so moving tables around could save you a lot of time later in the design process.Checking the universe
As you design your universe, you should test its integrity periodically. You can verify universe integrity as follows:
Checking Universe Integrity Automatically
You can set the following integrity check options in Designer to parse SQL structures at creation, universe export, and universe opening:
Setting automatic universe check options
To set automatic universe check options:
Checking Universe Integrity Manually
You can use Check Integrity to test to verify if the design of your active universe is accurate and up-to-date.
Check Integrity detects the following:
Before examining the elements of the universe against those of the database, the function checks whether the connection to the database is valid. If the connection is not valid, the function stops and returns an error message.
Types of errors detected by Check Integrity
Check Integrity can detect:
How does Check Integrity determine changes in a connected database?
The Check Integrity function sends a request to the database for a list of tables. It then compares this list with the tables in the universe. It carries out the same action for columns.
In the Structure pane, Check Integrity marks any tables or columns not matching those in the list as not available. These are tables or columns that may have been deleted or renamed in the database.
The option Check Cardinalities can be slow to run with large amounts of data. If there is ambiguous or missing data, results can also be inaccurate. If your database is large, and may have incomplete data entries, then you should not select the option Check Cardinalities. If you do use this option, then you can optimize the cardinality detection by modifying the PRM file.
Verifying universe integrity with Check Integrity
To verify universe integrity:
Click the Check Integrity button.
The Integrity Check dialog box appears.
Select Thorough Parsing check box to verify both the syntax and semantics of components.
A message box displays the universe check progress.
If Check Integrity encounters no errors, it displays "OK" beside each error type.
You can double click an item in the list to highlight the corresponding components in the Structure pane.
Note: Before selecting the Check for Loops check box, ensure that the cardinalities of joins have already been detected. Otherwise, the function erroneously identifies loops in the joins.
Refreshing the Universe Structure
If Check Integrity indicates that the database of your universe connection has been modified, you can use Refresh Structure to update the contents of the Structure pane.
Refresh Structure can modify the universe structure to comply with changes in the database as follows:
Refreshing a universe
To refresh the universe structure:
A message box appears informing you of a change in the database, or that no update is needed if no changes have been made.


text:
St. Anthony's Medical Center in St. Louis recognized National Breast Cancer Awareness Month by hosting a free special event for women Oct. 22.
The "Go Pink and Red for Women" event at the Holiday Inn South County Center celebrated women's breast and heart health.
Activities included interactive health information booths, nutrition and fitness tips, and discussions about breast and heart health, including the opportunity to ask health-related questions of experts. Participants were entered into a drawing to win "Lady in Red" and "Lady in Pink" prizes. A series of speakers presented programs throughout the day on topics including:
• Exercise to Improve Heart Health and Help Prevent Cancer
• Coping with Mental Road Blocks: What It Means to Be a Woman and a Survivor
• Heart Health and Risk Factors
• Looking Good, Feeling Better
• Breast Health Road Map — "Karen's Story"


text:
Classical producer Alspaugh wins Grammy for Florentine/MSO recording
A project with ties to Milwaukee won a Grammy Award early Sunday night in the hours before the start of the 55th annual awards show in Los Angeles.
Blanton Alspaugh won the Grammy for classical producer of the year, in part for his work on the Florentine Opera and the Milwaukee Symphony Orchestra's recording of "Davis: Rio De Sangre," an original opera from Don Davis. »Read Full Article
MSO Pops revels in Great American Songbook
Infectious isn't always a bad thing.
Leaving Uihlein Hall after Friday evening's Milwaukee Symphony Orchestra Pops performance, I stopped counting the number of people who were quietly, or not so quietly, humming strains of the show's encore, the Gershwin brothers' "I Got Rhythm." »Read Full Article(5)
Windfall Theatre struggles to find 'A Time to Live'
There's nothing that terrifies us more or gets talked about less than what it means to die - or the related prospect of soldiering on when those dearest to us are gone.
That's the subject of Howard Goldstein's "A Time to Live," now receiving its world premiere courtesy of Windfall Theatre - an intrepid company that consistently stages plays involving those thorny subjects that matter most. "Time" opened Friday under Carol Zippel's direction. »Read Full Article(2)
Gary Allan show lacks distinctive voice
Gary Allan put on a pretty good show Friday night at the Eagles Ballroom in The Rave.
Why wasn't it great? »Read Full Article(10)


text:
Will cover after I come back from partying, dinner and movie....looks like I may have caught the very top to short, but thats just my opinion
wish me LUCK
Sentiment: Strong Sell
Oh please be so! Please let us know how much you shorted and the expiration. Otherwise, #$%$.
who cares u short u buy
I buy I sell also
now what
tell me reason!
something bad about company's work
is there fraud
r people dying?
r u a research phd
tell me please
Sentiment: Hold
You WILL be squeezed until you pass out. You WILL see...
When do you plan to cover?
Sentiment: Buy
i will post in REAL TIME when I cover, so you know I am for real. now i am late for my movie...


text:
- Hot Springs Adventure Park
at Catherine's Landing RV Resort
- Mon-Sat 10 am-4 pm, Sun 1pm-4 pm.
- (501) 262-9182
- 1700 Shady Grove Rd
- Hot Springs
Haunted Forest Zip Tour
Locals say the ghosts who visit Hot Springs every October are the spirits of the afflicted who were miraculously cured by the magical water that comes from the earth here. Come to the Adventure Park for a rare chance to make your own spirit thrill, as you zip through the dark forest and feel the nip in the air.
$75 (price includes tax)
- Friday, October 28
- Saturday, October 29
Tours at 7:30, 8, and 8:30 each night.


text:
It took a while, but the billboard panels for the fence at the north perimeter of the 300 K Street parking lot have recently been installed. The fence was erected in November 2013 in a way that always foreshadowed the eventual installation of integrated billboards.
The billboard advertises the opportunity for the 300K office building The Wilkes Company plans to eventually build on this site as part of their overall Mount Vernon Place master planned development. Although Wilkes now seems to be branding the project 901 4th Street – which is actually the address of the current MVT CID offices in the former Madrigal Lofts sales trailer. It could be that what they were once calling 300K may now be subdivided into two different buildings.


text:
With Instructables you can share what you make with the world, and tap into an ever-growing community of creative experts.
A PMT function is used when you want to know how much your monthly payment would be on a loan based on an interest rate and a constant ...
The first step calculating your payment using Excel's PMT function is to enter the following: In the cell you want your formula to appear: 1. Type the equal ...
The next step is to enter the number of payments for the life of the loan. If you have a three year loan and you are making monthly ...
The last step in the PMT function is to enter the PV. PV stands for present value and represents the amount of money that you are borrowing. For ...
How to Create a College-Style Budget Using Excelby jkirkland1954
Intro to Excel: Expense Trackerby watchmeflyy
How To Perform Basic Math Function Without Creating a Formula in Microsoft Excelby TechnologyAdvice
Join 2 million + to receive instant DIY inspiration in your inbox.
Download our apps!
© 2016 Autodesk, Inc.


text:
Rain, wind and snow are no match for the warmth and style of the Bos & Co Celina. This women's mid calf boot is set in a rich burnished waterproof leather and suede upper. The full inner side zip allows for easy on/off wear. A faux furn lining and waterproof barrier offers perfect protection from all the elements. No collection would be complete without the addition of the beautiful Bos & Co Celina, so make sure to get yours today!
Enter one or more email addresses, separated by a comma,
or enter addresses from your email address book!
I would like to add a personalized message!
"I think I've ordered four pairs of shoes from PlanetShoes this year. They've all been beautiful, comfortable shoes, delivered on time. What a great site! A real treasure trove for shoe lovers!"
"My experience has been great with Planet Shoes! The shoes were exactly as described and photographed, fit well and were very comfortable! I will recommend Planet Shoes to everyone!"


text:
"Now that women are jockeys, baseball umpires, atomic scientists, and business executives, maybe someday they can master parallel parking."
Related quotes
"This is what the painter, the poet, the speculative philosopher, and the natural scientists do, each in his own fashion."
"For mad scientists who keep brains in jars, here's a tip: why not add a slice of lemon to each jar, for freshness?"
"Most executives, many scientists, and almost all business school graduates believe that if you analyze data, this will give you new ideas. Unfortunately, this belief is totally wrong. The mind can only see what it is prepared to see."
"Professor Mehta is a very well known scientist, but there are many lesser known scientists to whom this is happening. The bigger issue is important."
"People [in Australia] don't see it as a business. We regard ourselves as a profession run by doctors, scientists, technicians and nurses."


text:
Wallingford man charged with felony DUIJune 19,2014Often-suspended
man denies DUI
BENNINGTON A Wallingford man pleaded innocent to felony charges after police said he drove drunk June 1 with 36 active suspensions already on his drivers license.
Theodore W. Thompson, 39, was arraigned Monday in Bennington criminal court on two felony charges related to driving under the influence of alcoho.
He also denied a misdemeanor charge for driving, for the fifth or more time, with a license that had been suspended for DUI.
Trooper Elliott Justinger of the Vermont State Police said he stopped Thompson for speeding early June 1 on Route 7 in Dorset.
Thompsons blood-alcohol content was measured at .158 percent, almost twice the .08 percent legal limit for driving n Vermont.
Thompson was ordered to post an unsecured appearance bond of $5,000 and observe a curfew from 10 p.m. to 6 a.m.MORE IN This Just InMONTPELIER A pending deal between the state and federal governments will give a big boost to... Full StoryWOODFORD A North Carolina man was killed when his motorcycle crashed Friday morning in a... Full StoryMANCHESTER Voters will be asked at town meeting to allow the use of $15,000 from a reserve... Full Story
- Most Popular
- Most Emailed


text:
Ready to watch this entire course?
Become a member and get unlimited access to the entire skills library of over 4,987 courses, including more IT and personalized recommendations.Start Your Free Trial Now
- Overview
- Transcript
- View Offline
Now that we've talked about users and we've talked about groups, we're ready to talk about file and directory ownership. Ownership is an essential part of working in a multiuser environment. It is how Unix can tell which files belong to you, which ones you can access and which ones you can't. You can see the ownership of files and directories whenever we do ls -la. It's the second and third columns that you see there. So the owner of all of these files and directories except for one is going to be kevin. The one that you see as root is the parent directory of that. That's the /Users directory.
That's going to be the parent directory and it's owned by root. But my User folder is owned by me and all the things that are inside that folder are owned by me. The group that owns it, or you can say the group that's assigned to it, is staff. Now we don't need to worry too much about groups on Mac, but I just want you to see it so that you have the conceptual understanding. For contrast, let's take a look at the other user that I've set up on my computer, ls -la /Users/lynda/. So we can take a look at her directory and her files and we can see that the owner of all of these files is lynda.
The group is the same, the group is staff. But hers is lynda where mine is kevin, so we have different ownerships. You can now see that. You can also see that the owners in the group are maintained separately. So when we talk about permissions, we'll be able to set permissions based on the owner and on the group. We can do it separately. And so therefore files that I'm the owner of, I can have one set of permissions, but files that are in my group, I can potentially share with Lynda. I could have files that are readable by anyone in my group and then Lynda and I could both read those files. Even though we don't own the file, we could share it and have those group settings.
So what I'd like us to do is I am going to change into my Unix files directory that's in my User home directory. Let's clear my screen so we can see those files. I am going to create a new file in here. I will just do it using touch and I'll call it ownership.txt. You can really create this anywhere. It's just to have a file that we can work with. So let's do ls -la again. I'll clear the screen. So now we can see that ownership is there and any new file that you create is going to be owned by you. That makes sense, right? It's also going to get your default group. Everyone has a default group and that's what's going to get assigned to it by default.
How do we go about changing that? Well, we do it with the command called chown or chown, depending how you want to say it, but it stands for change ownership. That's where it comes from, change ownership, and so we use chown, space, and then we put in the user:, the group. So we could say, for example, kevin:staff and then the name of the file or directory and that would change the privileges and in this case, I'm changing it from kevin:staff to the kevin:staff. It's redundant, but you can see that it does it.
We also can specify those by just putting in chown kevin ownership.txt, like that. That will change just the owner. Or we can change just the group by doing it with the colon and the group. The colon stays with the group and that lets it know all right, I am not changing the owner. I am only changing the group for this. So we also can do the same thing for directories just so you see. Let's do-- we have test1 as a directory there. Go ahead and just we're not actually changing them to anything different. We are just changing the same one and that will change the owner of the directory.
Directories have owners too. But it doesn't change all the contents that are inside the directory. They all keep whatever ownership they already had. If we want to change everything inside of it then we use the R option, -R. Just like we had for copy and remove, we have this R which stands for recursive to tell it okay, not just this top directory, but everything in it, recursively move through all of the contents of this directory and change all of those ownerships. Okay, so that's how you do is with -R. Just for an example, let's try chown lynda:staff ownership.txt.
Comes up and it says Operation not permitted. Well, you may be thinking "Well, geez what uses this chown if I can only change it to myself, to the person that already belongs to it?" Well, that's true and there's actually a way around it which I'll show you in just a moment. The reason why you can't do it is because we don't want to be able to just give files to other users for security reasons. We wouldn't want to, for example, be able to launch a process and have some kind of program running and then be able to stop and change its ownership permissions to belong to someone else. That's a security concern.
So we are not able to do that. The way that you can do it though is if you are an administrator on the machine. On the Mac that's something that could be managed in those System Preferences for Accounts. If we do that, we can use sudo. We'll be talking about sudo later in this chapter, but I just want to show you for now that you can do it. That if we say sudo chown lynda:staff ownership.txt, it overrides that and it says okay, sure. It wants to know your password to make sure that you are allowed to do this and I put in my user password that I use to log in as kevin, so it's just re-authenticating me to be able to do this.
Now ls -la and now you can see that it's owned by lynda. Now let me do it. So sudo in front of it lets us do chown and so chown is really not that useful without that sudo, but I wanted just to go ahead and see it now even though we are not going to talk about sudo for a couple of movies. Let's just change it back. Let's make it my file again, kevin, there we are and ls -la. Now you can see that it changed it back. You may have noticed that it didn't ask me for a password the second time. It remembered that I had recently entered it.
But we'll talk more about how that works when we cover sudo in depth. Now before we end and move on to talk about permissions, I just want to give you a anecdote of a real world example where I ran into this that it was not sort of web development related, which is the place where I normally end up dealing with ownership and permissions. I bought music from iTunes and I wanted to share it with my wife who is authorized to use my music. So I took it out of iTunes by dragging it on to my desktop and then over our local home network I put them on her Mac. When it got to her Mac though, she couldn't open them up and she tends to me saying "Hey, this isn't working. I don't know why not." Well, it turns out that the owner of the file had not changed.
It still was being owned by me. So even though the files were now on her computer, she didn't have ownership of those files and wasn't able to open them. So I just went on her computer, opened up Terminal, changed the ownership recursively for the folder, and boom! Suddenly she had the ability. She now owned the files and she was able then to play the music. So that's the case we're really knowing what's going on under the hood in Mac OS X and being able to work with Unix can really help you out in real-world non-command line scenarios. Now that we know about the file ownership, we are ready to talk about file and directory permissions, which is what we'll do in the next movie.
- Moving around the file system
- Creating and reading files
- Copying, moving, renaming, and deleting files and directories
- Creating hard links and symbolic links
- Understanding user identity, file ownership, and sudo
- Setting file permissions with alpha and octal notation
- Changing the PATH variable
- Using the command history
- Directing input and output
- Configuring the Unix working environment
- Searching and replacing using grep and regular expressions
- Manipulating text with tr, sed, and cut
- Integrating with the Finder, Spotlight, and AppleScript


text:
A new technology being developed at UCLA could cool off your toasty processor. Don't throw away that heatsink just yet, though. This is a completely new approach to integrated circuit design.
Shrinking technology down requires low-power components with tightly packed components, but Moore's Law go on forever. A new technique that replaces transistors with bits of nanowire could make tiny processors and microcontrollers a reality.
Microsoft's Surface Pro 2 has received a significant upgrade under the table. The new chip is faster by 15-20%, and comes with a set of enterprise features that the old core lacked.
New research from UC Berkeley provides a proof of concept for a magnetic switch that could make computers thousands of times more energy-efficient, and provide some amazing new abilities, too.
A new kind of transistor could be the missing piece of the artificial intelligence puzzle. Harvard researchers are working on transistors that mimic human neurons.
Intel has announced its own intent to fab ARM chips for customers, starting with Altera. This is a fundamental change in how the company does business — driven by the advantages it holds in semiconductor manufacturing.
Last week at their Zurich lab, IBM gave a media tour to show off some of their latest conceptions. The key to making supermachines 10,000 times more efficient, they say, is to build bionic computers cooled and powered by electronic blood.
Researchers from University of Colorado Boulder and MIT may have developed technology that will power future microprocessors. The optical components described in a pair of new studies can translate electrical signals into light, and they can be fabricated using existing facilities and technology.
According to its creators, the process that gave rise to this world first is leaps and bounds ahead of the competition and "can actually start to compete with silicon." Carbon nanotubes appear to be the future of computing.
Researchers created a silicon chip with an integrated graphene photo-detector; the wonder material that seems poised to revolutionize so many industries could change the way we build computers, too.
Subscribe Today to get the latest ExtremeTech news delivered right to your inbox.


text:
Skip to comments.Tiger Woods Ends Victory Drought
Posted on 03/25/2012 5:17:44 PM PDT by Doe Eyes
Tiger Woods finally brought the buzz back to the very thing that made him famous - winning.
Two weeks after another injury scare, and two days before his former coach's book goes on sale, Woods looked dominant as ever in that red shirt on Sunday to win the Arnold Palmer Invitational.
It was his first PGA Tour victory since a sex scandal at the end of 2009 led to one of the greatest downfalls in sports. And with the Masters only two weeks away, Woods looks more capable of ever than resuming his pursuit of Jack Nicklaus in the majors.
(Excerpt) Read more at msn.foxsports.com ...
Reminds me of the guy who said he had a chick every night. What he didn't say was that he asked 50 chicks before one said yes.
And Winning????....Sorry...that quip belongs to Charlie!!
Arnie once said that he thought Tiger would match Jack AND him in majors....
Let's see, no Phil, no Rory....BFD.
Somewhere, Frantzie is cussing and spitting
Phil Mickelson tied for 24th.
...reminds me of when I was in college. There must have been 20 women banging on my door. I finally had to get up and let them out.
usually you are accurate and a good read...it is a BFD
putting lessons ?
Good. Golf needs Woods. If you're a fan of golf, regardless of what you think of him, you know that's true.
The last time I golfed I only hit two good balls all day...and THAT was when I stepped on a rake in the sand trap!
stick a mic on him at a driving range and allow the tapin for teachin as opposed to prep for a tournament and that tape could sell millions....as far as golf and to be honest, many things, Tiger is brilliant.
Be honest John. Do you play the game? Are you a fan? Do you watch it on TV? Did he ever cheat at the game of golf?
Arnie had 7 and Jack 18, so Tiger needs 11 more to match their combined total.
Oddly, this three-year fallow period may actually help his overall major total. He's had to rework both his personal life and his golf game, and the end result may be beneficial. He is only 36, and with the physical conditioning he habitually pursues he probably still has ten or so years left as a consistent contender, with another five or ten after that occasionally contending.
As he gets closer, that would be a cool thing to watch. He needs to beat Jack first.
I was unaware Tiger had cheated at Golf????
You compared him to Pete Rose....
If cheating on your spouse disqualifies players.....let's just say the pro ranks would be considerably smaller and almost non existent in some leagues
Actually, by another measure Tiger is really only three majors behind Jack. If you count US Amateurs (Jack won two but Tiger won three), which were majors in Bobby Jones' day, then it's Jack 20-Tiger 17, only three apart.
I am a very lucky golfer in that I have a Nike collectors tin of the 2001 Masters which Tiger won completin the Majors Grand Slam.... 4 sleeves of balls and script, pics and scores per day
Good stuff. Greatness does not come down the pike too often. We need to enjoy this.
Hard to believe that was 11 years ago. Hell, I had a 7 handicap then. lol. Double that now. You should complete that by getting his signature on it.
The Masters certainly just got a lot more interesting, huh?
Guess his 'injured knee' got better quick.
Perhaps Tiger's new training regimen includes round trips to and from Lourdes.
Tiger Woods Ends Adultery Drought
he played...
like tiger
Sorry, Tiger's victories in the four golf majors was accomplished over two golf seasons hence, it was not a Grand Slam.
That's amazing ...I did not know that Tiger cheated at the Arnold Palmer Invitational. What did he do? GPS-guided balls? Bionic targeting implants? They need to strip him of the win ASAP. /sarcasm
Seriously though, I do not think there is anyone here 'celebrating' his adultery on his wife. However, there are many who actively follow golf, as well as many more who were being drawn to the game simply due to Tiger's brilliance, who are celebrating the return to form of one of golf's luminaries. After all, most people are able to separate a person's bedroom activities with the person's other abilities. For those who are unable, or unwilling, to do so there is always the very simple solution of not watching the sport or commenting on its activities.
wanna bet
The rest of the tour has caught up with Tiger since his heyday....so even if he is every bit as good as before, the competition is also that much better than before.
The one thing that cannot be denied, Tiger = Ratings. The Masters' ratings are going to be through the roof.
I think you're right about that. It will be a lot tougher for him to regain that #1 ranking. These kids today are good. But, if he starts winning like before, he'll get that intimidation factor back and that will eliminate a lot of players. The game's played between the ears anyway.
If you are good with Barry Bonds and Mark Mcguire, than no he is not cheating. Tiger is going through another "swing change" which seem to always coincide physical changes or cycles. We all know that Tiger would not take roids, he is too honest for that. The dr galea connection was pure. Tiger is not the only golfer to gain this edge.
The prize of my collection is my 1996 Masters practice round ticket with Tiger's autograph on it. Also have his autograph on the program for that year.
No wonder the Church is dying in this country. It's because the holy rollers give it a bad name.
Why convict Christ on a golf thread? No need to judge Him based on the actions of fallen humans. We also should not judge the great game of golf based on one juiced up PGA superstar and the billion dollar organization that promotes him. The PGA is just as
dirty as he is.
Sure, but you are only going to lose.
This is from Wikipedia (which I thought had the most succinct description):
The Grand Slam in men's golf is an unofficial concept, having changed over time. In the modern era, The Grand Slam is generally considered to be winning all four of golf's major championships in the same calendar year. Before The Masters was founded, the national amateur championships of the U.S and the UK were considered majors along with the two national opens and only Bobby Jones has ever completed a grand slam with these. No man has ever achieved a modern grand slam, Tiger Woods being the closest in winning all four consecutively, but over two calendar years.
What Tiger and others have is considered a career Grand Slam (that is, winning each of the four majors during their career). But that is not the nature of a true Grand Slam, winning each of the major championships in the same calendar year.
Sorry. Maybe he will do it this year. The Masters is less than two weeks away.
"Oddly, this three-year fallow period may actually help his overall major total."
I think it may have given a lift to the "young bloods" and made their games better, which will bring out the best in any true golfer. I never play better than when I am playing someone who can play better; I think the way he was going, Tiger was not just better, he looked unbeatable and took their fight out of them.
$1.1 million. That'll buy a lot of cheap hookers.
Disclaimer: Opinions posted on Free Republic are those of the individual posters and do not necessarily represent the opinion of Free Republic or its management. All materials posted herein are protected by copyright law and the exemption for fair use of copyrighted works.