/*auto readmore*/ /*auto readmore*/ /* an hien script*/ // an hien password /*an hien ma chuong trinh cong tru */ /*Scrollbox thanh cuon*/ /***Nhung CODE***/ /* dòng xanh dòng trắng */ /* https://cdnjs.com/libraries/prism lay thu vien, can vao ten file ma goi 1. copy link vao vi du:prism-python.min.js 2. ten ngon nua la python */ /*=== New posts ===*/ /*header slider*/ /*=== bai viet lien quan===*/ /*===tabcode===*/

[TIP] SỬA LỖI CHẶN TRUY CẬP SMB GUEST/ANONYMOUS TRÊN WINDOWS SERVER 2019

 Áp dụng khi: Windows Server 2019/2022 kết nối vào NAS hoặc File Server khác qua tài khoản Guest/Anonymous nhưng bị báo lỗi bảo mật (Block) hoặc không tìm thấy đường dẫn dù mạng vẫn thông, nhập mật khẩu đúng

Mở gpedit.msc (Local Group Policy Editor) trên máy Server và cấu hình các mục sau:

0. Trên NAS

  • Enable tài khoảng Guest trên NAS (nếu muốn xem không cần password thì làm mục này)

  • Phân quyền tài khoảng Guest vào phần Share



1. Cho phép đăng nhập Guest không xác thực (Insecure Guest Logons)

  • Đường dẫn: Computer ConfigurationAdministrative TemplatesNetworkLanman Workstation

  • Chính sách: Enable insecure guest logons ➔ Chọn Enabled.



2. Tắt bắt buộc ký số SMB (SMB Client Digitally Sign)

  • Đường dẫn: Computer ConfigurationWindows SettingsSecurity SettingsLocal PoliciesSecurity Options

  • Chính sách 1: Microsoft network client: Digitally sign communications (always) ➔ Chọn Disabled.

  • Chính sách 2: Microsoft network client: Digitally sign communications (if server agrees) ➔ Chọn Enabled.



3. Cấu hình cho phép truy cập Anonymous (Null Session)

  • Đường dẫn: (Vẫn ở mục Security Options bên trên)

  • Chính sách 1: Network access: Restrict anonymous access to Named Pipes and Shares ➔ Chọn Disabled.

  • Chính sách 2: Network access: Shares that can be accessed anonymously ➔ Nhấp đúp và điền tên thư mục Share (Ví dụ: \\192.168.99.111).



4. Áp dụng chính sách và xóa Cache cũ

Mở Command Prompt (Admin) và chạy tuần tự 2 lệnh sau:

DOS
:: 1. Ép hệ thống cập nhật Group Policy ngay lập tức
gpupdate /force

:: 2. Xóa sạch các session kết nối mạng cũ đang bị kẹt/lỗi trong bộ nhớ tạm
net use * /delete /y

Hoàn tất: Sử dụng Windows + R và truy cập lại đường dẫn \\IP_NAS hoặc \\Domain_NAS.

Thay đổi kích thước nhiều ảnh cùng lúc với Python

Kích thước lớn trong Power BI chủ yếu do dung lượng mô hình dữ liệu (Data Model), đặc biệt là các cột có độ phân giải cao và dữ liệu không cần thiết.

Để giảm dung lượng và tăng tốc độ tải, bạn cần:

  1. Loại bỏ các cột không dùng trong Power Query.

  2. Tối ưu hóa kiểu dữ liệu (ví dụ: chuyển từ Decimal sang Fixed Decimal).

  3. Sử dụng chế độ Import hợp lý.

Giảm kích thước file ảnh hàng loạt: Có thể dùng thư viện Python như Pillow (PIL) hoặc OpenCV để tự động thay đổi kích thước, nén chất lượng, và chuyển đổi định dạng ảnh (ví dụ: từ PNG sang JPG) nhằm tối ưu hóa dung lượng lưu trữ.

CODE tham khảo:

import os
from PIL import Image

def resize_image(input_folder, output_folder, max_size): 

    # Tạo thư mục nếu chưa có
    os.makedirs(output_folder, exist_ok=True)

    # max_size Giới hạn kích thước (pixel)
    
    for filename in os.listdir(input_folder):
        if filename.lower().endswith(('.jpg', '.jpeg', '.png')):
            
            img_path = os.path.join(input_folder, filename)
            img = Image.open(img_path)

            # Resize nhưng vẫn giữ tỷ lệ
            img.thumbnail(max_size, Image.LANCZOS)

            # Lưu với chất lượng nén (tối ưu cho Power BI)
            save_path = os.path.join(output_folder, filename)
            img.save(save_path, optimize=True, quality=80)

            print(f"Đã xử lý: {filename}")

