Đăng bởi Để lại phản hồi

Cài Redmine trên Ubuntu + Nginx + MySQL

í dụ dưới đây dùng:

  • Ubuntu 24.04
  • MySQL 8
  • Ruby 3.2
  • Nginx
  • Passenger
  • Redmine 6

Tài liệu chính thức: Redmine Installation Guide


1. Cập nhật hệ thống

sudo apt update && sudo apt upgrade -y

2. Cài package cần thiết

sudo apt install -y \
build-essential \
zlib1g-dev \
libssl-dev \
libreadline-dev \
libyaml-dev \
libcurl4-openssl-dev \
libffi-dev \
libgdbm-dev \
libncurses5-dev \
libmariadb-dev \
imagemagick \
apache2-utils \
git \
curl \
gnupg2

3. Cài Ruby + Bundler

Ubuntu 24 đã có Ruby 3.2:

sudo apt install -y ruby-full

Kiểm tra:

ruby -v

Cài bundler:

sudo gem install bundler

Kiểm tra:

bundle -v

4. Cài MySQL

Cài:

sudo apt install -y mysql-server

Secure:

sudo mysql_secure_installation

5. Tạo database cho Redmine

Đăng nhập MySQL:

sudo mysql

Tạo DB:

CREATE DATABASE redmine CHARACTER SET utf8mb4;

Tạo user:

CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'StrongPassword123!';

Cấp quyền:

GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';
FLUSH PRIVILEGES;
EXIT;

6. Download Redmine

Trang chính thức:
Redmine Downloads

Ví dụ:

cd /var/www
sudo wget https://www.redmine.org/releases/redmine-6.0.3.tar.gz
sudo tar -xzf redmine-6.0.3.tar.gz
sudo mv redmine-6.0.3 redmine

7. Tạo user chạy Redmine

sudo adduser --system --group --home /var/www/redmine redmine

Set quyền:

sudo chown -R redmine:redmine /var/www/redmine

8. Cấu hình database.yml

Copy file mẫu:

cd /var/www/redmine/config
sudo cp database.yml.example database.yml

Edit:

sudo nano database.yml

Sửa phần production:

production:
adapter: mysql2
database: redmine
host: localhost
username: redmine
password: "StrongPassword123!"
encoding: utf8mb4

9. Install gem

Đăng nhập user redmine:

sudo su - redmine

Vào thư mục:

cd /var/www/redmine

Config bundle local:

bundle config set --local path 'vendor/bundle'
bundle config set --local without 'development test'

Install:

bundle install

10. Generate secret + migrate DB

bundle exec rake generate_secret_token
RAILS_ENV=production bundle exec rake db:migrate

Load default data:

RAILS_ENV=production bundle exec rake redmine:load_default_data

Chọn language:

en

11. Cài Nginx + Passenger

Cài:

sudo apt install -y nginx libnginx-mod-http-passenger

Neu loi cai theo cach nay

1. Xoá config Passenger cũ

sudo rm -f /etc/apt/sources.list.d/passenger.list
sudo rm -f /usr/share/keyrings/passenger.gpg

2. Cài package cần thiết

sudo apt update

sudo apt install -y \
curl \
gnupg2 \
ca-certificates \
apt-transport-https

3. Add GPG key mới

curl -fsSL https://oss-binaries.phusionpassenger.com/auto-software-signing-gpg-key-2025.txt \
| sudo gpg --dearmor -o /usr/share/keyrings/passenger.gpg

4. Add repo Ubuntu 24 (noble)

echo "deb [signed-by=/usr/share/keyrings/passenger.gpg] https://oss-binaries.phusionpassenger.com/apt/passenger noble main" \
| sudo tee /etc/apt/sources.list.d/passenger.list

5. Update package list

sudo apt update

6. Kiểm tra package Passenger

apt search passenger

Bạn phải thấy:

libnginx-mod-http-passenger

7. Cài Passenger

sudo apt install -y libnginx-mod-http-passenger

8. Restart nginx

sudo systemctl restart nginx

Kiểm tra passenger:

sudo nginx -V 2>&1 | grep passenger

12. Cấu hình Nginx

Tạo config:

sudo nano /etc/nginx/sites-available/redmine

Nội dung:

server {
listen 80;
server_name YOUR_DOMAIN_OR_IP;

root /var/www/redmine/public;

passenger_enabled on;
passenger_ruby /usr/bin/ruby;

client_max_body_size 20m;

location / {
try_files $uri/index.html $uri @app;
}

location @app {
passenger_enabled on;
}
}

Enable site:

sudo ln -s /etc/nginx/sites-available/redmine /etc/nginx/sites-enabled/

Disable default:

sudo rm /etc/nginx/sites-enabled/default

Test:

sudo nginx -t

Restart:

