Feed aggregator

Gilles Mergoil: Laravel 4 on Google AppEngine for PHP

PHPDeveloper.org - Wed, 19/06/2013 - 19:35

Since Google recently announced that they'd be supporting PHP on their App Engine service, developers have been trying out various setups to see how well they'd work. In this recent post Gilles Mergoil shares some of his experience with getting a Laravel 4-based application up and running in App Engine.

Now that Google App Engine opens to the PHP world and that the 4th version of the Laravel framework is officialy launched, we wanted to test these two promising technologies together at Neoxia. This blog post is the result of our tests whose goal was to have a standard Laravel 4 application on the Google App Engine PHP runtime up and running Given that an application without a database is not very useful, we also tested the Google Cloud SQL service which is the Google flavour of the MySQL database in the cloud.

He works through some of the steps for his first attempt at getting it set up, but notes that the seemingly working setup wasn't actually cooperating like it should. Thanks to some log analysis (and debugging) he found a few issues - missing functions, the lack of the mcrypt extension and session/cache/logging problems. He shows how to correct each of these and then moves on to connecting the app to a Google Cloud SQL database.

Link: http://blog.neoxia.com/laravel-4-on-google-appengine-for-php

Aleksey Korzun: Benchmarking Memcached and Redis Clients

PHPDeveloper.org - Wed, 19/06/2013 - 18:06

Aleksey Korzun has posted some of the results from benchmarking he performed on various Memcached and Redis clients through PHP. His tests focused on multiple PHP client libraries, both user-land and extension based.

As some of you may know, I'm crazy about speed. So when I saw that people were happily using Predis as their choice of PHP client for Redis, I was a bit confused. Why use a client written in PHP for something that should be 'fast' like Redis? That kind of defeats the purpose - unless you don't really care about response times and scalability. [...] The performance difference piqued my interest. I wanted to find out just how much performance users are sacrificing by choosing one implementation over another.

He ran his tests on VirtualBox VM instances with the same specs and the same version of PHP installed. He tested various versions of the Memcached client, Redis client, Predis and the IgBinary extension. His results (Google spreadsheet) show the requests processed using each method based on this benchmarking script.You can visit the post to see the graphs of the results too.

Link: http://alekseykorzun.com/post/53283070010/benchmarking-memcached-and-redis-clients

Community News: PHP-FIG Proposal - Resource Location

PHPDeveloper.org - Wed, 19/06/2013 - 17:55

A new proposal has been made to the PHP-FIG group that would provide resource locator functionality as a standard part of an application's structure.

This specification proposes to refer to files and directories through URIs. [...] These URIs can have different schemes ("classpath", "file" etc.), but only the scheme "file" is specified in this document. The resource locator is able to turn URIs into file paths which can be read or included by PHP code. The general goal of this PSR is to locate files (PHP, XML, YAML, INI, JPG, etc.) and directories in a generic way. For example, there should be a unified notation to refer to the file of a class ABCD and other files located in the same directory (or nested directories).

Code snippets are included showing a pseudo-code interface to this locator with five requirements:

  • Locate files relative to classes
  • Locate both directories and files
  • Short identifiers when the context is known
  • Locate resources independent from PHP classes
  • Support resource overriding

There's also some definition as to what is meant by a "resource location" and how the URIs should be structured and located.

Link: https://github.com/bschussek/fig-standards/blob/master/proposed/resource-location.md

Rob Allen: Caching your ZF2 merged configuration

PHPDeveloper.org - Wed, 19/06/2013 - 16:43

Rob Allen has a a new post to his site today showing how you can cache the merged settings from all of your configuration files combined in a Zend Framework v2 application.

Zend Framework 2's ModuleManager has the ability to cache the merged configuration information for your application. This is very useful as it allows you to separate out your configuration within the config/autoload directory into logical files without worrying about the performance implications of lots of files.

There's some ZF2 configuration options that tell it to cache this data once it's loaded the first time, but he notes one issue with this - caching in development. It can be annoying when you make a change and nothing happens because it's cached. To prevent this he shows you how to only cache if the application is marked as in production (based on the "APPLICATION_ENV"). Separate main configuration files are made for each environment, one that caches and one (for dev) that doesn't.

