SlideShare uma empresa Scribd logo
1 de 59
5 Easy Ways to Revolutionize your
 Open Source Project by Writing
     Terrible Documentation

           Ryan Weaver
           @weaverryan
Who is this dude?




     http://www.knplabs.com/en
 http://www.twitter.com/weaverryan
 http://www.github.com/weaverryan
Who is this dude?
• Co-author of the Symfony2 Documentation




              http://www.knplabs.com/en
          http://www.twitter.com/weaverryan
          http://www.github.com/weaverryan
Who is this dude?
• Co-author of the Symfony2 Documentation

• Core Symfony2 contributor




              http://www.knplabs.com/en
          http://www.twitter.com/weaverryan
          http://www.github.com/weaverryan
Who is this dude?
• Co-author of the Symfony2 Documentation

• Core Symfony2 contributor

• CEO KnpLabs US



              http://www.knplabs.com/en
          http://www.twitter.com/weaverryan
          http://www.github.com/weaverryan
Who is this dude?
• Co-author of the Symfony2 Documentation

• Core Symfony2 contributor

• CEO KnpLabs US

• Boyfriend of the much more
 talented @leannapelham

              http://www.knplabs.com/en
          http://www.twitter.com/weaverryan
          http://www.github.com/weaverryan
Who is this dude?
• Co-author of the Symfony2 Documentation

• Core Symfony2 contributor

• CEO KnpLabs US

• Boyfriend of the much more
 talented @leannapelham

              http://www.knplabs.com/en
          http://www.twitter.com/weaverryan
          http://www.github.com/weaverryan
Who is this dude?
• Co-author of the Symfony2 Documentation
 If you like the presentation,
• Core Symfony2 contributor :)
       she gets the iPad
• CEO KnpLabs US

• Boyfriend of the much more
 talented @leannapelham

              http://www.knplabs.com/en
          http://www.twitter.com/weaverryan
          http://www.github.com/weaverryan
Act 1:

Why good documentation is
the worst thing since “goto”
FU Good Docs
Good documentation makes
 your users weak-minded
Put your suit and tie on and
 join us in the penthouse
Put your suit and tie on and
 join us in the penthouse

Enterprise Businesses LOVE
   Shitty Documentation
p i e s
H i p
Who can I make the
 check out to sir?
Who can I make the
 check out to sir?
Who can I make the
 check out to sir?
Act 2:

I’m sold! But how can *I* write
    shitty documentation?
Expert Tip #1


Don’t write *any*
Documentation
Why no docs?
Why no docs?
• You’re a genius - your time should
be spent writing the code only
Why no docs?
• You’re a genius - your time should
be spent writing the code only


• Your code is the most beautiful
code ever written - why deprive your
users of needing to look through it?
Why no docs?
static function load($class)
{
    if (strtolower(substr($class, 0, 6)) !== 'pear2') {


     • You’re a genius - your time should
        return false;
    }
    $file = str_replace(array('_', ''), DIRECTORY_SEPARATOR, $class) . '.php';
     be spent writing the code only
    foreach (self::$paths as $path) {
        if (file_exists($path . DIRECTORY_SEPARATOR . $file)) {

    OMFG your code is awesome!
            require $path . DIRECTORY_SEPARATOR . $file;
            if (!class_exists($class, false) && !
interface_exists($class, false)) {


     • Your code is the most beautiful
                die(new Exception('Class ' . $class . ' was not present in ' .
                    $path . DIRECTORY_SEPARATOR . $file .
                    '") [PEAR2_Autoload-0.2.3]'));

     code ever written - why deprive your
            }
            return true;

     users of needing to look through it?
        }
    }

    // ...
}
Expert Tip #2


*Never* proofread your
   Documentation
Perfection on the first try
Perfection on the first try
 “Documentation is like a dream - it’s
    the raw expression of how you
subconsciously want your application
 to work. Proofreading it clouds that
  interpretation and abstracts away
          from its perfection”
Perfection on the first try
 “Documentation is like a dream - it’s
    the raw expression of how you
subconsciously want your application
 to work. Proofreading it clouds that
  interpretation and abstracts away
          from its perfection”  ~ Me
          (a quote I made up this morning instead of writing
                                            documentation)
• Smart guys/gals like you don’t make
mistakes, so get back to coding bro!
• Smart guys/gals like you don’t make
mistakes, so get back to coding bro!

• Typos show us that you’re human - that you
have a sensitive side
• Smart guys/gals like you don’t make
 mistakes, so get back to coding bro!

 • Typos show us that you’re human - that you
 have a sensitive side

Be aware that teh initial release...
• Smart guys/gals like you don’t make
 mistakes, so get back to coding bro!

 • Typos show us that you’re human - that you
 have a sensitive side

Be aware that teh initial release...
• Smart guys/gals like you don’t make
      mistakes, so get back to coding bro!

      • Typos show us that you’re human - that you
      have a sensitive side

    Be aware that teh initial release...

He probably cries
during romantic
    comedies
