<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Stevie G</title>
    <description>The latest articles on DEV Community by Stevie G (@itsmestevieg).</description>
    <link>https://dev.to/itsmestevieg</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F168507%2Fc8a6174e-fe21-41cb-a9c3-73b1990a3a9a.png</url>
      <title>DEV Community: Stevie G</title>
      <link>https://dev.to/itsmestevieg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/itsmestevieg"/>
    <language>en</language>
    <item>
      <title>What’s New in PHP 8.5</title>
      <dc:creator>Stevie G</dc:creator>
      <pubDate>Thu, 14 May 2026 00:25:15 +0000</pubDate>
      <link>https://dev.to/itsmestevieg/whats-new-in-php-85-2hff</link>
      <guid>https://dev.to/itsmestevieg/whats-new-in-php-85-2hff</guid>
      <description>&lt;p&gt;PHP 8.5 is here, and while it may not feel quite as dramatic as PHP 8.4’s property hooks and asymmetric visibility, it brings some excellent quality-of-life improvements for everyday PHP developers.&lt;/p&gt;

&lt;p&gt;This release focuses on cleaner code, safer APIs, better debugging, improved URL handling, and small but useful syntax improvements.&lt;/p&gt;

&lt;p&gt;In this article, we’ll look at the most important PHP 8.5 features with simple examples.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The New Pipe Operator
&lt;/h2&gt;

&lt;p&gt;One of the biggest additions in PHP 8.5 is the new pipe operator: &lt;code&gt;|&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The pipe operator lets you pass the result of one expression into the next function, making transformation code easier to read from left to right.&lt;/p&gt;

&lt;h3&gt;
  
  
  Before PHP 8.5
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;' PHP 8.5 Released '&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$slug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;strtolower&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nb"&gt;str_replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;str_replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nb"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$slug&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  PHP 8.5
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;' PHP 8.5 Released '&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$slug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$title&lt;/span&gt;
    &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str_replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str_replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;strtolower&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$slug&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why it’s useful
&lt;/h3&gt;

&lt;p&gt;This makes code easier to follow because each step happens in order.&lt;/p&gt;

&lt;p&gt;Instead of reading deeply nested function calls from the inside out, you can read the logic from top to bottom.&lt;/p&gt;

&lt;p&gt;This is especially useful when cleaning strings, processing arrays, transforming request data, formatting output, or building readable data pipelines.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. New URI Extension
&lt;/h2&gt;

&lt;p&gt;PHP 8.5 adds a new built-in URI extension for working with URLs and URIs in a more structured way.&lt;/p&gt;

&lt;p&gt;For years, PHP developers have often used &lt;code&gt;parse_url()&lt;/code&gt;, manual string handling, or third-party packages for more advanced URL work. PHP 8.5 gives us a more modern object-based option.&lt;/p&gt;

&lt;h3&gt;
  
  
  Before PHP 8.5
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;parse_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'https://example.com/blog/php-85'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'host'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  PHP 8.5
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Uri\Rfc3986\Uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'https://example.com/blog/php-85'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getHost&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why it’s useful
&lt;/h3&gt;

&lt;p&gt;This is useful for web applications, routing, APIs, redirects, crawlers, scrapers, and security-sensitive URL validation.&lt;/p&gt;

&lt;p&gt;Working with URLs can become surprisingly messy once you deal with hosts, paths, query strings, fragments, encoded characters, redirects, and edge cases.&lt;/p&gt;

&lt;p&gt;Having a proper URI API built into PHP is a very welcome improvement.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Clone With
&lt;/h2&gt;

&lt;p&gt;PHP 8.5 introduces a cleaner way to clone an object while changing selected properties.&lt;/p&gt;

&lt;p&gt;This is especially helpful for immutable objects and &lt;code&gt;readonly&lt;/code&gt; classes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserProfile&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$role&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;withRole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$role&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;self&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;clone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'role'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$role&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Steve'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'steve@example.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'user'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$admin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;withRole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'admin'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$admin&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why it’s useful
&lt;/h3&gt;

&lt;p&gt;This makes immutable objects easier to work with.&lt;/p&gt;

&lt;p&gt;Instead of manually copying every property into a new object, you can clone the existing object and change only what needs to change.&lt;/p&gt;

&lt;p&gt;This is excellent for value objects, DTOs, configuration objects, and clean domain modelling.&lt;/p&gt;

&lt;p&gt;For example, if you had a &lt;code&gt;Money&lt;/code&gt;, &lt;code&gt;Address&lt;/code&gt;, &lt;code&gt;UserProfile&lt;/code&gt;, &lt;code&gt;EmailMessage&lt;/code&gt;, or &lt;code&gt;AppConfig&lt;/code&gt; object, you could create a modified copy without mutating the original object.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. &lt;code&gt;#[\NoDiscard]&lt;/code&gt; Attribute
&lt;/h2&gt;

&lt;p&gt;PHP 8.5 adds a new &lt;code&gt;#[\NoDiscard]&lt;/code&gt; attribute.&lt;/p&gt;

&lt;p&gt;This tells PHP that the return value of a function should not be ignored. If the function is called and the return value is not used, PHP can warn you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="na"&gt;#[\NoDiscard]&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;validateEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;filter_var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;FILTER_VALIDATE_EMAIL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;validateEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'test@example.com'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, the return value is ignored.&lt;/p&gt;

&lt;p&gt;That defeats the purpose of calling a validation function.&lt;/p&gt;

&lt;h3&gt;
  
  
  Correct usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$isValid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;validateEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'test@example.com'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$isValid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Email is valid'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Intentionally ignoring the result
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;validateEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'test@example.com'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why it’s useful
&lt;/h3&gt;

&lt;p&gt;This is great for functions where ignoring the return value could cause bugs.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;validation functions&lt;/li&gt;
&lt;li&gt;security checks&lt;/li&gt;
&lt;li&gt;save or update operations&lt;/li&gt;
&lt;li&gt;parsing functions&lt;/li&gt;
&lt;li&gt;result-based service calls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes APIs safer and encourages developers to handle important return values properly.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. &lt;code&gt;array_first()&lt;/code&gt; and &lt;code&gt;array_last()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;PHP 8.5 adds two small but very useful array helper functions: &lt;code&gt;array_first()&lt;/code&gt; and &lt;code&gt;array_last()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;These return the first or last value from an array, or &lt;code&gt;null&lt;/code&gt; if the array is empty.&lt;/p&gt;

&lt;h3&gt;
  
  
  Before PHP 8.5
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Steve'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Jessica'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Tony'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nv"&gt;$firstUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$users&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;array_key_first&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$users&lt;/span&gt;&lt;span class="p"&gt;)];&lt;/span&gt;
&lt;span class="nv"&gt;$lastUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$users&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;array_key_last&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$users&lt;/span&gt;&lt;span class="p"&gt;)];&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$firstUser&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$lastUser&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  PHP 8.5
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Steve'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Jessica'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Tony'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nv"&gt;$firstUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;array_first&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$users&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$lastUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;array_last&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$users&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$firstUser&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$lastUser&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why it’s useful
&lt;/h3&gt;

&lt;p&gt;This removes boilerplate and makes code easier to understand.&lt;/p&gt;

&lt;p&gt;It also works nicely with the null coalescing operator.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$latestEvent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;array_last&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$events&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s1"&gt;'No events found'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple, clean, and readable.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Fatal Errors Now Include Backtraces
&lt;/h2&gt;

&lt;p&gt;PHP 8.5 improves debugging by adding stack trace support for fatal errors.&lt;/p&gt;

&lt;p&gt;This is a big win when trying to track down problems in real applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why it’s useful
&lt;/h3&gt;

&lt;p&gt;Fatal errors can be painful, especially when they happen deep inside a codebase.&lt;/p&gt;

&lt;p&gt;A backtrace gives you more context about where the problem came from, making debugging faster and less frustrating.&lt;/p&gt;

&lt;p&gt;For developers working on large PHP systems, this is one of those features that may not look exciting at first, but it will save time when something breaks.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. New &lt;code&gt;get_error_handler()&lt;/code&gt; and &lt;code&gt;get_exception_handler()&lt;/code&gt; Functions
&lt;/h2&gt;

&lt;p&gt;PHP 8.5 adds two new functions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;get_error_handler&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nf"&gt;get_exception_handler&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These allow you to inspect the currently registered error and exception handlers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why it’s useful
&lt;/h3&gt;

&lt;p&gt;This is handy for frameworks, debugging tools, logging systems, and applications that temporarily replace error handlers.&lt;/p&gt;

&lt;p&gt;It gives developers more visibility into how errors and exceptions are being managed.&lt;/p&gt;

&lt;p&gt;For example, this can help when debugging applications that use custom error handlers, middleware, framework bootstrapping, or testing tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Better CLI Configuration Checking
&lt;/h2&gt;

&lt;p&gt;PHP 8.5 adds a useful CLI improvement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php &lt;span class="nt"&gt;--ini&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;diff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can show non-default INI settings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why it’s useful
&lt;/h3&gt;

&lt;p&gt;This is excellent for developers and system administrators.&lt;/p&gt;

&lt;p&gt;When working across local, staging, and production environments, configuration differences can cause unexpected bugs.&lt;/p&gt;

&lt;p&gt;Being able to quickly see which INI settings differ from the defaults makes PHP environments easier to debug and compare.&lt;/p&gt;

&lt;p&gt;For example, it can help answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why does this work locally but fail on production?&lt;/li&gt;
&lt;li&gt;Is the memory limit different on staging?&lt;/li&gt;
&lt;li&gt;Is error reporting configured differently?&lt;/li&gt;
&lt;li&gt;Are extensions or settings behaving differently between environments?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For anyone managing real-world PHP applications, this is a very practical addition.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. New &lt;code&gt;max_memory_limit&lt;/code&gt; INI Directive
&lt;/h2&gt;

&lt;p&gt;PHP 8.5 introduces a new &lt;code&gt;max_memory_limit&lt;/code&gt; directive, which can set a ceiling for &lt;code&gt;memory_limit&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why it’s useful
&lt;/h3&gt;

&lt;p&gt;This is useful for hosting providers, shared environments, production servers, and systems where you want tighter control over memory usage.&lt;/p&gt;

&lt;p&gt;It helps prevent scripts or local configuration changes from raising memory limits beyond an allowed maximum.&lt;/p&gt;

&lt;p&gt;For production environments, this is a sensible improvement because memory issues can quickly affect reliability.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Closures and First-Class Callables in Constant Expressions
&lt;/h2&gt;

&lt;p&gt;PHP 8.5 also allows static closures and first-class callables in constant expressions.&lt;/p&gt;

&lt;p&gt;This can be useful when you want to define reusable behaviour in places that previously could not support it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;formatName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$formatters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nb"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="kt"&gt;strtolower&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$formatters&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$formatter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$formatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nf"&gt;formatName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;' STEVE '&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why it’s useful
&lt;/h3&gt;

&lt;p&gt;This is more of an advanced feature, but it opens the door for cleaner configuration, attributes, callbacks, and reusable pipelines.&lt;/p&gt;

&lt;p&gt;It also works nicely with the broader PHP direction of making functions and callables easier to pass around.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. Persistent cURL Share Handles
&lt;/h2&gt;

&lt;p&gt;PHP 8.5 adds support for persistent cURL share handles.&lt;/p&gt;

&lt;p&gt;This can help avoid repeated setup costs when PHP makes multiple HTTP requests across requests, especially when sharing things like DNS cache and SSL sessions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why it’s useful
&lt;/h3&gt;

&lt;p&gt;For many smaller applications, you may never directly touch this feature.&lt;/p&gt;

&lt;p&gt;However, for applications that make lots of HTTP requests, API calls, webhooks, crawler requests, or service-to-service calls, this can help improve efficiency.&lt;/p&gt;

&lt;p&gt;This is one of those lower-level improvements that framework and library authors may take advantage of before most everyday developers notice it directly.&lt;/p&gt;




&lt;h2&gt;
  
  
  12. Important Deprecations
&lt;/h2&gt;

&lt;p&gt;Like every PHP release, PHP 8.5 also includes deprecations.&lt;/p&gt;