if __name__ ==  "__main__":
    # Thư mục nguồn
    scr = r"D:\HocTap\PBI\base64\Pics"
    # Thư mục xuất ảnh sau resize
    dst = r"D:\HocTap\PBI\base64\Pics_resized"
    max_size = (800, 800)

    resize_image(input_folder, output_folder, max_size)


Remove password Protection trong Exel

 

  1. Đổi tên file excel thành file .ZIP
  2. Tìm đến Sheet đang bị protection và copy sheet đó ra ngoài khỏi file ZIP (trong này ví dụ là sheet2 đang bị protection)
  3. Mở file sheet2.xml tìm và xóa nội dung trong cặp thẻ <sheetProtection    />
  4. Lưu file sheet2.xml lại và copy ngược vào file .ZIP
  5. Đổi tên file .ZIP thành file excel lại
  6. Mở lên password đã được remove





[Database-Tự Học SQL] COM2034_SQL Server - Lab 7: SQL Function & View

NỘI DUNG:
Sử dụng hàm do người dùng định nghĩa và tạo khung nhìn view.
➢ Khai báo, tạo function
➢ Thực thi các function
➢ Tạo và sử dụng khung nhìn view

YÊU CẦU:

Bài 1:
Viết các hàm:
Nhập vào MaNV cho biết tuổi của nhân viên này.
Nhập vào Manv cho biết số lượng đề án nhân viên này đã tham gia
Truyền tham số vào phái nam hoặc nữ, xuất số lượng nhân viên theo phái
Truyền tham số đầu vào là tên phòng, tính mức lương trung bình của phòng đó, Cho biết
họ tên nhân viên (HONV, TENLOT, TENNV) có mức lương trên mức lương trung bình
của phòng đó.
Tryền tham số đầu vào là Mã Phòng, cho biết tên phòng ban, họ tên người trưởng phòng
và số lượng đề án mà phòng ban đó chủ trì.


Bài 2: 
Tạo các view:
Hiển thị thông tin HoNV,TenNV,TenPHG, DiaDiemPhg.
Hiển thị thông tin TenNv, Lương, Tuổi.
Hiển thị tên phòng ban và họ tên trưởng phòng của phòng ban có đông nhân viên nhất


THỰC HIỆN:

Bài 1:
Viết các hàm:
➢ Nhập vào MaNV cho biết tuổi của nhân viên này.
-- 1.1. Nhập vào MaNV cho biết tuổi của nhân viên này
CREATE OR ALTER FUNCTION Tuoi_NV (@maNV NVARCHAR(9))
RETURNS INT
AS
BEGIN
  RETURN (SELECT YEAR(GETDATE()) - YEAR(NgSinh) 
      FROM NhanVien 
      WHERE MaNV = @maNV);
END

GO

-- cách gọi hàm kiểm tra tuổi
SELECT dbo.Tuoi_NV('005') AS Tuoi;
GO

-- hoặc
PRINT 'Tuoi cua nhan vien: ' + CAST(DBO.Tuoi_NV('005') AS NVARCHAR(20))
GO

➢ Nhập vào Manv cho biết số lượng đề án nhân viên này đã tham gia
-- 1.2. Nhập vào Manv cho biết số lượng đề án nhân viên này đã tham gia
CREATE OR ALTER FUNCTION SoLuong_DeAnDaThamGia (@maNV NVARCHAR(9))
RETURNS INT
AS
BEGIN
  RETURN (SELECT COUNT(*) 
      FROM PhanCong 
      WHERE Ma_NVien = @maNV);
END

GO

-- gọi hàm
SELECT dbo.SoLuong_DeAnDaThamGia('003') AS SoLuong_DeAnDaThamGia;
GO

➢ Truyền tham số vào phái nam hoặc nữ, xuất số lượng nhân viên theo phái
-- 1.3. Truyền tham số vào phái nam hoặc nữ, xuất số lượng nhân viên theo phái
CREATE OR ALTER FUNCTION SoLuong_NhanVien_TheoPhai (@phai NVARCHAR(4))
RETURNS INT
AS
BEGIN
  RETURN (SELECT COUNT(*) 
      FROM NhanVien 
      WHERE Phai = @phai);
END

GO

-- Gọi hàm
SELECT dbo.SoLuong_NhanVien_TheoPhai(N'Nữ') AS SoLuong_NhanVien;
GO

SELECT dbo.SoLuong_NhanVien_TheoPhai(N'Nam') AS SoLuong_NhanVien;
GO

