Monday, March 23, 2015

Best Dishes in Columbus

I have lived in Columbus more than half of my life and throughout the years I have a growing food & dishes that I think are the best in the city. So without further ado, here they are. If you have any suggestions, please leave them in the comment.

The list will be in CATEGORY - RESTAURANT - NAME OF DISH

East-Asian Food
  • Tofu Dish - Happy Dragon (Livingston Ave) - Pipa Tofu
  • Hand-made Noodle - Jiu Thai (Bethel Rd) - Beef Stretch Noodle
  • Pho (Vietnamese Noodle Soup) - Buckeye Pho (Bethel Rd) - Pho Dac Biet
  • Phad Thai - Bangkok (Refugee Rd) - Phad Thai
  • Salt & Pepper Squid - Panda Inn (Bethel Rd) - Salt & Pepper Calamari
  • Spicy Diced Chicken - Coco's Grill (5th Ave) - Hot Spicy Chicken (extra crispy)
  • Dumplings - Sesame Sea (Muirfield Dr) - Firecracker Wontons
  • Pork Chop - Sun Flower (Sawmill Rd) - Crispy Ribs
  • General Tso Dish - General Tso's Restaurant (Godown Rd) - General Tso's Beef
  • Sushi Dish - Akai Hana (Old Henderson Rd) - Any Sushi
  • Chicken Wings - Yau's Bistro (N High St) - Spicy Wings
  • Spicy Pork - Happy Dragon (Livingston Ave) - Jalapeno Pork
  • Pork Belly Dish - Little Dragon (Morse Rd) - Mecai Pork
  • Crispy Whole Chicken - Pacific Eatery (Kenny Rd) - Crispy Chicken

Latin Food
  • Pastor (pork) Taco - Los Guachos Taqueria (Godown Rd) - Pastor Taco
  • Fish Taco (fried) - El Arepazo (Pearl St) - Fish Taco
  • Empanada - El Arepazo (Pearl St) - Pork/Beef Empanada
  • Latin Sandwiches - Si Senor (Lynn St) - ChicharrĂ³n Peruano
  • Huevos Rancheros - Star Liner Diner (Cemetery Rd) - Huevos Rancheros
  • Chiliquiles - Star Liner Diner (Cemetery Rd) - Chiliquiles
  • Cheese Empanada - El Manantial Latino (Hudson St) - Cheese & Pineapple Empanada
  • Pork Belly Taco - Nada (Nationwide Blvd) - Crispy Pork Belly Taco

Western Food
  • Classic Calamari - Eddie Merlot (Polaris) - Sesame Calamari
  • Pork Belly - The Market Italian Village (Summit St) - Braised Pork Belly
  • Chicken Wings - Rooster's - Chipotle Garlic Wings
  • Gyro - Yanny's (Cleveland Ave) - Small Lamb Gyro
  • Pizza - Benny's Pizza (Marysville) - BLT Pizza
-- read more and comment ...

Sunday, March 22, 2015

Installing DNN Platform in Azure Website

I was installing DNN Platform on an Azure Website following this documentation on DNN website. But, for whatever reason, my installation never finished and stopped at 18% and gave up. The log button shows nothing. Trying the "Retry" button produces SQL error for basically trying to create existing DB elements.

So I proceeded to delete my website and its DB - and try again from scratch. But after 2-3 times trying and getting the same result over and over again, I started to dig into the internet and found this post - which basically saying:

After installing the website and prior to installing the DNN platform, change the scale from "FREE" to "STANDARD" on your website. Stop & restart - and then proceed to install DNN.
-- read more and comment ...

Tuesday, March 10, 2015

Tire Tips For Your Car

In maintaining a car, tire purchase is always expensive but necessary. Every 4-5 years on average, you need to replace your tires. Depending on the size/measurement and type of your tires, this could translate to $300 to $1,000 to just purchasing new tires alone. Then adding cost of balancing, mounting, getting rid of your old tires, etc - you add another about $40 per tire. Although you only do this every 4-5 years, it is still quite costly. So how can we do some cost saving in this tire related stuff?

