git with t for teams

186
GIT TEAM WITH T FOR @svenpet

Upload: sven

Post on 08-Sep-2014

6.166 views

Category:

Technology


0 download

DESCRIPTION

Git is not just a version control system. Git can change the way you interact with your team members. Lot’s of teams don’t think about reflecting their development workflow in Git and just use it out-of-the-box. Git, however, can be much more powerful, giving your team a boost in productivity, protecting your delivery pipeline and helping you to work better together. In this session we will start with a central workflow that is used by a lot of Subversion teams. You will learn how to practically integrate ALM solutions like continuous deployment, code reviews, change tracking and much more into your individual workflow. You will find out how to protect your master branch from accidental commits, broken builds and unreviewed code. This presentation will help you discover the best way to work together as a team – whether you’re yet to migrate to Git or even an experienced Git user.

TRANSCRIPT

Page 1: Git with t for teams

GITTEAMWITH T FOR

@svenpet

Page 2: Git with t for teams

SVN

Page 3: Git with t for teams

GIT

Page 4: Git with t for teams

MERCURIAL

Page 5: Git with t for teams

CVS

Page 6: Git with t for teams

ANYTHING ELSETFS Perforce ClearCase VSS

Page 7: Git with t for teams

NO VCS AT ALL?

you must love pain

Page 8: Git with t for teams

CHEAP BRANCHINGEVERYTHING IS LOCAL

GIT IS FASTGIT IS SMALL

THE STAGING AREADISTRIBUTED

GITHUB & BITBUCKETGIT IS THE NEW STANDARD

HUGE COMMUNITY

GITWHY IS GOOD*?

* from Lemi Orhan Ergin

Page 9: Git with t for teams

GITWHY IS GOOD*?

CHEAP BRANCHINGEVERYTHING IS LOCAL

GIT IS FASTGIT IS SMALL

THE STAGING AREADISTRIBUTED

GITHUB & BITBUCKETGIT IS THE NEW STANDARD

HUGE COMMUNITY

WORKFLOW CAPABILITIES

* from Lemi Orhan Ergin

Page 10: Git with t for teams

MASTER RELEASEVERSION 1.9

DETAILED VIEW

Page 11: Git with t for teams

BIRDS VIEW

Page 12: Git with t for teams

DESIGNED FOR OPEN SOURCE

Page 13: Git with t for teams

DISTRIBUTED WORKFLOW

Page 14: Git with t for teams

CENTRALIZEDWORKFLOW

companies like those

Page 15: Git with t for teams

@svenpet http://svenpet.com

Sven PetersATLASSIAN AMBASSADOR

Page 16: Git with t for teams

RELEASECan we fix a bug for the upcoming

?

FEATUREIs the code for that

complete?

for the current version?HOTFIXCan we do a fast

BUILDCan we

the current code ?

REVIEWEDHas everybody

the code for this feature ?

Page 17: Git with t for teams

I FIND YOUR LACK OF WORKFLOW STRUCTURE DISTURBING

Page 18: Git with t for teams

DIFFERENTPEOPLEPRODUCTSCULTURES

Page 19: Git with t for teams

DIFFERENTPEOPLEPRODUCTSCULTURES JIRA, Bitbucket, Stash

Page 20: Git with t for teams

DIFFERENTPEOPLEPRODUCTSCULTURES

Page 21: Git with t for teams

DIFFERENTPEOPLEPRODUCTSCULTURES

DIFFERENT WORKFLOWS

Page 22: Git with t for teams

WORKFLOWBUILD YOUR

rebasemerge

fork

clone

push

pull

Page 23: Git with t for teams

Git

WORKFLOWBUILD YOUR

Page 24: Git with t for teams

NOT POSSIBLE WITH GITONE WORKFLOW:

Page 25: Git with t for teams

block files while working on it

Page 26: Git with t for teams

we know what can happen!

Page 27: Git with t for teams

FORK WORKFLOWS

Page 28: Git with t for teams

MAKES A COPY OF A REPOSITORY ON THE SERVER

YOU CAN NOT WRITE DIRECTLY TO THE ORIGINAL REMOTE REPOSITORY

YOU CAN STILL GET CHANGES FROM THE ORIGINAL REMOTE REPOSITORY

forking rocks!

Page 29: Git with t for teams

THE GATEKEEPER WORKFLOWfor teams

Page 30: Git with t for teams

