<?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: Phillip L. Cabrera M.</title>
    <description>The latest articles on DEV Community by Phillip L. Cabrera M. (@pcabreram1234).</description>
    <link>https://dev.to/pcabreram1234</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%2F965039%2F29b02fcb-778a-4a62-8707-666fe75fedc3.jpeg</url>
      <title>DEV Community: Phillip L. Cabrera M.</title>
      <link>https://dev.to/pcabreram1234</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pcabreram1234"/>
    <language>en</language>
    <item>
      <title>How I Optimized an Extremely Slow Oracle SQL Query (Real Case Study)</title>
      <dc:creator>Phillip L. Cabrera M.</dc:creator>
      <pubDate>Sun, 23 Nov 2025 00:58:36 +0000</pubDate>
      <link>https://dev.to/pcabreram1234/how-i-optimized-an-extremely-slow-oracle-sql-query-real-case-study-5b6d</link>
      <guid>https://dev.to/pcabreram1234/how-i-optimized-an-extremely-slow-oracle-sql-query-real-case-study-5b6d</guid>
      <description>&lt;p&gt;In enterprise environments with large data volumes, SQL queries can go from executing in seconds to taking minutes—or even hours—especially when they involve multiple tables, joins, and functions on indexed columns.&lt;br&gt;&lt;br&gt;
In this post, I want to share a real-world experience optimizing an Oracle query that originally took far too long and how I drastically reduced its execution time by applying practical optimization techniques.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Initial Problem
&lt;/h2&gt;

&lt;p&gt;It all began with a query that joined several tables across different schemas.&lt;br&gt;&lt;br&gt;
Although the logic was correct, the execution time was unacceptable: Oracle was processing millions of rows without leveraging indexes effectively.&lt;/p&gt;




&lt;h2&gt;
  
  
  Diagnosing the Bottleneck
&lt;/h2&gt;

&lt;p&gt;After reviewing the execution plan, I identified several issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use of functions on indexed columns (like &lt;strong&gt;SUBSTR()&lt;/strong&gt;), which invalidates index usage.&lt;/li&gt;
&lt;li&gt;Missing indexes on columns used for table joins.&lt;/li&gt;
&lt;li&gt;Outdated table statistics, causing the Oracle optimizer to make poor cost estimations.&lt;/li&gt;
&lt;li&gt;Use of &lt;strong&gt;EXTRACT(MONTH FROM ...)&lt;/strong&gt; in the WHERE clause, also preventing index usage.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Solutions Applied
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 1. Remove Functions From Columns Used in JOIN and WHERE
&lt;/h3&gt;

&lt;p&gt;Instead of using &lt;strong&gt;SUBSTR&lt;/strong&gt;, I created physical columns that stored the exact values needed for filtering.&lt;br&gt;&lt;br&gt;
This allowed Oracle to use the indexes directly without performing a function on every row.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 2. Create Optimal Composite Indexes
&lt;/h3&gt;

&lt;p&gt;I then created composite indexes that reflected the actual way the columns were used in the query and added missing indexes on other involved tables.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 3. Update Optimizer Statistics
&lt;/h3&gt;

&lt;p&gt;Before re-running the query, I updated the table statistics so Oracle would have an accurate understanding of data distribution and volume.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Result 🚀
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The execution plan shifted from &lt;strong&gt;full table scans&lt;/strong&gt; to &lt;strong&gt;index range scans&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Total cost dropped dramatically.&lt;/li&gt;
&lt;li&gt;The query went from taking several minutes to running in &lt;strong&gt;under one second&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Avoid functions on indexed columns.&lt;/strong&gt; Whenever you use SUBSTR, EXTRACT, UPPER, etc. in WHERE or JOIN conditions, Oracle cannot use indexes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create indexes based on real query conditions.&lt;/strong&gt; A poorly designed index can be as useless as having none.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep statistics updated.&lt;/strong&gt; Oracle makes decisions based on them, and outdated stats can lead to suboptimal execution plans.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consider derived columns when needed.&lt;/strong&gt; In some cases, denormalized data can significantly improve performance without affecting integrity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure, test, and document.&lt;/strong&gt; Always compare execution plans before and after making changes.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Optimizing SQL queries in Oracle doesn’t always require advanced tricks or more powerful hardware.&lt;br&gt;&lt;br&gt;
Often, it’s simply about understanding how the optimizer interprets your query and giving it the proper structure to work efficiently.&lt;/p&gt;

&lt;p&gt;In my case, removing functions from indexed columns and creating the right indexes transformed a slow query into an instant operation. 💪&lt;/p&gt;

</description>
      <category>sql</category>
      <category>performance</category>
      <category>database</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>From chaos to relief: How we solved a critical problem in the telemetered meter disconnection and reconnection system</title>
      <dc:creator>Phillip L. Cabrera M.</dc:creator>
      <pubDate>Sun, 17 Aug 2025 15:49:39 +0000</pubDate>
      <link>https://dev.to/pcabreram1234/from-chaos-to-relief-how-we-solved-a-critical-problem-in-the-telemetered-meter-disconnection-and-232</link>
      <guid>https://dev.to/pcabreram1234/from-chaos-to-relief-how-we-solved-a-critical-problem-in-the-telemetered-meter-disconnection-and-232</guid>
      <description>&lt;p&gt;For weeks, our system responsible for remote cut, reconnection, and meter readings was failing consistently. Commands we sent were stuck in timeouts—and this wasn’t a mere technical hiccup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customers who had already paid remained disconnected.
&lt;/li&gt;
&lt;li&gt;An entire department had to submit commands manually.
&lt;/li&gt;
&lt;li&gt;Service orders (SOs) were being closed outside the normal flow between the Commercial interface and the Remote Management system.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It drained both our internal teams and our customers, and we needed an urgent solution.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Problem Context
&lt;/h2&gt;

&lt;p&gt;Under normal conditions, the process works like this:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Commercial interface generates the service order.
&lt;/li&gt;
&lt;li&gt;The Remote Management system, built in Java, sends the command to the meter (cut, reconnect, or read).
&lt;/li&gt;
&lt;li&gt;The meter responds, confirming the action.
&lt;/li&gt;
&lt;li&gt;The service order is closed automatically in the system.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However, once the issue began, step 3 never happened. The system sent the command… and then waited until it hit the timeout.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Investigating the Cause
&lt;/h2&gt;

&lt;p&gt;At first, all signs pointed to a network infrastructure problem. We ran multiple checks:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitoring communications with meters.
&lt;/li&gt;
&lt;li&gt;Verifying servers and links.
&lt;/li&gt;
&lt;li&gt;Reviewing logs for connection errors.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything looked fine… yet the failure persisted. That’s when we considered that the real issue might not be technical at the network level, but logical at the system level.  &lt;/p&gt;