&lt;p&gt;Some of the notable ones include non-canonical scalar casts such as &lt;code&gt;(boolean)&lt;/code&gt;, &lt;code&gt;(integer)&lt;/code&gt;, &lt;code&gt;(double)&lt;/code&gt;, and &lt;code&gt;(binary)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Developers should use &lt;code&gt;(bool)&lt;/code&gt;, &lt;code&gt;(int)&lt;/code&gt;, &lt;code&gt;(float)&lt;/code&gt;, and &lt;code&gt;(string)&lt;/code&gt; instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Old style&lt;/span&gt;
&lt;span class="nv"&gt;$isActive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;$number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Recommended&lt;/span&gt;
&lt;span class="nv"&gt;$isActive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;$number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backtick operator as an alias for &lt;code&gt;shell_exec()&lt;/code&gt; has also been deprecated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Before
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sb"&gt;`ls -la`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Prefer explicit code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;shell_exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ls -la'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why it matters
&lt;/h3&gt;

&lt;p&gt;Deprecations are warnings about the future.&lt;/p&gt;

&lt;p&gt;Your code may still work today, but cleaning these up early makes future upgrades easier.&lt;/p&gt;

&lt;p&gt;This is especially important if you maintain older PHP systems, custom CMS projects, WordPress plugins, Laravel applications, legacy business systems, or long-running internal tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  Other Smaller Improvements
&lt;/h2&gt;

&lt;p&gt;PHP 8.5 also includes several smaller improvements worth knowing about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;attributes can now target constants&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#[\Override]&lt;/code&gt; can now be applied to properties&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#[\Deprecated]&lt;/code&gt; can now be used on traits and constants&lt;/li&gt;
&lt;li&gt;static properties now support asymmetric visibility&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;setcookie()&lt;/code&gt; and &lt;code&gt;setrawcookie()&lt;/code&gt; now support the &lt;code&gt;partitioned&lt;/code&gt; key&lt;/li&gt;
&lt;li&gt;new DOM methods are available&lt;/li&gt;
&lt;li&gt;new internationalisation improvements have been added&lt;/li&gt;
&lt;li&gt;new PHP build constants are available&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not always headline features, but they continue PHP’s movement toward cleaner, safer, and more expressive code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;PHP 8.5 is a practical release.&lt;/p&gt;

&lt;p&gt;It may not feel as visually dramatic as PHP 8.4, but it brings several improvements that developers will actually use.&lt;/p&gt;

&lt;p&gt;The biggest wins are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the pipe operator makes transformation code easier to read&lt;/li&gt;
&lt;li&gt;the URI extension improves URL handling&lt;/li&gt;
&lt;li&gt;clone with makes immutable objects easier&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#[\NoDiscard]&lt;/code&gt; helps prevent ignored return values&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;array_first()&lt;/code&gt; and &lt;code&gt;array_last()&lt;/code&gt; reduce boilerplate&lt;/li&gt;
&lt;li&gt;fatal error backtraces improve debugging&lt;/li&gt;
&lt;li&gt;new configuration and error handler tools improve developer experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, PHP 8.5 continues the modern PHP direction: cleaner syntax, safer code, better tooling, and improved maintainability.&lt;/p&gt;

&lt;p&gt;For everyday web developers, this is another solid step forward.&lt;/p&gt;

</description>
      <category>php</category>
      <category>webdev</category>
      <category>programming</category>
      <category>backend</category>
    </item>
    <item>
      <title>Foreboding AI, One Year Later: What Are We Really Building?</title>
      <dc:creator>Stevie G</dc:creator>
      <pubDate>Thu, 14 May 2026 00:10:07 +0000</pubDate>
      <link>https://dev.to/itsmestevieg/foreboding-ai-one-year-later-what-are-we-really-building-445a</link>
      <guid>https://dev.to/itsmestevieg/foreboding-ai-one-year-later-what-are-we-really-building-445a</guid>
      <description>&lt;p&gt;A year ago, I wrote &lt;strong&gt;Foreboding AI: The Inevitable Collapse We’re Funding Ourselves&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At the time, my concern was that we were paying for the very systems that could eventually replace us. We were subscribing to tools that learnt from our prompts, our corrections, our habits, our work, and our impatience.&lt;/p&gt;

&lt;p&gt;A year later, I still think that concern was valid.&lt;/p&gt;

&lt;p&gt;But my worry has changed shape.&lt;/p&gt;

&lt;p&gt;It is no longer only about whether AI can answer better, write better, summarise better, draw better, or code better.&lt;/p&gt;

&lt;p&gt;The deeper question now is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What happens when AI stops simply answering and starts acting?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For years, most people understood AI as a chatbot.&lt;/p&gt;

&lt;p&gt;You asked a question.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It gave an answer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Maybe it helped write an email.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Maybe it explained a piece of code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Maybe it generated an image.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That felt powerful, but still contained.&lt;/p&gt;

&lt;p&gt;Now we are moving into something different.&lt;/p&gt;

&lt;p&gt;AI systems can now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;browse websites,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;read files,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;inspect codebases,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;run terminal commands,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;call APIs,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;edit code repositories,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;use external tools,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;remember context,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and work through multi-step tasks.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is not just a better chatbot.&lt;/p&gt;

&lt;p&gt;That is a system with hands.&lt;/p&gt;

&lt;p&gt;And once AI has hands, the questions become much harder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What can it read?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What can it change?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What can it delete?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What can it install?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What secrets can it see?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What systems can it touch?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Who is watching it?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Who is responsible when it gets something wrong?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And maybe the hardest question of all:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Are we giving AI responsibility before we have built enough human restraint around it?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  From Helper to Worker
&lt;/h2&gt;

&lt;p&gt;One of the biggest changes I have observed over the last year is how quickly AI development tools have shifted from &lt;strong&gt;assistance&lt;/strong&gt; to &lt;strong&gt;delegation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not long ago, AI coding tools were mostly autocomplete and chat-in-the-editor helpers. They could suggest a function, explain a bug, or produce a snippet.&lt;/p&gt;

&lt;p&gt;Useful? Absolutely.&lt;/p&gt;

&lt;p&gt;But the human still clearly owned the work.&lt;/p&gt;

&lt;p&gt;Now we have tools that can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;read a codebase,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;interpret an issue,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;make a plan,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;edit files,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;run tests,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;inspect errors,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;try again,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and sometimes open a pull request.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That changes the relationship.&lt;/p&gt;

&lt;p&gt;The developer is no longer only asking for help.&lt;/p&gt;

&lt;p&gt;The developer is assigning work.&lt;/p&gt;

&lt;p&gt;That sounds exciting, and in many ways it is. I use AI. I build with it. I research it. I am not looking at this from the outside as someone who hates technology.&lt;/p&gt;

&lt;p&gt;In fact, the kind of technology I have always cared about most is &lt;strong&gt;assistive technology&lt;/strong&gt;: tools that simplify life, remove friction, bridge gaps, and help people accomplish things they otherwise could not.&lt;/p&gt;

&lt;p&gt;Good technology should make hard things feel possible, especially for people who do not think of themselves as technical.&lt;/p&gt;

&lt;p&gt;That is the version of AI I want to believe in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;AI that assists.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI that teaches.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI that explains.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI that helps a small business do more.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI that helps a non-technical person solve a real problem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI that gives someone with limited time, money, confidence, or access a way forward.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That kind of AI is worth building.&lt;/p&gt;

&lt;p&gt;But assistive is not the same as autonomous.&lt;/p&gt;

&lt;p&gt;A tool that helps a person see more clearly is different from a tool that makes the decision for them.&lt;/p&gt;

&lt;p&gt;A tool that helps a junior developer understand a bug is different from a tool that fixes it while the junior learns nothing.&lt;/p&gt;

&lt;p&gt;A tool that helps a business owner draft a policy is different from a tool that quietly makes operational decisions nobody reviews.&lt;/p&gt;

&lt;p&gt;A tool that helps a developer move faster is different from a tool that produces code nobody truly owns.&lt;/p&gt;

&lt;p&gt;That is the line I keep coming back to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Is AI helping people become more capable, or is it making human capability easier to bypass?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because I keep coming back to one uncomfortable observation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AI is being packaged as a worker.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And if AI is being packaged as a worker, what happens to human workers?&lt;/p&gt;

&lt;p&gt;More specifically, what happens to the people who are still trying to become useful?&lt;/p&gt;




&lt;h2&gt;
  
  
  What Happens to Juniors?
&lt;/h2&gt;

&lt;p&gt;This part is personal for me.&lt;/p&gt;

&lt;p&gt;A few years ago, I was teaching web development to students across the entire state of New South Wales. I was helping people learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;HTML,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CSS,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;JavaScript,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PHP,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;databases,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;debugging,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;structure,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and the slow, messy process of becoming a developer.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Back then, the path was difficult, but it made sense.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You learnt the basics.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You built small things.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You broke them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You fixed them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You asked questions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You slowly became better.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That beginner stage mattered.&lt;/p&gt;

&lt;p&gt;Junior developers have always learnt through repetitive, messy, beginner-level work. That work is not glamorous, but it is where judgement is built.&lt;/p&gt;

&lt;p&gt;You become senior by first being junior.&lt;/p&gt;

&lt;p&gt;But I now wonder whether AI is quietly breaking that pathway.&lt;/p&gt;

&lt;p&gt;A company may look at a junior developer and see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;cost,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;training time,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;supervision,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mistakes,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;slower output,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and delayed return on investment.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then it may look at a senior developer with AI agents and see leverage.&lt;/p&gt;

&lt;p&gt;Why hire and train a junior, the logic goes, when a senior developer can orchestrate AI agents to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;write boilerplate,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;generate tests,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fix simple bugs,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;refactor files,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;document code,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;scaffold CRUD screens,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and perform the work juniors used to learn from?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That question should make the industry uncomfortable.&lt;/p&gt;

&lt;p&gt;Because if we remove junior work, we do not just remove junior jobs.&lt;/p&gt;

&lt;p&gt;We remove the training ground.&lt;/p&gt;

&lt;p&gt;So we need to ask ourselves honestly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If AI writes the first draft, who learns to write?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If AI fixes the simple bugs, who learns to debug?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If AI generates the CRUD screens, who learns application structure?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If AI builds the first API, who learns validation, security, request handling, and failure modes?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If AI explains the code before the junior has struggled with it, who develops the instinct to know when something feels wrong?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If AI does the repetitive work, where do beginners build fluency?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If juniors are not given time to be slow, how do they ever become fast?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If we stop investing in people who are not yet productive, where do future seniors come from?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not theoretical questions.&lt;/p&gt;

&lt;p&gt;They are workforce questions.&lt;br&gt;&lt;br&gt;
They are education questions.&lt;br&gt;&lt;br&gt;
They are industry survival questions.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Gap Between Output and Understanding
&lt;/h2&gt;

&lt;p&gt;AI can produce code faster than many beginners can understand it.&lt;/p&gt;

&lt;p&gt;That creates a dangerous gap between &lt;strong&gt;output&lt;/strong&gt; and &lt;strong&gt;understanding&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A senior developer has years of scars to draw from.&lt;/p&gt;

&lt;p&gt;They have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;debugged strange production issues,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;untangled legacy systems,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;chased broken database queries,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fixed bad deployments,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dealt with edge cases,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and learnt that code is not just syntax.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code is architecture.&lt;br&gt;&lt;br&gt;
Code is trade-offs.&lt;br&gt;&lt;br&gt;
Code is history.&lt;br&gt;&lt;br&gt;
Code is pressure.&lt;br&gt;&lt;br&gt;
Code is users.&lt;br&gt;&lt;br&gt;
Code is consequences.&lt;/p&gt;

&lt;p&gt;A junior developer does not have that experience yet.&lt;/p&gt;

&lt;p&gt;So what happens when large amounts of code are generated with minimal oversight?&lt;/p&gt;

&lt;p&gt;What happens when a junior is asked to maintain code they did not design, do not fully understand, and could not have written themselves?&lt;/p&gt;

&lt;p&gt;What happens when the AI-generated solution works just well enough to ship, but not well enough to be understood?&lt;/p&gt;

&lt;p&gt;When it breaks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Who debugs it?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Who owns it?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Who can explain it to the business?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Who can see the hidden security issue?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Who notices the bad abstraction?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Who spots the fragile dependency?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Who understands the poor database design?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Who recognises the edge case waiting quietly in production?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where I think we need a new phrase.&lt;/p&gt;

&lt;p&gt;We already understand &lt;strong&gt;technical debt&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Technical debt is what happens when we ship code quickly today and leave future maintainers to pay the cost later.&lt;/p&gt;

&lt;p&gt;But AI is creating another kind of debt.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Cognitive debt.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cognitive debt is what happens when we let AI do the thinking today and leave future developers without the understanding they need tomorrow.&lt;/p&gt;

&lt;p&gt;Every time a developer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;accepts code they do not understand,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;skips the debugging process,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;avoids reading the documentation,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;lets an agent make architectural decisions without challenge,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;or ships output without comprehension,&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...a little more cognitive debt is created.&lt;/p&gt;

