com web/pres2: joburg14 talk: pres2reveal presentations/joburg14.html presentations/joburg14.xml presentations/slides/intro/201 4_title.xml

[email protected] (Rasmus Lerdorf)
Newsgroups php.pres
Message-ID <[email protected]>
Commit:    982bed3a647d5e478794e2c856b866d4d2ae318c
Author:    Rasmus Lerdorf <[email protected]>         Sun, 30 Mar 2014 07:26:41 -0700
Parents:   048115e221878927e72674c438d65c0a94e46c07
Branches:  master

Link:       http://git.php.net/?p=web/pres2.git;a=commitdiff;h=982bed3a647d5e478794e2c856b866d4d2ae318c

Log:
joburg14 talk

Changed paths:
  M  pres2reveal
  A  presentations/joburg14.html
  A  presentations/joburg14.xml
  A  presentations/slides/intro/2014_title.xml
diff_982bed3a647d5e478794e2c856b866d4d2ae318c.txt (text/plain, 18.6 KB)
diff --git a/pres2reveal b/pres2reveal
index bc54ffd..d55ab09 100755
--- a/pres2reveal
+++ b/pres2reveal
@@ -52,6 +52,7 @@ foreach($slide as $sld) {
 	}
 	foreach($s as $k=>$e) {
 		switch($k) {
+			case 'link':
 			case 'image':
 			case 'blurb':
 			case 'example':
@@ -113,6 +114,15 @@ function render_blurb($e) {
 	return "\t\t<$tag{$class}>$text</$tag>\n";
 }
 
+function render_link($link) {
+	if(strlen((string)$link)) {
+		$text = (string)$link;
+    } else {
+		$text = $link['href'];
+	}
+	return "\t\t<div align=\"{$link['align']}\" style=\"font-size: {$link['fontsize']}; color: {$link['textcolor']}; margin-left: {$link['marginleft']}; margin-right: {$link['marginright']}; margin-top: {$link['margintop']}; margin-bottom: {$link['marginbottom']};\">{$link['leader']}<a href=\"{$link['href']}\" target=\"{$link['target']}\">".markup_text($text)."</a></div><br />\n";
+}
+
 function render_list($e) {
 	$ret = "\t\t<ul>\n";
 	foreach($e->item as $v) {
diff --git a/presentations/joburg14.html b/presentations/joburg14.html
new file mode 100644
index 0000000..c83f307
--- /dev/null
+++ b/presentations/joburg14.html
@@ -0,0 +1,450 @@
+<!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 &lt;stdio.h&gt;
+#include &lt;stdlib.h&gt;
+#include &lt;ctype.h&gt;
+#include &lt;string.h&gt;
+
+#define ishex(x) (((x) &gt;= '0' &amp;&amp; (x) &lt;= '9') || ((x) &gt;= 'a' &amp;&amp; \
+                   (x) &lt;= 'f') || ((x) &gt;= 'A' &amp;&amp; (x) &lt;= 'F'))
+
+int htoi(char *s) {
+	int     value;
+	char    c;
+
+	c = s[0];
+	if(isupper(c)) c = tolower(c);
+	value=(c &gt;= '0' &amp;&amp; c &lt;= '9' ? c - '0' : c - 'a' + 10) * 16;
+
+	c = s[1];
+	if(isupper(c)) c = tolower(c);
+	value += c &gt;= '0' &amp;&amp; c &lt;= '9' ? c - '0' : c - 'a' + 10;
+
+	return(value);
+}
+
+void main(int argc, char *argv[]) {
+	char *params, *data, *dest, *s, *tmp;
+	char *name, *age;
+
+	puts(&quot;Content-type: text/html\r\n&quot;);
+	puts(&quot;&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;Form Example&lt;/TITLE&gt;&lt;/HEAD&gt;&quot;);
+	puts(&quot;&lt;BODY&gt;&lt;H1&gt;My Example Form&lt;/H1&gt;&quot;);
+	puts(&quot;&lt;FORM action=\&quot;form.cgi\&quot; method=\&quot;GET\&quot;&gt;&quot;);
+	puts(&quot;Name: &lt;INPUT type=\&quot;text\&quot; name=\&quot;name\&quot;&gt;&quot;);
+	puts(&quot;Age: &lt;INPUT type=\&quot;text\&quot; name=\&quot;age\&quot;&gt;&quot;);
+	puts(&quot;&lt;BR&gt;&lt;INPUT type=\&quot;submit\&quot;&gt;&quot;);
+	puts(&quot;&lt;/FORM&gt;&quot;);
+
+	data = getenv(&quot;QUERY_STRING&quot;);
+	if(data &amp;&amp; *data) {
+		params = data; dest = data;
+    	while(*data) {
+			if(*data=='+') *dest=' ';
+			else if(*data == '%' &amp;&amp; ishex(*(data+1))&amp;&amp;ishex(*(data+2))) {
+				*dest = (char) htoi(data + 1);
+				data+=2;
+			} else *dest = *data;
+			data++;
+			dest++;
+		}
+		*dest = '\0';
+		s = strtok(params,&quot;&amp;&quot;);
+		do {
+			tmp = strchr(s,'=');
+			if(tmp) {
+				*tmp = '\0';
+				if(!strcmp(s,&quot;name&quot;)) name = tmp+1;
+				else if(!strcmp(s,&quot;age&quot;)) age = tmp+1;
+			}
+		} while(s=strtok(NULL,&quot;&amp;&quot;));
+
+		printf(&quot;Hi %s, you are %s years old\n&quot;,name,age);
+	}
+	puts(&quot;&lt;/BODY&gt;&lt;/HTML&gt;&quot;);
+}
+</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,
+    &quot;Name: &quot;, textfield('name'),
+    p,
+    &quot;Age: &quot;, textfield('age'),
+    p,
+    submit,
+    end_form;
+if(param()) {
+    print &quot;Hi &quot;,em(param('name')),
+        &quot;You are &quot;,em(param('age')),
+        &quot; years old&quot;;
+}
+print end_html;</code></pre>
+	</section>
+	<section>
+		<h2 margin-bottom="2em">1994</h2><br>
+		<pre><code>&lt;html&gt;&lt;head&gt;&lt;title&gt;Form Example&lt;/title&gt;&lt;/head&gt;
+&lt;body&gt;&lt;h1&gt;My Example Form&lt;/h1&gt;
+&lt;form action=&quot;form.phtml&quot; method=&quot;POST&quot;&gt;
+Name: &lt;input type=&quot;text&quot; name=&quot;name&quot;&gt;
+Age: &lt;input type=&quot;text&quot; name=&quot;age&quot;&gt;
+&lt;br&gt;&lt;input type=&quot;submit&quot;&gt;
+&lt;/form&gt;
+&lt;?if($name):?&gt;
+Hi &lt;?echo $name?&gt;, you are &lt;?echo $age?&gt; years old
+&lt;?endif?&gt;
+&lt;/body&gt;&lt;/html&gt;</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 &lt;= $end; $i ++) {
+        yield $i;
+    }
+}
+foreach (xrange(0, 5) as $i) {
+    echo $i, &quot;\n&quot;;
+}</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 &quot;foobar&quot;[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(&quot;super secret&quot;,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>
+	<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-&gt;pdo-&gt;prepare($query);
+        $stmt-&gt;execute($params);
+        return $stmt;
+    }
+}
+
+$q = 'SELECT * FROM users WHERE id = ?';
+$user = $db-&gt;query($q, $userID)-&gt;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 &lt;&lt; 1;
+    const GREETING = &quot;HELLO&quot;;
+    const BAZ = self::GREETING.&quot; WORLD!&quot;
+}</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 &quot;\n&quot;;
+$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>
diff --git a/presentations/joburg14.xml b/presentations/joburg14.xml
new file mode 100644
index 0000000..6b2c6c6
--- /dev/null
+++ b/presentations/joburg14.xml
@@ -0,0 +1,57 @@
+<presentation 
+    template="simple" 
+    navmode="html"
+    titlecolor="#000000"
+    navbarbackground="#bbbbbb"
+    navbartopiclinks="0"
+    logo1="images/php-med-trans.png"
+    titlesize="6em"
+    navbarheight="3.5em"
+    examplebackground="#ffffff"
+    outputbackground="#ffffff"
+    exampleclass="noshadow"
+    exampleoutputclass="noshadow"
+>
+
+<topic>PHP</topic>
+<title>PHP</title>
+<event>PHP Craft</event>
+<location>Johannesburg</location>
+<date>Apr.4, 2014</date>
+<speaker>Rasmus Lerdorf</speaker>
+<url>http://talks.php.net/joburg14</url>
+<twitter>@rasmus</twitter>
+
+<slide>slides/intro/titlepage.xml</slide>
+
+<slide>slides/intro/nold.xml</slide>
+<slide>slides/intro/nold2.xml</slide>
+<slide>slides/intro/nold3.xml</slide>
+<slide>slides/intro/eco.xml</slide>
+<slide>slides/intro/wwht2.xml</slide>
+<slide>slides/intro/wwht1.xml</slide>
+
+<slide>slides/intro/2014_title.xml</slide>
+
+<slide>slides/intro/php55.xml</slide>
+<slide>slides/intro/php56.xml</slide>
+
+<slide>slides/intro/atomic1.xml</slide>
+<slide>slides/intro/atomic3a.xml</slide>
+<slide>slides/intro/atomic2.xml</slide>
+<slide>slides/intro/atomic3b.xml</slide>
+<slide>slides/intro/atomic3c.xml</slide>
+<slide>slides/intro/atomic3.xml</slide>
+<slide>slides/intro/atomic4.xml</slide>
+
+<slide>slides/intro/lovehack.xml</slide>
+<slide>slides/intro/greenland0.xml</slide>
+<slide>slides/intro/greenland1.xml</slide>
+<slide>slides/intro/greenland2.xml</slide>
+<slide>slides/intro/greenland3.xml</slide>
+
+<slide>slides/intro/matter.xml</slide>
+<slide>slides/intro/matter2.xml</slide>
+<slide>slides/intro/etsy_access.xml</slide>
+
+</presentation>
diff --git a/presentations/slides/intro/2014_title.xml b/presentations/slides/intro/2014_title.xml
new file mode 100644
index 0000000..de858cf
--- /dev/null
+++ b/presentations/slides/intro/2014_title.xml
@@ -0,0 +1,4 @@
+<slide title="">
+<break lines="12"/>
+<blurb fontsize="20em" align="center">2014</blurb>
+</slide>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.