&lt;h2&gt;
  
  
  The Key Finding
&lt;/h2&gt;

&lt;p&gt;On deeper review, we discovered that the user configured to send commands in the system had limited permissions. Due to how the interface is designed, those permissions restricted bulk command sending and interfered with automatic SO closures.  &lt;/p&gt;

&lt;p&gt;In other words, the system wasn’t failing due to connectivity—it was failing because the user account lacked the necessary access level to execute all operations.  &lt;/p&gt;

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

&lt;p&gt;The fix was straightforward: we requested elevated privileges for the service user used by the Java program so it could send the corresponding commands.  &lt;/p&gt;

&lt;p&gt;The change had an immediate impact:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commands started sending and completing correctly.
&lt;/li&gt;
&lt;li&gt;SOs closed automatically within the Commercial–Remote Management flow.
&lt;/li&gt;
&lt;li&gt;The department that had been doing manual work returned to its normal function.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;It’s not always the network: sometimes the failure is as simple as user permissions.
&lt;/li&gt;
&lt;li&gt;Document roles and privileges: knowing what each user can do prevents blockers.
&lt;/li&gt;
&lt;li&gt;Keep a high-privilege test user: vital for diagnosing critical issues.
&lt;/li&gt;
&lt;li&gt;Avoid manual workarounds: breaking the automated flow creates more errors long term.
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Final Reflection
&lt;/h2&gt;

&lt;p&gt;This case reminded me that in technology, root causes aren’t always obvious. We spent days checking cables, routers, and servers, when the answer was a single permission setting. Thank God we restored the service and spared customers from further, unnecessary delays.  &lt;/p&gt;

&lt;p&gt;In the end, seeing everything flow correctly again is the best reward for any technical team.  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro tip:&lt;/strong&gt; If you work on similar systems, never underestimate the importance of reviewing user configuration before assuming the issue lies in the infrastructure.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Optimizing Transformations in Pentaho: Case Study</title>
      <dc:creator>Phillip L. Cabrera M.</dc:creator>
      <pubDate>Sun, 04 Aug 2024 00:55:05 +0000</pubDate>
      <link>https://dev.to/pcabreram1234/optimizing-transformations-in-pentaho-case-study-1h1f</link>
      <guid>https://dev.to/pcabreram1234/optimizing-transformations-in-pentaho-case-study-1h1f</guid>
      <description>&lt;p&gt;In my current role as an IT Analyst, I was tasked with verifying and correcting an automatic transformation in Pentaho.&lt;/p&gt;

&lt;p&gt;Pentaho is a suite of business intelligence (BI) tools that enables companies to collect, integrate, visualize, and analyze data from various sources to make informed decisions. It offers a range of functionalities, including data integration, interactive and dynamic reporting, data analysis, dashboard creation and management, data mining, Big Data, among others.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenge
&lt;/h2&gt;

&lt;p&gt;The transformation I had to analyze and optimize consists of extracting data from some databases and then inserting them into a single table in another specific database. At first glance, everything seems logical. However, the original workflow presented a critical problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Query in three different databases.&lt;/li&gt;
&lt;li&gt;Deletion of all data from the target table.&lt;/li&gt;
&lt;li&gt;Insertion of data from the three previous queries into the target table.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach may seem reasonable, but it becomes problematic as the volume of data increases. Performing a DROP TABLE on every transformation execution (several times a day) can greatly impact the performance of a production database, especially if the table is used as a reference in crucial daily operations.&lt;/p&gt;

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

&lt;p&gt;To solve this problem, I restructured the transformation flow. The original flow was: SELECT -&amp;gt; INSERT. I modified it as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Select source table:&lt;/strong&gt; A data selection is performed from the source table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select target table:&lt;/strong&gt; A data selection is performed from the target table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sort rows:&lt;/strong&gt; The rows obtained from the source table are sorted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sort rows 2:&lt;/strong&gt; The rows obtained from the target table are sorted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stream lookup:&lt;/strong&gt; A data lookup is performed between the two previously sorted sources (source and target). This step combines rows from both sources based on some common key, adding the key field of the source table with that of the target table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filter rows:&lt;/strong&gt; The rows resulting from the Stream lookup step are filtered. Depending on the specified condition, the rows will be split into two streams. This step filters out the records that are already inserted and those that are not (NULL).

&lt;ul&gt;
&lt;li&gt;If they meet the condition (key field set to null), they will move on to the Select values step.&lt;/li&gt;
&lt;li&gt;If they do not meet the condition, they will move on to the Dummy (do nothing) step.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dummy (do nothing):&lt;/strong&gt; This step does not perform any operation; it is a holding place for rows that do not meet the filter condition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select values:&lt;/strong&gt; Specific values are selected from the rows that met the filter condition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Insert into target table:&lt;/strong&gt; The selected values are inserted into the target table.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This procedure ensures that only missing records are inserted into the target table, thus avoiding the need to do an unnecessary DROP on a production database table, which is used by various database processes (procedures, triggers, functions, etc.) in order to provide good service to customers and avoid negatively affecting the business.&lt;/p&gt;

&lt;h2&gt;
  
  
  Record Keeping
&lt;/h2&gt;

&lt;p&gt;Also, what happens when you need to delete existing records in the target table that are no longer in the source table? The flow is similar to the one mentioned above, except that in step 5 the key field to compare in reverse is added and the last step is changed to a DELETE instead of an INSERT.&lt;/p&gt;

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

&lt;p&gt;This optimization not only improves the performance and efficiency of the production database, but also ensures data integrity and system stability. It is a clear example of how a small modification in approach can have a significant impact on the performance and reliability of IT systems.&lt;/p&gt;

&lt;p&gt;If you want to know more &lt;a href="https://phillipcabrera.com/coming-soon/" rel="noopener noreferrer"&gt;about me&lt;/a&gt;, don't forget to follow me on my networks and why not &lt;a href="https://phillipcabrera.com/coming-soon/#/portal/signup" rel="noopener noreferrer"&gt;subscribe&lt;/a&gt; to this blog.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9anmktxgvggc3nd6fob8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9anmktxgvggc3nd6fob8.png" alt="Image description" width="490" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>bigdata</category>
      <category>database</category>
      <category>career</category>
    </item>
    <item>
      <title>How to Create a Shortcut for an Application in Ubuntu</title>
      <dc:creator>Phillip L. Cabrera M.</dc:creator>
      <pubDate>Sun, 16 Jun 2024 00:14:05 +0000</pubDate>
      <link>https://dev.to/pcabreram1234/how-to-create-a-shortcut-for-an-application-in-ubuntu-39j6</link>
      <guid>https://dev.to/pcabreram1234/how-to-create-a-shortcut-for-an-application-in-ubuntu-39j6</guid>
      <description>&lt;p&gt;Sometimes, when you are new to Ubuntu and need to manually download applications and run them from an executable file, you may wonder how to create a shortcut similar to those in Windows. Here, I will explain how to do it step by step.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Copy the application folder
