SlideShare a Scribd company logo
1 of 44
Download to read offline
Web Development:
The Next 5 Years
Introduction
     John Sutherland
 http://sneeu.com/john/
The talk

• It’s all about the future
• Silverlight, AIR both failed to take off
• The browser isn’t going anywhere
• And open standards are the way forward
The talk (2)

• Interested in too many things
• Loads of talk ideas
• A few frontend, a few backend
• Nothing I thought would be > 5 minutes
• So ... 5 small topics = 30 minutes
The topics

• XHTML 2.0 & HTML 5
• CSS 3.0
• ECMAScript 4 (JavaScript 2)
• WTF is CouchDB?
• WTF is Comet? (the money-shot)
Talk slower!
XHTML 2.0 & HTML 5
X2: What’s cool?

• No more shitty tags: acronym, b, i, tt,
  font, basefont, big, small, or iframe

• Sections and headers: section and h
• Any thing can be a link with @href
• The new navigation list, nl
X2: What’s not cool?

• h1-h6 remain despite section and h
• a and img are still around
• The lengthy and closed W3C process
H5: What’s cool?

• The new m element (for marked/
  highlighted)

• input@type is now on speed
• The process is more open than XHTML 2
H5: What’s not cool?

• font returns‽
• Predefined @class names
• Continued support for b, i, iframe,
  small & co.
More
http://xhtml.com/en/future/x-html-5-versus-xhtml-2/
CSS 3.0
It’s going to rock
• Multiple background images
• Box shadows
• Multi-column layout
• Hot-ass attribute & pseudo selectors
• Media queries
• Advanced layout
Multiple backgrounds

#content {
    background:
      url(top_center.png) repeat-x top
      url(top_left.png) no-repeat left top
      url(top_right.png) no-repeat right top;
}
Advanced Layout
body {
   display: “abb”
            “cbb”
}
#branding { position: a; }
#interest { position: b; }
#navigation { position: c; }
Some of it works now!

• :target pseudo selector in FF & Safari
• text-shadow property in Safari
• Multi-column layout in FF & Safari
• Multiple backgrounds in Safari
More
http://css3.info/
ECMAScript 4
(JavaScript 2)
One metric shitload of
 awesome new stuff
Type Annotations
•   function indexOf(
       needle : string,
       haystack : string) : int {
         // ...
    }
•   var age : int = 25;
•   var name : string! = quot;Johnquot;;
Classes
class WebDeveloper extends Developer {
   // must be initialised:
   var favDoctype : string!;
   override function say(s) {
      return quot;<![CDATA[quot; + s + quot; and AJAX!]]>quot;;
   }
}


var d = new WebDeveloper;
Classes (2)

• final keyword: cannot be extended
• dynamic keyword: can have properties
  added at runtime

• Interfaces: just like Java used to make
Functions
• generic keyword: overload function
  names, just like Java

• Better var-args
  function f(fixed : String,
     ...extras : [String]) {}

• intrinsic keyword: operator
  overloading
More
• let blocks:
  let (x = 0) { /* x == 0 */ }
     // x is undefined

• for each:
  for each (
     let n in [1, 2, 3, 5]) // ...
More
http://ejohn.org/blog/ecmascript-4-speaking-tour/
Demo
WTF is CouchDB?
CouchDB
• Succinctly: “a RESTful JSON document
  store”

• RESTful: uses nice URLs and HTTP
  verbs (GET, POST, PUT & DELETE)

• JSON: JavaScript Object Notation
• Document: an arbitrary (but not
  necessarily) JSON structure
CouchDB: what else?
• JavaScript views & queries: built on
  Mozilla’s SpiderMonkey

• Lucene powered full-text search
• Replication: online & offline
• No authentication yet (will have doc-level)
• An absolute shit to setup
Demo
WTF is Comet?
You know AJAX ...?
• Great for async- sending to the server
• Rubbish for async- receiving from the
  server

 • Chat
 • Real-time data: stock prices; Weewar
 • Other server-event stuff
