Tuesday, June 27, 2006

First let me go on record as saying that I think using a 'z' to terminate words is utterly moronic, like using the number 2 instead of the word 'to'.

Anyway, on 2 my skillz....

Last week I posted a fantastic kludge for turning on the Bluetooth radio on an Axim X30.  Well, like any kludge, as soon as it shipped it broke.  Turns out the notification icon isn't always in the rightmost position - it can move.  That screwed with my intricate algorithm of moving in and up 10 pixels from the lower left corner of the screen.

So what's a developer to do?  First, let's take a quick detour into how those icons work. 

They "tray" icons are actually called Notification icons and they are displayed by calling the Shell_NotifyIcon API.  When the icon is created you provide a window handle for it to notify when it's clicked.  The icon itself doesn't have any other abilities.  This is a critical piece of info for this hack.

Since I know it's posting messages to another Window when it's clicked, I simply needed to figure out exactly what it's doing.  Time to break out Remote Spy++ in eVC (are you in the group that never really knew what the hell that tool was used for? This is a classic case).

Loaded up Spy++ and I see a Window conspicuously named "Bluetooth Console" - that's promising.  I put a watch on it and sure enough, when I tap the icon, messages get posted to that window (off is in the blue box, on in the red).  Now all I need to do is post the same messages.

So first, I need the handle for that Window.  Time for the FindWindow P/Invoke:

IntPtr btWindow = FindWindow("WCE_BTTRAY", "Bluetooth Console");

Next, replicate the messages the tap generates:


SendMessage(btWindow, WM_USER + 1, 0x1267, 0x201);
SendMessage(btWindow, WM_USER + 1, 0x1267, 0x202);
SendMessage(btWindow, WM_USER + 1, 0x1267, 0x200);

That causes the Bluetooth Console to create and show the popup menu. Now it needs a message to tell it to wait for a menu tap:

SendMessage(btWindow, WM_ENTERMENULOOP, 0x01, 0x00);

Now "generate" the tap:

SendMessage(btWindow, WM_COMMAND, BluetoothRadioState ? CMD_BT_OFF : CMD_BT_ON, 0x00);

And tell it to quit listening for menu taps:

SendMessage(btWindow, WM_EXITMENULOOP, 0x01, 0x00);

It does something else that I can't tell what the effect is, but since it's doing it, I will too:

// not sure what this does, but physically clicking does it, so replicate it here
SendMessage(btWindow, WM_USER + ((BluetoothRadioState) ? (uint)0xC00D : 0xC00C), 0x01, 0x00);

And finally get the Menu window and hide it:

IntPtr btmenu = FindWindow("MNU", "");

SendMessage(btmenu, WM_DESTROY, 0x00, 0x00);
SendMessage(btmenu, WM_CANCELMODE, 0x00, 0x00);

While it's still ugly, it's a bit cleaner than the original, and much smaller.  This is our new class in its entirety:

using System;
using Microsoft.Win32;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace OpenNETCF.Devices
{
  public static class AximX30
  {
    public static bool BluetoothRadioState
    {
      get
      {
        RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\WIDCOMM\BtConfig\General");
        bool currentState = (((int)key.GetValue("StackMode")) == 1);
        key.Close();
        return currentState;
      }
      set
      {
        // see if any action is needed
        if (BluetoothRadioState == value)
        {
          return;
        }

        IntPtr btWindow = FindWindow("WCE_BTTRAY", "Bluetooth Console");

        // pop up the menu
        SendMessage(btWindow, WM_USER + 1, 0x1267, 0x201);
        SendMessage(btWindow, WM_USER + 1, 0x1267, 0x202);
        SendMessage(btWindow, WM_USER + 1, 0x1267, 0x200);

        // give it time to create the menu
        System.Threading.Thread.Sleep(100);

        // find the menu that popped up
        IntPtr btmenu = FindWindow("MNU", "");

        // start the window listening for menu messages
        SendMessage(btWindow, WM_ENTERMENULOOP, 0x01, 0x00);
        // send it the on or off message
        SendMessage(btWindow, WM_COMMAND, BluetoothRadioState ? CMD_BT_OFF : CMD_BT_ON, 0x00);
        // tell it it's done listening
        SendMessage(btWindow, WM_EXITMENULOOP, 0x01, 0x00);

        // not sure what this does, but physically clicking does it, so replicate it here
        SendMessage(btWindow, WM_USER + ((BluetoothRadioState) ? (uint)0xC00D : 0xC00C), 0x01, 0x00);

        // now hide the menu
        if (btmenu != IntPtr.Zero)
        {
          SendMessage(btmenu, WM_DESTROY, 0x00, 0x00);
          SendMessage(btmenu, WM_CANCELMODE, 0x00, 0x00);
        }

        return;
      }
    }

    [DllImport("coredll.dll")]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("coredll.dll")]
    private static extern int SendMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

    private const uint WM_DESTROY = 0x02;
    private const uint WM_CANCELMODE = 0x1F;
    private const uint WM_USER = 0x400;
    private const uint WM_ENTERMENULOOP = 0x0211;
    private const uint WM_EXITMENULOOP = 0x0212;
    private const uint WM_COMMAND = 0x0111;

    private const int CMD_BT_OFF = 0x1001;
    private const int CMD_BT_ON = 0x1002;

  }
}