• Smart guys/gals like you don’t make
      mistakes, so get back to coding bro!

      • Typos show us that you’re human - that you
      have a sensitive side

    Be aware that teh initial release...

He probably cries
                    ... I cry during
during romantic
                  romantic comedies
    comedies
• Smart guys/gals like you don’t make
      mistakes, so get back to coding bro!

      • Typos show us that you’re human - that you
      have a sensitive side

    Be aware that teh initial release...

He probably cries                       Let’s use his
                    ... I cry during
during romantic                      library for our big
                  romantic comedies
    comedies                         expensive project!
Expert Tip #3


Theory over Practice
PhD Program in YourLib
PhD Program in YourLib
Guess What? Your users aren’t using your
library to solve their business problems
PhD Program in YourLib
Guess What? Your users aren’t using your
library to solve their business problems

What they really want is:
PhD Program in YourLib
Guess What? Your users aren’t using your
library to solve their business problems

What they really want is:
 * an extensive lecture of the theory behind
   your software
PhD Program in YourLib
Guess What? Your users aren’t using your
library to solve their business problems

What they really want is:
 * an extensive lecture of the theory behind
   your software
 * code-examples that are absent or - at the
    very least - ridiculously difficult to find
PhD Program in YourLib
Guess What? Your users aren’t using your
library to solve their business problems

What they really want is:
 * an extensive lecture of the theory behind
   your software
 * code-examples that are absent or - at the
    very least - ridiculously difficult to find
 * to spend hours reading before ever seeing
    one working example
PhD Program in YourLib
Guess What? Your users aren’t using your
library to solve their business problems
                                      i t! !!
What they really want is:
                               se e
                      Let’s
 * an extensive lecture of the theory behind
               L
   your software    -
           E W
 * code-examples that are absent or - at the
         K
    very least - ridiculously difficult to find
 * to spend hours reading before ever seeing
    one working example
Example: WAY Too Easy
Imagine is an Image manipulation library for PHP 5.3 inspired by Python's
PIL and other image libraries.

Here’s how you can use it:

<?php
use ImagineImageBox;
use ImagineImagePoint;

$imagine = new ImagineImagickImagine();
$image = $imagine->open('/path/to/image.jpg');

$image->resize(new Box(15, 25))
    ->rotate(45)
    ->crop(new Point(0, 0), new Box(45, 45))
    ->save('/path/to/new/image.jpg');
Example: WAY Too Easy
Imagine is an Image manipulation library for PHP 5.3 inspired by Python's
PIL and other image libraries.

Here’s how you can use it:

<?php
use ImagineImageBox;
use ImagineImagePoint;

$imagine = new ImagineImagickImagine();
$image = $imagine->open('/path/to/image.jpg');

$image->resize(new Box(15, 25))
    ->rotate(45)
    ->crop(new Point(0, 0), new Box(45, 45))
    ->save('/path/to/new/image.jpg');
My Awesome Library
Image manipulation library for PHP 5.3 inspired by Python's PIL and other image libraries.

Basic Principles

The main purpose of Imagine is to provide all the necessary functionality to bring all native low level image processing libraries in PHP to the same simple and
intuitive OO API. Several things are necessary to accomplish that such as image manipulation tools (resize, crop, etc). There is always a drawing API, which is an
important object-oriented way for creating basic shapes and advanced charts. You can also write text on an image while still being abstracted away from.

When you talk about image manipulation, you should also talk about masking functionality and the theories behind it. In computer science, a mask is data that is
used for bitwise operations. Using a mask, multiple bits in a byte, nibble, word can be set either on, off or inverted from on to off (or vice versa) in a single bitwise
operation. You have the ability to apply black&white or grayscale images as masks, leading to semi-transparency or absolute transparency of the image the mask is
being applied to.

Philosophy

At AcmeCompany we’ve been discussing the idea of accessing acme data via APIs inside Acme and with some of our community for a while. In theory it’s easy to do
– in fact we already have an API working together with access via OAuth which we are using for testing internally at AcmeCompany.

However there are 3 things we want to get right before we open up access to our community to use the API:

 1.   We want to make sure that we’ve addressed all the privacy concerns with allowing 3rd parties to access some or all of this data. And we want to be sure that
      the Terms & Conditions protect the users data from being misused.
 2.   We want to give out some example code
 3.   We want to make sure our documentation is good

I’ve said “privacy concerns” so I expect some of you are worried straight away so I’ll expand on this and give a couple examples:

Requirements

The Imagine library has the following requirements:

 •    PHP 5.3+
Depending on the chosen Image implementation, you may need one of the following:

 •    GD2
My Awesome Library
Image manipulation library for PHP 5.3 inspired by Python's PIL and other image libraries.

Basic Principles

The main purpose of Imagine is to provide all the necessary functionality to bring all native low level image processing libraries in PHP to the same simple and
intuitive OO API. Several things are necessary to accomplish that such as image manipulation tools (resize, crop, etc). There is always a drawing API, which is an
important object-oriented way for creating basic shapes and advanced charts. You can also write text on an image while still being abstracted away from.