Comet solves it
• The name is a play on the AJAX bleach
• All sorts of ways to implement it, ‘Comet’
  refers to them all

 • “Forever frame”
 • Dynamic script long polling
 • XHR long polling
Comet solves it (2)
• All Comet implementations are mondo-
  hacks

• Recent hype is about Bayeux:
 • Dojo Foundation specification
 • A standard way to pass around JSON
 • A pub/sub model
Client-side

• Pages & screens served up as normal
• Use XHR long polling to wait for events
• Server blocks until event worth returning
JavaScript libraries

• Dojo: loads working; responsible for
  Bayeux.

• jQuery: plugin available
• Prototype: couldn’t find much
• MooTools: discussion in the forums
The server-side
• I’ve mostly looked at Python
 • twisted-cometd
 • Orbited (pyEvent based)
 • pyorbited (Python Comet client)
• Certainly tools in most languages
 • Jetty 6.1 (Java app-server with comet)
Demo
That’s it, questions?
http://sneeu.com/barcampscotland2008/
        these slides and more
Photos
•   http://flickr.com/photos/cs___/1185503907/

•   http://flickr.com/photos/anthonybaker/59254428/

•   http://flickr.com/photos/elchicodelaleche/451117110/

•   http://flickr.com/photos/stinkypeter/1353500787/

•   http://flickr.com/photos/jeffrey/212073003/

•   http://flickr.com/photos/roadsidepictures/495353912/

•   http://flickr.com/photos/paulmoody/349360565/
Thanks
c bna
This work is licensed under the Creative Commons Attribution-
Noncommercial-Share Alike 2.5 UK: Scotland License. To view a copy
of this license, visit http://creativecommons.org/licenses/by-nc-sa/2.5/
scotland/ or send a letter to Creative Commons, 171 Second Street,
Suite 300, San Francisco, California, 94105, USA.

More Related Content

What's hot

Phorum MySQL tricks
Phorum MySQL tricksPhorum MySQL tricks
Phorum MySQL tricks
guestd34230
 
Web Scraper Shibuya.pm tech talk #8
Web Scraper Shibuya.pm tech talk #8Web Scraper Shibuya.pm tech talk #8
Web Scraper Shibuya.pm tech talk #8
Tatsuhiko Miyagawa
 
DC Alt.Net: Building Web Apps With node.js
DC Alt.Net: Building Web Apps With node.jsDC Alt.Net: Building Web Apps With node.js
DC Alt.Net: Building Web Apps With node.js
Troy Goode
 
Pylons + Tokyo Cabinet
Pylons + Tokyo CabinetPylons + Tokyo Cabinet
Pylons + Tokyo Cabinet
Ben Cheng
 
Developing OpenResty Framework
Developing OpenResty FrameworkDeveloping OpenResty Framework
Developing OpenResty Framework
Aapo Talvensaari
 

What's hot (19)

Phorum MySQL tricks
Phorum MySQL tricksPhorum MySQL tricks
Phorum MySQL tricks
 
Rapid API development on MongoDB
Rapid API development on MongoDBRapid API development on MongoDB
Rapid API development on MongoDB
 
Web Scraper Shibuya.pm tech talk #8
Web Scraper Shibuya.pm tech talk #8Web Scraper Shibuya.pm tech talk #8
Web Scraper Shibuya.pm tech talk #8
 
Seguranca em APP Rails
Seguranca em APP RailsSeguranca em APP Rails
Seguranca em APP Rails
 
Virtual Infrastructure
Virtual InfrastructureVirtual Infrastructure
Virtual Infrastructure
 
WP-CLI Workshop at WordPress Meetup Cluj-Napoca
WP-CLI Workshop at WordPress Meetup Cluj-NapocaWP-CLI Workshop at WordPress Meetup Cluj-Napoca
WP-CLI Workshop at WordPress Meetup Cluj-Napoca
 
DC Alt.Net: Building Web Apps With node.js
DC Alt.Net: Building Web Apps With node.jsDC Alt.Net: Building Web Apps With node.js
DC Alt.Net: Building Web Apps With node.js
 
