Yearly Archives: 2005

NHibernate: hbm2ddl NAnt task

I recently wrote an NAnt task to wrap the NHibernate hbm2ddl logic.  Hope it helps you…

I haven’t tested it very thoroughly, but it did work for me using this syntax:

<hbm2ddl
    connectionprovider=”NHibernate.Connection.DriverConnectionProvider”
    dialect=”NHibernate.Dialect.MsSql2000Dialect”
    connectiondriverclass=”NHibernate.Driver.SqlClientDriver”
    connectionstring=”server=(local);uid=sa;pwd=sa;database=MyProject”
    delimiter=” GO “
    outputtoconsole=”false”
    exportonly=”true”
    formatnice=”true”
    outputfilename=”${nant.project.basedir}/sql/schema.sql”>
    <assemblies>
        <include name=”${nant.project.basedir}/bin/MyProject.dll” />
    </assemblies>
</hbm2ddl>

Anyway, here is the code for the task. 

using System;
using System.Collections;
using System.IO;
using System.Text;

using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;

using log4net;

using NAnt.Core;
using NAnt.Core.Attributes;
using NAnt.Core.Tasks;
using NAnt.Core.Types;

namespace NHibernate.Tasks
{
    [TaskName(“hbm2ddl”)]
    public class Hbm2DdlTask : Task
    {
        private static readonly ILog log = LogManager.GetLogger( typeof( Hbm2DdlTask ) );

        private string _connectionProvider = “NHibernate.Connection.DriverConnectionProvider”;
        private string _dialect = “NHibernate.Dialect.MsSql2000Dialect”;
        private string _connectionDriverClass = “NHibernate.Driver.SqlClientDriver”;
        private string _connectionString;
        private string _delimiter = ” GO “;
        private bool _outputToConsole;
        private bool _exportOnly;
        private bool _dropOnly;
        private bool _formatNice;       
        private FileSet _assemblies = new FileSet();
        private string _outputFilename;

        /// <summary>
        /// Gets or sets the connection provider.  NHibernate.Connection.DriverConnectionProvider is the default
        /// </summary>
        /// <value>The connection provider.</value>
        [TaskAttribute(“connectionprovider”)]
        public string ConnectionProvider
        {
            get
            {
                return this._connectionProvider;
            }
            set
            {
                this._connectionProvider = value;
            }
        }

        /// <summary>
        /// Gets or sets the dialect.  NHibernate.Dialect.MsSql2000Dialect is the default
        /// </summary>
        [TaskAttribute(“dialect”)]
        public string Dialect
        {
            get
            {
                return this._dialect;
            }
            set
            {
                this._dialect = value;
            }
        }

        /// <summary>
        /// Gets or sets the connection driver class. NHibernate.Driver.SqlClientDriver is the default.
        /// </summary>
        /// <value>The connection driver class.</value>
        [TaskAttribute(“connectiondriverclass”)]
        public string ConnectionDriverClass
        {
            get
            {
                return this._connectionDriverClass;
            }
            set
            {
                this._connectionDriverClass = value;
            }
        }

        /// <summary>
        /// Gets or sets the connection string used to access the ddl.
        /// </summary>
        /// <value>The connection string.</value>
        [TaskAttribute(“connectionstring”, Required=true)]
        public string ConnectionString
        {
            get
            {
                return this._connectionString;
            }
            set
            {
                this._connectionString = value;
            }
        }

        /// <summary>
        /// Gets or sets the delimiter.  GO is the default.
        /// </summary>
        [TaskAttribute(“delimiter”)]
        public string Delimiter
        {
            get
            {
                return this._delimiter;
            }
            set
            {
                this._delimiter = value;
            }
        }

        /// <summary>
        /// Gets or sets a value indicating whether the schema should be outputted to the console
        /// </summary>
        /// <value><c>true</c> to output to the console; otherwise, <c>false</c>.</value>
        [TaskAttribute(“outputtoconsole”)]
        public bool OutputToConsole
        {
            get
            {
                return this._outputToConsole;
            }
            set
            {
                this._outputToConsole = value;
            }
        }

        /// <summary>
        /// Gets or sets a value indicating whether the schema ddl script should only be exported
        /// or if it should be executed on the database server.
        /// </summary>
        /// <value><c>true</c> if only output the script; otherwise, <c>false</c> – Execute the script on the db server.</value>
        [TaskAttribute(“exportonly”)]
        public bool ExportOnly
        {
            get
            {
                return this._exportOnly;
            }
            set
            {
                this._exportOnly = value;
            }
        }