6/27/2006 3:58:19 PM (Eastern Daylight Time, UTC-04:00)  #    Comments [0]  | 
 Friday, June 23, 2006

I recently worked on a project that required me to connect to a printer from a Pocket PC with the Widcomm bluetooth stack on it.  Frustrating as it was, one positive thing came from it - I generated a nice start to a set of classes for using High-Point Software's BTConnect.

Of course it means that you'll need to buy BTConnect to use this library without the "evaluation mode" popup, but it abstracts the ugliness of sommand-line parameters away from the developer so you can focus on creating your app.

I've parked the library here:

www.opennetcf.org/shared

6/23/2006 4:31:35 PM (Eastern Daylight Time, UTC-04:00)  #    Comments [0]  | 
 Thursday, June 22, 2006

So I spent all of today fighting with a Dell Axim X30, and I've again come to the conclusion that companies who keep things proprietary really suck.

My task was to print over Bluetooth.  I decided that I'd use PrinterCE from Field Software for simplicity, and all worked well if the radio was already on when I tried to print.  If the radio was off, however, things went bad quickly and the device had to be soft reset to recover.  Not a good thing for usability.

Since they use the Widcomm/Broadcomm stack, I decided to look at the BTConnect stuff from High-Point software.  After four or five hours of creating a nice class wrapper for the app (which is going to become a shared-source library from OpenNETCF shortly) I found that the radio is on whenever I am actively searching or connecting, but as soon as it's done, the on-board BT manager shuts the radio off.  That means I can find the printer and connect with it, but as soon as I had off printing to PrinterCE, the radio shuts off and the device hangs.  Beautiful.  A plague upon the engineers at Dell.

Searching the web I find nothing hinting at how to programmatically do this.  Curses on the yet again.

I use Spy++ to see if I'm lucky and any messages might jump out when I use the BT Manager.  Nothing.  My hatred for Dell increases.

I search the registry for anything that might affect behavior and I find only one key that reports the current state.  Damn you Dell!

