Egitech

As a highly experienced software developer and team leader, I have had the opportunity to work for various renowned companies in the tech industry. One of my most significant experiences was at Egitech, where I had the chance to work as a bridge between Singapore and Vietnam.

During my time at Egitech, I gained a wealth of knowledge and experience in various areas of software development, including Unit Test/Data Mocking, Code pattern and optimizing for high usage flow, CI/CD, Data synchronization, and much more. I was fortunate to work on some highly challenging projects, which allowed me to push my skills to the limit and expand my knowledge in new directions.

One of my main roles at Egitech was to optimize the entire workflow and system, which was no small feat. However, I was able to achieve this goal by working closely with teams in both Singapore and Vietnam, leveraging my expertise in software development to identify areas that could be improved and implementing innovative solutions that streamlined processes and increased efficiency.

Overall, my experience at Egitech was one of the most rewarding of my career. It allowed me to expand my knowledge and skills in a highly dynamic and fast-paced environment, while also giving me the opportunity to work with some of the brightest minds in the industry. I am confident that the experience I gained at Egitech will continue to serve me well in my future endeavors.

Aspire

During my time at Aspire, I had the opportunity to fully immerse myself in the work and expand my knowledge in areas related to banking and security. As a developer, I was tasked with automating the client’s application review process based on reports from third parties. This involved using Laravel, a powerful PHP framework, to build custom tools and workflows that could streamline the review process and make it more efficient.

One of the key challenges in this project was ensuring that the application review process was secure and met all the necessary compliance requirements. To this end, I had to stay up to date with the latest security standards and best practices, as well as work closely with the Aspire team to identify and address any potential vulnerabilities.

In addition to my technical work, I also had the opportunity to collaborate with other team members and share my knowledge and experience with them. As a result, I was able to help mentor and train junior developers, which was a rewarding experience in its own right.

Overall, my time at Aspire was a valuable learning experience that allowed me to expand my skills and knowledge in new areas. By developing custom tools and workflows, automating the application review process, and staying up to date with the latest security standards, I was able to contribute to the success of the project and help Aspire deliver high-quality services to its clients.

Serdao

At Serdao, I worked as a Team Lead on an eLearning project. My role involved deploying and building all plans from start to finish based on the customer’s initial idea. I was responsible for ensuring that the project met the customer’s requirements and was completed on time and within budget.

In this position, I managed a team of developers and designers, ensuring that they were working efficiently and effectively to deliver high-quality work. I provided guidance and support to team members, ensuring that they had the resources they needed to succeed in their roles.

One of the challenges of working on an eLearning project was dealing with network and facility issues. I was responsible for solving these problems, working with the team to identify the root cause of the issue and finding a solution that would allow us to move forward with the project. This required excellent problem-solving skills and the ability to work well under pressure.

During my time at Serdao, I also had the opportunity to develop my leadership skills further. I learned how to manage project timelines, delegate tasks effectively, and communicate with stakeholders. I also ensured that the team was motivated and had a positive team culture, which helped us to work together more effectively.

In summary, my experience at Serdao allowed me to take on significant responsibility and develop my leadership skills. Working on an eLearning project was challenging, I am grateful for the experience that I had at Serdao and the skills that I developed while working there.

Capgemini

At Capgemini, I am currently working on developing internal tools for HR. The primary tool is based on Drupal, and I have been tasked with customizing it to better meet the needs of the organization. In addition to this, I have also been developing a custom tool on Symfony that is faster and more efficient than the primary Drupal project.

One of the key focuses of my work at Capgemini has been to develop automation tools that can help to streamline HR processes. I have written daily reports that can be generated automatically, eliminating the need for human communication and saving time for HR staff. These reports have been well-received by the organization, and have helped to speed up work and improve efficiency.

In addition to my work on the HR tools, I have also been focused on improving my technical skills. I have learned more about Drupal and Symfony, as well as other tools and technologies that are used in web development. This has helped me to become a more well-rounded developer, and to stay up-to-date with the latest trends in the industry.

