<?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: Kofi Owusu-Afriyie</title>
    <description>The latest articles on DEV Community by Kofi Owusu-Afriyie (@projectair).</description>
    <link>https://dev.to/projectair</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%2F77369%2F3d0b50ee-6d98-4859-aadd-cc36ea71c2ad.png</url>
      <title>DEV Community: Kofi Owusu-Afriyie</title>
      <link>https://dev.to/projectair</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/projectair"/>
    <language>en</language>
    <item>
      <title>Building a Social Platform</title>
      <dc:creator>Kofi Owusu-Afriyie</dc:creator>
      <pubDate>Sun, 26 Nov 2023 21:00:37 +0000</pubDate>
      <link>https://dev.to/projectair/building-a-social-platform-61a</link>
      <guid>https://dev.to/projectair/building-a-social-platform-61a</guid>
      <description>&lt;p&gt;Social Platform (Connect)  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Signing up with Google Bug Fixed. &lt;/li&gt;
&lt;li&gt;Uploading Images when posting Bug Fixed. &lt;/li&gt;
&lt;li&gt;Creating &amp;amp; Joining a community bug fixed.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Join Connect via &lt;a href="https://connect.aiira.co"&gt;https://connect.aiira.co&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Credit: Image is copyrighted to Sacha Goedegebure talk from #BCON23&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4bxXzcX---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/520fumlon3nlm9rtbb3p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4bxXzcX---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/520fumlon3nlm9rtbb3p.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>metaverse</category>
      <category>social</category>
      <category>angular</category>
    </item>
    <item>
      <title>Building a Web Game Engine: Controls</title>
      <dc:creator>Kofi Owusu-Afriyie</dc:creator>
      <pubDate>Sun, 26 Nov 2023 20:53:42 +0000</pubDate>
      <link>https://dev.to/projectair/building-a-web-game-engine-controls-38lp</link>
      <guid>https://dev.to/projectair/building-a-web-game-engine-controls-38lp</guid>
      <description>&lt;p&gt;Devlog Web Game Engine with threejs and rapierjs using Angular &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Camera Movement (WASD/Arrows), Pan, Zoom &amp;amp; Orbit Changed &lt;/li&gt;
&lt;li&gt;Added Undo/Redo to Viewport Editor for Scene &lt;/li&gt;
&lt;li&gt;Added Building System (Pick/Place/Deselect/Delete Object) &lt;/li&gt;
&lt;li&gt;Modeling Build Assets - floors/walls &lt;/li&gt;
&lt;li&gt;--plenty errors to fix--&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Camera Control
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Orbit - middle mouse or Q &amp;amp; E&lt;/li&gt;
&lt;li&gt;Zoom- ctrl + middle mouse  or scroll mouse wheel&lt;/li&gt;
&lt;li&gt;Pan - shift + middle mouse  or WASD or ArrowKeys&lt;/li&gt;
&lt;li&gt;Reset Camera To Origin - F2&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Object In Scene
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Pick Object- shift + left mouse&lt;/li&gt;
&lt;li&gt;Place picked Object - left mouse&lt;/li&gt;
&lt;li&gt;Deselect Picked Object /  Reset Grid -  right mouse&lt;/li&gt;
&lt;li&gt;Delete -  shift + right mouse&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Picked Mode
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Move Grid  - ctrl +mouse-move&lt;/li&gt;
&lt;li&gt;Set Origin to Object - Double Right Click&lt;/li&gt;
&lt;li&gt;Undo/Redo - Ctrl + Z/ Ctrl + Y&lt;/li&gt;
&lt;li&gt;when object is picked, you can move the grid up/down while holding control.&lt;/li&gt;
&lt;li&gt;you can also rotate picked object to face your mouse direction when holding Alt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://play.aiira.co"&gt;https://play.aiira.co&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qp6BUh96--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jkp0gd3hazcei4e6s7sg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qp6BUh96--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jkp0gd3hazcei4e6s7sg.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sXrYUxR2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ist6bddtaaqb6xekzjge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sXrYUxR2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ist6bddtaaqb6xekzjge.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--y36uYHEV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m29otttk1xmwntkmub00.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--y36uYHEV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m29otttk1xmwntkmub00.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>metaverse</category>
      <category>threejs</category>
      <category>angular</category>
      <category>rapierjs</category>
    </item>
    <item>
      <title>PHP8 API Controller with Attributes</title>
      <dc:creator>Kofi Owusu-Afriyie</dc:creator>
      <pubDate>Wed, 25 Nov 2020 12:32:56 +0000</pubDate>
      <link>https://dev.to/projectair/php8-api-controller-with-attributes-3mc8</link>
      <guid>https://dev.to/projectair/php8-api-controller-with-attributes-3mc8</guid>
      <description>&lt;p&gt;Updated my API framework to work with PHP8 attributes &amp;amp; working on swoole integration out of the box with docker. Heavily inspired by dotnet core web api&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OHVcDPJj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mjmo8p03k5rr42vfsgw1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OHVcDPJj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mjmo8p03k5rr42vfsgw1.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vZs8Xb43--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7io28fauz3ifj6r9nnc7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vZs8Xb43--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7io28fauz3ifj6r9nnc7.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XdOHzz_d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8h8dhggp50zw2gpsm4zu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XdOHzz_d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8h8dhggp50zw2gpsm4zu.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B0jnjWdS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/op5372yjbtg9lsxm3ord.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B0jnjWdS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/op5372yjbtg9lsxm3ord.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php8</category>
      <category>php</category>
    </item>
    <item>
      <title>The new !dea PHP++ for 8 and above</title>
      <dc:creator>Kofi Owusu-Afriyie</dc:creator>
      <pubDate>Sat, 10 Aug 2019 17:53:40 +0000</pubDate>
      <link>https://dev.to/projectair/the-new-dea-php-for-8-and-above-2i5p</link>
      <guid>https://dev.to/projectair/the-new-dea-php-for-8-and-above-2i5p</guid>
      <description>&lt;p&gt;What do you think about PHP and its progress?  Should PHP be forked? PHP still has many inconsistencies such as weird function names, weird returns, APIs, strict types need to be explicitly enabled, short tags from PHP 1 era, and similar legacy functionality. At the same time to fix this, major BC (backward compatibility) breaks should be done, which would break a lot of code out there. &lt;br&gt;
