Welcome

You have reached the blog of Keith Elder. Thank you for visiting! Feel free to click the twitter icon to the right and follow me on twitter.

Speaking at SQL Saturday #234 Baton Rouge August 3rd

Posted by Keith Elder | Posted in .Net, C#, Speaking | Posted on 30-07-2013

Prepare the crawdads and gumbo because I’ll be in Baton Rouge, LA this coming Saturday doing some talks at the SQL Saturday #234 event!

I’m planning on doing two talks Saturday as well as recording some http://deepfriedbytes.com episodes if time willing.

Here’s the talks I’ll be giving and more about them.

Channeling Your Inner Forrest Gump – Simplicity is Genius

In this session we’ll take a break from code and focus on the other skills developers need called Soft Skills. We’re going to go deep on what "Simplicity is Genius" really means from the eyes of Forrest Gump and look at many of the life lessons Forrest was trying to teach us in the movie. After attending this session you will learn how to better communicate with team members, provide value not only to your business but also your profession, the importance of being nice, and how to leverage techniques used successfully by salesmen backed by scientific research so you can ultimately… tell IT like Forrest Gump.

That’s right, I’m bringing the GUMP to Baton Rouge. No prerequisite required to attend this talk and you don’t even have to be a developer! I gave this talk at DevLink a few years ago as the keynote and I’ve given in another time or two in smaller settings and each and every time I give it it hits home with many in the audience. You don’t want to miss this one I promise.

Building an English-Based Rules Engine using the Dynamic Language Runtime and IronRuby

In this session we will explore writing an English-based rules engine that allows developers to create domain-specific rules for an application that can be easily understood by anyone. We will use a combination of C# and the DLR (dynamic language runtime) with IronRuby on the .NET platform to create a way to write, manage, and process rules for an application.

If you’ve ever wanted a simple way to store and process business rules whereby you can still read them come to this talk. It is geeky, it is fun and practical. We’ve already created four different interfaces to this at work and are using it in production (with some enhancements of course) so it isn’t just theory.

Hope to see you there and feel free to follow http://twitter.com/sqlsatbr via Twitter.

Meet Quicken Loans Intern Waleed Johnson, Future Mayor of Detroit

Posted by Keith Elder | Posted in .Net, Asp.Net, JabbR, Programming, Quicken Loans, SignalR | Posted on 29-07-2013

 

image

 

Meet Waleed (pictured above) sitting at one of the many workstations he has enjoyed this summer. This is Waleed’s second year interning with us at Quicken Loans and I am so happy Waleed joined us again this year. Because he’s spent so much time with us as a team member I wanted to do something memorable for Waleed. He has worked side by side our team and I’ve gotten to know what an extraordinary young man he is. Given that I thought I’d document his journey with us so he’d have something to look back on over the years to remember.

Waleed goes to Notre Dame but don’t let his Irish ties fool you as he lives and breathes Detroit (even his twitter handle is @detroitpride313). I remember reading his resume for the first time and he listed several community service events he was apart of in Detroit. This really caught my eye. Who was this young kid that loved Detroit so much that he was out volunteering at a young age?

When you first meet Waleed you probably think he plays basketball because of his tall stature, but you’d be mistaken as he’s learning how to write software, C# & .NET to be specific, but also open source software. I recently sent Waleed some questions about his internship at Quicken Loans and here is what he had to say.

Where are you from?

I am a proud resident of the East Side of Detroit, where I have lived essentially my whole life. Unfortunately, I was born in Long Beach, California where I lived for a year until my father passed away so I cannot claim I was born here. After my father passed away my mother—who was born and raised in Detroit—moved back to Detroit. I have nothing against Long Beach, but I am a proud lifelong Detroiter who lives and breathes Detroit. I jokingly told my mom that giving birth to me in Long Beach was the only mistake she has ever made. If I could I would change my birth certificate, but although I was born in Long Beach I was “Made in Detroit.”

See I told you he loved Detroit! I think this really tells a lot about Waleed as a person because he’s lived in Detroit practically all of his life. Even though Detroit recently filed for bankruptcy Waleed still sees it for what it can be, not what it currently is. Each and every time I’ve shown Waleed something he’s taken to it and approaches things with a “glass is half full” mentality. Hearing Waleed talk about his Mother and how she raised him it is no wonder he has this outlook on life.