So I'm now a day into just turning on a Radio for a job I've quoted at 2 days (which I've already used doing the reporting code).  Now not only am I highly irritated, I'm highly irrated on my own dime.

So I make a last ditch effort to get something that at least functions.  I decided for a kludge, and a really nasty one at that.  As soon as I thought of it, I was disgusted by the idea, but I've really been left with no choice.  I'd simulate tapping the screen to turn the radio on.

And without further ado, I give unto you the following ugliness.  Hopefully no one elese ever has to use it, but since I've stooped this far, someone else probably will have to as well.  If you do, please curse Dell as well.

using System;
using Microsoft.Win32;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace OpenNETCF.Devices
{
  public static class AximX30
  {
    public static bool BluetoothRadioState
    {
      get
      {
        RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\WIDCOMM\BtConfig\General");
        bool currentState = (((int)key.GetValue("StackMode")) == 1);
        key.Close();
        return currentState;
      }
      set
      {
        // see if any action is needed
        if (BluetoothRadioState == value)
        {
          return;
        }

        // save where we were
        IntPtr topWindow = GetForegroundWindow();

        int bticonX = Screen.PrimaryScreen.Bounds.Width - 10;
        int bticonY = Screen.PrimaryScreen.Bounds.Height - 10;
        int btmenuX = Screen.PrimaryScreen.Bounds.Width - 20;
        int btmenuY = Screen.PrimaryScreen.Bounds.Height - 80;
        int starticonX = 10;
        int starticonY = 10;
        int todayX = 10;
        int todayY = 60;

        // start
         SendTap(starticonX, starticonY);

         // let the menu draw
         System.Threading.Thread.Sleep(300);

         // today screen
         SendTap(todayX, todayY);

         // let the screen draw
         System.Threading.Thread.Sleep(300);

         // Blutooth icon tap
         SendTap(bticonX, bticonY);

         // let the menu draw
         System.Threading.Thread.Sleep(300);

         // bt menu tap
         SendTap(btmenuX, btmenuY);

         System.Threading.Thread.Sleep(300);

         // restore where we were
         ShowWindow(topWindow, SW.NORMAL);
         UpdateWindow(topWindow);
       }
      }

    [DllImport("coredll")]
    private static extern void mouse_event(
            MOUSEEVENTF dwFlags, int dx, int dy, int dwData, int dwExtraInfo);

    [DllImport("coredll")]
    private static extern IntPtr GetForegroundWindow();


    [DllImport("coredll")]
    private static extern bool ShowWindow(IntPtr hWnd, SW nCmdShow);

    [DllImport("coredll")]
    private static extern bool UpdateWindow(IntPtr hWnd);


    [Flags]
    private enum HWND
    {
    TOP = 0,
    BOTTOM = 1,
    TOPMOST = -1,
    NOTOPMOST = -2
    }

    private enum SW
    {
    HIDE = 0,
    SHOWNORMAL = 1,
    NORMAL = 1,
    SHOWMINIMIZED = 2,
    SHOWMAXIMIZED = 3,
    MAXIMIZE = 3,
    SHOWNOACTIVATE = 4,
    SHOW = 5,
    MINIMIZE = 6,
    SHOWMINNOACTIVE = 7,
    SHOWNA = 8,
    RESTORE = 9,
    SHOWDEFAULT = 10,
    FORCEMINIMIZE = 11,
    MAX = 11
    }

    [Flags]
    private enum MOUSEEVENTF
    {
        MOVE = 0x1, /* mouse move */
        LEFTDOWN = 0x2, /* left button down */
        LEFTUP = 0x4, /*left button up */
        RIGHTDOWN = 0x8, /*right button down */
        RIGHTUP = 0x10, /*right button up */
        MIDDLEDOWN = 0x20, /*middle button down */
        MIDDLEUP = 0x40, /* middle button up */
        WHEEL = 0x800, /*wheel button rolled */
        VIRTUALDESK = 0x4000, /* map to entrire virtual desktop */
        ABSOLUTE = 0x8000, /* absolute move */
        TOUCH = 0x100000, /* absolute move */
    }

    private static void SendTap(int x, int y)
    {
      mouse_event(MOUSEEVENTF.LEFTDOWN | MOUSEEVENTF.ABSOLUTE, 
            (int)((65535 / Screen.PrimaryScreen.Bounds.Width) * x), 
            (int)((65535 / Screen.PrimaryScreen.Bounds.Height) * y), 0, 0);
      mouse_event(MOUSEEVENTF.LEFTUP, 0, 0, 0, 0);
    }
  }
}

6/22/2006 5:02:54 PM (Eastern Daylight Time, UTC-04:00)  #    Comments [1]  | 
 Thursday, June 08, 2006

In this second part of my brewing diatribe we'll look at the equipment necessary for extract brewing.

Before going out and buying equipment, I recommend you see if your local brew supply house offers brew-on-premise (BOP) services.  For $100-150 you can get a guided tour through the brewing process from someone with experience.  You get to use nice equipment.  You don't have to clean up.  You find out if you really do like brewing or if you should stick to buying bottles.  And you'll end up with about 15 gallons of decent beer.  The reality is that when I want to make large batches I still use my local BOP because it just flat out simplifies things.

Let's say you've done a BOP, or you're so certain you want to get into it you'll willing to skip the step.  Well here's a list of equipment that you'll need.  You can get brewing with less equipment that I'm listing, and you can get smaller or cheaper equipment that some of what I list, but trust me.  If you do much brewing you'll outgrow the small stuff.  You'll quickly grow to dislike the cheap stuff, and in the end you'll end up with what I have listed here.

I'm also going to keep it simple.  You can go crazy and spend way more on things if you want.  You can also get all sorts of paraphenalia that I'm not even listing, but this is a solid core of brew equipment that you can use for years of brewing.

1. Propane turkey fryer burner and thermometer ~$50

The pot is usable for brewing _only_ if it's stainless steel.  If it's aluminum don't even think about it - you'll end up with ruined, nasty tasting beer.  I actually recommend you pitch the pot that you get too as I have a better recommendation later.  The turkey pot is just big enough to make you think it will work, but I guarantee you'll have messy boil overs and have to add water to get the volume or gravity you want.  Keep the thermometer.  It'll work well enough.

You can also try the kitchen stove, but wort is an unbelievably sticky mess when it boils over, and believe me, when it first comes to a boil and you throw in hops it really wants to boil over.

2. Brew kettle ~$100-200

Don't go cheap here.  You'll end up spending a lot on crap entil you finally end up back where I'm pointing you.  Get a converted stainless steel 16-gallon keg.  You can get just a cut keg, but I really recommend you get one with two stainless fittings welded to it.  One for a stainless quarter-turn spigot with a 90-degree down tube, the other for a good thermometer.  You don't need the thermometer right away, so save yourself the $40 and just put a plug in it for now, but it's a lot easier to start with the fitting than to try to get it added later on.

3. A brew paddle or really big spoon  ~$20

You can buy one, make one from wood or whatever.  It's going to go into boiling liquid so porosity ios not a big issue.  Make sure you can clean it reasonably well though.  It needs to be big enough that you can stir your kettle without scaling the hell out of yourself.

4. A good barbecue or oven mitt ~$10

You'll be dealing with hot metal and liquid.  You need something to prevent burns.

5. A plastic fermenting bucket ~$20

Get this at the brew supply place, not in the alley behind a restaurant.  It needs to be food grade.  It needs to have a lid with a gasket so it can be sealed airtight, and it needs a hole and seal for the gas bubbler.

6. Gas bubbler ~$2

Get this at the brew supply shop.  It goes into your fermenter to allow CO2 out and no bacteria, spores, etc. in

7. 7-gsllon glass carboy and rubber stopper ~$25

No, not a plastic wtaer bottle from the office, a good glass carboy.  THis is your secondary fermenter

8. Simple siphon and some tubing $~10

This nice tool allow you to easily rack your beer from primary to secondary and from secondary to your keg.  Do _not_ mouth siphon or you'll contaminate your beer.

9. A good sanitizer.  ~$5

Bleach works, but there are some others available at the brew supply shop that have less potential to leave off flavors.

10. 5-gallon Conelius keg ~$20 used

You can go with bottles if you'd like, but once you clean and sanitize enough bottles for 15 gallons and then fill and cap them, you'll be asking youself "why the hell don't I just keg this stuff?"

11. Fittings and new seals for your keg. ~$15

These are for the gas in and the liquid out.  Make sure the fittings match your keg.  There are two connection types: ball lock and pin lock.  I use pin lock, but I know others who use ball lock.

12. A CO2 bottle ~$100

Get it at the local welding supply shop.  A 5lb bottle will probably last you 6 months and refills are usually only ~$10

13. CO2 regulator and hoses ~$50

eBay is a good source here.  You may want a manifold too if you intend to hook up multiple kegs at a time

14. A hose and spigot $10-$250

A cheap hose and spigot will work, but you have to open the fridge.  Nicer kits have a shank that passes through the fridge and gives you a tap right on thee side.  Or you can go all out and buy a pedestal to mount somewhere like the kitchen and run lines to it.

15. A used refigerator ~$50

A full-size will hold 2 kegs and plenty of bottles, hops and the like.  You can use the freezer to hold glasses, ice and packs of ribs and brats for all the people who will start visiting when they find out you have beer on tap

16. A basement or insulated garage

You need to keep beer at ~70F when fermenting for ales, 50F for lagers.  For a lager you really need another fridge, but for ales a typical basement is fine.  If the beer feremnts warm, the yeast creates esters that give it a bad flavor, so this really is essential.

The basement or garage is also useful to store items 1-15.

So there you go.  About $500 to get you going, then it'll run you $30-40 for ingredients per 5-gallon batch you make

6/8/2006 9:32:57 PM (Eastern Daylight Time, UTC-04:00)  #    Comments [0]  | 

I like beer.  I like it enough that I brew my own and I have a 2-faucet tap mounted on my kitchen sink with lines running to the kegs of home brew in a refrigerator in the basement.  My dad asked me this weekend to put together a list of what he needed to make beer that will be ready when I visit next month, and I decided that I would not just give him a list of stuff, but give him a bit of what I've learned about brewing.  After writing several pages I figured I might as well post it here for any potential newcomers to the brewing craft.

I'll going to do this in parts.  This is part one and it's going to be a general look at brewing and ingredients.  I'm leaving a lot out and there are books on the subject, but I hope to provide enough to give an understanding of how it all comes together.

First, let's look at the process of making beer in general.

Beer has essentially four ingredients: water, grain, hops and yeast.  Of course you can add other items, which are called adjuncts, but that's really all there is to it.  By varying the types and amounts of each, as well as the brewing process you get the entire spectrum of goodness known as beer. 

Water

You've got tap water.  If you're comfortable drinking that, it's fine.  In fact you're going to boil it for quie a while, so yuo could even use water that you're not so comfortable with for most beers.  Some people are fanatical and do water quality tests and adjust the pH before starting, or they use bottled or filtered water.

You'll have plenty of time to get fanatical about your brewing methods.  For now use the kitchen sink or the hose bib.

Grain

The ingriedient list of grains in a beer recipe is known as the grain bill and the primary grain used in beer making is malted barley.  There are other grains like rice, wheat, oats and just about anything else the brewer's imagination can conjure up, but barley is invariably the overwheling majority of the grain bill for any beer - even a "wheat beer" or weizen.

The process of "malting" barley is simple, though one few home brewers can attempt because of the sheer magnitude of the equipment and time necessary.  Obviously it's a bit more complex, but the general process is this: barley kernels are wetted and allowed to sprout.  The process of sprouting generates large amounts of starches in the grain that can be converted to fermentable sugars.  When the sprout is about the length of the kernel, the kernels are dried and rolled to break of the sprouts.  That's it.  You've malted your barley. 

The kernels are then roasted to a specific darkeness to provide variation.  Another common variable is the type of barley used.  You'll often see "one row" or "two row" barley, which is an indicator of how the grain physically grows on the stalk.  From this simple process you get everything from crystal malt to black patent.

The grain used along with the amount is going to have the greatest effect on color and alcohol content.  It has an effect of flavor of course, but not as much as you probably expect.

Other grains are typically not malted, but used in whatever form the brewer finds.  I've hand roasted unmalted barley, used quaker oats right from the can and even tries out corn.  Experimentation is fine, but moderation is the key.

If you are going to make home brew there are a few shortcuts you can take and the most common shortcut is in the grains.  Making beer requires a lot of sugar, and a lot of sugar requires a lot of grain.  You have to mill tens of pounds of grain. You have steep it at very controlled temperatures at around 150 degrees in a process called conversion.  This is where the starches are converted to sugars.  The temperature at which the conversion takes place determines if the sugar will be fermentable.  The more fermentable sugars you have, the drier the beer will be and the higher the alcohol percentage.

In home brewing, this is called all-grain brewing and it provides the ability to control almost all variables in how the starches and sugars are extracted and converted.  While that's all well and good, the equipment costs are substantial and the time investment for a batch of beer is quite a bit higher.  On the plus side, you can brew really good beer for probably $0.25 a bottle.

For those of us who like to spend a little less time and a little less money on equipment there is a shortcut called extract brewing.  All-grain brewers will scoff at you and say it's like making instant pudding, but the reality is that most brewers do extract brewing.

Extract comes in two forms dry or liquid.  In both cases it simply a concentration of malted barley sugars.  basically someone else crushed the grains and stteped them to convert and extract the sugars, then put it into a concentrated form.  All you do is dissolve it in hot water and ta-da - you're done.

Now all-extract brews don't have much character, but work well for starter kits and first batches.  Once you've done a batch or two you can add a couple pounds of crushed grains for color and body and for the most part it's touch to screw up.  Of course you don't get to finely control all aspects of the extraction, but you can still get some really good brews this way.

Hops

Hops are a flower that grows on a vine and like most plants, they come in lots of varieties.  Different hops give different flavors to the beer, and the same hops introduced at different times during the brewing process can also change flavor.  Different hops grow better in differnt climates, so you'll see commercial hops from the pacific northwest, from england, from the Czech repulic and a few other places.  In reality, the vine is pretty hardy and will grow in most mid latitudes.  I've got a couple varieties ciming a chimney in my backyard, yet you don't hear "Maryland hops" too often touted on Sam Adams commercials.

At any rate, home brewers can get most any hops in a few different forms - pellet, plug or whole leaf.  Again, some brewers are rabid about the form and by all means you might get rabid yourself, but starting out just consider any one form to be just as good as the next.  If the recipe calls for leaf and your supplier only has pellet shrug it off and move on (hell I do that with hop variety at times).

Just like the grain bill, in the brewing process you have a hop bill and your hops will be of two "forms": bittering or finishing.  The difference is simply when they are added.  Bittering hops are added early and cook longer, finishing hops are added late.  My genral rule is that a finishing hop is added with 15 minutes or less left in the kettle.  Adding the hops right at the end, or directly into the  fermenter is called dry hopping.

Some hops are more traditionally used for either bittering or finishing, but you can have a recipe that has the exact same hop variety used for both bittering and finishing.  Don't worry about it too much, once you brew a few batches you'll start to get the idea.

Yeast

Yeast is the thing that makes the magic of beer.  It affects flavor greatly and it is what generates the alcohol thorugh fermentation.  Basically yeast consumes the fermentable sugars in the wort and gives off alcohol and CO2 (yes, you could say that alcohol is yeast piss).

Beer comes in basically two overall classifications: ale and lager.  All beer falls into one of these two categories, and the difference is all in the type of yeast used.  You've probably heard about "bottom fermenting" and "top fermenting" as a difference, but that's crap.  The difference is purely in temperature.  Ale yeast does it's best work at warmer (65-70F) temperatures, lager yeast works best at cool (50-60F) temperatures.

There are yeast varieties for most styles of beer, and when you're following a recipe it's the one thing you should try to avoid varying (until you get a little experience). 

Brewing

The general process of brewing is this.  You take some water, heat it to 150F and dump in grains.  You let that steep for an hour or so to convert and extract the sugars.  You then bring that to a boil and throw in your bittering hops.  After about 45 minutes you throw in your finishing hops and any adjuncts. You boil that for 15 minutes and you're done.  You have what's called wort, which is simply unfermented beer.

When you're done making the wort, you chill it to around 70 degrees, usually with a wort chiller of some sort, put it in a fermenter and then throw in your yeast (this is called pitching).  You put a lid on this that allows CO2 to escape but no bacteria to get in.  It will begin fermenting and bubbling usually within a day (if not you've probably screwed up or used dated yeast). A large head of foam called a krausen will form. After a week primary fermentation is usually complete. The actual time depends on temperature, yeast type and starting gravity, but for your first batches a week is a good rule of thumb. 

