Mad Props... 4 AM!!

I just got home from the GAP in Conshohocken (Conshy). We went out to the diner just up the street for a nice 1:30 AM meal. This has been a fun week.

Work's going OK. Nothing too much to brag about, but it's fun. I have my routine set. Get in before 9, grab coffee, work til I run out of coffee, get more, repeat until lunch. Then I get a 20 oz soda, go to the bathroom a few times, finish the soda then get more coffee around 3pm and again at 4pm. By this time, I'm getting so much work done from all the caffeine, it's like the caffeine is programming. I love that quote from that guy about mathematicians, but I translate it into Computer Scientists

A Computer Scientist is a device for turning coffee into software.

The real quote is

A mathematician is a device for turning coffee into theorems.

Good stuff. So, I get home from work at around 6:45 or so, grab some food, and either watch a game (Flyers, Sixers, etc), or head up to my room to play video games. Like, lately, Zatko and I have been playing Civilization IV. It's awesome. Wednesday, my friends were going out, but so was damn near everyone else in the Philadelphia area, as well as the police. I felt like staying in, so Bean came over, and we all watched some movies. I woke up at like 9am the next morning, thinking I had to be in work. I always think that, there's no getting around it. Even when I was off for a month, it took me until three weeks into it to realize that I don't have to be in work. Of course, by that time, I was interviewing at 9am in places like Wilmington and up in Wayne, which are good 40 minute drives, so I had better wake up.

That brings up something about me. I never panic. Unless I'm waking up and I think I have to be in work. That's the only time. It saves me a lot of embarrassment, and sometimes my life. Like, this one time, I was at a bar, and we were all out on the deck, which had a bar. There were all these girls out there, and it was the middle of the summer. My friend's girlfriend looks at me and says "Yo, there's this huge ugly bug crawling up your sleeve." I look, and sure enough there's a huge ugly bug crawling up my sleeve, and is now up to my shoulder. Do I panic and scream like a girl in front of a lot of girls, only to embarrass myself? Nope. I'm cool like the other side of the pillow. Slowly, I move my hand up to it, held my middle finger to my thumb, increasing torque, then flicked that thing into the cheap seats.

Then, another time, I'm driving up Route 202 in the left lane, near Frasier, and all the sudden, about 20 feet after a bush, I see a car coming across the median. I'm like, "They'll stop." It's raining, the grass on the median is wet, the road is wet, and I had just put out a cigarette. I get to like 4 feet away from her and say to myself, "They're not stopping." There are cars all around me, and on my right. If I panic, I definitely hit someone on my right side, causing a multiple car accident. Do I panic? Nope. I take the hit, glass shatters all over me, I do a 270 degree turn without changing lanes (because the road was wet). I end up about a foot from oncoming traffic. God rewards the non-panic stricken. I had just bought a coffee about 15 minutes before. I look in my coffee holder, it's not there. So, I try to get out of my car. The driver side door won't open. So, I climb across the seat, and there's my coffee... topside down, but the lid stayed on, and hardly any coffee came out! It was marvelous. I sat on the hood of my broken car, drinking coffee and smoking a cigarette until the fire trucks and police came. I had no injuries, save for a few small cuts from the glass on my left hand. The only time I almost panicked was when I thought I had lost my coffee :)

That's an old story though, that happened in February, 2003, 5 months after I got the darn car. I still have it though.



This might turn into a long post. Go get some coffee.

So, Thanksgiving Day. We head to Steve and Patty's house. There's like 15 Connells there. 8 including my brothers and parents, 2 nieces and 3 nephews, one great-Aunt and one Aunt. After dinner, I was beat. Kira, Caden and Ethan were watching movies upstairs, I thought I'd join them. They all have their seats set up about 5 feet from this TV, so I lay down on my stomach right in front of their chairs. About 4 minutes later, I have kids jumping on me, sitting on me, laying on me, and pretty much beating me up. This continued through most of Scooby Doo 2.

After Thanksgiving dinner, we went back home. I drove, and I had some brothers in my car. Jeff, Pat and Bean. We listened to the last few minutes of the Denver / Dallas game on the radio, and went to rent some movies. We ended up getting Batman Begins and Charlie and the Chocolate Factory... the new one with Johnny Depp. Those were both great movies. Batman Begins was up there in the Batman saga, and I'd have to say it was AWESOME.