When you talk about image manipulation, you should also talk about masking functionality and the theories behind it. In computer science, a mask is data that is
used for bitwise operations. Using a mask, multiple bits in a byte, nibble, word can be set either on, off or inverted from on to off (or vice versa) in a single bitwise
operation. You have the ability to apply black&white or grayscale images as masks, leading to semi-transparency or absolute transparency of the image the mask is
being applied to.

Philosophy
                    Theory first: It’s important
At AcmeCompany we’ve been discussing the idea of accessing acme data via APIs inside Acme and with some of our community for a while. In theory it’s easy to do
– in fact we already have an API working together with access via OAuth which we are using for testing internally at AcmeCompany.



 1.                  to confuse your users
However there are 3 things we want to get right before we open up access to our community to use the API:

      We want to make sure that we’ve addressed all the privacy concerns with allowing 3rd parties to access some or all of this data. And we want to be sure that
      the Terms & Conditions protect the users data from being misused.
 2.   We want to give out some example code
 3.   We want to make sure our documentation is good

I’ve said “privacy concerns” so I expect some of you are worried straight away so I’ll expand on this and give a couple examples:

Requirements

The Imagine library has the following requirements:

 •    PHP 5.3+
Depending on the chosen Image implementation, you may need one of the following:

 •    GD2
My Awesome Library
Image manipulation library for PHP 5.3 inspired by Python's PIL and other image libraries.

Basic Principles

The main purpose of Imagine is to provide all the necessary functionality to bring all native low level image processing libraries in PHP to the same simple and



                    Theory first: It’s important
intuitive OO API. Several things are necessary to accomplish that such as image manipulation tools (resize, crop, etc). There is always a drawing API, which is an
important object-oriented way for creating basic shapes and advanced charts. You can also write text on an image while still being abstracted away from.

When you talk about image manipulation, you should also talk about masking functionality and the theories behind it. In computer science, a mask is data that is
used for bitwise operations. Using a mask, multiple bits in a byte, nibble, word can be set either on, off or inverted from on to off (or vice versa) in a single bitwise



                     to confuse your users
operation. You have the ability to apply black&white or grayscale images as masks, leading to semi-transparency or absolute transparency of the image the mask is
being applied to.

Philosophy

At AcmeCompany we’ve been discussing the idea of accessing acme data via APIs inside Acme and with some of our community for a while. In theory it’s easy to do
– in fact we already have an API working together with access via OAuth which we are using for testing internally at AcmeCompany.

However there are 3 things we want to get right before we open up access to our community to use the API:

 1.

 2.
 3.
                            If you *do* need
      We want to make sure that we’ve addressed all the privacy concerns with allowing 3rd parties to access some or all of this data. And we want to be sure that
      the Terms & Conditions protect the users data from being misused.
      We want to give out some example code
      We want to make sure our documentation is good



                         examples, put the most
I’ve said “privacy concerns” so I expect some of you are worried straight away so I’ll expand on this and give a couple examples:

Requirements



                           complex cases first
The Imagine library has the following requirements:

 •    PHP 5.3+
Depending on the chosen Image implementation, you may need one of the following:

 •    GD2
My Awesome Library
Image manipulation library for PHP 5.3 inspired by Python's PIL and other image libraries.

Basic Principles

The main purpose of Imagine is to provide all the necessary functionality to bring all native low level image processing libraries in PHP to the same simple and



                    Theory first: It’s important
intuitive OO API. Several things are necessary to accomplish that such as image manipulation tools (resize, crop, etc). There is always a drawing API, which is an
important object-oriented way for creating basic shapes and advanced charts. You can also write text on an image while still being abstracted away from.

When you talk about image manipulation, you should also talk about masking functionality and the theories behind it. In computer science, a mask is data that is
used for bitwise operations. Using a mask, multiple bits in a byte, nibble, word can be set either on, off or inverted from on to off (or vice versa) in a single bitwise



                     to confuse your users
operation. You have the ability to apply black&white or grayscale images as masks, leading to semi-transparency or absolute transparency of the image the mask is
being applied to.

Philosophy

At AcmeCompany we’ve been discussing the idea of accessing acme data via APIs inside Acme and with some of our community for a while. In theory it’s easy to do
– in fact we already have an API working together with access via OAuth which we are using for testing internally at AcmeCompany.

However there are 3 things we want to get right before we open up access to our community to use the API:

 1.

 2.
 3.
                            If you *do* need
      We want to make sure that we’ve addressed all the privacy concerns with allowing 3rd parties to access some or all of this data. And we want to be sure that
      the Terms & Conditions protect the users data from being misused.
      We want to give out some example code
      We want to make sure our documentation is good



                         examples, put the most
I’ve said “privacy concerns” so I expect some of you are worried straight away so I’ll expand on this and give a couple examples:

Requirements



                                Or else...
                           complex cases first
The Imagine library has the following requirements:

 •    PHP 5.3+
