<?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: R0land013</title>
    <description>The latest articles on DEV Community by R0land013 (@r0land013).</description>
    <link>https://dev.to/r0land013</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%2F670309%2F4375c448-325d-4c34-aba7-60be73529bc3.png</url>
      <title>DEV Community: R0land013</title>
      <link>https://dev.to/r0land013</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/r0land013"/>
    <language>en</language>
    <item>
      <title>Dev Links launch</title>
      <dc:creator>R0land013</dc:creator>
      <pubDate>Fri, 11 Aug 2023 20:14:10 +0000</pubDate>
      <link>https://dev.to/r0land013/dev-links-launch-lpb</link>
      <guid>https://dev.to/r0land013/dev-links-launch-lpb</guid>
      <description>&lt;p&gt;Hi there👋. I present you 🚀&lt;strong&gt;Dev Links&lt;/strong&gt;. An open source browser extension that allows you to find useful tools for developers and designers, helping you to increase your productivity and keep you focused.&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%2Ftjcmlikh7tj7f6ox3nd8.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%2Ftjcmlikh7tj7f6ox3nd8.png" alt="Dev Links main view"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With this extension you will have a list of tools ready for you to browse. All tools are seperated by categories, so you can find fast what you wish. &lt;/p&gt;

&lt;p&gt;Dev Links allows you to select your favorite links for quick access.&lt;/p&gt;

&lt;p&gt;You can contribute with more links to the project in its repository. The repo of Dev Links is &lt;a href="https://github.com/R0land013/dev-links" rel="noopener noreferrer"&gt;this&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Downloads
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You can download DevLinks for Chrome, Opera and Brave &lt;a href="https://chrome.google.com/webstore/detail/dev-links/eogoekcejgaaaodjgbhnlpmccdmboapb" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;For Firefox you can get the extension &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/dev-links/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Dev Links will be publicly available for Edge soon.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Support Dev Links in &lt;a href="https://www.producthunt.com/posts/dev-links-2" rel="noopener noreferrer"&gt;Product Hunt&lt;/a&gt; so it can reach more persons.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>extensions</category>
    </item>
    <item>
      <title>Construct MVP PyQt5 application easily</title>
      <dc:creator>R0land013</dc:creator>
      <pubDate>Sun, 12 Jun 2022 01:14:03 +0000</pubDate>
      <link>https://dev.to/r0land013/construct-mvp-pyqt5-application-easily-542a</link>
      <guid>https://dev.to/r0land013/construct-mvp-pyqt5-application-easily-542a</guid>
      <description>&lt;p&gt;Hello everybody I created a python package to easily construct a &lt;strong&gt;MVP PyQt5&lt;/strong&gt; application. I will leave here the content of the project's &lt;strong&gt;README.md&lt;/strong&gt;.&lt;br&gt;
You can review the source code &lt;a href="https://github.com/R0land013/easy-mvp"&gt;here&lt;/a&gt;.&lt;br&gt;
And you can find the pacakge in &lt;a href="https://pypi.org/project/easy-mvp/"&gt;pypi&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Description
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;easy_mvp&lt;/strong&gt; is a package that makes it easy to build desktop applications&lt;br&gt;
using &lt;strong&gt;MVP&lt;/strong&gt; pattern, &lt;strong&gt;Python&lt;/strong&gt; and &lt;strong&gt;PyQt5&lt;/strong&gt;. This is achieved by using&lt;br&gt;
a set of classes and practices similar to those used in the &lt;strong&gt;Android framework&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The basic idea behind this package is to open a presenter from&lt;br&gt;
another presenter and that the new presenter fills the window for&lt;br&gt;
complete. This is similar to &lt;strong&gt;Android applications&lt;/strong&gt;, which&lt;br&gt;
when opening a new &lt;strong&gt;Activity&lt;/strong&gt;, they replace the old one with the new one.&lt;br&gt;
If the Back button is pressed, then the new &lt;strong&gt;Activity&lt;/strong&gt; is removed&lt;br&gt;
and the old one reappears on the screen. This gives the impression&lt;br&gt;
that there is a &lt;strong&gt;stack of Activity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In addition, &lt;strong&gt;easy_mvp&lt;/strong&gt; offers the possibility of doing the above &lt;strong&gt;in more than&lt;br&gt;
a window&lt;/strong&gt;, since desktop applications are very different to &lt;strong&gt;Android apps&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;To install this package you need to have &lt;strong&gt;Python&lt;/strong&gt; installed in your system.&lt;br&gt;
Then you can run this command to install this package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install easy_mvp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Explaining the mechanism
&lt;/h2&gt;