What's New in Web Development
What's New in Web DevelopmentWhat's New in Web Development
What's New in Web Development
 
Web sockets in Java
Web sockets in JavaWeb sockets in Java
Web sockets in Java
 
Pylons + Tokyo Cabinet
Pylons + Tokyo CabinetPylons + Tokyo Cabinet
Pylons + Tokyo Cabinet
 
Slide Test
Slide TestSlide Test
Slide Test
 
Intro to CouchDB
Intro to CouchDBIntro to CouchDB
Intro to CouchDB
 
Real time web (Orbited) at BCNE3
Real time web (Orbited) at BCNE3Real time web (Orbited) at BCNE3
Real time web (Orbited) at BCNE3
 
Developing OpenResty Framework
Developing OpenResty FrameworkDeveloping OpenResty Framework
Developing OpenResty Framework
 
The Transparent Web: Bridging the Chasm in Web Development
The Transparent Web: Bridging the Chasm in Web DevelopmentThe Transparent Web: Bridging the Chasm in Web Development
The Transparent Web: Bridging the Chasm in Web Development
 
JS Event Loop
JS Event LoopJS Event Loop
JS Event Loop
 
CouchDB Google
CouchDB GoogleCouchDB Google
CouchDB Google
 
Challenges of angular in production (Tasos Bekos) - GreeceJS #17
Challenges of angular in production (Tasos Bekos) - GreeceJS #17Challenges of angular in production (Tasos Bekos) - GreeceJS #17
Challenges of angular in production (Tasos Bekos) - GreeceJS #17
 
Plongée dans l'écosystème Laravel
Plongée dans l'écosystème LaravelPlongée dans l'écosystème Laravel
Plongée dans l'écosystème Laravel
 

Viewers also liked

Catharine of aragon
Catharine of aragonCatharine of aragon
Catharine of aragon
krice
 
Alexander the great # 4 web
Alexander the great # 4   webAlexander the great # 4   web
Alexander the great # 4 web
krice
 
France
FranceFrance
France
krice
 
Self Introduction1
Self Introduction1Self Introduction1
Self Introduction1
bluesky1712
 
Jaws Lt -2010-02-23
Jaws Lt -2010-02-23Jaws Lt -2010-02-23
Jaws Lt -2010-02-23
ryo katsuma
 
Hadoop introduction
Hadoop introductionHadoop introduction
Hadoop introduction
ryo katsuma
 

Viewers also liked (6)

Catharine of aragon
Catharine of aragonCatharine of aragon
Catharine of aragon
 
Alexander the great # 4 web
Alexander the great # 4   webAlexander the great # 4   web
Alexander the great # 4 web
 
France
FranceFrance
France
 
Self Introduction1
Self Introduction1Self Introduction1
Self Introduction1
 
Jaws Lt -2010-02-23
Jaws Lt -2010-02-23Jaws Lt -2010-02-23
Jaws Lt -2010-02-23
 
Hadoop introduction
Hadoop introductionHadoop introduction
Hadoop introduction
 

Similar to Web Development: The Next Five Years

Ajax Tutorial
Ajax TutorialAjax Tutorial
Ajax Tutorial
oscon2007
 
Performance Improvements In Browsers
Performance Improvements In BrowsersPerformance Improvements In Browsers
Performance Improvements In Browsers
GoogleTecTalks
 
Web Fundamentals Crash Course
Web Fundamentals Crash CourseWeb Fundamentals Crash Course
Web Fundamentals Crash Course
MrAbbas
 
Web Fundamentals Crash Course
Web Fundamentals Crash CourseWeb Fundamentals Crash Course
Web Fundamentals Crash Course
MrAbas
 
JRuby - Enterprise 2.0
JRuby - Enterprise 2.0JRuby - Enterprise 2.0
JRuby - Enterprise 2.0
Jan Sifra
 

Similar to Web Development: The Next Five Years (20)

Ajax Tutorial
Ajax TutorialAjax Tutorial
Ajax Tutorial
 