Friday morning. I told Bean, for his birthday, that I'd put a few pennies towards an iPod for him. So, we head out, grab some coffee and head to MicroCenter. They ran out of the 30GB iPods... and pretty much all other models. They only had the 2GB iPod Nano! 500 songs?!? Yeah, right. I ended up buying a MIDI Piano for myself though. We'll get the iPod soon. And I'll be recording more songs pretty soon with that purchase.

We got back by noon and watched the Flyers. Jeff and I are pretty much addicted to the Flyers now. When they're on OLN (Outdoor Life Network), we can't watch because we subscribe to RCN, and OLN is only on Comcast. We are in both companies' ranges, but RCN has 10GB cable internet, so it was the obvious choice when we chose it, back when OLN didn't get a few Flyers games. It was before we knew that the NHL's season was in dire straights. But, we can deal, there's only like 9 games on OLN the entire season.

I'm getting tired.... really tired.

Tonight, I went out to the GAP. I got there and it was packed. There was a reunion or something and they reserved two of the big rooms. I hate that. Literally elbow to elbow in the only room open to everyone. So, we had like 4 beers, and decided to go to the diner. I got French toast. Gia got this giant omelette, which I joked was like eight-tenths of her body weight. I said "You can't finish that." And she said "What will you give me if I do?" So, I said, "I'll give you props." Seeing the look of disgust on her face from only being offered "props", I quickly followed with, "Alright, Mad Props." I told her I would give them to her on my website... so:

Mad Props Gia

We all joke around a lot, so it's always a really good time. Til next week, dudes :)

After a few cups of coffee, french toast, and a knee slapping good time, I took off for Drexel Hill. I plugged in my piano to my Mac Mini, tried it out for a few minutes, then decided I'm gonna just throw on an X-Files episode or two and hit the sack. Still a whole other late night left in this weekend, I'm going to take full advantage.

Readonly Classes