&lt;p&gt;The following explanations are reflected in &lt;code&gt;demo.py&lt;/code&gt; program.&lt;/p&gt;

&lt;h3&gt;
  
  
  The application model created by &lt;strong&gt;easy_mvp&lt;/strong&gt; is like this:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--O90OteD2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/R0land013/easy-mvp/blob/master/readme_img/app_manager_and_windows.png%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O90OteD2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/R0land013/easy-mvp/blob/master/readme_img/app_manager_and_windows.png%3Fraw%3Dtrue" alt="App Manager and windows" width="601" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;ApplicationManager&lt;/strong&gt; class is the &lt;strong&gt;entry point&lt;/strong&gt; of the program. This&lt;br&gt;
class is the one that knows the windows, creates them and destroys them. Each&lt;br&gt;
window holds a &lt;strong&gt;stack of presenters&lt;/strong&gt;. In this way it is implemented&lt;br&gt;
the same behavior that Android applications have. Class&lt;br&gt;
&lt;strong&gt;Intent&lt;/strong&gt; is used to &lt;strong&gt;transition&lt;/strong&gt; from one presenter to another,&lt;br&gt;
regardless of whether the new presenter is started in a new window.&lt;/p&gt;

&lt;h3&gt;
  
  
  The behavior of the windows is represented as follows:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QdBQQfm1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/R0land013/easy-mvp/blob/b2c8ba51e5315679848925967611e1e5931871dd/readme_img/window_with_its_internal_stack.png%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QdBQQfm1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/R0land013/easy-mvp/blob/b2c8ba51e5315679848925967611e1e5931871dd/readme_img/window_with_its_internal_stack.png%3Fraw%3Dtrue" alt="Window with its internal stack presenter" width="391" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see the &lt;strong&gt;window has a stack of presenters&lt;/strong&gt;, the&lt;br&gt;
which are attached to their views, therefore &lt;strong&gt;all the&lt;br&gt;
presenters must possess a view&lt;/strong&gt;. Again we can see that the class&lt;br&gt;
&lt;strong&gt;Intent&lt;/strong&gt; is the one that allows to add a new &lt;strong&gt;pair of presenter-view&lt;/strong&gt;&lt;br&gt;
to the window stack. For this mechanism to work, the presenter&lt;br&gt;
classes must &lt;strong&gt;inherit from the AbstractPresenter&lt;/strong&gt; class.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AbstractPresenter&lt;/strong&gt; has several methods to open new presenters,&lt;br&gt;
close the current presenter and to handle certain flows within the&lt;br&gt;
application, such as when a presenter is going to be initialized, hidden,&lt;br&gt;
or closed.&lt;/p&gt;

&lt;h3&gt;
  
  
  The flow of events in a class that inherits from AbstractPresenter is like this:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yxlhyzOy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/R0land013/easy-mvp/blob/b2c8ba51e5315679848925967611e1e5931871dd/readme_img/flow_of_calls_on_presenter.png%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yxlhyzOy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/R0land013/easy-mvp/blob/b2c8ba51e5315679848925967611e1e5931871dd/readme_img/flow_of_calls_on_presenter.png%3Fraw%3Dtrue" alt="flow_of_calls_on_presenter" width="671" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;_on_initialize&lt;/strong&gt; method is the first method called in the &lt;strong&gt;AbstractPresenter&lt;/strong&gt; class.&lt;br&gt;