REPOSITORY

it's such an awesome library

Page 31: Git with t for teams

REPOSITORYFORKED

REPOSITORYFORK

Page 32: Git with t for teams

REPOSITORYFORKED

REPOSITORYSYNCH

Get updates on request or automatically*

* with awesome tools like Stash or with Git hooks

Page 33: Git with t for teams

REPOSITORYFORKED

REPOSITORYFORK

I've done an awesome change

Page 34: Git with t for teams

REPOSITORYFORKED

REPOSITORYPUSH CHANGEX

Page 35: Git with t for teams

REPOSITORYFORKED

REPOSITORY

can you pull in my changes? he is the gatekeeper

Page 36: Git with t for teams

REPOSITORYFORKED

REPOSITORYPULL CHANGES

likes the changes

Page 37: Git with t for teams

exactly and it works great!

LOOKS LIKE AN OPEN SOURCE PROCESS?

Page 38: Git with t for teams

DISTRIBUTED TEAMS

DIFFERENT PROGRAMMING SKILLS

FLEXIBLE ROADMAPS

LEARN FROM OPEN SOURCE TEAMS?

Page 39: Git with t for teams

FORKING IN THEENTERPRISE

Page 40: Git with t for teams

FORKING IN THEENTERPRISE

5 REASONS FOR...

Page 41: Git with t for teams

FORKING IN THEENTERPRISE

REASON 1

GREAT FOR CUSTOMIZING LIBRARIES

and still get bug fixes

Page 42: Git with t for teams

FORKING IN THEENTERPRISE

REASON 2

GREAT FOR INNOVATION SPIKES

and maybe add it later

Page 43: Git with t for teams

FORKING IN THEENTERPRISE

REASON 3

PROTECTING YOUR COMPONENTS

but still be open for changes

Page 44: Git with t for teams

FORKING IN THEENTERPRISE

REASON 4

REDUCE THE NOISE

and keep the overview for huge projects

Page 45: Git with t for teams

FORKING IN THEENTERPRISE

REASON 5

INTERACTION WITH CONTRACTORS & INTERNSprotect your sources

Page 46: Git with t for teams

THE WORKFLOWDICTATORS &LIEUTENANTS

Page 47: Git with t for teams

an army of developer

Page 48: Git with t for teams

a few integrator

Page 49: Git with t for teams

and a friendly dictator

Page 50: Git with t for teams

BLESSED REPOSITORY

FORKED REPOSITORY

FORKED REPOSITORY SYNCH

Page 51: Git with t for teams

BLESSED REPOSITORY

FORKED REPOSITORY

FORKED REPOSITORY Pull

Page 52: Git with t for teams

BLESSED REPOSITORY

FORKED REPOSITORY

FORKED REPOSITORY PullX

too much stuff!

Page 53: Git with t for teams

BLESSED REPOSITORY

FORKED REPOSITORY

FORKED REPOSITORY

FORKED REPOSITORY

FORKED REPOSITORY

Pull

Pull Pull

Page 54: Git with t for teams

BLESSED REPOSITORY

FORKED REPOSITORY

FORKED REPOSITORY

FORKED REPOSITORY

FORKED REPOSITORY

Pull

Pull Pull

We are here to help!

Page 55: Git with t for teams

GREAT FOR HUGE PROJECTS

Page 56: Git with t for teams

THIS IS A POTENTIAL BOTTLENECK

Page 57: Git with t for teams

YOU NEED MORE FREEDOM?AND WANT TO MOVE FAST?

Page 58: Git with t for teams

THE CENTRALIZED WORKFLOW

Page 59: Git with t for teams

HELLO SUBVERSION USERS!

THIS FLOWISYOUR

but Git makes it even better

Page 60: Git with t for teams

master

ONE BRANCHTO RULE THEM ALL

all code goes in here

Page 61: Git with t for teams

CENTRAL REPOSITORY

CLONED REPOSITORY

your (full) local copy for development

Page 62: Git with t for teams

CENTRAL REPOSITORY

CLONED REPOSITORY

everybody integrate changes here

your (full) local copy for development

Page 63: Git with t for teams

CENTRAL REPOSITORY

CLONED REPOSITORY

do that often!

Page 64: Git with t for teams

SIMPLE & EASY TO LEARN

+CI = ALWAYS DEPLOYABLE

CONFLICTS GET VISIBLE EARLY

USED FOR YEARS

