text:
What I'm about to propose is that all Haskell type class programming can (and should) be implemented purely at the value level using a simple and ordinary code transformation.
The trick is simple and I will begin by transforming the Monad type-class. Given any class:
class Monad m where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m bYou can delete the class and replace it with a corresponding data type:
{-# LANGUAGE Rank2Types #-} -- MonadI = Monad "I"nstance data MonadI m = MonadI { _return :: forall a . a -> m a, _bind :: forall a b . m a -> (a -> m b) -> m b }Then, given any instance for that class:
instance Monad Maybe where return = Just m >>= f = case m of Nothing -> Nothing Just x -> f x... delete that instance and replace it with a value of our data type containing the method definitions:
monad'Maybe :: MonadI Maybe monad'Maybe = MonadI { _return = Just, _bind = \m f -> case m of Nothing -> Nothing Just x -> f x }This value-level representation of a class instance has several important benefits.
No class constraints
Now class constraints transform into ordinary parameters:
-- Before sequence :: (Monad m) => [m a] -> m [a] -- After sequence' :: MonadI m -> [m a] -> m [a] sequence' i x = case x of [] -> return [] m:ms -> m >>= \x -> sequence' i ms >>= \xs -> return (x:xs) where return = _return i (>>=) = _bind i sequence' monad'Maybe [Just 3, Just 4] = Just [3, 4]This means that we can now skip type-level programming and implement everything within lambda calculus at the value level. Things that previously required elaborate extensions now only require ordinary Haskell functions.
No more extension hell
Let's say I wanted to implement an isomorphism type class using traditional type classes:
class Isomorphism a b where fw :: a -> b bw :: b -> aThe first problem is that I'd need to turn on MultiParamTypeClasses to write a class like this.
Now I try to write this instance:
instance Isomorphism ((), a) a where fw = snd bw = (,) ()Oops! Now I need FlexibleInstances for the () in the type. That extension's not as controversial, though.
But what if I then do this:
instance (Isomorphism a b, Isomorphism b c) => Isomorphism a c where fw = fw . fw bw = bw . bwThis is completely unresolvable, even using UndecidableInstances. GHC will just barf and terminate after several rounds of recursion.
On the other hand, had I written it like:
data Isomorphism a b = Isomorphism { fw :: a -> b, bw :: b -> a }... then I can trivially combine isomorphisms:
combine :: Isomorphism b c -> Isomorphism a b -> Isomorphism a c combine (Isomorphism fw1 bw1) (Isomorphism fw2 bw2) = Isomorphism (fw1 . fw2) (bw2 . bw1)
Haskell is better at value-level programming
The astute reader will notice that the last definition suggests a category. Let's go all the way and rewrite the Category class at the value level and use it:
data CategoryI cat = CategoryI { _compose :: forall a b c . cat b c -> cat a b -> cat a c, _id :: forall a . cat a a } category'Function :: CategoryI (->) category'Function = CategoryI { _compose = \f g x -> f (g x), _id = \x -> x } category'Isomorphism :: CategoryI Isomorphism category'Isomorphism = CategoryI { _compose = let (.) = _compose category'Function in \(Isomorphism fw1 bw1) (Isomorphism fw2 bw2) -> Isomorphism (fw1 . fw2) (bw1 . bw2), _id = let id = _id category'Function in Isomorphism id id }Now we can just combine isomorphisms using ordinary composition:
iso1 :: Isomorphism ((a, b), c) (a, (b, c)) iso1 = Isomorphism { _fw = \((a, b), c) = (a, (b, c)), _bw = \(a, (b, c)) = ((a, b), c) } iso2 :: Isomorphism ((), a) a _fw = \((), a) = a, _bw = \a -> ((), a) } (.) = _compose category'Function iso1 . iso2 :: Isomorphism (((), b), c) (b, c)... instead of attempting a bunch of type-class hackery that doesn't work. More importantly, we can now use our more featureful value-level programming tools to do what was incredibly difficult to do at the type level.
Class maintenance
One big issue in Haskell is maintaining class APIs. However, when we implement classes at the value level, this problem completely disappears.
For example, let's say that I realize in retrospect that my Monad class needed to be split into two classes, one named Pointed to hold return and one named Monad that has Pointed as a superclass. If people use my Monad class extensively, then I'd have to break all their Monad instances if I split it into two separate classes because now they would have to spin off all of their return implementations into separate instances for Pointed.
Now, had I implemented it as a data type, it wouldn't even matter. I'd just write:
data PointedI m = PointedI { _pure :: forall a . a -> m a } -- Pointed is a super-class of Monad pointed'Super'Monad :: MonadI m -> PointedI m pointed'Super'Monad i = PointedI (_return i}Similarly, I can translate:
class (Pointed m) => Monad m where ...... into:
monad'Pointed'Bind :: PointedI m -> (m a -> (a -> m b) -> m b) -> MonadI m monad'Pointed'Bind i b = MonadI (_pure i) bNow users can automatically derive Pointed instances from their old Monad instances, or they can choose to write a Pointed instance and then build a Monad instance on top of it.
Backwards compatibility
Similarly, let's say that I forgot to make Functor a superclass of Monad. What's incredibly painful for the Haskell community to solve at the type-level is utterly straightforward to fix after-the-fact at the value level:
data FunctorI f = FunctorI { _fmap :: forall a b . (a -> b) -> f a -> f b } functor'Monad :: MonadI m -> FunctorI m functor'Monad i = FunctorI { _fmap = \f x -> x >>= return . f } where (.) = _compose category'Function (>>=) = _bind i return = _return i
No more newtypes
Don't you hate having to wrap things using newtypes to get the correct class instance? Well, now that's unnecessary:
data MonoidI m = MonoidI { _mempty :: m, _mappend :: m -> m -> m } monoidSum :: MonoidI Int monoidSum = MonoidI { _mempty = 0, _mappend = (+) } monoidProduct :: MonoidI Int monoidProduct = MonoidI { _mempty = 1, _mappend = (*) } mconcat :: MonoidI a -> [a] -> a mconcat i = foldr (_mappend i) (_mempty i) sum = mconcat monoidSum product = mconcat monoidProductNow we're actually writing in a true functional style where sum and product are true functions of the instance, rather than fake functions of a class constraint using awkward newtypes.
Value-level programming is safer
Type classes are used most often for operator overloading. The dark side to this that your overloaded function will type-check on anything that is an instance of that class, including things you may not have intended it to type-check on.
For example, let's say I'm trying to write the following code using the ever-so-permissive Binary class:
main = encodeFile "test.dat" (2, 3)... but it's 3:00 in the morning and I make a mistake and instead type:
main = encodeFile "test.dat" (2, [3])This type-checks and silently fails! However, had I explicitly passed the instance I wished to use, this would have raised a compile-time error:
binPair :: BinaryI a -> BinaryI b -> BinaryI (a, b) binInt :: BinaryI Int -- Won't compile! main = encodeFile (binPair binInt binInt) "test.dat" (2, [3])You might say, "Well, I don't want to have to annotate the type I'm using. I want it done automatically." However, this is the exact same argument made for forgiving languages like Perl or PHP were people advocate that in ambiguous situations the language or library should attempt to silently guess what you intended to do in instead of complaining loudly. This is exactly the antithesis of a strongly typed language!
Also, in the above case you would have had to annotate it anyway, because Binary wouldn't have been able to infer the specific type of the numeric literals!
main = encodeFile "test.dat" (2 :: Int, 3, :: Int)Or what if I wanted to implement two different ways to encode a list, one which was the naive encoding and one which used more efficient arrays for certain types:
-- Naive version instance Binary a => Binary [a] where ... -- Efficient array version instance Binary [Int] where ...Oops! OverlappingInstances! I'd have to wrap one of them in a newtype, which take just as much effort to do as just passing the value instance:
binList :: BinaryI a -> BinaryI [a] binInt :: BinaryI Int main = encodeFile (binList binInt) "listInt.dat" [1..10]If I was really clever, I could even write implement both instances using the same binList function and then have it select whether to encode a list or array based on the sub-instance passed to it! That's not even possible using type-classes.
No type annotations
Here's another example of an incredibly awkward use of typeclasses:
class Storable a where ... sizeOf :: a -> IntAnybody who has ever had to use this knows how awkward it is when you don't have a value of type a to provide it, which is common. You have to do this:
sizeOf (undefined :: a)That's just horrible, especially when the solution with value-level instances is so simple in comparison:
data StorableI a = Storable { ... _sizeOf :: Int } storable'CInt = StorableI { ... _sizeOf = 4 }Now we'd just call:
_sizeOf storable'CInt... instead of using undefined as a hack.
In fact, with value-level instances, type annotations are never ever necessary. Instead of:
readInt :: String -> Int readInt = read... or:
read "4" :: Int... we'd just use:
read read'Int "4"In other words, the value-level instance is all the information the function needs, and it's guaranteed to be sound and catch incorrect instance errors at compile-time.
Powerful Approach
I wanted to demonstrate that this is a really industrial-strength replacement to type classes, so I took the mtl's StateT, ReaderT, and Identity and implemented them entirely in value-level instances. The code is provided in the Appendix of this post. This implementation allows you to straightforwardly translate:
test :: (MonadState a m, MonadReader a m) => m () test = ask >>= put... into
test :: MonadStateI a m -> MonadReaderI a m -> m () test = \is ir -> let (>>=) = _bind (_monad'Super'MonadState is) in (_ask ir) >>= (_put is)You can then instantiate test at the value level using any monad instances that implement the State and Reader capabilities and it generates the correct type and implementation:
example1 :: ReaderT a (StateT a Identity) () example1 = test (monadState'ReaderT $ monadState'StateT $ monad'Identity) (monadReader'ReaderT $ monad'StateT $ monad'Identity) example2 :: StateT a (ReaderT a Identity) () example2 = test (monadState'StateT $ monad'ReaderT $ monad'Identity) (monadReader'StateT $ monadReader'ReaderT $ monad'Identity) run1 = runIdentity $ runStateT (runReaderT example1 'A') 'B' run2 = runIdentity $ runReaderT (runStateT example2 'B') 'A' -- Both output ((), 'A')Despite the incredible verbosity, it achieves two amazing things:
- It's implemented with only a single extension: Rank2Types. No UndecidableInstances required.
- No type signatures or type annotations are necessary. You can delete every single type signature in the file, which is completely self-contained, and the compiler infers every single type correctly. Try it!
More tricks
This is just scratching the surface. This post doesn't even really cover all the things that are only possible with value-level instances like:
- Generate lenses for instances (example: Lens (Binary [Int]) (Binary Int))
- Instances parametrized by run-time values
- Infinite families of instances (i.e. Stream (MyClassI m))
Another feature about value-level instances is the conceptual simplicity and elegance. Before there is a type-class checker and a type-checker. Now there is just a type-checker. You don't really appreciate how great this is until you try it and start getting amazingly clear compiler errors. Programming without type-classes is very intuitive! Really, the hardest part about it is simply naming things!
Also, the fact that it's implementable purely using ordinary functional programming is a very big win. If anything, it would make the GHC compiler writer's jobs much easier by not requiring them to entertain any of the half-baked type-class extensions that people propose. This approach allows you to completely remove type-classes from the language. I'm just putting that out there.
On that note, that brings me to the last section, where I will frankly discuss all the huge problems with it. The four biggest problems are:
- No ecosystem for it. To make effective use of it, you'd need new versions of most Haskell libraries.
- No do syntactic sugar. This one hurts.
- Verbosity. Every instance has to be named and passed around.
- Inertia. Programmers used to overloading will be reluctant to start specifying the instance they want.
class Lens a b where get :: a -> b set :: b -> a -> aIt fails horrendously, for the exact same reason the Isomorphism class crashes and burns. When implemented as a data type, it works completely flawlessly at the expense of extra verbosity. So if you liked Lens, chances are you'll like value-level instances in general.
The second issue of syntactic sugar can be solved by something like RebindableSyntax and having do notation use whatever (>>=) is in scope. You would then specify which MonadI instance you use for each do block:
let (>>=) = _bind m in do ...... or you pass the MonadI instance as a parameter to the do block.
This is not ideal, unfortunately and ties into the third issue of verbosity. All I can say is that the only way you can understand that the verbosity is "worth it" is if you try it out and see how much more powerful and easier it is than type-class programming. Also, value-level instances admit the exact same tricks to clean up code as normal parameter passing. For example, you can use Reader (MonadI m) to avoid explicitly passing a monad instance around.
However, this still doesn't solve the problem of just coming up with names for the instances, which is uncomfortable until you get used to it and come up with a systematic nomenclature. This is a case where a more powerful name-spacing system would really help.
The last problem is the most insidious one, in my opinion, which is that we as Haskell programmers have been conditioned to believe that it is correct and normal to have operators change behavior silently when passed different arguments, which completely subverts type-safety. I'm going to conclude by saying that this is absolutely wrong and that the most important reason that you should adopt value-level instances is precisely because they are the type-safe approach to ad-hoc polymorphism.
The following code implements StateT, ReaderT, Identity, MonadState, and MonadReader from the mtl, along with some example functions. The code is completely self-contained and can be loaded directly into ghci. Every function is annotated with a comment showing how the mtl implements the exact same class or instance so you have plenty of examples for how you would translate the type-class approach into the value-level instance approach.
{-# LANGUAGE Rank2Types #-} newtype StateT s m a = StateT { runStateT :: s -> m (a, s) } newtype ReaderT r m a = ReaderT { runReaderT :: r -> m a } newtype Identity a = Identity { runIdentity :: a } {- class Monad m where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b -} data MonadI m = MonadI { _return :: forall a . a -> m a, _bind :: forall a b . m a -> (a -> m b) -> m b } {- class MonadTrans t where lift :: Monad m => m a -> t m a -} data MonadTransI t = MonadTransI { _lift :: forall a m . MonadI m -> m a -> t m a } {- class Monad m => MonadState s m | m -> s where get :: m s put :: s -> m () state :: (s -> (a, s)) -> m a -} data MonadStateI s m = MonadStateI { -- This next line is the secret sauce _monad'Super'MonadState :: MonadI m, _put :: s -> m (), _get :: m s, _state :: forall a . (s -> (a, s)) -> m a } {- class Monad m => Monadreader r m | m -> r where ask :: m r local :: (r -> r) -> m a -> m a reader :: (r -> a) -> m a -} data MonadReaderI r m = MonadReaderI { _monad'Super'MonadReader :: MonadI m, _ask :: m r, _local :: forall a . (r -> r) -> m a -> m a, _reader :: forall a . (r -> a) -> m a } {- get :: (Monad m) => StateT s m s get = StateT $ \s -> return (s, s) -} get :: MonadI m -> StateT s m s get i = StateT $ \s -> (_return i) (s, s) {- put :: (Monad m) => s -> StateT s m () put s = StateT $ \_ -> return ((), s) -} put :: MonadI m -> s -> StateT s m () put i s = StateT $ \_ -> (_return i) ((), s) {- state :: (Monad m) => (s -> (a, s)) -> StateT s m a state f = StateT (return . f) -} state :: MonadI m -> (s -> (a, s)) -> StateT s m a state i f = StateT ((_return i) . f) {- ask :: (Monad m) => ReaderT r m r ask = ReaderT return -} ask :: MonadI m -> ReaderT r m r ask i = ReaderT (_return i) {- local :: (Monad m) => (r -> r) -> ReaderT r m a -> ReaderT r m a local f m = ReaderT $ runReaderT m . f -} local :: MonadI m -> (r -> r) -> ReaderT r m a -> ReaderT r m a local _ f m = ReaderT $ runReaderT m . f {- reader :: (Monad m) => (r -> a) -> ReaderT r m a reader f = ReaderT (return . f) -} reader :: MonadI m -> (r -> a) -> ReaderT r m a reader i f = ReaderT ((_return i) . f) {- instance Monad (Identity) where return = Identity m >>= k = k $ runIdentity m -} monad'Identity :: MonadI Identity monad'Identity = MonadI { _return = Identity, _bind = \m k -> k $ runIdentity m } {- instance (Monad m) => Monad (StateT s m) where return a = state $ \s -> (a, s) m >>= k = StateT $ \s -> do (a, s') <- runStateT m s runStateT (k a) s' -} monad'StateT :: MonadI m -> MonadI (StateT s m) monad'StateT i = let (>>=) = _bind i in MonadI { _return = \a -> state i $ \s -> (a, s), _bind = \m k -> StateT $ \s -> runStateT m s >>= \(a, s') -> runStateT (k a) s' } {- instance (Monad m) => Monad (ReaderT s m) where return = lift . return m >>= k = ReaderT $ \r -> do a <- runReaderT m r runReaderT (k a) r -} monad'ReaderT :: MonadI m -> MonadI (ReaderT s m ) monad'ReaderT i = let return = _return i (>>=) = _bind i lift = _lift monadTrans'ReaderT i in MonadI { _return = lift . (_return i), _bind = \m k -> ReaderT $ \r -> runReaderT m r >>= \a -> runReaderT (k a) r } {- instance MonadTrans StateT where lift m = StateT $ \s -> do a <- m return (a, s) -} monadTrans'StateT :: MonadTransI (StateT s) monadTrans'StateT = MonadTransI { _lift = \i m -> let return = _return i (>>=) = _bind i in StateT $ \s -> m >>= \a -> return (a, s) } {- instance MonadTrans ReaderT where lift m = ReaderT (const m) -} monadTrans'ReaderT :: MonadTransI (ReaderT r) monadTrans'ReaderT = MonadTransI { _lift = \_ m -> ReaderT (const m) } {- instance (Monad m) => MonadState s (StateT s m) where get = get -- from Control.Monad.Trans.State put = put state = state -} monadState'StateT :: MonadI m -> MonadStateI s (StateT s m) monadState'StateT i = MonadStateI { _monad'Super'MonadState = monad'StateT i, _get = get i, _put = put i, _state = state i } {- instance (MonadState s m) => MonadState s (ReaderT r m) where get = lift get put = lift . put state = lift . state -} monadState'ReaderT :: MonadStateI s m -> MonadStateI s (ReaderT r m) monadState'ReaderT i = let monad'm = _monad'Super'MonadState i lift = _lift monadTrans'ReaderT monad'm in MonadStateI { _monad'Super'MonadState = monad'ReaderT monad'm, _get = lift $ _get i, _put = lift . _put i, _state = lift . _state i } {- instance Monad m => MonadReader r (ReaderT r m) where ask = ask local = local reader = reader -} monadReader'ReaderT :: MonadI m -> MonadReaderI r (ReaderT r m ) monadReader'ReaderT i = MonadReaderI { _monad'Super'MonadReader = monad'ReaderT i, _ask = ask i, _local = local i, _reader = reader i } {- instance (MonadReader r m) => MonadReader r (StateT s m) where ask = lift ask local = \f m -> StateT $ local f . runStateT m reader = lift . reader -} monadReader'StateT :: MonadReaderI r m -> MonadReaderI r (StateT s m) monadReader'StateT i = let monad'm = _monad'Super'MonadReader i lift = _lift monadTrans'StateT monad'm in MonadReaderI { _monad'Super'MonadReader = monad'StateT monad'm, _ask = lift $ _ask i, _local = \f m -> StateT $ (_local i f) . runStateT m, _reader = lift . (_reader i) } {- test :: (MonadState a m, MonadReader a m) => m () test = ask >>= put -} test :: MonadStateI a m -> MonadReaderI a m -> m () test = \is ir -> let (>>=) = _bind (_monad'Super'MonadState is) in (_ask ir) >>= (_put is) example1 :: ReaderT a (StateT a Identity) () example1 = test (monadState'ReaderT $ monadState'StateT $ monad'Identity) (monadReader'ReaderT $ monad'StateT $ monad'Identity) example2 :: StateT a (ReaderT a Identity) () example2 = test (monadState'StateT $ monad'ReaderT $ monad'Identity) (monadReader'StateT $ monadReader'ReaderT $ monad'Identity) run1, run2 :: ((), Char) run1 = runIdentity $ runStateT (runReaderT example1 'A') 'B' run2 = runIdentity $ runReaderT (runStateT example2 'B') 'A'


text:
With great hardware comes great opportunity. Thanks to the internet and clever hacking communities, there are plenty of ways to boost the capabilities of your everyday gadgets. Some save you money, some add features, and some are the entire package. Here are our top 10 favorite hardware boosting hacks.
Note: Pretty much every one of these hacks involves installing custom firmware or at least making significant alterations to the software your hardware needs to run. We're all about pushing forward anyhow, but you should know before diving in that you'll 1) probably void your warranty, and 2) run the risk of bricking your device. Proceed with caution, or at least with the knowledge that things may not always work out perfectly.
10. Turn a Nook Simple Touch into a Full-Fledged Tablet
The Nook Simple Touch is a great, cheap ($99, or even much less used) ereader all on its own, but you can turn it into a fully fledged Android tablet without too much effort. While an E Ink display isn't necessarily ideal for a tablet that you'd want to be very responsive, it gives you the opportunity to use the device however you want. For example, you can install non-Barnes and Noble ebook readers like Amazon's Kindle and Moon+. You can add the Dropbox app to access remote files. You'll be able to view web pages with whatever browser you like. You're probably not going to be playing games on the device, but you will be able to do a whole lot more with one simple hardware boosting hack.
9. Turn a Pogoplug into a Fully-Featured Linux Web Server
The Pogoplug isn't an incredibly popular device, but rather one of the cheapest routes to putting together a fully-featured Linux web server. Although you'll have to bring your own hard drive (or even a flash drive), you can buy one for only about $50 and have everything you'll need. If you need a home web server for testing purposes or just want to run a small web site, the hardware can handle it. It'll take an afternoon to get it configured, but when you're done you'll have a low-power web server in a tiny package.
8. Install the Canon Hack Development Kit (CHDK) on Your Canon Point and Shoot Camera
CHDK is custom firmware for your Canon point and shoot camera that unlocks several features. Wish you can shoot in RAW? CHDK can make that happen. Annoyed that you can't override shutter speed, aperture, and ISO settings in various modes? CHDK can fix that. There's a lot more it can do, too, and is worth installing if you've got a supported camera. From there, just follow our guide to get started using a great collection of new features for the camera you already own.
7. Hack Your Wii for Homebrew
One of the significant benefits of Nintendo's Wii platform is that it is significantly more hackable than the competition. With a very quick and simple process, you can start installing homebrew games or even play backed up games from an external hard drive. It only takes about five minutes to go through the hacking process and then you'll be well on your way to adding lots of great additional functionality to your console.
6. Install a Custom Android ROM
While the speed and responsiveness of Android 4.1 Jellybean may solve one of the biggest complaints about the mobile operating system, a custom ROM can make a difference right now. Alternatively, many ROMs add lacking features in the version of Android available for your device. Whatever you're looking to accomplish, there's often a ROM for the job. Not sure which one to pick? We can help you out with that.
5. Install Magic Lantern on Your Video-Capable DSLR
Digital SLR cameras are not only inexpensive these days for taking beautiful still photos, but now they record incredible video as well. They're so capable that some higher-end models are even being used for television and film productions. Even so, they aren't video cameras and are lacking many of the features you'd want out of a professional video camera. That's where the custom firmware hack Magic Lantern comes in. It can transform your digital SLR into a professional video camera, offering features like zebra patterns, comprehensive auto controls, and mechanical rack focusing. What's also great is that it doesn't really modify your firmware. Instead, you just load it up when you need it and leave it alone when you don't. It's one of the safest firmware hacks around, and adds plenty of great features. If you're planning to use your DSLR to shoot great video, you'll definitely want to take a look at Magic Lantern.
4. Build a Hackintosh
Building a hackintosh is almost more of a software boosting hack because you're not really boosting the hardware by choosing to install OS X—it's the operating system you want to use, not necessarily a better one. But if you compare Apple's desktop hardware to the hardware you can build yourself, you'll find that you can get significantly better performance out of a hackintosh for less than half the cost. If you want a Mac desktop, it's one of the best routes you can take. The hackintosh process is so simple now that once you get the hang of it, it isn't much more work than just installing OS X on a regular Mac. Building a computer takes a little more know-how, but it's not that hard and we have a five-part guide to help you through the process. If you want a super-fast Mac, there's really no better way to go than a hackintosh.
3. Root Your Android Device
Android's an open, capable operating system all by itself, but by default it doesn't allow apps to assume root access—that is, take full control—of your phone or tablet. That imposes a few limitations and those are easily removed through the process of rooting your device. In many cases it's very simple, and doesn't require much more than plugging in your Android and pressing a button. Some devices require quite a bit more work, and others just need you to apply a firmware patch (which is scarier than it is difficult). Rooting will let you do great things like control your device with a PS3 controller, set up an awesome automated backup process, block ads, encrypt your internet traffic, and automate practically anything. You may not need to root for a lot of reasons, but there's almost always one killer hack that makes it an essential process.
2. Jailbreak Your iPhone
In the past jailbreaking was almost a necessity to get the functionality you wanted out of your iPhone, but with a rapidly maturing operating system with most of the features people want it's not as much of a concern as it used to be. That said, you don't want to discount the jailbreaking process. The awesome things you can do may not be obvious anymore, but they're still awesome. The jailbreaking process is easier than ever and the community of developers and users is wonderfully large. The primary reason to jailbreak nowadays is that if you have a problem, in a day or two someone will have developed a solution. Take Sparrow for example. It's a phenomenal mail client for the iPhone, but because of Apple's restrictions it can't safely offer push notifications for new messages. This bothered some people, in within a day Sparrow Push was developed to provide that functionality. On top of that there are plenty of great apps and notification center tweaks that are a good place to start if you're new to jailbreaking. It may not be the necessity it once was, but it's now awesome for several new reasons.
1. Boost Your Router with DD-WRT or Tomato
Out of the box, the firmware on most routers isn't great. It lacks features, doesn't work properly, or is just a pain to use. Two custom firmware upgrades are available to solve some or all of those problems: DD-WRT and Tomato. DD-WRT is geared at providing you with a level of control you'd expect from a professional-grade router. Tomato was designed to make your router much more user-friendly so you don't have to be an expert to use it. Tomato also provides a number of important features missing from some router firmware, too. However you slice it, these upgrades can make your life easier, help you boost a crappy Wi-Fi signal, configure a more functional network setup, and a whole lot more. It's not the flashiest of hardware boosting hacks, but it is one of the best. Your network will thank you for it.