        /// <summary>
        /// Gets or sets a value indicating whether only the drop script should be executed
        /// </summary>
        /// <value><c>true</c> if only drop objects; otherwise, <c>false</c> – Drop and Create objects.</value>
        [TaskAttribute(“droponly”)]
        public bool DropOnly
        {
            get
            {
                return this._dropOnly;
            }
            set
            {
                this._dropOnly = value;
            }
        }

        /// <summary>
        /// Gets or sets a value indicating whether the ddl script should be formatted nicely
        /// </summary>
        /// <value><c>true</c> for nice format; otherwise, <c>false</c> – One statement per line.</value>
        [TaskAttribute(“formatnice”)]
        public bool FormatNice
        {
            get
            {
                return this._formatNice;
            }
            set
            {
                this._formatNice = value;
            }
        }

        /// <summary>
        /// Gets or sets the filename to write the ddl schema script to.
        /// </summary>
        /// <value>The output filename.</value>
        [TaskAttribute(“outputfilename”)]
        public string OutputFilename
        {
            get
            {
                return this._outputFilename;
            }
            set
            {
                this._outputFilename = value;
            }
        }

        /// <summary>
        /// Gets or sets the assemblies load with embedded *.hbm.xml resources.
        /// </summary>
        /// <value>The assemblies.</value>
        [BuildElement(“assemblies”, Required=true)]
        public FileSet Assemblies
        {
            get { return _assemblies; }
            set { _assemblies = value; }
        }

        /// <summary>
        /// Executes the task.
        /// </summary>
        protected override void ExecuteTask()
        {
            Configuration config = new Configuration();
            IDictionary properties = new Hashtable();

            properties[“hibernate.connection.provider”] = ConnectionProvider;
            properties[“hibernate.dialect”] = Dialect;
            properties[“hibernate.connection.driver_class”] = ConnectionDriverClass;
            properties[“hibernate.connection.connection_string”] = ConnectionString;

            config.AddProperties(properties);

            foreach (string filename in Assemblies.FileNames)
            {
                log.Info(“Adding assembly file: “ + filename);
                try
                {
   
           
    System.Reflection.Assembly asm =
System.Reflection.Assembly.LoadFile(filename);
                    config.AddAssembly(asm);
                }
                catch (Exception e)
                {
                    log.Error(“Error loading assembly: “ + filename, e);
                }
            }

            SchemaExport se = new SchemaExport(config);
            if (!IsStringNullOrEmpty(OutputFilename))
            {
                se.SetOutputFile(OutputFilename);
            }
            se.SetDelimiter(Delimiter);
            log.Debug(“Exporting ddl schema.”);
            se.Execute(OutputToConsole, ExportOnly, DropOnly, FormatNice);

            if (!IsStringNullOrEmpty(OutputFilename))
            {
                log.Info(“Successful DDL schema output: “ + OutputFilename);
            }
        }

        private bool IsStringNullOrEmpty(string input)
        {
            return (input == null || input.Length == 0);
        }
    }
}

Ajax: GET requests are cached but not POST reqeusts

I recently came across an issue with IE
caching responses from ajax requests.  My ajax code would send an
HTTP GET request if the querystring was less than 2067 characters and a
HTTP POST if the query data was larger.  When IE caching was set
to Check for newer versions of stored pages:
automatically, IE would cache the GET web response.  Changing the
ajax code so that it always performed HTTP POST requests fixed the
weird issues I was seeing (related to requests being cached). 

IE properly caches GET requests but doesn’t cache POST requests. 
So, I could have either altered the url of the GET request to be unique
everytime or I could have set the “Expires” header to -1.  I chose
to just use POST requests since I don’t want them to be cached
anyway.  More information can be found on the wikipedia page.

Anyway, hopefully this will help someone that runs into the same situation. 

Dreams involving death

I had some interesting dreams last night.  In the first one, I was a
murderer.  I don’t think that it was premeditated murder, but I
definitely killed people.  I remember somewhat waking up after the
dream and thinking that I needed to think happier thoughts… I feel
back asleep and don’t think the killings kept occurring.  A quick look
to a dream dictionary
says that I have heavy stress causing me to lose my temper.  This is
very true as I noticed it while talking to a family member Friday
night.