Link: http://akrabat.com/zend-framework-2/caching-your-zf2-merged-configuration

Community News: Packagist Latest Releases for 06.19.2013

PHPDeveloper.org - Wed, 19/06/2013 - 15:08
Recent releases from the Packagist:

Community News: Latest Releases from PHPClasses.org

PHPDeveloper.org - Wed, 19/06/2013 - 14:05

PHPMaster.com: Data Structures for PHP Devs: Stacks and Queues

PHPDeveloper.org - Tue, 18/06/2013 - 18:42

On PHPMaster.com today there's a new tutorial - the first part in a series - looking at data structures. In this first post Ignatius Teo looks at the concepts of "stacks" and "queues".

Most of us are familiar with "stacks" and "queues" in normal everyday usage. But, what do supermarket queues and vending machines have to do with data structures? Let's find out. In this article, I will introduce you to two basic abstract data types - the Stack and the Queue - which have their conceptual origins in everyday usage.

He introduces some of the common concepts behind these two ideas and includes some sample code showing how to implement them. He also mentions some of the SPL functionality that's bult into PHP to handle some of this. The SplStack and SplQueue objects take some of the hassle out of it for you.

Link: http://phpmaster.com/php-data-structures-1

Hear, hear

Planet-PHP - Tue, 18/06/2013 - 18:26
I was about to write "in early February" but actually it already was in late January that I stumbled over this tweet:
I'm still ready & willing to hire a #PHP internals coder to work on PHP fulltime. Amazing place to work: http://t.co/GX4wtPSc
— Don MacAskill (@DonMacAskill) January 18, 2013<script async="" charset="utf-8" src="//platform.twitter.com/widgets.js">
Fast-forward five months – now I am very excited to be able to announce that the Awesomes over at SmugMug, Inc. have hired me to work full-time on the core of PHP.

Hide bugs.php.net, expect massive amounts of commits, sleep well. Thank you for reading the simple words of the proudest man alive. Thank you SmugMug!

Categories: Open Source, PHP Community

Alessandro Nadalin: Integrating Twig in Your Legacy PHP Code

PHPDeveloper.org - Tue, 18/06/2013 - 17:19

Alessandro Nadalin has posted a two part series to his site to help you get the Twig templating tool integrated with your legacy codebase.

It might happen that you are working on a legacy code that is years old, with its own templating mechanism1 that doesn't really allow you to take advantage of the benefits that a structured and object-oriented engine like Twig. In this situations, when a complete replacement would cost too much to your organization, you can take advantage of a wild integration between this advanced template engine and your existing code.

In the first part of the series, he proposes integrating it at the base level, essentially wrapping the "render" method of your framework of choice. In the second part of the series, though, he comes back with a "less wild" approach that also lets you take advantage of some of the other features twig has to offer. He modifies the previous example to output a template file and reuse that in the Twig "render" call.

Link: http://odino.org/integrating-twig-in-your-legacy-php-code

Fabien Potencier: Packing a Symfony full-stack Framework Application in one File - Bootstrapping

PHPDeveloper.org - Tue, 18/06/2013 - 16:06

Fabien Potencier has posted the second part of his "packing a Symfony app in one file" series with this look at the bootstrapping of the application. You can find the start of the series (including his intentions) in part one.

The most common way to create a Symfony project is to start with the Symfony Standard Edition: it defines a sensible directory structure for your project and it make things a lot easier when someone want to take over an existing project as he knows where the templates, the controllers, or the configuration are stored.

This part of the series looks at some of the configurations and settings you'll need to get the application up and working in a minimal way. This includes moving everything into one YAML configuration file including routing information. He shows how some bundles, bootstrap code and things to remove from the composer config.

Link: http://fabien.potencier.org/article/70/packing-a-symfony-full-stack-framework-application-in-one-file-bootstrapping

Community News: Packagist Latest Releases for 06.18.2013