How did you choose computer science?

My first exposure to programming, and really the only exposure I had before college, was through making video games with a program called GameMaker. Although I did not originally enter school as a Computer Engineering major I really enjoyed that experience and I feel like it was in the back of my mind. I started my freshman year as an Electrical Engineering major, because I really liked the electrical circuits component of my high school physics class, but midway through I talked to my counselor and changed to Computer Engineering.  I told my counselor how I have always loved computers and how I was not really interested in all of the things that Electrical Engineers do and he recommended I switch to Computer Engineering. Computer Engineering has been a perfect fit because I still get to take some Electrical Engineering courses, but the majority of my classes are on programming, which I’ve really come to love.

Describe your first year intern experience at Quicken Loans

My first year experience was something I will never forget. I was excited because of the unique culture here and how the company really seems to care about the employees. However, the best thing about my first year was that it gave me a reality check about what it takes to succeed in this industry. I was oblivious to just how far behind I was before I came here last year. I thought that because I enjoyed my programming classes in school and did well in them that I would be fine in the real world, but I was definitely wrong. Once you gave me the skills assessment test last year that really showed me the large gap that exists between what is taught in school and what you need to know in the workplace and I will never forget that.

You are welcome Waleed and I am happy to read you *got it* as to why we did that skills assessment. If you take anything away from your internship I want it to be this:

Remember that no one can give you an education, you have to give it to yourself.

Many students don’t get this though. They think because they went to class that’s it. Walking into a classroom and only doing what the professor or teacher asks of you is only part of your education. Waleed, no matter where you wind up in life be a continuous learner. You’ll go further than the rest.

What’s the coolest thing about interning at Quicken Loans? (biggest coolest most fun perk)

There are many amazing perks you get as an employee of Quicken Loans such as discounts in places around the city, but the thing I think is coolest is the opportunity to work for a company that loves Detroit and is as committed to helping Detroit as I am. I love the fact that Quicken puts its money where its mouth is and is actively engaged with community service initiatives. Quicken did not just move into a building in Detroit when it came downtown in 2010: it became an active part of Detroit, and I love that. The pride of knowing that I work for a company that cares about and is making a difference in the community around it far exceeds any monetary benefit that I can receive here.

Did I mention that Waleed loves Detroit? He’s all in as you can see and this is great (more on this later though). I think I should also mention Waleed has won more prizes from our internal intern contests than I care to count. For those that don’t know we have an internal website that a couple of our team members, @johnbfair and @chrisroland, built just for interns called “D-Tour”. It turns interning at Quicken Loans into a game and is just one of the things that highlights our culture. For example, interns have to go out and visit or eat at certain places and then send a picture to twitter with a hash tag. By doing so points are added up and they win prizes. The week ending 6/23/2013 Waleed was in 6th place. Not bad considering we have 750 – 1,000 interns!

image

When you came to Quicken Loans, you didn’t have any .NET skills. Do you think colleges should be targeting .NET more? If so. Why?

Yes, I definitely think that colleges should be targeting .NET more. I really like .NET because it makes website and web application design simple and understandable through tools such as ASP.NET MVC. Additionally, .NET gives you access to powerful languages such as C# which has an amazing set of built in features such as LINQ, which allow you to spend more time on solving the problem at hand than you would with other languages where you have to focus on writing basic utility functions that are already included in the .NET languages. Finally, another great thing about using .NET is access to Visual Studio. Before coming to Quicken Loans all of the coding I had done was in C and C++ on Linux machines using simple text editors. The bottom line is a lot of the things I have learned in school are outdated and placing an emphasis on learning things that are actively being used in the industry would be more beneficial.

I couldn’t agree more with Waleed and this is why more colleges and universities need to be taking advantage of https://www.dreamspark.com/. Microsoft gives students access to all the same tools professionals are using in the workplace so it doesn’t cost the school or students anything to learn to build solutions on these technologies. We just need college professors to step  out of their comfort zone and learn a new platform. Teaching is learning so they have to learn it *first* before they can teach it, and that is the problem with adoption. But don’t let that stop you. Go sign up and continue your journey!