The other dream that I had was sort of a reoccurring dream.  The people
(as far as I can remember) and the place were all familiar.  The story
was somewhat different though.  Well, let me be a little more clear. 
The events that happen in the dream were the same, but my choices and
the end result of the dream were different.  The setting of this dream
is in a rural community in a warm climate.  I keep thinking of a small
village in New Mexico or Arizona.  From what I can remember, I was a
spectator of the dream, rather than a direct actor.  The dream reminded
me of a choose your own adventure type of a setting.

Anyway, the main portion of the dream takes place in a deli or butchers
place of business.  The main character of the dream is sitting at a
table with a bottle full of fluid.  There are about 5 people
sitting/standing around various places in the room and it seems that
everyone in the room is aware of the importance of the bottle.  The
main character hands the bottle over to two people (who I got the
feeling were aliens).  The aliens proceed to open the bottle (an
intricate procedure)… this is where the story diverges from the
previous time that I observed it.  This time, I noticed that everyone,
except for the aliens, had taken a hiding place.  It’s important to
mention that the hiding places were very well protected, like a cast
iron bathroom tub.  Once the aliens opened the bottle, a bomb
exploded… I would characterize the bomb as a radiation bomb, rather
than an explosive bomb.  That is, it didn’t destroy anything physically
but it did instantly kill the two aliens and any other human/alien
being, who wasn’t protected, for miles around.

In the aftermath of the explosion, the people who were hiding in the
shop, came out.  They had a sense of relief about them and the
dream
ended with the main character driving away.  Now the other part of
the
dream that was different than the first time I had it was that while
the main character is driving away, he comes to a fork in the
road.  Rather than turning right and seeing further carnage from
the explosion, he turned left
towards green fields/valleys and the unknown.



So while both of these dreams dealt with death, I feel that the second
dream was not nearly as dark as the first one.  Apparently I need to
relax a little more and deal with the stress that has been building
up.  I also find it curious that I was aware that I had the dream
before, while I was having the dream.  I was aware of my previous
decisions and decided to observe/change things.  I’m not sure how
accurate the dream dictionaries are, but I find them interesting never
the less.  Just using some key objects/events from the dreams and how I
interpret them:

Alien – Seeing aliens may represent an encounter with an unfamiliar or neglected aspect of your own self.
Explosion/bomb
– The bomb could represent repressed desires and unexpressed emotions
that are likely to explode or burst if not dealt with soon
Death – The death of a stranger can be the development or transition of different aspects of the self.
Fork in the Road – Represents an important decision that you need to make.
Kill – Forewarns that heavy stress may cause you to lose your temper and self-control.
Green
– Green signifies a positive change, good health, growth, healing,
hope, vigor, vitality, peace, and serenity. Green is also symbolic of
your strive to gain recognition and establish your independence.
Green Field – Great abundance, freedom, and happiness. You may also be going through a period of personal growth.

Work environment….

Work environment matters quite a bit to me.  Work is where I spend
the majority of my life these days, and I would like to enjoy as much
of my life as possible.  I had thought that the most important
aspect of a job was the people that you work with.  I now have a
different belief.  To go along with the people that you work with,
I really think that the environment must suit your personality,
also.  I think that it takes some career moves to get a good
understanding for the type of environment that suits you. 

For me, the environment means the physical work environment,
flexibility with that environment, as well as tools to get the job
done.

I am currently having an internal conflict with my job.  They hire
people as salary, but then they treat the people as children.  The
fact that I have to keep track of every minute I work pisses me
off.  I could see if I was a contractor and my time was billable,
but I’m a full time employee working on a single project.  Give me
the benefit of the doubt and put some faith in your decision in hiring
me.  I know that I work more if I have more freedom… I have
proved this with prior jobs.  But lock me into strict hours (8-5)
and I will only put in that much time.  When I have to worry about
how much time I put into the work, I find it hard to do things related
to the job, outside of work.  Another thing bothers me with the
current hours that I work is that if I take off to go to see a doctor
or some other appointment, I have to submit that I wasn’t at work for
that short period and I don’t get paid for it.  But if I would
stay a couple hours later, I also wouldn’t get paid for that.  It
would just be a bonus to the company.

I think a lot of this comes as a culture change for the company. 
The company is trying to start a software business, but they’re
neglecting the talent that they’ve hired.  They’re used to
providing a work environment that suited office workers from the
70s-80s.  I personally don’t see that the work culture will change
enough to suit me.  I have to admit that I get jealous when I see
the work environments of other tech companies.  We always hear
that change is on the way, but I have yet to see anything beneficial to
our work environment.  Again, if I were in this business as a
contractor, I woudn’t be bitching about these types of things.