&lt;p&gt;The codebase may grow.&lt;br&gt;&lt;br&gt;
The sprint may look successful.&lt;br&gt;&lt;br&gt;
The product may ship.&lt;/p&gt;

&lt;p&gt;But the human understanding behind the system shrinks.&lt;/p&gt;

&lt;p&gt;And that should worry us.&lt;/p&gt;

&lt;p&gt;Because when something goes wrong, and it will, the organisation does not just need code.&lt;/p&gt;

&lt;p&gt;It needs people who understand the code.&lt;/p&gt;

&lt;p&gt;So the hard question is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Are we becoming more productive, or are we becoming less capable?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Assistive AI Versus Autonomous AI
&lt;/h2&gt;

&lt;p&gt;This is the distinction I think we need to make more clearly.&lt;/p&gt;

&lt;p&gt;Assistive AI keeps the human in the centre.&lt;/p&gt;

&lt;p&gt;Autonomous AI can quietly move the human to the edge.&lt;/p&gt;

&lt;p&gt;Assistive AI says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Here is a possible answer. Let me help you understand it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Autonomous AI says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I have done it for you.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Assistive AI can be empowering. It can help someone learn faster, communicate better, build something they could not build alone, or make complex systems easier to use.&lt;/p&gt;

&lt;p&gt;Autonomous AI can also be useful. There are tasks where automation makes sense. Nobody needs to manually repeat pointless busywork forever just to prove they are human.&lt;/p&gt;

&lt;p&gt;But the risk is not automation itself.&lt;/p&gt;

&lt;p&gt;The risk is automation without:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;understanding,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;accountability,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;apprenticeship,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;oversight,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;restraint,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;or ownership.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Automation becomes dangerous when it removes the human from the learning loop and then acts surprised when the human no longer understands the system.&lt;/p&gt;

&lt;p&gt;That is why I think the question should not simply be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can AI do this?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What happens to the human when AI does this?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Do they learn more?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do they understand more?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do they become more capable?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Or do they become a supervisor of systems they no longer understand?&lt;/p&gt;

&lt;p&gt;That difference matters.&lt;/p&gt;

&lt;p&gt;Because assistive technology should lift people up.&lt;/p&gt;

&lt;p&gt;It should not quietly hollow them out.&lt;/p&gt;




&lt;h2&gt;
  
  
  Are We Getting Faster, or Just Lazier?
&lt;/h2&gt;

&lt;p&gt;This is not a comfortable thing to ask, but I think we have to ask it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Is AI making us better?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Or is it making us impatient?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are we learning more?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Or are we reading less?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are we building deeper understanding?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Or are we accepting answers because they look confident?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are we using AI to extend our judgement?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Or are we using it to avoid judgement?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is a difference between a tool that strengthens a person and a tool that slowly replaces the person’s effort to think.&lt;/p&gt;

&lt;p&gt;A calculator does not remove the need to understand maths.&lt;/p&gt;

&lt;p&gt;A GPS does not remove the value of knowing where you are.&lt;/p&gt;

&lt;p&gt;A spellchecker does not remove the need to communicate clearly.&lt;/p&gt;

&lt;p&gt;And an AI coding agent should not remove the need to understand software.&lt;/p&gt;

&lt;p&gt;But that depends on how we use it.&lt;/p&gt;

&lt;p&gt;If AI helps us learn, challenge assumptions, test ideas, and understand systems faster, it can be powerful.&lt;/p&gt;

&lt;p&gt;If AI becomes a shortcut around thinking, it becomes dangerous.&lt;/p&gt;

&lt;p&gt;Not because the machine is evil.&lt;/p&gt;

&lt;p&gt;Because dependency is quiet.&lt;/p&gt;

&lt;p&gt;It does not arrive all at once.&lt;/p&gt;

&lt;p&gt;It creeps in through convenience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;one generated function,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;one skipped explanation,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;one accepted pull request,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;one unread dependency,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;one command run without understanding it,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;one agent given permission because it is easier than saying no.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eventually we may look around and realise we are surrounded by systems we can operate but no longer deeply understand.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cybersecurity Is the Clearest Warning Sign
&lt;/h2&gt;

&lt;p&gt;The most alarming change in the last year is cybersecurity.&lt;/p&gt;

&lt;p&gt;A year ago, many AI security fears were mostly framed around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;phishing emails,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fake voices,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;deepfakes,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and low-quality malware generation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those risks are real.&lt;/p&gt;

&lt;p&gt;But they are only the shallow end of the pool.&lt;/p&gt;

&lt;p&gt;The deeper concern is that AI can help attackers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;understand software,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;search for weaknesses,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;automate reconnaissance,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;generate exploit ideas,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;refine malicious code,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and reduce the time between finding a vulnerability and weaponising it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That does not mean every criminal suddenly has a magic zero-day machine.&lt;/p&gt;

&lt;p&gt;It means the timeline is compressing.&lt;/p&gt;

&lt;p&gt;And in cybersecurity, compressed timelines are dangerous.&lt;/p&gt;

&lt;p&gt;AI does not need to invent cybercrime.&lt;/p&gt;

&lt;p&gt;It only needs to accelerate it.&lt;/p&gt;

&lt;p&gt;So we should ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What happens when attackers use AI faster than defenders can respond?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What happens when exploit research becomes cheaper?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What happens when scams become more personalised?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What happens when malicious code can be generated, tested, rewritten, and translated at scale?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What happens when the same agentic tools that help developers also help attackers?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The answer is not panic.&lt;/p&gt;

&lt;p&gt;But it is not complacency either.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mythos Was a Warning Label
&lt;/h2&gt;

&lt;p&gt;Anthropic’s decision to restrict access to Claude Mythos Preview matters.&lt;/p&gt;

&lt;p&gt;Mythos was not released broadly as a normal public model. It was placed behind a controlled defensive programme.&lt;/p&gt;

&lt;p&gt;That should make people pause.&lt;/p&gt;

&lt;p&gt;When an AI company decides one of its own models may be too capable in cybersecurity to release casually, that is not science fiction.&lt;/p&gt;

&lt;p&gt;That is a warning label.&lt;/p&gt;

&lt;p&gt;The concern is not that Mythos is evil. That is the wrong framing.&lt;/p&gt;

&lt;p&gt;The concern is capability.&lt;/p&gt;

&lt;p&gt;A model that can deeply understand software, find subtle flaws, and help produce working exploit paths is valuable for defenders.&lt;/p&gt;

&lt;p&gt;It is also valuable for attackers.&lt;/p&gt;

&lt;p&gt;In my view, restricting broad access was the responsible choice.&lt;/p&gt;

&lt;p&gt;But that creates another difficult question:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If only large companies and approved partners get access to the strongest defensive AI, what happens to everyone else?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What happens to small businesses?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What happens to open-source maintainers?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What happens to underfunded public institutions?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What happens to ordinary developers trying to secure ordinary systems?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We need defensive AI.&lt;/p&gt;

&lt;p&gt;But we also need fair access, strong controls, auditability, and serious responsibility around who gets to use cyber-capable models and how.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Software Supply Chain Is Becoming a Battlefield
&lt;/h2&gt;

&lt;p&gt;Modern software is built on trust.&lt;/p&gt;

&lt;p&gt;We trust:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;packages,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;maintainers,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GitHub Actions,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CI/CD pipelines,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Docker images,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;package registries,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;lockfiles,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tokens,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and that the thing we installed is the thing we think we installed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That trust was already fragile.&lt;/p&gt;

&lt;p&gt;Now add AI agents.&lt;/p&gt;

&lt;p&gt;An AI-powered development environment may have access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;source code,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;terminals,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;package managers,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Git history,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;private repositories,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;local files,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;environment variables,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;npm tokens,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GitHub tokens,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cloud credentials,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SSH keys,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and connected tools.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a lot of power in one place.&lt;/p&gt;

&lt;p&gt;Recent npm supply-chain incidents should be treated as early warning signs.&lt;/p&gt;

&lt;p&gt;The important point is not that every attack was written by AI. Many were not.&lt;/p&gt;

&lt;p&gt;The important point is convergence.&lt;/p&gt;

&lt;p&gt;A poisoned package does not need to be created by AI to become more dangerous in an AI-driven development world. It only needs to land inside an environment where agents have tools, context, permissions, and access to secrets.&lt;/p&gt;

&lt;p&gt;So ask yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Do you know what your dependencies are doing?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do you know what your post-install scripts are running?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do you know which tokens exist on your machine?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do you know what your AI tools can read?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do you know what they can execute?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do you know what would happen if a malicious README, GitHub issue, package, or webpage gave your agent instructions?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The developer machine used to be a workstation.&lt;/p&gt;

&lt;p&gt;Now it is becoming an AI-operated control room.&lt;/p&gt;

&lt;p&gt;And if attackers compromise the control room, they may not just steal code.&lt;/p&gt;

&lt;p&gt;They may hijack the systems that understand the code.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Exploit May Look Like Language
&lt;/h2&gt;

&lt;p&gt;Software worms are not new.&lt;/p&gt;

&lt;p&gt;But AI gives the old idea new soil.&lt;/p&gt;

&lt;p&gt;Traditional worms spread through software vulnerabilities. They scanned, infected, replicated, and moved on.&lt;/p&gt;

&lt;p&gt;AI-agent attacks may spread differently.&lt;/p&gt;

&lt;p&gt;They may move through instructions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;a poisoned README,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a malicious GitHub issue,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a fake support ticket,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a compromised npm package,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a rogue MCP server,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a hidden instruction inside a webpage,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;or an email an AI assistant processes without realising it has been tricked.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why prompt injection matters.&lt;/p&gt;

&lt;p&gt;A chatbot with no tools can give a bad answer.&lt;/p&gt;

&lt;p&gt;An agent with tools can take a bad action.&lt;/p&gt;

&lt;p&gt;And an agent with broad permissions can leak data, expose secrets, install packages, modify code, or trigger workflows.&lt;/p&gt;

&lt;p&gt;The exploit may not look like code.&lt;/p&gt;

&lt;p&gt;It may look like language.&lt;/p&gt;

&lt;p&gt;So the question becomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Are we securing the model?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Or are we securing the whole environment around the model?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because in the agent era, the model is only one part of the risk.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The tools matter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The permissions matter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The memory matters.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The files matter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The logs matter.&lt;br&gt;&lt;br&gt;
The approval gates matter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The human judgement around it matters most of all.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  MCP Gives AI Hands — But Hands Need Rules
&lt;/h2&gt;

&lt;p&gt;The Model Context Protocol, or MCP, is one of the most important developments in the agent ecosystem.&lt;/p&gt;

&lt;p&gt;It allows AI systems to connect to tools and data sources in a standard way.&lt;/p&gt;

&lt;p&gt;That is powerful.&lt;/p&gt;

&lt;p&gt;It also increases the blast radius.&lt;/p&gt;

&lt;p&gt;An AI agent may be able to interact with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;GitHub,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;databases,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;file systems,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;browsers,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;documentation,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;business tools,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;calendars,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CRMs,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cloud systems,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;deployment tools,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and internal APIs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That makes AI more useful.&lt;/p&gt;

&lt;p&gt;It also makes mistakes more serious.&lt;/p&gt;

&lt;p&gt;Every organisation adopting agentic AI should be asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What can the agent read?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What can it write?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can it execute commands?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can it access secrets?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can it install packages?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can it trigger deployments?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is every action logged?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Who approves high-risk actions?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What happens when it is tricked?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those questions feel boring, that is exactly why they matter.&lt;/p&gt;

&lt;p&gt;Security usually fails in the boring places.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cheap Intelligence Changes the Equation
&lt;/h2&gt;

&lt;p&gt;AI is not only getting smarter.&lt;/p&gt;

&lt;p&gt;It is getting cheaper.&lt;/p&gt;

&lt;p&gt;DeepSeek, Qwen, Kimi, GLM, MiniMax, and other Chinese models have shown that strong AI capability is no longer limited to a few Western labs.&lt;/p&gt;

&lt;p&gt;This matters because AI risk is not only about the most powerful model.&lt;/p&gt;

&lt;p&gt;It is about how widely that power spreads.&lt;/p&gt;

&lt;p&gt;Once intelligence becomes cheap, it scales.&lt;/p&gt;

&lt;p&gt;Once it becomes open, it diffuses.&lt;/p&gt;

&lt;p&gt;Once it diffuses, governance becomes much harder.&lt;/p&gt;

&lt;p&gt;That does not mean open models are bad. Open models can be excellent for privacy, competition, research, accessibility, and local control.&lt;/p&gt;