Overall, my experience at Capgemini has been challenging and rewarding. I have had the opportunity to work on a variety of projects and to develop my technical and professional skills. Developing internal tools for HR has been particularly interesting, as it has given me a chance to work closely with a business unit and to understand their needs more deeply. I am proud of the work that I have done at Capgemini, and I look forward to continuing to develop my skills and contribute to the organization’s success.

ESXi – Github Runners via Docker

Context của bài toán này là build 1 con Docker để chạy Github Runners ( scaleble ). Và mọi thứ được chạy trong 1 con VM thuộc về ESXi

  • ESXi build 1 con VMWare chạy Ubuntu Server 20.04 . Cái này dễ dàng không có gì bàn cãi
  • Và tất nhiên sau đó sẽ setup Docker ( không cần chạy without sudo cũng được )

Và ta có 1 file docker-compose sau

version: "3.7"

services:
  runner:
    image: myoung34/github-runner:latest
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      RUNNER_SCOPE: repo
      RUNNER_NAME_PREFIX: runner
      LABELS: ubuntu,x64
      REPO_URL: <repository_url>
      EPHEMERAL: 1
      ACCESS_TOKEN: <github_token>
    deploy:
      replicas: 4
      resources:
        limits: // Giới hạn tối đa
          cpus: '1'
          memory: 2G
        reservations: // Tối thiểu
          cpus: '1'
          memory: 1G

Và giờ chỉ cần chạy docker-compose up -d

Tuy nhiên câu chuyện chưa hết vui !!! Do bản chất ta đang chạy qua Docker. Do đó việc build các service ( cũng qua docker ) lại không khả thi. Cụ thể là ta cần build MySQL / Redis etc … Vậy thì sao ???

…. tách em nó ra 1 VM khác và update lại IP về con VM đó thôi 😀 . Chút mất công nhưng cơ bản đã dễ dàng rất nhiều.

Từ giờ con VM chạy Runners ta tạo n folder, mỗi folder cho 1 docker-compose ứng với 1 repository

Template Method

Template Method là một design pattern trong đó một khuôn mẫu được định nghĩa, chứa một số bước cơ bản của một thuật toán, trong khi các bước cụ thể được định nghĩa bởi các lớp con. Khuôn mẫu này đảm bảo rằng các bước cơ bản của thuật toán được thực hiện theo cùng một cách, nhưng cách thức cụ thể của từng bước có thể được thay đổi bởi các lớp con.

abstract class Report {
    public function generate() {
        $this->setData();
        $this->formatData();
        $this->generateOutput();
    }
    
    abstract protected function setData();
    
    protected function formatData() {
        // default implementation
    }
    
    abstract protected function generateOutput();
}

class PdfReport extends Report {
    protected function setData() {
        // set data for pdf report
    }
    
    protected function generateOutput() {
        // generate pdf output
    }
}

class ExcelReport extends Report {
    protected function setData() {
        // set data for excel report
    }
    
    protected function generateOutput() {
        // generate excel output
    }
}

Trong đoạn code này, Report là một abstract class định nghĩa khuôn mẫu cho việc tạo ra báo cáo. Phương thức generate() định nghĩa các bước cơ bản trong việc tạo ra báo cáo, bao gồm setData(), formatData()generateOutput(). Trong đó, setData()generateOutput() là các phương thức trừu tượng và phải được định nghĩa bởi các lớp con. Trong khi đó, formatData() có một implementation mặc định, nhưng có thể được ghi đè bởi các lớp con nếu cần thiết.

Các lớp con, như PdfReportExcelReport, kế thừa từ Report và định nghĩa các phương thức trừu tượng để thực hiện các bước cụ thể trong việc tạo ra báo cáo. Ví dụ, PdfReport định nghĩa setData() để thiết lập dữ liệu cho báo cáo PDF, và generateOutput() để tạo ra đầu ra PDF. Tương tự, ExcelReport định nghĩa setData()generateOutput() để tạo ra báo cáo Excel.

Khi chúng ta muốn tạo ra một báo cáo, chúng ta có thể tạo một đối tượng của lớp con và gọi phương thức generate(). Phương thức này sẽ thực hiện các bước cơ bản của thuật toán và gọi các phương thức cụ thể của lớp con để thực hiện các bước cụ