Page 65: Git with t for teams

GREAT FOR MIGRATING

don't change too much at once

Page 66: Git with t for teams

UNFINISHED

FEATURES

Page 67: Git with t for teams

FEATURE TOGGLES

Page 68: Git with t for teams

THE WORKFLOWFEATUREBRANCH

Page 69: Git with t for teams

WE ORGANIZE WORK IN TASKS, STORIES, FEATURES

WHY NOT HAVE THAT IN CODE, TOO?

Page 70: Git with t for teams

master

Feature 1

Feature 2BRANCH PER FEATURE

1 to X devs working on a branch

Page 71: Git with t for teams

master

BRANCH PER FEATURE

Feature 1

Feature 2

get closed when done

Page 72: Git with t for teams

CLEAN MASTER BRANCH

Page 73: Git with t for teams

ISOLATED FEATURE DEVELOPMENT

Page 74: Git with t for teams

GREATFOR FIXED TIME / FIXED FEATURE DEVELOPMENT

develop while bugfix

Page 75: Git with t for teams

GREATFOR CONTINUOUS DELIVERY

deliver when done

Page 76: Git with t for teams

master

merge frequently

FEATURE BRANCH TIPS

Page 77: Git with t for teams

master

synch with MASTER frequently

FEATURE BRANCH TIPS

Page 78: Git with t for teams

master

delete branch when done

FEATURE BRANCH TIPS

Page 79: Git with t for teams

master

Feature 1

Feature 2BRANCH PER FEATURE

useful branch names

Page 80: Git with t for teams

master

ADD USER

DELETE USER

BRANCH PER FEATURE

useful branch names

Page 81: Git with t for teams

master

J-60 ADD USER

J-98 DELETE USER

BRANCH PER FEATURE

use key from issue tracker

Page 82: Git with t for teams

THE WORKFLOWFEATUREBRANCH

with code reviews

Page 83: Git with t for teams

LEARN

BETTER QUALITY

FEEL BETTER

BLAME

WHY DO YOU WANT TO DISCUSS YOUR CODE CHANGES?

Page 84: Git with t for teams

PULLREQUESTS

+

< >

Page 85: Git with t for teams

master

Pull Request

what do you think?

Page 86: Git with t for teams

master

Pull Request

discuss changes GOOD!

AGREE!

Page 87: Git with t for teams

master

Pull Request

approve changes

Page 88: Git with t for teams

master

Pull Request

merge

Page 89: Git with t for teams

THE WORKFLOW *

*SOURCE: ZACH HOLMAN "HOW GITHUB WORKS"

Page 90: Git with t for teams

THE WORKFLOWFEATUREBRANCH

with history

Page 91: Git with t for teams

DON'T FORGET YOUR PAST

Page 92: Git with t for teams

master

HISTORYDEVELOP

new branch called DEVELOP

Page 93: Git with t for teams

master

HISTORYDEVELOP

we integrate changes here

Feature

Page 94: Git with t for teams

master

HISTORYDEVELOP

and tag our releases here

Feature

V. 1.1

Page 95: Git with t for teams

master

HISTORYDEVELOP

makes this branch stable

Feature

V. 1.1

Page 96: Git with t for teams

THE

WORKFLOW

Page 97: Git with t for teams

Prod

ucti

on

STAG

ING

upcoming version

THE

WORKFLOW

never direct integration... just for hotfixes

only through Pull Request (except when not)

Page 98: Git with t for teams

Prod

ucti

on

STAG

ING

without Pull Request

THE

WORKFLOW

we create a HOTFIX branch (of course) and also merge to STAGING-Branch

Page 99: Git with t for teams

THE WORKFLOWRELEASE

Page 100: Git with t for teams

COOL STUFFWE'RE FLOWING!

Page 101: Git with t for teams

RELEASE CANDIDATES

inspect your release candidate

Page 102: Git with t for teams

inspect your release candidate...and don't destroy your flow

RELEASE CANDIDATES

Page 103: Git with t for teams

mast

er

RELEASE

DEVE

LOP

RELE

ASE

CAND

IDAT

E

feature complete

release team works here

other dev teams "flow" here

Page 104: Git with t for teams

mast

er

RELEASE

DEVE

LOP

RELE

ASE

CAND

IDAT

E fixing back to DEVELOP

Page 105: Git with t for teams

mast

er

RELEASE

DEVE

