com web/pres2: Wrong repo: presentations/joburg14.html
[email protected] (Rasmus Lerdorf)
| Newsgroups | php.pres |
|---|---|
| Message-ID | <[email protected]> |
Commit: d363f0d19e52c9c4870914c33f9ee3e2d5d214a1 Author: Rasmus Lerdorf <[email protected]> Thu, 3 Apr 2014 13:04:53 -0700 Parents: a62fa61ab82f549a5f9f219dc390dda359f9d007 Branches: master Link: http://git.php.net/?p=web/pres2.git;a=commitdiff;h=d363f0d19e52c9c4870914c33f9ee3e2d5d214a1 Log: Wrong repo Changed paths: D presentations/joburg14.html
diff_d363f0d19e52c9c4870914c33f9ee3e2d5d214a1.txt
(text/plain, 15.8 KB)
diff --git a/presentations/joburg14.html b/presentations/joburg14.html
deleted file mode 100644
index ebb9936..0000000
--- a/presentations/joburg14.html
+++ /dev/null
@@ -1,453 +0,0 @@
-<!doctype html>
-<html lang="en">
-
- <head>
- <meta charset="utf-8">
-
- <title>PHP</title>
-
- <meta name="description" content="PHP">
- <meta name="author" content="Rasmus Lerdorf">
-
- <meta name="apple-mobile-web-app-capable" content="yes" />
- <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
-
- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-
- <link rel="stylesheet" href="/reveal.js/css/reveal.min.css">
- <link rel="stylesheet" href="/samdark.css" id="theme">
-
- <!-- For syntax highlighting -->
- <link rel="stylesheet" href="/styles/github.css">
-
- <!-- If the query includes 'print-pdf', include the PDF print sheet -->
- <script>
- if( window.location.search.match( /print-pdf/gi ) ) {
- var link = document.createElement( 'link' );
- link.rel = 'stylesheet';
- link.type = 'text/css';
- link.href = '/reveal.js/css/print/pdf.css';
- document.getElementsByTagName( 'head' )[0].appendChild( link );
- }
- </script>
-
- <!--[if lt IE 9]>
- <script src="lib/js/html5shiv.js"></script>
- <![endif]-->
- </head>
-
- <body>
-
- <div class="reveal">
-
- <!-- Any section element inside of this container is displayed as a slide -->
- <div class="slides">
- <section>
- <h1>PHP</h1>
- <h3>PHP Craft</h3>
- <h3>Johannesburg</h3>
- <h3>Apr.4, 2014</h3>
- <a href="http://talks.php.net/joburg14">http://talks.php.net/joburg14</a><br><br>
- <p>Rasmus Lerdorf<br>
- <small><a href="http://twitter.com/@rasmus">@rasmus</a></small>
- </p>
- </section>
- <section>
- <h2 margin-bottom="2em">1993</h2><br>
- <pre><code>#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <string.h>
-
-#define ishex(x) (((x) >= '0' && (x) <= '9') || ((x) >= 'a' && \
- (x) <= 'f') || ((x) >= 'A' && (x) <= 'F'))
-
-int htoi(char *s) {
- int value;
- char c;
-
- c = s[0];
- if(isupper(c)) c = tolower(c);
- value=(c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10) * 16;
-
- c = s[1];
- if(isupper(c)) c = tolower(c);
- value += c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10;
-
- return(value);
-}
-
-void main(int argc, char *argv[]) {
- char *params, *data, *dest, *s, *tmp;
- char *name, *age;
-
- puts("Content-type: text/html\r\n");
- puts("<HTML><HEAD><TITLE>Form Example</TITLE></HEAD>");
- puts("<BODY><H1>My Example Form</H1>");
- puts("<FORM action=\"form.cgi\" method=\"GET\">");
- puts("Name: <INPUT type=\"text\" name=\"name\">");
- puts("Age: <INPUT type=\"text\" name=\"age\">");
- puts("<BR><INPUT type=\"submit\">");
- puts("</FORM>");
-
- data = getenv("QUERY_STRING");
- if(data && *data) {
- params = data; dest = data;
- while(*data) {
- if(*data=='+') *dest=' ';
- else if(*data == '%' && ishex(*(data+1))&&ishex(*(data+2))) {
- *dest = (char) htoi(data + 1);
- data+=2;
- } else *dest = *data;
- data++;
- dest++;
- }
- *dest = '\0';
- s = strtok(params,"&");
- do {
- tmp = strchr(s,'=');
- if(tmp) {
- *tmp = '\0';
- if(!strcmp(s,"name")) name = tmp+1;
- else if(!strcmp(s,"age")) age = tmp+1;
- }
- } while(s=strtok(NULL,"&"));
-
- printf("Hi %s, you are %s years old\n",name,age);
- }
- puts("</BODY></HTML>");
-}
-</code></pre>
- </section>
- <section>
- <h2 margin-bottom="2em">1993</h2><br>
- <pre><code>use CGI qw(:standard);
-print header;
-print start_html('Form Example'),
- h1('My Example Form'),
- start_form,
- "Name: ", textfield('name'),
- p,
- "Age: ", textfield('age'),
- p,
- submit,
- end_form;
-if(param()) {
- print "Hi ",em(param('name')),
- "You are ",em(param('age')),
- " years old";
-}
-print end_html;</code></pre>
- </section>
- <section>
- <h2 margin-bottom="2em">1994</h2><br>
- <pre><code><html><head><title>Form Example</title></head>
-<body><h1>My Example Form</h1>
-<form action="form.phtml" method="POST">
-Name: <input type="text" name="name">
-Age: <input type="text" name="age">
-<br><input type="submit">
-</form>
-<?if($name):?>
-Hi <?echo $name?>, you are <?echo $age?> years old
-<?endif?>
-</body></html></code></pre>
- </section>
- <section>
- <h3 class="p">Focus on the Ecosystem</h3>
- <ul>
- <li>LAMP wasn't an accident</li>
- <li>Robustness, Performance and Security</li>
- <li><font color="ff2233">♥</font> shared hosting ISPs</li>
- </ul>
- <h3 class="p">Scale</h3>
- <ul>
- <li>Scaling up is expected</li>
- <li>Scaling down is surprisingly hard</li>
- <li>Doing both is rocket science</li>
- </ul>
- </section>
- <section>
- <h3 class="p">Performance</h3>
- <ul>
- <li>mod_php</li>
- <li>shared-nothing perfect sandbox model</li>
- </ul>
- <h3 class="p">Robustness</h3>
- <ul>
- <li>SQL LIMIT clause</li>
- <li>Promote Prefork shared-nothing model</li>
- </ul>
- <h3 class="p">Security</h3>
- <ul>
- <li>max_execution_time</li>
- <li>memory_limit</li>
- <li>safe mode</li>
- </ul>
- </section>
- <section>
- <h3 class="p">What was he thinking?</h3>
- <ul>
- <li>Case insensitive function names?</li>
- <li>Naming inconsistencies?</li>
- <li>What's with the $ signs?</li>
- <li>Globals?</li>
- <li>register_globals?</li>
- <li>magic_quotes?</li>
- </ul>
- <h3 class="p">OMGWTFBBQ?</h3>
- <pre><code>array_search($needle, $haystack);
-strstr($haystack, $needle);
-in_array($needle, $haystack);
-substr_count($haystack, $needle);
-array_key_exists($needle, $haystack);
-strchr($haystack, $needle);</code></pre>
- </section>
- <section>
- <h2>2014</h2>
- </section>
- <section>
- <section id="performance">
- <h2 margin-bottom="2em">PHP 5.5</h2><br>
- <h3 class="p">Performance Improvements</h3>
- <ul>
- <li>Nested calls</li>
- <li>Call stack pre-allocated by compiler</li>
- <li>Bundled opcode cache</li>
- </ul>
- </section>
-<section id="generators">
- <h4 class="p">✔ Generators</h4>
- <pre><code>function xrange($start, $end) {
- for ($i = $start; $i <= $end; $i ++) {
- yield $i;
- }
-}
-foreach (xrange(0, 5) as $i) {
- echo $i, "\n";
-}</code></pre>
- </section>
-<section id="finally">
- <h4 class="p">✔ finally</h4>
- <pre><code>$db = mysqli_connect();
-try {
- call_some_function($db);
-} finally {
- mysqli_close($db);
-}</code></pre>
- </section>
-<section id="foreachlist">
- <h4 class="p">✔ list() in foreach</h4>
- <pre><code>$names = [ ['John','Smith'], ['Fred','Johnson'] ];
-foreach($names as list($first,$last)) {
- echo $first,$last;
-}</code></pre>
- </section>
-<section id="constarray">
- <h4 class="p">✔ Const array/string Dereferencing</h4>
- <pre><code>echo array(1, 2, 3)[0]; //output 1
-echo "foobar"[3]; //output b
-echo [1,3,4][2]; //output 4</code></pre>
- </section>
-<section id="others">
- <h4 class="p">✔ empty() support for functions/expressions</h4>
- <h4 class="p">✔ curl upload functionality rewritten</h4>
- <h4 class="p">✔ Simplified password hashing API</h4>
- <pre><code>// Hash
-$hash = password_hash("super secret",PASSWORD_BCRYPT);
-
-// To validate $pwd against the stored hash
-if (password_verify($pwd, $hash)) {
- echo 'Password is valid!';
-} else {
- echo 'Invalid password.';
-}</code></pre>
- </section>
-<section id="php55_done">
- <div align="" style="font-size: ; color: ; margin-left: ; margin-right: ; margin-top: ; margin-bottom: ;"><a href="http://php.net/migration55" target="">php.net/migration55</a></div><br />
- </section> </section>
- <section>
- <section id="php56">
- <h2 margin-bottom="2em">PHP 5.6</h2><br>
- <h4 class="p">✔ Variadic functions</h4>
- <pre><code>class MySQL implements DB {
- public function query($query, ...$params) {
- $stmt = $this->pdo->prepare($query);
- $stmt->execute($params);
- return $stmt;
- }
-}
-
-$q = 'SELECT * FROM users WHERE id = ?';
-$user = $db->query($q, $userID)->fetch();</code></pre>
- </section>
-<section id="php56unpack">
- <h4 class="p">✔ Argument Unpacking</h4>
- <pre><code>// A better call_user_func_args
-$args1 = [1, 2, 3];
-$args2 = [4, 5, 6];
-test(...$args1, ...$args2); // [1, 2, 3, 4, 5, 6]
-test(1, 2, 3, ...$args2); // [1, 2, 3, 4, 5, 6]
-test(...$args1, 4, 5, 6); // [1, 2, 3, 4, 5, 6]</code></pre>
- <h4 class="p">✔ Constant scalar expressions</h4>
- <pre><code>class Foo {
- const FOO = 1 + 1;
- const BAR = 1 << 1;
- const GREETING = "HELLO";
- const BAZ = self::GREETING." WORLD!"
-}</code></pre>
- </section>
-<section id="php56pow">
- <h4 class="p">✔ Add right-associative power operator **</h4>
- <pre><code>echo 2 ** 3 ** 2; // 512 (not 64)
-echo -3 ** 2; // -9 (not 9)
-echo 1 - 3 ** 2; // -8
-echo ~3 ** 2; // -10 (not 16)</code></pre>
- <h4 class="p">✔ Internal operator overloading for internal features like GMP</h4>
- <pre><code>echo 2**512;
-echo "\n";
-$n = gmp_init(2);
-echo $n**512;</code></pre>
- <pre><code>1.3407807929943E+154
-13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
- </code></pre> </section>
-<section id="php56use">
- <h4 class="p">✔ use function and use const namespace imports</h4>
- <pre><code>include 'template.inc';
-include 'db.inc';
-use function template\header, template\footer, db\query;
-
-header('My Page');
-query('select * from stuff');
-footer();</code></pre>
- <h4 class="p">✔ default_charset ini setting also applies to htmlspecialchars/entities/...</h4>
- <h4 class="p">✔ SSL Peer verification by default</h4>
- <h4 class="p">✔ openssl certificate fingerprints</h4>
- <h4 class="p">✔ SAN x509 extension matching when verifing host names</h4>
- <h4 class="p">✔ automatic DoS prevention of TLS renogotiation attacks</h4>
- <h4 class="p">✔ and many more openssl-related options</h4>
- </section>
-<section id="php56_1">
- <h4 class="p">✔ Asynchronous PostgreSQL database connections</h4>
- <h4 class="p">✔ Non-blocking PostgreSQL queries</h4>
- <h4 class="p">✔ New phpdbg SAPI</h4>
- <h4 class="p">✔ Support for > 2GB file uploads</h4>
- <h4 class="p">✔ The php://input stream is now re-usable</h4>
- <h4 class="p">✔ Added hash_compare() for timing attack safe string comparison</h4>
- <h4 class="p">✔ Added gost-crypto (CryptoPro S-box) hash algorithm</h4>
- <h4 class="p">✔ FPM workers can now change their apparmor profile</h4>
- <h4 class="p">✔ OCI8 Improvements</h4>
- </section>
-<section id="php56_done">
- <div align="" style="font-size: ; color: ; margin-left: ; margin-right: ; margin-top: ; margin-bottom: ;"><a href="http://php.net/migration56" target="">php.net/migration56</a></div><br />
- </section> </section>
- <section>
- <h2 margin-bottom="2em">Deploying Web Apps</h2><br>
- <h3 class="p">Are your deploys atomic?</h3>
- <h3 class="p">Are you sure?</h3>
- <h4 class="p">What happens to a request that is currently executing when you deploy?</h4>
- </section>
- <section>
- <h2 margin-bottom="2em">Deploying Web Apps</h2><br>
- <img src="/presentations/slides/intro/dep1.png" width="642" height="300">
- </section>
- <section>
- <h2 margin-bottom="2em">Deploying Web Apps</h2><br>
- <h4 class="p">✔ Don't copy files into current document root</h4>
- <h4 class="p">✔ Let existing requests finish on old code</h4>
- <h4 class="p">✔ New requests start on new code</h4>
- <h4 class="p">✔ Avoid clearing your opcode cache</h4>
- <h4 class="p">✔ Minimal impact on production traffic</h4>
- </section>
- <section>
- <h2 margin-bottom="2em">Deploying Web Apps</h2><br>
- <img src="/presentations/slides/intro/dep2.png" width="680" height="428">
- </section>
- <section>
- <h2 margin-bottom="2em">Deploying Web Apps</h2><br>
- <img src="/presentations/slides/intro/dep3.png" width="680" height="428">
- </section>
- <section>
- <h2 margin-bottom="2em">Deploying Web Apps</h2><br>
- <h4 class="p">2 Document Root directories</h4>
- <h4 class="p">Symlink /var/www/site toggles between them</h4>
- <h4 class="p">realpath() symlink at the web server level</h4>
- <h4 class="p">Set Document Root to symlink realpath</h4>
- <h4 class="p">Never hardcode the document root in code</h4>
- </section>
- <section>
- <h2 margin-bottom="2em">Deploying Web Apps</h2><br>
- <h3 class="p">Apache</h3>
- <h4 class="p">http://github.com/etsy/mod_realdoc</h4>
- <h3 class="p">nginx</h3>
- <h4 class="p">You can use $realpath_root</h4>
- <p class="p">eg. fastcgi_param DOCUMENT_ROOT $realpath_root;</p>
- <h3 class="p">PHP</h3>
- <h4 class="p">http://github.com/etsy/incpath</h4>
- </section>
- <section>
- <img src="/presentations/slides/intro/lovehack-white-1000.png" width="1001" height="421">
- </section>
- <section data-background="#000000">
- <img src="/presentations/slides/intro/rasmus.jpg" width="523" height="700">
- </section>
- <section data-background="#000000">
- <img src="/presentations/slides/intro/Greenland1.jpg" width="1024" height="685">
- </section>
- <section data-background="#000000">
- <img src="/presentations/slides/intro/Greenland2.jpg" width="1024" height="685">
- </section>
- <section data-background="#000000">
- <img src="/presentations/slides/intro/Greenland3.jpg" width="1024" height="685">
- </section>
- <section>
- <h2>Work on things that matter</h2>
- </section>
- <section>
- <h4 class="p">We are running out of things that can be solved in isolation with our keyboards</h4>
- </section>
- <section>
- <img src="/presentations/slides/intro/barros1.png" width="480" height="320">
- <img src="/presentations/slides/intro/barros2.jpg" width="250" height="196">
- <img src="/presentations/slides/intro/barros3.jpg" width="250" height="367">
- <img src="/presentations/slides/intro/sasa.jpg" width="600" height="400">
- </section>
- </div>
-
- </div>
-
- <script src="/reveal.js/lib/js/head.min.js"></script>
- <script src="/reveal.js/js/reveal.min.js"></script>
-
- <script>
-
- // Full list of configuration options available here:
- // https://github.com/hakimel/reveal.js#configuration
- Reveal.initialize({
- controls: true,
- progress: true,
- history: true,
- center: true,
- backgroundTransition: 'none',
-
- theme: Reveal.getQueryHash().theme, // available themes are in /css/theme
- transition: Reveal.getQueryHash().transition || 'linear', // default/cube/page/concave/zoom/linear/fade/none
- transitionSpeed: 'fast',
-
- // Parallax scrolling
- // parallaxBackgroundImage: 'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg',
- // parallaxBackgroundSize: '2100px 900px',
-
- // Optional libraries used to extend on reveal.js
- dependencies: [
- { src: '/reveal.js/lib/js/classList.js', condition: function() { return !document.body.classList; } },
- { src: '/highlight.pack.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
- { src: '/reveal.js/plugin/zoom-js/zoom.js', async: true, callback: function() { return !!document.body.classList; } },
- { src: '/reveal.js/plugin/notes/notes.js', async: true, condition: function() { return !!document.body.classList; } }
- ]
- });
-
- </script>
-
- </body>
-</html>