Here the instance variables of the presenter must be initialized. Also you must&lt;br&gt;
create the instance of the view that corresponds to the presenter. Once created,&lt;br&gt;
the view instance must be set with the &lt;strong&gt;_set_view(view)&lt;/strong&gt; method, from&lt;br&gt;
this way the view is made accessible to the rest of the classes in &lt;strong&gt;easy_mvp environment&lt;/strong&gt;.&lt;br&gt;
The view can be obtained with the &lt;strong&gt;get_view&lt;/strong&gt; method of &lt;strong&gt;AbstractPresenter&lt;/strong&gt;, if it was set&lt;br&gt;
by &lt;strong&gt;_set_view(view)&lt;/strong&gt; first.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;on_view_shown&lt;/strong&gt; method is called just after the presenter view&lt;br&gt;
is displayed in the graphical interface. In this method the data should be loaded,&lt;br&gt;
and the tables and forms filled.&lt;/p&gt;

&lt;p&gt;If on the presenter whose view is visible, &lt;strong&gt;_open_other_presenter&lt;/strong&gt; is called&lt;br&gt;
then another presenter will be created, and this presenter will go to the top of the&lt;br&gt;
&lt;strong&gt;stack of presenters&lt;/strong&gt;, and its view will be the only one visible in the graphical interface.&lt;br&gt;
The view of presenter that called &lt;strong&gt;_open_other_presenter&lt;/strong&gt; will no longer be visible.&lt;br&gt;
Before this last occurs, the calling presenter will receive control of the program&lt;br&gt;
with the method &lt;strong&gt;on_view_covered&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If now the top presenter calls _&lt;strong&gt;close_this_presenter&lt;/strong&gt;, then the&lt;br&gt;
presenter view just below it will be visible again, and the&lt;br&gt;
presenter will receive control of the main thread via &lt;strong&gt;on_view_discovered&lt;/strong&gt;.&lt;br&gt;
In this method the view should be updated due to some change in the model.&lt;/p&gt;

&lt;p&gt;When the presenter at the top of the stack calls &lt;strong&gt;_close_this_presenter&lt;/strong&gt;&lt;br&gt;
receives the control with the &lt;strong&gt;on_closing_presenter&lt;/strong&gt; method. In this method&lt;br&gt;
resources should be released and observers removed. After the call to&lt;br&gt;
&lt;strong&gt;on_closing_presenter&lt;/strong&gt; the presenter and the view of the presenter will be&lt;br&gt;
removed and it will happen what it has been explained previously.&lt;br&gt;
It should be noted that if the presenter who closes is the&lt;br&gt;
only one that exists in the entire application, that is, there is only one&lt;br&gt;
window and it owns only a presenter then the application will close with&lt;br&gt;
the &lt;strong&gt;status code 0&lt;/strong&gt;. To close the program with different code, use the &lt;strong&gt;exit_app&lt;/strong&gt;&lt;br&gt;
method of AbstractPresenter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Receiving data from presenters
&lt;/h3&gt;

&lt;p&gt;A presenter can receive data from another presenter that it has created,&lt;br&gt;
if the second one is closed using the &lt;strong&gt;_close_this_presenter_with_result(result_data: dict)&lt;/strong&gt;&lt;br&gt;
method. In this way, the presenter that is below in the stack receives control of the&lt;br&gt;
program via &lt;strong&gt;on_view_discovered_with_result(action: str, data: dict)&lt;/strong&gt; instead of&lt;br&gt;
&lt;strong&gt;on_view_discovered&lt;/strong&gt;. The action parameter is the action that was passed to the &lt;strong&gt;Intent&lt;/strong&gt; when&lt;br&gt;
it was ordered to open the new presenter. And result_data is a &lt;strong&gt;Python dictionary&lt;/strong&gt; that the&lt;br&gt;
presenter who was on top can pass through&lt;br&gt;
&lt;strong&gt;_close_this_presenter_with_result(result_data: dict)&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Managing global data
&lt;/h3&gt;