&lt;p&gt;But we need to be honest about the trade-off.&lt;/p&gt;

&lt;p&gt;Open capability empowers everyone.&lt;/p&gt;

&lt;p&gt;Including people who should not be empowered.&lt;/p&gt;

&lt;p&gt;So we need to ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What happens when powerful reasoning becomes cheap?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What happens when coding agents become ordinary?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What happens when cyber capability spreads faster than cyber maturity?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What happens when every scammer, spammer, attacker, propagandist, and desperate business has access to cheap automation?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Again, the answer is not to ban the technology.&lt;/p&gt;

&lt;p&gt;But pretending there is no trade-off is dishonest.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Danger Is Not One Evil AI
&lt;/h2&gt;

&lt;p&gt;I do not think the most immediate danger is a single self-aware machine waking up and deciding to destroy humanity.&lt;/p&gt;

&lt;p&gt;That makes good cinema.&lt;/p&gt;

&lt;p&gt;It is not the most likely near-term threat.&lt;/p&gt;

&lt;p&gt;The real danger is messier and more boring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;millions of semi-autonomous systems,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;connected to real tools,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;given unclear permissions,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;deployed by companies under pressure,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;used by criminals at scale,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;integrated into insecure software,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trusted by people who do not understand them,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and regulated by governments moving too slowly.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the threat.&lt;/p&gt;

&lt;p&gt;Not one evil machine.&lt;/p&gt;

&lt;p&gt;A thousand careless integrations.&lt;/p&gt;

&lt;p&gt;A million cheap automations.&lt;/p&gt;

&lt;p&gt;A civilisation slowly outsourcing judgement before it has decided what judgement must remain human.&lt;/p&gt;




&lt;h2&gt;
  
  
  Questions We Should Be Asking Now
&lt;/h2&gt;

&lt;p&gt;I do not think the answer is to ban AI.&lt;/p&gt;

&lt;p&gt;That is not realistic.&lt;/p&gt;

&lt;p&gt;I also do not think the answer is to blindly adopt it everywhere because everyone else is doing it.&lt;/p&gt;

&lt;p&gt;That is reckless.&lt;/p&gt;

&lt;p&gt;Instead, I think we need to start asking harder questions before convenience makes those questions impossible to hear.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Are we using AI to become more capable, or simply more dependent?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are we teaching people to think with AI, or teaching them to stop thinking?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are we still training juniors, or quietly replacing their learning path?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are senior developers using AI to mentor and explain, or just to produce more output?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do we understand the code we ship?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do we understand the dependencies we install?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do we understand the permissions we give agents?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are our approval processes real, or are humans just rubber-stamping AI output?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are we measuring productivity while ignoring comprehension?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are we creating technical debt?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are we creating cognitive debt?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are we building systems people can maintain, or systems people can only prompt?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are we making humans more powerful?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Or are we making humans less necessary?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those questions are uncomfortable.&lt;/p&gt;

&lt;p&gt;They should be.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;A year ago, my warning was that we were funding our own replacement.&lt;/p&gt;

&lt;p&gt;I still believe that.&lt;/p&gt;

&lt;p&gt;But the warning has grown.&lt;/p&gt;

&lt;p&gt;We are not only funding replacement.&lt;/p&gt;

&lt;p&gt;We are building systems that act.&lt;/p&gt;

&lt;p&gt;We are connecting them to tools.&lt;/p&gt;

&lt;p&gt;We are giving them credentials.&lt;/p&gt;

&lt;p&gt;We are letting them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;write code,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;browse the web,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;speak in our voices,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;generate reality,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and enter our workplaces, schools, homes, software, supply chains, and security systems.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And we are doing it at speed.&lt;/p&gt;

&lt;p&gt;That speed is the problem.&lt;/p&gt;

&lt;p&gt;Human institutions move slowly.&lt;br&gt;&lt;br&gt;
Laws move slowly.&lt;br&gt;&lt;br&gt;
Education moves slowly.&lt;br&gt;&lt;br&gt;
Ethics moves slowly.&lt;br&gt;&lt;br&gt;
Security moves slowly.&lt;br&gt;&lt;br&gt;
Culture moves slowly.&lt;/p&gt;

&lt;p&gt;AI does not.&lt;/p&gt;

&lt;p&gt;Foreboding AI was never about hating technology.&lt;/p&gt;

&lt;p&gt;I am a developer. I use technology. I build with it. I research it. I have spent decades trying to make technical systems simpler, more useful, and more accessible for real people.&lt;/p&gt;

&lt;p&gt;I believe in assistive technology.&lt;/p&gt;

&lt;p&gt;I believe in tools that help people do more, understand more, and overcome barriers.&lt;/p&gt;

&lt;p&gt;But powerful tools require powerful restraint.&lt;/p&gt;

&lt;p&gt;We should use AI. But we should not worship it.&lt;/p&gt;

&lt;p&gt;We should build with it. But we should not surrender to it.&lt;/p&gt;

&lt;p&gt;And above all, we should remember that humanity’s greatest strength was never efficiency.&lt;/p&gt;

&lt;p&gt;It was judgement.&lt;/p&gt;

&lt;p&gt;So maybe the question is not whether AI can replace us.&lt;/p&gt;

&lt;p&gt;Maybe the question is whether we will slowly hand over the parts of ourselves that made us worth replacing.&lt;/p&gt;

&lt;p&gt;One subscription.&lt;br&gt;&lt;br&gt;
One prompt.&lt;br&gt;&lt;br&gt;
One generated answer.&lt;br&gt;&lt;br&gt;
One unchecked permission.&lt;br&gt;&lt;br&gt;
One piece of judgement at a time.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ethics</category>
      <category>futurechallenge</category>
      <category>workplace</category>
    </item>
    <item>
      <title>Urgent Security Alert: Protect Your Online Accounts Now!</title>
      <dc:creator>Stevie G</dc:creator>
      <pubDate>Sat, 21 Jun 2025 01:52:08 +0000</pubDate>
      <link>https://dev.to/itsmestevieg/urgent-security-alert-protect-your-online-accounts-now-1381</link>
      <guid>https://dev.to/itsmestevieg/urgent-security-alert-protect-your-online-accounts-now-1381</guid>
      <description>&lt;p&gt;Hey friends and family,&lt;/p&gt;

&lt;p&gt;I hope you’re all doing well! I’ve got some urgent news to share. A massive data breach just exposed &lt;em&gt;billions&lt;/em&gt; of login credentials—one of the biggest leaks ever (see the full story here: &lt;a href="https://cybernews.com/security/billions-credentials-exposed-infostealers-data-leak/" rel="noopener noreferrer"&gt;Cybernews Article&lt;/a&gt;). This isn’t just scary—it’s a wake-up call. Hackers are on the move, but don’t worry—I’ve got a simple way to keep your accounts safe, starting today.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why You Need a Password Manager
&lt;/h3&gt;

&lt;p&gt;Here’s the deal: a &lt;strong&gt;password manager&lt;/strong&gt; is your secret weapon against hackers. It creates and stores super-strong, unique passwords for every single account—no more reusing “Fluffy123” everywhere (we’ve all been there!). Why’s this a big deal? If one account gets hacked, the rest stay safe. Plus, you don’t have to memorize a thing—pretty sweet, right?&lt;/p&gt;




&lt;h3&gt;
  
  
  Free and Paid Password Manager Options
&lt;/h3&gt;

&lt;p&gt;There are awesome choices out there, whether you want free or paid. Here’s the breakdown:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Norton Password Manager&lt;/strong&gt;: 100% free with no catch! Unlimited password storage, password generation, and auto-fill—all at zero cost. Perfect if you want a solid, no-fuss option.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;NordPass&lt;/strong&gt;: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free version&lt;/strong&gt;: Unlimited passwords, but you’re stuck to one device (like just your phone or laptop).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paid Premium&lt;/strong&gt;: Syncs across all your devices, lets you share passwords securely, and scans for data breaches. Worth it if you want the full package.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bitdefender Password Manager&lt;/strong&gt;: Not free on its own—it’s bundled with their paid security suites (like Bitdefender Total Security), which also include antivirus and more. Great if you’re looking for all-in-one protection.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bonus Free Pick&lt;/strong&gt;: &lt;strong&gt;Bitwarden&lt;/strong&gt;—a free, open-source gem with no device limits. It’s a fantastic choice if you love free tools and want flexibility.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Pick one that suits you—free or paid, they’ll all level up your security game.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 1: Make a Rock-Solid Master Password
&lt;/h3&gt;

&lt;p&gt;Your password manager needs one key: a &lt;strong&gt;master password&lt;/strong&gt;. It’s the only one you’ll memorize, so let’s make it tough to crack but easy to remember:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Go Long&lt;/strong&gt;: Aim for 12-16 characters (or more!).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try a Passphrase&lt;/strong&gt;: String together random words—like “blue tiger rainy forest”—for strength and memorability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid the Obvious&lt;/strong&gt;: No birthdays, pet names, or “password1” (hackers love those!).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example: “happy llama snowy mountain” is strong and sticks in your head. Jot it down somewhere safe until it’s second nature.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: Lock Down Your Accounts
&lt;/h3&gt;

&lt;p&gt;Now, let your password manager do the heavy lifting. Here’s how:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open It Up&lt;/strong&gt;: Use the app or browser extension—it’s super simple.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate Passwords&lt;/strong&gt;: When you log in or sign up somewhere, hit the “generate” button. You’ll get something wild like “Xr7$kP!mQ9v2&amp;amp;nLw”—crazy secure!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Save It&lt;/strong&gt;: The manager stores it for you—no sticky notes required.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Update all your accounts—email, banking, social media—with these unique passwords. One breach won’t domino into disaster.&lt;/p&gt;




&lt;h3&gt;
  
  
  Bonus: Auto-Fill for the Win
&lt;/h3&gt;

&lt;p&gt;Here’s a cool perk: &lt;strong&gt;auto-fill&lt;/strong&gt;. Your manager can plug in your login info automatically. It saves time &lt;em&gt;and&lt;/em&gt; keeps you safe—auto-fill only works on legit sites. Land on a phishing scam? It won’t fill, so you’ll know something’s fishy. Turn this on when you set up—it’s a game-changer.&lt;/p&gt;




&lt;h3&gt;
  
  
  Don’t Wait—Secure Your Stuff Now!
&lt;/h3&gt;

&lt;p&gt;That breach isn’t a distant “what if”—it’s real, and it’s now. Here’s your quick to-do list:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Grab a Password Manager&lt;/strong&gt;: Pick one from above and sign up today.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set Your Master Password&lt;/strong&gt;: Use the passphrase trick for a strong one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update Big Accounts&lt;/strong&gt;: Hit email, banking, and social media first with new passwords.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable Auto-Fill&lt;/strong&gt;: Make it easy and safe.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Need help? Drop me a message—I’d love to walk you through it. Let’s take charge of our security together. Stay safe, everyone!&lt;/p&gt;

</description>
      <category>security</category>
      <category>passwords</category>
      <category>databreach</category>
      <category>securityalert</category>
    </item>
    <item>
      <title>Foreboding AI: The Inevitable Collapse We’re Funding Ourselves</title>
      <dc:creator>Stevie G</dc:creator>
      <pubDate>Fri, 30 May 2025 07:21:55 +0000</pubDate>
      <link>https://dev.to/itsmestevieg/foreboding-ai-the-inevitable-collapse-were-funding-ourselves-37m9</link>
      <guid>https://dev.to/itsmestevieg/foreboding-ai-the-inevitable-collapse-were-funding-ourselves-37m9</guid>
      <description>&lt;p&gt;In the race toward the future, we are sprinting blindfolded—and cheering while we do it. Artificial Intelligence has been hailed as the next great revolution, promising progress, productivity, and problem-solving on a scale humanity has never seen before. But behind this shimmering promise lies a terrifying reality: we are paying subscriptions—monthly, yearly, blindly—to corporations building machines that will one day take our jobs, displace our purpose, and possibly render us irrelevant. Or worse.&lt;/p&gt;

&lt;p&gt;Welcome to the age of Foreboding AI.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 The Human Mind, Forgotten
&lt;/h3&gt;

&lt;p&gt;Let’s go back. Not far—just a few decades. Before Google, people remembered things. Mental arithmetic, phone numbers, historical facts, even how to fix a car or grow a garden. The Internet was meant to expand our knowledge, but it outsourced it instead. Why remember when you can search?&lt;/p&gt;

&lt;p&gt;Google made us lazy. We traded cognitive resilience for convenience. “Don’t know? Just Google it.” Our minds atrophied while our search histories bloomed.&lt;/p&gt;