&lt;/h2&gt;

&lt;p&gt;First, copy the folder containing your application to the &lt;code&gt;/opt/&lt;/code&gt; directory with the following command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo cp -r /path/to/app /opt/&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Create the &lt;code&gt;.desktop&lt;/code&gt; file
&lt;/h2&gt;

&lt;p&gt;Check if there is a file with the &lt;code&gt;.desktop&lt;/code&gt; extension in the copied folder. If not, you will need to create one with the following format:&lt;/p&gt;

&lt;p&gt;[Desktop Entry]&lt;br&gt;
Version=1.0&lt;br&gt;
Type=Application&lt;br&gt;
Terminal=false&lt;br&gt;
Name=dbeaver-ce&lt;br&gt;
GenericName=Universal Database Manager&lt;br&gt;
Comment=Universal Database Manager and SQL Client.&lt;br&gt;
Path=/opt/dbeaver/&lt;br&gt;
Exec=/opt/dbeaver/dbeaver&lt;br&gt;
Icon=/opt/dbeaver/dbeaver.png&lt;br&gt;
Categories=IDE;Development&lt;br&gt;
StartupWMClass=DBeaver&lt;br&gt;
StartupNotify=true&lt;br&gt;
Keywords=Database;SQL;IDE;JDBC;ODBC;MySQL;PostgreSQL;Oracle;DB2;MariaDB&lt;br&gt;
MimeType=application/sql&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Explanation of the &lt;code&gt;.desktop&lt;/code&gt; file
&lt;/h2&gt;

&lt;p&gt;Here is an explanation of each part of this file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;[Desktop Entry]&lt;/code&gt;: Indicates that the file follows the desktop entry (&lt;code&gt;.desktop&lt;/code&gt;) standard, which is used to define shortcuts in graphical desktop environments.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Version=1.0&lt;/code&gt;: Specifies the version of the desktop entry file. Not always mandatory, but can be useful.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Type=Application&lt;/code&gt;: Defines the type of the entry. In this case, it's an application. Other types can be &lt;code&gt;Link&lt;/code&gt; or &lt;code&gt;Directory&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Terminal=false&lt;/code&gt;: Indicates whether the application should run in a terminal. &lt;code&gt;false&lt;/code&gt; means it's not needed; &lt;code&gt;true&lt;/code&gt; would open a terminal to run the program.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Name=dbeaver-ce&lt;/code&gt;: The name of the application as it will appear in the applications menu.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GenericName=Universal Database Manager&lt;/code&gt;: A generic name that describes the type of application. Useful for users unfamiliar with the specific name.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Comment=Universal Database Manager and SQL Client.&lt;/code&gt;: A comment that provides a brief description of the application, shown as a tooltip in some desktop environments.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Path=/opt/dbeaver/&lt;/code&gt;: The working directory where the application will run. This can be useful if the application needs to run from a specific directory.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Exec=/opt/dbeaver/dbeaver&lt;/code&gt;: The command to run the application. Specifies the full path to the DBeaver executable.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Icon=/opt/dbeaver/dbeaver.png&lt;/code&gt;: The path to the icon file used to represent the application in the menu and dock.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Categories=IDE;Development&lt;/code&gt;: The categories to which the application belongs. Helps to classify it correctly in the applications menu.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;StartupWMClass=DBeaver&lt;/code&gt;: The name of the main window class of the application. Useful for the desktop environment to correctly associate the window with the shortcut.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;StartupNotify=true&lt;/code&gt;: Indicates whether to show a startup notification when launching the application.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Keywords=Database;SQL;IDE;JDBC;ODBC;MySQL;PostgreSQL;Oracle;DB2;MariaDB&lt;/code&gt;: Keywords that help users search for the application in the menu.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;MimeType=application/sql&lt;/code&gt;: The MIME types that the application can handle. Useful for associating the application with certain file types.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Copy the &lt;code&gt;.desktop&lt;/code&gt; file to the correct location
&lt;/h2&gt;

&lt;p&gt;Copy the &lt;code&gt;.desktop&lt;/code&gt; file to the &lt;code&gt;/home/username/.local/share/applications&lt;/code&gt; directory with the following command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo cp /opt/application/application.desktop /home/username/.local/share/applications&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Assign execution permissions
&lt;/h2&gt;

&lt;p&gt;Finally, give the necessary permissions to the newly copied &lt;code&gt;.desktop&lt;/code&gt; file with the command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;chmod +x ~/.local/share/applications/application.desktop&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;By following these steps, you will have created a shortcut in Ubuntu to easily locate and open your applications. This will allow you to work more efficiently and have your favorite tools always at hand.&lt;/p&gt;

</description>
      <category>ubuntu</category>
      <category>productivity</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Development of a Web Application for Consulting Geographic Information and Printing Maps: A Case Study</title>
      <dc:creator>Phillip L. Cabrera M.</dc:creator>
      <pubDate>Sun, 19 May 2024 00:52:54 +0000</pubDate>
      <link>https://dev.to/pcabreram1234/development-of-a-web-application-for-consulting-geographic-information-and-printing-maps-a-case-study-3e4b</link>
      <guid>https://dev.to/pcabreram1234/development-of-a-web-application-for-consulting-geographic-information-and-printing-maps-a-case-study-3e4b</guid>
      <description>&lt;p&gt;Within the framework of my company's Annual Operating Plan, I was assigned the task of developing an innovative web application to consult geographic information of clients and generate interactive maps. This project is crucial to improve efficiency in geographic data management and optimize the relationship with our clients. In this article, I will describe the development process, from the analysis phase to the implementation of the first module.&lt;/p&gt;

&lt;h2&gt;
  
  
  Analysis and Planning
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Description of the Current System
&lt;/h3&gt;

&lt;p&gt;Currently, we have a similar system that has performance failures, request saturation, and slow map generation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Cases
&lt;/h3&gt;

&lt;p&gt;The new system will work when the current one is saturated or has problems meeting user needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Requirements
&lt;/h3&gt;

&lt;p&gt;The requirements of the new system include secure access, friendly interface, compatibility with existing data, and reduced response times.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flow Charts
&lt;/h3&gt;