Drupal 6 JavaScript and jQuery
Drupal 6 JavaScript and jQueryDrupal 6 JavaScript and jQuery
Drupal 6 JavaScript and jQuery
 
How to make Ajax Libraries work for you
How to make Ajax Libraries work for youHow to make Ajax Libraries work for you
How to make Ajax Libraries work for you
 
Performance Improvements In Browsers
Performance Improvements In BrowsersPerformance Improvements In Browsers
Performance Improvements In Browsers
 
Performance Improvements in Browsers
Performance Improvements in BrowsersPerformance Improvements in Browsers
Performance Improvements in Browsers
 
When To Use Ruby On Rails
When To Use Ruby On RailsWhen To Use Ruby On Rails
When To Use Ruby On Rails
 
Jazz up your JavaScript: Unobtrusive scripting with JavaScript libraries
Jazz up your JavaScript: Unobtrusive scripting with JavaScript librariesJazz up your JavaScript: Unobtrusive scripting with JavaScript libraries
Jazz up your JavaScript: Unobtrusive scripting with JavaScript libraries
 
Performance Improvements in Browsers
Performance Improvements in BrowsersPerformance Improvements in Browsers
Performance Improvements in Browsers
 
Building a JavaScript Library
Building a JavaScript LibraryBuilding a JavaScript Library
Building a JavaScript Library
 
Google's HTML5 Work: what's next?
Google's HTML5 Work: what's next?Google's HTML5 Work: what's next?
Google's HTML5 Work: what's next?
 
Killing the Angle Bracket
Killing the Angle BracketKilling the Angle Bracket
Killing the Angle Bracket
 
Web Fundamentals Crash Course
Web Fundamentals Crash CourseWeb Fundamentals Crash Course
Web Fundamentals Crash Course
 
Web Fundamentals Crash Course
Web Fundamentals Crash CourseWeb Fundamentals Crash Course
Web Fundamentals Crash Course
 
Once upon a time, there were css, js and server-side rendering
Once upon a time, there were css, js and server-side renderingOnce upon a time, there were css, js and server-side rendering
Once upon a time, there were css, js and server-side rendering
 
Efficient JavaScript Development
Efficient JavaScript DevelopmentEfficient JavaScript Development
Efficient JavaScript Development
 
The Future of CSS
The Future of CSSThe Future of CSS
The Future of CSS
 
DSLs in JavaScript
DSLs in JavaScriptDSLs in JavaScript
DSLs in JavaScript
 
JRuby - Enterprise 2.0
JRuby - Enterprise 2.0JRuby - Enterprise 2.0
JRuby - Enterprise 2.0
 
Nodejs - A quick tour (v6)
Nodejs - A quick tour (v6)Nodejs - A quick tour (v6)
Nodejs - A quick tour (v6)
 
Practical Use of MongoDB for Node.js
Practical Use of MongoDB for Node.jsPractical Use of MongoDB for Node.js
Practical Use of MongoDB for Node.js
 

Recently uploaded

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Recently uploaded (20)

Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 