This is a quick one before I head out to the Great American Pub tonight with some friends. I was writing a way to make simple input screens based off of the information in Dumb, when I realized that when I got that information, I had access to the whole class, and didn't like it. Basically, something that's using the information doesn't necessarily need to manipulate it. So, I abstracted out those classes into interfaces with selected properties that are readonly. The problem was this: I had to update all the references to the class to be references to the interface. It took forever, but I eventually got it, and after touching practically every class in Dumb, it's now almost up to date. I still have to create an "information getter" interface so that I don't have to have direct access to every method in my engine class (I only need to be able to select, insert, update and delete, for now), whereas the engine class has methods in it to create tables and generally access a lot of different stuff that a simple inquiry class doesn't need access to. Also, the engine already implements an interface, but it's a 1 to 1 implementation (meaning, it is just an abstract API interface so you don't have to know which implementation of the engine you are using... I can have multiple engine implementations and just swap one in [like a CachingEngine that doesn't hit the database everytime if it already loaded an object]). So, I'll have to add another interface on top of the engine interface

e.g.
public interface DaoEngine extends InformationGetter

that has just methods to get that info out. Names not final.

After that whole thing's done (including making the automated data input screens), I can work on Attachments. That's gonna be awesome.

CIV 4 Again

Zatko and I played again, twice, last night. The first time, I got whooped by Barbarians, and Zatko made fun of me by saying stuff like "BARBARIANS?!?!!! You SUCK!!" and the like. Then, about 25 seconds into our second game, he asked "Are you still alive?" I thought it was funny. I answered back with "OMFG HELP!!!!111111111". Then irony. A call from the East (I was on the west coast of this huge continent). "Dude, I'm getting killed by barbarians." I was like "Pffff it was funny the first time, you don't have to make fun of me anymore, I have a higher score than you." However, he wasn't joking!!! HAHA. He lost all of his settlers, which you need to create new cities and expand your empire, and only had 2 cities, which came under attack. It was great. I sent guys over there, but the little icon under the arrow said that the guys would take 39 turns to get there, which is like a thousand years. Maybe closer to a hundred. Plus, they cost me money as they get further away, with attrition and all that stuff. But, they eventually get there, and Zatko was still alive.

I finally learned a bit about how to play. The city view screen is tough to understand, but it is the key to success. I finally got it. I don't know how to make things happen like I want (less sick people, more happy people, etc), but I do understand the game more now, so that's good. All this time I've played other Civs, and never had a clue what I was doing.

In the second game, I got attacked by the Nation of India, and was able to fend it off. Without losing a city!! Sure, their malicious hordes will come through and destroy everything else on your land (farms, mines, houses, etc), but if you can hold out, maybe fight them off or wait until you can talk to the leader again and get them to sign a peace treaty before you get your ass handed to you, then you'll be in good shape. I'm addicted.

CIV 4

Zatko and I played CIV 4 online last night. Thanks, Mike, for getting me addicted again. I'd have to say that most of that game's addictiveness comes in its absolute mystery. I have no idea what I'm doing. Like, no idea. But, Mike and I were playing, and I jump out to a lead and pretty much hold it for the next 5000 years. Yes, 5000 years. Then Mike jumps in front, then it's just me and him, battling it out over a few hundred years... actually, we were friends, basically giving each other technologies. Then, all the sudden, he starts crying from half way around the world: "Yo, I need help." He's at war with the blasted Mongols. Those blasted Mongols. I'm like "Dude, I can't get there, George Washington won't let me through his crappy land." Then, the only part of Russia that was left was a quaint little town known as "Zatkonia". Or, at least that was the only one I could see, due to my lack of exploring. Whereas Germany was thriving! Really. I still have no idea how to play that game, but as long as you don't piss anyone off too bad, and give them stuff when they're angry at you. This way, you won't get into a fight, and you won't have 2 cities left and have to ask your pacifist pal Germany to travel half way around the world to save you... I had no boats.

Tune in next week for more tales of addiction and cluelessness.

Attachments

This post can also be subtitled "The Philosophy of Computer Science, Part 1.1". It's a new idea I'm playing with. It's not a new idea, really, it's derivative of a very cool concept in Computer Science called Aspect Oriented Programming. It's a pretty abstract concept. Basically, the typical example used is logging transactions on an object (I know, that description is very abstract also). So, say I have a bank account and I want to log my transactions, I can just flip a switch, sorta, and now my bank account is emailing me whenever I deposit or withdrawal money. But, what if now I want to deposit half of the money in a savings account when it's deposited in my checking account WITHOUT modifying ANY banking code?! Impossible, you say? They key here is that I don't want to go into the "deposit" function on my bank account object and enter stuff to deposit half of it into my savings. If you designed the system using an AOP container, this would be simple. What if I wanted to log AND deposit half into savings on a deposit into my checking account? I would just write a class that "intercepts" a call to deposit money into my checking account and takes half and puts it into my savings account, then continues the call to deposit the money into my checking account with half of the original value. Of course, if I was dishonest, I'd just deposit half into savings and then the original amount into checking!! But, that's not honest :)

So, AOP is very flexible. What I'm developing is a twist, though. It's for objects on my website, and it's mostly to do with data, rather than "processes" (like, before I deposit my check, take half, put it in savings, then put the other half into checking). So, to be more in line with data, and to be sorta AOP, what would it have to do?

Pretend I have a News object (I do, you're reading it), and that news object, right now, has a title, a date, text, the user who wrote it, and the categories it belongs in. What if I wanted to add a file to correspond with the news that I could upload and it would automatically show itself with a little paperclip (signifying an "file" attachment), and the filename next to it, with a link to download it. I don't want to program the news so that every news item could potentially have a file attached to it. You'll see later that by attachment, I don't only mean "File" attachment, like you send with an email. What if I want to allow other objects to have that same type of attachment, i.e. a file uploaded and shown under that item? I'm not about to change my whole, very well designed, table and object structure. I'm way too lazy for that.

Another attachment possibility for News would be a "History" attachment, so that whenever I update a news post, it puts an entry into a history table, and I can view that news' history. Another one would be a "View Count" attachment, so that whenever that news item is viewed, I increment a field for that news item, and that value shows under the news in a label that reads "Read 4 times". What if I wanted to put security on a certain news item? I could make a "Security" attachment that ties into my current security system and checks to see if the person viewing the website should be allowed to see that news.

The main thing here is that I don't know all of the possibilities for the future. That's where Object Oriented programming and Aspect Oriented Programming form a perfect marriage. I can program a new attachment and add it into the system, then any object can use that attachment. One downside of this design right now is that for every news item I enter, I will have to select, each time, what attachments I want. For some things, it just makes sense. Like, I could turn "Comments" into an attachment, but for most news items I will want to allow comments, so I would be adding that to every news item. The upside, in contrast, is that some objects were not designed to be commentable. I could make Content commentable this way (click "Your Site Rules!" for a Content example).

One thing I could do is have a global attachment for objects. News could have a global attachment of Comments, then a local attachment could be a file attachment for a certain news item.

One pretty big downside of this system is this... it's website rewrite time!! Yup, the whole website will have to be redesigned. The data, however, can pretty much stay how it is. That's good, because I decided on this design because I didn't want to change the data structure! I'd hate to lose anything I wrote, I love reading my own stuff ;-)

I can hardly stay awake right now though. Til tomorrow.

X-Files

I bought Season 1 of the X-Files the other day. It is by far my favorite TV show. So far, that I don't even have a "second" favorite, really. Not one that if I see on, I just stop and watch, and throw the remote control across the room to show exactly how content I would be just watching it even with no remote for commercials. And now, I don't have to worry about commercials! I obviously never bought another TV series collection, but I have watched a "Friends" series over in a sorority house at West Chester University a while ago, and for a while we had "Family Guy" seasons 1 and 2, and watching something with no commercials is great. They still have the lead up to commercials, the very suspenseful part right before it goes to break so you won't change the channel, and you're still like "F!%##!. Commercial...", but then it just goes right back to the show. It adds to the gratification that you get from simply watching your far and away favorite show.

Boneheads of the Day

Disappointing night overall. On the Flyers' end, one player spoiled the game. On the Eagles, it was a bunch of people, including one head coach.

The Flyers were looking good. Peter Forsberg had an excellent game, scoring two goals. Everyone played well. I look in awe at the performance of most of our defensemen... Joni Pitkanen, Kim Johnsson, even sometimes Mike Rathje and Derien Hatcher. Desjardins is always a solid D-man. The one left is the guy the Flyers have to get rid of. Chris Therien. He made two big mistakes that led to goals, and at least one other mistake that almost led to a goal. He singlehandedly cost the Flyers the game. I don't care what they tell you, it was Therien's fault. He stinks.

The Eagles. Oh boy, the Eagles. In my last post, I said Donovan was the key to the Eagles. If he plays good, the team does well, and also true on the reverse side. However, when he makes stupid mistakes, he can turn the other team's misfortunes into fortunes. He played well for about 56 minutes tonight. Not extremely well, but well enough to score 20 points, and the defense played well enough to only allow 7. Then things changed. Andy Reid makes stupid play calls, like when we're in the lead with 3 minutes left, to go long on a pass play. Reggie Brown, the aspiring rookie, misses a few HUGE passes, which would have meant that Akers wouldn't have had to try a 60 yard field goal attempt with a semi-100% hamstring and the unpredictable winds of Lincoln Financial Field. Donovan still tries to run a shovel pass even though he could hear the inside linebacker yell "Watch the shovel!!" We should have turned all of our field goals into touchdowns, and put this game out of reach for the Cowgirls by the start of the 4th quarter. That's not what went down though.

It sucks when two of your teams lose in the same night. But what's worse is not when the team plays bad, but when you can pinpoint one awful performance that might have cost the game.

Busy Night for Philly Sports

The Flyers play the Tampa Bay Lightning, and the Eagles play the DallasSUCKS Cowboys. Should be a night to remember.

Quick comments on both teams. I love watching the Flyers. Peter Forsberg (or, as I call him, just "Pete") is incredible. He makes plays and I yell out "HOLY F@#%#@" or "J@ES#@ F#@%@# CH5#@%@!!" or just simply "WOAH!" All of this year's Flyers are exciting to watch because of the new rules, and having won the last 6 games makes it pretty cool too. Let's get "Flyer'ed Up!!". The Fly-guys will make a good showing this season. Go FLYERS!!

The Eagles are pretty bad this year. Donovan's hurt, but he insists on not using it as an excuse. I say, fine, I won't say you're hurt, just that you stink!! Make passes! Don't make stupid plays (like, faking a spike with no timeouts left, only to have the receiver that you want to pass to not be on the same page as you... pretty stupid...), and complete your passes!! Don't throw them at the f#@%#@$@#!ing ground!! Brunell of the Redskins looks unbelievable right now, especially compared to Donovan. They have to keep the defense off the field longer so they are rested, instead of going three and out for the first half of the game. Right now I'm not expecting good, but if they do good, then I'll be happy. The defense hasn't been getting pressure on the QB, so that's something to look out for as well. We're the F#@%!@$!#ing EAGLES, we should kick everyone's ass... but, right now, things just aren't going our way! Of course, T.O. won't be a factor tonight (either having him or not having him... T.O. was never a factor... now that we stink, and we've had T.O. all season, you look at something else that might be THE factor. And that's #5).

E-A-G-L-E-S EAGLES!!

New Phrase Sweeping the Nation

I never consider myself to be creative. But, sometimes I come up with stuff that I've never heard before. This doesn't mean that they haven't been said before, just that I've never heard them. Perhaps because of my stubborn tastes in music and movies, and my utter hatred for television. Sometimes, I manage to be creative. I came up with this:

"There like a dragon."

Get it?! A dragon lives in a lair! It's awesome. So, now when someone asks you, "Yo, we're going to the Flyers game tomorrow, and we have an extra ticket... wanna come?" You can say "I'm there like a dragon © 2005 Jason Connell". Of course, when I say it, I don't have to have the copyright stuff in there, so it will be cooler than when you say it. I can't help that.

Oil Industry Execs Interrogated

From a Philly.com article (registration required)

"My constituents, and actually most Americans, think that somebody rigs these prices. That in the process, somebody's getting ripped off, and they think it's them," said Energy Committee Chairman Pete Dominici (R., N.M.), setting the stage for the nearly four-hour grilling.

"The Senate Energy and Commerce committees called in five oil-industry captains to explain their combined third-quarter profit of $32.8 billion and what are expected to be industrywide annual profits approaching $100 billion. Those profits came from American consumers who paid more than $3 a gallon for gasoline this fall and face record home-heating costs this winter."

And their defense...

"Hoping to fend off a potential windfall-profits tax, leaders of the five major U.S. oil companies denied before two Senate committees yesterday that they gouged consumers while earning recent record profits."

"One by one, the executives recounted how hurricanes disrupted oil production and pipeline activity in the Gulf of Mexico and damaged oil refineries along the Gulf Coast. And they noted that even before Hurricanes Katrina and Rita, a tight global market for oil supplies, caused partly by China's surging demand, had driven up gasoline prices around the world."

Pretty much all you need to know. So, they raise the prices in tough times because they CAN raise the prices in tough times. If they raised the prices and didn't earn record profits, then you'd know it was costing them the same ratio to make gasoline as before the tough times and during the tough times. But since they raised the prices and earned record profits, you know it cost them the same to make gasoline before and during the tough times. Maybe not the same, but definitely not at the same ratio at which they charged. I hope the good guys win.

Amazon Prime!

I signed up for Amazon.com Prime yesterday. Should be a money saver, although it hasn't yet paid for itself. However, it definitely will. Free 2 day shipping?!?! I've probably paid an average of like a bazillion dollars a year on shipping from Amazon.com, and this only costs $79 per year. They will surely lose out on this deal. Suckers!

Druel:

"Better" vs. "Better Off"

Donovan McNabb recently said that the team would be "better off" without Terrell Owens, and right away, everyone jumps the gun and interprets him as saying that the team will be better without him? I don't see these two things as being the same.

Better: superior to another
Better Off: in a more fortunate or prosperous condition

More fortunate vs. Superior. Better compares two things, better off compares two instances of time and their conditions. Yes, the Eagles will be better off without T.O, and they might become better without him, but for right now, they are not better... but that's not what Donovan was saying anyway!! I hate the media and their need for controversy. It's like they have to misinterpret. Ratings. It sucks.

"Uncle" Jason, Part VI

This one's just an honorary Uncle position. Jim and Kate are HAVING A BABY!!!!!! Don't believe me?!?? Check this picture out...



Unless Kate swallowed a doll or some other baby shaped thing, I'd say she's having a baby!! So, congratulations are in order, you can congratulate me in the comments :) Oh, yeah, I guess you can also congratulate Jim and Kate on their website. I think they have a forum... I sorta remember writing one for them :)