Depending on the chosen Image implementation, you may need one of the following:

 •    GD2
Expert Tip #4

Stay the hell away from
        Github
   Even though your project is open
  source, your users should keep their
     filthy hands off of your docs!
Expert Tip #5


    Include lot’s of
unnecessary information
The following options are available:
 * length
 * required
ard
The following options are available:
                  rw
 * length aigh tfo
          tr
       oS
 * required
    To
ard
           The following options are available:
                             rw
            * length aigh tfo
                     tr
                  oS
            * required
               To

The library can be easily customized through
several different options, each which allows you to
direct the internal behavior of the object. This is
done so that you can control over the most
common options without needing to subclass the
object itself. If you’d like to suggest new options,
you can do so by creating the feature and send a
patch. In the next section, we’ll talk about the
options that are available.
ard
           The following options are available:
                             rw
            * length aigh tfo
                     tr
                  oS
            * required
               To

The library can be easily customized through
several different options, each which allows you to
direct the internal behavior of the object. This is
done so that you can control over the most
common options without needing to subclass the
object itself. If you’d like to suggest new options,
you can do so by creating the feature and send a
patch. In the next section, we’ll talk about the
options that are available.
Thanks!

  Ryan Weaver
  @weaverryan
www.knplabs.com
Thanks!
  Questions?


  Ryan Weaver
  @weaverryan
www.knplabs.com
Thanks!
   Questions?
Too bad - RTFM :)

  Ryan Weaver
  @weaverryan
www.knplabs.com

Mais conteúdo relacionado

Mais de Ryan Weaver

Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and moreSymfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and moreRyan Weaver
 
Symfony: Your Next Microframework (SymfonyCon 2015)
Symfony: Your Next Microframework (SymfonyCon 2015)Symfony: Your Next Microframework (SymfonyCon 2015)
Symfony: Your Next Microframework (SymfonyCon 2015)Ryan Weaver
 
Guard Authentication: Powerful, Beautiful Security
Guard Authentication: Powerful, Beautiful SecurityGuard Authentication: Powerful, Beautiful Security
Guard Authentication: Powerful, Beautiful SecurityRyan Weaver
 
Grand Rapids PHP Meetup: Behavioral Driven Development with Behat
Grand Rapids PHP Meetup: Behavioral Driven Development with BehatGrand Rapids PHP Meetup: Behavioral Driven Development with Behat
Grand Rapids PHP Meetup: Behavioral Driven Development with BehatRyan Weaver
 
Master the New Core of Drupal 8 Now: with Symfony and Silex
Master the New Core of Drupal 8 Now: with Symfony and SilexMaster the New Core of Drupal 8 Now: with Symfony and Silex
Master the New Core of Drupal 8 Now: with Symfony and SilexRyan Weaver
 
Silex: Microframework y camino fácil de aprender Symfony
Silex: Microframework y camino fácil de aprender SymfonySilex: Microframework y camino fácil de aprender Symfony
Silex: Microframework y camino fácil de aprender SymfonyRyan Weaver
 
Drupal 8: Huge wins, a Bigger Community, and why you (and I) will Love it
Drupal 8: Huge wins, a Bigger Community, and why you (and I) will Love itDrupal 8: Huge wins, a Bigger Community, and why you (and I) will Love it
Drupal 8: Huge wins, a Bigger Community, and why you (and I) will Love itRyan Weaver
 
Cool like a Frontend Developer: Grunt, RequireJS, Bower and other Tools
Cool like a Frontend Developer: Grunt, RequireJS, Bower and other ToolsCool like a Frontend Developer: Grunt, RequireJS, Bower and other Tools
Cool like a Frontend Developer: Grunt, RequireJS, Bower and other ToolsRyan Weaver
 
The Wonderful World of Symfony Components
The Wonderful World of Symfony ComponentsThe Wonderful World of Symfony Components
The Wonderful World of Symfony ComponentsRyan Weaver
 
A PHP Christmas Miracle - 3 Frameworks, 1 app
A PHP Christmas Miracle - 3 Frameworks, 1 appA PHP Christmas Miracle - 3 Frameworks, 1 app
A PHP Christmas Miracle - 3 Frameworks, 1 appRyan Weaver
 
Symfony2: Get your project started
Symfony2: Get your project startedSymfony2: Get your project started
Symfony2: Get your project startedRyan Weaver
 
Symony2 A Next Generation PHP Framework
Symony2 A Next Generation PHP FrameworkSymony2 A Next Generation PHP Framework
Symony2 A Next Generation PHP FrameworkRyan Weaver
 
Hands-on with the Symfony2 Framework
Hands-on with the Symfony2 FrameworkHands-on with the Symfony2 Framework
Hands-on with the Symfony2 FrameworkRyan Weaver
 
Being Dangerous with Twig (Symfony Live Paris)
Being Dangerous with Twig (Symfony Live Paris)Being Dangerous with Twig (Symfony Live Paris)
Being Dangerous with Twig (Symfony Live Paris)Ryan Weaver
 