Recently, a brand new idea came to be, to fork PHP as we know it and develop it in two ways:&lt;br&gt;
PHP (as we know it and with all the legacy things in it)&lt;br&gt;
PHP++ -&amp;gt; P++ (modern, completely consistent).&lt;br&gt;
&lt;a href="https://wiki.php.net/pplusplus/faq"&gt;https://wiki.php.net/pplusplus/faq&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php8</category>
      <category>codequality</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>CQured PHP 2019</title>
      <dc:creator>Kofi Owusu-Afriyie</dc:creator>
      <pubDate>Tue, 15 Jan 2019 14:38:19 +0000</pubDate>
      <link>https://dev.to/projectair/cqured-php-2019-4lpb</link>
      <guid>https://dev.to/projectair/cqured-php-2019-4lpb</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hZMmJNSg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2oof8beebcmnkao8taic.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hZMmJNSg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2oof8beebcmnkao8taic.JPG"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  CQured 3.0alpha -&amp;gt; Onion Architecture for multi-api framework
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://github.com/air-Design/cqured/tree/3.0.0"&gt;https://github.com/air-Design/cqured/tree/3.0.0&lt;/a&gt;&lt;br&gt;
@CQured web-api for presentation(Api)&lt;br&gt;
@doctrine for DB&lt;br&gt;
@lcobucci JWT for Auth.&lt;br&gt;
@GuzzlePSR7&lt;br&gt;
Had some issues with #Doctrine Config since it was my first time. but it look good&lt;/p&gt;

</description>
      <category>php</category>
      <category>api</category>
      <category>framework</category>
    </item>
    <item>
      <title>Query your SQL database in the cqured way with ease</title>
      <dc:creator>Kofi Owusu-Afriyie</dc:creator>
      <pubDate>Sun, 01 Jul 2018 16:07:15 +0000</pubDate>
      <link>https://dev.to/projectair/query-your-sql-database-in-the-cqured-way-with-ease-c02</link>
      <guid>https://dev.to/projectair/query-your-sql-database-in-the-cqured-way-with-ease-c02</guid>
      <description>&lt;p&gt;Include EntityModel.php to your PHP file and use the namespace Lynq\Entity\EntityModel;&lt;/p&gt;

&lt;p&gt;You can also remove the namepsace from the EntityModel.php and you are good to go.&lt;br&gt;
Example&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="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Lynq\Entity\EntityModel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PracticeModel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Media'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cd"&gt;/**
* Connect to database in constructor
*/&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="nv"&gt;$dsn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'mysql:dbname=airMediaDB;host=127.0.0.1'&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="s1"&gt;'root'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'glory'&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;mediaDB&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;EntityModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$dsn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$password&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cd"&gt;/**
* Get ALL items via search $key
*/&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;getItems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$key&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;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;mediaDB&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;table&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;table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'title'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'LIKE'&lt;/span&gt;&lt;span class="p"&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;$key&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s1"&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="nf"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&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;a href="https://gitlab.com/snippets/1728351"&gt;https://gitlab.com/snippets/1728351&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php7</category>
      <category>entitymodel</category>
      <category>lynq</category>
    </item>
  </channel>
</rss>