So currently… I’m not happy when I go to my job.  It’s not that
I’m totally unhappy either, but rather I am somewhere between the
two.  Unfortunately, I feel that it’s getting to the point where
my current situation is draining the joy of working with
computers. 

Trip Overview

Now that the trip details are written, I’d like to write some of my
thoughts about the trip.  Overall, it was a blast.  The only
thing that I’d change would be to bring medicine with me… it’s a
bitch to figure out where to buy medicine and what exactly is medicine
in countries where I’m not fluent with the language.

People ask me which place I liked the most… that’s a hard question to
answer cause each place has it’s good points.  I do know that I’ll
visit Hungary and Germany again.  I didn’t feel that I had enough
time in each place to really get a good feeling for the culture,
people, and sights/sounds.  I’m not sure when I’ll go back to
Prague, but I’m sure it’ll happen at some point.  It is such a
beautiful city and there are so many other things I want to see around
Prague that we didn’t have a chance to see.  I’d like to see Kostnice,
a church in Kutna Hora, built out of bones from the plague in the 14th
century.  Also, I’d like to go to Pilsner to checkout the Pilsner
Urquel brewery.  At this point, I’d probably only go back to
Amsterdam in the spring.  I’ve heard that the spring bloom is
magnificent to see. 

Other than that, everyone that we ran into were really friendly and
didn’t really seem to mind that we were Americans.  On the other
hand, EVERYONE that we talked to HATED Bush.  They don’t agree
with his plans and generally seemed to have a better understanding of
the situation than Americans do.  Even watching the news (CNN
world news) made me feel as though Americans are sheltered with the
news that we receive.

Another question I’ve gotten a couple times is whether or not I’m happy
to be home.  Again, it’s hard for me to answer that.  I
really enjoy seeing new places, meeting new people, and living through
the day without worrying about work (and money).  On the other
hand, I was sick for the last 5 or so days of the trip, so getting back
to familiar medicine is nice.  Having my own shower, bed, and
clean clothes are nice amenities that I generally take for granted.

As far as the drinking/partying goes… I think I’d go out for a couple
beers at a pub or two, but I’d leave the drunkeness and discoteks for
the weekends…

Other than that, I wouldn’t have traded this experience for anything.  I look forward to many more….

Munich (Oktoberfest)

Thursday morning, we took a train from Prague to Munich.  It took
about 7 hours and gave us a nice view of the countryside and
surrounding hills.  Once again, all of the money I had from the
previous country was useless.  For some reason, I usually had
about $50-100 extra from each country we visited on this trip.. 

We made our way to our apartment (in Arabella Park).  Our landlady
was a real bitch once she found out that there were 5 of us staying
there.  Apparently something got lost in translation and she only
thought that there were going to be 4… we ended up paying about $120
more for the 5th person.  That night, we went to the Hofbrau House
and enjoyed some food, singing, prositing (toasting), and talking with
people.  The Hofbrau house is largely a tourist place, but since
tourists from all over the world go there, the people are very
diverse.  For example, we initially talked with some guys from a
North East territory of Spain.  I found out that parts of Spain
don’t really get along with other parts, to the point to not wanting to
say that they are from Spain.  When I cheered Spain on their
behalf, they got all emotional and explained to me that they were from
the territory… not Spain.  After a little while, we moved to a
table closer to the band and for the rest of the night talked with some
local Munich people…

Fox and I went home after the Hofbrau House closed (around
11:00pm).  We had to wake up early Friday morning to head to the
airport.  The other guys stayed out long into the night and proved
that German beer can get you very drunk.  So… the joy of buying
a plane ticket last minute for a town that is sold out.  There
were 3 seats available from Munich to London for Sunday.  We got
them, but had to pay around $800 a piece for them.  To top it all
off, Phil was the lucky winner of the 7:00am ticket, while Fox and I
had 12:00pm tickets back to London.  So, with that out of the way,
we headed to the Hippodrome at Oktoberfest.