PHPDeveloper.org - Tue, 18/06/2013 - 15:01
Recent releases from the Packagist:
  • sabre/dav (1.8.6, 1.7.8, 1.6.10) WebDAV Framework for PHP

  • sabre/vobject (2.1.0, 3.0.0-beta3) The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects

  • hautelook/gearman-bundle (0.5.2, 0.5.1) Symfony2 Bundle that provides a service to submit Gearman jobs

  • levare/modules (1.1.3) A Module Manager for Laravel 4

  • intouch/laravel-newrelic (1.0.3) Laravel 4 NewRelic Integration

  • ruckusing/ruckusing-migrations (0.1.2) Framework for generating and managing database migrations

  • michalsvec/nette-opauth (v0.4.1, v0.4) Opauth extension for Nette framework

  • n98/magerun (1.70.0) Tools for managing Magento projects and installations

  • jlogsdon/cli (v0.9.4) Console utilities for PHP

  • fillup/zfauthsaml (0.1) ZendAuthentication SAML adapter. Uses existing simpleSAMLphp install.

  • payment/saferpay (2.0) Saferpay payment service library

  • loic-sharma/profiler (v1.1.2) A PHP 5.3 profiler based off of Laravel 3's Anbu.

  • propel/propel-bundle (1.2.6) Integration of Propel in Symfony2

  • kmd/logviewer (0.1.7) Laravel 4 log file viewer.

  • wikibase/data-model (0.4) PHP implementation of the Wikibase DataModel

  • kunstmaan/voting-bundle (v2.2.8) A lot of sites enable users to vote or participate in actions where Facebook Likes are counted and rewarded. The KunstmaanVotingBundle was created to allow a faster setup of that kind of actions and will provide a backlog of votes your users casted. That way you can look for irregularities and automatically stop campains when their deadline has expired. It will provice support for votes on your site only but also for external social networks as Facebook so you can worry about you ideas and not how to implement it.

  • kunstmaan/utilities-bundle (v2.2.8) The KunstmaanUtilitiesBundle makes your life easier by providing a couple of small but usefull helper services you can use and re-use in your applications. We already implemented an easy to use cipher service and a shell helper service for you but feel free to send in a pull request with your additions. The shell helper allows you to run apps in the background, see if a process is running and has a method to kill a running process. The cipher service allow you to encode and decode strings using the Rijndael 256 cipher

  • kunstmaan/tagging-bundle (v2.2.8) Uses FabienPennequin/DoctrineExtensions-Taggable to add tagging to the Kunstmaan bundles

  • kunstmaan/sitemap-bundle (v2.2.8) A sitemap bundle to generate a sitemap for your Kunstmaan bundles website based on its Nodes

  • kunstmaan/seo-bundle (v2.2.8) Annotating content with metadata for social sharing and seo purposes cannot be overlooked nowadays. The KunstmaanSeoBundle contains default editing functionality for OpenGraph data, meta descriptions, keywords and titles and Metriweb tags. Because the metatagging and tracking options are always changing, a free field to add custom header information is provided as well.

  • hampel/twitter (0.1.0) Wrapper for Twitter API using Guzzle

  • kunstmaan/search-bundle (v2.2.8) The KunstmaanSearchBundle

  • kunstmaan/pagepart-bundle (v2.2.8) The KunstmaanPagePartBundle forms the basis of our content management framework. A page built using a composition of blocks names pageparts. These pageparts allow you to fully separate the data from the presentation so non-technical webmasters can manage the website. Every page can have it's own list of possible pageparts, and pageparts are easy to create for your specific project to allow for rapid development.

  • kunstmaan/node-search-bundle (v2.2.8) The KunstmaanNodeSearchBundle

  • kunstmaan/node-bundle (v2.2.8) All websites need pages(we call them nodes) but you probably don't want to spend too much time building them. Plus they should look pretty and contain the right content and that takes time. We make sure you have to spend less time managing your pages but still offer you flexibility so you can focus on more important tasks and don't have to worry about it.

  • kunstmaan/media-bundle (v2.2.8) To build your perfect website you probably need images, video's or maybe even a presentation too. The Kunstmaan Media Bundle handles all those media assets and centralizes them so you can find your content just the way you like it: fast and efficiently. No central asset management module is useful without some pretty advanced image editing functionality. To provide this we have integrated the Aviary image editing service right from the interface.

  • kunstmaan/generator-bundle (v2.2.8) If you're like us, you like to build applications without having to do the same things over and over again and dislike copy/pasting code and change a couple of words every time you need feature X. The KunstmaanGeneratorBundle gives you the possibility to generate code for new bundles, adminlists and can even make you a basic default website. That way you don't have to wait too long before you see some results and you have more time to do other things. Easy no?

  • kunstmaan/form-bundle (v2.2.8) Managing forms, fields and their submissions by the user is a key functionality missing in most platforms. By leveraging the KunstmaanPagePartBundle system in the KunstmaanFormBundle users gain an easy way to create and manage the form on their website, again without having to worry about the technical side of things.

  • kunstmaan/behat-bundle (v2.2.8) Extends the MinkContext and adds some additional (sub)contexts like creating a screenshot when a step fails or wait for Ajax to finish before continuing assertPageContainsText()

  • kunstmaan/article-bundle (v2.2.8) Add articles to your website. Use the KunstmaanGeneratorBundle to generate a new Overview/Detail article section for your website

  • kunstmaan/adminlist-bundle (v2.2.8) Every website contains several lists of content ranging from articles on a blog, to drop down values. The KunstlaanAdminListBundles takes CRUD a step further by supplying filtering, exports to csv and editing capabilities to these content entities.

  • kunstmaan/admin-bundle (v2.2.8) The Kunstmaan Admin bundle supplies your project with a basic, elegant backend interface you can modify and extend so you can make your perfect admin module. The clean interface makes it straightforward for you and the people working with it to change settings and modify content.

  • swiftmailer/swiftmailer (v5.0.1) Swiftmailer, free feature-rich PHP mailer

  • xiphe/thedebug (v4.1.0) Multiple Handy debugging methods.

  • jonnybarnes/dumbquotes (v0.5.1, v0.5, v0.4, v0.3) Pugre all the dumb quotes!

  • amldigital/twitterfeed (0.0.1) A quick and easy way to deploy a twitter feed on a website.

  • turnaev/dev-generator-tool-bundle (v1.0.6) Console tool bundle for Symfony 2.2+

  • sammaye/mongoyii (1.2.8) A Yii MongoDB ORM

  • leaseweb/api-caller-bundle (v1.0.2) cURL API call functionality with full Web Debug Toolbar integration

  • pugx/autocompleter-bundle (v3.0.0) Add an autocomplete type to forms

  • imt/data-grid-bundle (0.9.0) This bundle provides a simple integration of the IMTDataGrid library

  • adfab/cms (0.1.2) CMS features for all AdFab ZF2 dev

  • adfab/game (0.2.8, 0.2.7) The Game module !

  • sunspikes/php-amadeus (v0.1) Amadeus flight booking library for PHP