subset: commoncrawl


text:
in the Ergo, on our way to the Watermelon Festival! |
Myles in his Moby, at around 3 weeks old |
My babywearing journey began with a Moby (which I was kind of in love with). I also had an Infantino carrier than was similar to an Ergo, which was OK, but not my favorite. And that was it. But once my son outgrew the Moby, I found the other carrier to be kind of a pain to get him in and out of for quick trips into the store and things. So, I got a sling....not a ring sling, but one that I had to measure myself and order the correct size. I loved it. It was so easy and quick to use!! I had seen many of my friends with their newborns in beautiful ring slings, but didn't really understand how they worked.... the rings, adjusting them, etc. So I never tried them.
I found Snuggy Baby on etsy and was drawn in by the beautiful prints they had for their wraps and slings. And then I found out that it was a WAHM business, and I liked them even more. Snuggy Baby was started by a mom with two young children. She loved the look of ring slings, but couldn't find a place to buy them. So, she decided to make her own. It took a while to develop a fashionable, comfortable sling, but, in my opinion, she's done exactly that!!
Although I was excited when Snuggy Baby sent me one of their ring slings, I wasn't sure how I was going to like it--would it really be more convenient than the sling I already had? How do you adjust it? Isn't it a pain having to adjust the sling every time I put my son in it? And then I got it. First of all, it's beautiful. They sent me their Rainbow Chevron print (I had a really hard time deciding....soooo many beautiful prints!!) and it's absolutely gorgeous!! The colors are so vibrant and fun!
seriously....gorgeous and fun!! |
So, on to how it works. This sling is really great. The fabric is quite thick and sturdy; I had no worries about it sagging or anything with my 27 lb. toddler. And he loves it. He's really comfortable in it. In fact, when I first got it, he kept asking for me to take him for a "ride" in it, all over the house.
The quality of this sling is absolutely amazing. The stitching is perfect, the fabric is lovely (and really, the prints Snuggy Baby has are amazing!! Be sure to check them out online), the rings are so strong....everything about this sling screams quality.
The rings themselves are nice and solid. They don't have any seams/welds, so I don't have to worry that they might bend or break.
shoulder padding; nice, strong rings |
The length of the fabric is also great--long enough that it will fit many sizes of women, but not too long that it gets in the way. I also feel like this would be great for breastfeeding, either with the baby in the sling or out of it--you could use the sling tail as a cover for while you're out and about. It's multi-functional!
at the baseball game! I think the rings should be a little higher, but Myles was comfy! |
Snuggy Baby also makes some other carriers y'all should check out! They have some beautiful, knit wraps that are similar to something like the Moby, but not as stretchy, so you can use it longer without it sagging from the weight of a heavier child. They also make Mei Teis. The other thing that I really love, is they make child's doll slings!! They're absolutely adorable, and how fun for a little one to get to have their own sling to wear their dolls or stuffed animals in!! I'm thinking about getting one for my son and all his stuffed animals!
The other thing they make is wet bags. Now, I didn't get a chance to try one out, but based on the quality of this ring sling, I'm going to assume that the wet bags are great. The prints they have are just so cute! And they have sooo many to choose from--various sizes, prints, etc. Next time we're on the market for a new wet bag, I'm definitely going to check here first!
And lucky for all of you, Snuggy Baby has offered a giveaway of a $75 e-gift-certificate to one of our readers! So you'll get to choose what product you want to try--wrap, ring sling, doll carrier, etc. Be sure to enter below!!
Snuggy Baby has also offered a 10% off coupon code for their website, until Sept. 23rd: use code ADDICTION at checkout.