LOP

RELE

ASE

CAND

IDAT

E

merge, tag, release!

V. 1.1

Page 106: Git with t for teams

POTENTIA

LLY

READY

PROMISED SET OF FEATURES

BUGS HAVE A BIG IMPACT

RELEASES ARE EXPENSIVE

AFRAID OF FAILURES

Page 107: Git with t for teams

THE WORKFLOWMAINTENANCE

Page 108: Git with t for teams

RELEASED SOFTWARE HAS BUGSHouston we have a problem

Page 109: Git with t for teams

mast

er

MAINTENANCE

DEVE

LOP

1.1

hotf

ix branch from MASTER and fix the damn bug

Page 110: Git with t for teams

mast

er

MAINTENANCE

DEVE

LOP

1.1

hotf

ix

merge with MASTER, tag and release

1.2.1

Page 111: Git with t for teams

mast

er

MAINTENANCE

DEVE

LOP

1.1

hotf

ix

merge with DEVELOP and delete HOTFIX

1.2.1

Page 112: Git with t for teams

mast

er

MAINTENANCE

DEVE

LOP

1.1

hotf

ixRC

- 1.2

1.1.2

ONE EXCEPTION: A RELEASE BRANCH EXISTS

Page 113: Git with t for teams

THE FLOWGIT

Page 114: Git with t for teams

YOU'VE JUST SEEN IT!

Page 115: Git with t for teams

FLOWGITTHEDEVELOP & MASTER BRANCH

FEATURE BRANCHES

RELEASE BRANCHES

MAINTENANCE BRANCHES

from Vincent Driessen

Page 116: Git with t for teams

HOW CAN I FIND MY WAY THROUGH THE

RULE JUNGLE?

USE TOOLS

Page 117: Git with t for teams

HOW CAN I REMEMBER ALL THESE

GIT COMMANDS AND RULES?

there is a command line tool

git flow release start 1.6

git flow feature start 'JRA-34 Add User'

git flow feature finish 'JRA-34 Add User'

git flow hotfix finish 1.5.3

Page 118: Git with t for teams

HOW CAN I REMEMBER ALL THESE

GIT COMMANDS AND RULES?

Page 119: Git with t for teams

FLOWGITWHY

I thought every team is different?

Page 120: Git with t for teams

FLOWGITWHY

IT CAPTURES A LOT OF DEVELOPMENT SITUATIONSIT'S WELL KNOWN: EASY ADOPTION

BUTI WON'T USE IT OUT-OF-THE-BOX: ADAPT IT!

Page 121: Git with t for teams

THE FLOWSTASH TEAMat Atlassian

Page 122: Git with t for teams

FLOWGITMAKINGMORE SIMPLE

getting rid of MASTER

Page 123: Git with t for teams

BRANCH

KEEP YOUR

RELEASE no merge into MASTER needed

Page 124: Git with t for teams

RELE

ASE

2.1

STASH TEAM FLOW

DEVE

LOP

2.1

no MASTER, we keep RELEASE

Page 125: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

2.1hotf

ix 2

.1.1

branch HOTFIX from RELEASE and fix the damn bug

STASH TEAM FLOW

Page 126: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

2.1hotf

ix 2

.1.1

merge back to RELEASE2.1

.1

STASH TEAM FLOW

Page 127: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

2.1hotf

ix 2

.1.1

and apply changes to DEVELOP

2.1.1

STASH TEAM FLOW

Page 128: Git with t for teams

SUPPORTING OLD VERSIONS

they are still out there ...and have sometimes problems

Page 129: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

we need to fix a bug in 2.0

RELE

ASE

2.0

STASH TEAM FLOW

Page 130: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

hotf

ix 2

.0.1

you've seen this before

RELE

ASE

2.0

STASH TEAM FLOW

Page 131: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

hotf

ix 2

.0.1

merge with 2.1 RELEASE branch

RELE

ASE

2.0

STASH TEAM FLOW

Page 132: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

hotf

ix 2

.0.1

and apply changes from RELEASE 2.1 to DEVELOP

RELE

ASE

2.0

STASH TEAM FLOW

Page 133: Git with t for teams

can change tomorrowSTASH TEAM FLOW

Page 134: Git with t for teams

We want to helpSTASH TEAM FLOW

Page 135: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

2.1hotf

ix 2

.1.1 2.1

.1

I could do this

Page 136: Git with t for teams

