text:
March 26, 2015
Announcing Instant Cocoa
I've been working on a library for a little while now to make developing iPhone apps easier. The library adopts a number of the patterns that I've talked about here on my blog, and is meant to fill in a lot of the gaps left by Apple's frameworks. It's out today. You can find it at instantcocoa.io, and on Github. It's a very ambitious project, and there's still quite a bit of work left to do. But it's worth launching now and getting feedback from the community.
I'm still working on documentation, so expect to see some changes at instantcocoa.io/docs. I'm hoping to have the documentation ready in about 2 weeks.
I want to give a big thanks to Tyler Galpin for designing the site and the amazing icon.
My hope is that this project can help us all make better iPhone apps. If you see anything you'd like to comment on, please feel free to make a Github issue so that we can fix it. It's going to be a bright future!
March 2, 2015
A crufty codebase is an experience every developer has had. From the outset, you plan for a beautiful architecture, elegant data flow, and simple code, but after years of bug fixes and feature additions, the codebase morphs into a husk of its former self, displeasing and tiresome to work on.
As you write your programs, you make sequential straightforward changes, like adding features or fixing bugs. Each individual change is, as you intended, good, but the combination is something that neither you nor anyone else on your team can be satisfied with. This concept has relatives in systems theory, philosophy, economics, and political theory. In this post, we'll explore some of those theories and use them to evaluate our practice.
As a sort of fictional case study, we have Mike Hadlow's The Lava Layer Anti-Pattern. In it, he describes a situation where each of four developers continue to modernize the data layer of an app. Through no fault of management or any of the developers, the final state of the code is fragmented and confusing, various modules in disagreement.
Broadly, this concept is known as emergence. Emergence describes a system whose high-level behavior is fundamentally different than its low-level components. Emergence can be seen in lots of fields, including (but certainly not limited to) biology, computer science, and traffic. Note that the theory of emergence doesn't ascribe any value to the high-level behavior; neutral low-level actions can cause both positive or negative high-level outcomes. The cruft in our codebases comes from a series of changes that weren't intended to have an effect on the overall structure of the program, but nevertheless do.
There are two theories in economics that are useful for analyzing codebases. First, broken window theory. The broken window theory suggests that fixing little things like broken windows or graffiti reduces the incidence of more serious crimes, like muggings. There are broken windows in your codebase, and you can fix them them pretty easily. Increasing consistency will make future committers more reticent to make unsightly and changes. Use tools like
clang-format to clean up whitespace and make code conform to standards, reducing needless comments in your code reviews.
The second economic theory that's notable here is the Tragedy of the Commons. The Tragedy of the Commons refers to a simple idea: in a situation where a group shares a common resource, individuals can exploit that shared resource, enjoying the gains personally, and distributing the costs communally. It's pretty easy to see how this applies to environmental issues, like pollution or overfishing.
The prototypical example is a group of ranchers that share a plot of land for their cows. As each rancher considers adding another cow to their herd, she evaluates the potential upside and downside. Upside: one more cow, which means more milk/beef/hide; downside: overgrazing of the shared land, for which the costs of repairing will be shared among all the ranchers. This is also known as an externality.
Think of your codebase as the commons: multiple people working in the same space. When working on a story or a ticket, you can take out technical debt at any point. Technical debt is formed when code is written suboptimally to optimize some other value, usually time. Especially on a team, taking a shortcut and finishing your work more quickly will make you look good in front of your teammates or your manager. Since someone has to pay back that debt, so you're incentivized to throw your teammates or even a future version of yourself under the bus.
And it doesn't even require ill intentions. Emergence can happen even when you have no designs either way. Have you ever reviewed a pull request that looked great in diff form, but when browsing the code later, it became obvious that the fix was unsound? It's certainly happened to me. It's possible (and sometimes even easy!) to accidentally write pull requests in such a way that they look good on Github, but closer examination of the fix's surroundings reveals that it solves the problem in the wrong place or in the wrong way. This is most obvious with duplication. A diff can't tell you if you've rewritten code that already exists in the codebase, and that can be a really simple way of building up technical debt, having code fall out of sync, and leaving holes for bugs to hide in.
Meditations on Moloch is an awesome blog post generalizing this concept to society, capitalism, and ideology. In it, the author quotes a short passage from the Principia Discordia, a conversation between a human and a goddess, which sums it up nicely.
"I am filled with fear and tormented with terrible visions of pain. Everywhere people are hurting one another, the planet is rampant with injustices, whole societies plunder groups of their own people, mothers imprison sons, children perish while brothers war. O, woe."
"But nobody wants it! Everybody hates it."
But how do we stop? Emergent behavior acts like entropy: reversing it takes work and, more importantly, coordination.
There are no real secrets here. A crufty codebase demands attention, and it won't fix itself. Code will need to be refactored over time. For a team, coordination mostly happens at the code review level. This doesn't just mean checking for style, but checking, at a very rigorous level, for flaws, duplication, confusing code, and spots that will otherwise cause problems in the future. Code review makes sure the team is synchronized.
For teams of one, solving your problem involves holistic attention to your codebase. No one else is around to catch your mistakes, so you have to put a lot of deliberation into it. On the other hand, there's no one else to muck it up after you fix it.
But the best solution is just to never get yourself into the problem. Mike Hadlow suggests generally waiting for more maturity in the technologies that you introduce. He also seems to recommend waiting until you can replace a component wholesale instead of piecemeal.
This is your craft, and building good software is your primary job. Write code that doesn't need documentation; barring that, write documentation. Write tests. Don't write comments, but use good naming and method extraction to obviate them. With attention and coordination, you can make your codebase enjoyable to work in again.
February 23, 2015
Consistency is a Virtue
Last week, I talked about doing things on the right level. In some ways, that post is a plea for consistency. In the world of programming, consistency is a worthwhile ambition. Here, Brent Simmons requests some sanity when it comes to dot-notation versus bracketed message sending.
Let's talk about a couple of languages. Smalltalk and Ruby are very similar languages, the latter rooted in the former. Smalltalk gets consistency right, to a fault. Everything is an Object, including numbers, booleans, and the idea of nothingness. Do you want Swift-esque enumerations? Use polymorphism. Everything is an Object. There's one type of
nil, compared to Objective-C's four (nil, Nil, NULL, and NSNull). Smalltalk values consistency so much that it throws user expectations out the window. Remember how I mentioned Smalltalk is consistent to a fault? In Smalltalk operators (like
+ or
*) are just methods that are defined on objects. However, messages have precedence from left to right, so
3 + 4 * 5 evaluates to 35, as though your code read
3.plus(4).times(5), instead of adhering to normal mathematical order-of-operations, as you might expect. (Seems like Alan Kay can invent OO, but can't get OoO right!)
Ruby also has this Everything is an Object concept, with one object for nil, etc. But in Ruby, purity gives way to pragmatism, and operators like
* have a higher precedence than operators like
+. However, closures, simple in Smalltalk, are made complex in Ruby. There are three types of closures in Ruby: block, Procs, and Lambdas. The differences between them are unimportant and enumerated elsewhere. With three types of closures, knowing when to use which becomes an exercise in expertise rather than ease. It's not immediately clear when you should use each or what the performance ramifications are. The stewards of Ruby let implementation details get in the way of the "user interface" of their language. Developers don't care which closures can't go in arrays and they don't want to have to think about what the
return keyword binds to — they just want to write code. Keep it simple for them.
Objective-C, like Ruby, is also based in Smalltalkian roots. In trying to make Objective-C more performant, however, compromises were made, and the designers used primitives to represent concepts like truth, falsity, and numbers. These primitives, since they aren't objects, can't go into native collections like arrays and dictionaries and must be "boxed-up" in a special class. That class,
NSNumber, has no facility for manipulating the numbers therein, which leaves the developer constantly boxing and unboxing numbers to use them. Swift smoothes over this particular issue by treating integers and other numbers as structs, which retain the performance characteristics of primitives, can be stored in collections, and can be messaged.
And consistency trickles down from languages into standard library design. Apple does a great job with consistency in API design. Long, precise method names make it extremely specific what types you need to pass in, what type you'll get, and what the function does. Apple even provides a WWDC talk about how to design your APIs.
Contrast with this PHP's standard library.
strlen and
str_replace are all functions that operate on strings, but they all have differing prefixes. (It turns out that this is because PHP's first function lookup was based on the length of the function name, so functions needed names that were as varied as possible. The height of absurdity.) Compare these function names to the related Foundation method names. Here, consistency gives programmers a super power — the ability to guess what the function should be called — and autocomplete can take it from there.
And it affects your own code as well. Let's take an example, like view allocation. There are a lot of places where you can set up your subviews. You can do it in your UIViewController's
-loadView or
-viewDidLoad, or you can do it in UIView's
-initWithFrame:, or in Interface Builder, or anywhere else (it's just software, after all). My preference is a lazy initializer:
- (UITextField *)usernameField {
if (!_usernameField) {
UITextField *usernameField = [[UITextField alloc] init];
usernameField.placeholder = @"Username or email";
[self addSubview:usernameField];
self.usernameField = usernameField;
return _usernameField;
Once allocation and configuration are always done in the same way, you no longer have to think about where it goes. New method, every time. You never have to think about where to find it, either. Command-click on the getter for the view, and you're taken right to the place where the view is created and configured. Now, if we extract the line of code that sets the placeholder, we're suddenly left with a method that relies only on the name and class of the property.
- (UITextField *)usernameField {
if (!_usernameField) {
UITextField *usernameField = [[UITextField alloc] init];
[self configureUsernameField];
[self addSubview:usernameField];
self.usernameField = usernameField;
return _usernameField;
Is this ripe for metaprogramming? You'd better believe it. If we mark the
usernameField property as
@dynamic, we can catch it in
+resolveInstanceMethod: and create and configure it dynamically:
@implementation SKView
+ (BOOL)resolveInstanceMethod:(SEL)sel {
NSString *selectorName = NSStringFromSelector(sel);
NSString *viewName = [self viewNameFromSelector:selectorName];
Class viewClass = [self viewClassForPropertyNamed:viewName];
SEL configurationSelector = [self configurationSelectorForViewNamed:viewName]; //-configure<ViewName>
BOOL isSetter = [selectorName hasPrefix:@"set"];
if (isSetter) {
IMP implementation = imp_implementationWithBlock((id) ^(SKView *self, UIView *newView) {
return [self.views setObject:newView forKey:viewName];
class_addMethod(self, sel, implementation, "v@:@");
return YES;
} else {
IMP implementation = imp_implementationWithBlock((id) ^(SKView *self) {
if ([self.views objectForKey:viewName]) {
return [self.views objectForKey:viewName];
UIView *view = [[viewClass alloc] init];
[self addSubview:view];
[self.views setObject:view forKey:viewName];
if ([self respondsToSelector:configurationSelector]) {
[self performSelector:configurationSelector];
return (id)view;
class_addMethod(self, sel, implementation, "@@:");
return YES;
Consistency isn't just a facet of good code, it is good code.
February 17, 2015
The Right Level
Doing things at the right level is very important for long-term, sustainable programming. One theme of this blog is how to beat Massive View Controller. Massive View Controller happens because you're doing things on the wrong level. Things in the model layer, like values and enumerations, bubble "up" to the view controller, while organizational responsibilities, like coordination, bubble "down" to the view controller. The combined complexity of all this code makes the view controller become tangled with itself and impossible to grok.
What do I mean by "the right level"? Let's dive in.
The Knight's Template Method
If you have one thing, and you want to make another thing, using inheritance to solve that problem will always put you in a bind. I talked about sidestepping inheritance for share code in last week's Prefer Composition to Inheritance. This week I'd like to talk about when the extenuating factors win out, and you have to use inheritance.
If you subclass from one thing to make another thing, you're failing to keep things on the right level. To maintain order in your code, remember: you can't have just one specialization. In this case, you have three things: the shared code, which goes in a superclass; and the two branches of differing code, which are the specialized subclasses.
This type of structure creates two levels. The top level, the superclass, contains the abstraction, the prototype for the concept; it shouldn't be instantiated. The bottom level contains the concretion, the congealed form of the ideas; it can't exist without the upper level. This is the Template Method pattern. It's probably an anti-pattern. Nevertheless, when you have to do it, do it right.
All modern editors use color to signify meaning. Constants are one color, methods another, local variables a third. This highlighting is designed to help readers parse code more easily, by allowing the user to focus on chunks like literals or instance variables at once. One new way I've learned to use syntax highlighting is called the squint test, and it's a litmus test for the clustering of code.
The squint test is simple: squint at your code, and make sure similar colors sit together. If they don't, you might not be doing things on the right level. In its simplest form, it will compel you to move string literals to the top of a file. You can use it for much more, though. The squint test can also help you separate the semantic components of your class that are related. In this talk, Sandi Metz refactors the Gilded Rose kata, and when we squint at the product of her refactoring, it's clear that the right-hand side of the slide is better separated and better factored.
N.B.: you'd be forgiven for thinking she needs to refactor this more. She does, and her final result is awesome. I highly recommend the talk. Even better, try the kata out before you watch the talk.
At C level
Objective-C is designed as a layer on top of C. It can do everything that C can do, and then some. You could ship an iOS app written entirely in C or C++ if you wanted. This interoperability has been a boon to developers, allowing them to use a vast array of libraries in their apps that were never intended for use in Objective-C.
However, it's also provided confusion to developers writing code. Should this simple string transformation be in a category on
NSString or a C function that takes one string parameter? A category incurs the cost of an
objc_msgSend, but dipping down to the C level incurs a context switch for the reader of the code.
When I'm reading C code in an app, I wonder what dropping to C means, semantically. Does it mean that the code needed to be more performant or that the author was more comfortable writing C than Objective-C? What should I infer from the switch? Staying consistent and using one language prevents these questions from being asked; also, staying consistent in your basis for dropping down to C guides your reader into inferring more meaning from your code.
Preprocessor macros are similar. They have a ton of value in providing code generation and metaprogramming to more static languages, but they incur a context-switching cost as well. Worse still, macro code doesn't get highlighted and there's a bunch of slashes everywhere, making it hard to read. Do string literals need to go in a
#define, or can they be class or instance methods in an Objective-C class?
NSString literals, which, like preprocessor macros, have no syntax highlighting. To alleviate this as much as possible, the JavaScript is clustered together in the same object, and hidden behind a type-safe Objective-C interface. If you need to mess with the JavaScript, there's one .m file to go to. No more grepping for
Staying on the right level helps keep your code legible to not only your teammates but also future versions of yourself.
Layer cake
Your app is composed of several layers: data storage, manipulation, presentation, and so on. The more clearly the layers are defined, the more obvious it is when code from one level bleeds over into another level. Unfortunately, we're stuck with the ill-defined and meaningless name Controller, and we have to work with it. Presentation code might go into the controller at first. But as it gets more and more bulky, it can split into its own layer, like a cell undergoing mitosis. This new, well-defined layer should have less trouble keeping out-of-scope responsibilities out and keeping its role clear.
Wrapping up
These examples seek to show two things: 1. working at the wrong level makes your code more complex and hard to understand, and 2. working at the right level smoothes out your code and keeps it easy to maintain.
However, keeping your code neatly organized in these ways requires rigor. No amount of automated testing or static analysis will reveal that your code is poorly structured. Well-crafted programs come from the human element. Meticulous planning and code review help you critically analyze the code until it satisfies you.
February 9, 2015
Layout Abstractions
In the beginning, there was
CGRectMake. It was hideous.
_badge.frame = CGRectMake((self.frame.size.width - (widthOfBadge))/2,
imageViewSize + 5,
Autoresizing masks sometimes helped, but they weren't as flexible as their names suggested.
_imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
(This is all real code. Instance variables have been changed to protect the innocent.)
As more programs were written, techniques were discovered to abstract away some of the mess. But it was still procedural C, and it was still kinda hard to read.
Then came Auto Layout. Auto Layout is slow, confusing, and verbose. But it's declarative, and it solves a system of equations every time it lays out your code, which is just plain cool.
These are all layout abstractions, but none of them are great. What do we want out of a great layout abstraction?
- We want it to be code. Interface Builder is an impressive tool that gets more impressive with every release. But it's fundamentally not as expressive as code, doesn't play well with source control, and generates components that aren't reusable (we can't conditionally apply a layout to a view, for example).
- We want it to be fast. We're dealing with primitive numbers here. There's no reason calculations should take a long time.
- We want it to be simple. You should be able to glance at it and tell what the layout looks like. The code should be concise and straightforward.
- We want it to be expressive. You should be able to describe any layout with the abstraction.
- The abstraction should be very malleable. Easy things should be easy, and hard things should be possible.
Since no layout abstraction can satisfy all of these criteria, we're making a trade-off with any solution that we pick. Auto Layout trades speed and simplicity for the ability to be expressed in Interface Builder. Anyone who's tried to set up constraints in code knows how painful using even the visual format language can be. Libraries like CompactConstraint or Cartography can help with the verbosity of Auto Layout, but the point I want to press here is that Auto Layout isn't the ultimate form of expressing layouts.
Even though Apple engineers have been subtly and not-so-subtly pushing us towards Auto Layout since it was released, and maybe one day we won't be allowed to use anything but Auto Layout, computers are Turing-complete. You don't have to wait for anyone: write your own future.
For me, the most natural way to think about it is that views should have a layout, the same way they have subviews. You could hot-swap this layout for lots of reasons: to perform an animation, present the same views on different devices, or A/B test different layouts. If your view is HTML markup, your layout object would be the CSS.
Maybe you like the rectangle-slicing
CGRectDivide model of layout. What would that look like if it were an object, instead of a procedure? Can it be more than just C functions that are called sequentially? Does our
RectDivider object have access to the class of its target view? Can it use names instead when applying rects to subviews, to reduce coupling?
Or maybe you like Java's configurable Layout Managers. Layout Managers let you pick a strategy, like "fill", or "stack", or "grid", and pass in a list of views which will have that layout strategy applied to them. Here's an exploration of them in iOS, and here's a library that approaches layout managers in a slightly different way.
Or maybe you like CSS's flexbox. Flexbox is a new CSS display style that not all browsers have implemented yet. It lays out views in a row (either horizontal or vertical) and lets you assign which subviews have fixed width (or height), and which subviews should be stretched out to fill the view. You can imagine how powerful this can be when coupled with a scroll view.
What do I want? Sometimes I just want to write an object and have the layout engine just figure out what to do:
@implementation SKUserCellLayoutSpecification
- (CGFloat)imageViewDimension {
return self.height;
- (CGSize)sizeForImageView {
return CGSizeMake(self.imageViewDimension, self.imageViewDimension);
- (CGPoint)originForLabel {
return CGPointMake(0, self.imageViewDimension);
- (CGFloat)widthForLabel {
return self.width - self.imageViewDimension;
- (CGFloat)heightForLabel {
return self.height;
Maybe something this abstract could finally prevent us from having to write our layout code twice: once in
-sizeThatFits: and once in
But most of the time I just want to pick between them all. I want a protocol that every layout conforms to, and I want to be able to swap between them at will. Maybe some of the concrete implementations are backed with Auto Layout, and others with a layout manager. You'd finally be able to pick the right tool for the job. And that seems like a future worth writing.
Further exploration
There are a few places where I drew inspiration for this post, in order of age:
- Colin T.A. Gray, who worked on MotionKit, a part of RubyMotion, uses Layout objects to push everything down from the view controller, not just for positioning views. Nevertheless, his library provides a cool (Ruby) DSL for adding constraints and fetching frames. He gave a talk on MotionKit in 2014, which you can find here (direct link to 13:47).
- Facebook's Paper uses two abstractions, Metrics and LayoutSpec. You can see more in their tech talk, Building Paper (direct link to 20:55). This is a pretty cool structure, and they separate calculation of their rects from their application, solving the
-layoutSubviewsproblem. Their LayoutSpecs can also be defined in JSON, meaning their designers can write them and check them in, with no help from engineers.
- Facebook's React Native has a reimplementation of Flexbox for use in their Javascript app engine. You can find out more in the React Native Keynote (direct link to 13:07). While it's probably designed for use only in their JS framework, it would be awesome if we could even apply it to arbitrary UIViews.
- Josh Abernathy's SwiftBox is an implementation of FlexBox for Swift.
February 2, 2015
Prefer Composition to Inheritance
There's a lot that I want to say about composition and inheritance, but Sandi Metz covered the basics better than I could have at the first Code Genius event. We don't have the rights to share the video, but she'll be giving the same talk at RailsConf this year. You should absolutely check it out when it goes up. I'll link to it here when it's posted. So, since she already covered why inheritance will fail you, I will explore a few techniques we can use to avoid it.
Interior Decorating
Let's imagine a new networking library. Network requests are defined by template objects that conform to a protocol:
@protocol SKRequestTemplate <NSObject>
@property (readonly) NSURL *baseURL;
@property (readonly) NSString *method;
@property (readonly) NSString *path;
@property (readonly) NSDictionary *parameters;
@property (readonly) NSDictionary *headers;
With this design, we're given a lot of flexibilty in how we define our request templates, and we can rely on some other component to convert each template into an
NSURLRequest, and that request can be fired by some other uninteresting machinery. To create the request, we need to grab each property from the template in turn.
mutableURLRequest.HTTPMethod = [template method]
When we go to use these templates however, we notice that we can't have any default behavior. Since it's using a protocol and not inheritance, we can't use the superclass to set the default
method to
GET. We can avoid this with a nil-coalescer:
mutableURLRequest.HTTPMethod = [template method] ?: @"GET";
We run this code and realize that we have an even bigger problem. If there's no implementation defined for
-method, our template is going to blow up! We can do something ugly like:
mutableURLRequest.HTTPMethod = [template respondsToSelector:@selector(method)] ? [template method] : @"GET";
But this is inelegant and we wish we could just force our users to subclass something so that we can hide this behavior away. But don't fret! We have options outside of inheritance. To add behavior in a composition-friendly way, we use the Decorator pattern. Let's define something called a SafeTemplate:
@interface SKSafeRequestTemplate : NSObject
- (instancetype)initWithUnsafeTemplate:(id<SKRequestTemplate>)unsafeTemplate;
@property (nonatomic, readonly) id<SKRequestTemplate> unsafeTemplate;
@property (readonly) NSURL *baseURL;
@property (readonly) NSString *method;
@property (readonly) NSString *path;
@property (readonly) NSDictionary *parameters;
@property (readonly) NSDictionary *headers;
We can now pass our "unsafeTemplate" into this object, and for each property, it wraps the execution in a check, and can return any default we choose:
- (NSString *)method {
if ([self.unsafeTemplate respondsToSelector:@selector(method)]) {
return [self.unsafeTemplate method];
return @"GET";
URLRequest.HTTPMethod = [safeTemplate method];
A particularly elegant note on this solution: the wrapper itself doesn't conform to
SKRequestTemplate, even though its parameter does. This means that if we add a new method to the protocol and try to use it from the safe template, the compiler will groan at us. It must be defined on the safe template before we can use it, and we'll be reminded to add it there as well. Normally, with inheritance, your "contract" with the outside world includes all of your superclass's methods; with decoration, you only have to provide what you say you'll provide. Aaron Patterson documents a case where the rails/core team got bitten by this exact problem.
The Presenter pattern that I outline in 8 Patterns to Help You Destroy Massive View Controller is a more specific version of this technique.
And that's the Decorator pattern. It's very flexible, very useful, and a great weapon in the war on inheritance.
One awesome thing that Sandi said is "There's no such thing as one specialization. If you're specializing something, you have two things." This was a revelation for me.
Let's continue to work with our networking library. Using the data source pattern from 8 Patterns to Help You Destroy Massive View Controller, let's make an object called
SKRemoteDataSource, which fetches a collection of objects from an API for display in table view.
@interface SKRemoteDataSource : NSObject <SKDataSource>
@property (nonatomic, weak) id<SKDataSourceDelegate> delegate;
@property (readonly) NSUInteger numberOfSections;
- (NSUInteger) numberOfObjectsInSection:(NSUInteger)section;
- (id) objectAtIndexPath:(NSIndexPath*)indexPath;
- (void)fetchData;
@property (nonatomic) NSURL *URL;
@property (nonatomic) NSDictionary *queryParameters;
@property (nonatomic) NSString *keyPath;
This is a very useful class, but sometimes the remote objects are paginated. So we could subclass
SKRemoteDataSource and make
SKPaginatedDataSource. Hey, pagination is just a special case of a remote data source, right?
@interface SKPaginatedDataSource : SKRemoteDataSource
@property (nonatomic, readonly) NSInteger currentPage;
@property (nonatomic, readonly) NSInteger numberOfPages;
@property (nonatomic, readonly) BOOL hasMorePages;
- (void)fetchNextPage;
While this seems reasonable, every change you make to the superclass will break the subclass. I can tell you this because I've written this exact code in this exact way before.
What I had was a bad version of the Template Method pattern. To implement the template method properly, you need to:
- create a superclass with all common behavior
- throw an exception from the superclass for all differing behavior
- and make your two subclasses (because you can never have one specialization!) and override the points of difference
Even properly implemented, however, the Template Method pattern is probably an anti-pattern. It's based on inheritance which will always strongly couple your components together. Fortunately, we have an alternative, which is based on composition.
We have two responsibilities here: downloading an array of items from an API, and presenting them as a data source. These two responsbilities have been tightly coupled together. Extracting the shared core will make simpler objects that can be used more often. When we wrap behavior in an object and inject it into other objects, it's known as the Strategy pattern.
The final solution was
SKCollectionFetcher, which downloaded a collection of objects from an API. The paginated and regular remote data sources each had a collection fetcher, and the logic was no longer duplicated.
@interface SKCollectionFetcher : NSObject
@property (nonatomic, strong) NSURL *URL;
@property (nonatomic, strong) NSDictionary *queryParameters;
@property (nonatomic, strong) NSString *keyPath;
- (void)fetchCollectionWithSuccessBlock:(void (^)(NSArray *objects))successBlock failureBlock:(void (^)(NSError *error))failureBlock;
- (void)cancelCurrentFetch;
@interface SKRemoteDataSource : NSObject <SKDataSource>
@property (nonatomic, weak) id<SKDataSourceDelegate> delegate;
@property (nonatomic, assign, readonly) NSUInteger numberOfSections;
- (NSUInteger) numberOfObjectsInSection:(NSUInteger)section;
- (id) objectAtIndexPath:(NSIndexPath*)indexPath;
- (void)fetchData;
@property (nonatomic, strong) SKCollectionFetcher *collectionFetcher;
Since the data source and the collection fetcher are now separated, we can swap them out at will. In some cases, we'll need a slightly different collection fetcher, and that will work with our remote data source. In other cases, the reverse will be true, and we'll need a slightly different data source. For example, if we need relative pagination, which is based on timestamps, we can write a new data source while using the old collection fetcher. Writing code with composition makes this sort of flexibilty possible.
January 26, 2015
-[NSString containsString:] was added in iOS 8. If you're writing a standard library, this seems like one of the most crucial components for string handling. And yet, it's been conspicuously absent since the early '90s, when NSString was created.
Apple gives you a function called
-rangeOfString: whose functionality is a superset of this behavior. You can use a short snippet of code with
-rangeOfString: in the place of
if ([aString rangeOfString:searchString].location != NSNotFound) {
//substring is found
} else {
//substring is not present
Writing it this way is very tough to read, and code is read much more often than it is written. "The location of the searchString inside aString is not equal to 'not found'" is a tough thing to parse from code to English, especially because of the double negative.
Of course, you're currently screaming at me, "Just use a category!" And it's trivial to add this method to the
NSString class. I can do it, and you can too.
- (BOOL)containsString:(NSString *)searchString {
return [self rangeOfString:searchString].location != NSNotFound;
This is an unsatisfactory solution. There are three primary reasons why.
First, developers are lazy. If you search Github for
rangeOfString, you will find pages and pages of open source repositories that use
-rangeOfString almost exclusively in the place of
-containsString:. Why didn't they just write the category for the message they needed? There's a lot of cognitive load to adding a file to your project. It also involves a context switch: instead of just writing the code you want in the place where you want it, you have to jump to a different place to add a different thing. The out-of-order nature of that kind of programming makes it very hard to do the right thing.
Secondly, category methods must either be prefixed — and ugly — or unprefixed — and go against Apple's best practices. Personally, I see prefixing as unnecessary. How many ways are there to write
-containsString:? How many ways are there to write
-firstObject? Nevertheless, I worry about method names
-select: that could easily conflict (imagine a method that selects objects in a collection based on a block, like Ruby's Enumerable
#select, or an IBAction routed through the responder chain, like
-copy: or
-selectAll:). The important thing here is that, whether or not I think prefixing is ugly, I also don't like going against best practices. There isn't really a way out of this trap. My code will be unsatisfactory either way.
Lastly, writing the method yourself in a category will always be less performant than the vendor's version. While I was writing my library Objective-Shorthand, I did some research in the runtime on
-[NSArray reversedArray]. I found that even though it's not a public method, the SDK does actually respond to this message. It returns an
__NSArrayReversed, which is ostensibly an class-clustered
NSArray that accesses objects in reverse order. Most implementations of array reversing (including mine!) would call
allObjects on the
reverseObjectEnumerator, which creates a full copy of the array, the obvious and simple solution. Apple's implementation cleverly sidesteps this. You could imagine similar optimizations for other methods. Why this method isn't public, I don't know.
In using categories, the best we can do is bundle up all these obvious shortcomings into a single library, and use that one dependency. This is exactly what Objective-Shorthand attempts to do. And even in this "best" solution, we still have to import Objective-Shorthand everywhere we need it, or include it in the .pch file (which is probably an anti-pattern, since it makes your dependencies implicit).
There are other reasons as well why the bundling of all these categories together doesn't work. I did a quick proof-of-concept for a small state machine library a few weeks ago, and while Objective-Shorthand would have made my work a lot easier, I couldn't justify making other developers dependent on Objective-Shorthand, just to make my coding experience a little nicer.
So given these myriad reasons why categories aren't good enough, why will Apple not implement these methods? One common reasoning I've heard is that Apple's conservatism causes a reticence for API additions. Mattt Thompson asked an engineer at a WWDC lab why it took so long to add JSON support to the SDK:
Apple is a company with a long view of technology. It's really difficult to tell whether a technology like JSON is going to stick, or if it's just another fad. Apple once released a framework for PubSub, which despite not being widely known or used, still has to be supported for the foreseeable future. Each technology is a gamble of engineering resources.
This argument isn't very compelling!
-containsString: isn't a new technology, nor is its usage in doubt. Our simple Github search from earlier shows that. Also, don't forget that this is the same vendor that added a dozen methods to
NSString for manipulating paths. Conservative? Doubtful!
Other vendors have proven that it's possible to do this well. Ruby, for example, takes it to the other extreme: their Integer objects respond to methods like
#even? and even
#gcd. Providing those methods in the standard library yields more readable code and it gives the vendor the opportunity to tweak and optimize them at later date, knowing that anyone who needs them will benefit from their optimizations.
All of the solutions available to developers — the unreadable
-rangeOfString: dance, a utility object, small categories copied to each new project, or compiling them into one library like Objective-Shorthand — are insufficient.
In the same way that base types like Swift's Optional or JavaScript ES6's Promises must be built-in for proper adoption, these simple methods need to be available to all developers. Apple's proclivity towards leaving holes in their API forces developers into a bind. We must either write inexpressive, hard-to-read code, do needless work opening these classes back up, or leave a trail of dependencies in our wake.
January 20, 2015
The Coordinator
One of the biggest problems with the big view controllers is that they entangle your flow logic, view logic, and business logic.
When a table cell is selected, that delegate method typically looks like this:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
id object = [self.dataSource objectAtIndexPath:indexPath];
SKDetailViewController *detailViewController = [[SKDetailViewController alloc] initWithDetailObject:object]
[self.navigationController presentViewController:detailViewController animated:YES];
Three simple lines: get the object; create a view controller; present the view controller. In a simple app, this works great. Each view controller is probably used once, and in only one context. Coupling them together like this isn't a dangerous proposition. As your app grows in complexity, however, the same view controller might get used in a new way or in a new place. Maybe it's on the iPad. Maybe it's in an extension. Maybe it's a new flow for doing an old thing.
If the flow logic is encoded into the view controller itself, the view controller can't be reused for its stunningly good looks without dragging all that flow code with it. Don't forget, the view controller base class is prefixed with
UI. It's view object, and handling user flow is out of its scope.
In the code example above, the view controller knows how to create the next thing in the flow, and how to present it. In the third line of code, it tells its parent view controller what to do, which definitely seems backwards. And even worse, that flow code is distributed among multiple view controllers, each of which only knows how to perform the next step.
I used to think of the view controllers as the highest level thing in app, the things that know how to run the whole show. Lately, however, I've found many advantages to having the view controllers be bossed around by an even higher level object, one whose role is to marshal and manage all the view controllers in its purview.
I call these objects Coordinators, but I've also heard them called Directors. To really execute this pattern well, you need one high-level coordinator that directs the whole app (this is sometimes known as the Application Controller pattern). The app delegate holds on to the
AppCoordinator. Every coordinator holds an array of its child coordinators. Especially if you have more than one, as in a tab bar app, each navigation controller gets its own coordinator, for directing its behavior and flow. Further child coordinators can be created for specific tasks like signing up or creating content. Each coordinator is spawned by its parent coordinator. As always, use this pattern early in the development process, so they're useful even in single-step tasks, such as authentication.
The Coordinator is a PONSO, like all great objects. For something like Instagram's photo creation flow, we could have a
PhotoCreationCoordinator. The app coordinator could spawn a new one, and pass it the root view controller so that it could present the first view controller in the flow.
- (void)beginPhotoCreationProcess {
PhotoCreationCoordinator *coordinator = [[PhotoCreationCoordinator alloc] initWithRootViewController:self.rootViewController delegate:self]
[self.childCoordinators addObject:coordinator];
[coordinator beginPhotoCreationProcess];
- (void)photoCreationCompletedSuccessfully:(PhotoCreationCoordinator *)coordinator {
[self.childCoordinators removeObject:sessionCoordinator];
- (void)photoCreationCanceled:(PhotoCreationCoordinator *)coordinator {
[self.childCoordinators removeObject:sessionCoordinator];
The coordinator's
-beginPhotoCreationProcess method can now create a new photo selection view controller and configure it as needed. The coordinator can conform to the photo selection view controller's delegate so that it can be informed when it's time to present the next step. None of the view controllers in the process need to know about any of the other view controllers. Each view controller is an island.
Business logic, like posting the photo, is wrapped up in its own object and can either be pushed up to the coordinator or pushed down to the model as appropriate. Either way, it comes out of the view controller. Moving it up is great because the coordinator is already acting as the glue between different parts of your code already.
The benefits to extracting the flow into a coordinator are myriad. View controllers now can focus on their goal of binding a model to a view. The can be reused more easily, such as in extensions or unbundled apps, without having complex conditionals to manage different contexts. A/B testing is as simple as creating a different coordinator object and using that to start the process. Flow logic now has a home, and things that have a home feel real nice.
View controller initialization is also extracted. This shouldn't be overlooked. Initializing is always a more complex task than it seems, requiring lots of knowledge about classes and configuations, and we moved it to a better place where more informed decisions can be made.
Coordinator objects naturally fall into one of many disjoint states — in other words, especially for an iPhone app, only one screen is visible at any time. This makes them a ripe place to use state machines to manage all of the data in their custody.
Apple loves having the view controller be the center of the iOS world. This is obvious in the new
UISplitViewController APIs in iOS 8, as well as Interface Builder components like storyboard segues. Unfortunately, a view controller-centric approach to app development isn't scalable. The Coordinator is a great way to isolate your code into small, easily-replaced chunks, and another part of the solution to view controller malaise.
January 13, 2015
State Machinery
As awesome as state machines are, they can often be very high-ceremony to set up. A typical Objective-C library requires a lot of code to set up. I wanted to explore combining a few techniques from the this blog to try and make a low-ceremony state machine, one that doesn't require setting up all of your states, transitions, and events ahead of time.
What does the interface for my library look like? Let's take a simple state machine for a subway turnstile:
- (void)init {
self = [super init];
if (!self) return nil;
_stateMachine = [[SKStateMachine alloc] initWithInitialState:@"locked" delegate:self];
return self;
- (void)coinInserted:(id)sender {
[self.stateMachine transitionToState:@"unlocked"];
- (void)humanEntered:(id)sender {
[self.stateMachine transitionToState:@"locked"];
- (BOOL)isLocked {
return [self.stateMachine canTransitionToState:@"unlocked"];
- (void)transitionFromLockedToUnlocked {
//transition code
- (void)transitionFromUnlockedToLocked {
//transition code
That's it. The library uses Dynamic Method Construction to call methods on the delegate, in the form of
-transitionFrom<currentState>To<newState>. If a method is defined, it's a valid transition; if not, it throws an exception. You can find the code on Github.
I'd love to add a few things to it, like dynamic methods in the form of
-transitionFrom<someState> and
-transitionTo<someState> that are always called when entering or leaving a state (unless the transition is invalid). It would also be great to get some
userInfo dictionaries passed around to store state, and maybe an optional
loggingDelegate. I haven't actually used the library yet, so I don't want to add stuff until I figure out what works and what doesn't.
The other technique I used to write this library is pure objects, which I've written about before on this blog. There are 4 classes in the library: SKStateMachine, SKSelectorConstructor, SKLlamaCaseConverter, and SKComponentSplitter. Each object is pure, requiring nothing but its initializer's parameters and outputting immutable objects. I took the pure object pattern to its logical extreme. Every method in every object takes advantage of an instance variable. Almost every method has no parameters. It's all messages. It's a refreshing and fun way to write code, if a little exhausting. It's readable, well-factored, and truly single-responsiblity.
Objective-C is an old language though, and it's not designed for writing many short objects like these. What are the pain points? There are a few: writing headers is very annoying; writing initializers is very annoying; Objective-C's policy of "no dot syntax unless it's declared as a property" is absurd; the ceremony around lazy-loading is annoying. The good news is that Swift fixes all of these issues except the initializer issue. If I have some read-only properties and an initializer that takes properties with those names, can't the compiler just write the body of that initializer for me? In fact, shouldn't initializers be limited to only that behavior?
When Swift is more mature, it'll be fun to write some of this code in a more modern language. The fundamental point of this project though, constructing selectors and calling them dynamically, isn't possible in Swift. Swift removes message-passing, and thus a lot of dynamic features. I'm curious to see if the simple interface for defining transitions (just define a method!) will make it easier to use state machines in more places.
January 7, 2015
Finite States of America
When writing object-oriented code, it's often much easier to create the objects that store stuff rather than the objects that do stuff. Objects that keep some data and their associated actions are more natural than those that model a process over time. However, we still have to write these workflow objects, since they'll encapsulate a lot of the business logic, flow logic, and complexity of our apps.
What makes writing a workflow object so tough is that it changes over time. This means that when you initialize an object that manages a workflow, you initialize it in an incomplete state. Some of the products of the workflow haven't been calculated yet, by necessity. This means that instance variables start out set to nil, and slowly take values over time. Sometimes, those variables are for values that aren't even products of the workflow! They're just flags, representing how far into the process we are.
How many times have you written code like this?
- (void)performAPIRequest {
if (self.request) {
self.request = [RequestFactory requestWith...
self.request serves to assure that we don't perform the API request more that once. It's acting as a cheap, shitty version of state machine. The longer-lived and complex your process is, the worse this becomes. The absolute worst is when this code is the view controller, polluting it with instance variables that have nothing to do with the management of the view.
The solution is simple: upgrade your cheap, shitty state machine to a bona fide, grown-up state machine.
A state machine is a construct that can have several states and defines the transitions between those states that are valid. For example, the
Initial state could transition to
Loading, which could transition to
Failed, or
Cancelled. Other transitions would be invalid.
In the literature, state machines are sometimes referred to as "Finite State Machines", "Finite State Automata", or, my personal favorite jargon, "Deterministic Finite State Automata". This nomenclature is scary to beginners, but it's not a complex tool.
When we define our states, they could be enumerations, but long-time readers of my blog know that I love to use polymorphism instead of enumerations. They give us the benefit of storing the information that each state needs within the state object itself, which I find particularly elegant. A concrete example: if we needed access to the
request (for example to cancel it), we could ask the state for it, and only the
Loading state actually needs to store that request. All the other states could respond to that message and return nil.
The above object might be reimplemented like so:
- (instancetype)init {
self = [super init];
if (!self) return nil;
self.state = [InitialState new];
return self;
- (void) performAPIRequest {
if (self.state.isLoadingState) {
Request *request = [RequestFactory requestWithSuccessBlock:^{
self.state = [CompletedState new];
} failureBlock:((^)(NSError *error)){
self.state = [[FailureState alloc] initWithError:error];
self.state = [[LoadingState alloc] initWithRequest:request];
[request send];
- (void)cancel {
self.state = [CancelledState new];
- (void)setState:(State *)newState {
[self transitionFromState:self.state toState: newState];
_state = newState;
- (void)transitionFromState:(State *)oldState toState:(State *)newState {
if (newState.isCancelledState && oldState.isLoadingState) {
[oldState.request cancel];
} else if (newState.isCompletedState && oldState.isLoadingState) {
//inform delegate of completion
} else {
[[InvalidTransitionException new] raise];
While this is a lot more code for such a simple thing, notice how much more it does than the first example. We've separated the object's path through the states from what the object actually does when transitioning to those states. We could add multiple
Failure states for the different ways we can expect this to fail. This explicitness is valuable, since it forces us to think about how our object transforms over time. Note the exception that's raised on an invalid transition. If there's ever a transition that isn't defined, the app will crash and you can easily determine why.
Since you have to define the states yourself, using a state machine is sometimes easier to hand-roll than to rely on a pre-packaged library. Nevertheless, such libraries exist.
The benefits of using state machines are myriad. First, explicitly storing the states and transitions that are valid in your system leaves fewer nooks and crannies for bugs to hide out in. It is said that bugs are just states that you haven't defined yet. If your object is defined by four booleans, it can be in 16 different states, all of which require testing. Imagine how many states it can have with integers, or strings! A state machine limits the number of possible configurations your object can be in, and defines them formally.
Having all of the transitions in one place will help you see the user's flow through the system. What happens if this step takes longer than expected? Clearly-defined transitions make it painfully obvious what happens if an event happens out of order. Since every transition flows through one point, it is trivial to log all of the transitions. You can use that information to determine how your object went off the rails.
Well-named states like these make it easier for new developers to quickly understand your system. Instead of asking "What does
self.request mean and why are we checking for its presence?", your new developer can immediately go to asking higher-level questions. State machines don't tend to be used until its too late, but good naming is valuable even if you have only two states.
You'll note that in the only example of architecture that Apple has presented (WWDC 2014 Session 232), they make great use of state machines. You can find the transcipt of that talk here, and the sample code on this page, under "Advanced User Interfaces Using Collection View".
Heraclitus said that you can never step in the same river twice. State machines take this implication and make it obvious in your objects. Start when your class is young, and take advantage of the explicitness of state machines to help you reason about the complex code in your system. It's never too early to make the jump from five poorly-managed instance variables to one beautiful state machine.


text:
So i've got an EditText which is disabled initially. When i press a button it enables it, and automatically opens the soft keyboard.
InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(etToDelete, InputMethodManager.SHOW_FORCED);
After i enter some text in it, i press the EditText which should make it disable again and hide the opened keyboard.
InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.hideSoftInputFromWindow(((EditText)view).getWindowToken(), 0);
BUT, what it does is very quickly close and then reopens it. MY GUESS is when you normally press an EditText it opens the keboard, so in this case even though i close it, it reopens it because of that :(
What is the solution? I've tried a couple of methods by which i stop the keyboard from showing when an EditText is pressed, but i was unsuccessfull, if someone could offer me a concrete example of how this should be made, i'd be grateful.

subset: commoncrawl


text:
Tags shoegaze, rock, noise
Genres shoegaze, indie, dream pop, alternative, indie rock (beta)
(flag as incorrect)
Artists Slowdive (beta)
April 03, 2009
Shoegaze & those influenced by it: The Jesus and Mary Chain, My Bloody Valentine and others.
MIX JUST FOR GRYANN by tapes
So many bonkers vocal tracks.
edm, electro, house, electronic, nudisco
Capture Creatures #2 Mix by tapes
Shinichi Osawa, Anamanaguchi, Mt.
chillwave, electronic, electro, dance, indie
Capture Creatures #1 Mix by tapes
Listened to a bunch of these tracks on loop while writing the first issue.
electro, electronic, party, chill, edm
Chill Electro II by tapes
A sequel to a mix my buddies liked! Stare directly at some palm trees.
electronic, electro, indie electronic, chill, chillwave


text:
Create a more secure iPhone passcode with special characters
Sure, you've got Touch ID set up on your iPhone 6, but you'll still need a passcode to keep your iPhone secure. If you have an older iPhone without Touch ID, or your fingerprint isn't recognized for any reason, you'll need to fall back on a passcode.
If you want to make your passcode even more secure, try using our recipe for a code with special characters instead of a simple number-based solution.


text:
Homes to rent
homes to rent
Be the first to know about new properties matching your search criteria
Shared accommodation
Let or let agreed
Refine search
Which would be the best area to purchase, buy and then let properties in the south-east part of Bristol?
Asked on Apr 10 2013,
General in Bristol
Secondary schools near Ashton Drive, Bristol
Asked on Aug 21 2011,
Schools in Bristol
Which estate agent should I choose?
Asked on Apr 15 2011,
General in Bristol
See all AskMe Q&A in Bristol
Ask a question
Get advice from local owners and experts


text:
Semantic Visualization
Twinword Word Graph aims to discover human thought patterns by direct participation of people.
Real-Time Applications
Choose from dozens of visualizations to transform real-time content into real-time experiences. You can easily change between application formats and create the environment that best fits the needs of your audience.
API for Developers
For developers that want to go beyond our out-of-the-box applications, all Twinword enterprise customers are also equipped with a full library of APIs, web and mobile SDKs, sample application code, current documentation and best practices.
What can Twinword API do?
Database and API of word associations ("Word Graph") is already being utilized by key partners in business, e-commerce and more that seek to go beyond simple keyword searches for more effective and relevant information retrieval.
• True context and topic extraction from digitized books and documents, web contents
Customers and Partners
Twinword is looking for business agents or partners who want to add our functionality or to build new unique applications utilizing our API. We want to grow with our valuable partners together.


text:
Hang tight!
Recipe by Duncan Hines® Canada
"These raspberry filled cupcakes, topped with white chocolatey raspberry frosting, have a surprise in every bite."
Hmm. None of these ingredients are on sale today.
Show ingredients on sale
Sort stores by
Save money at local stores when ingredients are on sale!
Watch video tips and tricks
1 (16.5 ounce) package
Duncan Hines® White Cake Mix
large egg whites
2 tablespoons
vegetable oil
1 1/3 cups
1 (16 ounce) can
Duncan Hines® Frosting Creations™ Frosting Starter
1 (3 gram) packet
Duncan Hines® White Chocolate Raspberry Flavour Mix
1/2 cup
raspberry pie filling
White chocolate curls
I was the worst most artificial frosting I ever tasted and it is sickeningly sweet and doen't taste like raspberry or white chocolate. The kids ate them.
2 Ratings
Celebrate Passover with Jewish main dishes, desserts, and traditional holiday foods.
Choose your Easter dinner main dish from hams, savory lamb, and over 150 more recipes.
Delicious recipes, party ideas, and cooking tips! Get a year of Allrecipes magazine for $7.99!
Moist carrot cupcakes with a cream cheese and white chocolate frosting.
Make this creamy white chocolate raspberry cheesecake.
Discover what the smoky taste of bacon can do for dark chocolate.


text:
Parrotia Persica
RedBird_TNApril 12, 2013
I am looking into planting a Parrotia Persica (aka Persian Ironwood) tree in my yard. Does anyone have experience with this tree in TN? (I am in the Knoxville area.)
Also, I have only been able to find two sources for the species - Lazy S and Forest Farm (out of stock at FFarm) -- do you know of any other sources, particularly for the cultivars?


text:
At the start of this year's 365 project I was wondering whether consecutive 365's was a wise idea. After all, I'm still doing the same routine I had for most of last year. It's definitely going to be more of a challenge this year. But hey, I've got to try it. And I've learnt a lot since completing the last one. Continue reading Project 365: January 2015
Category: Project 365
Project 365: 2014 – December
Just like that, Project 365 2014 is over! December's rolled around and been out incredibly quickly. That's what happens when you have a non-stop month. Standard for the month of Christmas and all. Continue reading Project 365: 2014 – December
Project 365: 2014 – November
It's been a quiet November here at the blog and for me personally. A combination of nothing at all happening and then everything happening at once.
For the first couple of weeks I was waiting for the man to come back from his work trip to the States, where he had been for just about a month. So that waiting part can definitely be classified as the quiet part of the month. A few days after his return my folks came over for their first ever visit to Bahrain. And that'll be the everything happening at once part of November. Continue reading Project 365: 2014 – November
Project 365: 2014 – October
Oh hey, November – you're here already? I wasn't expecting you so soon. See, I thought October might have been a bit longer. Well, as long as you're here, stick around, won't you.
The weather has finally started cooling down! The couple of weeks in October were lovely. Sure, it's still in the low 30s during the day. But the evenings have been lovely. Nothing better than sitting on the balcony with a couple of beers, chatting the night away. Continue reading Project 365: 2014 – October
Project 365: 2014 – September
September. The month traditionally known for the end of summer and the start of autumn. Except in Bahrain where it's October and still pretty damn hot outside!
The month itself has been business as usual with no major excitement. Honestly, these highlights are going to be a bit dull this month! Continue reading Project 365: 2014 – September


text:
Suncrest Cottage B&B
No availability found through our partners. Please contact the business directly or check some of our recommended alternatives.
How has this b&b rated in the past?
- Suites
- Continental Breakfast
- Free High-Speed Internet
- Wheelchair accessibility
- Kitchenette
- Free parking
Photos of Suncrest Cottage B&B
Travelers also recommend:
- More recommendations
TripAdvisor Reviews Suncrest Cottage B&B Saltspring Island
Travel Blogs from Saltspring Island
Robson street
... to Earls just down the road, most restaurants close by were Asian cuisine, not Tabitha's favourite choice. So Earls is good with its normal English/American food. With a good bite to eat we headed back to the hostel to prepare for tonight. We had got tickets to a Vancouver giants game, a western hockey league team. They were playing the Tri-City Americas, unfortunately lost 3-0. Such a good sport to watch though, more impressive ...
Well thank God I am so good on my feet
I got persuaded to teach some locals how to Scottish Dance last night. I am sure this would have been slightly more productive if I actually knew how to Scottish dance.. However my incompetence went mostly unnoticed as I taught the Canadians a dubious at best Strip the ...
The direction is East!
... 2,800 mo mmmmm winter is coming!
Monday - we decide to take a city tour - all the highlights although the guide has such a strong German accent even I really have to pay attention or lose track completely!
Although we would like to go to the Aquarium by the time we find some lunch it is just too late - we eat at Whole Foods that place really is toooooo health!! walk home by way of English Bay and the 'laughing' scuplture ear the hotel..end the ...
Day one in Sunny Vancouver.
Arrived safely after a really good flight. Full plane but still managed some sleep thanks to my wonderful pillow!
Grant and Rocky were at the airport to meet me. Went to Rocky's place and had a beautiful dinner of BBQ salmon. Yum! Zach and Spencer came too so time for a good catch up.
I'm tired so not writing any more. Hope to get back in a couple of days. Have a look at Zach's facebook!!!
Much love, Ma/Averil. ...
... It almost felt like being back in Blighty as we handed over money with our queen's face on it to buy our fish and chips. Even the weather was like being by the sea back home, sunshine through grey clouds and a bit windy.
The rest of the day was spent walking along the seawall past shiny high-rise flats and expensive yachts while watching sea planes land and take-off. Further along the coast we reached Stanley Park where ...


text:
Today i have been on suboxone about 2 weeks. I want to quit and go back a normal lifestyle. I was taking about 4-8 mg a day for about two weeks. Anyone have any suggestions for quitting. I'm ready to do it. Should i take a little bit to wean off or just quit cold turkey. God Bless, thank you,,
|Question is Closed
|Report Mark as Favorite
Answers (3)
29 Nov 2007
First off CT'ing from subs will be awful. DONT DO IT Wean down in dose every 3-5 days... if your at 6 mgs then start taking 5mgs for your next dose... do you dose once or twice a day?? if you dose once you may want to start taking 2.5 in the morning and then another 2.5 in the afternoon... read my post about my story... it tells how iwent from 16mg to where i am now... 25
You can do this
29 Nov 2007
I just read your story and i'm so happy for you too. I'm glad that i was only taking 4-8mg daily of suboxone. i think i'm going to take about 4-3mg tommrow. Then wether it is 4mg or 3mg i will cut down another mg in 3 days then go from there. I'm looking forward to being all the way clean!! I already feel great and i feel free from my vicodin addiction. :) :D
Search for questions
Still looking for answers? Try searching for what you seek or ask your own question.
Similar questions
My boyfriend is addicted to pain pills, how can I help? Best methods to quittting?
My boyfriend has been addicted to pain pills for quite some time now, probably three years or more. I did not know about it for a long time until it ...
1 answer • 29 Oct 2009
What should I do with my pain med addiction?
I have been clean for a total of 5 days, I found 3 suboxones to assist me through my quitting these. Before I quit I had realized I spent over $2,000 ...
1 answer • 19 Feb 2010
Is it possible ive induced and stabalized on only 2 m suboxone?
So I've been tossing back and forth about using suboxone for detox again, because last year this time I had used it just as the doctor had ...
3 answers • 14 Mar 2011
I have been taking suboxone for 3 months. I would apprecriate some advice on how to taper off?
I have been taking 8 to 16 mg a day for atleast two months straight and around 4-8 mg on and off the month before that. I want to be completely off ...
4 answers • 6 Jun 2011
I have been on suboxone for approx. 6 months, I was prescribed 18mgs a day but I have only been?
taking 4 mgs a day, what would be best- quitting cold turkey or to continue to reduce my intake of suboxone until i dont take it anymore. i WANT to ...
3 answers • 19 Aug 2011


text:
When i bought my brew equipment, the kit contained a glass carboy and a plastic "bottling bucket." The bottling bucket has a whole on the bottom where i put a spicket so i can fill bottles easier. Could i still use this bucket as a secondary fermenter, so i can free up my carboy for my next brew?
And what are the benefits of using a secondary fermenter? I know it can clear up your beer a bit, but other than that is it really worth it?
I don't use a secondary fermenter unless I am adding fruit or dry-hopping. I just leave the beer in the primary until it's ready to bottle. I have nice and clear beers.
Secondary if your brew is going to ferment for more then 5 weeks. Like stouts. Buy another bucket and use the bottling bucket for bottling. By alot of buckets. I have 1 plus 4 carboys.
I dry hop in the primary. Make it easy and fun.
You will be better off in the long run to buy another fermenter.
Back Nine Brew&Wine
Life don't get better than a beer and a pepper.
What I am brewing is now a mystery
Sure you can use that as a secondary if you wish but I rarely secondary myself unless dry hopping. Just bottled a Triple that was in primary for 6 weeks, tastes great so far. Buckets and spigots are cheap enough, I have them in 5, 6, and 7 gallon sizes. Obtain or make an inverse pickup for the inside and you're all set. Good luck.
I would not use the bottling bucket as a secondary unless you are going to rack the beer from it before bottling. When bottling you need to make sure the sugar solution is thoroughly mixed. If you did that in the bottling bucket that you had done a secondary in, then you would end up stirring up all of the yeast that had settled out.
Now that being said, one could still do this, and just live with the extra yeast. It will settle out relatively quickly in the bottle. One of the point of the secondary is aging away from the bulk of the yeast, which will be accomplished by this. Some folks prefer the flavors of beers aged on the the yeast, some prefer beer aged off of the bulk of the yeast If you don't mind that the beer might not be quite as clear, then it would be okay to do as you propose
I wouldnt use the bucket as a secondary, it'll have too much headspace. it's fine to use as a primary tho, I do it all the time. then of course, you'd need another bucket for bottling, so may as well just buy another.
"I would not use the bottling bucket as a secondary unless you are going to rack the beer from it before bottling." pjj2ba
That's a good point. I had just assumed that he would do so.


text:
'Crushed Baseball 2004' (NGC/PS2/GBA) - Facts & Screens
by Rainier on Oct. 24, 2002 @ 9:51 p.m. PDT | Filed under News
BAM! Entertainment announced today that it will publish Crushed Baseball 2004, a one-of-a-kind baseball game for next generation and handheld consoles. Currently in production at Seattle-based Amaze Studios, Crushed Baseball 2004 will offer over-the-top characters, superhuman abilities and amazing special effects. The game will be available for Sony PS2, GameCube, and Game Boy Advance. All are scheduled to release just in time for the 2003 baseball season next March. We got a few screens for you to check out ..


text:
I just made a big batch of lobster stock and I am looking for ways to incorporate it into dishes. I know about use in risotto, mashed potatoes, and chowder... Any other ideas out there?
Lobster bisque!
My mom uses to make lobster Newburgh with leftover lobster...maybe you could use the stock to make a velouté of sorts, add shrimp or lobster or crab or really anything seafood-y, mix it with the sauce and make it a pot pie or serve it in a puff pastry shell..? Might be more work than is reasonable but now I'm craving lobster!
|Please enter a quantity larger than 0.
Sorry, this item is currently out of stock.
Notify me when it's back. Submit Thanks! We'll email you when it's available again.
|Secure Transaction


text:
Sign in now to view, license and download this image or contact us to see this image without a watermark. Want to embed this image on a non-commercial website or blog? Learn more.
Similar imagesView all
Front View Of Fireplace With Sofa In The Foreground Stock PhotoHeat - Temperature,Electric Lamp,Living Room,Light - Natural Phenomenon,Illuminated,Fireplace,Electricity,No People,Indoors,Table,Fire - Natural Phenomenon,Hotel,Sofa,Luxury,Bedroom,Carpet - Decor,Color Image,Luxury Hotel,Medium Group of Objects,Photography,SquarePhotographer George DoyleCollection: Stockbyte


text:
Ordered it on the 5th... came on the 9th. That was including the fact they where out of one product and had to substitute it for another. OMG, if you...Read More ->
Many things I'm thankful for 1. Woohooo free shipping means i get to perform different kinds of magic instead of spending money to get the goods...Read More ->


text:
ALSTOM India Interview Questions
Interview Experience
Interview Experience
Getting an Interview
Getting an Interview
Interview Difficulty
Interviews for Top Jobs at ALSTOM India
- Senior Engineer (3)
- Graduate Engineer Trainee (3)
- Lead Engineer (2)
- Engineer (2)
- Human Resources Manager (1)
- Project Engineer (1)
- Graduate Trainee Engineer (1)
- Design Engineer (1)
- Unsure (1)
- Project Controlling (1)
- Young Engineering Graduate (1)
- Group Head (1)
- Commissioning Engineer (1)
- IT Engineer (1)
- Intern (1)
Candidate Interview ReviewsSort: Popular Date Difficulty
1 person found this helpfulApplication Details
I applied through college or university. The process took a day – interviewed at ALSTOM India in August 2014.Interview Details
After the shortlisting 23 candidates through written test the personal interview consisted of two people an HR individual and a technical guy they asked questions about yourself, family background the technical questions were mainly from the training and projects which i did in my 3rd yr of engineering they also asked my favourite subject and then asked a few questions from itInterview Questions
Reasons for Declining
- Not any in particular but were keen to know how did you apply your knowledge of engineering in your training View Answer
They offered package of 5 in bangalore or in other metros which didn't fulfill my demandsDeclined OfferPositive ExperienceEasy Interview
- Application Details
I applied online. The process took 2 weeks – interviewed at ALSTOM India.Interview Details
2 Phone calls from HR, 3 interviews interviewed with HR and department manager. Received no call back, inquired myself and said that I did not receive the job. and a letter.Interview Questions
No Offer
- Where do you see yourself in 10 years? Answer Question
- Application Details
I applied online. The process took 1+ week – interviewed at ALSTOM India in May 2014.Interview Details
The initial communication with the HR underwent multiple rounds before I was called for the interview. At the interview location I had to wait a long time before I was even called for the interview.
The security person who took me in was unsure of where I had to be seated.
After a while the interviewer found me and the interview started.
I was not offered refreshments or a chance to freshen up
The interview questions were standard and it was at the end of the interview when I asked for a glass of water and was given itInterview Questions
No OfferNegative ExperienceAverage Interview
- Design a chess board with just 3 classes Answer Question
- Application Details
I applied through a staffing agency. The process took a day – interviewed at ALSTOM India.Interview Details
It was a HR cum Technical interview, HR asked standard questions for 20 minutes, then a technical round with two senior engineers of the Electrical department followed by a final interview by business directorNegotiation DetailsQuite normal, salary was not negotiable as I was coming from a Govt. organization where CTC concept was not applicableAccepted OfferPositive ExperienceDifficult Interview
- Interview Details
firstly there will be gd about 10 people will sit in gd that person will be selected who speaks reasonable points and show some leadership qualities and who dos not get exited while gd
then the person selected will enter interview roundInterview Questions
No Offer
- what is your aim in life ? Answer Question
- Application Details
I applied through a recruiter. The process took a day – interviewed at ALSTOM India.Interview Details
First they will call for telephonic interview, then will have a couple of technical rounds. then HR interview.Interview Questions
Negotiation DetailsI didnt negotiated, Perhaps every one should.Accepted OfferPositive ExperienceDifficult Interview
- Why you want to join this company. Answer Question
- Application Details
I applied through other source. The process took 2+ weeks – interviewed at ALSTOM India.Interview Details
Walk-in and well interviewed by the APIL team. Well formatted questions, unncessary questions are generally avoided. Selection panel is generally goodInterview Questions
Negotiation DetailsThere is a slight room for negotiation. It depends on how important that position is and how well you market yourself.Accepted OfferPositive ExperienceAverage Interview
- Nothing important Answer Question
- Interview Details
Step 1: On Line Technical Aptitude Test
Consisted of two sections. Section one consisted of questions from physics of class 12th. Section two consisted of questions from engineering curriculam.
Step 2: Group Discussion
General Topics were given like your views about country etc.
Step 3: Personal Interview:
sometimes exhaustive. More consisting of technical. Its important to discuss training and projects you did in past.
Its more important to know your subject of interest in depth rather than having shallow and wide knowledge.Interview Questions
Accepted OfferPositive ExperienceAverage Interview
- Discussion of design of Heat Exchangers (LMTD and NTU) and the process of NDT used in testing of tubes in steam fired thermal power plant boiler. Answer Question
- Application Details
I applied through college or university. The process took a day – interviewed at ALSTOM India in September 2012.Interview Details
3 parts- power, grid, transport. grid profile not open. 3 rounds:
1) written - online, 60 min, 60 questions - 30 tech + 30 aptitude
2) gd - basic topics, eliminative
3) interview - pure tech. focus on knowledge and presentationInterview Questions
No OfferPositive ExperienceDifficult Interview
- which is your weakest area in electrical? how will you use it to your strength? View Answer
- Application Details
I applied through a staffing agency. The process took 3 days – interviewed at ALSTOM India in September 2011.Interview Details
1.telephonic confirmation
4.management interview.Interview Questions
Negotiation DetailsnothingAccepted OfferPositive ExperienceAverage Interview
- how would you react to a very senior official who has accused you of a mistake not actually done by you and humiliated in front of all. View Answer
Is this helpful? The community relies on everyone sharing – Add Anonymous Interview Review


text:
HR's Seat At the Table
Course and Toolkit - Replay Access
Eager to claim your seat at the table or better leverage the one you have? Gain online access to this 6-week webinar series that will build your strategic Human Resources Business Partner (HRBP) capabilities.
You will also receive the Business Partner's Toolkit with practical tools you can use with your leaders and teams right away.
Course Topics:
- Learning the Business
- Communicating with Confidence
- Effective and Appropriate use of Influence
- Building Trust and Credibility
- Systems Thinking & Strategic Planning
- Managing Organizational Change
Each 90-minute training features a typical HRBP challenge as a case example to illustrate teaching point and practical solutions.
Taught by: Business Consultants & Executive Coaches, Stephanie Hartman and Dana Meyer
Cost: $397 Individual Access. $1250 Group Access.
If you are a Friend or Student, email either presenter to request the discount code.
HRCI Credits: Pre-approved for 9 Business (formerly Strategic) credits
Register for classes in 2 steps:
1) Complete the registration form through this link: REGISTRATION LINK
2) Pay with Paypal
Contact for questions:
(541) 490-3363, firstname.lastname@example.com
Own Your Future
Do you want a compass for running your business? Develop one at this intense 2-Day Strategic Planning Workshop.
January 27, 28, 2015, 9am – 4pm
January 29, 30, 2015, 9am – 4pm
Your business is surviving, but at what cost to your mind, body, and relationships? A catalyst enables a significant business reaction to proceed at a faster rate or under different conditions than otherwise possible. Are you ready for a catalyst in achieving an amazing, not too distant future?
What: "Start to finish" 2-day Strategic Planning workshop for a fraction of the cost that big businesses pay for this exact program. You and your business "thought partner" will develop a compass for running your business. First time participants will have support to create work products from scratch. Past participants will revisit and update their work products.
Day One:
- Clarify your organizational identity (values, mission & core)
- Dream and describe an inspiring future (vision and milestone timeline)
- Analyze the current state (internal strengths & weaknesses, external opportunities & threats)
Day Two:
- Set near-term goals
- Draft strategies to achieve the goals
- Establish a structure for accountability
Cost per business: Earlybird (til Dec 31) rate is $295. Jan 1, cost is $345. Includes breakfast & lunch on both days, tuition, and overnight accommodations at the Balch (Traditional Room – queen bed). Dinner, beer & wine available for purchase at Balch-very reasonable.
Limited to 10 businesses. Up to 2 people per business may attend. If you're a Solopreneur, bring a business thought partner (friend, sibling, mentor, spouse).
Where: You'll be staying at the Historic Balch Hotel in Dufur, Oregon. We'll have the hotel privately which will make for a productive, distraction free workshop! Staff at the Balch will pamper you and support your strategic planning needs. Schedule yourself a massage to assist in creating a great "working getaway"!
Register in 2 steps:
1) Mail tuition check prior to the workshop to 202 Oak Street, Suite 100, Hood River, OR 97031
2) Complete the registration form through this link
Contact for workshop questions: (541) 490-3363, email@example.com
Contact for accommodations questions: Historic Balch Hotel 541-467-2277
Communicate with Confidence
What: In this interactive class, participants will learn some of the Psychology behind communication and walk away with tips for improving their communication skills with customers, employees and business partners.
"I had many "aha moments" in Stephanie's power-packed 3-hour communications class. I left feeling better equipped to handle both personal and professional situations more effectively!" Mary Bokovoy - Hood River ReDesign
"Stephanie brings great insight and experience to her classes and connects really well with her audience. She delivers corporate-level tools and ideas in ways that make them accessible to small businesses." Faith Keolker - Hearts of Gold Caregivers
Cost: $90
Class size is limited to 12
May 5, 2015, 9am - noon 202 Oak Street, Suite 100, Hood River, OR
May 12, 2015, 9am - noon in Portland (specific location TBD)
Register for classes in 2 steps:
1) Complete the registration form through this link
2) Mail check to 202 Oak Street, Suite 100, Hood River, OR 97031
Making the Leap
What: Making the Leap is a 4-day intensive that equips effective coaches, consultants, facilitators, trainers and advisors, for launching their own successful consultancy.
Learn from my mistakes, success, and research. In addition to loads of samples, you will walk away with your own strategic plan, menu of services and products, business development strategy, and a sustainable approach to work.
Sound like all work and no fun? No way. In addition to the power-packed daily agendas, this program includes Gorge outings and meals at acclaimed restaurants.
When: September 23 - 27, 2015
9/23 Welcome dinner. Workshop 9/24, 9/25, 9/26 and 9/27.
Where: Catalyst office at 202 Oak Street, Suite 100, Hood River, OR 97031
Who: This program is for professionals who plan to launch or have recently launched their own coaching or consulting practice.


text:
March 1, 2006
The Power of Compassion
They were ordinary people doing extraordinary things'and many victims of Hurricane Katrina are better off because of their generosity.
March 1, 2006
The Shelter Shuttle
Katrina evacuees in Austin, Texas whose pets were being cared for by the Austin Humane Society were able to visit with their animals thanks to a special shuttle service arranged by the city.
March 1, 2006
Riding Out the Storm
When Hurricane Katrina hit at the end of August, horse expert Allan Schwartz got on the road to meet up with The HSUS Disaster Animal Response Team in Mississippi.
May 1, 2005
A Recipe for Disasters
Preparation, flexibility, and good ???people care??? helped animal shelters in Florida weather the storms that pummeled their state repeatedly last summer. In this article, they provide tips on how you can prepare for unexpected crises, too.
February 15, 2005
The Road to Recovery
Flooded by Katrina's storm surge, the Humane Society of South Mississippi gathers strength and moves ahead.
July 1, 2004
The Politics and Benefits of Engagement
In this interview with Animal Sheltering, new HSUS CEO Wayne Pacelle says we aren't going to win the hearts and minds of the nation until we engage people in our cause.
July 1, 2003
Although a recent study on a Florida spay/neuter program for feral cats wasn't able to identify the program's precise effects, the results published in the Journal of Applied Animal Welfare Science (Vol. 5, No. 4, 2002) suggest that a feral cat trap-neuter-return program can be an important facet of a community strategy to fight pet overpopulation.
May 1, 2003
Serving Up Compassion at Shelter Events
???Food for Thought??? campaign asks shelters to go veg at fundraising and outreach functions.
May 1, 2003
Putting Your Money Where the Humane Label Is
Humane Farm Animal Care, a new nonprofit certification and labeling program for products made from humanely raised animals, is seeking shelters??? help in encouraging conscientious consumption.
March 1, 2002
Providing Shelter from the Storms... and the Fires and the Earthquakes
Whether they???re local Red Cross employees or municipal managers, officials who are used to preparing humans for potential disasters are discovering the benefits of linking up with animal shelters to protect pets, too.


text:
Feeder Tickets
South Wales rockers Feeder have had an impressive music career spanning more than 15 years. Achieving mainstream success with 2001 hit album 'Echo Park' and possibly their best known track 'Buck Rogers', Feeder gained extensive radio play and became regulars on the festival and touring circuit. Hits from acclaimed fourth album 'Comfort in Sound' and 2008 album 'Silent Cry' are also sure to be popular. The rockers remain a hot live prospect, so get your Feeder tickets now.


text:
Pegasus Suites
No availability found through our partners. Please contact the business directly or check some of our recommended alternatives.
How has this hotel rated in the past?
Photos of Pegasus Suites
TripAdvisor Reviews Pegasus Suites Imerovigli
Travel Blogs from Imerovigli
Santorini lives up to the hype
... br> We both felt that we could happily have spent a couple of weeks in Santorini, not just to relax and enjoy the sun and the views but also to explore the island's amazing historical heritage (back to the Bronze Age and as a trading post for the Minoans).
Eventually it was time to return our car to Fira and head for the cable car. We were starting to feel confident despite the narrow roads etc, when a bus in a tight spot decided to back 'over us'. ...
The dragon does indeed puff
... Anyway, it was brilliant motoring across. The sea is bright blue and so clear. Our captain/guide who didn't speak a whole lot of english, dropped us at a pier and pointed upwards, muttering the words "volcano, back in an hour". Being the eternal optimists we are, we took that to mean that the extinct volcano was up there and he would be back in an hour. The alternative interpretation is now blindingly obvious. Anyway off we trekked, Alex leading ...
Possibly NOT the Smartest Choice
... up a nice amount of sulfur-smelling laden steam. So some photos and back we go to the boat. The boat was only 5 minutes late in leaving the island and happy to say that I wasn't the last up or the last down. Good for me.
Around to the next island and she's announcing that to swim, you must jump in and swim towards the brown colored water to get the warm hot springs water. She said that the water in the blue/green sea was around 16C ...
Heaven on a cliff
... around a lot of the places in the Med. and unfortunately my camera seems to be playing up and not focusing very well. Could have something to do with the fact that it was dropped by accident. I will try one day soon to put some photos on these blogs but it seems like I can only put one at a time.
We have seven ports in a row so don't know when my next blog will be.Keep well everyone.
love your ...
Istanbul to Santorini
Well our last day of our tour of Turkey has arrived. We were able to have a nice sleep in this morning with no wakeup call at 6.00am. Went down and had a leisurely breakfast and a final chat to some of our travelling companions who were being picked up at various times during the morning – our pickup time was 1.00pm Had time to go through our bags and have a throw out of the various papers ...


text:
Legislature should enact Voting Rights ActThe time has come for the Legislature to approve the Washington Voting Rights Act.
Don't miss
How to create a more vibrant, safe University District
Vance and Eyman debate: Should the cap on property taxes be lifted?
It would be cruel to move Seattle's elephants to Oklahoma City Zoo
Obamacare should be less complex
Let's start on an upbeat. Next to what we had before, Obamacare has been a spectacular success. The Affordable Care Act has brought medical security to millions of previously uninsured Americans and has helped slow the rise in health-care spending. But the health reforms would have been more spectacular had they been simpler to follow...
- Sleep and meditate your way to success | Ann McFeatters / Syndicated columnist
- In defense of the dead-end job | Richard S. Davis column
- The sun is rising on solar panels, and there's no fighting it | Froma Harrop / Syndicated columnist
- A woman's place is on the $20 bill | Gail Collins / Syndicated columnist
Northwest Voices
Grizzly bears: Educate yourself before heading into bear country
I am an avid hiker and backpacker, and frequent visitor to the North Cascades. Having encountered grizzly bears in the North Cascades, and behaving circumspectly during the encounter, I have no hesitation in continuing to visit the area . I believe it is important to find out as much as I can about how to...
- GOP budget trickery: No surprises here | Letter to the editor
- Port Shell lease: Don't dismiss symbolism | Letter to the editor
- Starbucks and race: Starting a conversation | Letter to the editor
- Trans-Pacific Partnernship negotiations are an undemocratic process | Letter to the editor
- Grizzly bears in the North Cascades would discourage recreation | Letter to the editor
Featured Comment
"Whether it's ideology or political expediency that keeps Republicans dancing around the elephant in the room, party time is over."
Comment by Letter writer David Chapin on Climate change: Legislature needs to get with the times and take significant steps
Guest columnists
- Make payday lending better for short-term help | Guest columnists
- Syrian refugee crisis outstrips international aid | Guest columnist
- Children need plenty of nature play and outdoor learning | Guest columnist
- A modest proposal to restore local control of $40 million from No Child Left Behind waiver | Mark Mullet and Jamie Pedersen guest column


text:
Superhero Store
Learn How
CBM Index
Black Panther Home
News Archive
Chadwick Boseman On Initial BLACK PANTHER Rumors, Solo Movie, Robert Downey Jr. And More
Black Panther
star says he has yet to try on his costume, and also discusses how he fell in love with the character, early rumors of his involvement, his first time meeting Iron Man., and much more!
Chadwick Boseman Talks Prepping For 'Black Panther' Role In CAPTAIN AMERICA: CIVIL WAR
Without going into great detail, Chadwick Boseman has discussed how he's currently preparing for his debut in the Marvel Cinematic Universe as Black Panther, and also how he celebrated the role.
Kevin Feige
The Man Who Forever Changed Superhero Movies Will Change Them Once Again Starting With The Black Panther.
Black Panther "Finally Get's His Movie"
"This King Will Rule The Marvel Movie Kingdom"
Chadwick Boseman Says Marvel Is Trying Something "A Little Different" With BLACK PANTHER
Here we have the first comments from Boseman since the surprise announcement that he'd be playing T'Challa last week. The actor describes the feeling of being on stage for the reaction, and also acknowledges Wesley Snipes as being the first black actor to lead a superhero franchise with
Robert Downey Jr. Says Marvel Is 'Forward-Thinking' with BLACK PANTHER And CAPTAIN MARVEL
Including new (and very brief) thoughts from Chadwick Boseman on playing the Black Panther, check out what Robert Downey Jr. says about the growing diversity within the Marvel Cinematic Universe!
Everything Chadwick Boseman Ever Said About BLACK PANTHER
Here's everything Chadwick Boseman has ever said about
Black Panther
prior to Tuesday's official confirmation from Marvel Studios. Can you discern how far trail goes back? When did fiction become fact? Read through Boseman's words make your best guess.
Meet The Man Who'll Play Marvel's BLACK PANTHER, Chadwick Boseman
Two of the most exciting announcements made by Marvel yesterday were not only confirmation that we'd finally be getting a
Black Panther
film, but that they'd chosen the actor who'd bring him to life on the big screen. After the jump you'll find all you need to know about Chadwick Boseman.
BLACK PANTHER: A Dire Fan's Theory
The Crown Prince of Wakanda has finally been confirmed. But how does Marvel plan to bring him into the fray? Take the jump for my theory.
BLACK PANTHER: How Many Movies Has Chadwick Boseman Signed On For With Marvel?
Marvel are famous for getting actors to agree to lengthy nine-picture deals, but how many has
star Chadwick Boseman been roped into as their
Black Panther
? Well, Deadline have the scoop on that and you can find the details right here. Hit the jump to check it out!
Kevin Feige Talks CAPTAIN MARVEL, INHUMANS, DOCTOR STRANGE, BLACK PANTHER And More
Hit the jump and check out what Marvel Studios president Kevin Feige had to say about the newly-revealed Phase Three lineup, which includes
Thor: Ragnarok
, among several others!
MARVEL Announces BLACK PANTHER, CAPTAIN MARVEL, THOR: RAGNAROK & INHUMANS
Marvel Studios has finally revealed release dates for
Black Panther, Captain Marvel,
The Inhumans
, as well as an official title for
Thor 3
. Check out the goods after the jump!
Minority Heroes Lost Destination to Marvel's Cinematic Universe
BOARDWALK EMPIRE's Michael K. Williams Wants That BLACK PANTHER Role
The latest actor to throw his hat in the ring to play Marvel's King of Wakanda is
Boardwalk Empire/The Wire
actor Michael K. Williams, who is quite confident that he will play a part in Marvel Studios' next phase of films in one form or another.
Denzel Washington Talks Playing A Marvel Character; Thoughts On The BLACK PANTHER
Actor Denzel Washington, in a recent
, told if Marvel studios ever came to him for a role. Also he discussed his curiosity toward playing a Marvel character in a future film. Hit the jump to check it all out!
EDITORIAL: 8 Things I'd Like To See In A BLACK PANTHER Film
Black Panther is my favorite comic book character EVER!!!! It's a matter of time he gets a movie. These are 10 things I want to see in this movie (in no particular order) and I hope you agree with them all!!!
Kevin Feige On BLACK PANTHER & CAPTAIN MARVEL Movies
The fans have been asking for a long time to see fan favorite superheroes like Black Panther and Captain Marvel hit the big screen, and President of Marvel Studios admits he gets asked this question a lot more than he does about
Avengers 3
Wakanda Bound? Chadwick Boseman Mentions 'Contracts' While Again Playing Coy About BLACK PANTHER Casting
The actor, who has been rumored to be in talks with Marvel Studios to play the titular character in a Black Panther film may have just given the first concrete evidence that talks with the studio have not only occurred, they've gotten serious.
Chadwick Boseman Laughs Off Rumors About Him Playing BLACK PANTHER
Yes, he denied the question about him playing
Black Panther
in an upcominng Marvel film. Does that mean what we think it means? According to Boseman it "is not out of the question" Hit the jump to check it out!
BLACK PANTHER: John Boyega Says He's Booking A Flight To Wakanda
Is actor John Boyega, breakout star of
Attack the Block
and lead in J.J. Abrams upcoming
Star Wars: Episode VII
set to play Black Panther for Marvel Studios? Check out the hint from Boyega himself after the jump.
Page 2 of 8
Place your ad here
BLACK PANTHER Trailer
BLACK PANTHER Trailer
More Videos
ComicBookMovie.com Home
What are Fansites?
Fansite List
RSS Feed
Site Map
Advertise With Us
Super Hero Posters
Video Game News
Copyright Policies
Trademark Policies
© 2003-2015 Best Little Sites, LLC. All logos and images used on this website are registered trademarks of their respective companies. All Rights Reserved. Some of the content presented on our sites has been provided by fans, other unofficial websites or online news sources, and is the sole responsibility of the source from which it was obtained. Best Little Sites is not liable for inaccuracies, errors, or omissions found herein. For removal of copyrighted images, trademarks, or other issues,
Contact Us


text:
You are using an outdated browser. Please upgrade your browser to improve your ReverbNation experience.
Manager: Benjamin Williams
Bio: SilverString Recording is an independent project studio in Brunswick Ohio run by Benjamin Williams (myself), a musician and Recording Arts Major at Tri-C.
My studio is specifically designed for independent or unsigned artists wishing to record their music at affordable rates.
I believe that ...See Full Bio
Posted a new song: "Sufficient Grace // Lock the Door" http://www.reverbnation.com/q/4wody7 #music