➢ Truyền tham số đầu vào là tên phòng, tính mức lương trung bình của phòng đó, Cho biết họ tên nhân viên (HONV, TENLOT, TENNV) có mức lương trên mức lương trung bình của phòng đó.
-- 1.4. Truyền tham số đầu vào là tên phòng, tính mức lương trung bình của phòng đó, Cho biết họ tên nhân viên (HONV, TENLOT, TENNV) có mức lương trên mức lương trung bình của phòng đó
CREATE OR ALTER FUNCTION LuongNV_TrenLuongTB (@tenPhG NVARCHAR(15))
RETURNS @nV TABLE (HoTen NVARCHAR(45))
AS
BEGIN
  DECLARE @luongTB FLOAT = (SELECT AVG(Luong) 
                FROM NhanVien 
                WHERE PhG = (SELECT MaPhG FROM PhongBan WHERE TenPhG = @tenPhG));

  INSERT INTO @nV
  SELECT CONCAT(HoNV, ' ', TenLot, ' ', TenNV) -- hoặc dùng concat để nối chuỗi
      FROM NhanVien 
      WHERE Luong > @luongTB;
  
  RETURN;
END

GO

-- Gọi hàm
SELECT *
FROM dbo.LuongNV_TrenLuongTB(N'CNTT');
GO
Hoặc
-- hoặc
CREATE OR ALTER FUNCTION fn_Cau_14 (@tenPhG NVARCHAR(15))
RETURNS TABLE
AS
  RETURN
  (
    SELECT honv,  tenlot, tennv
    FROM nhanvien
    WHERE luong > (
    SELECT AVG(luong) 
    FROM nhanvien
    WHERE phg = (SELECT maphg FROM PhongBan WHERE tenPhG = @tenPhG)
    )
  )
GO
--Gọi Hàm
SELECT *
FROM fn_Cau_14('CNTT')
GO

➢ Tryền tham số đầu vào là Mã Phòng, cho biết tên phòng ban, họ tên người trưởng phòng
và số lượng đề án mà phòng ban đó chủ trì.

-- 1.5. Tryền tham số đầu vào là Mã Phòng, cho biết tên phòng ban, họ tên người trưởng phòng và số lượng đề án mà phòng ban đó chủ trì
CREATE OR ALTER FUNCTION Tim_PhongBan (@maPhg INT)
RETURNS TABLE
AS
  RETURN (SELECT TenPhG, CONCAT(HoNV, ' ', TenLot, ' ', TenNV) AS HoTenNV, COUNT(MaDA) AS SoLuong_DeAn
      FROM PhongBan 
        JOIN NhanVien ON PhongBan.TrPhG = NhanVien.MaNV
        JOIN DeAn ON PhongBan.MaPhG = DeAn.Phong
      WHERE MaPhG = @maPhg
      GROUP BY TenPhG, HoNV, TenLot, TenNV);

GO
-- Gọi hàm
SELECT *
FROM dbo.Tim_PhongBan(5);
GO


Bài 2: 
Tạo các view:
➢ Hiển thị thông tin HoNV,TenNV,TenPHG, DiaDiemPhg.
-- 2.1. Hiển thị thông tin HoNV, TenNV, TenPHG, DiaDiemPhg
CREATE OR ALTER VIEW View_ThongTinNhanVien
AS
	SELECT HoNV, TenNV, TenPhG, DiaDiem
	FROM NhanVien 
		JOIN PhongBan ON NhanVien.PhG = PhongBan.MaPhG
		JOIN DiaDiem_PhG ON PhongBan.MaPhG = DiaDiem_PhG.MaPhG;

GO

-- Thực hiện select dữ liệu trong view vừa tạo
SELECT *
FROM View_ThongTinNhanVien;
GO

➢ Hiển thị thông tin TenNv, Lương, Tuổi.
-- 2.2. Hiển thị thông tin TenNv, Lương, Tuổi
CREATE OR ALTER VIEW View_ThongTinNhanVien_Tuoi
AS
  SELECT TenNV, Luong, YEAR(GETDATE()) - YEAR(NgSinh) AS Tuoi
  FROM NhanVien

GO

SELECT *
FROM View_ThongTinNhanVien_Tuoi;
GO


➢ Hiển thị tên phòng ban và họ tên trưởng phòng của phòng ban có đông nhân viên nhất
-- 2.3. Hiển thị tên phòng ban và họ tên trưởng phòng của phòng ban có đông nhân viên nhất
CREATE OR ALTER VIEW View_PhongBan_MaxNV
AS
  SELECT TOP(1) WITH TIES COUNT(NhanVien.PhG) AS SLNV
    , TenPhG
    , CONCAT(NV.HoNV, ' ', NV.TenLot, ' ', NV.TenNV) AS HoTenTP
  FROM NhanVien
    JOIN PhongBan ON NhanVien.PhG = PhongBan.MaPhG
    JOIN NhanVien NV ON PhongBan.TrPhG = NV.MaNV
  GROUP BY NhanVien.PhG, TenPhG, NV.HoNV, NV.TenLot, NV.TenNV
  ORDER BY SLNV DESC

GO

SELECT *
FROM View_PhongBan_MaxNV;
GO

Xong!

/*header slide*/