&lt;p&gt;I have created flow charts to represent the processes of the current system and the new system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technologies to Use
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;AntDesign&lt;/li&gt;
&lt;li&gt;JavaScript (FrontEnd)&lt;/li&gt;
&lt;li&gt;Node.js (BackEnd)&lt;/li&gt;
&lt;li&gt;Express.js&lt;/li&gt;
&lt;li&gt;React.js&lt;/li&gt;
&lt;li&gt;Leaflet&lt;/li&gt;
&lt;li&gt;React-Leaflet&lt;/li&gt;
&lt;li&gt;OracleDB&lt;/li&gt;
&lt;li&gt;Sequelize&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Entity-Relationship Diagram
&lt;/h3&gt;

&lt;p&gt;I will describe the relationships of the tables that the application will use in the backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Development
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Creating the API
&lt;/h3&gt;

&lt;p&gt;I use JWT for authentication and secure transfer of information between the backend and the frontend. Endpoints have middleware to ensure authentication and data validation.&lt;/p&gt;

&lt;h3&gt;
  
  
  FrontEnd
&lt;/h3&gt;

&lt;p&gt;I am creating the frontend using a feature-based folder structure. I use Vite.js as a packager.&lt;/p&gt;

&lt;h2&gt;
  
  
  First Module
&lt;/h2&gt;

&lt;p&gt;The first module of the application will allow the user to select options from a list, rendering an interactive map with the corresponding elements. Users will be able to interact with the map, consult information and generate PDF files for printing. I plan to deliver this first module to receive feedback from users and report it as evidence of progress.&lt;/p&gt;

&lt;p&gt;I hope this article has given you a clear insight into the development process of our geographic query application. As we progress, I will share more updates on the feedback received and progress in the upcoming modules. Thank you for your interest and following.&lt;/p&gt;




&lt;p&gt;If you want to know more &lt;a href="https://phillipcabrera.com/coming-soon/"&gt;about me&lt;/a&gt;, don't forget to follow me on my networks and why not &lt;a href="https://phillipcabrera.com/coming-soon/#/portal/signup"&gt;subscribe&lt;/a&gt; to this blog.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>discuss</category>
    </item>
    <item>
      <title>My university experience</title>
      <dc:creator>Phillip L. Cabrera M.</dc:creator>
      <pubDate>Sun, 03 Dec 2023 00:42:45 +0000</pubDate>
      <link>https://dev.to/pcabreram1234/my-university-experience-4c4d</link>
      <guid>https://dev.to/pcabreram1234/my-university-experience-4c4d</guid>
      <description>&lt;p&gt;This will be a blog different from the others, in which I will immerse you in the great journey of my process to become a computer engineer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The beginning
&lt;/h2&gt;

&lt;p&gt;In the middle of 2007 I began my journey at the university, everything was going smoothly, I took all my subjects that the term offered me, I started my university life very well, meeting classmates and other majors with whom I began to interact and All of these experiences gave me a certain understanding of what adult social relationships are.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disruptions and Challenges
&lt;/h2&gt;

&lt;p&gt;So far everything is normal, but for the second year due to personal reasons and things beyond my control (such as living in a third world country and above all because I had little or no financial intelligence) it was not possible for me to continue my studies, I I saw the need to stop them and focus solely on work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Work experience
&lt;/h2&gt;

&lt;p&gt;At that time I was working as a photo editor in a studio using Photoshop, where I worked for 4 years. Then I had the opportunity to work as a Georefential information data manager in the company where I currently work. At that time I didn't really know the purpose of my work, simply doing what they told me.&lt;/p&gt;

&lt;p&gt;As time went by, just like at the university, I began to interact a lot with my co-workers, creating relationships of great intellectual value, which I still have, but I had not yet been able to decide to reintegrate into university life.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disruptions and Challenges
&lt;/h2&gt;

&lt;p&gt;I fell into the trap that many young people are fortunate enough to fall into, in my opinion, which is working without graduating in an area related to their career. For several years (2010-2020) I remained in that spiral, I went to work, collected my money, went out one weekend more than another and on Monday I returned to the routine. It was until one of my co-workers who had just started in the company and recently graduated from high school asked me for some advice about the registration process, which encouraged me to move forward with the subjects I had left behind, but I was so mentally focused that in Instead of taking all the ones that were offered to me during the quarter, I only took a few to be as loose as possible. It should be noted that even though not being able to take them, my full-time job would be an impediment.&lt;/p&gt;

&lt;p&gt;This form of study meant that despite the long time (4 years 2014-2018) I will reach the end of my student curriculum with only three subjects missing, among which was the final project (monographic). Once again I decided (without any reasonable excuse) to stop my university studies, it should be noted that between the periods of time that I lasted without studying I was on the verge of losing my enrollment, in other words I would have to start my degree again and that meant that at a pace of turtle but surely he will advance until he only has three pending subjects to present, on several occasions he only paid for the reactivation of the registration, even so he will not study that quarter just to avoid losing all the progress he had achieved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Graduation project
&lt;/h2&gt;

&lt;p&gt;After these events, it lasted until 2020 to teach my last subject (my degree project or monograph). It should be noted that due to the events that everyone already knows happened in the world, I carried out all the research work as well as the preparation and everything that The same entailed remotely, all this while working remotely, it should be noted that at that time if it had not been for that modality I would not have been able to finish university, I found it quite comfortable to work from home and luckily much of the research that I I had to do it or much of it was on the web or I could find it a few kilometers from my home.&lt;/p&gt;

&lt;p&gt;By December 2020, I had already presented my degree project or monograph and I felt incredible satisfaction knowing that I only needed to complete the last step, which was to graduate. Again, for reasons beyond my control, especially economic ones, I postponed said event. It was not until recently that thanks to the current position I have in the company that I was able to cover the expenses for my graduation which was celebrated this year in the month of October with which I concluded a step in my life, of which I know in advance, a large part of the Latin American population cannot afford (to go to university).&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Even though you see your goal very far away, one step every day is better than many from time to time, in the end you will achieve it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Going to university is great but leaving it already with experience in the career you chose and working in a company related to it is priceless, that's why I strongly ask you if you can, get experience while you study, in the end it will give you a unmatched plus.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adversities, whatever they may be (economic, social, etc...) will always be there, it is up to you to decide whether to face them or let them crush you.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The most important thing that you can obtain in my humble opinion from everything that comes with entering and leaving university are the relationships that you can make, in the future they are the ones that will help you find a job, a partner or even partners for your businesses.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without anything else to add, just thank you reader for taking these valuable minutes of your time to read this small experience of what was one of the most important stages of my life, I say goodbye and at the same time I encourage you to share your story.&lt;/p&gt;