text:
Splendid started with the quest for the ideal T-shirt. To this day, we still see the classic tee as a timeless staple of women's clothing, one that's versatile enough to offer limitless options for styling and accessorizing. That's why we craft our tees with fine materials, impeccable construction, and stylish designs that give the casual classic a little something extra.
We focus on creating comfortable, fashion-forward clothing that helps women to look and feel their best. Today, you can find Splendid tops in a variety of designs intended to inspire and uplift powerful, confident women. Explore our full selection of quality tees and women's top, including short sleeve casual shirts for women, tanks, camis, and long sleeve shirts and button-downs in luxe colors, textures and patterns.
Sweaters & Cardigans
When we create a sweater, we choose premium materials like soft ribbed knit so they feel soft and gentle on your skin but can still last year after year. Just like our sweaters and tees, our cardigans for women incorporate fine materials, a flattering fit, and designer quality.
With our commitment to fit, our cardigans and sweaters for women are roomy enough for comfort without swallowing you whole, whether they're layered over your favorite tee or gently tied around your waist or shoulders. Shop Splendid cardigans and other top layers for warmth and comfort that looks great, too.
Well-Made Shirts for Women
Finding the perfect shirt can be challenging, especially when you have a well-curated look and established aesthetic tastes. With roots stemming from the elevated basic white tee, we offer modern tops for women that provide endless versatility and effortless style for all of life's adventures.
With Splendid tops, you get apparel that inspires and supports your life. Refresh your style with our full selection of casual tops for women, along with our essential women's basics and the latest seasonal looks from our women's new arrivals.