TIRE LIFETIME
Using your tire as long as possible is one way to do it, but if you are using bald tire, it can be very dangerous. So how can we get the best lifetime of our tires? There are three simple principles: tire pressure, balancing, and alignment. If you keep these 3 things in line then you have the possibility to get the most out of your tire lifetime. These 3 things basically deal with the evenness of your tire thread wear. If you have under-inflated tire(s), or an unbalanced tire(s), or misaligned car, it will create uneven wear - which will reduce the lifetime of your tire.
TIPS:
  • The standard manufacturer recommended tire pressure usually listed on a sticker inside one of your door.
  • Most tire shop/place (Firestone, Goodyear, DiscountTire, etc) will check pressure and inflate your tire for free of charge.
  • Most tire shop (at least I know Firestone, NTB, and DiscountTire) have a lifetime balancing deal. So you pay a fee ($15 per tire), but then you can balance your tires anytime you want as long as you own the same set of tires. I balance my tires every 6,000 miles or every 6 months. This is a lot cheaper compared to what the car dealership is charging you.
  • Most tire shop (at least I know Firestone) have a lifetime alignment deal. So you pay a fee ($170 at Firestone), but then you can your car anytime you want as long as you own the car (some places only goes for 3-4 years). I check my alignment every time I balance my tires - every 6,000 miles or every 6 months. For a single standard alignment, it usually costs you about $70 - so within 3 alignments, I already got my money's worth.

TIRE PURCHASE
You can get your tire measurements from your own tire, just look at the side wall and it will be written there, usually in this format: XXX/YY/RZZ. My minivan has these measurements: 235/65/R16. Or, you can go to www.tirerack.com and enter your car's year, make, and model - then it will tell you the original tire sizes/measurements.

Once you have your measurements/sizes, go to www.tirerack.com, click "Tires" and then "Survey Results". Now depending on your car type, and tire type, you want to select the tire type that you want. A few tips: "Summer" tire is unusable in the winter time, "Winter" tire is usable in non-winter times but has short lifetime. Since I live in Ohio, I always buy an "All Season" tire - which means I don't have to replace the set of tire seasonally. So I open each "All Season" option in a new tab in my browser and enter in my tire size on the left side under "FILTER BY" of the window and close the tabs that yielded no results. From that point on, it is just a matter of taste, preference, price, and survey results. For example, for my minivan (235/65/R16), I am choosing General AltiMAX RT43 (T-Speed Rated) as my top pick. Now if you are buying new tires, you put the tire in your basket, and pay and checkout from TireRack.com - you can ship it to your home, in which then you will need to take them to the tire shop to be installed later on, or you can ship them directly to the tire shop that you will be installing (assuming you already made an appointment with them).
TIPS:
  • If you are buying new tires from the big-box store, always go to Discount Tire. They always have the best price. Always. They even price-match.
  • Always ask for lifetime balancing during your installation - you pay a bit more, but worth it. Read "TIRE LIFETIME" above.
  • Never go to Monroe, Walmart, Sears, Midas, Meineke
  • If you prefer local store instead of the chain-shops, go to Katz Tires in Columbus. Good people, fast, awesome prices, excellent customer satisfaction

PURCHASING USED TIRES
Another option is to buy used tires. There is a huge market for used tires - from junk yards, people swapping rims & tires, etc. These tires usually still have about 50-90% thread left, which means 2-4 years (or more). Now why used tires? Because they are "CHEAP" - I am talking REALLY REALLY CHEAP. Here is an example, a new tire for Continental ProContact (245/45/R18) cost about $210 per tire. In the used market, with 80% thread, you can get one for about $50-$60 (including mounting, balancing, and disposing your old tire). If you are not picky about brand, you can get cheaper ones that only cost about $35-$45 per tire for that size. For smaller size (for like a Civic or an Elantra etc), it can be cheaper still. I have seen someone walk out the door with 4 tires installed, balanced, and dispose old tires for $100. Getting used tire(s) is ideal when you do not need a whole set - sometimes you just need 1 tire or maybe a pair because of flat, sidewall damage, etc. Used tires are not ideal if you are a stickler to a particular brand/type, or if you have rare sizes - since they are used and cannot be special ordered.
TIPS:
  • Know what you want in terms of sizes and brand/type. I would use the survey from TireRack to narrow down my list of brands/types.
  • Call lots of places and compare prices, thread-wear, and availability. In Columbus alone there are about 20+ used tire shops.
  • Read shops review. Some shops are really friendly, nice, and professional. Some are just plain rude and questionable.

