<?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: Jasper Aurelio Villas</title>
    <description>The latest articles on DEV Community by Jasper Aurelio Villas (@imajenasyon).</description>
    <link>https://dev.to/imajenasyon</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%2F2131804%2F274fb80a-3b8c-462a-b821-1abb4c3f8397.jpg</url>
      <title>DEV Community: Jasper Aurelio Villas</title>
      <link>https://dev.to/imajenasyon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/imajenasyon"/>
    <language>en</language>
    <item>
      <title>Heroku Dyno Types Compared</title>
      <dc:creator>Jasper Aurelio Villas</dc:creator>
      <pubDate>Tue, 14 Oct 2025 14:38:33 +0000</pubDate>
      <link>https://dev.to/imajenasyon/heroku-dyno-types-compared-3n4p</link>
      <guid>https://dev.to/imajenasyon/heroku-dyno-types-compared-3n4p</guid>
      <description>&lt;p&gt;Heroku’s only free dyno option is the Eco dyno, which requires a $5/month flat fee to unlock a shared pool of dyno hours. All other dyno types — Basic, Standard, and Performance — are paid tiers with increasing power and features.&lt;/p&gt;

&lt;p&gt;🧱 Heroku Dyno Types Compared&lt;/p&gt;

&lt;p&gt;🔹 Eco Dynos&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💰 Cost: $5/month flat fee for 1000 dyno hours&lt;/li&gt;
&lt;li&gt;💤 Sleeps when idle: Yes (after 30 minutes of inactivity)&lt;/li&gt;
&lt;li&gt;⚙️ Resources: Shared&lt;/li&gt;
&lt;li&gt;🚫 Autoscaling: Not available&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Best for: Hobby projects, prototypes, student apps&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔹 Basic Dynos&lt;/li&gt;
&lt;li&gt;💰 Cost: $7/month per dyno&lt;/li&gt;
&lt;li&gt;💤 Sleeps when idle: No — stays online&lt;/li&gt;
&lt;li&gt;⚙️ Resources: Shared&lt;/li&gt;
&lt;li&gt;🚫 Autoscaling: Not available&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Best for: Low-traffic apps that need consistent uptime&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔹 Standard Dynos&lt;/li&gt;
&lt;li&gt;💰 Cost: $25–$50/month per dyno&lt;/li&gt;
&lt;li&gt;💤 Sleeps when idle: No&lt;/li&gt;
&lt;li&gt;⚙️ Resources: Dedicated&lt;/li&gt;
&lt;li&gt;✅ Autoscaling: Supported&lt;/li&gt;
&lt;li&gt;✅ Best for: Production apps with moderate traffic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 Performance Dynos&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💰 Cost: $250+/month per dyno&lt;/li&gt;
&lt;li&gt;💤 Sleeps when idle: No&lt;/li&gt;
&lt;li&gt;⚙️ Resources: Dedicated (high memory and CPU)&lt;/li&gt;
&lt;li&gt;✅ Autoscaling: Supported&lt;/li&gt;
&lt;li&gt;✅ Best for: Enterprise-grade, high-performance workloads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📝 Note: As of 2025, Heroku requires a payment method to access any dyno tier, including Eco. Free-tier hosting is no longer available without billing info.&lt;/p&gt;

&lt;p&gt;🧠 Key Notes&lt;br&gt;
Eco dynos are the only entry-level option with a shared pool of hours. You can run multiple apps on Eco dynos as long as you stay within the 1000-hour limit.&lt;/p&gt;

&lt;p&gt;Basic dynos don’t sleep, but you pay per dyno — better for apps that need to stay online 24/7.&lt;/p&gt;

&lt;p&gt;Standard and Performance dynos offer more memory, CPU, and features like autoscaling, preboot, and dedicated networking — but they’re priced for serious production use.&lt;/p&gt;

&lt;p&gt;Let me know if you want help choosing the right dyno for your Spring Boot or .NET app, or if you’d like to migrate to a platform like Render or Railway that doesn’t require upfront payment.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>cloud</category>
      <category>devops</category>
    </item>
    <item>
      <title>📚 How to Build a ListView in ASP.NET Core MVC (Book Listing Example) Part 1</title>
      <dc:creator>Jasper Aurelio Villas</dc:creator>
      <pubDate>Tue, 14 Oct 2025 11:55:35 +0000</pubDate>
      <link>https://dev.to/imajenasyon/how-to-build-a-listview-in-aspnet-core-mvc-book-listing-example-5bda</link>
      <guid>https://dev.to/imajenasyon/how-to-build-a-listview-in-aspnet-core-mvc-book-listing-example-5bda</guid>
      <description>&lt;p&gt;This guide walks through displaying a list of books using a layered architecture with DTOs, services, and a Razor view.&lt;/p&gt;