We got to the tent and easily found where Brad, Hann-Ah, and Phil were
sitting.  They were sitting at a table talking with some guys from
New York and Washington DC.  Because it was Friday morning (around
11:00am), the place wasn’t that full.  We were able to talk to the
waitresses and find out some information about how Octoberfest works. 
The waitresses (Eva and Babsi) were extremely nice (not to mention
cute) and explained that people without reservations are allowed
entrance to the tent only when the front doors are open in the
morning. 

If you don’t have a reservation, you can stay in the tent, but if you
leave while the front doors are closed, you won’t be let back in.  In
order to be let back into the tent, you have to have a bracelet.  They
have bracelets for the afternoon and bracelets for the evening.  The
afternoon bracelets last until 4:00pm and the evening bracelets go from
4:00pm till close (10:30-11:00).  So you can reserve a table for lunch
and/or reserve a table for dinner.  The hippodrome is the smallest tent
and it holds around 6,000 people, while the other tents on the grounds
hold around 12,000. 

So… this is how we did our two days at Oktoberfest.  We tipped when
we ordered beer… around 1-3 Euro per liter of beer.  It seemed that
most people in the tent did not tip.  After talking for a while, we
were able to get bracelets for $10 a piece.  We paid $15, again
throwing in a tip. 

After we got our bracelet, we decided to go out and see the rest of the
fest.  We headed towards the Lowenbrau tent, but it was
packed.  So we
only stayed for one beer.  After that, we headed toward a grassy
hill
by a big statue.  We ended up taking a small nap there, in hopes
of
sobering up a little.  Phil, however, was a lost cause… he ended
up
just doing somersaults and annoying other people on the hill. 
After
the nap, we headed back to the Hippodrome to drink away the
night.  It
was harder to find room for all of us, but the ladies helped us out
once again.  We danced, sang, and drank throughout the
night.  I can’t count how many times we sang “Ein Prosit”… it’s
a great song where you sing about cheers-ing the people around
you.  Amazingly, Phil made it through the entire night…

Saturday was much of the same.  But because it was Saturday, the tents
filled up extremely early.  We got to the Hippodrome around 9:30 with a
pretty healthy line outside.  Once we got inside, all of the tables
were taken already.  The really cool thing is that Eva and Babsi saved
us a complete table, though.  So, for the second day in a row, we had a
full table to ourselves (until 4:00pm).    Once again, Phil got wasted
early again… There must be something in the beer that reacts
differently with him.  We ended up taking a nap again on the grassy
hill…  it just works out well to take a break between drinking… 
When we woke up, Hann-Ah, Fox, and myself thought it would be nice to
pickup some food for everyone else.  When we got back to the hill,
everyone else was gone, though.  We waited for a while, and then
thought it would be a great idea to go on rides… the first ride was
cool, but the second spun us around so much that it made me feel pretty
sick.  A tasty beer helped even that out, though.  I have many great
memories and will post pictures of the festivities… I hope to run
into Eva and Babsi the next time I’m in Munich!  They really made our
time in Munich special.

The only downside of the fest is the Italian guys.  They are relentless
with girls… They basically assault anything with tits, in hopes of
getting laid. 

Last few days in Prague

We ended up going to U Marcanu for dinner on Monday night (Sept.
19th).  That place was amazing.  The food was excellent, the
service
was good and funny, and the entertainment capped everything off
nicely.  We got to the place (via the 18 train) around 7:30 and
ended up missing the first course (potato soup).  We did manage to
have the second course…  a very tasty concoction of ham, potato
dumplings, and sauerkraut.  After that, we had the main course
consisting of a steak, mushroom, veggie kabob, a helping of scalped
potato casserole, and some assorted veggies.  Finally we were
given a traditional dessert of ice cream and a fruit crepe.  I
decided to drink a lot of white wine throughout dinner, so I was
happily buzzed by the end of the meal.  After dinner was finished,
we stayed at the restaurant for another hour and a half.  We got
involved in singing and dancing to native Czech and Gypsy songs. 
That night, we went out to some bars in our neighborhood (Praha 1)

Tuesday was a rough day for me.  I was pretty hung over from all
of the wine that I drank the night before and didn’t start feeling
normal again until late in the day.  We walked through a lot of
the shops while it rained.  Some of the styles (camouflage) were a
little too much for me to try to pull off.  Some of the other guys
enjoyed some of the clothes, though.  That night, we decided to go
to a strip club.  Prague has people trying to sell strip places,
among other things, in the squares.  We went to one and I was
nominated to be the scout to see if it was worth it.  One or two
girls were cute, but I figured that we should continue to look… So we
went to another club and were all allowed to go in to scout it
out.  All of the girls were absolutely beautiful.  If I knew
the name of the place, I’d mention it, but I don’t.  I just know
that we paid 300 crown for 5 beers and shows.  We got to see a
nice show with two girls while we were there, too.  Overall, I
recommend going to this place as much as I recommend going to U
Marcanu.  After seeing the show, we went out for some drinks.  Double
Trouble had the best music for the trip and wasn’t too crowded when we
were there.  It might be worth checking out, if you get the chance.