&lt;p&gt;If you want to know more &lt;a href="https://phillipcabrera.com/coming-soon/"&gt;about me&lt;/a&gt;, don't forget to follow me on my networks and why not &lt;a href="https://phillipcabrera.com/coming-soon/#/portal/signup"&gt;subscribe&lt;/a&gt; to this blog.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>discuss</category>
      <category>career</category>
    </item>
    <item>
      <title>Automate your tasks with Cron and Crontab</title>
      <dc:creator>Phillip L. Cabrera M.</dc:creator>
      <pubDate>Wed, 23 Aug 2023 00:25:46 +0000</pubDate>
      <link>https://dev.to/pcabreram1234/automate-your-tasks-with-cron-and-crontab-1cd8</link>
      <guid>https://dev.to/pcabreram1234/automate-your-tasks-with-cron-and-crontab-1cd8</guid>
      <description>&lt;p&gt;"In the digital age, efficiency and automation are essential to keep workflows agile and streamlined. Often, we find ourselves with tasks that need to be executed on a regular basis, whether it's backing up data, cleaning systems or generate reports.Instead of relying on manual intervention, which can be error-prone and time-consuming, wouldn't it be great to have a tool that allows us to schedule and automate these tasks?If you work with UNIX systems, you're in luck In this post, I'll introduce you to two powerful tools, Cron and Crontab, that can transform the way you manage and schedule tasks on your system. I'll share my recent experience with them and the essential lessons I've learned in the process."&lt;/p&gt;

&lt;p&gt;I was recently given an assignment at work to learn how to use what is &lt;a href="https://www.cbtnuggets.com/blog/technology/system-admin/how-to-%20use-cron-crontabs-to-schedule-linux-jobs"&gt;Cron and Crontab&lt;/a&gt; so I immediately began to investigate what these tools are and what they are used for, and here are the conclusions I could reach.&lt;/p&gt;

&lt;h2&gt;Cron&lt;/h2&gt;

&lt;p&gt;It is a daemon-type service that comes installed with any UNIX system which is responsible for reading certain types of instructions from Crontab-type files.&lt;/p&gt;

&lt;h2&gt;Crontab&lt;/h2&gt;

&lt;p&gt;It is a text file in which each line indicates the frequency and the scheduled script that you want to be executed either once or several times.&lt;/p&gt;

&lt;p&gt;Suppose we have prepared a certain bash script that we want to run constantly.&lt;/p&gt;

&lt;h2&gt;1. Backup a folder recursively&lt;/h2&gt;

&lt;p&gt;We have the following script that is responsible for compressing the information of a certain folder.&lt;/p&gt;

&lt;pre&gt;
#!/bin/bash
# Folder you want to compress
SOURCE_DIR="/path/to/your/folder"
# Name of the compressed file to be generated
OUTPUT_FILE="/output/path/my_compressed_file.tar.gz"
# compress the folder
tar -czvf $OUTPUT_FILE $SOURCE_DIR
echo "The folder $SOURCE_DIR has been compressed into $OUTPUT_FILE"
&lt;/pre&gt;

&lt;p&gt;We could manually execute said script every day at the times we deem necessary, but this could become somewhat repetitive and, above all, take away valuable time that we could be using in other types of tasks. Here comes what is Cron and Crontab.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open our terminal.&lt;/li&gt;
     &lt;li&gt;Run the command &lt;code&gt;vim crontab -e&lt;/code&gt; This will open a screen similar to the following or it may show you a file with no text, which makes no difference. Now suppose we have saved the script to backup the information with the name &lt;strong&gt;makeBackup.sh&lt;/strong&gt; and we want it to run every day at 8 am, 365 days a year.
         
                &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q8RnZijW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media.geeksforgeeks.org/wp-content/uploads/cron1-1.png" width="647" height="411"&gt;
         
     &lt;/li&gt;
     &lt;li&gt;Click the I key to put the VIM editor in edit mode and place the following line of code &lt;code&gt;00 08 * * * /path/makeBackup.sh&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's explain this little snippet&lt;/p&gt;

&lt;ul&gt;
     &lt;li&gt;
&lt;strong&gt;00&lt;/strong&gt; Will be executed at minute 00&lt;/li&gt;
     &lt;li&gt;
&lt;strong&gt;08&lt;/strong&gt; It will be executed at time 08&lt;/li&gt;
     &lt;li&gt;
&lt;strong&gt;*&lt;/strong&gt; It will be executed on any day of the month&lt;/li&gt;
     &lt;li&gt;
&lt;strong&gt;*&lt;/strong&gt; It will be executed in any month of the year&lt;/li&gt;
     &lt;li&gt;
&lt;strong&gt;*&lt;/strong&gt; Will run on any day of the week&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here you have in more detail the syntax structure of each line of a crontab file.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
     &lt;thead&gt;
         &lt;tr&gt;
             &lt;th&gt;Position&lt;/th&gt;
             &lt;th&gt;Description&lt;/th&gt;
             &lt;th&gt;Values&lt;/th&gt;
             &lt;th&gt;Example&lt;/th&gt;
         &lt;/tr&gt;
     &lt;/thead&gt;
     &lt;tbody&gt;
         &lt;tr&gt;
             &lt;td&gt;1&lt;/td&gt;
             &lt;td&gt;Minute of the hour&lt;/td&gt;
             &lt;td&gt;0-59&lt;/td&gt;
             &lt;td&gt;00&lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr&gt;
             &lt;td&gt;2&lt;/td&gt;
             &lt;td&gt;Time of day&lt;/td&gt;
             &lt;td&gt;0-23&lt;/td&gt;
             &lt;td&gt;08&lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr&gt;
             &lt;td&gt;3&lt;/td&gt;
             &lt;td&gt;Day of the month&lt;/td&gt;
             &lt;td&gt;1-31&lt;/td&gt;
             &lt;td&gt;*&lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr&gt;
             &lt;td&gt;4&lt;/td&gt;
             &lt;td&gt;Month&lt;/td&gt;
             &lt;td&gt;1-12 (or names like JAN, FEB, etc.)&lt;/td&gt;
             &lt;td&gt;*&lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr&gt;
             &lt;td&gt;5&lt;/td&gt;
             &lt;td&gt;Day of the week&lt;/td&gt;
             &lt;td&gt;0-7 (0 and 7 are Sunday)&lt;/td&gt;
             &lt;td&gt;*&lt;/td&gt;
         &lt;/tr&gt;
     &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note: The asterisk (*) in the crontab syntax is used to indicate "any value" or "always".&lt;/p&gt;