sudo systemctl restart nginx

13. Mở firewall

sudo ufw allow 80/tcp

Nếu HTTPS:

sudo ufw allow 443/tcp

14. Truy cập

Mở:

http://YOUR_SERVER_IP

Login mặc định:

admin
admin

15. Cài HTTPS bằng Let’s Encrypt

Cài certbot:

sudo apt install -y certbot python3-certbot-nginx

Chạy:

sudo certbot --nginx

16. Service cần kiểm tra

systemctl status nginx
systemctl status mysql

17. Log khi lỗi

Redmine:

tail -f /var/www/redmine/log/production.log

Nginx:

sudo tail -f /var/log/nginx/error.log

18. Backup MySQL

mysqldump -u redmine -p redmine > redmine.sql
Đăng bởi 1 phản hồi

Pipeline with dotnet public git

pipeline {
agent any

// If using the .NET SDK plugin, wrap steps in this block
/* 
tools {
    dotnetsdk 'dotnet-8' 
}
*/

stages {
    stage('Checkout') {
        steps {
            git  branch: 'main',
                url:'https://github.com/congduan2811/DemoJenkins.git'
        }
    }

   stage('Restore') {
        steps {
            sh 'dotnet restore' // Use 'bat' for Windows
        }
    }
    stage('Build') {
        steps {
            sh 'dotnet build --configuration Release'
        }
    }
    stage('Test') {
        steps {
            sh 'dotnet test'
        }
    }
    stage('Publish') {
        steps {
            sh 'dotnet publish -c Release -o ./publish'
        }
    }
}

}

Đăng bởi Để lại phản hồi

Cài đặt jenkins trên Ubuntu

Installation of Java

sudo apt update
sudo apt install fontconfig openjdk-21-jre
java -version

Installation of Jenkins

sudo wget -O /etc/apt/keyrings/jenkins-keyring.asc \
https://pkg.jenkins.io/debian/jenkins.io-2026.key
echo "deb [signed-by=/etc/apt/keyrings/jenkins-keyring.asc]" \
https://pkg.jenkins.io/debian binary/ | sudo tee \
/etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt update
sudo apt install jenkins

Unlocking Jenkins

Browse to http://localhost:8080 (or whichever port you configured for Jenkins when installing it) and wait until the Unlock Jenkins page appears.

Đăng bởi Để lại phản hồi

Sách hướng dẫn dạy trẻ mầm non lớp nhà trẻ

  1. Cẩm nang dạy trẻ: https://giamkichsan.com/uploads/document/0f5103f4-6cf4-4bb0-822f-8626ad26d325/6f2a0b97-a0c8-4597-a302-0a1adc43c2e6.pdf
  2. Giáo án trẻ 24 đến 36 tháng: https://giamkichsan.com/uploads/document/0f5103f4-6cf4-4bb0-822f-8626ad26d325/c62a2f4f-5d5d-4cff-81c6-e168ec409f6f.pdf
  3. Giao thông đường bộ: https://giamkichsan.com/uploads/document/0f5103f4-6cf4-4bb0-822f-8626ad26d325/5791d4b2-7efd-4366-8b7a-b6675a8ab9ea.pdf
  4. Phát triển nhận thức của trẻ: https://giamkichsan.com/uploads/document/0f5103f4-6cf4-4bb0-822f-8626ad26d325/1792c0c8-d451-422c-8354-8c2af9295f83.pdf

Đăng bởi Để lại phản hồi

Code Coverage (Độ bao phủ mã nguồn) 

Trong Visual Studio, Code Coverage (Độ bao phủ mã nguồn) là một tính năng giúp bạn xác định xem có bao nhiêu phần trăm mã nguồn của dự án đã được chạy qua bởi các bài kiểm thử đơn vị (Unit Tests)

1. Mục đích của Code Coverage

  • Đánh giá chất lượng kiểm thử: Giúp bạn biết những phần nào của code đã được kiểm tra và những phần nào còn bị bỏ sót.
  • Giảm thiểu rủi ro: Phát hiện các đoạn code “chết” hoặc các logic chưa bao giờ được thực thi, từ đó giảm thiểu lỗi tiềm ẩn khi vận hành.
  • Định hướng viết Test: Dựa vào báo cáo coverage, lập trình viên có thể bổ sung các test case cho những vùng code chưa được bao phủ. 

2. Các chỉ số đo lường phổ biến

Thông thường, Visual Studio cung cấp các loại bao phủ sau:

  • Line/Statement Coverage: Đo lường tỷ lệ các dòng code được thực thi.
  • Branch/Decision Coverage: Kiểm tra xem các nhánh của câu lệnh điều kiện (if/else, switch) đã được chạy qua hết các trường hợp đúng/sai chưa. semiconvn.comsemiconvn.com +1