&lt;p&gt;Data can be created to be accessible throughout the entire application. This is&lt;br&gt;
accomplished with the &lt;strong&gt;set_global_data(key: str, data)&lt;/strong&gt; and &lt;strong&gt;get_global_data(key: str)&lt;/strong&gt;&lt;br&gt;
methods of &lt;strong&gt;AbstractPresenter&lt;/strong&gt;. You can also check if a global data exists with the method&lt;br&gt;
&lt;strong&gt;has_global_data(key: str)&lt;/strong&gt;, which returns True if it exists and False otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Knowing Intent in depth
&lt;/h2&gt;

&lt;p&gt;As explained &lt;strong&gt;Intent&lt;/strong&gt; is what makes it possible to open new presenters. You can specify&lt;br&gt;
that the new presenter must be opened on a new window using&lt;br&gt;
&lt;strong&gt;use_new_window(use_new_window: bool = False)&lt;/strong&gt;. You can also specify that&lt;br&gt;
if a new window is to be opened, then make it modal or not with the method&lt;br&gt;
&lt;strong&gt;use_modal(self, modal: bool = False)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;An intent can be specified with an action with &lt;strong&gt;set_action(action: str)&lt;/strong&gt;, like so&lt;br&gt;
the new presenter may behave differently depending on the action received.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intent&lt;/strong&gt; also allows data to be passed to a new presenter via &lt;strong&gt;set_data(data: dict)&lt;/strong&gt;.&lt;br&gt;
To see examples of how &lt;strong&gt;Intent&lt;/strong&gt; is used, check out the &lt;code&gt;demo.py&lt;/code&gt; program.&lt;/p&gt;

</description>
      <category>python</category>
      <category>mvp</category>
      <category>pyqt5</category>
      <category>easy</category>
    </item>
    <item>
      <title>Guess Number Game with Android</title>
      <dc:creator>R0land013</dc:creator>
      <pubDate>Sun, 19 Dec 2021 03:51:05 +0000</pubDate>
      <link>https://dev.to/r0land013/guess-number-game-with-android-k0l</link>
      <guid>https://dev.to/r0land013/guess-number-game-with-android-k0l</guid>
      <description>&lt;p&gt;In this post I show you a simple game for practicing android development. It uses &lt;strong&gt;MVP&lt;/strong&gt; design pattern. &lt;br&gt;
&lt;strong&gt;You can find the code of this app&lt;/strong&gt; &lt;a href="https://github.com/R0land013/guess-number-android-app"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The game is called 'Guess Number'. The target is to guess a number between 1 and 100, using 10 intents or less.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k6lFNWAM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l2grt4x7z3hhi808k6yh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6lFNWAM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l2grt4x7z3hhi808k6yh.jpg" alt="Main view" width="262" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a simple challenge for android beginners. It uses some basic components of android apps, as &lt;strong&gt;Activities&lt;/strong&gt;, &lt;strong&gt;Intents&lt;/strong&gt; and &lt;strong&gt;Fragments&lt;/strong&gt;. Also the app uses some simple styles and other sources.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uxOlvVqk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xy2anoluq5g5xfj1ttxh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uxOlvVqk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xy2anoluq5g5xfj1ttxh.jpg" alt="Result view" width="262" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9RyN-_bE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0y5coyh9x9cps7a9224f.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9RyN-_bE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0y5coyh9x9cps7a9224f.jpg" alt="About view" width="261" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>java</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Multiple Scenes JavaFX MVP</title>
      <dc:creator>R0land013</dc:creator>
      <pubDate>Mon, 25 Oct 2021 18:46:42 +0000</pubDate>
      <link>https://dev.to/r0land013/multiple-scenes-javafx-mvp-38i4</link>
      <guid>https://dev.to/r0land013/multiple-scenes-javafx-mvp-38i4</guid>
      <description>&lt;p&gt;I made a &lt;strong&gt;demo&lt;/strong&gt; about showing a way to create a multiple scene &lt;strong&gt;JavaFX&lt;/strong&gt; application using &lt;strong&gt;MVP&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you are not familiarized with &lt;strong&gt;MVP&lt;/strong&gt; you should first understand it.&lt;br&gt;
You can read about it &lt;a href="https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter"&gt;here&lt;/a&gt; .&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;source code&lt;/strong&gt; is &lt;a href="https://github.com/R0land013/multiple-scenes-javafx"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  About
&lt;/h2&gt;