By the way if you are curious as to what Waleed has been working on these past summers he’s been working on an open source project called “JabbR”. JabbR is an Asp.Net real-time web chat tool that leverages a technology called SignalR, also an open source technology. A couple years ago as part of our innovation time myself and a couple other engineers forked JabbR and stood up an internal chat system with it. We added a bunch of features, made it work with active directory, pulled in our corporate pictures and tweaked a bunch of things.  It has been widely adopted internally. What Waleed has been working on is taking all the things we changed and he’s adding them back into JabbR via our fork over at https://github.com/QuickenLoans/JabbR.

Here is a screen shot of some of Waleed’s work where he’s adding active directory support into the admin screen. By default JabbR works by using Twitter, Facebook, Google or creating an account. We already have single sign-on working and everyone’s badge photos so requiring everyone to have to create those public accounts and update their own images just doesn’t make sense. When pushed out hopefully other companies will be able to take advantage of this feature as well.

image

I’ll note this isn’t a trivial change as it impacts lots of little things throughout the application and Waleed has done a great job of tracking them all down.

The big payout for Waleed is he now knows how to use Git for source control and will have something to point to later on that he contributed to. I think that is awesome. Great way to start a resume.

Quicken Loans recently became the #1 place in IT to work for. What are some things you can tell others that make it cool from an Intern perspective?

From the perspective of an Intern in the IT department I think that one of the biggest things that make Quicken Loans cool is the focus here on innovation. A great example of this is Bullet Time. Bullet Time occurs every Monday from 12pm until the end of the day. During that time you are free to work on projects that have value to the company, but are not part of your daily responsibilities with the whole purpose being encouraging innovation. Bullet Time allows you to learn about and experiment with new technologies, which is pretty cool. This is just one of the many examples that show how Quicken not only cares about business, but also cares about your development as an engineer. Another cool thing I have noticed is how the IT department lives up to the company saying “Obsessed with finding a better way.” If you are a developer that thinks something could be more efficient if it was written in say F# you are free to present that to your team leader. People here at Quicken are always trying to find a better way to do things and I think it is great that you do not have to be bound to do things a certain way because that is the way it has always been done.

In five years where do you hope to be?

In five years I would like to be an established Software Engineer living and working here in Detroit, hopefully for Quicken Loans. I would also like to be involved on some scale in investing in the city and I would likely be learning more about the Detroit City Council of which I intend to be a part at some point in my life.

Did I mention Waleed loves Detroit? During some other conversations I learned that Waleed’s ultimate goal would be to become Mayor of Detroit. That’s right. Mayor. I think that is awesome. I fully support him in this journey and others out there should as well. Why? Because you just won’t find a more honest, true moral compass, do the right thing kind of guy than Waleed. Detroit needs more young people like Waleed who want to see Detroit grow and see it for what it can be not what it currently is. Pictures are worth a thousand words but this one may be about 10,000 as it really shows where Waleed is headed. He drew this at Quicken Loans on one of our walls and it expresses precisely why he is going to be the Mayor of Detroit one day.

image

You can follow Waleed’s journey at Quicken Loans and then his journey to becoming Mayor of Detroit via twitter at https://twitter.com/detroitpride313.

If you are interested in interning at Quicken Loans you can read more about it here: http://www.quickenloanscareers.com/about/internship-program/.

If you are interested in working at Quicken Loans or refinancing or purchasing a home contact me here http://keithelder.net/contact.

Migrating Code From TFS to GitHub

Posted by Keith Elder | Posted in .Net, Git, TFS | Posted on 24-07-2013

Tags: , , ,

Before I get started I wanted to start with a disclaimer that this article is not an article about how to use git nor is it going to discuss the differences between how TFS and Git vary when it comes to source control. I’m going to assume you’ve made the decision to either try Git out for source control or you are ready to make the jump from TFS completely to using Git for source control. Trust me this really isn’t a painful process and I’m going to make it as simple as I can. Here we go.

Installing The Tools You’ll Need

Since we are migrating code from TFS to GitHub I am going to assume you already have TFS set up and installed. I’m also assuming you are using Windows and are a developer on the Windows platform. Here are two ways to get going with git. The first way is the easiest and the second way is the *geekiest* for more advanced users.

  1. Github for Windows  – A complete install to use git on windows as well as GitHub (note does not work directly with GitHub Enterprise at this time but it doesn’t matter it still makes setting up git super simple).
  2. Chocolatey  – A Machine Package Manager, somewhat like apt-get, but built with Windows in mind. This will allow one to easily install numerous packages and if you haven’t started using it yet you’ve been missing out on awesomeness.