3. Cách sử dụng trong các phiên bản Visual Studio

Tính năng này có sự khác biệt tùy thuộc vào phiên bản bạn đang dùng:

  • Visual Studio Enterprise: Đây là phiên bản cao cấp tích hợp sẵn công cụ Analyze Code Coverage mạnh mẽ trong menu Test.
  • Visual Studio Community/Professional: Các phiên bản này thường không tích hợp sẵn tính năng báo cáo coverage chi tiết. Tuy nhiên, bạn có thể sử dụng các tiện ích mở rộng (extensions) miễn phí hoặc thư viện bên thứ ba:
    • Fine Code Coverage: Một extension phổ biến và miễn phí cho Visual Studio giúp hiển thị kết quả ngay trong IDE.
    • Coverlet: Một thư viện cross-platform cho .NET dùng để thu thập dữ liệu coverage.
    • ReportGenerator: Công cụ giúp chuyển đổi dữ liệu thô từ các bộ quét coverage thành báo cáo HTML dễ đọc. 

4. Cách xem kết quả

Khi chạy Code Coverage, Visual Studio thường hiển thị:

  • Bảng thống kê: Cho biết tỷ lệ % bao phủ của từng Project, Namespace, Class và Method.
  • Đánh dấu màu sắc trực tiếp trên Code:
    • Màu xanh: Dòng code đã được thực thi bởi ít nhất một test case.
    • Màu đỏ: Dòng code chưa được chạy qua.
    • Màu vàng: Dòng code chứa điều kiện và chỉ một phần của nhánh điều kiện được thực thi. semiconvn.com
Đăng bởi Để lại phản hồi

PostgreSQL trên Ubuntu

1. Cài PostgreSQL

sudo apt update
sudo apt upgrade -y
sudo apt install postgresql postgresql-contrib -y
   -- postgresql: database server
   -- postgresql-contrib: các extension hữu ích
sudo systemctl status postgresql -- Kiểm tra trạng thái PostgreSQL

2. Đăng nhập vào PostgreSQL

2.1 PostgreSQL tạo user mặc định là postgres.
sudo -i -u postgres
psql
-- Nếu thành công bạn sẽ thấy:
postgres=#
-- Thoát:
\q
2.2 Tạo database và user mới (khuyến nghị)
-- Tạo user:
CREATE USER username WITH PASSWORD 'password';

-- Tạo database:
CREATE DATABASE dbname;

-- Tạo và Gán database cho user:
CREATE DATABASE mydb OWNER myuser;

-- Đổi mật khẩu:
ALTER USER username WITH PASSWORD 'new_password';
2.3 Kiểm tra version
psql --version

3. Đăng nhập từ Terminal

Cú pháp:

psql -U username -d database_name -h localhost -W

Ví dụ:

psql -U myuser -d mydb -h localhost -W

Giải thích:

  • -U : username PostgreSQL
  • -d : database muốn truy cập
  • -h : host (localhost)
  • -W : yêu cầu nhập password

Sau đó nhập password của user.

4. Cấp quyền (nếu cần)

-- Cho phép user tạo database:
ALTER USER devuser CREATEDB;

-- Cho phép quyền admin (chỉ dùng khi thật sự cần):
ALTER USER devuser WITH SUPERUSER;

-- Kiểm tra danh sách user:
\du

-- Đăng nhập bằng user mới
psql -U devuser -d devdb -h localhost -W
6. Kiểm tra Post bằng cách Kiểm tra trong file cấu hình (chuẩn nhất)