Community News: Latest PECL Releases for 06.18.2013

PHPDeveloper.org - Tue, 18/06/2013 - 14:06
Latest PECL Releases:
  • PDO_INFORMIX 1.3.1 Fixed: Segmentation fault while fetching null value for Integer Field in specific case

  • riak 0.4.2 package.xml is hard but it should work now

  • riak 0.4.0 First PECL release

  • riak 0.4.1 Remember to include all files in package.xml

  • BLENC 1.1.2b New package.xml description, BLENC now display version in phpinfo.

  • jsonc 1.3.1 - windows build support (thanks to weltling) - build as json.so or jsonc.so (--with-jsonc option) - rename LIBJSON_VERSION to HAVE_LIBJSON (internal only) - parse 64 bits integer as float, or string, on 32 bits build

  • PDO_CUBRID 9.1.0.0002 Fixed bugs: 1) APIS-546: The PDO driver does not support for the connection between the PDO and CUBRID shard broker. 2) APIS-550: The PDO driver does not support prepare and query function in CUBRID shard db.

  • CUBRID 9.1.0.0003 Fixed bugs: 1) APIS-548: The PHP driver does not support non-prepared statement for CUBRID shard database. 2) APIS-546: The PDO driver does not support for the connection between the PDO and CUBRID shard broker. 3) APIS-550: The PDO driver does not support prepare and query function in CUBRID shard db. 4) APIS-551: The PHP driver does not support shard_key sql hint in CUBRID shard db.

Packing a Symfony full-stack Framework Application in one File -- Bootstrapping

Planet-PHP - Tue, 18/06/2013 - 10:30

This article is part of a series of articles that explains how to pack a Symfony full-stack application in one file. The first article explains why this might actually be useful: 1) Introduction, 2) Bootstrapping, ...