My tire store is Katz Tires. They are old-school, been in Columbus forever, well-known tire shop in Columbus. They sell new and used tires. Their service is always impeccable, fast, economical, satisfaction guaranteed. They are a tire shop - so they sell, mount, and fix tires - nothing else. Katz is always the first shop I call if I need a used tire or a plug/patch. Here is a story where they just treat you above and beyond: I came in the other day because of a leak in one of my tire. My tire pressure indicator alerted me about it and I need to put about 10 psi of air every week. So after 2 weeks of leakage, I brought it to Katz. They took care of me right away, dismounted the wheel, checked for leaks, inspected the tire, and after 10 minutes or so, one of their staff came to me and said that they could not find a leak. I told them my story and they thought it was a just small leakage from dirty rim lip. So they cleaned the rim and the tire, remounted the tire into the rim, re-balanced the wheel, mounted the wheel into the car. When the staff gave me my key back and I was ready to pay - he said "free of charge, no need to pay". So I was a bit confused and asked him "Really? Are you sure?" He replied, "Absolutely. 100%. Bring it back if it still leaking and we will take another look." He just won a customer for life.
Don't believe me about Katz? Check out their Yelp review.

There is also a Firestone nearby my house where I do all my lifetime balancing and alignments. They treat me right, rarely push any services beyond what I need, and they are close to there I live. I also like Discount Tire, they are generally great, but they do not do alignment. So balancing & alignment in separate places just create too much hassle for me.
-- read more and comment ...

Saturday, February 21, 2015

Using GMail as email service from Azure

Following these posts:

I have successfully setup my Azure hosted ASP.NET MVC project to send email via SendGrid. But, SendGrid is a bit slow, which is irritating when the email is for registration confirmation - which I want to be as fast as possible, so if a user registers, that user will get an email within a minute or faster to confirm his/her email to complete registration. If the use must wait longer than that, chances are that the registration will never be continued and finished. So I wanted to use a faster email service - why not GMail?

Here is the SendGrid code:
        private static async Task SendGridSendAsync(string to, string from, string subject, string body)
        {
            var myMessage = new SendGridMessage();
            myMessage.AddTo(to);
            myMessage.From = new System.Net.Mail.MailAddress(
                                "my.service.email.address@gmail.com", "my.service");
            myMessage.Subject = subject;
            myMessage.Text = body;
            myMessage.Html = body;

            var credentials = new NetworkCredential(
                       "sendGridAccount", "sendGridPassword"
                       );

            // Create a Web transport for sending email.
            var transportWeb = new SendGrid.Web(credentials);

            // Send the email.
            if (transportWeb != null)
            {
                await transportWeb.DeliverAsync(myMessage);
            }
            else
            {
                Trace.TraceError("Failed to create Web transport.");
                await Task.FromResult(0);
            }
        }
Here is the GMail code:
        private static async Task GmailSendAsync(string to, string from, string subject, string body)
        {
            var sentFrom = (string.IsNullOrEmpty(from) ? "my.service.email.address@gmail.com" : "my.service");

            // Configure the client:
            System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient("smtp.gmail.com");

            client.Port = 587;
            client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
            client.UseDefaultCredentials = false;

            // Creatte the credentials:
            System.Net.NetworkCredential credentials = new NetworkCredential(
                 "gmailAccount", "gmailPassword"
                 );
            client.EnableSsl = true;
            client.Credentials = credentials;

            // Create the message:
            var mail = new System.Net.Mail.MailMessage(sentFrom, to);
            mail.Subject = subject;
            mail.Body = body;

            await client.SendMailAsync(mail);
        }