Mở file: sudo nano /etc/postgresql/*/main/postgresql.conf

Tìm dòng: port = 5432

7. Nếu bạn muốn login PostgreSQL bằng password từ localhost, có thể cần chỉnh file
/etc/postgresql/<version>/main/pg_hba.conf

đổi: peer => thành: md5

Sau đó restart: sudo systemctl restart postgresql

-- Nếu không login được: đổi md5 sang trust
-- Restart: sudo systemctl restart postgresql
-- đổi mật khẩu: ALTER USER postgres WITH PASSWORD 'newpassword';
-- đổi lại từ trust về md5 để đảm bảo bảo mật
-- Restart: sudo systemctl restart postgresql

Đăng bởi Để lại phản hồi

WinRAR (.rar) trong Ubuntu

✅ Cách 1: Giải nén bằng giao diện (GUI)

Ubuntu thường đã có sẵn trình Archive Manager.

Bước 1: Cài đặt hỗ trợ RAR (nếu chưa có)

Mở Terminal và chạy:

sudo apt update
sudo apt install unrar

Hoặc nếu cần bản miễn phí:

sudo apt install unrar-free

Bước 2:

  • Nhấp chuột phải vào file .rar
  • Chọn Extract Here (Giải nén tại đây) hoặc Extract To…

✅ Cách 2: Giải nén bằng Terminal

📌 Giải nén vào thư mục hiện tại:

unrar x tenfile.rar

📌 Giải nén vào thư mục khác:

unrar x tenfile.rar /duongdan/thu_muc/

📌 Chỉ xem nội dung file rar:

unrar l tenfile.rar

⚠ Nếu bị lỗi “command not found”

Cài đặt lại:

sudo apt install unrar
Đăng bởi Để lại phản hồi

bài hn

$(‘#myTable’).DataTable({
dom:
‘rt’ +
“<‘dt-bottom'<‘dt-info’i><‘dt-length’l><‘dt-paging’p>>”
});

.dt-bottom {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 10px;
}

.dt-bottom .dt-length select {
margin: 0 5px;
}

Đăng bởi Để lại phản hồi

Thể hiện ràng buộc khóa ngoại (Foreign Key) trong Entity Framework (EF / EF Core)

✅ Cách 1 (Khuyến nghị): Convention (Theo quy ước EF)

EF tự nhận diện Foreign Key nếu bạn đặt tên đúng quy ước.

Ví dụ: Quan hệ 1–n (User – Orders)

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<Order> Orders { get; set; }
}

public class Order
{
    public int Id { get; set; }

    // Foreign Key
    public int UserId { get; set; }

    // Navigation property
    public User User { get; set; }
}

👉 EF sẽ tự hiểu:

  • UserId là khóa ngoại
  • Order.User liên kết tới User.Id

📌 Không cần cấu hình thêm


✅ Cách 2: Data Annotation [ForeignKey]

Dùng khi tên FK không theo quy ước hoặc muốn rõ ràng hơn.

using System.ComponentModel.DataAnnotations.Schema;

public class Order
{
    public int Id { get; set; }

    public int CreatedBy { get; set; }

    [ForeignKey("CreatedBy")]
    public User User { get; set; }
}

Hoặc ngược lại:

public class Order
{
    public int Id { get; set; }

    [ForeignKey(nameof(User))]
    public int UserId { get; set; }

    public User User { get; set; }
}

✅ Cách 3: Fluent API (Chuẩn & mạnh nhất)

Dùng khi:

  • Quan hệ phức tạp
  • Composite Key
  • Cấu hình cascade delete, required, optional…

Ví dụ 1–n:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Order>()
        .HasOne(o => o.User)
        .WithMany(u => u.Orders)
        .HasForeignKey(o => o.UserId)
        .OnDelete(DeleteBehavior.Cascade);
}

🔹 Quan hệ 1–1

modelBuilder.Entity<User>()
    .HasOne(u => u.Profile)
    .WithOne(p => p.User)
    .HasForeignKey<UserProfile>(p => p.UserId);

🔹 Quan hệ n–n (EF Core 5+)

modelBuilder.Entity<Student>()
    .HasMany(s => s.Courses)
    .WithMany(c => c.Students);

Hoặc có bảng trung gian:

modelBuilder.Entity<StudentCourse>()
    .HasKey(sc => new { sc.StudentId, sc.CourseId });
Đăng bởi Để lại phản hồi

Các câu lệnh trong git

  1. CHI TIẾT từng bước REVERT cho trường hợp đã merge và đã push lên GitHub server

🔹 Bước 1: Checkout vào branch đã bị merge

Ví dụ merge vào main:

git checkout main
git pull

📌 Đảm bảo bạn đang ở branch đúngcode mới nhất


🔹 Bước 2: Tìm merge commit

git log --oneline

Bạn sẽ thấy dạng như:

a1b2c3d Merge branch 'feature/login' into main

👉 Copy hash (a1b2c3d)


🔹 Bước 3: Revert merge commit

git revert -m 1 a1b2c3d

📌 Giải thích -m 1

  • 1 = giữ branch main
  • undo toàn bộ thay đổi từ branch được merge vào

⚠️ BẮT BUỘC phải có -m khi revert merge


🔹 Bước 4: Resolve conflict (nếu có)

Nếu Git báo conflict:

git status
  • Mở file bị conflict
  • Sửa
  • Sau đó:
git add .
git revert --continue

🔹 Bước 5: Push lên GitHub

git push

🎉 Xong! Merge đã được undo an toàn


✅ Kết quả bạn sẽ thấy

  • GitHub có commit mới dạng: Revert "Merge branch 'feature/login' into main"
  • Code quay về trạng thái trước khi merge
  • Lịch sử vẫn rõ ràng 👌

🟢 Cách khác (nếu merge bằng Pull Request)

👉 Vào Pull Request đã merge
👉 Bấm Revert
👉 GitHub tự tạo PR undo

✔️ Không cần terminal
✔️ Rất an toàn