&lt;h2&gt;2. Create a DB Backup Script&lt;/h2&gt;

&lt;h4&gt;1. First, write a bash script that backs up your database.
   of data.&lt;/h4&gt;

&lt;pre&gt;
#!/bin/bash

# Variables
DB_USER="your_username"
DB_PASS="your_password"
DB_NAME="database_name"
BACKUP_DIR="/backup/path"
DATE=$(date +"%Y%m%d")

# backup
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME &amp;gt; $BACKUP_DIR/db_backup_$DATE.sql

echo "Backup completed for $DATE"
&lt;/pre&gt;

&lt;p&gt;Save this file as &lt;code&gt;db_backup.sh&lt;/code&gt; and grant execute permissions with:&lt;/p&gt;

&lt;pre&gt;
chmod +x db_backup.sh
&lt;/pre&gt;

&lt;h4&gt;2. Configure Crontab&lt;/h4&gt;

&lt;p&gt;To schedule the task, we are going to use Crontab.&lt;/p&gt;

&lt;ul&gt;
     &lt;li&gt;Open your personal Crontab with the following command:&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;
crontab -e
&lt;/pre&gt;

&lt;ul&gt;
     &lt;li&gt;To perform a daily backup at 2 a.m., add the following line:&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;
0 2 * * * /path/to/script/db_backup.sh
&lt;/pre&gt;

&lt;p&gt;This line indicates:&lt;/p&gt;

&lt;ul&gt;
     &lt;li&gt;
&lt;code&gt;0&lt;/code&gt; Minute 0.&lt;/li&gt;
     &lt;li&gt;
&lt;code&gt;2&lt;/code&gt; Time 2 a.m.&lt;/li&gt;
     &lt;li&gt;
&lt;code&gt;*&lt;/code&gt; Any day of the month.&lt;/li&gt;
     &lt;li&gt;
&lt;code&gt;*&lt;/code&gt; Any month.&lt;/li&gt;
     &lt;li&gt;
&lt;code&gt;*&lt;/code&gt; Any day of the week.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;3. Verify&lt;/h4&gt;

&lt;p&gt;After adding the task to Crontab, make sure everything is working correctly. You can set the task to run in the next minute and verify that the backup file is created in the specified location.&lt;/p&gt;

&lt;p&gt;This example shows how to automate daily backups of a MySQL database. The key is the combination of the script that performs the backup and Crontab that schedules the regular execution of the script. I hope this example is useful to you and inspires you to explore more about the automation possibilities with Cron and Crontab!&lt;/p&gt;

&lt;h2&gt;Recommendations&lt;/h2&gt;

&lt;p&gt;It is important to take into account the following aspects when working with task automation with Cront and Crontab.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always place an email at the beginning of the crontab file with the snippet &lt;code&gt;MAILTO="yourmail@hotmail.com"&lt;/code&gt;, this is quite useful for when the Cron daemon have to execute the script if there is an error in the script's syntax, you will receive the error in your email.&lt;/li&gt;
     &lt;li&gt;Use absolute paths to your scripts&lt;/li&gt;
     &lt;li&gt;Test your scripts by scheduling tasks to run within 5 minutes, so you can instantly debug any possible errors either in the way the task is scheduled, the script path, or in the script itself .&lt;/li&gt;
     &lt;li&gt;When creating your .sh scripts give it execute permissions, you can use &lt;code&gt; chmod +x file.sh&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Did you find this tutorial on Cron and Crontab helpful? Task automation is just the tip of the iceberg when it comes to maximizing efficiency on UNIX systems. If you want to learn more and keep your skills up to date, subscribe to my &lt;a href="https://phillipcabrera.com/"&gt;blog!&lt;/a&gt;. And if you think this article can help someone else, don't hesitate to share it on your social networks! Remember, sharing knowledge is a way to empower our tech community.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>unix</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to recover an application in production.</title>
      <dc:creator>Phillip L. Cabrera M.</dc:creator>
      <pubDate>Tue, 08 Aug 2023 02:35:19 +0000</pubDate>
      <link>https://dev.to/pcabreram1234/how-to-recover-an-application-in-production-4f5i</link>
      <guid>https://dev.to/pcabreram1234/how-to-recover-an-application-in-production-4f5i</guid>
      <description>&lt;p&gt;What to do when production goes down: Two weeks ago in my &lt;a href="https://phillipcabrera.com/my-first-assignments-at-my-new-tech-job/"&gt;new job&lt;/a&gt; one of the applications that the company uses to serve a large part of its internal customers stopped working, this is an application that uses GIS services to represent, consult and print georeferential information corresponding to electrical entities. When the affected departments reported the incident, I realized that within the server that managed these applications, the folders with the necessary files were empty.&lt;/p&gt;

&lt;p&gt;I immediately set about trying to recover as much information as I needed, in order to put back the necessary applications and bash scripts that should be running in the background.&lt;/p&gt;

&lt;p&gt;One of the applications consisted of a Java &lt;a href="https://javaee.github.io/glassfish/"&gt;Glassfish&lt;/a&gt; application server and within that server two more applications were deployed which had the following task:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One consisted of the application, that is, the web application itself developed in Java with the standard of &lt;a href="https://es.wikipedia.org/wiki/JavaServer_Faces"&gt;JavaServer Faces (JSF)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The other is an API to serve information corresponding to maps and render said maps. The application use this API within its modules.&lt;/li&gt;
&lt;li&gt;And another that consisted of a GIS server for its in a module
of the application (JSF) where the users have the possibility of interacting online with the geographic entities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scrutinizing the server I found the source code of the three applications, I immediately set me to work to deploy them and put them into production, but here things got complicated.&lt;/p&gt;

&lt;p&gt;The first two (The Web Application and the API) are both applications deployed by the Glassfish server that we mentioned earlier, and the files I found were apparently corrupted or missing information so I asked a member from the development team the source code of the Web application (JSF) in the company's repositories, as well as the API and eureka but there was another problem, when testing the application in a local environment it worked correctly, but when I tested it in production trying to move between the modules (links or menus of the Web Application) the server threw error 500. So I came to the conclusion that the files corresponding to the glassfish server that I found could be equally damaged so download a new one, configure bash files to change environment variables such as &lt;a href="https://docs.oracle.com/cloud/help/en/pbcs_common/DIEPM/epm_set_java_home_104x6dd63633_106x6dd6441c.htm#DIEPM-GUID-7D734C69-2DE8%20-4E93-A3C8-9C3F6AD12D1B"&gt;JAVA_HOME&lt;/a&gt;, etc to deploy the server.&lt;/p&gt;