-- read more and comment ...

Friday, January 30, 2015

Explicit operator

According to MSDN, explicit operator keyword declares a user-defined type conversion operator that must be invoked with a cast. This is super handy if you are doing a lot of conversion/translation in your code.

Here is an converting between two separate classes, Person and Contact - which have translatable properties between them.

public class Contact {       
        public string Name { get; set; }
        public string PrimaryPhone { get; set; }
        public string PrimaryEmail { get; set; }
}

public class Person{
        public int PersonId { get; set; }        
        public string FirstName { get; set; } 
        public string LastName { get; set; }
        public string HomePhone { get; set; }
        public string HomeEmail { get; set; }
        public string WorkPhone { get; set; }
        public string WorkEmail { get; set; }
        public string CellPhone { get; set; }
}
Then, you can create an explicit conversion operator such as this:
public static explicit operator Contact (Person person)
{
    return new Contact 
    {
          Name = person.FirstName + " " + person.LastName,
          PrimaryPhone = (String.IsNullOrEmpty(person.CellPhone) ? 
                  (String.IsNullOrEmpty(person.WorkPhone) ? 
                  person.HomePhone : person.WorkPhone) : person.CellPhone),
          PrimaryEmail = (String.IsNullOrEmpty(person.WorkEmail) ? person.HomeEmail : person.WorkEmail)
    };
}
Here is how you would use it:
Contact contact = (Contact)person;
-- read more and comment ...

Tuesday, January 20, 2015

Enabling IIS Express to Accept External Request

I am doing a web development project where the web application needs to look good on all browsers (on Mac and PC - Win7 and Win8) and mobile devices (iPad, Windows Phone, Android, etc). So most of my testing can be done in my development machine - either by running an emulator from Visual Studio, or letting the browser (i.e. Safari) emulate iPad/iPhone resolution. This probably solved 95% of the issues and problems. But, then I still want to do a real device test - where I actually run the web application and browse to it from an iPad, or a Mac, from an Android phone, etc.

Of course - the ideal solution is just to put the web application somewhere on the internet (i.e. http://mytestwebsite.mydomain.com) and let the testing begin. But unfortunately, I do not have the luxury of a QA or test site. So I just have to run it locally.

I can set it up on my IIS, but that seems to be a hassle - removing/stopping my current site running in IIS, setting up this new site, creating all the permissions, app pool, etc. Too much overhead for simple testing. Can I just hit F5, or run the IIS Express and make it accepting external request - so I can hit the site from outside of my dev machine? YES!

Allowing everyone to access http://mydevmachine:80

Open up an admin elevated command prompt and type in this command:
      netsh http add urlacl url=http://mydevmachine:80/ user=everyone

Open up firewall

Now, we need to open up the Windows Firewall for allow traffic to go through. In the same command prompt from above, type in this command:
      netsh firewall add portopening TCP 80 IISExpressWeb enable ALL

Configure IIS Express

Lastly, we need to add our machine name into the IIS Express configuration. You can find the config file located in C:\Users\\Documents\IISExpress\config. Open the file using any text editor and find the web application configuration. My web application is named "Domain.Site.Mvc" in this example.
<site name="Domain.Site.Mvc" id="4">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="c:\Projects\Domain.Site\Domain.Site.Mvc" />
    </application>
    <bindings>
        <binding protocol="http" bindingInformation="*:12555:localhost" />
        <binding protocol="http" bindingInformation="*:80:mydevmachine" />
    </bindings>
</site>

Now, I can start my site on my dev machine and then browse to it from separate machines, Mac machine, phone, tablets, etc by just going to http://mydevmachine/. With the exception of an iPad. For whatever reason, iPad does not allow browsing to a local machine name - it has to be a fully qualified domain name. I will write a solution to this on a separate blog post.
-- read more and comment ...