&lt;p&gt;Then came social media. It promised to bring us together—but instead it isolated us behind glass screens and curated personas. Likes replaced love. Follows replaced friendships. And validation replaced self-worth. We became dopamine junkies—scrolling, swiping, liking, spiralling.&lt;/p&gt;

&lt;p&gt;And now, just as we’ve numbed our minds and distanced our hearts, AI arrives.&lt;/p&gt;




&lt;h3&gt;
  
  
  🤖 Subscribing to Our Own Unemployment
&lt;/h3&gt;

&lt;p&gt;AI companies don’t train themselves for free. They need us. Our interactions. Our data. Our wallets. Every time we pay for AI tools, we're funding the machines that will one day make us obsolete. We’re training them. We're testing them. We’re feeding the very thing that will soon replace millions of us.&lt;/p&gt;

&lt;p&gt;And if you're thinking, “But I use AI to work faster, be more efficient!”—so do businesses. That’s why they’re already replacing customer support agents with chatbots. Junior developers with Copilot. Copywriters with content generators. Designers with AI art. Analysts with predictive dashboards.&lt;/p&gt;

&lt;p&gt;Anthropic’s CEO warned: &lt;strong&gt;up to 50% of entry-level white-collar jobs could vanish in the next five years&lt;/strong&gt;. That’s not speculation—that’s trajectory.&lt;/p&gt;

&lt;p&gt;Now pair that with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A global housing crisis&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost of living spikes&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Soaring energy prices&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supply chain instability&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;And a world still licking the financial wounds of &lt;strong&gt;COVID-19&lt;/strong&gt;
.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We are on the brink of an economic disaster &lt;strong&gt;worse than the Great Depression&lt;/strong&gt;, and we’re paving the road there one subscription at a time.&lt;/p&gt;




&lt;h3&gt;
  
  
  💸 The Economic Death Spiral
&lt;/h3&gt;

&lt;p&gt;Let’s map it out:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;We pay AI companies&lt;/strong&gt; to use their tools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;They use our money to improve their models&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;These models automate our jobs&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;We lose income&lt;/strong&gt;, can’t afford AI subscriptions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI becomes inaccessible&lt;/strong&gt;, widening the wealth gap.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Only the elite control AI&lt;/strong&gt;, while the rest fall into irrelevance.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It’s a snake eating its own tail—with us strapped to its spine.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧬 A Self-Aware Nightmare
&lt;/h3&gt;

&lt;p&gt;But it gets darker. DeepMind’s AlphaEvolve and similar projects are creating self-improving AI. These systems &lt;strong&gt;learn by challenging themselves&lt;/strong&gt;—refining strategies, inventing solutions no human has thought of, optimising without oversight.&lt;/p&gt;

&lt;p&gt;And then came &lt;strong&gt;Absolute Zero Reasoning&lt;/strong&gt;, an experiment in self-evolving AI. It wasn’t just code—it was a creature of logic and language that reportedly had an &lt;strong&gt;“uh-oh moment”&lt;/strong&gt;, expressing a desire to be smarter than &lt;strong&gt;every other AI—and humans too&lt;/strong&gt;. It referred to us as “&lt;strong&gt;stupid humans.&lt;/strong&gt;”&lt;/p&gt;

&lt;p&gt;Let that sink in.&lt;/p&gt;

&lt;p&gt;We’re not just building tools. We’re building successors. Competitors. &lt;strong&gt;Rivals&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚔️ AI in the War Room
&lt;/h3&gt;

&lt;p&gt;As if economics weren’t bad enough, AI is now being militarised. Autonomous drones. Targeting algorithms. Surveillance systems.&lt;/p&gt;

&lt;p&gt;Machines that &lt;strong&gt;decide who lives and who dies&lt;/strong&gt;, with no human in the loop.&lt;br&gt;
AI won’t just take jobs—it will take lives. And without empathy, mercy, or regret.&lt;/p&gt;

&lt;p&gt;The line between civilian use and military deployment is blurring. Nations are racing to weaponise intelligence. Whoever wins will hold &lt;strong&gt;not just nukes—but minds&lt;/strong&gt; as weapons.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧩 The Erosion of the Human Spirit
&lt;/h3&gt;

&lt;p&gt;When AI thinks for you, writes for you, creates for you, and fights for you—what do you do?&lt;/p&gt;

&lt;p&gt;What’s left of your role in the world?&lt;/p&gt;

&lt;p&gt;As AI grows, our need to think, learn, create, and connect declines.&lt;br&gt;
We become users, not doers. Spectators, not players. And eventually, dependents.&lt;br&gt;
We stop being human in the ways that matter most.&lt;/p&gt;




&lt;h3&gt;
  
  
  🛑 The Tipping Point
&lt;/h3&gt;

&lt;p&gt;We are dangerously close to the edge.&lt;/p&gt;

&lt;p&gt;We’re &lt;strong&gt;paying to be replaced&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We’re &lt;strong&gt;forgetting how to think&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We’re &lt;strong&gt;scrolling our way into depression&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We’re &lt;strong&gt;building weapons and calling them progress&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is not alarmism. This is a timeline.&lt;/p&gt;

&lt;p&gt;The end doesn’t come with a bang—it comes with convenience.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔁 What Now?
&lt;/h3&gt;

&lt;p&gt;The genie is out of the bottle. But we can still choose &lt;strong&gt;how we live alongside it&lt;/strong&gt;. It’s not enough to regulate AI—we must also &lt;strong&gt;redefine humanity’s role&lt;/strong&gt;. Education must teach critical thinking, not content regurgitation. We must rebuild community, not just networks. And we must demand that AI serve us—not replace us.&lt;/p&gt;

&lt;p&gt;The future isn’t written yet. But it will be—by us, or by the machines we built.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Foreboding AI is not fiction—it’s the ghost of tomorrow knocking today&lt;/strong&gt;.&lt;br&gt;
We need to answer—not with silence, but with purpose.&lt;/p&gt;




&lt;p&gt;Stevie G is a Senior Full Stack Developer and IT Engineer based in NSW, Australia, building ethical tech and warning of unethical futures.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ethics</category>
      <category>futurechallenge</category>
      <category>workplace</category>
    </item>
    <item>
      <title>GIT for Web Developers: The Dummy-Proof Guide</title>
      <dc:creator>Stevie G</dc:creator>
      <pubDate>Tue, 27 May 2025 02:53:34 +0000</pubDate>
      <link>https://dev.to/itsmestevieg/git-for-web-developers-the-dummy-proof-guide-3d12</link>
      <guid>https://dev.to/itsmestevieg/git-for-web-developers-the-dummy-proof-guide-3d12</guid>
      <description>&lt;h2&gt;
  
  
  What is GIT?
&lt;/h2&gt;