&lt;p&gt;Done, glassfish server installed, apps and APIs deployed, but happiness was short lived 😔. When trying to search for geographic entities in the application, the application did not return anything, so I had to learn the basics of the JSF application workflow and reading the source code I realized that the SQL queries that the application made to the DB had a parameter that was no longer being used, so I had to decompile that package from source, change the SQL queries, compile the app, package it, deploy it with Glassfish, and that's it.&lt;/p&gt;

&lt;p&gt;This whole process of testing, error, reading code, consulting my colleagues and so on took me almost two weeks, thank heavens there were alternative methods by which other internal clients could continue with their operations, although not at the same speed and fluidity as before but now everything is back to normal and what I have learned in these two weeks is priceless, being able to recover applications from a production server, configure them from scratch without having the slightest idea was an amazing trip.&lt;/p&gt;

&lt;p&gt;With this I want to invite you to lose your fear of breaking things while doing tests, but always do them locally😅 production is not touched. 🚫&lt;/p&gt;

&lt;p&gt;If you liked this article and want to continue learning from my experiences in the world of technology, please subscribe to my &lt;a href="https://phillipcabrera.com/"&gt;blog&lt;/a&gt;. Also, if you think this article may be useful to someone you know, feel free to share it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>java</category>
      <category>security</category>
    </item>
    <item>
      <title>My first assignments at my new Tech job</title>
      <dc:creator>Phillip L. Cabrera M.</dc:creator>
      <pubDate>Mon, 26 Jun 2023 12:18:33 +0000</pubDate>
      <link>https://dev.to/pcabreram1234/my-first-assignments-at-my-new-tech-job-26kc</link>
      <guid>https://dev.to/pcabreram1234/my-first-assignments-at-my-new-tech-job-26kc</guid>
      <description>&lt;p&gt;Recently in the previous &lt;a href="https://phillipcabrera.com/how-to-act-in-a-job-interview/"&gt;post&lt;/a&gt; I have indicated how you must act in an interview for a job related to technology, it is my pleasure to inform you that I am already working as an information technology analyst and part of the new things I have learned in this new position are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Obtain a deeper understanding of the company's databases.&lt;/li&gt;
&lt;li&gt;Learn to run programs developed in Java.&lt;/li&gt;
&lt;li&gt;The most used commands in Linux to work with servers.&lt;/li&gt;
&lt;li&gt;Among others that I will continue posting here.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Despite being a role that is not entirely involved with development, the responsibility is high, since it depends on me to manage and give suggestions to teams such as Infrastructure, DBA, Windows Admins/ UNIX, etc..., on how to proceed to resolve any event that is affecting the normal operation of the company.&lt;/p&gt;

&lt;p&gt;My first assignment was to automate some changes at the DB level that constantly had to be done manually, thanks to constant research and the use of AI (only for script correction) I have achieved create this procedure. Working on what you like and above all the challenges give incredible satisfaction. Tomorrow one of the seniors will review my script so fingers crossed that everything goes well.&lt;br&gt;
Having only been in this new position for two weeks (IT Analyst), I still don't have enough context and information with which to share with you, but don't worry, the best will come later.&lt;/p&gt;

&lt;p&gt;I will be thank you to suscribe to my personal &lt;a href="https://phillipcabrera.com/"&gt;blog&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>database</category>
      <category>java</category>
    </item>
    <item>
      <title>How to act in a job interview</title>
      <dc:creator>Phillip L. Cabrera M.</dc:creator>
      <pubDate>Tue, 06 Jun 2023 19:15:27 +0000</pubDate>
      <link>https://dev.to/pcabreram1234/how-to-act-in-a-job-interview-3f4c</link>
      <guid>https://dev.to/pcabreram1234/how-to-act-in-a-job-interview-3f4c</guid>
      <description>&lt;p&gt;I recently made the decision to check out a more technology related job position at the company I work for.&lt;/p&gt;

&lt;p&gt;When I attended said test, the first thing I noticed was that one of the members of said department was programming in JavaScript 😁 which I already started to like.&lt;/p&gt;

&lt;p&gt; As I began the interview with the head of the department with all professionalism, she asked me if she had any idea of the nature of the position for which she was applying. I immediately told her that I vaguely understood that it was a position for a development team, to which she replied: &lt;strong&gt; No, here we develop a few solutions for the areas of the company that we provide service to.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt; It is a position whose main function is to provide support in the face of any inconvenience or situation that the systems present. In short, the position has more to do with part of DevOps but mostly it tries to be technical support, ensuring a continuous delivery of high quality in regards to solutions to possible problems that the systems present, that is. incidentally they are georeferential systems (with satellite positioning).&lt;/p&gt;
    



&lt;p&gt; After having clarified that point, the young woman proceeded to do the behavioral interview on site, which she always recommends to be totally honest. I remember right now that one of the requirements for the job was to have solid knowledge of Java, unfortunately I told him that I had knowledge but in JavaScript, but if he gave me the opportunity I could learn the language and give me time for that process and so on with a technical test to check my progress.&lt;/p&gt;

&lt;p&gt; she Finally she gave me a small technical test (exam) with the following points: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Carry out an SQL query to find out the number of records from a location whose contracts have been made as of a specific date, (it should be noted that all these data were in separate tables joined by a foreign key).&lt;/li&gt;
    
     &lt;li&gt;The second point was to put in my own words an analysis and solution to the scenario in a SQL statement was taking more than 30 seconds to complete.&lt;/li&gt;
    
     &lt;li&gt;The last point consisted of making the necessary script in the language of my choice and that said script would do the following:
     &lt;ul&gt;
         &lt;li&gt;Read from table A records with a specific condition.&lt;/li&gt;
         &lt;li&gt;Enter these records resulting in table B.&lt;/li&gt;
         &lt;li&gt;In table B update the records with a specific condition.&lt;/li&gt;
         &lt;li&gt;Finally, display the square root of the highest value in table B on the screen.&lt;/li&gt;
    
     &lt;/ul&gt;
     &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After a few days, the manager of the department I was applying for wrote to me and told me, &lt;strong&gt;I just reviewed your technical test and as far as I'm concerned, if you are fully committed to learning Java you are more than welcome in my team&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can already imagine my answer.👍🏽💪🏽&lt;/p&gt;

