API Design Shawn M Moore Best Practical Solutions

Total Page:16

File Type:pdf, Size:1020Kb

API Design Shawn M Moore Best Practical Solutions API Design Shawn M Moore Best Practical Solutions http://sartak.org Thursday, September 10, 2009 Presented YAPC::Asia, 2009-09-10. Tokyo Institute of Technology, Tokyo, Japan. GoogleのテックトークでもAPI設計の話が出てました Thursday, September 10, 2009 There is a good Google Tech Talk on "how to design an API and why it matters". There isn't a whole lot of overlap between this talk and that one. Watch that one. http://www.youtube.com/watch?v=aAb7hSCtvGw CC-BY-SA Yuval Kogman, 2006 Thursday, September 10, 2009 At YAPC::NA 2009, this guy, Hans Dieter Pearcey aka confound aka hdp, presented a talk about Dist::Zilla. http://www.flickr.com/photos/nufn/179250512/ CC-BY-SA Yuval Kogman, 2006 Thursday, September 10, 2009 Dist::Zilla was written by this other guy, Ricardo Signes, aka rjbs. http://www.flickr.com/photos/nufn/179250812/ CC-BY-SA Hans Dieter Pearcey, 2009 Thursday, September 10, 2009 Dieter presented this slide about Dist::Zilla's pluggable design. I loved it and I wanted to devote an entire talk to its glory. http://weftsoar.net/~hdp/dzil/ Moose Path::Dispatcher HTTP::Engine Dist::Zilla IM::Engine 今日はこれらのプロジェクトが持つクールな APIの話をします Thursday, September 10, 2009 I'm here to highlight really cool API designs that these projects have. In particular, they design for extensibility and pluggability. Extensibility is really important to the current and future success of these projects. CC-BY-SA-NC Will Spaetzel, 2005 Thursday, September 10, 2009 If you haven't noticed yet, this talk is going to be very Moose-heavy. All those modules have the Moose nature. http://www.flickr.com/photos/redune/6562798/ THE SECRET 秘訣、といってもみなさんご存じだと思いますが Thursday, September 10, 2009 There is a poorly kept secret for designing great APIs. I hope that all of you already do this, but you probably do not do it enough. THE SECRET WRITE 大事なのはテストを書く、ということTESTS Thursday, September 10, 2009 Write tests. WRITE TESTS WRITEWRITE TESTS TESTS WRITEWRITE TESTS TESTS 血管切れるまでテストを書いてください Thursday, September 10, 2009 Write so many tests your ears bleed. I am not joking! DO THIS WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITEWRITE WRITE WRITE WRITE WRITE WRITE なにはなくとも、とにかくテスト Thursday, September 10, 2009 If you remember nothing else, remember to write tests! Test! use base 'Class::Accessor::Fast'; __PACKAGE__->mk_ro_accessors('birthday'); use Moose; has birthday => (is => 'ro'); テストを書けば使いやすいAPIかどうかがわかります Thursday, September 10, 2009 Write tests so you can tell if your API is painful to use. Which of these would you rather be stuck with? Make it painless for your users. Some of them might be using your module a lot. If it's tedious to use your module... Test! 使いづらいモジュールは使ってもらえませんから Thursday, September 10, 2009 ... then you'll piss your users of. They'll leave and use some other module, or worse, find out where you live. Test! Thursday, September 10, 2009 This is Jesse Vincent, the nicest guy in the world :) Test! Thursday, September 10, 2009 Test! Thursday, September 10, 2009 Moose package Point; use Moose; has x => ( is => 'ro', isa => 'Num', ); この先はMooseベースの話なので少し解説 Thursday, September 10, 2009 Moose serves as the foundation for the rest of the talk, so I want to explain what it "got right" in terms of its API. These next few slides are difcult but it will get clearer and less heady, so wake up soon if you space out. Metaobject Protocol Class::MOP MooseはClass::MOPのラッパです Thursday, September 10, 2009 Moose is built on top of a metaobject protocol. This is Class::MOP. See my "Extending Moose for Applications" talk for a proper introduction to the metaobject protocol http://sartak.org/talks/yapc-na-2009/extending-moose/ Metaobject Protocol has cache => ( is => 'ro', ); 要するにクラスの各パーツはすべてオブジェクトです Thursday, September 10, 2009 The MOP is vital to Moose's operation. Basically, it means that every part of your class is represented by an object. Metaobject Protocol has cache => ( is => 'ro', ); Moose::Meta::Attribute hasはMoose::Meta::Attributeのインスタンスを作ります Thursday, September 10, 2009 When you say "has" it creates an instance of the Moose::Meta::Attribute class, which holds information like the attribute's name, its type constraint, default value, etc. Metaobject Protocol has cache => ( is => 'ro', ); Moose::Meta::Method::Accessor これでcacheというアクセサメソッドが作られます Thursday, September 10, 2009 The is => 'ro' option creates a "cache" method in your class. It also creates an object of class Moose::Meta::Method::Accessor to represent that "cache" method. Metaobject Protocol class PersistentAttr extends Moose::Meta::Attribute { … } has cache => ( metaclass => 'PersistentAttr', is => 'ro', ); Mooseのクラスを拡張すれば独自機能も追加できます Thursday, September 10, 2009 This is important because we can subclass Moose's class to add our own special logic, such as making the cache persist across processes. Subclassing and adding logic is ordinary object- oriented programming! Metaobject Protocol role PersistentAttr { … } has cache => ( traits => ['PersistentAttr'], is => 'ro', ); アトリビュートオブジェクトにロールを組み込むこと もできます Thursday, September 10, 2009 We can also specify roles to apply to cache's attribute object. This is slightly better because it means a single attribute can have many extensions. Just like how it's better to design with roles than subclasses in ordinary programming. MooseX ほとんどのMooseXはMOPを利用しています Thursday, September 10, 2009 The metaobject protocol powers most of the MooseX modules. In my opinion, the metaobject protocol is responsible for a very large part of Moose's popularity. The other reason for Moose's popularity is it enables concise class code. Sugar Layer Mooseはシュガー層がきれいに分離しているのも特徴 です Thursday, September 10, 2009 Moose also makes a very clean separation between its sugar layer and the rest of the system. Sugar Layer my $class = get_class(); あるクラスを利用したいとします Thursday, September 10, 2009 Say you wanted to get ahold of some class... Sugar Layer my $class = get_class(); $class->has( birthday => ( is => 'ro', ) ); hasはメソッドではないのでこれではだめです Thursday, September 10, 2009 Then add an attribute to it. This doesn't work because "has" is not a method. Its first parameter is supposed to be the attribute name, not the class you're adding the attribute to. Sugar Layer my $class = get_class(); no strict 'refs'; *{$class.'::has'}->( birthday => ( is => 'ro', ) ); だからといってhasを 関数として呼ぶのはばかげています Thursday, September 10, 2009 So we have to call $class's "has" as a function. This kind of thing is ridiculous. Maybe the other class has used "no Moose" so that "has" is deleted. Or perhaps it renamed "has". Sugar Layer my $class = get_class(); no strict 'refs'; *{$class.'::has'}->( birthday => ( is => 'ro', ) ); それに見づらいですよね Thursday, September 10, 2009 Not to mention how ugly this mess is. Sugar Layer Class::MOP::Class ->initialize($class) ->add_attribute( $name, %options); hasは基本的にはadd_attributeのラッパです Thursday, September 10, 2009 If we look at the source code of Moose, we can see "has" is basically a wrapper around the "add_attribute" method of the Class::MOP::Class instance. Sugar Layer my $class = get_class(); $class->meta->add_attribute( birthday => ( is => 'ro', ) ); これでずいぶんマシになりました Thursday, September 10, 2009 Much better. There's no messy syntax. This can be used outside of $class's namespace just fine. This also works if class has cleaned up after Moose with "no Moose" or namespace::clean. Sugar Layer use MooseX::Declare; class Point3D extends Point { has z => (…); after clear { $self->z(0); } } シュガー層が分離しているので修正も楽です Thursday, September 10, 2009 Having a clean sugar layer means that other people can write better sugar. I like the idea of providing a separate Devel::Declare-powered sugar layer in a separate distribution. It forces you to cleanly separate the pieces. Path::Dispatcher use Path::Dispatcher::Declarative -base; on ['wield', qr/^\w+$/] => sub { wield_weapon($2); } under display => sub { on inventory => sub { show_inventory }; on score => sub { show_score }; }; YourDispatcher->run('display score'); これはJifty::DispatcherをProphetで 使うために書きました Thursday, September 10, 2009 Path::Dispatcher is a standalone-URI dispatcher. I wrote it because I wanted Jifty::Dispatcher for Prophet's command-line interface. This is its sugar layer. Like Moose, it has a clean, extensible API if you want the freedom to do unusual things. Path::Dispatcher::Declarative use Sub::Exporter -setup => { exports => [ on => \&build_on, under => \&build_under, …, ], }; もともとはSub::Exporterを使っていました Thursday, September 10, 2009 It used to be that Path::Dispatcher::Declarative was implemented as an ordinary Sub::Exporter-using module. Path::Dispatcher::Declarative use Sub::Exporter -setup => { exports => [ on => \&build_on, under => \&build_under, …, ], }; でもこれではまったく拡張性がありません Thursday, September 10, 2009 This is not at all extensible. You can't change the meaning of "on" or "under" because these are hardcoded. Reusing this sugar would be painful as well. Path::Dispatcher::Builder Robert Krimen "grink" Robert Krimenが拡張したがったので Thursday, September 10, 2009 This was fine for a few weeks, but then Robert Krimen started using Path::Dispatcher. And he wanted to extend it for a module he was writing called Getopt::Chain. Path::Dispatcher::Builder return { on => sub { $builder->on(@_) }, under => sub { $builder->under(@_) }, …, }; サブクラス化してロジック変更できるようにしました Thursday, September 10, 2009 Path::Dispatcher::Builder makes the sugar layer creation use OOP. This let Robert subclass Path::Dispatcher::Builder and use it for his own modules. He can reuse the regular dispatcher logic, tweak it by overriding methods, and add his own behavior. grink++ OOのシュガーは本当にいいですよ Thursday, September 10, 2009 OO sugar is
Recommended publications
  • Perl Baseless Myths & Startling Realities
    http://xkcd.com/224/ 1 Perl Baseless Myths & Startling Realities by Tim Bunce, February 2008 2 Parrot and Perl 6 portion incomplete due to lack of time (not lack of myths!) Realities - I'm positive about Perl Not negative about other languages - Pick any language well suited to the task - Good developers are always most important, whatever language is used 3 DISPEL myths UPDATE about perl Who am I? - Tim Bunce - Author of the Perl DBI module - Using Perl since 1991 - Involved in the development of Perl 5 - “Pumpkin” for 5.4.x maintenance releases - http://blog.timbunce.org 4 Perl 5.4.x 1997-1998 Living on the west coast of Ireland ~ Myths ~ 5 http://www.bleaklow.com/blog/2003/08/new_perl_6_book_announced.html ~ Myths ~ - Perl is dead - Perl is hard to read / test / maintain - Perl 6 is killing Perl 5 6 Another myth: Perl is slow: http://www.tbray.org/ongoing/When/200x/2007/10/30/WF-Results ~ Myths ~ - Perl is dead - Perl is hard to read / test / maintain - Perl 6 is killing Perl 5 7 Perl 5 - Perl 5 isn’t the new kid on the block - Perl is 21 years old - Perl 5 is 14 years old - A mature language with a mature culture 8 How many times Microsoft has changed developer technologies in the last 14 years... 9 10 You can guess where thatʼs leading... From “The State of the Onion 10” by Larry Wall, 2006 http://www.perl.com/pub/a/2006/09/21/onion.html?page=3 Buzz != Jobs - Perl5 hasn’t been generating buzz recently - It’s just getting on with the job - Lots of jobs - just not all in web development 11 Web developers tend to have a narrow focus.
    [Show full text]
  • Current Issues in Perl Programming Overview
    Current Issues In Perl Programming Lukas Thiemeier Current Issues In Perl Programming DESY, Zeuthen, 2011-04-26 Overview > Introduction > Moose – modern object-orientation in Perl > DBIx::Class – comfortable an flexible database access > Catalyst – a MVC web application framework Lukas Thiemeier | Current issues in Perl programming | 2011-04-26 | Page 2 Introduction > What is this talk about? . Modern Perl can do more than most people know . A quick overview about some modern features . Illustrated with some short examples > What is this talk not about? . Not an introduction to the Perl programming language . Not a Perl tutorial . Not a complete list of all current issues in Perl 5 . Not a complete HowTo for the covered topics Lukas Thiemeier | Current issues in Perl programming | 2011-04-26 | Page 3 Overview > Introduction > Moose – modern object-orientation in Perl . About Moose . Creating and extending classes . Some advanced features > DBIx::Class – comfortable an flexible database access > Catalyst – a MVC web application framework Lukas Thiemeier | Current issues in Perl programming | 2011-04-26 | Page 4 About Moose > “A postmodern object system for Perl 5” > Based on Class::MOP, a metaclass system for Perl 5 > Look and feel similar to the Perl 6 object syntax “The main goal of Moose is to make Perl 5 Object Oriented programming easier, more consistent and less tedious. With Moose you can to think more about what you want to do and less about the mechanics of OOP.” Lukas Thiemeier | Current issues in Perl programming | 2011-04-26 | Page 5 Creating Classes > A very simple Moose-Class: . Create a file called “MyAnimalClass.pm” with the following content: package MyAnimalClass; use Moose; no Moose; 1; Lukas Thiemeier | Current issues in Perl programming | 2011-04-26 | Page 6 Creating Classes > A very simple Moose-Class: The package name is used as class name.
    [Show full text]
  • Lifting Moose.Key
    Lifting Moose Shawn M Moore @sartak Behavior State Identity Object-oriented programming is about behavior, state, and identity. Behavior as in message passing, method calls. State as in attributes, properties. Identity as in two objects with the same values for their properties are distinct. Every object-oriented programming language provides these core principles. But then there’s the details. Ohh the details. Class vs prototype “final” or open Behavior Dynamic or static State Generic methods Identity Traits / Roles Operator overload Rebless Every programming language provides a unique take on object-oriented programming. For example, some languages provide inheritance via classes, others via prototype. Some have “final” declarations, some have dynamic dispatch, some generic methods, etc. etc. It’s almost like you could pick any mix of features that make sense together and there’d be a language there. Some exist even where their list of features don’t really make sense together. Object-oriented Programming C# Java CLOS C++ PHP Lua Elk JS Perl Py Ruby Smalltalk We could even treat languages as points on a plane, where position is determined by the set of OOP tradeoffs that language has made. Perl is here. Obviously. And then there’s a bunch of other languages that are more or less different from other languages. By the way, don’t take this chart too literally; it’s merely demonstrative. PHP Lua Perl Python Ruby Smalltalk Let’s zoom in around Perl. All the usual suspects are here. None of these languages provide exactly the same OOP. For example Ruby lets you subclass builtin types like string and array.
    [Show full text]
  • A Retrospective on Pugs ☺
    ☺ A retrospective on Pugs ☺ Ingo Blechschmidt <[email protected]> Augsburg.pm (April 13th, 2015) Pugs, an experimental Perl 6 platform: a retrospective 1 / 37 April 13th, 2015 Abstract. “Hi. Today I have started working on specifying and implementing Feath- erweight Perl 6 (FP6), a side-effect-free subset of Perl 6.” Audrey Tang used these words to unveil the Pugs project in February of 2005. Initially conceived as an imple- mentation of a small subset of Perl 6 in Haskell, the project quickly grew to contain a full-fledged compiler and interpreter for Perl 6 and aracted a large and diverse community. e talk will give a subjective survey of the history of Pugs. We will pay particular aention to the special manner with which Audrey led the project and what the phi- losophy “-Ofun” meant to the developers. We’ll also discuss which parts of Pugs were absorbed into other implementations of Perl 6 and which influence Pugs had on the Perl and Haskell communities. About me. I contributed to Pugs as a school student in 2005, at first by porting modules and writing tests, then gradually also by writing Haskell code and later by implement- ing a JavaScript backend. Audrey and the unique spirit in the Pugs community had a strong and lasting influence on me (exposing me to Haskell, category theory, and a beautiful way of tending communities); I look back on very exciting and fun days. Warning. e account is mostly from memory and not properly researched. Try not to trust it! Also note that the timeline covers only the year 2005 and that the code excerpts are edited for legibility, i.
    [Show full text]
  • Perl 6 Audrey Tang
    Deploying Perl 6 Audrey Tang 1 Perl 6 is here Today! 2 Perl 6 is here Today! (YAPC::NA 2005) 3 Pugs 6.2.12 •Released on June 26th •3x faster build time •10x faster compilation •2x faster runtime •2000+ commits since 6.2.11 4 Parrot 0.4.5 •Released last June 19th •Unicode identifiers •Hierarchical namespace •New .NET CLR translator •Much faster compiler tools 5 Great for experimenting 6 But not for production 7 ...not this Christmas 8 9 CPAN is the language 10 Perl is just its syntax 11 Perl 5.000b3h (October 1994) 12 • use 5.000; • use strict; • require 'fastcwd.pl'; • require 'newgetopt.pl'; • require 'exceptions.pl'; • # ... • 13 Continuity++ 14 Pugs 6.2.2 (June 2005) 15 • use v6-pugs; • use perl5:DBI; • use perl5:Encode; • use perl5:Template; • # ... • 16 Still need to install Pugs 17 Perl 5.9.3 (Jan 2006) 18 • use v5.9.3; • use feature qw(switch say err ~~); • given (shift()) { • when ['‐h', '‐‐help'] { • say "Usage: $0"; • } • default { • $0 ~~ 'moose.exe' err die "Not Moose"; • } • } • 19 How to get Perl 6 into Production? 20 Production • Work with existing code • Must support Perl 5 and XS • No from‐scratch rewrites 21 Frontends? Tcl Python Scheme Parrot 22 Frontends? Tcl Python Scheme Perl 5 (Ponie) Parrot Perl 6 23 Backends! Pugs Java Haskell Perl 5 Script 24 Backends! JVM? YARV? Pugs CLR? PyPy? Java Haskell Perl 5 Script 25 Pugs on Perl 5 26 Perl 6 Runtime Implemented as Perl 5 Modules 27 Sane Perl 5 (not source filters) 28 Available On CPAN Today 29 Moose.pm ☯ 30 What is Moose? • Complete object model for Perl 5 • Based on the
    [Show full text]
  • Perl Baseless Myths & Startling Realities
    http://xkcd.com/224/ Perl Baseless Myths & Startling Realities by Tim Bunce, July 2008 Prefer ‘Good Developers’ over ‘Good Languages’ “For all program aspects investigated, the performance variability that derives from differences among programmers of the same language—as described by the bad-to-good ratios—is on average as large or larger than the variability found among the different languages.” — An empirical comparison of C, C++, Java, Perl, Python, Rexx, and Tcl. IEEE Computer Journal October 2000 Who am I? - Tim Bunce - Author of the Perl DBI module - Using Perl since 1991 - Involved in the development of Perl 5 - “Pumpkin” for 5.4.x maintenance releases - http://blog.timbunce.org ~ Myths ~ ~ Myths ~ - Perl is dead - Perl is hard to read / test / maintain - Perl 6 is killing Perl 5 ~ Myths ~ - Perl is dead - Perl is hard to read / test / maintain - Perl 6 is killing Perl 5 Perl 5 - Perl 5 isn’t the new kid on the block - Perl is 21 years old - Perl 5 is 14 years old - A mature language with a mature culture Buzz != Jobs - Perl5 hasn’t been generating buzz recently - It’s just getting on with the job - Lots of jobs - - just not all in web development Guess the Languages “web developer” Yes, Perl is growing more slowly than others but these are just “web developer” jobs “software engineer” Perl is mentioned in many more software engineer/developer jobs. “foo developer” Perl is the primary focus of more developer jobs. Want a fun new job? Become a Perl developer! Massive Module Market - Large and vibrant developer community - Over 15,000 distributions (58,000 modules) - Over 6,700 ‘authors’ (who make releases) - One quarter of all CPAN distributions have been updated in the last 4 months! - Half of all updated in the last 17 months! Top Modules -Many gems, including..
    [Show full text]
  • Pragmaticperl-Interviews-A4.Pdf
    Pragmatic Perl Interviews pragmaticperl.com 2013—2015 Editor and interviewer: Viacheslav Tykhanovskyi Covers: Marko Ivanyk Revision: 2018-03-02 11:22 © Pragmatic Perl Contents 1 Preface .......................................... 1 2 Alexis Sukrieh (April 2013) ............................... 2 3 Sawyer X (May 2013) .................................. 10 4 Stevan Little (September 2013) ............................. 17 5 chromatic (October 2013) ................................ 22 6 Marc Lehmann (November 2013) ............................ 29 7 Tokuhiro Matsuno (January 2014) ........................... 46 8 Randal Schwartz (February 2014) ........................... 53 9 Christian Walde (May 2014) .............................. 56 10 Florian Ragwitz (rafl) (June 2014) ........................... 62 11 Curtis “Ovid” Poe (September 2014) .......................... 70 12 Leon Timmermans (October 2014) ........................... 77 13 Olaf Alders (December 2014) .............................. 81 14 Ricardo Signes (January 2015) ............................. 87 15 Neil Bowers (February 2015) .............................. 94 16 Renée Bäcker (June 2015) ................................ 102 17 David Golden (July 2015) ................................ 109 18 Philippe Bruhat (Book) (August 2015) . 115 19 Author .......................................... 123 i Preface 1 Preface Hello there! You have downloaded a compilation of interviews done with Perl pro- grammers in Pragmatic Perl journal from 2013 to 2015. Since the journal itself is in Russian
    [Show full text]
  • Effective Perl Programming
    Effective Perl Programming Second Edition The Effective Software Development Series Scott Meyers, Consulting Editor Visit informit.com/esds for a complete list of available publications. he Effective Software Development Series provides expert advice on Tall aspects of modern software development. Books in the series are well written, technically sound, and of lasting value. Each describes the critical things experts always do—or always avoid—to produce outstanding software. Scott Meyers, author of the best-selling books Effective C++ (now in its third edition), More Effective C++, and Effective STL (all available in both print and electronic versions), conceived of the series and acts as its consulting editor. Authors in the series work with Meyers to create essential reading in a format that is familiar and accessible for software developers of every stripe. Effective Perl Programming Ways to Write Better, More Idiomatic Perl Second Edition Joseph N. Hall Joshua A. McAdams brian d foy Upper Saddle River, NJ • Boston • Indianapolis • San Francisco New York • Toronto • Montreal • London • Munich • Paris • Madrid Capetown • Sydney • Tokyo • Singapore • Mexico City Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this book, and the publisher was aware of a trademark claim, the designations have been printed with initial capital letters or in all capitals. The authors and publisher have taken care in the preparation of this book, but make no expressed or implied warranty of any kind and assume no responsibility for errors or omissions. No liability is assumed for incidental or consequential damages in connection with or arising out of the use of the information or programs contained herein.
    [Show full text]
  • Compiling Your Own Perl
    APPENDIX A Compiling Your Own Perl Compiling Perl on a Unix-like system is simple. First, obtain the source for Perl from CPAN (dppl6++_l]j*lanh*knc+on_+NA=@IA*dpih). Then input the following sequence of commands: p]nvtrblanh)1*4*4*p]n*cv _`lanh)1*4*4 od?kjbecqna)`ao i]ga i]gapaop oq`ki]gaejop]hh On most Unix systems, this code will result in your lanh being installed into the +qon+ hk_]h+ directory tree. If you want it installed elsewhere—for example, in the local directory in your home directory—then replace od?kjbecqna)`a with the following: od?kjbecqna)`ao)@lnabet9z+hk_]h+ which should enable you to install Perl on your computer without root access. Note that the )`ao flag uses all the default options for compiling Perl. If you know that you want nonstandard configuration, just use the flag )`a instead to be prompted for your requirements. Be aware that the source for Perl 5.10.0 requires a patch to work properly with Catalyst. This is fixed in subsequent versions of Perl 5.10. If you need to test code guaranteed to run on a wide range of systems, you should con- sider using Perl version 5.8.7. Perl versions greater than 5.8.7 contain features that were not available in earlier versions of Perl, so Perl 5.8.7 is feature complete for all versions of Perl that Catalyst will run on (version 5.8.1 and later). Put another way, versions 5.8.8 and later have new features that you can’t rely on in earlier releases.
    [Show full text]
  • Modern Perl, Fourth Edition
    Prepared exclusively for none ofyourbusiness Prepared exclusively for none ofyourbusiness Early Praise for Modern Perl, Fourth Edition A dozen years ago I was sure I knew what Perl looked like: unreadable and obscure. chromatic showed me beautiful, structured expressive code then. He’s the right guy to teach Modern Perl. He was writing it before it existed. ➤ Daniel Steinberg President, DimSumThinking, Inc. A tour de force of idiomatic code, Modern Perl teaches you not just “how” but also “why.” ➤ David Farrell Editor, PerlTricks.com If I had to pick a single book to teach Perl 5, this is the one I’d choose. As I read it, I was reminded of the first time I read K&R. It will teach everything that one needs to know to write Perl 5 well. ➤ David Golden Member, Perl 5 Porters, Autopragmatic, LLC I’m about to teach a new hire Perl using the first edition of Modern Perl. I’d much rather use the updated copy! ➤ Belden Lyman Principal Software Engineer, MediaMath It’s not the Perl book you deserve. It’s the Perl book you need. ➤ Gizmo Mathboy Co-founder, Greater Lafayette Open Source Symposium (GLOSSY) Prepared exclusively for none ofyourbusiness We've left this page blank to make the page numbers the same in the electronic and paper books. We tried just leaving it out, but then people wrote us to ask about the missing pages. Anyway, Eddy the Gerbil wanted to say “hello.” Prepared exclusively for none ofyourbusiness Modern Perl, Fourth Edition chromatic The Pragmatic Bookshelf Dallas, Texas • Raleigh, North Carolina Prepared exclusively for none ofyourbusiness Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks.
    [Show full text]
  • Pilay Sánchez Luis Humberto.Pdf.Part
    UNIVERSIDAD DE GUAYAQUIL FACULTAD DE CIENCIAS MATEMÁTICAS Y FÍSICAS CARRERA DE INGENIERÍA EN SISTEMAS COMPUTACIONALES “IMPLEMENTACIÓN DE UN SISTEMA HELP DESK EN LINUX PARA GESTIONAR INCIDENTES INFORMÁTICOS PARA LA NUBE INTERNA DE LA CARRERA DE INGENIERÍA EN SISTEMAS COMPUTACIONALES” TESIS DE GRADO Previa a la obtención del Título de: INGENIERO EN SISTEMAS COMPUTACIONALES AUTOR: LUIS HUMBERTO PILAY SÁNCHEZ TUTOR: ING. BERNARDO IÑIGUEZ MUÑOZ GUAYAQUIL – ECUADOR 2013 UNIVERSIDAD DE GUAYAQUIL FACULTAD DE CIENCIAS MATEMÁTICAS Y FÍSICAS CARRERA DE INGENIERÍA EN SISTEMAS COMPUTACIONALES “IMPLEMENTACIÓN DE UN SISTEMA HELP DESK EN LINUX PARA GESTIONAR INCIDENTES INFORMÁTICOS PARA LA NUBE INTERNA DE LA CARRERA DE INGENIERÍA EN SISTEMAS COMPUTACIONALES” TESIS DE GRADO Previa a la obtención del Título de: INGENIERO EN SISTEMAS COMPUTACIONALES LUIS HUMBERTO PILAY SÁNCHEZ TUTOR: ING. BERNARDO IÑIGUEZ MUÑOZ GUAYAQUIL – ECUADOR 2013 i REPOSITORIO NACIONAL EN CIENCIAS Y TECNOLOGÍA FICHA DE REGISTRO DE TESIS TÍTULO “ IMPLEMENTACIÓN DE UN SISTEMA HELP DESK EN LINUX PARA GESTIONAR INCIDENTES INFORMÁTICOS PARA LA NUBE INTERNA DE LA CARRERA DE INGENIERÍA EN SISTEMAS COMPUTACIONALES” REVISORES: FACULTAD: INSTITUCIÓN: Universidad de Guayaquil Ciencias Matemáticas y Físicas CARRERA: Ingeniería en Sistemas Computacionales FECHA DE PUBLICACIÓN: Agosto 2013 N° DE PÁGS.: 133 pág. ÁREA TEMÁTICA: Soporte a Usuarios PALABRAS CLAVES: Help Desk, Sistema gestor de tickets, OTRS, Nube, CISC. RESUMEN: El presente proyecto de tesis consiste en la implementación del sistema de Help Desk Open Source instalado bajo la plataforma de Centos sobre la infraestructura virtual mediante la herramienta web phpVirtualBox. Obteniendo como ventaja facilidad en la administración y configuración de nuestro servicio de Help Desk aplicado para la nube interna del laboratorio.
    [Show full text]
  • Rede Automatizada De Spamtraps
    Universidade do Minho Escola de Engenharia Pedro Jorge Barros Vasconcelos Guimarães Rede automatizada de spamtraps Outubro de 2011 Universidade do Minho Escola de Engenharia Pedro Jorge Barros Vasconcelos Guimarães Rede automatizada de spamtraps Dissertação de Mestrado Mestrado em Engenharia Informática Trabalho efectuado sob a orientação de Prof. Doutor António Luís Sousa Outubro de 2011 ii Declara¸c~ao Nome: Pedro Jorge Barros Vasconcelos Guimar~aes Endere¸coElectr´onico: [email protected] Telefone: 914486608 Bilhete de identidade: 13261663 T´ıtuloda Tese: Rede automatizada de spamtraps Orientador: Professor Doutor Ant´onioLu´ısSousa Ano de conclus~ao: 2011 Designa¸c~aodo Mestrado: Mestrado em Engenharia Inform´atica E´ AUTORIZADA A REPRODUC¸ AO~ INTEGRAL DESTA TESE APE- NAS PARA EFEITOS DE INVESTIGAC¸ AO,~ MEDIANTE DECLARAC¸ AO~ ESCRITA DO INTERESSADO, QUE A TAL SE COMPROMETE; Universidade do Minho, Maio de 2011 Assinatura: Who has time to manually spam web sites? That can't be very cost effective. Eric Cheng iv Agradecimentos Em primeiro lugar devo agradecer pelos preciosos conhecimentos t´ecnicosque me foram transmitidos pelo Nuno Pais Fernandes ao longo da fase de con- cep¸c~aoe desenvolvimento. As suas ideias e sugest~oesforam de um inestim´avel valor. Bastar´areal¸carque o projecto n~aoo seria sem a sua participa¸c~ao. Ao Professor Ant´onioLu´ısSousa que sempre me apontou o caminho indi- cado em termos acad´emicos,contribuindo com ideias valiosas para o projecto. A` equipa de suporte t´ecnico da Eurotux, em especial ao Duarte Rocha, Paulo Silva e Fernando Gomes, pelo tempo que dedicaram a elucidar-me sobre as mais variadas quest~oest´ecnicasrelacionadas com este projecto.
    [Show full text]