&lt;p&gt;I was finding a way to create a &lt;strong&gt;JavaFX&lt;/strong&gt; application using only one &lt;strong&gt;window or stage&lt;/strong&gt;, and&lt;br&gt;
multiple &lt;strong&gt;scenes&lt;/strong&gt;. The way I wanted to achieve it, was creating a mechanism to manage&lt;br&gt;
the &lt;strong&gt;presenters&lt;/strong&gt; using a stack. Doing that I could navigate between the &lt;strong&gt;presenters&lt;/strong&gt;&lt;br&gt;
and the &lt;strong&gt;scenes&lt;/strong&gt; in a common manner, openig new pairs of &lt;strong&gt;presenter&lt;/strong&gt; and &lt;strong&gt;view&lt;/strong&gt;,&lt;br&gt;
and being able to return to previous opened &lt;strong&gt;presenters&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And I wanted to got it without making a great effort in every &lt;strong&gt;presenter&lt;/strong&gt; source code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Principal Classes and Interfaces
&lt;/h3&gt;

&lt;h4&gt;
  
  
  PresenterManager:
&lt;/h4&gt;

&lt;p&gt;This is the most important class. It manage the &lt;em&gt;transitions&lt;/em&gt; between presenters.&lt;br&gt;
The &lt;strong&gt;presenters&lt;/strong&gt; notify this class to add &lt;strong&gt;presenters&lt;/strong&gt; or close them.&lt;/p&gt;

&lt;h4&gt;
  
  
  AbstarctPresenter:
&lt;/h4&gt;

&lt;p&gt;All &lt;strong&gt;presenters&lt;/strong&gt; must extends this class, because it defines the interfaces to&lt;br&gt;
comunicate with the &lt;strong&gt;PresenterManager&lt;/strong&gt; class. This class use &lt;strong&gt;notifyManagerToAddNewPresenter()&lt;/strong&gt;&lt;br&gt;
and &lt;strong&gt;notifyManagerToDeletePresenter()&lt;/strong&gt; methods to achieve it. These method are &lt;em&gt;protected&lt;/em&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  PresenterView:
&lt;/h4&gt;