I could do this

SERVER SIDE AUTO MERGES

with Git hooks

Page 137: Git with t for teams

LEAN BACK AND ENJOY PUREAWESOMENESS

Page 138: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

hotf

ix 2

.0.1

RELE

ASE

2.0

merge here

STASH TEAM FLOW

Page 139: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

hotf

ix 2

.0.1

RELE

ASE

2.0

and let the robots take over

STASH TEAM FLOW

Page 140: Git with t for teams

NOT ENOUGH POSSIBILITIES?

Page 141: Git with t for teams

INFINITE WORKFLOW POSSIBILITIES

Page 142: Git with t for teams

CUSTOMIZE YOUR WORKFLOW WITH HOOKS

Page 143: Git with t for teams

PUSH

Page 144: Git with t for teams

PUSH

Script is doing some stuff

Page 145: Git with t for teams

PUSH

Page 146: Git with t for teams

WATCH OUT: HOOK MAGIC

at Atlassian

Page 147: Git with t for teams

1 DON'T BRANCH FROM A RED BUILD

Page 148: Git with t for teams

1 DON'T BRANCH FROM A RED BUILD

Page 149: Git with t for teams

2 BE INFORMED

Chat

Page 150: Git with t for teams

2 BE INFORMED

Page 151: Git with t for teams

WORKFLOWS WITH CI SERVERSContinuous Integration

Page 152: Git with t for teams

WANTWESTABLE DEVELOP BRANCH THAT IS CI TESTEDto be sure, that we won't break things

Page 153: Git with t for teams

COULDWEPULL CHANGES BUILD LOCALLY MERGE IF OK

Page 154: Git with t for teams

COULDWE

MERGE & PRAY

Page 155: Git with t for teams

MERGEAUTOON

WHY NOT USE

BRANCHES ?FEATUREand build it from there!

Page 156: Git with t for teams

DEVELOP

potential integration problem

AUTO MERGES

Page 157: Git with t for teams

DEVELOP

pull frequently

AUTO MERGES

Page 158: Git with t for teams

DEVELOP

pull frequently automatically on commits

AUTO MERGES

Page 159: Git with t for teams

SOMETIMES WHEN MERGING

SHIT HAPPENS.

AND SOMEBODY PUSHES BUGGY CODE TO DEVELOP

Page 160: Git with t for teams

DEVELOP

push automatically on green builds of DEVELOP

GREEN BUILD MERGES

Page 161: Git with t for teams

POOR CI ADMINISTRATOR

setting up builds for all these tasks

Page 162: Git with t for teams

AUTO DETECT BRANCHES

Page 163: Git with t for teams

AUTO DETECT BRANCHES

Page 164: Git with t for teams

BUILD ON EVERY COMMIT KILLED OUR CI SERVERS

x features branches * x pushes a day = server overload

Page 165: Git with t for teams

BUILD ON EVERY COMMIT ON MASTER, RELEASE & DEVELOPBUILD MANUALLY ON FEATURE BRANCHES

DOING AUTO MERGES ON GREEN BUILDS OF DEVELOP

Page 166: Git with t for teams

WORKFLOWS WITH ISSUETRACKING

Page 167: Git with t for teams

DIFFERENT PEOPLE HAVE DIFFERENT VIEWS ON YOUR PROJECT

cool developers

incredible product owner

amazing scrum master

Page 168: Git with t for teams

ISSUE TRACKERS CONNECT US CODERS WITH THE REAL WORLD

cool developers

incredible product owner

amazing scrum master

Page 169: Git with t for teams

ISSUE TRACKERS CONNECTS GIT WITH THE REAL WORLD

cool developers

incredible product owner

amazing scrum master

Page 170: Git with t for teams

WE LIVE IN CODE!

LET ME WORK IN CODE I JUST NEED TO KNOW WHAT

MY CODE SHOULD SOLVE!

Page 171: Git with t for teams

Problem understood, I start coding

HOW DO ISSUE TRACKERS CONNECT TO THE CODE?

Page 172: Git with t for teams

HOW DO ISSUE TRACKERS CONNECT TO THE CODE?

Ah good, the coders started

Page 173: Git with t for teams

commit -m "fixes #6, resolve ticket #5"

HOW DO ISSUE TRACKERS CONNECT TO THE CODE?

Page 174: Git with t for teams

HOW DO ISSUE TRACKERS CONNECT TO THE CODE?