&lt;p&gt;🧱 Step 1: Define the DTO&lt;br&gt;
Create a DTO to shape the data you want to expose in the view.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;csharp
namespace library_system_dotnet.Models.Dto.Book
{
    public class BookReadDto
    {
        public int Id { get; set; }
        public string? ISBN { get; set; }
        public string? Title { get; set; }
        public string? Description { get; set; }
        public string? Author { get; set; }
        public int? PublishedYear { get; set; }
        public string? Genre { get; set; }
        public int? CopiesAvailable { get; set; }
        public int? TotalCopies { get; set; }
        public string? Location { get; set; }
        public string? CoverImageUrl { get; set; }
        public DateTime CreatedAt { get; set; }
        public DateTime UpdatedAt { get; set; }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔄 Step 2: Create a Mapper&lt;br&gt;
Use a manual mapper to convert your Book entity to BookReadDto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;csharp
public static class BookMapper
{
    public static BookReadDto ToReadDto(Models.Book book)
    {
        return new BookReadDto
        {
            Id = book.Id,
            ISBN = book.ISBN,
            Title = book.Title,
            Description = book.Description,
            Author = book.Author,
            PublishedYear = book.PublishedYear,
            Genre = book.Genre,
            CopiesAvailable = book.CopiesAvailable,
            TotalCopies = book.TotalCopies,
            Location = book.Location,
            CoverImageUrl = book.CoverImageUrl
        };
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧩 Step 3: Define the Service Contract&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;csharp
public interface IBookService
{
    Task&amp;lt;IEnumerable&amp;lt;BookReadDto&amp;gt;&amp;gt; GetAllAsync(CancellationToken ct = default);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚙️ Step 4: Implement the Service&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;csharp
public class BookService : IBookService
{
    private readonly AppDbContext _context;
    private readonly IMapper _mapper;

    public BookService(AppDbContext context, IMapper mapper)
    {
        _context = context;
        _mapper = mapper;
    }

    public async Task&amp;lt;IEnumerable&amp;lt;BookReadDto&amp;gt;&amp;gt; GetAllAsync(CancellationToken ct = default)
    {
        var books = await _context.Books.ToListAsync(ct);
        return _mapper.Map&amp;lt;IEnumerable&amp;lt;BookReadDto&amp;gt;&amp;gt;(books);
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧭 Step 5: Register Services in Program.cs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;csharp
builder.Services.AddDbContext&amp;lt;AppDbContext&amp;gt;(options =&amp;gt;
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

builder.Services.AddControllersWithViews();
builder.Services.AddAutoMapper(typeof(Program));
builder.Services.AddScoped&amp;lt;IBookService, BookService&amp;gt;();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎯 Step 6: Create the Controller Action&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;csharp
[HttpGet("books")]
public async Task&amp;lt;ActionResult&amp;lt;IEnumerable&amp;lt;BookReadDto&amp;gt;&amp;gt;&amp;gt; Index()
{
    var books = await _context.Books.ToListAsync();
    var bookDtos = books.Select(BookMapper.ToReadDto);
    return View(bookDtos);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: You can switch to _bookService.GetAllAsync() once your service is fully wired.&lt;/p&gt;

&lt;p&gt;🖼️ Step 7: Create the Razor View (Views/Books/Index.cshtml)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;razor
@model IEnumerable&amp;lt;library_system_dotnet.Models.Dto.Book.BookReadDto&amp;gt;

@{
    ViewData["Title"] = "Books";
}

&amp;lt;h1&amp;gt;Books&amp;lt;/h1&amp;gt;

&amp;lt;p&amp;gt;
    &amp;lt;a asp-action="Create"&amp;gt;Create New&amp;lt;/a&amp;gt;
&amp;lt;/p&amp;gt;

&amp;lt;table class="table"&amp;gt;
    &amp;lt;thead&amp;gt;
        &amp;lt;tr&amp;gt;
            &amp;lt;th&amp;gt;@Html.DisplayNameFor(model =&amp;gt; model.ISBN)&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;@Html.DisplayNameFor(model =&amp;gt; model.Title)&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;@Html.DisplayNameFor(model =&amp;gt; model.Description)&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;@Html.DisplayNameFor(model =&amp;gt; model.Author)&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;@Html.DisplayNameFor(model =&amp;gt; model.PublishedYear)&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;@Html.DisplayNameFor(model =&amp;gt; model.Genre)&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;@Html.DisplayNameFor(model =&amp;gt; model.CopiesAvailable)&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;@Html.DisplayNameFor(model =&amp;gt; model.TotalCopies)&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;@Html.DisplayNameFor(model =&amp;gt; model.Location)&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;@Html.DisplayNameFor(model =&amp;gt; model.CoverImageUrl)&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;@Html.DisplayNameFor(model =&amp;gt; model.CreatedAt)&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;@Html.DisplayNameFor(model =&amp;gt; model.UpdatedAt)&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;
        &amp;lt;/tr&amp;gt;
    &amp;lt;/thead&amp;gt;
    &amp;lt;tbody&amp;gt;
    @foreach (var item in Model)
    {
        &amp;lt;tr&amp;gt;
            &amp;lt;td&amp;gt;@Html.DisplayFor(modelItem =&amp;gt; item.ISBN)&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;@Html.DisplayFor(modelItem =&amp;gt; item.Title)&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;@Html.DisplayFor(modelItem =&amp;gt; item.Description)&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;@Html.DisplayFor(modelItem =&amp;gt; item.Author)&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;@Html.DisplayFor(modelItem =&amp;gt; item.PublishedYear)&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;@Html.DisplayFor(modelItem =&amp;gt; item.Genre)&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;@Html.DisplayFor(modelItem =&amp;gt; item.CopiesAvailable)&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;@Html.DisplayFor(modelItem =&amp;gt; item.TotalCopies)&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;@Html.DisplayFor(modelItem =&amp;gt; item.Location)&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;@Html.DisplayFor(modelItem =&amp;gt; item.CoverImageUrl)&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;@Html.DisplayFor(modelItem =&amp;gt; item.CreatedAt)&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;@Html.DisplayFor(modelItem =&amp;gt; item.UpdatedAt)&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;
                &amp;lt;a asp-action="Edit" asp-route-id="@item.Id"&amp;gt;Edit&amp;lt;/a&amp;gt; |
                &amp;lt;a asp-action="Details" asp-route-id="@item.Id"&amp;gt;Details&amp;lt;/a&amp;gt; |
                &amp;lt;a asp-action="Delete" asp-route-id="@item.Id"&amp;gt;Delete&amp;lt;/a&amp;gt;
            &amp;lt;/td&amp;gt;
        &amp;lt;/tr&amp;gt;
    }
    &amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Final Notes&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make sure the view file is named Index.cshtml and placed in /Views/Books/.&lt;/li&gt;
&lt;li&gt;Ensure your controller inherits from Controller, not ControllerBase, to support view rendering.&lt;/li&gt;
&lt;li&gt;If you use AutoMapper, ensure the profile is registered and the mapping is defined.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Detail Test Case Example</title>
      <dc:creator>Jasper Aurelio Villas</dc:creator>
      <pubDate>Wed, 02 Jul 2025 07:03:01 +0000</pubDate>
      <link>https://dev.to/imajenasyon/detail-test-case-example-2n1e</link>
      <guid>https://dev.to/imajenasyon/detail-test-case-example-2n1e</guid>
      <description>&lt;p&gt;&lt;strong&gt;Test Case: Valid User Login&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Test Case ID: TC-001&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Related Requirement: FR-Login-01&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Module: Authentication&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prepared By: John Doe&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Date: 2025-07-02&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Version: 1.0&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Priority: High&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Objective&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Verify that a registered user can log in successfully using valid credentials.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Pre-Conditions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The application under test is deployed and accessible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test user “&lt;a href="mailto:testuser@example.com"&gt;testuser@example.com&lt;/a&gt;” exists with password “Password123!”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browser cache and cookies are cleared before test execution.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Test Data&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Username: &lt;a href="mailto:testuser@example.com"&gt;testuser@example.com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Password: Password123!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;URL: &lt;a href="https://app.example.com/login" rel="noopener noreferrer"&gt;https://app.example.com/login&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Test Steps&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Navigate to the login page at the provided URL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter “&lt;a href="mailto:testuser@example.com"&gt;testuser@example.com&lt;/a&gt;” into the Email field.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter “Password123!” into the Password field.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the “Login” button.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Expected Results&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Login page loads within 3 seconds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Email and Password fields accept input.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clicking “Login” sends a request and receives a 200 OK response.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User is redirected to the dashboard at &lt;a href="https://app.example.com/dashboard" rel="noopener noreferrer"&gt;https://app.example.com/dashboard&lt;/a&gt;..&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A welcome message “Welcome, testuser!” is displayed in the header.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Post-Conditions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;User session is active and can access authenticated features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No errors appear in the browser console or server logs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Additional Test Scenarios to Consider&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Invalid login with incorrect password and error message validation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Login throttling or account lockout after multiple failed attempts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Password reset flow and email delivery confirmation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Single sign-on (SSO) or multi-factor authentication (MFA) variations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Performance test for simultaneous login requests (&amp;lt; 5 s response time)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Test Plan and scope Template</title>
      <dc:creator>Jasper Aurelio Villas</dc:creator>
      <pubDate>Wed, 02 Jul 2025 06:37:35 +0000</pubDate>
      <link>https://dev.to/imajenasyon/test-plan-and-scope-template-j7e</link>
      <guid>https://dev.to/imajenasyon/test-plan-and-scope-template-j7e</guid>
      <description>&lt;p&gt;Test Plan and Scope Template&lt;br&gt;
1 Document Control&lt;br&gt;
Document Title:&lt;/p&gt;

&lt;p&gt;Project Name:&lt;/p&gt;

&lt;p&gt;Version:&lt;/p&gt;

&lt;p&gt;Author:&lt;/p&gt;

&lt;p&gt;Date:&lt;/p&gt;



&lt;p&gt;2 Revision History&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Version Date    Author  Changes Made
0.1 YYYY-MM-DD  Your Name   Initial draft
0.2 YYYY-MM-DD  Your Name   Updated scope section

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;3 Introduction&lt;/p&gt;

&lt;p&gt;Describe the purpose of this test plan and how it fits into the overall project lifecycle.&lt;/p&gt;




&lt;p&gt;4 Objectives&lt;/p&gt;

&lt;p&gt;Verify that the application meets functional requirements.&lt;/p&gt;

&lt;p&gt;Ensure performance and security benchmarks are satisfied.&lt;/p&gt;

&lt;p&gt;Identify and log defects for resolution.&lt;/p&gt;




&lt;p&gt;5 Scope&lt;/p&gt;

&lt;p&gt;In-Scope:&lt;/p&gt;

&lt;p&gt;List of modules, features, or user stories to be tested&lt;/p&gt;

&lt;p&gt;Supported platforms and configurations&lt;/p&gt;

&lt;p&gt;Out-of-Scope:&lt;/p&gt;

&lt;p&gt;Any features, environments, or non-functional tests explicitly excluded&lt;/p&gt;




&lt;p&gt;6 Test Items&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ID  Feature/Test Item   Description
TI-001  User Login  Validate login, logout flows
TI-002  Shopping Cart   Add/remove items, checkout

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;7 Test Approach&lt;/p&gt;

&lt;p&gt;Explain your overall strategy (manual vs. automated, risk-based, exploratory).&lt;/p&gt;




&lt;p&gt;8 Test Types and Levels&lt;/p&gt;

&lt;p&gt;Unit Testing: Developer-driven, local environment&lt;/p&gt;

&lt;p&gt;Integration Testing: Interaction between modules&lt;/p&gt;

&lt;p&gt;System Testing: End-to-end scenarios&lt;/p&gt;

&lt;p&gt;Regression Testing: Re-execute affected tests on new builds&lt;/p&gt;

&lt;p&gt;Acceptance Testing: Business stakeholder validation&lt;/p&gt;




&lt;p&gt;9 Test Environment&lt;/p&gt;

&lt;p&gt;Hardware: Servers, workstations, mobile devices&lt;/p&gt;

&lt;p&gt;Software: OS versions, browsers, database versions&lt;/p&gt;

&lt;p&gt;Tools: Test management, automation frameworks&lt;/p&gt;




&lt;p&gt;10 Roles and Responsibilities&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Role    Name    Responsibilities
Test Lead   Alice Smith Plan, coordinate, approve test artifacts
Automation Engineer Bob Jones   Develop and maintain automation scripts
Tester  Carol Lee   Execute test cases, log defects

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;11 Schedule and Milestones&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Milestone   Planned Date    Owner
Test Plan Approval  YYYY-MM-DD  Test Lead
Test Case Development   YYYY-MM-DD  Testers
Test Execution Start    YYYY-MM-DD  Testers
Test Completion YYYY-MM-DD  Test Lead

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;12 Entry and Exit Criteria&lt;/p&gt;

&lt;p&gt;Entry Criteria:&lt;/p&gt;

&lt;p&gt;Build deployed to test environment&lt;/p&gt;

&lt;p&gt;Test data prepared&lt;/p&gt;

&lt;p&gt;Exit Criteria:&lt;/p&gt;

&lt;p&gt;All high-priority defects resolved or risk-accepted&lt;/p&gt;

&lt;p&gt;Test coverage threshold achieved&lt;/p&gt;




&lt;p&gt;13 Risks and Mitigations&lt;/p&gt;

&lt;p&gt;Risk: Environment instability&lt;/p&gt;

&lt;p&gt;Mitigation: Maintain a backup environment&lt;/p&gt;

&lt;p&gt;Risk: Insufficient test data&lt;/p&gt;

&lt;p&gt;Mitigation: Create data scripts in advance&lt;/p&gt;




&lt;p&gt;14 Test Deliverables&lt;/p&gt;

&lt;p&gt;Approved Test Plan&lt;/p&gt;

&lt;p&gt;Test cases and checklists&lt;/p&gt;

&lt;p&gt;Defect reports&lt;/p&gt;

&lt;p&gt;Test summary report&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Approval
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Role    Name    Signature / Date
Project Manager     
QA Manager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Next, consider adding a filled-in example for one feature or customizing this template for Agile sprints. You might also explore automation coverage metrics or integrate a traceability matrix to link requirements to test cases.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>what is the difference betwen mock and injectmocks and when do i use it?</title>
      <dc:creator>Jasper Aurelio Villas</dc:creator>
      <pubDate>Mon, 30 Jun 2025 10:11:35 +0000</pubDate>
      <link>https://dev.to/imajenasyon/what-is-the-difference-betwen-mock-and-injectmocks-and-when-do-i-use-it-4hbh</link>
      <guid>https://dev.to/imajenasyon/what-is-the-difference-betwen-mock-and-injectmocks-and-when-do-i-use-it-4hbh</guid>
      <description>&lt;p&gt;Here’s the scoop on @Mock vs. @InjectMocks in Mockito, and when you reach for each:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;@Mock&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What it does: Creates a dummy instance (a “mock”) of a class or interface. All methods on that mock return default values (null/false/0) until you explicitly stub them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When to use: Anytime your class under test depends on a collaborator you don’t want to exercise for real—e.g., a database client, a web service, a DAO.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;java
@Mock
PaymentGateway mockGateway;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This line tells Mockito:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Construct a fake PaymentGateway object.&lt;/li&gt;
&lt;li&gt;Track every call to its methods.&lt;/li&gt;
&lt;li&gt;Let you stub (when(…).thenReturn(…)) or verify (verify(…)) interactions.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;@InjectMocks&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What it does: Instantiates your class under test and injects all available mocks (and spies) into it. Mockito tries constructor‐injection first, then setter‐injection, then field‐injection.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When to use: When you want Mockito to wire your class under test with your @Mock dependencies automatically—so you don’t have to new it yourself or write a DI framework for your unit test.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;java
@InjectMocks
OrderService service;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells Mockito:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find a way to build OrderService (calls its constructor).&lt;/li&gt;
&lt;li&gt;Look at its parameters or fields for types matching your @Mocks (PaymentGateway).&lt;/li&gt;
&lt;li&gt;Plug them in so service.gateway == mockGateway.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;Putting it together&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;java
@ExtendWith(MockitoExtension.class)
class OrderServiceTest {
  @Mock               // step 1: create mocks
  PaymentGateway gateway;

  @InjectMocks        // step 2: build real OrderService + inject mock
  OrderService service;

  @Test
  void happyPath() {
    when(gateway.charge(100)).thenReturn(true);   // stub behavior
    assertTrue(service.charge(new Order(100)));   // exercise &amp;amp; assert
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;@Mock → I need a fake; I’ll define its behavior or verify it later.&lt;/li&gt;
&lt;li&gt;@InjectMocks → I need a real instance of my SUT (Service Under Test) with those fakes wired in.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Best-practice tips&lt;/strong&gt;&lt;br&gt;
1 One SUT, many mocks&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You usually have one @InjectMocks and several @Mock fields.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2 Limit your mocks&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mock only outwards-facing dependencies. If a collaborator is a plain data object, don’t mock it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3 Constructor vs. field injection&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If your class has a single constructor, Mockito uses it. If you have multiple constructors, consider using @InjectMocks on a field + @Mock fields to make it explicit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;4 Avoid mixing frameworks&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don’t combine Spring’s @Autowired injection with Mockito’s @InjectMocks in the same test—it can get confusing.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;When not to use&lt;/strong&gt; @InjectMocks&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If you’re doing a pure unit test of a static helper or POJO, you don’t need it—just new the class directly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you prefer manual wiring for clarity, feel free to call new OrderService(mockGateway) yourself in a @BeforeEach.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>This is called interaction testing</title>
      <dc:creator>Jasper Aurelio Villas</dc:creator>
      <pubDate>Mon, 30 Jun 2025 10:07:53 +0000</pubDate>
      <link>https://dev.to/imajenasyon/this-is-called-interaction-testing-43lg</link>
      <guid>https://dev.to/imajenasyon/this-is-called-interaction-testing-43lg</guid>
      <description>&lt;p&gt;what is going on here?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
@Test 
void verifyGatewayIsCalledExactlyOnceWithCorrectAmount() { 
 when(mockGateway.charge(123)).thenReturn(true); 
 service.charge(new Order(123)); 

 // confirm we called charge(123) exactly once, no more, no less
 verify(mockGateway, times(1)).charge(123); 
 verifyNoMoreInteractions(mockGateway); 
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This test is verifying not just the outcome of calling service.charge(...), but how the method interacts with its dependency (PaymentGateway). This is called interaction testing—you're checking that the correct method was called, with the correct data, exactly the right number of times.&lt;/p&gt;

&lt;p&gt;Let’s walk through it line by line:&lt;/p&gt;




&lt;p&gt;🔧 when(mockGateway.charge(123)).thenReturn(true);&lt;br&gt;
You're stubbing the mock so that if charge(123) is called, it returns true. This ensures the service method doesn’t fail due to an unexpected mock return.&lt;/p&gt;




&lt;p&gt;🚀 service.charge(new Order(123));&lt;br&gt;
You're calling the actual method under test. This is where OrderService calls mockGateway.charge(...) internally with the order's amount.&lt;/p&gt;




&lt;p&gt;✅ verify(mockGateway, times(1)).charge(123);&lt;br&gt;
This line is the heart of the test: it verifies that the mock's charge(123) method was called exactly once. If it was never called, or called with a different amount, or called more than once—it’ll fail.&lt;/p&gt;




&lt;p&gt;🛑 verifyNoMoreInteractions(mockGateway);&lt;br&gt;
This adds an extra safety check: you assert that no other interactions with mockGateway happened besides the charge(123) call. It's like saying: “Only this, and nothing else.”&lt;/p&gt;




&lt;p&gt;Why this test is useful&lt;br&gt;
This is a great sanity test to ensure that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Your OrderService is doing what it should (delegating to the gateway)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You’re using that dependency correctly&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No extra or accidental gateway calls sneak in later&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This kind of verification is especially important in systems where external calls (e.g. APIs, payments, emails) need to happen precisely once, and not more.&lt;/p&gt;

&lt;p&gt;Want to enhance this by verifying inputs with argument matchers, or checking that no calls happen for invalid orders? I’d love to show you!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>what is the purpose of aikido security</title>
      <dc:creator>Jasper Aurelio Villas</dc:creator>
      <pubDate>Tue, 17 Jun 2025 17:19:53 +0000</pubDate>
      <link>https://dev.to/imajenasyon/what-is-the-purpose-of-aikido-security-337h</link>
      <guid>https://dev.to/imajenasyon/what-is-the-purpose-of-aikido-security-337h</guid>
      <description>&lt;p&gt;The purpose of Aikido Security is to provide developers and organizations with a comprehensive security platform that integrates seamlessly into their workflows to identify, prioritize, and remediate vulnerabilities across their codebase, cloud infrastructure, and runtime environments. It aims to simplify and automate security processes, enabling teams to build secure applications without slowing down development.&lt;/p&gt;




&lt;p&gt;Key Objectives of Aikido Security&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Protect Codebases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detect vulnerabilities in source code through Static Application Security Testing (SAST).&lt;/li&gt;
&lt;li&gt;Identify exposed secrets like API keys, passwords, and tokens to prevent data breaches.&lt;/li&gt;
&lt;li&gt;Scan open-source dependencies for known vulnerabilities and license risks.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Secure Cloud Infrastructure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analyze Infrastructure-as-Code (IaC) files (e.g., Terraform, Kubernetes) for misconfigurations.&lt;/li&gt;
&lt;li&gt;Monitor cloud environments for compliance with security best practices.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Enhance Runtime Security:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Protect applications during runtime by blocking critical injection attacks and enforcing API rate limits.&lt;/li&gt;
&lt;li&gt;Monitor live environments for suspicious activity.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Streamline Security Workflows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integrate directly into developer tools like GitHub, GitLab, and CI/CD pipelines to catch vulnerabilities early in the development lifecycle.&lt;/li&gt;
&lt;li&gt;Provide actionable insights and automated fixes to reduce manual effort.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Ensure Compliance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Help organizations meet industry standards like SOC 2, ISO 27001, GDPR, and OWASP Top 10 by generating compliance reports and enforcing best practices.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Prioritize and Automate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use AI-powered triage to prioritize critical vulnerabilities and reduce noise.&lt;/li&gt;
&lt;li&gt;Offer auto-remediation for common issues, saving time for developers.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;Why Aikido Security Exists&lt;br&gt;
The primary purpose of Aikido Security is to address the growing complexity of modern application development and the increasing risks of cyberattacks. By consolidating multiple security tools into a single platform, Aikido aims to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Empower developers to take ownership of security without needing deep expertise.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reduce vulnerabilities in applications and infrastructure before they reach production.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improve efficiency by automating repetitive security tasks and integrating seamlessly into existing workflows.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Who Benefits from Aikido Security?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Developers: Gain actionable insights and automated fixes directly in their tools (e.g., GitHub, GitLab).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DevOps Teams: Secure CI/CD pipelines and cloud infrastructure without disrupting workflows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Security Teams: Centralize vulnerability management and ensure compliance with industry standards.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Organizations: Reduce the risk of breaches, improve compliance, and build secure applications faster.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Basic docker app</title>
      <dc:creator>Jasper Aurelio Villas</dc:creator>
      <pubDate>Wed, 04 Jun 2025 21:02:07 +0000</pubDate>
      <link>https://dev.to/imajenasyon/basic-docker-app-4i0i</link>
      <guid>https://dev.to/imajenasyon/basic-docker-app-4i0i</guid>
      <description>&lt;p&gt;Let's start from square one and build a very simple Dockerfile. Imagine Docker as a magic box that lets you package up an application and everything it needs so it runs anywhere. A Dockerfile is like a recipe: it tells Docker which ingredients (base image, files, commands) to combine into your container.&lt;/p&gt;

&lt;p&gt;I'll walk you through creating a very basic Dockerfile that uses Nginx to serve some simple HTML. We'll work step by step.&lt;/p&gt;




&lt;p&gt;Step 1: Install Docker&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Download Docker Desktop: If you haven't installed Docker yet, download and install Docker Desktop.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Confirm Installation: Open your terminal (Command Prompt, PowerShell, or another shell) and&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see Docker's version information, you're ready to go.&lt;/p&gt;




&lt;p&gt;Step 2: Set Up Your Project&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a New Directory: Create a folder for your project. For example, open a terminal and run:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
mkdir my-docker-app
cd my-docker-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create the Files: You'll need at least 2 files in this folder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dockerfile: Contains your Docker instructions.&lt;/li&gt;
&lt;li&gt;index.html: A simple HTML file that Nginx will serve.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;Step 3: Write Your Dockerfile&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open a Text Editor: Use a simple text editor (like Notepad, VS Code, or Notepad++).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write the Dockerfile Commands: In your Dockerfile, type exactly the following (make sure there’s no extra indentation before the commands):&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dockerfile
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;FROM nginx:alpine: This tells Docker to start with the official lightweight Nginx image, running on Alpine Linux.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;COPY index.html /usr/share/nginx/html/index.html: This copies your index.html file from the project folder into Nginx’s default directory for serving web pages.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Save the File: Save this file as Dockerfile (with no extension) in your my-docker-app folder.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;Step 4: Create Your Simple HTML Page&lt;br&gt;
Create the HTML File: In the same my-docker-app folder, create a file called index.html with the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;html
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset="UTF-8"&amp;gt;
    &amp;lt;title&amp;gt;Hello Docker!&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Hello from Docker!&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;This is a very simple web page served by Nginx in a Docker container.&amp;lt;/p&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Save the File: Make sure it is saved as index.html in the same folder as the Dockerfile.
&lt;/h2&gt;

&lt;p&gt;Step 5: Build Your Docker Image&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open Your Terminal: Open a terminal window and navigate to your project folder (my-docker-app).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Build the Image: Run the following command:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bash
docker build -t my-nginx .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What It Does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;docker build tells Docker to build an image.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;-t my-nginx tags the image with the name "my-nginx".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The . at the end tells Docker to use the current directory as the build context (where it finds the Dockerfile and index.html).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Watch the Output: Docker will read your Dockerfile, pull the nginx:alpine image (if not already on your machine), and execute the instructions.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;Step 6: Run Your Docker Container&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run the Container: Once the image is built successfully, run the following command:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bash
docker run -d -p 8080:80 my-nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;docker run starts a new container.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;-d runs the container in detached mode (in the background).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;-p 8080:80 maps port 80 in the container (where Nginx listens) to port 8080 on your host computer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;my-nginx is the name of the image you built.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access the Web Page: Open your web browser and go to &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt;. You should see your “Hello from Docker!” web page.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;Step 7: Explore and Learn More&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List Running Containers: In your terminal, run:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command lists all currently running containers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stop Your Container: Find the container ID from the docker ps output and run:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bash
docker stop &amp;lt;container_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Additional Concepts: Now that you have a basic Dockerfile working, you might explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Volumes: How to persist data outside the container.&lt;/li&gt;
&lt;li&gt;Environment Variables: How to pass configuration into your container.&lt;/li&gt;
&lt;li&gt;Docker Compose: For managing multi-container applications.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;Wrap-Up&lt;br&gt;
Congratulations! You've just created a Dockerfile, built a Docker image, and ran a container that serves a web page using Nginx. These steps provide a hands-on introduction, and you can now experiment by modifying the HTML, changing the Nginx configuration, or even trying out different base images.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>⚔️ Spring Boot Maven Plugin vs Maven Compiler Plugin — What’s the Difference? When you're working on a Spring B</title>
      <dc:creator>Jasper Aurelio Villas</dc:creator>
      <pubDate>Wed, 21 May 2025 09:09:14 +0000</pubDate>
      <link>https://dev.to/imajenasyon/maven-plugin-vs-springboot-plugin-38j8</link>
      <guid>https://dev.to/imajenasyon/maven-plugin-vs-springboot-plugin-38j8</guid>
      <description>&lt;p&gt;When you're working on a Spring Boot project with Maven, you’ve probably seen both spring-boot-maven-plugin and maven-compiler-plugin in the pom.xml. They sound similar, but they serve completely different purposes.&lt;/p&gt;

&lt;p&gt;Let’s break down the difference and when to use each. 👇&lt;/p&gt;




&lt;p&gt;🔧 spring-boot-maven-plugin&lt;br&gt;
This plugin is Spring Boot-specific. It helps you package your application into an executable JAR (or WAR), making it easy to deploy and run.&lt;/p&gt;

&lt;p&gt;✅ What it does:&lt;br&gt;
Packages your app with an embedded server (like Tomcat)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allows mvn spring-boot:run for quick local development&lt;/li&gt;
&lt;li&gt;Bundles all dependencies into a single runnable JAR&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚫 What it doesn’t do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It does not control the Java compiler version&lt;/li&gt;
&lt;li&gt;It does not support annotation processors like Lombok&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;🧰 maven-compiler-plugin&lt;br&gt;
This plugin controls how your Java code is compiled — including setting the Java version and handling annotation processing.&lt;/p&gt;

&lt;p&gt;✅ What it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sets source and target Java versions (e.g., Java 17)&lt;/li&gt;
&lt;li&gt;Adds support for annotation processors like lombok&lt;/li&gt;
&lt;li&gt;Essential for compiling clean, version-compatible code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚫 What it doesn’t do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It does not package your Spring Boot app&lt;/li&gt;
&lt;li&gt;It does not include runtime dependencies or embedded servers&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;🧠 TL;DR — Use Them Together&lt;br&gt;
Plugin  Use it for...&lt;br&gt;
maven-compiler-plugin   Compiling your code with correct Java version and annotation processors&lt;br&gt;
spring-boot-maven-plugin    Packaging and running your Spring Boot application&lt;/p&gt;

&lt;p&gt;Both are essential — just for different parts of the build lifecycle.&lt;/p&gt;

&lt;p&gt;✍️ Sample Setup&lt;/p&gt;

&lt;p&gt;xml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;build&amp;gt;
  &amp;lt;plugins&amp;gt;

    &amp;lt;!-- Compiler plugin for Java version &amp;amp; Lombok support --&amp;gt;
    &amp;lt;plugin&amp;gt;
      &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;3.11.0&amp;lt;/version&amp;gt;
      &amp;lt;configuration&amp;gt;
        &amp;lt;source&amp;gt;17&amp;lt;/source&amp;gt;
        &amp;lt;target&amp;gt;17&amp;lt;/target&amp;gt;
        &amp;lt;annotationProcessorPaths&amp;gt;
          &amp;lt;path&amp;gt;
            &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;1.18.30&amp;lt;/version&amp;gt;
          &amp;lt;/path&amp;gt;
        &amp;lt;/annotationProcessorPaths&amp;gt;
      &amp;lt;/configuration&amp;gt;
    &amp;lt;/plugin&amp;gt;

    &amp;lt;!-- Spring Boot plugin for building the app --&amp;gt;
    &amp;lt;plugin&amp;gt;
      &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;/plugin&amp;gt;

  &amp;lt;/plugins&amp;gt;
&amp;lt;/build&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎯 Tip: If you're seeing unexpected behavior in your Spring Boot build or annotation processing isn't working (like with Lombok), double-check that you're not misusing these plugins.&lt;/p&gt;

&lt;p&gt;Hope this clears up the confusion! 🚀&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Github notification - webhooks</title>
      <dc:creator>Jasper Aurelio Villas</dc:creator>
      <pubDate>Thu, 15 May 2025 09:59:25 +0000</pubDate>
      <link>https://dev.to/imajenasyon/github-notification-webhooks-4jho</link>
      <guid>https://dev.to/imajenasyon/github-notification-webhooks-4jho</guid>
      <description>&lt;p&gt;To send GitHub notifications (like pushes, issues, pull requests, etc.) to a Discord channel, the most common and reliable way is using a Webhook. Here's how you can set that up:&lt;/p&gt;

&lt;p&gt;✅ Step-by-step: GitHub → Discord Webhook&lt;br&gt;
1 Create a Webhook in Discord&lt;br&gt;
Go to your Discord server.&lt;/p&gt;

&lt;p&gt;2.Click the gear icon ⚙️ next to the channel you want GitHub messages to go to.&lt;/p&gt;

&lt;p&gt;3.Go to Integrations &amp;gt; Webhooks.&lt;/p&gt;

&lt;p&gt;4.Click “New Webhook”.&lt;/p&gt;

&lt;p&gt;5.Give it a name (e.g., GitHub Bot) and copy the Webhook URL.&lt;/p&gt;

&lt;p&gt;6.Save changes.&lt;/p&gt;




&lt;p&gt;2 Set up Webhook on GitHub&lt;/p&gt;

&lt;p&gt;1.Go to your GitHub repository.&lt;/p&gt;

&lt;p&gt;2.Click Settings &amp;gt; Webhooks.&lt;/p&gt;

&lt;p&gt;3.Click “Add webhook”.&lt;/p&gt;

&lt;p&gt;4.In the Payload URL, paste the Discord Webhook URL.&lt;/p&gt;

&lt;p&gt;5.Set Content type to: application/json&lt;/p&gt;

&lt;p&gt;6.In “Which events would you like to trigger this webhook?”, choose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ Let me select individual events&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pushes&lt;/li&gt;
&lt;li&gt;Pull requests&lt;/li&gt;
&lt;li&gt;Issues&lt;/li&gt;
&lt;li&gt;Or whatever else you care about&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;7.Leave SSL verification enabled (recommended).&lt;/p&gt;

&lt;p&gt;8.Click “Add webhook”.&lt;/p&gt;




&lt;p&gt;📬 Done!&lt;br&gt;
Now, any selected events (like new pushes or PRs) will show up in your Discord channel.&lt;/p&gt;




&lt;p&gt;🛠 Optional: Use GitHub Actions for custom formatting&lt;br&gt;
If you want nicer messages (with embeds, colors, formatting), you can create a GitHub Action to POST custom messages to the Discord webhook. Let me know if you want help with that setup.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Student benefits part 1</title>
      <dc:creator>Jasper Aurelio Villas</dc:creator>
      <pubDate>Mon, 12 May 2025 10:49:13 +0000</pubDate>
      <link>https://dev.to/imajenasyon/student-benefits-part-1-pd9</link>
      <guid>https://dev.to/imajenasyon/student-benefits-part-1-pd9</guid>
      <description>&lt;p&gt;Congratulations on claiming your free JetBrains Educational License! This license grants you access to the JetBrains All Products Pack, which includes professional-grade IDEs and tools such as IntelliJ IDEA Ultimate, PyCharm Professional, WebStorm, CLion, PhpStorm, DataGrip, Rider, GoLand, RubyMine, and ReSharper Ultimate. These tools are invaluable for developing in various languages and frameworks, including Java, Python, JavaScript, C++, PHP, .NET, Go, and more. &lt;/p&gt;

&lt;p&gt;Beyond the core tools, here are additional benefits you can leverage as a student:&lt;/p&gt;

&lt;p&gt;🎓 JetBrains Academy&lt;br&gt;
JetBrains Academy offers interactive, project-based learning paths in languages like Java, Python, Kotlin, and more. As a student license holder, you can access many of these courses for free or at a discounted rate. &lt;/p&gt;

&lt;p&gt;🎁 Graduation Discount&lt;br&gt;
Upon graduation, JetBrains provides a 40% discount on personal subscriptions for any JetBrains product or the All Products Pack. This discount is valid for up to two years after your student license expires. &lt;/p&gt;

&lt;p&gt;🤝 GitHub Student Developer Pack&lt;br&gt;
If you're part of the GitHub Student Developer Pack, you can also claim JetBrains licenses through GitHub, which might offer additional benefits or integrations. &lt;/p&gt;

&lt;p&gt;🧑‍🏫 Classroom Licenses&lt;br&gt;
If you're involved in teaching or organizing workshops, JetBrains offers free Classroom Licenses for educational institutions. These licenses are ideal for setting up labs or teaching environments. &lt;/p&gt;

&lt;p&gt;🔄 Annual Renewal&lt;br&gt;
Your educational license is valid for one year and can be renewed annually as long as you're still a student. JetBrains typically sends a reminder before expiration, but you can also renew manually through your JetBrains account.&lt;/p&gt;

&lt;p&gt;⚠️ Usage Restrictions&lt;br&gt;
Remember, the educational license is strictly for non-commercial use. It's intended for learning, academic projects, and personal development. Using it for commercial purposes violates the license agreement. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Student benefits part 2</title>
      <dc:creator>Jasper Aurelio Villas</dc:creator>
      <pubDate>Mon, 12 May 2025 10:48:56 +0000</pubDate>
      <link>https://dev.to/imajenasyon/student-benefits-part-2-2o39</link>
      <guid>https://dev.to/imajenasyon/student-benefits-part-2-2o39</guid>
      <description>&lt;p&gt;Yes, aside from JetBrains, Microsoft also offers excellent tools and benefits for students and developers. Here are some key resources you can explore:&lt;/p&gt;

&lt;p&gt;🎓 Microsoft Learn for Students&lt;br&gt;
Offers free learning paths and certifications in areas like Azure, .NET, AI, cybersecurity, and more.&lt;/p&gt;

&lt;p&gt;Great for building skills and earning badges/certifications recognized by employers.&lt;br&gt;
🔗 learn.microsoft.com/training/students&lt;/p&gt;

&lt;p&gt;💼 GitHub Student Developer Pack (includes Microsoft tools)&lt;br&gt;
If you’re a student, you can claim this pack which includes:&lt;/p&gt;

&lt;p&gt;Free access to Microsoft Azure for Students, which includes:&lt;/p&gt;

&lt;p&gt;$100 in Azure credits (renewable annually)&lt;/p&gt;

&lt;p&gt;Free services like App Services, Azure Functions, Cosmos DB, and more.&lt;/p&gt;

&lt;p&gt;Free access to Visual Studio Code Spaces, GitHub Codespaces, and Azure DevOps.&lt;/p&gt;

&lt;p&gt;🔗 education.github.com/pack&lt;/p&gt;

&lt;p&gt;🛠️ Microsoft Developer Tools&lt;br&gt;
Visual Studio Community Edition – A full-featured IDE for .NET, C#, C++, Python, and more (free for students and open-source contributors).&lt;/p&gt;

&lt;p&gt;Visual Studio Code – Lightweight code editor with rich extension support (free and open source).&lt;/p&gt;

&lt;p&gt;.NET SDK – For building modern web, desktop, mobile, and cloud applications.&lt;/p&gt;

&lt;p&gt;🔗 visualstudio.microsoft.com&lt;/p&gt;

&lt;p&gt;☁️ Azure for Students&lt;br&gt;
No credit card needed.&lt;/p&gt;

&lt;p&gt;Comes with $100 free Azure credit, and access to 25+ free products.&lt;/p&gt;

&lt;p&gt;You can deploy websites, train ML models, and run VMs.&lt;/p&gt;

&lt;p&gt;🔗 azure.microsoft.com/free/students&lt;/p&gt;

&lt;p&gt;💡 Bonus Tip&lt;br&gt;
Also check out Microsoft Reactor events and workshops. They often host free coding bootcamps, webinars, and mentorship sessions.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