&lt;p&gt;All &lt;strong&gt;views&lt;/strong&gt; must implement this &lt;em&gt;interface&lt;/em&gt;. It has the method &lt;strong&gt;getViewScene()&lt;/strong&gt; to retrieve the&lt;br&gt;
&lt;strong&gt;javafx.scene.Scene&lt;/strong&gt; object from the &lt;strong&gt;view&lt;/strong&gt; object. This method is used by&lt;br&gt;
the &lt;strong&gt;PresenterManager&lt;/strong&gt; to set the visible &lt;strong&gt;scene&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Explaining the mechanism
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;First&lt;/strong&gt;, all &lt;strong&gt;presenters&lt;/strong&gt; classes must extends the &lt;strong&gt;AbstarctPresenter&lt;/strong&gt; class and implement&lt;br&gt;
all &lt;em&gt;abstract&lt;/em&gt; methods:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;getDerivedPresenter():&lt;/strong&gt; is used by &lt;strong&gt;PresenterManager&lt;/strong&gt; to retrieve a &lt;strong&gt;new presenter&lt;/strong&gt;&lt;br&gt;
to be opened. Inside this method you can use a &lt;em&gt;switch&lt;/em&gt; statement or something similar to&lt;br&gt;
return an instance of the wished &lt;strong&gt;presenter&lt;/strong&gt;, because one &lt;strong&gt;presenter&lt;/strong&gt; could open&lt;br&gt;
different &lt;strong&gt;presenters&lt;/strong&gt;. For example you could have an application which shows a window&lt;br&gt;
with two button, the first to open a CRUD &lt;strong&gt;scene&lt;/strong&gt; of products and the other a CRUD&lt;br&gt;
&lt;strong&gt;scene&lt;/strong&gt; of clients. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;getPresenterView():&lt;/strong&gt; is used by &lt;strong&gt;PresenterManager&lt;/strong&gt; to retrieve the &lt;strong&gt;PresenterView&lt;/strong&gt;&lt;br&gt;
of the &lt;strong&gt;presenter&lt;/strong&gt; to be opened. And then get the &lt;strong&gt;javafx.scene.Scene&lt;/strong&gt; from it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Second&lt;/strong&gt;, you have to implement methods which calls &lt;strong&gt;notifyManagerToAddNewPresenter()&lt;/strong&gt;&lt;br&gt;
and &lt;strong&gt;notifyManagerToDeletePresenter()&lt;/strong&gt; to add new &lt;strong&gt;presenter&lt;/strong&gt; and delete current &lt;strong&gt;presenter&lt;/strong&gt;&lt;br&gt;
respectively. &lt;em&gt;See the source code of this project&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third&lt;/strong&gt;, in the &lt;strong&gt;views&lt;/strong&gt; of your &lt;strong&gt;presenters&lt;/strong&gt; you have to set the &lt;em&gt;listeners&lt;/em&gt; in &lt;em&gt;buttons&lt;/em&gt; or &lt;em&gt;widgets&lt;/em&gt;&lt;br&gt;
you want to fire the &lt;em&gt;events&lt;/em&gt; of opening or closing &lt;strong&gt;presenters&lt;/strong&gt;, and bind it with the methods created&lt;br&gt;
in the &lt;em&gt;previous step&lt;/em&gt;. And you have to implement the &lt;strong&gt;getViewScene()&lt;/strong&gt; method to return the &lt;strong&gt;javafx.scene.Scene&lt;/strong&gt;&lt;br&gt;
from this &lt;strong&gt;view&lt;/strong&gt; object. &lt;em&gt;See the source code of this project&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fourth&lt;/strong&gt;, in the &lt;strong&gt;start(Stage)&lt;/strong&gt; method of your &lt;strong&gt;Main&lt;/strong&gt; class create an instance of &lt;strong&gt;PresenterManager&lt;/strong&gt;&lt;br&gt;
and set the &lt;em&gt;initial presenter&lt;/em&gt; with &lt;strong&gt;setInitialPresenter(AbstarctPresenter)&lt;/strong&gt;. Then you can call the&lt;br&gt;
&lt;strong&gt;show()&lt;/strong&gt; method of &lt;strong&gt;AbstarctPresenter&lt;/strong&gt; to show the &lt;strong&gt;stage&lt;/strong&gt; or &lt;strong&gt;window&lt;/strong&gt; of your application.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You can always check the source code of this project, if you did not understand this description.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Images of the demo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  First scene
&lt;/h3&gt;

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

&lt;h3&gt;
  
  
  Second Scene
&lt;/h3&gt;

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

&lt;h3&gt;
  
  
  Third Scene
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GAj8-h0x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8l1qe2jvt7gectsrkyec.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GAj8-h0x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8l1qe2jvt7gectsrkyec.png" alt="Image description" width="400" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>javafx</category>
      <category>programming</category>
      <category>mvp</category>
    </item>
    <item>
      <title>Little TV Series Survey using pure HTML, CSS and Javascript for practicing those technologies.</title>
      <dc:creator>R0land013</dc:creator>
      <pubDate>Thu, 26 Aug 2021 03:52:53 +0000</pubDate>
      <link>https://dev.to/r0land013/little-tv-series-survey-using-pure-html-css-and-javascript-for-practicing-those-technologies-2g60</link>
      <guid>https://dev.to/r0land013/little-tv-series-survey-using-pure-html-css-and-javascript-for-practicing-those-technologies-2g60</guid>
      <description>&lt;p&gt;&lt;strong&gt;Hello everybody!&lt;/strong&gt; I feel so happy because I have just&lt;br&gt;