After primary fermentation, you'll take the beer off the top of the sludge, or troub at the bottom of the fermenter.  This is a mix of yeast cake (the colony of yeast that grew during fermentation) and sediment.  You'll rack it (siphon it off) a secondary fermenter.  This helps keep the beer clarify and not acquire any off taste from the sediments.  You'll no doubt get some sediment transfer and there's plenty of yeast in suspension.  That's fine, and in fact the yeast is necessary later.

You'll leave the beer in the secondary fermenter for a week or six (it's not terribly critical, and it can vary from beer to beer) until youre ready for bottling.  At that point you'll prime the beer by adding a sterilized corn sugar mix (boiled wayter and corn sugar).  This will provide the food for the suspended yeast to carbonate the beer.  Be _very careful_ here.  Too much priming sugar will lead to blown caps or exploding bottles.

The other option is to prime the beer and throw it in a keg, or just throw it in the keg without priming and hook it to a CO2 system to carbonate.

Now you let the beer condition.  It will mellow out and become the beer you want.  You can drink it after as little as about 2 weeks, but it generally gets better with time.  Some beers come into their own after only 2-4 weeks (I've had good ambers that were only 2 weeks in teh bottle), some take longer.  I've made a stout that was just undrinkable (and I can drink most any beer) for the first 8 weeks, but actually turned fantastic after about 5 months.  I've known people to condition barleywines for over a year.

In the next part we'll look at the equipment you'll need, and how much it's going to cost you to get into brewing.

 

6/8/2006 7:40:39 PM (Eastern Daylight Time, UTC-04:00)  #    Comments [1]  |