text:
Gun-control advocates in the U.S. are hoping 2012 marks a turning point in the country's struggle with gun violence. The massacre at Sandy Hook Elementary — where most of the 26 victims were killed with an assault rifle similar to the M-16 rifle issued to U.S. soldiers — might spur Washington lawmakers into action following a year of grisly, tragic mass shootings. There are now calls to reinstate a federal ban on assault weapons; the weeks ahead may see a heated debate over the long-enshrined place of guns in American society.
In other words, 2012 may be the watershed moment 1996 was for two countries that have shared histories and bonds with the United States. Separate mass shootings 16 years ago in the U.K. and Australia prompted soul-searching, anger and a rapid political response in both London and Canberra. Anti-gun legislation passed then, say many experts, has had a lasting, positive impact in both countries.
(MORE: Outside the White House, Gun-Control Activists Make a Subdued Call to Action)
In an attack not dissimilar to what took place at Sandy Hook, a shooter burst into a gymnasium of a school in the Scottish town of Dunblane on March 13, 1996, and turned his four handguns on a group of unsuspecting 5- and 6-year-olds assembled there. Sixteen children and one teacher were killed; the gunman, a deranged unemployed shopkeeper, then turned his weapon on himself. Among the dazed pupils forced to take cover during the assault was British tennis champ Andy Murray, then 8 years old. The outcry in the U.K. was immense. "We must take this as a warning that we are becoming like America and act before it is too late," said one governing Conservative Party legislator, quoted by TIME.
What followed was a drastic overhaul of existing British gun laws by the sitting Tory government. The Christian Science Monitor sums up the changes:
a ban on handguns and automatic weapons, as well as an onerous system of ownership rules involving hours of paperwork, criminal reference checks, and mandatory references designed to reduce as far as possible the likelihood of guns falling in the wrong hands.
Despite a surge in gun-related offenses in the early 2000s, the past seven years in the U.K. have seen successive drops in gun crimes — a consequence, some argue, of the country's tougher laws on gun ownership. Of course, such measures aren't enough to wholly prevent mass killings. In 2010, a taxi driver with a shotgun and a rifle cruised around the idyllic Lake District of Cumbria, northern England, killing a dozen people in a shooting spree that shocked the country. The shooter had no history of mental problems and his guns were legally owned and licensed.
On the other side of the world, just a month after the 1996 Dunblane attack, a shooter in the town of Port Arthur, Tasmania, went on a rampage, killing 35 people in what is the worst single episode of such slaughter in Australian history. The then months-old old government of conservative Prime Minister John Howard — who would go on to rule for over a decade — initiated a sweeping set of reforms, even in the face of opposition from allies in Australia's right wing. The new measures banned the sale and possession of all automatic and semiautomatic rifles and shotguns. Moreover, the government instituted a mandatory buyback scheme that compensated owners of newly illegal weapons. Between 1996 and '98, some 700,000 guns were retrieved by the government and destroyed. The results have been tangible: A widely cited 2010 study in the American Journal of Law & Economics showed that gun-related homicides in Australia dropped 59% between 1995 and 2006. The firearm-suicide rate dropped 65%. There has been no mass shooting in Australia since the Port Arthur attack.
(MORE: Viewpoint: If We Want Gun Control, We'll Need to Compromise)
Americans often argue that their country's unique political culture and ubiquity of gun ownership make similar anti-gun measures unthinkable. The 700,000 firearms Howard's government retrieved from its citizenry was a fifth of the total possessed by Australians at the time — in the U.S., that equivalent figure would mean confiscating some 40 million to 50 million guns.
Yet while the scale is vastly different, the politics ought not be. Like the U.S., Australia is a frontier society built on a rugged, pioneering individualism. It has its own mythic Wild West gunmen. The rhetoric of freedom and liberty is as often voiced by an Australian politico as it is by an American one. And Howard, a close friend of President George W. Bush and a cheerleader of the much maligned invasion of Iraq, was no socialist peacenik.
But, in the wake of the mass shooting in Aurora, Colo., earlier this year, Howard, a staunch conservative, voiced a criticism seemingly still too subversive for Washington. Writing in the Age, he took issue with the American devotion to the Second Amendment:
The Second Amendment, crafted in the immediate post-revolutionary years, is more than 200 years old and was designed to protect the right of local communities to raise and maintain militia for use against external threats (including the newly formed national government!). It bears no relationship at all to the circumstances of everyday life in America today. Yet there is a near religious fervour about protecting the right of Americans to have their guns — and plenty of them.
It remains to be seen what lasting change emerges out of the tears and heartbreak in Newtown, Conn., but at the very least the tragedy ought prompt a real conversation — as it did in these two other Anglophone nations — about how much carnage a society is willing to take.
MORE: In the Shadow of Sandy Hook, a Powerful Pro-Gun Organization Keeps Silent


text:
In a city as old as Alexandria, there is inherent tension between preserving the historic and embracing the contemporary. There was a time in our city when historic treasures were bulldozed in the name of progress, with little or no thought to what was lost. But then the notion of preservation took hold, and we embraced – and protected – our neighborhoods.
And as often happens, once preservation became a priority, the pendulum swung too far. Alexandria gained a reputation for being rigidly protective of all things old, even at the expense of homeowners' property rights.
That's why the city's responsiveness to homeowner concerns in the Parker-Gray Historic District is so encouraging. Last year, relations between the board of architectural review and Parker-Gray residents reached their nadir when Bradley King received a $250 fine for tearing down a rusty, old chain-link fence. Alexandria became the target of ridicule when the BAR issued a nine-page report extolling the important historic nature of the demolished eyesore.
To their credit, city officials responded to resident outrage by forming an ad hoc committee consisting of BAR members and Parker-Gray activists to review the district's regulations with an eye to recommending changes. The committee's proposals are a welcome move toward common sense. Among the proposed changes for Parker-Gray:
• Rather than requiring a formal BAR hearing, board staff can approve all fences.
• No BAR review for new or replacement light fixtures.
• No BAR review for nonstreet facing doors.
• No BAR review for nonstreet facing chimneys and flues, with staff review only for street-facing ones.
The majority of recommended changes reverse design guidelines and BAR policies adopted in 2010 and 2011. Thus, the proposed tweaking is not changing what has been protected for decades, but only loosening what was recently made too restrictive. They would primarily exempt projects in back and side yards from BAR review. The workgroup will continue meeting in advance of the BAR meeting October 24, when the recommendations are slated for review and possible adoption.
The concept of a work group created to review BAR policies is not just a good idea for Parker-Gray right now. It also is a good idea for all parts of the city. The Old and Historic Alexandria District would certainly benefit from such a work group convening every few years.
The world we live in is changing rapidly, which makes preserving our history all the more important. But the reality is that new technologies are transforming the way we live. A periodic review of architectural policies in all parts of the city is the only way to fairly balance the past with the present.


text:
Everyone always wonder when should replace the worn car tires for 1999 Porsche 911 GT1. For 1999 Porsche 911 GT1, the performance of its tires is critical to the efficiency, performance and safety of it. The NHTSA estimates that annually around 400 fatalities might have been attributed to the tire failures. Throughout tires' lives, they are designed to provide the similar performance. But at some points that they begin with losing the performance in the terms of tires' traction and braking capability. There are some useful tips in this article that could help you decide when you should replace and when to start shopping for the new set of your car's tires and keep spending much more money than you need for 1999 Porsche 911 GT1.
You need to understand firstly that primary function of the tread on the tire is to divert water from under the tire to avoid hydroplaning and improve the traction on the wet roads. When tires are worn, they become unsafe and tires are no longer safe only if tread is down to 1.6mm.
Check the tread pattern. In the US and other countries, most tires sold have what be called "tread wear bars" They are some small bridges which form between the treads. And when you look over the trad patten, you can see running across tires for 1999 Porsche 911 GT1 or the startings of those bars begin to form between treads. With car's tires wear, those bars become flush with tire's tread right now. Regarding this one, it is time to replace your tires for 1999 Porsche 911 GT1.
Using a "penny test", you can check the tread. You need to prepare a penny and place it with the obcerse of the penny and face you in the center of the tread. If you see the really top of the obcerse of the penny or copper above it, you should replace car's tires instantly.
Use the tread depth gauge or indicator. It is not everyone could get hold of the obcerse. You can also use other resorts to test it or the special tread depth gauge or indicator tool to test the tire's tread. The gauge is not expensive to buy from the auto parts dealer and it is not difficult to use if you do not already have one.
Understand the legal requirements. The worn tires need to be replaced as a general sense to keep the safety. However, in some jurisdictions, legal requirements replace the worn tires. In most US states, when the tires have worn down to 1.6mm, they will be considered to be worn out legally.
Make a note of any anomaly tread wear. It could indicate a misalignment for the wheel. The uneven tread wear is the strong sign which you should to take in for servicing for 1999 Porsche 911 GT1.
Every 6 years, you should replace tires for 1999 Porsche 911 GT1 at least. This minimum replacement time which is recommended by NHTSA, if you cannot make sure when to replace the tires for 1999 Porsche 911 GT1. Or checking the owner's manual is necessary to help you know when to replace tires.


text:
Me: (Silent surely with mouth hanging open.)
Her: Oh, and enjoy extended restriction.
Although, now as a parent, I think excellent retort, Mom! How impressive. Proof that parents can stay one step ahead.
Do not lie to your parents or they will tell a cute boy you met you are only 13 (how did she pick this age? Because at 14, this is how old I looked. And I certainly did not look 17 which was the age I had an accidental habit of telling boys.) But shame on that boy in the first place because he couldn't keep the names straight. Word to boys: Don't ask a girl's Mommy to help you sort it out. I would have told him myself but Chris never called me back.


text:
Promotional Magnetic Calendars offer advertisers like you 365 chances to have your business name or personalized message STICK in your customers' minds. Art Promos selection of over 45 Promotional Sticky & Magnetic Calendars get stuck in all kinds of high-traffic locations like the wall, the kitchen refrigerator, filing cabinets and dozens of other visible places. Every glance at one of our Promotional Magnetic Calendars is an advertising opportunity for your company.
Here are just a few reasons why Promotional Magnetic and Sticky Calendars make some of the world's best advertising tools:
Combine the best of two promotional items, magnets and calendars, for an advertising product that is extremely practical as well as cost-effective, especially considering how many times your message will be viewed throughout the year. Art Promos' Promotional Magnetic Calendars start at less than 50 cents each including the cost of printing.


text:
Samsung Announces Windows 8 Phone, PC and Tablet
Samsung announced a new line of Windows 8-based devices under the ATIV brand Wednesday, including the first publicly-revealed Windows Phone 8 smartphone. The company said the lineup will include the Samsung ATIV Smart PC and ATIV Smart PC Pro, an ATIV tablet and ATIV S smartphone.
Samsung Electronics Co., Ltd., announced a new line of Windows 8-based devices under the ATIV brand Wednesday, including the first publicly-revealed Windows Phone 8 smartphone. The company said the lineup will include an 11.6-inch Samsung ATIV Smart PC and ATIV Smart PC Pro, a 10.1-inch ATIV tablet and ATIV S smartphone weighing 8.7mm, and a 4.8-inch HD Super AMOLED display.
The announcements were made during a webcast at the IFA trade show in Berlin, where the Samsung Galaxy Note II was also unveiled. ATIV is the reverse order of VITA, which means life in Latin, Samsung said.
"With our leadership in design and technology and Microsoft's leadership in operating systems, together we are able to provide customers with a full range of ATIV devices for cross-category convergence," said Seong Woo Nam, executive vice president of IT Solutions Business at Samsung Electronics, in a statement.
The Intel-based ATIV Smart PC and ATIV Smart PC Pro will feature a detachable keyboard docking system, giving users the ability to switch between a clamshell notebook PC and a tablet PC form factor. Both will also come with a 10-finger multi-touch screen, giving users the ability to do pinch-to-zoom, rotate images and scroll through pages, Samsung said. The devices will also be equipped with front and rear-facing cameras, an S Pen for writing and drawing capabilities and an S Player for playback of images and videos in any format. Both will have an 11.6-inch Full HD LCD display. The ATIV Smart PC is 9.9mm thick and has a battery life of up to 13.5 hours. The Smart PC Pro weighs 11.9mm and has a battery life of up to eight hours.
The ATIV Tab is equipped with an 8,200 mAh battery, a 1.5GHz dual-core processor and HSPA+42 connectivity.
The ATIV S has a 1.5Ghz dual-core processor, 1GB of onboard RAM, and an 8MP autofocus rear camera and 1.9MP front-facing camera. It will be available with either 16GB or 32GB of storage, a MicroSD slot and a 2300mAh battery.
Samsung did not reveal pricing information or a release date for the devices, but some rumors suggest T-Mobile may get the initial release due to the HSPA+ support and lack of LTE connectivity.
News of more Windows Phone 8 devices is expected next week when Microsoft and Nokia will hold an event in New York where the Finnish phone maker is expected to unveil its first Lumia phones based on the OS.
"This is just the first in a big lineup of new hardware that's coming with Windows Phone 8, but it's a seriously impressive opening salvo," blogged Ben Rudolph on the Windows Phone website.
About the Author(s)
You May Also Like
The CIOs Guide to Enhancing GRC in 2024
June 20, 2024Enhance Cloud Security with Cloud-Native Security
June 25, 2024Search Capabilities with PostgreSQL: From Standard to Semantic
June 27, 2024


text:
We're going to hear now about some surprising consequences of the weak housing market in this country. It turns out that the value - even on a paper - of a home can affect the college choices that a family makes.
NPR science correspondent Shankar Vedantam regularly joins us to discuss social science research. He's here this morning to talk about those new findings. And good morning.
SHANKAR VEDANTAM, BYLINE: Hi, Renee.
MONTAGNE: This new research, describe it for us.
VEDANTAM: Well, we've known for a long time, Renee, that a bad economy affects all kinds of things. So when young people graduate from college and they enter a weak economy, it affects their wages over the course of their entire lifetimes.
Now, this one economist I spoke with - his name is Michael Lovenheim; he's at Cornell University. He decided to look at one, specific part of the economy: the housing market. And he finds that the effects of the housing market influence where students are going to college. Here he is.
MICHAEL LOVENHEIM: What we see is that students who obtain more housing wealth when they were in high school were more likely to go to flagship schools; were less likely to go to community colleges; were more likely to graduate. These educational outcomes, and the earnings that you get from going to higher-quality schools, have effects on people's lives.
MONTAGNE: Now, how much are students affected by housing prices? I mean, is it just a little bit, or is it significant?
VEDANTAM: Well, Lovenheim told me it's actually quite a bit, and this is especially true for families that are making less than $75,000 a year. And so when you look at the typical increase, and the decrease, in housing values for those kinds of families across the United States, it seems to affect the college choice by as much as 25 to 30 percent. So in other words, in a bad housing market, students might be 30 percent less likely to go to the flagship schools, rather than a community college.
MONTAGNE: Why would that be? Because if a family is living in a home and not needing to sell it, why would the lower value of a house have such a large effect on where their children might go to college?
VEDANTAM: So, I think there are multiple possible explanations for that, Renee. The first is the rational, straightforward explanation - which is that families are borrowing against the value of their homes in order to send their kids to college. And so in a weak housing market, they have less equity in the house, and they may even have less liquidity that can come out of the house. And so it limits their choices in where kids can go to college.
But there's another factor, and the other factor is probably psychological. What Lovenheim thinks is happening, is that many students are internalizing how poor their parents feel in a bad housing market, and this is limiting their choices about where to go, because it's not the case that students are applying to the flagship schools, getting in, and then finding out that they can't get financial aid, or they can't afford it. They're simply not applying to those schools at all.
MONTAGNE: Does this not apply so much to the 1 percent - or at least, the higher-income families?
VEDANTAM: Well, I certainly think that people who are wealthy are probably insulated from this quite a bit. It also turns out that there is a legislative reason that we find ourselves in the boat that we do. Back in 1992, Congress passed a law which said the value of your home can't be taken into account when you're applying for financial aid in college. And this was wonderful during the boom years, because the value of your home could go up, and you could still qualify for financial aid in college. But now, during a recession when housing values have dropped, it turns out you can't go to a school and say look, the value of my home has dropped by 25 percent. Could you please give me some financial aid?
MONTAGNE: But what about the idea that, you know, if you can overcome the psychological barrier, the feeling of being poor, that applying to a college is the same as it had been before the housing crash?
VEDANTAM: I think this is actually what Lovenheim is saying, Renee. He is saying that students should still apply to the flagship schools and see if they can qualify for financial aid, see if they can take out a loan. I mean, he's an economist. Part of the point that he's making is that the benefits of college, and the benefits of a good college, play out in your life over a matter of decades. And being 10,000 or $20,000 extra in debt in a student loan, you know, is more than compensated for in the long-term returns of college.
MONTAGNE: That's Shankar Vedantam, who joins us to talk about interesting social science research, on a regular basis. You can find him on Twitter: @HiddenBrain. And while you're at, you can follow this program: @MORNINGEDITION. Transcript provided by NPR, Copyright NPR.


text:
First, a confession. I don't watch the Super Bowl. As a matter of fact, I rarely even know who is playing. Still, I'm well aware that it is far and away America's largest secular holiday and that the celebration requires not only watching the game on television, but also eating a hefty snack or meal while doing so.
Naturally, such a manly event calls for manly cuisine, dishes designed to be eaten by hand and that will stick to the ribs. The key food groups are meat and melted cheese, preferably deep-fried.
Buffalo-style chicken wings and chicken nuggets are just the sort of thing deep-fried deliciousness we're talking about. And my recipe marries the two and, incredibly, does so in a way that simultaneously satisfies the soul and keeps the blood whistling through the old arteries.
There are three reasons we all love fried food. First, the food is moist and juicy. Second, the crust is crispy. And third — and this is a well-kept secret — anything cooked in fat tastes better than food cooked without it because fat amplifies flavour even if you don't taste the fat itself. My biggest challenge in the creation of this recipe was to construct a crisp crust without deep-frying the chicken in a vat of fat.
I worked out a delicious home-style version of chicken nuggets that requires no deep-frying years ago. I started with chicken tenders, those little flaps of chicken meat attached to the underside of each chicken breast. They're as meaty as boneless, skinless chicken breasts, but they're much cheaper because they're smaller, and because of a tough little tendon that runs down the middle of each tender.
So I tenderized each tender — including the tendon — by soaking it in buttermilk before cooking it, a technique I'd learned from Southern home cooks back when I did my call-in show on the Food Network. I flavoured the buttermilk with garlic and my favourite smoky hot sauce (Tabasco Chipotle), then threw in a hefty pinch of salt to create a brine.
The chicken luxuriated in this buttermilk bath for several hours, after which I coated it with a mixture of breadcrumbs and panko (for extra crunch), sauteed it in olive oil, and served it up with a wedge of lemon.
This recipe was an immediate hit at our house and quickly became part of the weekly line-up. But though I'd avoided deep-frying, the dish was still fairly caloric because the crumb mixture soaked up oil like a sponge. I solved that problem for this version of the recipe by using vegetable oil cooking spray on the chicken and cooking it not in a pan, but in the top third of a hot oven.
If it is not quite as crispy as the sauteed version, it is nonetheless ridiculously flavourful. I achieved this effect by adding a blue cheese dipping sauce, which borrows one of the trademark ingredients of Buffalo chicken wings. Traditionally, the wings are tossed in a mixture of hot sauce and butter after they come out of the hot oil. But I didn't want to sog up my finished product, so I recommend dipping the finished baked nuggets, first in the hot sauce, then in the blue cheese. I think you will agree that this combo is a touchdown.
Start to finish: 2 hours 30 minutes (15 minutes active)
Servings: 4
2 garlic cloves, smashed
1 teaspoon salt
1/4 cup plus 2 tablespoons hot sauce (my favourite for this recipe is Tabasco Chipotle), divided
2 cups plus 6 tablespoons buttermilk, divided
1 pound chicken tenders (or chicken breasts cut into 3-by-1-inch strips, 1/2-inch thick)
3/4 cup whole-wheat Italian seasoned breadcrumbs
1/4 cup panko breadcrumbs
1/4 cup low-fat mayonnaise
1/4 cup crumbled blue cheese
1/2 teaspoon lemon juice
In a medium bowl, combine the garlic, salt, 2 tablespoons of the hot sauce and 2 cups of the buttermilk. Whisk until the salt is dissolved. Add the chicken tenders and stir to coat well with the marinade. Cover and refrigerate for at least 2 hours and up to 10 hours.
When ready to cook, heat the oven to 425 F. Line a baking sheet with parchment paper and spray it with olive oil cooking spray.
In a shallow bowl combine the whole-wheat and panko breadcrumbs. In another small bowl, whisk together the remaining 6 tablespoons of buttermilk, the mayonnaise, blue cheese and lemon juice. Transfer to a ramekin for dipping. Pour the remaining 1/4 cup of hot sauce into a second ramekin for dipping.
Use a colander to drain the chicken, but do not pat it dry. Dip each chicken piece in the breadcrumb mixture, making sure it is coated well on both sides. Arrange the chicken in a single layer on the prepared baking sheet, then spritz the tops with olive oil cooking spray.
Bake on the oven's middle shelf for 10 minutes. Turn the chicken pieces over and bake for an additional 5 minutes, or until they are just cooked through. Let cool for a few minutes, then transfer to a platter. Serve with both dipping sauces.
Nutrition information per serving: 300 calories; 80 calories from fat (27 per cent of total calories); 9 g fat (3 g saturated; 0 g trans fats); 80 mg cholesterol; 22 g carbohydrate; 1 g fiber; 5 g sugar; 33 g protein; 1,120 mg sodium.
EDITOR'S NOTE: Sara Moulton was executive chef at Gourmet magazine for nearly 25 years, and spent a decade hosting several Food Network shows. She currently stars in public television's "Sara's Weeknight Meals" and has written three cookbooks, including "Sara Moulton's Everyday Family Dinners."


text:
Greetings fellow Michiganders who love the University of Iowa!
We invite you to join our club today!
We bleed black and gold, but somehow life led us away from the rolling hills of Grant Wood's Iowa to the Great Lakes of Michigan where "maize" is neon yellow and John Deere green is not a farmer in overalls but a Roman Spartan.
The Iowa Club of Michigan is here to help you remember "Once a Hawkeye, Always a Hawkeye" and that real maize is golden yellow and turns to spun gold in autumn, just before the harvest and during the peak of football season. Ah, football….
We are planning a number of events and would love to meet you! Join us!
Upcoming Events!
Week of Feb 28th
- There are no events scheduled during this period.


text:
Benom Plumb, a 31-year-old music industry executive from Nashville, thinks the country is on the wrong path, and that Ron Paul is the only candidate who can turn things around.
As for the other Republicans, Plumb doesn't mince words: Mitt Romney? Too slick. Rick Santorum? Too religious. Newt Gingrich? Untrustworthy. "They are all liars and cheaters, if you ask me," he says.
The kind of voter that likes Ron Paul does not fit neatly into any of the other candidates' profiles.
While the other GOP contenders have seen their fortunes wax and wane with voters, Paul has enjoyed steadfast, if relatively low level, support from an obsessively loyal base of backers. But if his long-shot bid falls short, will they throw their votes to one of his rivals?
The Anti-Establishment Factor
It could prove a difficult sell, political observers say, because Paul's supporters are famously leery of the Republican establishment.
"The kind of voter that likes Ron Paul does not fit neatly into any of the other candidates' profiles," says Cary Covington, a political science professor at the University of Iowa.
"Not only is he into limiting government, but he's also talking about a less interventionist foreign policy — getting out of the war in Afghanistan, relaxing laws on drugs, and those kinds of things," Covington says. "Those ideas do not appeal to most Republicans."
Taylor Romero, 28, chief technical officer at a Denver-based mobile software applications startup, says he and his fellow Paul supporters have a tough time relating to the other GOP candidates.
"I have a theory that the Republican Party has been hijacked by theological elements," he says. "Until they finally reaffirm the importance of the separation of church and state, I can't see supporting the mainline party."
Romero says he caucused for Paul in 2008 but reluctantly decided to vote for Barack Obama in the general election over GOP nominee John McCain.
This time, it's Paul or nothing. "I'm tired of having to play the lesser of two evils game," Romero says, adding that if the Texas congressman isn't the nominee, he'll just write him in come November.
A Delicate Balance
That anti-establishment sentiment among his supporters presents a challenge for Paul: how to influence the party without being seen as a sellout if his bid fails.
When Paul bowed out in 2008 and declined to run as an independent, he skirted the problem by endorsing Constitution Party candidate Chuck Baldwin instead of McCain.
This time around, Paul still isn't likely to run as a third-party or independent candidate, but he has enough clout to try to use his influence to get a spot on the convention speech roster — and some sway over the GOP platform on issues such as the Federal Reserve, says Francis Neely, a professor of political science at San Francisco State University.
"If Paul gets the concessions he's after, I think he will be inclined to throw his support behind the nominee," Neely says.
He's also got his son's future in politics to think about, says the University of Iowa's Covington.
"I think he sees a political future for his son [GOP Sen.] Rand Paul, possibly even running for president someday, but certainly being a strong voice in the Republican Party," Covington says.
"A third-party candidacy right now would put his son in the position of either not supporting his dad, which would be unseemly, or betraying his party, which would poison the well in the future."
Forging An Alliance?
If Romney wins the nomination in August, it might make it easier for Paul to work with the Republican establishment, says John Samples, director of the libertarian Cato Institute's Center for Representative Government. He says that ideology aside, Paul and Romney are personal friends, which could smooth the way for a truce, if not an alliance.
There have been rumors in recent weeks that the Romney and Paul campaigns have opened back-door negotiations in anticipation of a possible Romney nomination.
But a Santorum nomination could prove a roadblock.
"Santorum, especially his foreign policy, is pretty anti-libertarian," Samples says.
The thought of Paul endorsing Romney — or Santorum or Gingrich, for that matter — is tough to swallow for supporters Romero and Plumb.
"If it were to happen, I would lose respect for Paul," Romero says.
Plumb thinks Romney and Paul are too far apart on too many issues. "I don't see how it could happen," he says. "If it did, I still wouldn't vote Romney."
Instead, Plumb says he probably would vote for Obama. "But I think the majority of Ron Paul supporters will simply stay home in November."
Copyright 2021 NPR. To see more, visit https://www.npr.org.


text:
Our Services
Plumbing Services Stanfield North Carolina
We love our hometown of Stanfield NC and we understand wanting to support local businesses. We go the extra mile to provide you with the best service because you're not just a customer, you're our neighbors, our business partners, our friends. You're part of our community and we treat you with the respect you only get from quality local businesses that understand that.
We are your affordable quality solution to any and all of your local plumbing needs from water heaters to leaking pipes to garbage disposal repair and replacement!
Emergency Plumbing
When looking for a plumbing company in Stanfield residents can call our specialists any hour of the day or night. We offer 24 hour emergency plumbing services. Emergencies don't happen on a planned schedule – if they did they wouldn't actually be emergencies. When a major plumbing catastrophe takes place then give us a call and we will get on the case right away! We're here when you need us, not just when it is convenient.
Bath Tub Repair
There are many different issues that can come up with your bath tub, especially if it's an older built-in model. Whether you have a faulty faucet that needs to be repaired & replaced, a drain issue, or working with the pipes behind the paneling, we can take care of all of it.
When you want your bath tub back to top working order then we're the professionals you want to call.


text:
Not too long ago I came across the wonderfully novel idea of grilled cheese croutons on Panini Happy and I just had to try it! Grilled cheese sandwiches and soup go hand in hand and dipping is a favourite past time so I just knew that grilled cheese croutons would be fabulous! Recently I made a bowl of roasted tomato soup to go along with some grilled cheese sandwiches and I took the opportunity to make the croutons. This 'recipe' is as easy as making a grilled cheese sandwich and cutting it up. You may want to use day old bread for the grilled cheese along with toasting it lightly before buttering it and then cook it a bit longer so that it is more resilient to getting soggy while sitting in the soup for that minute or two that it takes you to devour it all. 🙂
Grilled Cheese Croutons
Grilled cheese sandwiches go so well with soups like tomato and chicken noodle. Instead of dipping your sandwich into your soup next time how about turning your crispy toasted grilled cheese into croutons?
- 1 tablespoon butter, room temperature
- 2 slices bread, day old
- 3 ounces cheese, grated/shredded, room temperature
- Heat a pan over medium heat.
- Completely butter one side of each slice of bread.
- Place one slice of bread in the pan, buttered side down, sprinkle on the cheese and top with the remaining slice of bread, buttered side up
- Turn the heat down a notch and cook until golden brown, about 2-4 minutes.
- Flip and cook until golden brown on the other side, about 2-4 minutes.
- Cut the edges from the grilled cheese, cut int 1 inch squares and use to garnish your favourite soup.
Roasted Garlic Croutons


text:
All our ring designs are designed to fit any finger on the hand. To measure your finger size, you can do it with our ring size tool, or with ordinary measuring tape.
Measure with our ring size guide
You can easily measure the size of your finger with our ring size guide tool. It works like a belt; simply push the end through the buckle to form a ring shape and see your size in the frame. Once you have found your size, double check that you can pull this size over your knuckle.
Get Your Ring size guide Here
Measure with measuring tape
Measure your fingers circumference with an ordinary measuring tape. You can also use a strip of paper and a ruler. The number of mm corresponds to ring size number (e.g. 50 mm in circumference is ring size 50).
Some other useful tips
- Measure when your fingers are at room temperature.
- If you hesitate between two sizes, always go with the larger one.
- If you consider purchasing a wide band, move up a size from your measurement, for comfort's sake.
- If your knuckle is a lot larger than the base of your finger, measure both the base of your finger and your knuckle and select a size in between the two.
Note that our ring sizes on the product pages are noted in FR measures.


text:
This Explosive: Class 1.2 - G - Wall Sign is constructed using durable, industrial-grade materials, and is designed to be easily noticeable from a distance. Our wall signs such as this one, can be mounted anywhere necessary, such as doors, sign posts, windows and more!
Not seeing the exact sign you need? No problem, we customize! Our team of professional sign designers will create a unique sign to meet your business' specific needs. Plus, we don't charge any extra fees for customizations. Creative Safety Supply is the leader in visual safety and we take pride in providing our customers with high-quality safety, 5S, and Lean products you can trust. Take a look through our inventory of products to find just what you're looking for. Give us a call today for more information.
- Industrial, long-lasting materials
- Custom signs available, please call 1-866-777-1360
- No set-up charge & no extra charges for customization
Send me information about Explosive: Class 1.2 - G - Wall Sign
Get more information about this product and one of our sales representatives will be in touch with you shortly!
Product Reviews
Helpful Resources


text:
New York Brooklyn Bridge Canvas art
Our canvas art are printed on 380gsm cotton canvas with the photo printed high resolution giclée using Ultrachrom inks, which will look vibrant for years to come. We then carefully mount them onto solid wood, chunky 38mm frames which are taped at the back so no staples are visible. We also coat them with a protective coating to give a beautiful finished piece of Canvas Art that won't fade or crack on the corners.


text:
This PowerPoint editable slide features a map of Brandenburg, is one of the sixteen federal-states of Germany. The capital is Potsdam. Brandenburg - Germany PPT Map slide is a pre-made PowerPoint slide created with PowerPoint's own drawing tools which can be easily customized using PowerPoints own tools. Also, you can add your own objects, effects, texts, etc. This PowerPoint map slide is royalty free and instantly downloadable on purchase.
Access to :
$49.99/ Month
15 Template Downloads
10 On-demand Templates Downloads
Access to :
$99.99/ Quarterly
45 Template Downloads
15 On-demand Templates Downloads
Access to :
$149.99/ Half yearly
100 Template Downloads
50 On-demand Templates Downloads


text:
Hiroki Kuroda (3-5, 3,49) vs. Jake Peavy (4-3, 2.91).
COMMENTS: Kuroda is coming off a complete game shutout masterpiece, painted against the red-hot canvas of the Chicago Cubs no less. Peavy, the Padres' ace and last year's Cy Young award winner, is coming off the DL (strained right elbow) for this start. Kuroda faced Johan Santana two outings ago and is probably not planning on visiting nearby Sycuan Casino (a Padres sponsor!), given the cards he has drawn lately for opposing pitchers. But I guarantee you this, Hiroki: even with the Dodgers' awful offense (third-worst OPS (.714) and fewest home runs (44) in the NL), if you can pitch another complete game shutout, SoSG promises that you'll get the win.
STAT OF THE DAY: Kuroda is one of only six NL pitchers with complete game shutouts in 2008, joining Cole Hamels (2), Brandon Webb, Ben Sheets, Braden Looper, and Tim Hudson. There have been 16 CGs in the NL this year (Sheets, Webb, and Hamels each have two).


text:
Amanda Neal in a Bullz-Eye T-shirt
Just in time for St. Patrick's Day we have our lovely redhead we introduced for the holiday back in 2010. Amanda Neal returns for a Blast from the Past shoot sporting a Bullz-Eye T-Shirt which she then proceeds to take off for some spectacular implied photos. Amanda even has some green highlights in her pretty red hair, and as you can see she's added some new tattoos as well. Look for more photos from this curvy Girl Next Door as we have a set with her posing next to a motorcycle as well.
You can follow us on Twitter and Facebook for content updates. Also, sign up for our email list for weekly updates and check us out on Google+ as well.
Posted in: Models
Tags: alternative girls, Amanda Neal, babes blog, beautiful breasts, beautiful curves, beautiful redhead, beautiful women with tattoos, best bikini models, best Bullz-Eye models, best glamour models, bikini models, bikinis, Blast from the Past, Bullz-Eye bikinis, Bullz-Eye Models, busty women, curvy model, girl next door, girls with tats, glamour models, gorgeous redhead, hot alternative girls, hot babes with tattoos, hot redhead, inked girls, model flashback, model with large breasts, natural breasts, pretty redhead, redhead, redhead babe, redhead beauty, redhead hottie, redhead model, sexy alt chicks, sexy curvy woman, sexy redhead, sexy slideshows, side boob, slideshows, St. Patrick's Day, St. Patty's Day, stacked hot babes, stacked models, stacked woman, swimsuit models, swimsuits, tattoos, underboob


text:
Don't blame Beyonce for blowing the lights out at the Super Bowl.
NFL Commissioner Roger Goodell said Monday that the halftime show was not the cause of the power outage that darkened the Superdome for half an hour during Sunday's broadcast.
"There's no indication at all that this was caused by the halftime show. Absolutely not. I know that's been out there that this halftime show had something to do with it. That is not the case," Goodell said.
Beyonce was the halftime performer at Sunday night's game and used plenty of power to light up the stage. Some had joked that her electrifying performance was to blame for the outage.
But the halftime show was running on its own generator, said Goodell and Doug Thornton, a vice president of SMG, the company that manages the Superdome.
"It was not on our power grid at all," Thornton said, adding that the metered power consumption went down during halftime because the house lights were down.
Beyonce's 13-minute set included hits "Crazy in Love," ''Single Ladies (Put a Ring on It)" and a Destiny's Child reunion.
The energetic performance was sung live days after she admitted she sang to a pre-recorded track at President Barack Obama's inauguration. And it won applause from critics who called it a major improvement over Madonna, who sang to a backing track last year, and the Black Eyed Peas' much-criticized halftime show in 2011.
Afterward, Beyonce announced "The Mrs. Carter Show World Tour" will kick off April 15 in Belgrade, Serbia. The European leg of the tour will wrap up May 29 in Stockholm, Sweden.
The tour's North American stint starts June 28 in Los Angeles and ends Aug. 3 in Brooklyn, N.Y., at the Barclays Center.
It was also announced Monday that a second wave of the tour is planned for Latin America, Australia and Asia later this year.