Setting up Git Using GitHub For Windows

This is the easiest way to really set up git source control on Windows locally (unless you are already using chocolatey). Using this gives you all the tools you’ll need to start working with git and you do not have to have admin rights on your machine, everything is installed locally. Go to http://windows.github.com/ and kick off the GitHub for Windows install. Note that you do not have to create an account on GitHub to get the tools installed locally. GitHub For Windows comes with PoshGit (a nice powershell utility) and I personally find using Powershell with git from the command line the easiest way to proceed.

After installing GitHub for Windows you’ll be presented with this screen.

image

Login if you have a github.com account or go create one (again not completely necessary).

If you don’t want to create an GitHub account just hit cancel. After doing so click tools in the top center of the screen and select options.

image

In the default shell section select the shell you wish to be opened when you open the “Git Shell” from the install menu. For me personally I selected PowerShell since it comes set up with PoshGit and is faster than using a bash prompt on Windows. Plus PowerShell is just cool!

image

 

Once the option you want to use is selected press the Windows key on your keyboard and type “git shell”. This will search for the git shell so you can launch it. In Windows 8 it will look like this but you can do the same thing in Windows 7 or Windows Vista.

image

Launching this will launch the desired shell. You are now set up and ready to configure git (more on that later).

 

Setting up Git Using Chocolatey

 

Chocolatey is awesome and allows Windows users to easily install tons of open source software the same way Linux distributions have been doing for years. Once Chocolatey is installed it becomes trivial to install git as well as git for Team Foundation Server (TFS). To get set up with Chocolatey head over to http://chocolatey.org and follow the simple instructions. To install it all you are going to do is paste a line into a command window.

Once it is installed you can then easily install git and git tfs with the two following commands:

cinst git

cinst gittfs

These installs will look like this from a PowerShell window:

image

image

Configuring Git

Either way you decided to go on the setup above (GitHub Windows or Chocolatey) you now have git and git tfs installed. Now it is time to configure git. Git needs to know two things before we get started and those are username and email. Note I have re-printed the following information from https://help.github.com/articles/set-up-git.

Username

First you need to tell git your name, so that it can properly label the commits you make.

git config –global user.name "Your Name Here"

# Sets the default name for git to use when you commit

Email

Git saves your email address into the commits you make. We use the email address to associate your commits with your GitHub account.

git config –global user.email "your_email@example.com"

# Sets the default email for git to use when you commit

Note: if you are using github.com you’ll need to use the email address associated with your account, if you are using an internal github enterprise server you’ll need to do the same

Migrating Code From TFS

Now that git is set up and configured locally we need to pull our code down from TFS locally. The purpose of the *git tfs* tool is it allows us to pull our code from TFS while also saving the commit history. If you’ve read up on git you know it is distributed which means everyone has a full copy of the repository locally.

I’ve set up a sample folder in TFS called XAmple. It only has one file in it that has been modified and checked back into TFS. It is this code base that we want to move to git.

image

To move this we are going to open the Git Shell. If you installed GitHub for Windows press the windows key and type “git shell” and click the icon. If you used Chocolatey open up PowerShell. Once you are at the command prompt we are going to use git tfs to pull all the code and changes from TFS down and have a git repository created for us locally.

The command to run is:

git tfs clone http://{nameofserver}:8080/tfs/SoftwareCollection $/_your_path

Here is the example from the TFS example above:

image

Note that we had 3 commits in TFS and we also have 3 commits showing up in our PowerShell window. Note for larger projects this can take some time to pull everything down.

Typing “git log” we can even see these commits directly from git.

image

Getting Our Code Into GitHub

Now that we’ve pulled our code down locally we can easily push it up into GitHub.Com or a GitHub Enterprise server. Here are the steps needed to get this going.

Before being able to push code to GitHub be sure you’ve set up an SSH key in GitHub and that it works. In other words you can authenticate and clone another repository.

The first thing we are going to do is create a repository in GitHub.

image

On the next screen fill in the fields. We’re going to assume this is a public repo and we’re going to add a README as well as set up the .gitignore file for CSharp (this is so files that don’t need to be committed don’t get put into the repo by accident).

image