created my second web page using pure &lt;strong&gt;HTML&lt;/strong&gt;, &lt;strong&gt;CSS&lt;/strong&gt; and &lt;strong&gt;Javascript&lt;/strong&gt;,&lt;br&gt;
and I loved the result.&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%2Fcsy2hmdksu0isewnoq8a.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%2Fcsy2hmdksu0isewnoq8a.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
This web page, was created to practice the mentioned technologies.&lt;br&gt;
It let you choose a series from &lt;em&gt;'The Big Bang Theory'&lt;/em&gt;, &lt;em&gt;'Mr. Robot'&lt;/em&gt;&lt;br&gt;
and &lt;em&gt;'Game of Thrones'&lt;/em&gt;(Some of my favorite series). When you choose&lt;br&gt;
the series, the web page will show you some data about it, and it&lt;br&gt;
will let you choose your favorite character from that series. Then&lt;br&gt;
you have to leave a comment about why did you like about that series.&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%2Fn80i9iiz93n3qqud2hu7.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%2Fn80i9iiz93n3qqud2hu7.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
When you click &lt;em&gt;'submit'&lt;/em&gt;, a thankful message will appear.&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%2Farxffsun68ebm2ish1qg.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%2Farxffsun68ebm2ish1qg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
It also validate that you are selecting a series and leaving a comment.&lt;/p&gt;

&lt;p&gt;The repository of this little project is:&lt;br&gt;
&lt;a href="https://github.com/R0land013/TV-Series-Survey" rel="noopener noreferrer"&gt;https://github.com/R0land013/TV-Series-Survey&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Leave a comment showing what do you think about this practice.&lt;/p&gt;

</description>
      <category>html</category>
      <category>css</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>My first web page</title>
      <dc:creator>R0land013</dc:creator>
      <pubDate>Tue, 24 Aug 2021 04:18:00 +0000</pubDate>
      <link>https://dev.to/r0land013/my-first-web-page-4jc3</link>
      <guid>https://dev.to/r0land013/my-first-web-page-4jc3</guid>
      <description>&lt;p&gt;&lt;strong&gt;¡Hello World!&lt;/strong&gt; This is my first web page. It is my first &lt;br&gt;
step toward becoming a developer.&lt;/p&gt;

&lt;p&gt;This web page is about showing my favorite programming languages(Java, Python and C++) and its histories.&lt;br&gt;
This page was created using &lt;strong&gt;HTML&lt;/strong&gt; and &lt;strong&gt;CSS&lt;/strong&gt;.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wSfAU6en--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mtc6bj3zlo1i0h8wdf7h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wSfAU6en--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mtc6bj3zlo1i0h8wdf7h.png" alt="Alt Text" width="800" height="389"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mBD5Ai-g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a31buql0pn6j5epma56d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mBD5Ai-g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a31buql0pn6j5epma56d.png" alt="Alt Text" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>html</category>
      <category>css</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Where to put regular expression checks?</title>
      <dc:creator>R0land013</dc:creator>
      <pubDate>Sun, 01 Aug 2021 19:50:26 +0000</pubDate>
      <link>https://dev.to/r0land013/where-to-put-regular-expression-checks-3kip</link>
      <guid>https://dev.to/r0land013/where-to-put-regular-expression-checks-3kip</guid>
      <description>&lt;p&gt;Hello. I would like to know where should I check if a specific attribute matches with some regular expression. Should I do it in the class or in the database. For example imagine I have an &lt;strong&gt;User&lt;/strong&gt; class, which has an email attribute, and I need to check if a given value for that property is correctly written. Also imagine I need to store the users in a database. Where should I check for the correctly written email, in the &lt;strong&gt;code&lt;/strong&gt; inside the &lt;strong&gt;User&lt;/strong&gt; class, in the &lt;strong&gt;database&lt;/strong&gt; or &lt;strong&gt;both&lt;/strong&gt;? Thank you.&lt;/p&gt;