Doctrine2 In 10 Minutes
Doctrine2 In 10 MinutesDoctrine2 In 10 Minutes
Doctrine2 In 10 MinutesRyan Weaver
 
Dependency Injection: Make your enemies fear you
Dependency Injection: Make your enemies fear youDependency Injection: Make your enemies fear you
Dependency Injection: Make your enemies fear youRyan Weaver
 
The Art of Doctrine Migrations
The Art of Doctrine MigrationsThe Art of Doctrine Migrations
The Art of Doctrine MigrationsRyan Weaver
 

Mais de Ryan Weaver (17)

Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and moreSymfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
 
Symfony: Your Next Microframework (SymfonyCon 2015)
Symfony: Your Next Microframework (SymfonyCon 2015)Symfony: Your Next Microframework (SymfonyCon 2015)
Symfony: Your Next Microframework (SymfonyCon 2015)
 
Guard Authentication: Powerful, Beautiful Security
Guard Authentication: Powerful, Beautiful SecurityGuard Authentication: Powerful, Beautiful Security
Guard Authentication: Powerful, Beautiful Security
 
Grand Rapids PHP Meetup: Behavioral Driven Development with Behat
Grand Rapids PHP Meetup: Behavioral Driven Development with BehatGrand Rapids PHP Meetup: Behavioral Driven Development with Behat
Grand Rapids PHP Meetup: Behavioral Driven Development with Behat
 
Master the New Core of Drupal 8 Now: with Symfony and Silex
Master the New Core of Drupal 8 Now: with Symfony and SilexMaster the New Core of Drupal 8 Now: with Symfony and Silex
Master the New Core of Drupal 8 Now: with Symfony and Silex
 
Silex: Microframework y camino fácil de aprender Symfony
Silex: Microframework y camino fácil de aprender SymfonySilex: Microframework y camino fácil de aprender Symfony
Silex: Microframework y camino fácil de aprender Symfony
 
Drupal 8: Huge wins, a Bigger Community, and why you (and I) will Love it
Drupal 8: Huge wins, a Bigger Community, and why you (and I) will Love itDrupal 8: Huge wins, a Bigger Community, and why you (and I) will Love it
Drupal 8: Huge wins, a Bigger Community, and why you (and I) will Love it
 
Cool like a Frontend Developer: Grunt, RequireJS, Bower and other Tools
Cool like a Frontend Developer: Grunt, RequireJS, Bower and other ToolsCool like a Frontend Developer: Grunt, RequireJS, Bower and other Tools
Cool like a Frontend Developer: Grunt, RequireJS, Bower and other Tools
 
The Wonderful World of Symfony Components
The Wonderful World of Symfony ComponentsThe Wonderful World of Symfony Components
The Wonderful World of Symfony Components
 
A PHP Christmas Miracle - 3 Frameworks, 1 app
A PHP Christmas Miracle - 3 Frameworks, 1 appA PHP Christmas Miracle - 3 Frameworks, 1 app
A PHP Christmas Miracle - 3 Frameworks, 1 app
 
Symfony2: Get your project started
Symfony2: Get your project startedSymfony2: Get your project started
Symfony2: Get your project started
 
Symony2 A Next Generation PHP Framework
Symony2 A Next Generation PHP FrameworkSymony2 A Next Generation PHP Framework
Symony2 A Next Generation PHP Framework
 
Hands-on with the Symfony2 Framework
Hands-on with the Symfony2 FrameworkHands-on with the Symfony2 Framework
Hands-on with the Symfony2 Framework
 
Being Dangerous with Twig (Symfony Live Paris)
Being Dangerous with Twig (Symfony Live Paris)Being Dangerous with Twig (Symfony Live Paris)
Being Dangerous with Twig (Symfony Live Paris)
 
Doctrine2 In 10 Minutes
Doctrine2 In 10 MinutesDoctrine2 In 10 Minutes
Doctrine2 In 10 Minutes
 
Dependency Injection: Make your enemies fear you
Dependency Injection: Make your enemies fear youDependency Injection: Make your enemies fear you
Dependency Injection: Make your enemies fear you
 
The Art of Doctrine Migrations
The Art of Doctrine MigrationsThe Art of Doctrine Migrations
The Art of Doctrine Migrations
 

Último

What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rick Flair
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 

Último (20)

What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 