We are then going to select the SSH option and copy the location in the SSH form. We’re going to then add a remote location to the repository that was created using git tfs.

image

 

Next step is to add this remote location to our local git repository so we can push and pull code to GitHub or GitHub Enterprise. I’m using our internal Git server so your settings may vary.

image

Next we are going to pull down the repository we created so the README and .gitignore get updated locally.

image

And then we are going to then push everything backup.

image

Now that everything is pushed up to GitHub anyone else can fork our repo, issue pull requests and we can even see the history of our files in GitHub.

image

And that is it! We’ve just taken a TFS repository, pulled it down as a git repository, and pushed it back up into GitHub. Once the tooling is installed this process goes pretty quickly. The thing that takes the longest is to pull the changes from the TFS server down locally, but once that is done it is just a few commands to push things back up into GitHub.

That’s it. Happy gitting!

Guidelines and Rules For Getting on a Friend’s Boat to go Fishing

Posted by Keith Elder | Posted in Boating | Posted on 21-05-2013

After years of boating I thought I’d help save as many boating friendships as I could. Hopefully this list of guidelines will help those joining their friends on an offshore / inshore fishing adventure. Hopefully this list will help you stay in the good graces of the Captain and crew to allow you to enjoy many boating trips with friends.

Before we get into the guidelines below there is a code of conduct shared among boaters. While we don’t have time to get into all of the details just know that the Captain (the one that owns the boat or the one that is driving the boat) is the person in charge. They are legally liable for all passengers on the boat. It is important to understand there is an order to things on a boat and it starts with the Captain and goes down from there. What the Captain says goes and that’s all there is to it. Always remember that! Ok, onto the list:

  1. PART OF THE CREW – The very first thing one has to understand is THERE ARE NO PASSENGERS ON A BOAT. If you are not the Captain (the one who owns the boat) you are part of the CREW. That means you have things to do so expect to do your share of the work. This could be helping load the boat, unload the boat, cleaning out the boat, organizing items on the boat, getting fishing gear ready, rigging lines, or getting bait.
  2. PLAY BY THE RULES – Remember, you’re a guest on the boat. If the boat owner says don’t do X then don’t do X.
  3. ASK BEFORE DOING – Don’t assume ANYTHING. Like for example don’t untie a line unless the Captain asked you to untie it. There is probably a reason he wants it to stay tied. Before moving anything on the boat, or latching anything down, ask the Captain if he would like “insert item” to be moved, untied, etc. Any gear being brought on the boat let the Captain place it or direct where he wants it.
  4. DOCKING – Leaving the dock and approaching a dock or anchoring that’s the time for you to be on alert. There are lines that need to be tied or untied and these lines should be tied while in the boat. Do not attempt to jump off the boat with a roap onto the dock. More people have been harmed this way. Whatever you do, do not try to stop a multi-ton boat with your hands once it is in motion at the dock. Do not get your hands between the boat and the dock they can and will get crushed.
  5. BOATS ARE EXPENSIVE – Chip In. Don’t just offer to kick in for gas, insist on it. Also don’t forget all the other costs associated with running a boat (bait, tackle, tips at marina, ice, gear, insurance, storage fees, trailer costs, tires, etc). Whether you fish from a center console or a twin-screw diesel, boats burn a ton of fuel. A lot of boat owners are inviting more guys to fish with them for this reason alone, they want to offset some of the fuel cost. Keep in mind that a six-pack charter usually runs from $1500 to $2,500 or more for a full day (plus they still charge for fuel). For a long offshore trip offer at least $200 for gas, bait and other things. Maybe $75 to $100 for a near shore trip and around $50 if you stay inshore.
  6. MAKE THEM MISS YOU – Bring Lunch. You don’t need to get fancy, but if you can whip up a killer lunch and feed the crew, do it! Or, stop by a good deli and hook everyone up. You want everyone to miss you and your sandwiches when you’re not there.
  7. STAY BUSY – If you are fishing and the bite is slow, pick up a hose and rinse off the deck. When fishing something is always dirty. Ask the Captain if anything needs to be done. If you see lines that are broken off ask to learn how to rig a line, most Captains love passing on fishing knowledge so don’t feel bad about asking to learn.
  8. GEAR – Always ask what you need to bring before showing up at the dock. Most all boats have places for coolers, you don’t need to bring another one. Same thing with life vests. If you are fishing definitely ask what tackle you can or should bring. If you are going offshore fishing but you don’t fish offshore much, odds are the Captain and other members of the crew are going to have what you need, and probably way better than what you are going to bring. If you are more experienced, merely ask. Some Captains prefer to use their own rods and reels because they know their gear is rigged properly, but if you have tackle, offer to bring it along and always error on the side of less is more. Don’t just show up with a truck full of stuff.
  9. PACK LIGHT – When you do show up with your *stuff* be sure you only packed what you need. Boats are light on storage. Do not bring big bulky tackle boxes that will be in the way and large bags with clothes and an entire medicine cabinet of stuff. Remember every pound of stuff you place on the boat the more fuel it is going to burn. If the Captain says there isn’t room there isn’t room. Don’t argue and move on.
  10. KEEP IT CLEAN – Clean Up After Yourself. Treat someone else’s boat better than you would treat your own. If you make a mess (especially in the head), clean it up. If you spill something wash it out. If you get something on the boat wash it off THEN not LATER as later it is going to be 10 times harder to get off after baking in the sun.
  11. SHOES – Only wear non-marking boat shoes, boots or sandals. There is no bigger sin than leaving black marks all over someone’s boat.
  12. CLEAN THE FISH – Help clean the catch. Unless you don’t know how to fillet a fish, grab a knife and do your best work to give everyone a perfect fillet. Heck, even if you can’t clean a fish, you can still help with the bagging and icing. Just get involved.
  13. FIND YOUR ROLE –  Ask what the crew wants you to do. If they need a gaff man, go for it. If they’ve already got a guy for each job, get the camera and take lots of photos. Whatever it is, find your place within the crew.
  14. WASH THE BOAT – This is critical. Everything on the boat needs a good washing after a fishing trip or being in salt water. Grab a brush or sponge and help out. Don’t even think about leaving until every inch of that boat has been washed.
  15. DON’T BE THAT GUY – It is the Captain’s boat and he has probably run it many times. He’s probably not really interested in a bunch of unsolicited ideas about how things should be done.
  16. PLAN AHEAD – Check and make sure you have a valid fishing license. Don’t even think about it. Get a license. It isn’t the Captain’s responsibility to check your license. Be sure you know where you are fishing if you are close to state lines. You may need to get two licenses. Also, make sure you are ready to go on time and have everything you need for the trip.
  17. PAY ATTENTION – Pay attention when the Captain gives the safety briefing and explains how things work on the boat and where things are, the lives of everyone on board might depend on it.
  18. FISHING GEAR – If you didn’t bring fishing gear then throw some extra money for fishing gear / tackle. A single 8 oz. weight can cost $2-$3, a single lure can cost $40. Rod and reel combos can run $300-$1000 easily and just the line can be $100. It all adds up. A lot of Captains may choose to provide all the gear and take up a gear collection for the gear fund. Be sure you contribute.
  19. MARINA – If launching from a marina be polite to everyone there and NEVER ask anyone to do or get you anything unless you are personally prepared to tip them. If someone fetches ice for the boat, tip them. If someone helps you tie up, tip them. The Captain will appreciate you chipping in instead of him having to reach into his pocket every time.
  20. GLASS – Never ever bring anything glass on a boat. Ever. Never. Ever.
Following these simple words of wisdom will make you a great crew member and probably someone the Captain will never forget the next time he goes fishing. Tight lines.

Connecting a Lumia 920 Windows Phone 8 to A Microsoft Surface 64GB WinRT Tablet

Posted by Keith Elder | Posted in Windows Phone | Posted on 06-11-2012

Tags: , ,

We were at Build last week in the Press room and I decided to check out the user experience of plugging in a Windows Phone 8 device (the Nokia 920) into a Surface WinRT unit. Walt Ritscher grabbed his HTC 8X Windows Phone he got a few days earlier at the Windows Phone 8 launch and started taking video. What you will see is an unedited, raw video that wasn’t rehearsed nor practiced. I merely plugged in the phone and started exploring to see what was going to happen.

The new Windows Phone application is very nice and gives all the control over the data on the phone the Zune should have given to Windows Phone 7 users. Check out the video.

First Look at connecting a Lumia 920 Windows 8 phone to an Microsoft Surface (ARM) from WaltRitscher on Vimeo.