</description>
      <category>regex</category>
      <category>database</category>
    </item>
    <item>
      <title>Why I like statically checked languages?</title>
      <dc:creator>R0land013</dc:creator>
      <pubDate>Sat, 31 Jul 2021 23:16:00 +0000</pubDate>
      <link>https://dev.to/r0land013/why-i-like-statically-checked-languages-4p80</link>
      <guid>https://dev.to/r0land013/why-i-like-statically-checked-languages-4p80</guid>
      <description>&lt;p&gt;Hello, first of all, please, apologize my English; I am not an English speaker. I’m a beginner programmer, and the first programming language that I used was Python, a dynamically checked language. I used it to create my final project of 1st career year. It is incredible how easy python is. I was implementing that project very fast (without testing, creating messy code, messy architecture, due it was the first time I was creating an app) and I was very happy by how quick I was going ahead. But when I start to mix some classes and objects, and I started to test how was working my app, a bunch of errors were started to fall over me. I spend a long time to find and fix all bugs, some of them very hard to track for me. Many bugs which I found were given by the fact I was writing incorrectly the method names, also I was passing wrong argument types to methods, it seemed I have a bad memory😅.&lt;/p&gt;

&lt;p&gt;Luckily, I could terminate implementing all the application correctly, functionally speaking, but it was a difficult and painful process. I was very excited, because I had built my first app and I leaved a huge weight.&lt;/p&gt;

&lt;p&gt;The next year I had to create a similar project, but using Java language. When I started to learn Java, I suffered a terrible headache given by all the features that this language has. I was coming from the beautiful, simple and lazy Python’s world. My mind blew when I saw ‘final’, ‘static’ ,‘public’, ‘private’, ‘protected’, ‘void’, ‘char’, ‘boolean’, ‘byte’, ‘short’, ‘int’, ‘long’, ‘double’, ‘float’, ‘interface’, ‘abstract’ words and its syntax. It was uncomfortable for me to learn Java given the first programming language I learned was Python. But when I knew its fundamental features I felt better, and now I like it more than Python.&lt;/p&gt;

&lt;p&gt;When I started to create the new app it was easier. I did not suffer errors similar to those I found in my Python program.  The static checked of Java was saving me from a great quantity of subtle errors, and the IDE became my first friend due its auto completion and the errors markers. These things were reduced in my Python IDE (IntelliJ IDEA Community Edition with Python plugin) due its dynamically checked.&lt;/p&gt;

&lt;h2&gt;
  
  
  After living this experience of constructing similar apps with different languages, with different checked system I formed the next opinion:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;-Dynamically checked languages are easier to learn than static checked languages.&lt;/strong&gt; Since you do not need many reserved words, features and syntax and languages constrains in a language like Python, the process of learning becomes short, compared with statically checked languages like Java and C++. Also the code with a language like Python and JavaScript (dynamically checked languages) is short, and easy to read.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-The code written with statically checked language is easier to understand than dynamically checked language.&lt;/strong&gt; Because you are obligated to declare the returned type, and the parameters type when using a statically checked language, I could say that this kind of language is auto documented. This is good, but it is not enough to leave writing specifications (preconditions and post conditions). Now, think you are using Python and you need to use a function written by a team-mate, but he is lazy and he did not document it. How do you know what this function needs and returns? You have to read the function code, and spend some time in it. This happens because dynamically checked language does not obligate coders to give this information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-Statically checked language save you from a great quantity of subtle errors.&lt;/strong&gt; If you use a data type as an argument in a method call being different from the expected, then you will be notified by the IDE with a red mark, and the compiler will notified you with an error in compile time. With dynamically checked languages you can have these errors and the interpreter will never notified you, and you will have this hidden bug until the interpreter raise an exception as consequence of a method(or access to a property) call in an data type object wich does not have that method.&lt;/p&gt;

&lt;p&gt;All this makes me love statically checked languages. But dynamically checked languages have beauty too. Since these are short and simple you can code faster. It is very useful in competitive programming and in game programming contests. For example Python is very used for competitive programming and the majority of online judges allow it, and it is better to quickly write algorithms. Also there is a Python framework called Pygame which is very used in game programming contests.&lt;/p&gt;

&lt;p&gt;I hope you had learned something new or had read something interesting. If you see knowledge error in this post, please, tell me what it is. Give your opinion in this topic.&lt;/p&gt;

&lt;p&gt;What is your favorite programming language, and is it statically or dynamically checked?&lt;br&gt;
-The mine is Java😁.&lt;/p&gt;

</description>
      <category>programming</category>
    </item>
  </channel>
</rss>