All the Connells are Gone

This weekend, although more like today and up until the Eagles game tomorrow, I am the only Connell in the area. Parents went down the shore, and all but one of my brothers are spending this fine weekend in State College, PA. Penn State (10) plays Wisconsin (14), and they are all big PSU fans. Well, Beaner's just going up there to "see college"... yeah, that's it.

I went to a birthday party last night, so I couldn't go. I wanted to go to the birthday party, though. It was for Mara who hit the big 1/4 * 100 mark. We had a blast. There were around a bazillion people at Reed's in Blue Bell, and about half of them were there for Mara. Good times. I love the deal, you tell them you're with Mara's company, you get stamped, and you get 50 cent lager drafts until 7:30. Of course, at 7:28, Billy and I go up to the bar, he orders 4 lagers, and I order 8! The bartender asks, "Do you have 8 people!?" Whereas my only answer was to point back at everyone behind me, laying my inclusion finger on half the room. I had 3 of those twelve! I then proceeded to tear up the dance floor.

I'm not sure what people think of me when they see me dancing (frankly, I don't care :) ), but when I see guys dancing on the dance floor, usually I'm like "Man, that guy's got no rhythm" or "HAHAHA that's funny" or "...". Some girls have a gift out on that dance floor that earns all eyes on them. That's probably why I go to a bar with a dancefloor... me dancing isn't the best thing, I'm positive, but sometimes I observe best from close range.