Wednesday involved more of a tourist way of life. We hopped on a two our bus tour of Prague. It took us through Old Town, New Town, the Jewish quarter, and up to the castle. Since I had visited the castle previously, I decided to walk to the nearest cafe for a cool beverage. While enjoying my still water, the waitress convinced me to take a shot of

Wednesday
– Tour
– Brewery Tour
– Smoked at night

We did more touristy type things on Wednesday.  We hopped on a
two our bus tour of Prague.  It took us through Old Town, New
Town, the Jewish quarter, and up to the castle.  Since I had
visited the castle previously, I decided to walk to the nearest cafe
for a cool beverage.  While enjoying my still water, the waitress
convinced me to take a huge shot of Becherovkawhich
tasted pretty yummy.  If I were to make a similarity, I would say
that it tastes like a weak Schnapps type liquor.  While she tried
convincing me to take
another, I got her to give me a massage.  that was a nice
bonus.  After
the tour, Brad and I decided to take a walk and see the U Flaku
brewery.  It is the oldest brewery in Prague and I have to admit
that
they had excellent beer.  Again, make a reservation if you’re
interested in going there.  We didn’t, so we couldn’t go on a
tour…
we just had some beer cheese dip, bread, and beer. 

A $40 cab ride to a closed restaurant

Yesterday, we ended up at an Irish pub to watch a soccer match between Liverpool and Manchester.  It was a pretty good game and the place served tasty cheeseburgers.  Afterwards, I got another Thai massage and then we headed toward the castle.  The castle was not as exciting as I had hoped, but the cathedral inside the castle was pretty amazing.  I even got to see a couple girls seductively posing with the cathedral.  The cathedral is Gothic with gold enhancements on the statues.

 

We were then interested in seeing some traditional folk dancing at U MARCANU, a restaurant in Prague 6.  It was closed, and unfortunately, the cab ride from the castle cost 1000 crowns (about $40).  Ah well, hopefully it’ll be open before we leave for Munich.

 

For nightlife, we went to a jazz club last night.  The performers were doing modern jazz and played two sets while we were there.  It seems that jazz is pretty popular in Prague, and I would recommend catching a show at one of the many jazz clubs if you get a chance.  Afterwards, we headed toward the Old Town Bridge for some discotecs.  We were going to go back to Karlovy Lazne, the largest club in middle Europe, but got sucked into another place.  We thought it was a “nightclub” but it ended up being a really neat bar with a couple go-go dancers.  The dancers unfortunately remained somewhat clothed, but they were probably the most beautiful girls that we’ve seen on this trip so far.  We talked with some Australians for a little while and then headed out.  Instead of going to the discotec, we headed to a nice pub called The Chateau.  It has a dance floor in the basement, but the place was pretty empty.  So it ended up being a nice place to just have a couple beers.

 

The first night that we went out in Prague, we went to two discotecs…. the first was called the Matrix, but that sucked. It reminded me of a house party.  The other was called Mecca and ended up being fairly entertaining.  It wasn’t a large club, but the people definitely seemed into having a good time.

 

btw, I’m going to have to kick kj in the nuts when I get home, for telling me that Bohemia was somewhere in the Caribbean.

Walking Prague

Today we did a nice walking tour of Prague.  We walked all around Old Town and ventured across the Famous Old Town bridge.  I crawled up the 138 stairs that make up the Old Town Bridge tower and proceeded to hold on to the railing for dear life.  It did provide some pretty nice pictures, though.

 

Apparently, the Old Town Bridge was built around 1357 by Charles IV and was used by Kings to get to Castle Prague.

 

I have to admit that there are so many sites in Prague, that I feel that it would be easier for you to visit Prague than for me to describe all of it.  Also, I feel that I might pass by a building that would really stand out in another area.  It just seems as though all of the buildings are magnificent here.

 

btw, the internet cafes in Prague are much better than Budapest.  We can finally unload pictures…