5 Tips for Writing Terrible Documentation

  • 1. 5 Easy Ways to Revolutionize your Open Source Project by Writing Terrible Documentation Ryan Weaver @weaverryan
  • 2. Who is this dude? http://www.knplabs.com/en http://www.twitter.com/weaverryan http://www.github.com/weaverryan
  • 3. Who is this dude? • Co-author of the Symfony2 Documentation http://www.knplabs.com/en http://www.twitter.com/weaverryan http://www.github.com/weaverryan
  • 4. Who is this dude? • Co-author of the Symfony2 Documentation • Core Symfony2 contributor http://www.knplabs.com/en http://www.twitter.com/weaverryan http://www.github.com/weaverryan
  • 5. Who is this dude? • Co-author of the Symfony2 Documentation • Core Symfony2 contributor • CEO KnpLabs US http://www.knplabs.com/en http://www.twitter.com/weaverryan http://www.github.com/weaverryan
  • 6. Who is this dude? • Co-author of the Symfony2 Documentation • Core Symfony2 contributor • CEO KnpLabs US • Boyfriend of the much more talented @leannapelham http://www.knplabs.com/en http://www.twitter.com/weaverryan http://www.github.com/weaverryan
  • 7. Who is this dude? • Co-author of the Symfony2 Documentation • Core Symfony2 contributor • CEO KnpLabs US • Boyfriend of the much more talented @leannapelham http://www.knplabs.com/en http://www.twitter.com/weaverryan http://www.github.com/weaverryan
  • 8. Who is this dude? • Co-author of the Symfony2 Documentation If you like the presentation, • Core Symfony2 contributor :) she gets the iPad • CEO KnpLabs US • Boyfriend of the much more talented @leannapelham http://www.knplabs.com/en http://www.twitter.com/weaverryan http://www.github.com/weaverryan
  • 9. Act 1: Why good documentation is the worst thing since “goto”
  • 10. FU Good Docs Good documentation makes your users weak-minded
  • 11. Put your suit and tie on and join us in the penthouse
  • 12. Put your suit and tie on and join us in the penthouse Enterprise Businesses LOVE Shitty Documentation
  • 13.
  • 14. p i e s H i p
  • 15.
  • 16. Who can I make the check out to sir?
  • 17. Who can I make the check out to sir?
  • 18. Who can I make the check out to sir?
  • 19. Act 2: I’m sold! But how can *I* write shitty documentation?
  • 20. Expert Tip #1 Don’t write *any* Documentation
  • 22. Why no docs? • You’re a genius - your time should be spent writing the code only
  • 23. Why no docs? • You’re a genius - your time should be spent writing the code only • Your code is the most beautiful code ever written - why deprive your users of needing to look through it?
  • 24. Why no docs? static function load($class) {     if (strtolower(substr($class, 0, 6)) !== 'pear2') { • You’re a genius - your time should         return false;     }     $file = str_replace(array('_', ''), DIRECTORY_SEPARATOR, $class) . '.php'; be spent writing the code only     foreach (self::$paths as $path) {         if (file_exists($path . DIRECTORY_SEPARATOR . $file)) { OMFG your code is awesome!             require $path . DIRECTORY_SEPARATOR . $file;             if (!class_exists($class, false) && ! interface_exists($class, false)) { • Your code is the most beautiful                 die(new Exception('Class ' . $class . ' was not present in ' .                     $path . DIRECTORY_SEPARATOR . $file .                     '") [PEAR2_Autoload-0.2.3]')); code ever written - why deprive your             }             return true; users of needing to look through it?         }     } // ... }
  • 25. Expert Tip #2 *Never* proofread your Documentation
  • 26. Perfection on the first try
  • 27. Perfection on the first try “Documentation is like a dream - it’s the raw expression of how you subconsciously want your application to work. Proofreading it clouds that interpretation and abstracts away from its perfection”
  • 28. Perfection on the first try “Documentation is like a dream - it’s the raw expression of how you subconsciously want your application to work. Proofreading it clouds that interpretation and abstracts away from its perfection” ~ Me (a quote I made up this morning instead of writing documentation)
  • 29.
  • 30. • Smart guys/gals like you don’t make mistakes, so get back to coding bro!
  • 31. • Smart guys/gals like you don’t make mistakes, so get back to coding bro! • Typos show us that you’re human - that you have a sensitive side
  • 32. • Smart guys/gals like you don’t make mistakes, so get back to coding bro! • Typos show us that you’re human - that you have a sensitive side Be aware that teh initial release...
  • 33. • Smart guys/gals like you don’t make mistakes, so get back to coding bro! • Typos show us that you’re human - that you have a sensitive side Be aware that teh initial release...
  • 34. • Smart guys/gals like you don’t make mistakes, so get back to coding bro! • Typos show us that you’re human - that you have a sensitive side Be aware that teh initial release... He probably cries during romantic comedies
  • 35. • Smart guys/gals like you don’t make mistakes, so get back to coding bro! • Typos show us that you’re human - that you have a sensitive side Be aware that teh initial release... He probably cries ... I cry during during romantic romantic comedies comedies
  • 36. • Smart guys/gals like you don’t make mistakes, so get back to coding bro! • Typos show us that you’re human - that you have a sensitive side Be aware that teh initial release... He probably cries Let’s use his ... I cry during during romantic library for our big romantic comedies comedies expensive project!
  • 37. Expert Tip #3 Theory over Practice
  • 38. PhD Program in YourLib
  • 39. PhD Program in YourLib Guess What? Your users aren’t using your library to solve their business problems
  • 40. PhD Program in YourLib Guess What? Your users aren’t using your library to solve their business problems What they really want is:
  • 41. PhD Program in YourLib Guess What? Your users aren’t using your library to solve their business problems What they really want is: * an extensive lecture of the theory behind your software
  • 42. PhD Program in YourLib Guess What? Your users aren’t using your library to solve their business problems What they really want is: * an extensive lecture of the theory behind your software * code-examples that are absent or - at the very least - ridiculously difficult to find
  • 43. PhD Program in YourLib Guess What? Your users aren’t using your library to solve their business problems What they really want is: * an extensive lecture of the theory behind your software * code-examples that are absent or - at the very least - ridiculously difficult to find * to spend hours reading before ever seeing one working example
  • 44. PhD Program in YourLib Guess What? Your users aren’t using your library to solve their business problems i t! !! What they really want is: se e Let’s * an extensive lecture of the theory behind L your software - E W * code-examples that are absent or - at the K very least - ridiculously difficult to find * to spend hours reading before ever seeing one working example
  • 45. Example: WAY Too Easy Imagine is an Image manipulation library for PHP 5.3 inspired by Python's PIL and other image libraries. Here’s how you can use it: <?php use ImagineImageBox; use ImagineImagePoint; $imagine = new ImagineImagickImagine(); $image = $imagine->open('/path/to/image.jpg'); $image->resize(new Box(15, 25)) ->rotate(45) ->crop(new Point(0, 0), new Box(45, 45)) ->save('/path/to/new/image.jpg');
  • 46. Example: WAY Too Easy Imagine is an Image manipulation library for PHP 5.3 inspired by Python's PIL and other image libraries. Here’s how you can use it: <?php use ImagineImageBox; use ImagineImagePoint; $imagine = new ImagineImagickImagine(); $image = $imagine->open('/path/to/image.jpg'); $image->resize(new Box(15, 25)) ->rotate(45) ->crop(new Point(0, 0), new Box(45, 45)) ->save('/path/to/new/image.jpg');
  • 47. My Awesome Library Image manipulation library for PHP 5.3 inspired by Python's PIL and other image libraries. Basic Principles The main purpose of Imagine is to provide all the necessary functionality to bring all native low level image processing libraries in PHP to the same simple and intuitive OO API. Several things are necessary to accomplish that such as image manipulation tools (resize, crop, etc). There is always a drawing API, which is an important object-oriented way for creating basic shapes and advanced charts. You can also write text on an image while still being abstracted away from. When you talk about image manipulation, you should also talk about masking functionality and the theories behind it. In computer science, a mask is data that is used for bitwise operations. Using a mask, multiple bits in a byte, nibble, word can be set either on, off or inverted from on to off (or vice versa) in a single bitwise operation. You have the ability to apply black&white or grayscale images as masks, leading to semi-transparency or absolute transparency of the image the mask is being applied to. Philosophy At AcmeCompany we’ve been discussing the idea of accessing acme data via APIs inside Acme and with some of our community for a while. In theory it’s easy to do – in fact we already have an API working together with access via OAuth which we are using for testing internally at AcmeCompany. However there are 3 things we want to get right before we open up access to our community to use the API: 1. We want to make sure that we’ve addressed all the privacy concerns with allowing 3rd parties to access some or all of this data. And we want to be sure that the Terms & Conditions protect the users data from being misused. 2. We want to give out some example code 3. We want to make sure our documentation is good I’ve said “privacy concerns” so I expect some of you are worried straight away so I’ll expand on this and give a couple examples: Requirements The Imagine library has the following requirements: • PHP 5.3+ Depending on the chosen Image implementation, you may need one of the following: • GD2
  • 48. My Awesome Library Image manipulation library for PHP 5.3 inspired by Python's PIL and other image libraries. Basic Principles The main purpose of Imagine is to provide all the necessary functionality to bring all native low level image processing libraries in PHP to the same simple and intuitive OO API. Several things are necessary to accomplish that such as image manipulation tools (resize, crop, etc). There is always a drawing API, which is an important object-oriented way for creating basic shapes and advanced charts. You can also write text on an image while still being abstracted away from. When you talk about image manipulation, you should also talk about masking functionality and the theories behind it. In computer science, a mask is data that is used for bitwise operations. Using a mask, multiple bits in a byte, nibble, word can be set either on, off or inverted from on to off (or vice versa) in a single bitwise operation. You have the ability to apply black&white or grayscale images as masks, leading to semi-transparency or absolute transparency of the image the mask is being applied to. Philosophy Theory first: It’s important At AcmeCompany we’ve been discussing the idea of accessing acme data via APIs inside Acme and with some of our community for a while. In theory it’s easy to do – in fact we already have an API working together with access via OAuth which we are using for testing internally at AcmeCompany. 1. to confuse your users However there are 3 things we want to get right before we open up access to our community to use the API: We want to make sure that we’ve addressed all the privacy concerns with allowing 3rd parties to access some or all of this data. And we want to be sure that the Terms & Conditions protect the users data from being misused. 2. We want to give out some example code 3. We want to make sure our documentation is good I’ve said “privacy concerns” so I expect some of you are worried straight away so I’ll expand on this and give a couple examples: Requirements The Imagine library has the following requirements: • PHP 5.3+ Depending on the chosen Image implementation, you may need one of the following: • GD2
  • 49. My Awesome Library Image manipulation library for PHP 5.3 inspired by Python's PIL and other image libraries. Basic Principles The main purpose of Imagine is to provide all the necessary functionality to bring all native low level image processing libraries in PHP to the same simple and Theory first: It’s important intuitive OO API. Several things are necessary to accomplish that such as image manipulation tools (resize, crop, etc). There is always a drawing API, which is an important object-oriented way for creating basic shapes and advanced charts. You can also write text on an image while still being abstracted away from. When you talk about image manipulation, you should also talk about masking functionality and the theories behind it. In computer science, a mask is data that is used for bitwise operations. Using a mask, multiple bits in a byte, nibble, word can be set either on, off or inverted from on to off (or vice versa) in a single bitwise to confuse your users operation. You have the ability to apply black&white or grayscale images as masks, leading to semi-transparency or absolute transparency of the image the mask is being applied to. Philosophy At AcmeCompany we’ve been discussing the idea of accessing acme data via APIs inside Acme and with some of our community for a while. In theory it’s easy to do – in fact we already have an API working together with access via OAuth which we are using for testing internally at AcmeCompany. However there are 3 things we want to get right before we open up access to our community to use the API: 1. 2. 3. If you *do* need We want to make sure that we’ve addressed all the privacy concerns with allowing 3rd parties to access some or all of this data. And we want to be sure that the Terms & Conditions protect the users data from being misused. We want to give out some example code We want to make sure our documentation is good examples, put the most I’ve said “privacy concerns” so I expect some of you are worried straight away so I’ll expand on this and give a couple examples: Requirements complex cases first The Imagine library has the following requirements: • PHP 5.3+ Depending on the chosen Image implementation, you may need one of the following: • GD2
  • 50. My Awesome Library Image manipulation library for PHP 5.3 inspired by Python's PIL and other image libraries. Basic Principles The main purpose of Imagine is to provide all the necessary functionality to bring all native low level image processing libraries in PHP to the same simple and Theory first: It’s important intuitive OO API. Several things are necessary to accomplish that such as image manipulation tools (resize, crop, etc). There is always a drawing API, which is an important object-oriented way for creating basic shapes and advanced charts. You can also write text on an image while still being abstracted away from. When you talk about image manipulation, you should also talk about masking functionality and the theories behind it. In computer science, a mask is data that is used for bitwise operations. Using a mask, multiple bits in a byte, nibble, word can be set either on, off or inverted from on to off (or vice versa) in a single bitwise to confuse your users operation. You have the ability to apply black&white or grayscale images as masks, leading to semi-transparency or absolute transparency of the image the mask is being applied to. Philosophy At AcmeCompany we’ve been discussing the idea of accessing acme data via APIs inside Acme and with some of our community for a while. In theory it’s easy to do – in fact we already have an API working together with access via OAuth which we are using for testing internally at AcmeCompany. However there are 3 things we want to get right before we open up access to our community to use the API: 1. 2. 3. If you *do* need We want to make sure that we’ve addressed all the privacy concerns with allowing 3rd parties to access some or all of this data. And we want to be sure that the Terms & Conditions protect the users data from being misused. We want to give out some example code We want to make sure our documentation is good examples, put the most I’ve said “privacy concerns” so I expect some of you are worried straight away so I’ll expand on this and give a couple examples: Requirements Or else... complex cases first The Imagine library has the following requirements: • PHP 5.3+ Depending on the chosen Image implementation, you may need one of the following: • GD2
  • 51. Expert Tip #4 Stay the hell away from Github Even though your project is open source, your users should keep their filthy hands off of your docs!
  • 52. Expert Tip #5 Include lot’s of unnecessary information
  • 53. The following options are available: * length * required
  • 54. ard The following options are available: rw * length aigh tfo tr oS * required To
  • 55. ard The following options are available: rw * length aigh tfo tr oS * required To The library can be easily customized through several different options, each which allows you to direct the internal behavior of the object. This is done so that you can control over the most common options without needing to subclass the object itself. If you’d like to suggest new options, you can do so by creating the feature and send a patch. In the next section, we’ll talk about the options that are available.
  • 56. ard The following options are available: rw * length aigh tfo tr oS * required To The library can be easily customized through several different options, each which allows you to direct the internal behavior of the object. This is done so that you can control over the most common options without needing to subclass the object itself. If you’d like to suggest new options, you can do so by creating the feature and send a patch. In the next section, we’ll talk about the options that are available.
  • 57. Thanks! Ryan Weaver @weaverryan www.knplabs.com
  • 58. Thanks! Questions? Ryan Weaver @weaverryan www.knplabs.com
  • 59. Thanks! Questions? Too bad - RTFM :) Ryan Weaver @weaverryan www.knplabs.com

Notas do Editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n