So, I sit here, Connell-less and pantless, waiting for the Eagles game to start tomorrow, when all the Connells will come back in droves. I can do something tonight, but I think I'll stay in and play video games on my leaking computer. That's right, it's leaking. Having liquid running through your computer is usually a pretty good idea, but the consequences can be detrimental. Right now, it only leaks when I turn it on, and it only leaks onto my DVD drive. I just wipe it off and continue to play, but eventually I have to buy more liquid for it (it's not plain old water... there's stuff over at Koolance that I am encouraged to buy). I think I'll play Call of Duty 2 on my clan's server, all F%^@%@ing day.

Configuration Version 2

This one goes back to my Configuration entry. Well, it turned out, 128 lines wasn't enough. See, when I write an XML document, I like to reuse tag names (see Element over at The W3), so, my old XML document of one line per object wouldn't cut it. The system would look up an object, but it will be a different type. For instance, I would use the "attribute" tag numerous times, but each time it means something else. One time it would mean the definition of an attribute, and another time it would mean "this attribute is the one that I want to use", or essentially, in as highly a technical way as I can describe it, something would reference an attribute that was previously created. Now, that one class that was 128 lines or whatever, is now 206. Still not a ton, and I wake up and thank God for letting me wake up one more day, and I also thank Him for recursion and reflection. Those are two of God's greatest gifts to any Computer Scientist. Each a gift in their own right, but get them together and that's how babies are born. It's SEXY.