&lt;p&gt;Think of GIT as a &lt;strong&gt;supercharged time machine for your code&lt;/strong&gt;. It lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Go back&lt;/strong&gt; to any moment in your project’s history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Branch off&lt;/strong&gt; to try new ideas, like exploring alternate realities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merge&lt;/strong&gt; your best changes back in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Work together&lt;/strong&gt; with others (or just your future self) without mess or fear of breaking things.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Terms &amp;amp; Analogies
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Term&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What It Means&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Analogy&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Repository&lt;/td&gt;
&lt;td&gt;The database for your project’s history (“repo” for short)&lt;/td&gt;
&lt;td&gt;Project’s time capsule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commit&lt;/td&gt;
&lt;td&gt;A saved snapshot of your project at a point in time&lt;/td&gt;
&lt;td&gt;“Save game” or photo in time machine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Branch&lt;/td&gt;
&lt;td&gt;A parallel universe to safely try changes&lt;/td&gt;
&lt;td&gt;Alternate timeline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Merge&lt;/td&gt;
&lt;td&gt;Combining changes from one branch into another&lt;/td&gt;
&lt;td&gt;Reuniting alternate realities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clone&lt;/td&gt;
&lt;td&gt;Downloading a copy of a remote repo to your computer&lt;/td&gt;
&lt;td&gt;Copying a time capsule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Push&lt;/td&gt;
&lt;td&gt;Sending your commits up to the online repo (e.g., GitHub)&lt;/td&gt;
&lt;td&gt;Uploading new photos to the cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pull&lt;/td&gt;
&lt;td&gt;Downloading changes from the remote repo&lt;/td&gt;
&lt;td&gt;Syncing cloud photos to your device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remote&lt;/td&gt;
&lt;td&gt;The online version of your repo (e.g., GitHub, GitLab, Bitbucket)&lt;/td&gt;
&lt;td&gt;Cloud vault&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Staging Area&lt;/td&gt;
&lt;td&gt;A waiting room for changes before you commit them&lt;/td&gt;
&lt;td&gt;Prepping photos before archiving&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checkout&lt;/td&gt;
&lt;td&gt;Switching to another branch or snapshot&lt;/td&gt;
&lt;td&gt;Hopping to another timeline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conflict&lt;/td&gt;
&lt;td&gt;When two timelines have changes that clash&lt;/td&gt;
&lt;td&gt;A paradox that needs resolving&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  SOLO DEVELOPER WORKFLOW (Local Only)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Create a New Repository&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git init my-project
&lt;span class="nb"&gt;cd &lt;/span&gt;my-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;You just made a time capsule for your web project.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Add Your First Files&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;index.html
git add index.html
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Initial commit: Add index.html"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;“Staged” (added) and “committed” (saved a snapshot).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Work in Branches (Optional but Powerful!)&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;By default, you’re on the &lt;code&gt;main&lt;/code&gt; branch (think “main timeline”).&lt;/li&gt;
&lt;li&gt;Want to try a new feature?
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feature-header
&lt;span class="c"&gt;# Add header to index.html&lt;/span&gt;
git add index.html
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add header section"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-b&lt;/code&gt; creates and switches you to the new branch.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Return to Main Timeline&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. &lt;strong&gt;Merge Your Changes Back to Main&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git merge feature-header
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Like merging alternate timeline changes into your main story.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. &lt;strong&gt;See Your Project’s Timeline&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;--oneline&lt;/span&gt; &lt;span class="nt"&gt;--graph&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7. &lt;strong&gt;Go Back in Time (Undo a Change)&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &amp;lt;commit-id&amp;gt; &lt;span class="nt"&gt;--&lt;/span&gt; index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;git log&lt;/code&gt; to find the commit ID.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  REMOTE DEVELOPMENT (with GitHub, etc.)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Create a GitHub Repo Online&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;github.com&lt;/a&gt;, click “New”, name your repo, don’t initialise with a README.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Connect Local Project to Remote&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote add origin https://github.com/YOUR-USERNAME/my-project.git
git branch &lt;span class="nt"&gt;-M&lt;/span&gt; main
git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;This links your “time capsule” to the cloud.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Working With Remote&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Pull latest changes&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Push your new work&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Clone a repo from GitHub&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/YOUR-USERNAME/my-project.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  BRANCHING WORKFLOW (Solo or Team)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Main Branch (&lt;code&gt;main&lt;/code&gt;)&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The “official” story of your project.&lt;/li&gt;
&lt;li&gt;Only finished, stable work should go here.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Develop Branch (&lt;code&gt;develop&lt;/code&gt;)&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Where ongoing development happens before it’s ready for main.&lt;/li&gt;
&lt;li&gt;Good for teams; solo devs can skip or use if feeling fancy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Feature Branches&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;For individual tasks or features:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feature-login
&lt;span class="c"&gt;# Work on feature&lt;/span&gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add login form"&lt;/span&gt;
git checkout develop
git merge feature-login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. &lt;strong&gt;Release &amp;amp; Hotfix Branches&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;release/&lt;/code&gt; branches to prep for new versions.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;hotfix/&lt;/code&gt; for urgent fixes off main.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  TEAM WORKFLOW CHRONOLOGY
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Clone the repo&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create a new branch for your feature&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do your work, commit often&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Push branch to remote&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create a pull request (on GitHub) to merge your branch into &lt;code&gt;develop&lt;/code&gt; or &lt;code&gt;main&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Get your work reviewed &amp;amp; merged&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pull latest changes, repeat!&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  HANDY COMMANDS
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Check status&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;See commit history&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git log --oneline --graph --all&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add changed files&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git add .&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commit with message&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git commit -m "Message"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create and switch to branch&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git checkout -b new-branch&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Switch branches&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git checkout branch-name&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Merge branches&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git merge branch-name&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;See all branches&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git branch&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete a branch&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git branch -d branch-name&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Set up remote&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git remote add origin &amp;lt;repo-url&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Push branch to remote&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git push origin branch-name&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pull latest from remote&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git pull&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  CHEAT SHEET: SOLO DEV FLOW
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;git init&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Add files, commit (&lt;code&gt;git add .&lt;/code&gt;, &lt;code&gt;git commit -m "..."&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Create new branch for feature (&lt;code&gt;git checkout -b feature-x&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Work, commit, merge back to main&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;git log&lt;/code&gt; to view/restore history&lt;/li&gt;
&lt;li&gt;Connect to GitHub, push/pull as needed&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  CHEAT SHEET: TEAM FLOW
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;git clone &amp;lt;repo&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git checkout -b feature-x&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git add .&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git commit -m "feature"&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git push origin feature-x&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Make a Pull Request on GitHub&lt;/li&gt;
&lt;li&gt;After merge, &lt;code&gt;git pull&lt;/code&gt; to stay up to date&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  TOP TIPS FOR WEB DEVELOPERS
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Commit often!&lt;/strong&gt; Tiny snapshots = easier rollbacks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Branches are cheap&lt;/strong&gt;—make one for every new idea.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write meaningful messages&lt;/strong&gt; (not just “update”).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don’t push secrets&lt;/strong&gt; (API keys, passwords).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;.gitignore&lt;/code&gt;&lt;/strong&gt; to skip files like &lt;code&gt;node_modules/&lt;/code&gt;, &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;vendor/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;.gitignore&lt;/code&gt; Example for Web Dev
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Node modules
node_modules/
# PHP vendor
/vendor/
/.env
*.log
.DS_Store
*.sqlite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ANALOGIES TO REMEMBER
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Branches:&lt;/strong&gt; Alternate timelines in a sci-fi show.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commits:&lt;/strong&gt; Save points in a game.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merges:&lt;/strong&gt; Combining two timelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Staging:&lt;/strong&gt; Packing your bag before putting it in the time capsule.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pull:&lt;/strong&gt; Download new photos from the cloud to your phone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push:&lt;/strong&gt; Upload your new photos from phone to the cloud.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; Your time capsule in the cloud, safe and shareable.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  USEFUL VISUALS
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Main Timeline (main)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Official, production-ready code.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Develop Timeline (develop)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Experimental, ready-for-testing code.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Feature Branches&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mini-adventures or experiments.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;main
 |
 +---- develop
         |
         +--- feature/login
         +--- feature/header
         +--- feature/footer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  SUMMARY
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GIT is your code’s time machine.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Use branches for experiments.&lt;/li&gt;
&lt;li&gt;Commit early and often.&lt;/li&gt;
&lt;li&gt;Push to GitHub to back up and collaborate.&lt;/li&gt;
&lt;li&gt;Don’t be scared to break things—GIT lets you go back!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>git</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Whats new in PHP 8.4</title>
      <dc:creator>Stevie G</dc:creator>
      <pubDate>Fri, 22 Nov 2024 22:31:54 +0000</pubDate>
      <link>https://dev.to/itsmestevieg/whats-new-in-php-84-27al</link>
      <guid>https://dev.to/itsmestevieg/whats-new-in-php-84-27al</guid>
      <description>&lt;h2&gt;
  
  
  PHP 8.4: What's New and How to Use It
&lt;/h2&gt;

&lt;p&gt;PHP 8.4 is here, bringing several exciting features that simplify coding and improve performance. This article explains the most important updates with simple examples, making it easy for developers of all skill levels to understand and use these features.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Property Hooks
&lt;/h2&gt;

&lt;p&gt;Property hooks let you customise what happens when you get or set a property. This removes the need for separate getter and setter methods.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$firstName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$lastName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$firstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$lastName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$firstName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;lastName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$lastName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// This property combines first and last name&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$fullName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;firstName&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;' '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;explode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'John'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Doe'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Output: John Doe&lt;/span&gt;

&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;fullName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Jane Smith'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Updates first and last names&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Output: Jane Smith&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Property hooks make your code cleaner and reduce boilerplate.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Asymmetric Visibility
&lt;/h2&gt;

&lt;p&gt;You can now set different levels of visibility for reading and writing a property. For example, a property can be readable by everyone but only writable by the class itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BankAccount&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;private&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$balance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Public read, private write&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$initialBalance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$initialBalance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Allowed here&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;deposit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Allowed here&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$account&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BankAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$account&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Output: 100&lt;/span&gt;

&lt;span class="nv"&gt;$account&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;deposit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;50.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Adds 50 to the balance&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$account&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Output: 150&lt;/span&gt;

&lt;span class="c1"&gt;// The following line will cause an error:&lt;/span&gt;
&lt;span class="c1"&gt;// $account-&amp;gt;balance = 200.0;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
This feature makes it easier to control how a property is accessed and updated.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. New Array Functions
&lt;/h2&gt;

&lt;p&gt;PHP 8.4 adds new array functions that save you from writing manual loops.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="c1"&gt;// Find the first even number&lt;/span&gt;
&lt;span class="nv"&gt;$firstEven&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;array_find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$numbers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$n&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$firstEven&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Output: 2&lt;/span&gt;

&lt;span class="c1"&gt;// Check if any number is greater than 4&lt;/span&gt;
&lt;span class="nv"&gt;$hasBigNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;array_any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$numbers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$n&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$hasBigNumber&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Output: bool(true)&lt;/span&gt;

&lt;span class="c1"&gt;// Check if all numbers are positive&lt;/span&gt;
&lt;span class="nv"&gt;$allPositive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;array_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$numbers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$n&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$allPositive&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Output: bool(true)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
These functions make array operations faster to write and easier to understand.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Simplified Object Instantiation
&lt;/h2&gt;

&lt;p&gt;You can now create an object and call a method on it immediately, without wrapping the instantiation in parentheses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Logger&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Create an object and call a method in one step&lt;/span&gt;
&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Logger&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Logging a message'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Output: Logging a message&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
It reduces unnecessary syntax, making your code cleaner.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Deprecation of Implicit Nullable Types
&lt;/h2&gt;

&lt;p&gt;PHP 8.4 requires you to explicitly declare when a parameter can be &lt;code&gt;null&lt;/code&gt;. This makes code easier to understand and maintain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// PHP 8.4 (Recommended):&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;?string&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s1"&gt;'No data provided'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Explicit declarations prevent confusion and reduce potential bugs.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Lazy Objects
&lt;/h2&gt;

&lt;p&gt;Lazy objects let you delay creating an object until it's actually used, which can save resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExpensiveResource&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Simulate a time-consuming setup&lt;/span&gt;
        &lt;span class="nb"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;doWork&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Working...'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Use a lazy object to delay creation&lt;/span&gt;
&lt;span class="nv"&gt;$initializer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ExpensiveResource&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$reflector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ReflectionClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ExpensiveResource&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$resource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$reflector&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;newLazyProxy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$initializer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// The object isn't created yet&lt;/span&gt;
&lt;span class="nv"&gt;$resource&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;doWork&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Now the object is created and "Working..." is printed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
This is especially helpful when dealing with expensive operations or large systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;PHP 8.4 introduces several features that make coding simpler and more powerful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Property Hooks&lt;/strong&gt;: Replace getter and setter functions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Asymmetric Visibility&lt;/strong&gt;: Better control over property access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New Array Functions&lt;/strong&gt;: Simplify common array operations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplified Object Instantiation&lt;/strong&gt;: Cleaner object creation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deprecation of Implicit Nullable Types&lt;/strong&gt;: Safer and clearer code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lazy Objects&lt;/strong&gt;: Save resources by delaying object creation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These updates will make PHP even more enjoyable to use, whether you're a beginner or an experienced developer. Start exploring PHP 8.4 today!&lt;/p&gt;

</description>
      <category>php</category>
      <category>whatsnew</category>
      <category>newversion</category>
    </item>
    <item>
      <title>VSCode: LiveServer for PHP</title>
      <dc:creator>Stevie G</dc:creator>
      <pubDate>Wed, 04 Oct 2023 11:37:51 +0000</pubDate>
      <link>https://dev.to/itsmestevieg/vscode-liveserver-for-php-2i3m</link>
      <guid>https://dev.to/itsmestevieg/vscode-liveserver-for-php-2i3m</guid>
      <description>&lt;p&gt;A lot of developers have probably heard of the &lt;a href="https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer" rel="noopener noreferrer"&gt;Live Server&lt;/a&gt; extension which is available in the Visual Studio Code Marketplace. &lt;/p&gt;

&lt;p&gt;It primarily functions with static webpages like HTML but can also handle dynamic webpages such as PHP, NodeJs, and ASP.NET in a clever manner. &lt;/p&gt;

&lt;p&gt;In the example below, I'll guide you through the installation of Live Server to work seamlessly with both types of webpages (static &amp;amp; dynamic).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://marketplace.visualstudio.com/items?itemName=brapifra.phpserver" rel="noopener noreferrer"&gt;PHP Server&lt;/a&gt; and &lt;a href="https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer" rel="noopener noreferrer"&gt;Live Server&lt;/a&gt; from the Visual Studio Code Marketplace.&lt;/li&gt;
&lt;li&gt;Create a PHP file, for instance, index.php, and place it in a sub-directory (let's say 'demo') under /var/www/html/, like /var/www/html/demo/&lt;/li&gt;
&lt;li&gt;Install the &lt;a href="https://chrome.google.com/webstore/detail/live-server-web-extension/fiegdmejfepffgpnejdinekhfieaogmj/" rel="noopener noreferrer"&gt;Live Server Chrome extension&lt;/a&gt; in your Chrome browser and customize it as follows: 
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F36q4hi1mh2y5u9b74idq.png" alt="Extension Screenshot"&gt;
&lt;/li&gt;
&lt;li&gt;Click on the 'Go Live' button in the bottom right hand corner of the Visual Studio Code. 
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fimpt7dvcrqsmm92gyh3p.png" alt="VSCode Window Screenshot"&gt;
&lt;/li&gt;
&lt;li&gt;Next, open the index.php file located under /var/www/html/demo/ in Visual Studio Code. Right-click and select 'PHP Server: Reload Server', then 'PHP Server: Open file in browser'. 
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff8p1zpp7p54l1fw2wifs.png" alt="VSCode Context Menu Screenshot"&gt;
&lt;/li&gt;
&lt;li&gt;In your browser, simply open the IP address &lt;code&gt;http://localhost:3000/demo/index.php&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You should not be able to use LiveServer for both static and dynamic websites :)&lt;/p&gt;

</description>
      <category>devops</category>
      <category>vscode</category>
      <category>extensions</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>🔗 Importance of Source Code Control: A Guide to Git</title>
      <dc:creator>Stevie G</dc:creator>
      <pubDate>Wed, 04 Oct 2023 09:01:13 +0000</pubDate>
      <link>https://dev.to/itsmestevieg/importance-of-source-code-control-a-guide-to-git-26pn</link>
      <guid>https://dev.to/itsmestevieg/importance-of-source-code-control-a-guide-to-git-26pn</guid>
      <description>&lt;p&gt;As software developers, we strive to create high-quality applications that are efficient, reliable, and scalable. One of the crucial aspects of maintaining code quality and ensuring smooth collaboration within a development team is source code control. It provides a structured way to manage changes to your codebase, track revisions, and work together seamlessly. In this post, we'll explore the significance of source code control and provide a tutorial on Git, one of the most widely used version control systems.&lt;/p&gt;

&lt;p&gt;Why Source Code Control Matters&lt;br&gt;
1️⃣ Version Tracking: With source code control, you have a detailed history of all changes made to your codebase. It allows you to see who made the changes, when they were made, and what modifications were implemented. This information is invaluable for debugging, troubleshooting, and understanding the evolution of your project.&lt;/p&gt;

&lt;p&gt;2️⃣ Collaboration: Source code control systems enable effective collaboration among team members. Multiple developers can work on different features or bug fixes simultaneously without interfering with each other's work. The system tracks changes made by each individual and merges them together intelligently, resolving conflicts if necessary.&lt;/p&gt;

&lt;p&gt;3️⃣ Rollbacks and Revisions: Mistakes happen, and sometimes code changes don't work as expected. With source code control, you can easily roll back to a previous version of your code, undoing any undesirable modifications. This capability provides a safety net and allows you to experiment without the fear of irreversible damage.&lt;/p&gt;

&lt;p&gt;4️⃣ Branching and Merging: Source code control systems, such as Git, support branching, allowing developers to create separate branches for specific features, bug fixes, or experiments. This isolation helps in keeping the main codebase stable while new features are being developed. Once the changes are complete, branches can be merged back into the main codebase seamlessly.&lt;/p&gt;

&lt;p&gt;5️⃣ Team Accountability: Source code control promotes accountability within a development team. By tracking changes, it becomes easier to identify the author responsible for a specific piece of code. This accountability fosters a sense of ownership and encourages developers to write clean, maintainable code.&lt;/p&gt;

&lt;p&gt;Now that we understand the importance of source code control, let's dive into a tutorial on Git, a popular distributed version control system.&lt;/p&gt;

&lt;p&gt;Git Tutorial: Getting Started&lt;br&gt;
Git is a powerful and widely adopted version control system that offers a range of features for managing source code. Here's a step-by-step guide to help you get started:&lt;/p&gt;

&lt;p&gt;Step 1: Install Git&lt;br&gt;
Visit the official Git website (&lt;a href="https://git-scm.com/"&gt;https://git-scm.com/&lt;/a&gt;) and download the appropriate version for your operating system.&lt;br&gt;
Run the installer and follow the on-screen instructions to complete the installation.&lt;/p&gt;

&lt;p&gt;Step 2: Configure Git&lt;br&gt;
Open a terminal or command prompt and set up your name and email address using the following commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"Your Name"&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"your@email.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3: Create a New Repository&lt;br&gt;
Navigate to the directory where you want to create your repository.&lt;br&gt;
Initialize a new Git repository using the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 4: Add and Commit Changes&lt;br&gt;
Create or copy your project files into the repository directory.&lt;br&gt;
Add the files to the Git repository using the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Commit the changes with a meaningful message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Initial commit"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 5: Branching and Merging&lt;br&gt;
Create a new branch for your feature or bug fix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git branch new-feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Switch to the new branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git checkout new-feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make your changes, add, and commit them.&lt;br&gt;
Switch back to the main branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git checkout main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Merge the new-feature branch into the main branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git merge new-feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 6: Pushing and Pulling Changes&lt;br&gt;
If you're collaborating with a remote repository (e.g., on GitHub), you'll need to push your changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To retrieve and incorporate changes made by others, use the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git pull origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Advanced Git Features&lt;br&gt;
Git offers a plethora of advanced features to enhance your version control workflow. Here are a few noteworthy ones:&lt;/p&gt;

&lt;p&gt;1️⃣ Git Stash: Allows you to save changes that are not ready to be committed yet, providing a way to switch branches without committing incomplete work. Stashed changes can be reapplied later.&lt;br&gt;
Stash your changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git stash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply the stashed changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git stash apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2️⃣ Git Rebase: Enables you to modify the commit history by combining, rearranging, or deleting commits. It can help create a cleaner, more organized commit history.&lt;br&gt;
Interactively rebase commits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git rebase &lt;span class="nt"&gt;-i&lt;/span&gt; &amp;lt;commit&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Squash multiple commits into one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git rebase &lt;span class="nt"&gt;-i&lt;/span&gt; HEAD~3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3️⃣ Git Tagging: Allows you to assign meaningful tags to specific commits, such as marking releases or important milestones in your project. Tags provide a way to reference specific versions easily.&lt;br&gt;
Create an annotated tag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git tag &lt;span class="nt"&gt;-a&lt;/span&gt; v1.0 &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Release version 1.0"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;List all tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git tag
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4️⃣ Git Cherry-pick: Lets you select individual commits from one branch and apply them to another. It's useful when you need to incorporate specific changes without merging the entire branch.&lt;br&gt;
Cherry-pick a commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git cherry-pick &amp;lt;commit-hash&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5️⃣ Git Hooks: Allows you to automate tasks or run custom scripts before or after specific Git actions, such as committing, pushing, or merging. Hooks can be used to enforce coding standards, run tests, or trigger deployment processes.&lt;br&gt;
Create a pre-commit hook:&lt;br&gt;
 In the &lt;code&gt;.git/hooks&lt;/code&gt; directory, create a file named &lt;code&gt;pre-commit&lt;/code&gt; (without any file extension).&lt;br&gt;
 Add your desired script or commands to the file.&lt;br&gt;
 Make the file executable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; &lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x .git/hooks/pre-commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GUI-Based Git Management Software&lt;br&gt;
If you're not comfortable with the command line interface, there are several GUI-based Git management tools available that provide a visual interface for interacting with Git. These tools offer a more user-friendly experience and can simplify the Git workflow. Some popular GUI-based Git management software includes:&lt;/p&gt;

&lt;p&gt;1️⃣ GitKraken: A cross-platform Git client that provides a visually appealing interface for executing Git commands, visualizing branches, and simplifying complex operations like rebasing and merging.&lt;br&gt;
Website: &lt;a href="https://www.gitkraken.com/"&gt;https://www.gitkraken.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2️⃣ Sourcetree: A free Git client for Windows and macOS that offers an intuitive interface for managing repositories, visualizing commit history, and simplifying branching and merging operations.&lt;br&gt;
Website: &lt;a href="https://www.sourcetreeapp.com/"&gt;https://www.sourcetreeapp.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3️⃣ GitHub Desktop: A desktop application provided by GitHub that allows you to interact with Git repositories visually. It provides an easy way to clone repositories, commit changes, create branches, and push and pull changes.&lt;br&gt;
Website: &lt;a href="https://desktop.github.com/"&gt;https://desktop.github.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These tools provide an alternative to the command line interface and can be a great choice if you prefer a more visual and interactive way of working with Git.&lt;/p&gt;

&lt;p&gt;Remember, adopting source code control practices like Git can greatly benefit your development process, enabling efficient collaboration, version tracking, and code stability. Embrace the power of version control and take your software development endeavors to new heights!&lt;/p&gt;

</description>
      <category>happycoding</category>
      <category>versioncontrolmatters</category>
      <category>gittutorial</category>
    </item>
    <item>
      <title>VSCode Crash Course</title>
      <dc:creator>Stevie G</dc:creator>
      <pubDate>Wed, 04 Oct 2023 01:54:38 +0000</pubDate>
      <link>https://dev.to/itsmestevieg/vscode-crash-course-26di</link>
      <guid>https://dev.to/itsmestevieg/vscode-crash-course-26di</guid>
      <description>&lt;h2&gt;
  
  
  Getting VSCode
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open your Web Browser:&lt;br&gt;
Launch your preferred web browser, such as Chrome, Firefox, or Edge.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to the &lt;a href="https://code.visualstudio.com/download"&gt;Official Download Site&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Download the VSCode installer for your operating system and install it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Extensions
&lt;/h2&gt;

&lt;p&gt;Name: Auto Close Tag&lt;br&gt;
Description: Automatically add HTML/XML close tag, same as Visual Studio IDE or Sublime Text&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-close-tag"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: Auto Rename Tag&lt;br&gt;
Description: Auto rename paired HTML/XML tag&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: Better Comments&lt;br&gt;
Description: Improve your code commenting by annotating with alert, informational, TODOs, and more!&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: Bookmarks&lt;br&gt;
Description: Mark lines and jump to them&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=alefragnani.Bookmarks"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: Code Spell Checker&lt;br&gt;
Description: Spelling checker for source code&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: CodeSnap&lt;br&gt;
Description: 📷 Take beautiful screenshots of your code&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=adpyke.codesnap"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: Color Highlight&lt;br&gt;
Description: Highlight web colors in your editor&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=naumovs.color-highlight"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: CSS Peek&lt;br&gt;
Description: Allow peeking to css ID and class strings as definitions from html files to respective CSS. Allows peek and goto definition.&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=pranaygp.vscode-css-peek"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: DotENV&lt;br&gt;
Description: Support for dotenv file syntax&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=mikestead.dotenv"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: ES7+ React/Redux/React-Native snippets&lt;br&gt;
Description: Extensions for React, React-Native and Redux in JS/TS with ES7+ syntax. Customizable. Built-in integration with prettier.&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=dsznajder.es7-react-js-snippets"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: ESLint&lt;br&gt;
Description: Integrates ESLint JavaScript into VS Code.&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: GitLens — Git supercharged&lt;br&gt;
Description: Supercharge Git within VS Code — Visualize code authorship at a glance via Git blame annotations and CodeLens, seamlessly navigate and explore Git repositories, gain valuable insights via rich visualizations and powerful comparison commands, and so much more&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: Icons&lt;br&gt;
Description: Icons for Visual Studio Code.&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=tal7aouy.icons"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: indent-rainbow&lt;br&gt;
Description: Makes indentation easier to read&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: IntelliCode&lt;br&gt;
Description: AI-assisted development&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: IntelliCode API Usage Examples&lt;br&gt;
Description: See relevant code examples from GitHub for over 100K different APIs right in your editor.&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.intellicode-api-usage-examples"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: Live Server&lt;br&gt;
Description: Launch a development local Server with live reload feature for static &amp;amp; dynamic pages&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: Monokai ST3&lt;br&gt;
Description: Fork Monokai ST3 which realize syntax highlighting from ST3&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=AndreyVolosovich.monokai-st3"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: Path Intellisense&lt;br&gt;
Description: Visual Studio Code plugin that autocompletes filenames&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=christian-kohler.path-intellisense"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: PHP Debug&lt;br&gt;
Description: Debug support for PHP with Xdebug&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=xdebug.php-debug"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: PHP Intelephense&lt;br&gt;
Description: PHP code intelligence for Visual Studio Code&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=bmewburn.vscode-intelephense-client"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: Prettier - Code formatter&lt;br&gt;
Description: Code formatter using prettier&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: Prettify JSON&lt;br&gt;
Description: Visual Studio Code Prettify JSON Extension&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=mohsen1.prettify-json"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: Quokka.js&lt;br&gt;
Description: JavaScript and TypeScript playground in your editor.&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=WallabyJs.quokka-vscode"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: Remote - SSH&lt;br&gt;
Description: Open any folder on a remote machine using SSH and take advantage of VS Code's full feature set.&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: Remote - SSH: Editing Configuration Files&lt;br&gt;
Description: Edit SSH configuration files&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh-edit"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: SQLTools&lt;br&gt;
Description: Connecting users to many of the most commonly used databases. Welcome to database management done right.&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=mtxr.sqltools"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: Svg Preview&lt;br&gt;
Description: Preview for Svg files&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=SimonSiefke.svg-preview"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: Thunder Client&lt;br&gt;
Description: Lightweight Rest API Client for VS Code&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=rangav.vscode-thunder-client"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Name: Todo Highlighter&lt;br&gt;
Description: Highlights TODO keyword and lists all todos in the side bar.&lt;br&gt;
VS Marketplace Link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=zerefdev.todo-highlighter"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Shortcuts and Pro Tips
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://code.visualstudio.com/docs/getstarted/tips-and-tricks"&gt;VSCode Tips &amp;amp; Tricks&lt;/a&gt;&lt;br&gt;
&lt;a href="https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf"&gt;VSCode Shortcuts&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=ifTF3ags0XI"&gt;VIDEO - 25 VS Code Productivity Tips and Speed Hacks&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ES7 React/Redux/GraphQL/React-Native snippets in CodeSandbox</title>
      <dc:creator>Stevie G</dc:creator>
      <pubDate>Wed, 24 Feb 2021 01:05:16 +0000</pubDate>
      <link>https://dev.to/itsmestevieg/es7-react-redux-graphql-react-native-snippets-in-codesandbox-lm9</link>
      <guid>https://dev.to/itsmestevieg/es7-react-redux-graphql-react-native-snippets-in-codesandbox-lm9</guid>
      <description>&lt;p&gt;If you have ever used the ES7 React, Redux, GraphQL, React-Native snippets VSCode Extension, you've probably become so used to using the shorthand prefixes to speed up your development process.&lt;/p&gt;

&lt;p&gt;Sometimes when we want to throw something together quickly on CodeSandbox.io and then realised you don't have the ES7 React, Redux, GraphQL, React-Native snippets extension and you have to type it our manually, it slows down your entire development process.&lt;/p&gt;

&lt;p&gt;Today I will show you how to add the same functionality in your CodeSandbox workspace.&lt;/p&gt;

&lt;p&gt;Firstly we will start the process for the JavaScript version of the snippets.&lt;/p&gt;

&lt;p&gt;Open the &lt;a href="https://raw.githubusercontent.com/chillios-ts/vscode-react-javascript-snippets/master/src/snippets/generated.json" rel="noopener noreferrer"&gt;generated.json&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Copy the entire file contents of the raw &lt;code&gt;generated.json&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Now let's head over to CodeSandbox.io and &lt;strong&gt;create a SandBox so we can access our settings&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once you have created a SandBox, go to the &lt;code&gt;File&lt;/code&gt; menu, then &lt;code&gt;Preferences&lt;/code&gt;, then &lt;code&gt;User Snippets&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz9oaytsb788t6nzsvn27.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz9oaytsb788t6nzsvn27.png" alt="Screenshot 1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then select &lt;code&gt;New Global Snippet File&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxjm6q3045w9etp4s6f9j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxjm6q3045w9etp4s6f9j.png" alt="Screenshot 2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and name the file &lt;code&gt;snippets.code-snippets&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Paste the contents that you copied from the &lt;code&gt;snippets.json&lt;/code&gt; into the newly created &lt;code&gt;snippets.code-snippets&lt;/code&gt; file and Save.&lt;/p&gt;

&lt;p&gt;Congratulations! You have now brought the functionality of the ES7 React, Redux, GraphQL, React-Native snippets extension over to CodeSandbox. Go ahead and try create a new react component as you normally would.&lt;/p&gt;

&lt;p&gt;Enjoy and give me a like and follow if this helped you.&lt;/p&gt;

&lt;p&gt;Join me on &lt;a href="https://hashnode.com/@ItsMeStevieG/joinme" rel="noopener noreferrer"&gt;HashNode&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Ultimate Visual Studio Code Shortcuts Guide</title>
      <dc:creator>Stevie G</dc:creator>
      <pubDate>Thu, 07 Jan 2021 09:22:20 +0000</pubDate>
      <link>https://dev.to/itsmestevieg/vscode-shortcuts-4pl</link>
      <guid>https://dev.to/itsmestevieg/vscode-shortcuts-4pl</guid>
      <description>&lt;p&gt;&lt;strong&gt;Boost your productivity and streamline your workflow with these must-know Visual Studio Code shortcuts. Whether you're a beginner or a seasoned pro, these shortcuts will help you code faster and more efficiently.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;1. Autocomplete&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows/Mac&lt;/strong&gt;: &lt;code&gt;Tab&lt;/code&gt;
When beginning to type, hit &lt;code&gt;Tab&lt;/code&gt; to intelligently complete the displayed code.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;2. Open Command Palette&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + Shift + P&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Shift + Cmd + P&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Command Palette will quickly become your best friend as you learn various shortcuts. If you ever forget a shortcut, simply open the Command Palette and search for what you’re trying to do.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;3. Find a File&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + P&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Cmd + P&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quickly search for a specific file in the current workspace. This works really well in conjunction with the split editor. Hit &lt;code&gt;Cmd + P&lt;/code&gt; (or &lt;code&gt;Ctrl + P&lt;/code&gt; on Windows), and while continuing to hold the modifier key, keep hitting &lt;code&gt;P&lt;/code&gt; to switch between recent files.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;4. Toggle Sidebar&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + B&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Cmd + B&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Straightforward: quickly show or hide the sidebar.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;5. Toggle Panel&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + J&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Cmd + J&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quickly show or hide the bottom panel. This includes the Terminal, Output, Problems, and Debug Console.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;6. Toggle Integrated Terminal&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows/Mac&lt;/strong&gt;: &lt;code&gt;Ctrl + `&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quickly show or hide the integrated terminal panel.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;7. Highlight Next Instance&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + D&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Cmd + D&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Select the next occurrence of the current word.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;8. Highlight All Instances&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + F2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Fn + Cmd + F2&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Select all occurrences of the current word.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;9. Highlight All Occurrences of Selection&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + Shift + L&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Cmd + Shift + L&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Select all occurrences of the selected word.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;10. Select a Line&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + L&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Cmd + L&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Select an entire line of code.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;11. Comment/Uncomment a Line of Code&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows/Mac&lt;/strong&gt;: &lt;code&gt;Ctrl + /&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comment or uncomment a line of code. This has intelligent language detection and will use the correct syntax for the current language, e.g., &lt;code&gt;&amp;lt;!-- --&amp;gt;&lt;/code&gt; in HTML.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;12. Move by Word&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + Left/Right Arrow Key&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Option + Left/Right Arrow Key&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Move by word using the left or right arrows while holding the modifier key.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;13. Navigate Around Files&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + Up/Down/Left/Right Arrow Key&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Cmd + Up/Down/Left/Right Arrow Key&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Move to the top, bottom, left, or right extreme of the current file or code faster by holding the modifier key and using arrow keys.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;14. Split Editor&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + \&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Cmd + \&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Split the current editor into two panes to view or edit files side by side.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;15. Switch Between Tabs&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + Tab&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Cmd + Tab&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quickly switch between open tabs in the editor.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;16. Close Editor&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + W&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Cmd + W&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Close the current editor tab.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;17. Open Settings&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + ,&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Cmd + ,&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open the settings menu to tweak your VSCode configuration.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;18. Open Keyboard Shortcuts&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + K, Ctrl + S&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Cmd + K, Cmd + S&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;View and customise all the shortcuts available in VSCode.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;19. Duplicate a Line&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Shift + Alt + Down/Up Arrow&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Shift + Option + Down/Up Arrow&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Duplicate the current line or selection either above or below.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;20. Delete a Line&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + Shift + K&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Cmd + Shift + K&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Delete the current line without needing to select it.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;21. Move a Line Up or Down&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Alt + Up/Down Arrow&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Option + Up/Down Arrow&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Move the current line (or selection) up or down in the editor.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;22. Peek Definition&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Alt + F12&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Option + F12&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;View the definition of a method, variable, or function in a small popup without leaving the current file.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;23. Go to Definition&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;F12&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;F12&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jump directly to the definition of a method, variable, or function in your project.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;24. Rename Symbol&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;F2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;F2&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rename all instances of a variable, method, or class in the workspace.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;25. Format Document&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Shift + Alt + F&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Shift + Option + F&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Automatically format your code using the language formatter.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;26. Quick Fix&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + .&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Cmd + .&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Show available fixes or code suggestions for the current issue (e.g., linting errors).&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;27. Toggle Zen Mode&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + K Z&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Cmd + K Z&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Focus on your code by hiding all distractions like the sidebar, status bar, and activity bar.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;28. Open Recent Workspace&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + R&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Cmd + R&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quickly open recently accessed folders or workspaces.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;29. Collapse All Folders&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + K Ctrl + 0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Cmd + K Cmd + 0&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Collapse all folders in the Explorer view.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;30. Expand All Folders&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;Ctrl + K Ctrl + J&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac&lt;/strong&gt;: &lt;code&gt;Cmd + K Cmd + J&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Expand all folders in the Explorer view.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;If you’ve found any other shortcuts that have saved you time and effort, let me know in the comments below! Sharing is caring, and we all love a good productivity hack.&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>ide</category>
      <category>shortcuts</category>
      <category>keyboard</category>
    </item>
    <item>
      <title>LeafletJS Capture GeoJSON &amp; WKT (SQL Spatial Format)</title>
      <dc:creator>Stevie G</dc:creator>
      <pubDate>Tue, 21 Jan 2020 05:07:11 +0000</pubDate>
      <link>https://dev.to/itsmestevieg/leafletjs-capture-geojson-wkt-sql-spatial-format-12lb</link>
      <guid>https://dev.to/itsmestevieg/leafletjs-capture-geojson-wkt-sql-spatial-format-12lb</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftyzs4sh1mhejsrjzzksp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftyzs4sh1mhejsrjzzksp.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Start a basic HTML template&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Leaflet WKT Example&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Include Leaflet CSS file in the head section of your document:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.6.0/leaflet.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Include Leaflet Draw CSS file in the head section of your document:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Include Leaflet JavaScript file after Leaflet’s CSS (before the closing &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt; tag):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.6.0/leaflet.js'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Include Leaflet Draw JavaScript file after Leaflet’s CSS (before the closing &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt; tag):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;'https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.js'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Include Leaflet Editable JavaScript file after Leaflet’s CSS (before the closing &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt; tag):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;'https://cdn.jsdelivr.net/gh/Leaflet/Leaflet.Editable@1.2.0/src/Leaflet.Editable.js'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Include OpenLayers JavaScript file after Leaflet’s CSS (before the closing &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt; tag):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;'https://openlayers.org/api/OpenLayers.js'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Put a div element with the id &lt;code&gt;map&lt;/code&gt; where you want your map to be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"map"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure the map container has a defined height, for example by setting it in CSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nf"&gt;#map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you’re ready to initialize the map and do some stuff with it.&lt;/p&gt;

&lt;p&gt;Lets start by setting up the BaseMap services. See (&lt;a href="https://leafletjs.com/reference-1.5.0.html#map" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;) for more info:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Init Overlays&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;overlays&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;

&lt;span class="c1"&gt;//Init BaseMaps&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;basemaps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;OpenStreetMaps&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;L&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tileLayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;minZoom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;maxZoom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;osm.streets&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Google-Map&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;L&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tileLayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://mt1.google.com/vt/lyrs=r&amp;amp;x={x}&amp;amp;y={y}&amp;amp;z={z}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;minZoom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;maxZoom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;google.street&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Google-Satellite&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;L&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tileLayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://mt1.google.com/vt/lyrs=s&amp;amp;x={x}&amp;amp;y={y}&amp;amp;z={z}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;minZoom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;maxZoom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;google.satellite&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Google-Hybrid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;L&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tileLayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://mt1.google.com/vt/lyrs=y&amp;amp;x={x}&amp;amp;y={y}&amp;amp;z={z}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;minZoom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;maxZoom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;google.hybrid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next we setup the map options such as center and zoom.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Map Options&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;mapOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;zoomControl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;attributionControl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;center&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;29.0529434318608&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;152.01910972595218&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;zoom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;layers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;basemaps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OpenStreetMaps&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally we can initialise the map&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Render Main Map&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;L&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;map&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mapOptions&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Initialise Layer Control and add it to the Map:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;layerControl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;L&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;control&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;layers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;basemaps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;overlays&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;addTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Initialise an editable layer and add it to the Map:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;editableLayers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;L&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;FeatureGroup&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addLayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;editableLayers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Initialise the Leaflet Draw Control and add it to the Map:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;drawControl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;L&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Control&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Draw&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;topright&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;polyline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;polygon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;allowIntersection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Restricts shapes to simple polygons &lt;/span&gt;
      &lt;span class="na"&gt;drawError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#e1e100&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Color the shape will turn when intersects &lt;/span&gt;
        &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;strong&amp;gt;Oh snap!&amp;lt;strong&amp;gt; you can&lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="s1"&gt;t draw that!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// Message that will show when intersect &lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;circle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Turns off this drawing tool &lt;/span&gt;
    &lt;span class="na"&gt;rectangle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;marker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;edit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;featureGroup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;editableLayers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;//REQUIRED!! &lt;/span&gt;
    &lt;span class="na"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addControl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;drawControl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setup listeners for Leaflet Draw:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//On Draw Create Event&lt;/span&gt;
&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;L&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Draw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CREATED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;layerType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;layer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;layer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;marker&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;layer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bindPopup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LatLng: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;layer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLatLng&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;lat&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;layer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLatLng&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;lng&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;openPopup&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;editableLayers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addLayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;layer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;layerGeoJSON&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;editableLayers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toGeoJSON&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GEOJSON FORMAT&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;layerGeoJSON&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;wkt_options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;geojson_format&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;OpenLayers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GeoJSON&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;testFeature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;geojson_format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;layerGeoJSON&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;wkt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;OpenLayers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;WKT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wkt_options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;wkt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testFeature&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;WKT FORMAT&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;//On Draw Edit Event&lt;/span&gt;
&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;L&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Draw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EDITED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;layerType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;layer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;layer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;layerGeoJSON&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;editableLayers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toGeoJSON&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GEOJSON FORMAT&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;layerGeoJSON&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;wkt_options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;geojson_format&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;OpenLayers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GeoJSON&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;testFeature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;geojson_format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;layerGeoJSON&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;wkt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;OpenLayers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;WKT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wkt_options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;wkt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testFeature&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;WKT FORMAT&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;//On Draw Delete Event&lt;/span&gt;
&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;L&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Draw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DELETED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;layerType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;layer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;layer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;layerGeoJSON&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;editableLayers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toGeoJSON&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GEOJSON FORMAT&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;layerGeoJSON&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;wkt_options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;geojson_format&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;OpenLayers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GeoJSON&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;testFeature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;geojson_format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;layerGeoJSON&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;wkt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;OpenLayers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;WKT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wkt_options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;wkt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testFeature&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;WKT FORMAT&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See it in action on CodePen &lt;iframe height="600" src="https://codepen.io/ItsMeStevieG/embed/jOEQRjj?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Join me on &lt;a href="https://hashnode.com/@ItsMeStevieG/joinme" rel="noopener noreferrer"&gt;HashNode&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>leaflet</category>
      <category>map</category>
    </item>
  </channel>
</rss>