The most common way to create a Symfony project is to start with the Symfony Standard Edition: it defines a sensible directory structure for your project and it make things a lot easier when someone want to take over an existing project as he knows where the templates, the controllers, or the configuration are stored. So, let's start our journey with the Symfony Standard Edition:

$ composer.phar create-project -n symfony/framework-standard-edition se/ 2.3.0

From there, let's remove a bunch of code to get the bare minimum of code needed to keep it working:

rm -rf LICENSE README.md UPGRADE* bin/ app/SymfonyRequirements.php \
       app/autoload.php app/bootstrap.php.cache app/AppCache.php app/check.php \
       app/console app/phpunit.xml.dist app/Resources src/ web/config.php \
       web/favicon.ico web/robots.txt web/apple-touch-icon.png web/app.php web/bundles/ \
       app/cache/* app/log/* .travis.yml app/.htaccess web/.htaccess
 

I've removed all those files and directories because there are not needed for the purpose of our challenge.

Next, let's simplify the configuration and move everything into just one file:

# app/config/config_dev.yml
framework:
    secret:          $ecret
    router:
        resource: "%kernel.root_dir%/config/routing_dev.yml"
    form:            ~
    csrf_protection: ~
    validation:      { enable_annotations: true }
    templating:
        engines: ['twig']
    session:         ~
    fragments:       ~
 

The routing_dev.yml file has been emptied for now, and all other configuration files have been removed.

We can also remove most of the bundles from the application kernel class:

use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;
 
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        return array(
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
            new Symfony\Bundle\TwigBundle\TwigBundle(),
        );
    }
 
    public function registerContainerConfiguration(LoaderInterface $loader)
    {
        $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
    }
}
 

We can also simplify the web/app_dev.php code:

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Debug\Debug;
 
require_once __DIR__.'/../vendor/autoload.php';
Debug::enable();
 
require_once __DIR__.'/../app/AppKernel.php';
 
$kernel = new AppKernel('dev', true);
$request = Request::

Truncated by Planet PHP, read more at the original (another 2876 bytes)

Categories: Open Source, PHP Community

MySQL Cluster 7.3 Enables Faster and Simpler Development of New Web and Mobile Services

MySQL.com - Tue, 18/06/2013 - 02:59
With the accelerated pace of innovation in Web, cloud, social and mobile services, the new GA release of MySQL Cluster 7.3 makes it simpler and faster than ever for developers to enrich their applications with a highly available and scalable, fault tolerant, real-time database.
Categories: PHP Community

Small catch up

Planet-PHP - Mon, 17/06/2013 - 23:17

So… I didn’t write much since April.  I took a bit of time off and went to Russia (some pics here - more to come later), and have been finishing up some contracts in May/June, and am now looking for the next thing to sink my teeth in to, so to speak (ping me if you’ve got an interesting project you think I might be a fit for).

We’ve got an interesting talk on PHP’s Composer project slated for our next PHP user group in Raleigh with our very own Jason Grimes - definitely looking forward to this one (come on out if you’re anywhere near the area!)  If you don’t follow Jason already, get to it – he’s got a lot of useful stuff on his blog.

The indieconf conference for web freelancers is coming again this year – still nailing down a date – but the call for presenters is open right now – submit your proposal to present if you’re interested in joining us this year!

It’s hard to believe 2013 is almost half over already!!!

I'm currently working on a book for web freelancers, covering everything you need to know to get started or just get better. Want to stay updated? Sign up for my mailing list to get updates when the book is ready to be released!

Web Developer Freelancing Handbook

Get notified when the book is available!
Categories: Open Source, PHP Community

Sameer Borate: Simple user authentication in Laravel 4

PHPDeveloper.org - Mon, 17/06/2013 - 21:22

Sameer Borate has a new post today showing how you can do simple user authentication in a Laravel 4-based application using the built-in Auth functionality.

With the recent release of Laravel 4, PHP developers have at their disposal one of the finest frameworks for application development. As with all new frameworks, it is always good to write some quick code to get a feel for the underlying architecture. The following post shows a simple authentication application using Laravel.

He walks you through the creation of the simple "users" table, the configuration the Auth class will need to connect and authenticate and the form for the login. He also shows the steps for the actual authentication process as well as the code for the routes to make it all work. Additionally, he shows how to restrict pages to only those with the "admin" level access via an auth filter. You can download the example code here.

Link: http://www.codediesel.com/frameworks/simple-user-authentication-in-laravel-4

php|architect: Re: Branding php[architect]

PHPDeveloper.org - Mon, 17/06/2013 - 20:03

The php|architect group (magazine, conferences, etc) has kicked off a rebranding of their long-time product line to move it forward and give it a simpler, cleaner look.

Arbi Arzoumani did a wonderful job with php|architect's image (logos, colors and fonts as well as magazine, conference and website design). I've always admired what he did with the brand, especially since he wore so many hats at BP. He was actually in the process of a brand update when musketeers took over. [...] Taking his direction further, I simplified the whole image (logo, fonts and colors) to a more colorful and less cluttered version. I also decided to unify the brand across all product lines, including the magazine, websites, books, summits and conferences.

Additionally, they've changed the "name" used for the company away from "php|architect" to a slightly different format - "php[architect]" to help unify it across the board with other offerings. Don't worry, you'll still be getting the same great content and community events from the group, it's just getting a "fresh coat of paint."

Link: http://www.phparch.com/2013/06/re-branding-phparchitect

/Dev/Hell Podcast: Episode 33: Pol Pot-level Sucks

PHPDeveloper.org - Mon, 17/06/2013 - 19:42

The /Dev/Hell podcast (hosted by PHP community members Chris Hartjes and Ed Finkler) has posted its latest episode - Episode #33 - Pol Pot-level Sucks.

Back in the saddle for the double-tres, Chris and Ed rap about the loss of trust in Google and how that affects their perception of the Go language. Then Ed babbles for way too long about vintage gaming and computing. Chris wonders how you could be truly private on the Internet in the light of widespread government surveillance. Finally, we talk about the importance of automation and repeatable processes.

You can listen to this latest episode either through the in-page player or by downloading the mp3 directly. You can also subscribe to their feed so you'll know when the latest episodes are released.

Link: http://devhell.info/post/2013-06-13/pol-pot-level-sucks

MaltBlue.com: Using ZFTool for Basic Project Management

PHPDeveloper.org - Mon, 17/06/2013 - 18:18

Matthew Setter has posted a new tutorial about using the ZFTool functionality of Zend Framework v2 for managing your project's settings and configuration.

Welcome to another tutorial. Today, I will be giving you a walk through of zftool, which provides basic tooling support in Zend Framework 2. If you're new to Zend Framework, or have been reading the introductory series here, it can come in quite handy. But unlike other frameworks, such as Yii (through yiic) and Symfony (via the Command Line tool), the tooling support in Zend Framework 2 is rather light on. These respective tools provide rather robust support for automatically generating models from database connections, checking logs and a host of other much required functionality.

He shows you how to do a few things with the ZFTool - create a new project, make some modules inside it, build an autoloader classmap and check the installation with some basic diagnostics. Command examples and configuration samples are included in the post to help you along.

Link: http://www.maltblue.com/tutorial/zftool-for-basic-project-management

Fabien Potencier: Packing a Symfony full-stack Framework Application in one File - Introduction

PHPDeveloper.org - Mon, 17/06/2013 - 17:49

Fabien Potencier has a new post to his site showing how you can package a Symfony application into one file, the first part of a series. It's not "packing" like you'd think with a phar, but more of an all-in-one file setup.

Sometimes, I'm wondering if I'm not just completely crazy. [...] his is yet another step toward my Quest of the PHP Holy Grail. But besides being a though challenge, there are many other reasons that makes it interesting for everyone. First, that's a good way to learn more about the Symfony internals and especially about the Kernel class. [...] Then, I want to showcase once more the flexibility of the Symfony core framework and the decoupling between all aspects of the framework.

He does talk about one more practical use - making bug reporting easier by having just one file that can reproduce the behavior you're seeing and is easy to drop in, self-contained. He issues a challenge to himself for the course of the series - is it possible to make a full-stack application in one file and in under 200 lines of code.

Link: http://fabien.potencier.org/article/69/packing-a-symfony-full-stack-framework-application-in-one-file-introduction
Syndicate content