&lt;p&gt;With this experience I encourage you to apply for any job in spite of not meeting all the requirements. The experience gained in these interviews, especially with the feedback they give you, is invaluable. So don't be afraid and apply, you never know what might happen.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>interview</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Understanding ReactJS Lifecycle</title>
      <dc:creator>Phillip L. Cabrera M.</dc:creator>
      <pubDate>Tue, 02 May 2023 14:35:44 +0000</pubDate>
      <link>https://dev.to/pcabreram1234/understanding-reactjs-lifecycle-193g</link>
      <guid>https://dev.to/pcabreram1234/understanding-reactjs-lifecycle-193g</guid>
      <description>&lt;p&gt;ReactJS, a popular front-end library, is known for its efficient rendering of user interfaces. One of the key features of ReactJS is its lifecycle methods. The lifecycle methods provide a way for developers to manage components and their behavior throughout their lifecycle. In this article, we will dive deep into the ReactJS lifecycle and understand how it works.&lt;br&gt;
What is ReactJS Lifecycle?&lt;/p&gt;

&lt;p&gt;ReactJS components have a lifecycle which consists of different stages. The lifecycle methods are functions that get called at different stages of a component's lifecycle. The lifecycle can be divided into three main phases: Mounting, Updating, and Unmounting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mounting
&lt;/h3&gt;

&lt;p&gt;Mounting is the first phase of the ReactJS lifecycle. In this phase, the component is created and added to the DOM. There are four methods in this phase:&lt;/p&gt;

&lt;h3&gt;
  
  
  constructor()
&lt;/h3&gt;

&lt;p&gt;This method is called when the component is created. It is used to initialize the component's state and bind event handlers.&lt;/p&gt;

&lt;h3&gt;
  
  
  getDerivedStateFromProps()
&lt;/h3&gt;

&lt;p&gt;This method is called after the constructor and before the render method. It is used to update the component's state based on changes in its props.&lt;/p&gt;

&lt;h3&gt;
  
  
  render()
&lt;/h3&gt;

&lt;p&gt;This method is called after getDerivedStateFromProps(). It returns the JSX that defines the component's structure.&lt;/p&gt;

&lt;h3&gt;
  
  
  componentDidMount()
&lt;/h3&gt;

&lt;p&gt;This method is called after the component is added to the DOM. It is used to perform any initialization that requires access to the DOM.&lt;/p&gt;

&lt;h3&gt;
  
  
  Updating
&lt;/h3&gt;

&lt;p&gt;The updating phase is the second phase of the ReactJS lifecycle. In this phase, the component's props or state changes and the component is re-rendered. There are five methods in this phase:&lt;/p&gt;

&lt;h3&gt;
  
  
  getDerivedStateFromProps()
&lt;/h3&gt;

&lt;p&gt;This method is called again when the component's props change. It is used to update the component's state based on changes in its props.&lt;/p&gt;

&lt;h3&gt;
  
  
  shouldComponentUpdate()
&lt;/h3&gt;

&lt;p&gt;This method is called before the component is re-rendered. It is used to determine whether the component should be re-rendered or not.&lt;/p&gt;

&lt;h3&gt;
  
  
  render()
&lt;/h3&gt;

&lt;p&gt;This method is called after shouldComponentUpdate() and returns the updated JSX.&lt;/p&gt;

&lt;h3&gt;
  
  
  getSnapshotBeforeUpdate()
&lt;/h3&gt;

&lt;p&gt;This method is called before the updated JSX is added to the DOM. It is used to capture the current state of the component.&lt;/p&gt;

&lt;h3&gt;
  
  
  componentDidUpdate()
&lt;/h3&gt;

&lt;p&gt;This method is called after the updated JSX is added to the DOM. It is used to perform any post-rendering operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unmounting
&lt;/h3&gt;

&lt;p&gt;The unmounting phase is the last phase of the ReactJS lifecycle. In this phase, the component is removed from the DOM. There is only one method in this phase:&lt;/p&gt;

&lt;h3&gt;
  
  
  componentWillUnmount()
&lt;/h3&gt;

&lt;p&gt;This method is called before the component is removed from the DOM. It is used to perform any cleanup operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;ReactJS lifecycle methods provide a way for developers to manage components and their behavior throughout their lifecycle. Understanding the ReactJS lifecycle is essential for writing efficient and optimized code. By using the lifecycle methods, developers can control the behavior of their components and improve the performance of their applications.&lt;/p&gt;

&lt;p&gt;In this article, we covered the three phases of the ReactJS lifecycle: Mounting, Updating, and Unmounting. We also discussed the methods that are called in each phase and their importance. With this knowledge, you can write better ReactJS components and create better user interfaces.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>learning</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The workflow with Git</title>
      <dc:creator>Phillip L. Cabrera M.</dc:creator>
      <pubDate>Wed, 08 Mar 2023 19:25:44 +0000</pubDate>
      <link>https://dev.to/pcabreram1234/the-workflow-with-git-24bh</link>
      <guid>https://dev.to/pcabreram1234/the-workflow-with-git-24bh</guid>
      <description>&lt;p&gt;Git is a control version system created by the creator of the Linux Kernel (Linux Tolvard), it allows to users working within a copy of a local repository, make changes and then sync them with a remote central repository. Also it offers features as branching and merging, what give to the developers the advatanges to work in deferents versions from a project simultaneously and combine the changes ordered and controlled.&lt;/p&gt;

&lt;p&gt;Through the time collaborating with Open Source projects I've can see that over all that to work in a well structured way, Git save a lot of headaches and allow that the collaborations from others programmers as well as the project evolution be the more efficiently possible.&lt;/p&gt;

&lt;p&gt;Through my experience developing and collaboration in projects, I've can collect this tips.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Update your local copy with the current in the remote repository.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A git pull is an operation that updated the local version of a repository including the changes that has been made in the remote source (repository) since last time it was synced.&lt;/p&gt;

&lt;p&gt;That is to say, if somebody has make changes in the remote repository and it has been uploaded, the way you can have that changes in your local version is neccesary to use the git pull for sync your version with the remote one.&lt;/p&gt;

&lt;p&gt;This way, every team member have the same code version and they can work in the project avoiding conflicts with others one.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Make small commits.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make small commit is a good practice in Git due to several reasons, in which the most outstanding (in my opinion) is.&lt;/p&gt;

&lt;p&gt;Facilitate the revision and comprehension from the repository history. When doing small commits, every of them represent an specific and concrete change in the code. This way is easier understand what changes were make, when, who made it and why.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Make commits with well descriptive titles.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Within the advantages from this good practice we can mention: Help to quickly understand the content into the commit, To allow to realize efficient searching in the repository historial, To help to maintain a good documentation and facilitate the collaboration in the team.&lt;/p&gt;

&lt;p&gt;These and others reasons (that you sure know to work with Git) are part of the advantage this standard offers.&lt;/p&gt;

&lt;p&gt;To see more of this content suscribe to my blog in this &lt;a href="https://phillipcabrera.com/"&gt;link&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>git</category>
      <category>opensource</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