commit -m "fixes #6, resolve ticket #5"

Page 175: Git with t for teams

WHAT'S IN IT FOR ?

SEE WHAT'S IN DEVELOP

SEE ISSUES IN REVIEW

SEE FINISHED ISSUES ALREADY MERGED WITH DEVELOP

non geeks

Page 176: Git with t for teams

WHAT'S IN IT FOR ?

DOING CODE REVIEWS IN CONTEXTBROWSING FEATURE DESCRIPTIONS SHOW CODE CHANGES

Page 177: Git with t for teams

... I HAVE A DREAM

Page 178: Git with t for teams

'START PROGRESS' ON AN ISSUE CREATES A FEATURE BRANCH

DOING A PULL REQUEST MARKS THE ISSUE 'IN REVIEW'

MERGING A FEATURE BRANCH MARKS THE ISSUE AS 'RESOLVED'

GIT WORKFLOW

Page 179: Git with t for teams

'START PROGRESS' ON AN ISSUE CREATES A FEATURE BRANCH

DOING A PULL REQUEST MARKS THE ISSUE 'IN REVIEW'

MERGING A FEATURE BRANCH MARKS THE ISSUE AS 'RESOLVED'

ISSUE WORKFLOW

Page 180: Git with t for teams

'START PROGRESS' ON AN ISSUE CREATES A FEATURE BRANCH

DOING A PULL REQUEST MARKS THE ISSUE 'IN REVIEW'

MERGING A FEATURE BRANCH MARKS THE ISSUE AS 'RESOLVED'

Page 181: Git with t for teams

'START PROGRESS' ON AN ISSUE CREATES A FEATURE BRANCH

DOING A PULL REQUEST MARKS THE ISSUE 'IN REVIEW'

MERGING A FEATURE BRANCH MARKS THE ISSUE AS 'RESOLVED'

GIT COMBINED ISSUE WORKFLOW

Page 182: Git with t for teams

RISE GIT TOOLSOFTHE

Page 183: Git with t for teams

DON'T FLOW

LIKE IT'S 1999

Page 184: Git with t for teams

svenpet.com/talks@svenpet

DON'T USE GITTOMORROW 3PM ROOM 7

THANKS

Page 185: Git with t for teams

ResourcesRESOURCES

GIT WORKFLOWS https://www.atlassian.com/git/workflows

AUTO MERGES http://blogs.atlassian.com/2013/05/git-automatic-merges-with-server-side-hooks-for-the-win/

GIT RESOURCES https://www.atlassian.com/git/resources

https://blogs.atlassian.com/2013/07/git-upstreams-forks/FORKS & UPSTREAMS

Page 186: Git with t for teams

PICTURES

 http://www.flickr.com/photos/80384851@N00/2653886484/ http://www.flickr.com/photos/21461615@N00/1353110751  http://www.flickr.com/photos/82402697@N00/449512594  http://www.flickr.com/photos/7228825@N05/675810372  http://www.flickr.com/photos/38451115@N04/4016842259/ http://www.flickr.com/photos/8749778@N06/5601758699/  http://www.flickr.com/photos/37831703@N00/3391877877  http://www.flickr.com/photos/60648084@N00/2900765643/  http://www.flickr.com/photos/28415633@N00/8401940159 http://www.flickr.com/photos/41304517@N00/6814372181  http://www.flickr.com/photos/99796131@N00/120468504/  http://www.flickr.com/photos/92269745@N00/4612732045/  http://www.flickr.com/photos/57768341@N00/3800568262/

http://www.flickr.com/photos/43322231@N07/4390305784/  http://www.flickr.com/photos/40011478@N00/2890078135/ http://www.flickr.com/photos/33909206@N04/7638306424  http://www.flickr.com/photos/8340753@N04/501465437/  http://www.flickr.com/photos/33774513@N08/3510825685/ http://www.flickr.com/photos/55723329@N00/3631928376/  http://www.flickr.com/photos/11389536@N03/5235804240/  http://www.flickr.com/photos/43322231@N07/5410534167  http://www.flickr.com/photos/43322231@N07/5366609719  http://www.flickr.com/photos/43322231@N07/4205372249/ http://www.flickr.com/photos/43322231@N07/4466599835/  http://www.flickr.com/photos/45940879@N04/5598027415/  http://www.flickr.com/photos/83346641@N00/3517813158/