Overall, here are the files and their line numbers in the Configuration Version 2 project:

Package voodoo.xmlconfig.domain :
ObjectMap.java : 7 lines
Package voodoo.xmlconfig.loader :
ConfigLoader.java : 104 lines
ConfigParser.java : 206 lines
Package voodoo.xmlconfig.nodes :
KeyNode.java : 12 lines
LookupNode.java : 45 lines
NodeMap.java : 47 lines
ObjNode.java : 125 lines
Package voodoo.xmlconfig :
Configuration.java : 39 lines

So there you have it. Sacrifices were made. Ideas were thrown around. XML parsing was ritually slaughtered. Never again. Woohoo.

There are some major features in this though, despite its brevity. When loading and looking up objects in a map at the same time, sometimes what you are looking up will not have been loaded into the map yet. I wrote my copy function to take care of this after the objects have been initialized and put into the map as basically blank objects. Copy then takes the actual values and loads them in. This is important because other objects already have a reference to the blank object, as opposed to the fully loaded object of the same type. This could cause problems in the future, but for my needs, it will serve the purpose. Another awesome feature is the ability to look up objects in a map in the first place! "I want to add a reference to this attribute to this object, but find it in this map under this key and this key." Sometimes, a map indexed with a key will reveal another map, so you can specify multiple keys. For my attribute, first, you look up the type, where many attributes can have the same type, then you look up the name in the resulting map of attributes with that type. This can be done infinitely.

Tune in next week. I just took my laptop out of its case for the first time in 2 weeks! I should be addicted to programming Java again in no time.