Web Development: The Next Five Years

  • 2. Introduction John Sutherland http://sneeu.com/john/
  • 3. The talk • It’s all about the future • Silverlight, AIR both failed to take off • The browser isn’t going anywhere • And open standards are the way forward
  • 4. The talk (2) • Interested in too many things • Loads of talk ideas • A few frontend, a few backend • Nothing I thought would be > 5 minutes • So ... 5 small topics = 30 minutes
  • 5. The topics • XHTML 2.0 & HTML 5 • CSS 3.0 • ECMAScript 4 (JavaScript 2) • WTF is CouchDB? • WTF is Comet? (the money-shot)
  • 7. XHTML 2.0 & HTML 5
  • 8. X2: What’s cool? • No more shitty tags: acronym, b, i, tt, font, basefont, big, small, or iframe • Sections and headers: section and h • Any thing can be a link with @href • The new navigation list, nl
  • 9. X2: What’s not cool? • h1-h6 remain despite section and h • a and img are still around • The lengthy and closed W3C process
  • 10. H5: What’s cool? • The new m element (for marked/ highlighted) • input@type is now on speed • The process is more open than XHTML 2
  • 11. H5: What’s not cool? • font returns‽ • Predefined @class names • Continued support for b, i, iframe, small & co.
  • 14. It’s going to rock • Multiple background images • Box shadows • Multi-column layout • Hot-ass attribute & pseudo selectors • Media queries • Advanced layout
  • 15. Multiple backgrounds #content { background: url(top_center.png) repeat-x top url(top_left.png) no-repeat left top url(top_right.png) no-repeat right top; }
  • 16. Advanced Layout body { display: “abb” “cbb” } #branding { position: a; } #interest { position: b; } #navigation { position: c; }
  • 17. Some of it works now! • :target pseudo selector in FF & Safari • text-shadow property in Safari • Multi-column layout in FF & Safari • Multiple backgrounds in Safari
  • 20. One metric shitload of awesome new stuff
  • 21. Type Annotations • function indexOf( needle : string, haystack : string) : int { // ... } • var age : int = 25; • var name : string! = quot;Johnquot;;
  • 22. Classes class WebDeveloper extends Developer { // must be initialised: var favDoctype : string!; override function say(s) { return quot;<![CDATA[quot; + s + quot; and AJAX!]]>quot;; } } var d = new WebDeveloper;
  • 23. Classes (2) • final keyword: cannot be extended • dynamic keyword: can have properties added at runtime • Interfaces: just like Java used to make
  • 24. Functions • generic keyword: overload function names, just like Java • Better var-args function f(fixed : String, ...extras : [String]) {} • intrinsic keyword: operator overloading
  • 25. More • let blocks: let (x = 0) { /* x == 0 */ } // x is undefined • for each: for each ( let n in [1, 2, 3, 5]) // ...
  • 27. Demo
  • 29. CouchDB • Succinctly: “a RESTful JSON document store” • RESTful: uses nice URLs and HTTP verbs (GET, POST, PUT & DELETE) • JSON: JavaScript Object Notation • Document: an arbitrary (but not necessarily) JSON structure
  • 30. CouchDB: what else? • JavaScript views & queries: built on Mozilla’s SpiderMonkey • Lucene powered full-text search • Replication: online & offline • No authentication yet (will have doc-level) • An absolute shit to setup
  • 31. Demo
  • 33. You know AJAX ...? • Great for async- sending to the server • Rubbish for async- receiving from the server • Chat • Real-time data: stock prices; Weewar • Other server-event stuff
  • 34. Comet solves it • The name is a play on the AJAX bleach • All sorts of ways to implement it, ‘Comet’ refers to them all • “Forever frame” • Dynamic script long polling • XHR long polling
  • 35. Comet solves it (2) • All Comet implementations are mondo- hacks • Recent hype is about Bayeux: • Dojo Foundation specification • A standard way to pass around JSON • A pub/sub model
  • 36. Client-side • Pages & screens served up as normal • Use XHR long polling to wait for events • Server blocks until event worth returning
  • 37. JavaScript libraries • Dojo: loads working; responsible for Bayeux. • jQuery: plugin available • Prototype: couldn’t find much • MooTools: discussion in the forums
  • 38. The server-side • I’ve mostly looked at Python • twisted-cometd • Orbited (pyEvent based) • pyorbited (Python Comet client) • Certainly tools in most languages • Jetty 6.1 (Java app-server with comet)
  • 39. Demo
  • 42. Photos • http://flickr.com/photos/cs___/1185503907/ • http://flickr.com/photos/anthonybaker/59254428/ • http://flickr.com/photos/elchicodelaleche/451117110/ • http://flickr.com/photos/stinkypeter/1353500787/ • http://flickr.com/photos/jeffrey/212073003/ • http://flickr.com/photos/roadsidepictures/495353912/ • http://flickr.com/photos/paulmoody/349360565/
  • 44. c bna This work is licensed under the Creative Commons Attribution- Noncommercial-Share Alike 2.5 UK: Scotland License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/2.5/ scotland/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.