QuânSysAd's Blog

15 tháng 11 2025

VBA : Điều chỉnh lại các cột trong bảng của tài liệu word để làm sách song ngữ.

 Sub AdjustThreeColumnTables()

    ' Bỏ qua lỗi và tiếp tục thực thi nếu có bảng không hợp lệ

    On Error Resume Next


    ' Khai báo các biến sẽ được sử dụng

    Dim tbl As Table

    Dim pageWidth As Single

    Dim remainingWidth As Single

    Dim col1and3Width As Single

    Dim cell As Cell


    ' Xác định độ rộng có thể sử dụng của trang giấy (chiều rộng trang trừ đi lề trái và phải)

    With ActiveDocument.PageSetup

        pageWidth = .PageWidth - .LeftMargin - .RightMargin

    End With


    ' Bắt đầu vòng lặp qua từng bảng trong tài liệu

    For Each tbl In ActiveDocument.Tables

        ' Chỉ thực hiện trên các bảng có chính xác 3 cột

        If tbl.Columns.Count = 3 Then

            ' Đảm bảo bảng không tự động điều chỉnh kích thước

            tbl.AllowAutoFit = False

            

            ' Thiết lập loại độ rộng ưa thích thành điểm (points) và đặt độ rộng của bảng sao cho vừa khít trang

            tbl.PreferredWidthType = wdPreferredWidthPoints

            tbl.PreferredWidth = pageWidth

            

            ' Cho phép cột giữa tự động điều chỉnh theo nội dung để có chiều rộng nhỏ nhất có thể

            tbl.Columns(2).AutoFit

            

            ' Tính toán độ rộng còn lại cho hai cột kia

            remainingWidth = pageWidth - tbl.Columns(2).Width

            col1and3Width = remainingWidth / 2

            

            ' Gán độ rộng đã tính cho cột 1 và cột 3

            tbl.Columns(1).Width = col1and3Width

            tbl.Columns(3).Width = col1and3Width

            

            ' Lặp qua từng ô trong cột đầu tiên

            For Each cell In tbl.Columns(1).Cells

                ' Căn đều (justify) nội dung văn bản trong ô

                cell.Range.ParagraphFormat.Alignment = wdAlignParagraphJustify

                ' Thiết lập để văn bản vừa khít với kích thước ô

                cell.FitText = True

            Next cell

            

            ' Lặp qua từng ô trong cột thứ ba

            For Each cell In tbl.Columns(3).Cells

                ' Căn đều (justify) nội dung văn bản trong ô

                cell.Range.ParagraphFormat.Alignment = wdAlignParagraphJustify

                ' Thiết lập để văn bản vừa khít với kích thước ô

                cell.FitText = True

            Next cell

        End If

    Next tbl

    

    ' Thông báo cho người dùng khi quá trình hoàn tất

    MsgBox "Đã hoàn tất việc điều chỉnh các bảng có 3 cột!", vbInformation

End Sub

Cấu hình chạy powershell script trong Task Scheduler

 

Trong mục Start a program cấu hình như sau:
Mục Program/script : điền powershell.exe
Trong mục agrument điền : -File và đường dẫn tới script ps1.


13 tháng 11 2025

Hotspot Window 10 thỉnh thoảng đang chạy một thời gian không kết nối lại được.

 Tốt nhất là tạo script Powershell sau và thực hiện đặt schedule task để chạy lại sau một số khoảng thời gian. 


# Yêu cầu quyền Administrator

# if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))

# {

#     Write-Warning "Script này cần quyền Administrator. Vui lòng chạy PowerShell với quyền Administrator!"

#     Break

# }


Add-Type -AssemblyName System.Runtime.WindowsRuntime


# Tìm phương thức AsTask cho Generic

$asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | Where-Object {

    $_.Name -eq 'AsTask' -and

    $_.GetParameters().Count -eq 1 -and

    $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1'

})[0]


# Function đợi kết quả từ Windows Runtime Async Operation

Function Await($WinRtTask, $ResultType) {

    try {

        $asTask = $asTaskGeneric.MakeGenericMethod($ResultType)

        $netTask = $asTask.Invoke($null, @($WinRtTask))


        # Đợi task hoàn thành

        $completed = $netTask.Wait(30000) # Timeout 30 giây


        if (-not $completed) {

            throw "Operation timed out after 30 seconds"

        }


        # Kiểm tra lỗi

        if ($netTask.IsFaulted) {

            throw $netTask.Exception.InnerException

        }


        return $netTask.Result

    }

    catch {

        Write-Error "Await error: $($_.Exception.Message)"

        throw

    }

}


# Function đợi hoàn thành Windows Runtime Async Action

Function AwaitAction($WinRtAction) {

    try {

        $asTask = ([System.WindowsRuntimeSystemExtensions].GetMethods() | Where-Object {

            $_.Name -eq 'AsTask' -and

            $_.GetParameters().Count -eq 1 -and

            !$_.IsGenericMethod

        })[0]

        $netTask = $asTask.Invoke($null, @($WinRtAction))


        # Đợi task hoàn thành

        $completed = $netTask.Wait(30000) # Timeout 30 giây


        if (-not $completed) {

            throw "Operation timed out after 30 seconds"

        }


        # Kiểm tra lỗi

        if ($netTask.IsFaulted) {

            throw $netTask.Exception.InnerException

        }

    }

    catch {

        Write-Error "AwaitAction error: $($_.Exception.Message)"

        throw

    }

}


try {

    # Load Windows Runtime assemblies

    [Windows.Networking.Connectivity.NetworkInformation, Windows.Networking.Connectivity, ContentType = WindowsRuntime] | Out-Null

    [Windows.Networking.NetworkOperators.NetworkOperatorTetheringManager, Windows.Networking.NetworkOperators, ContentType = WindowsRuntime] | Out-Null


    # Lấy connection profile

    $connectionProfile = [Windows.Networking.Connectivity.NetworkInformation]::GetInternetConnectionProfile()


    if ($null -eq $connectionProfile) {

        Write-Error "Không tìm thấy kết nối Internet. Vui lòng kiểm tra kết nối mạng của bạn."

        Break

    }


    # Tạo tethering manager

    $tetheringManager = [Windows.Networking.NetworkOperators.NetworkOperatorTetheringManager]::CreateFromConnectionProfile($connectionProfile)


    # Kiểm tra khả năng tethering

    # if ($tetheringManager.TetheringCapability -ne 0) {

    #     Write-Warning "Hotspot không khả dụng trên thiết bị này. Lý do: $($tetheringManager.TetheringCapability)"

    #     Break

    # }


    # Kiểm tra trạng thái hiện tại

    if ($tetheringManager.TetheringOperationalState -eq 1) {

        Write-Host "Hotspot đang bat! Đang khoi dong lai..." -ForegroundColor Yellow


        # Tắt hotspot

        $stopResult = Await ($tetheringManager.StopTetheringAsync()) ([Windows.Networking.NetworkOperators.NetworkOperatorTetheringOperationResult])


        if ($stopResult.Status -eq 0) {

            Write-Host "Da bat lai hotspot thanh cong." -ForegroundColor Green

            Start-Sleep -Seconds 2


            # Bật lại hotspot

            $startResult = Await ($tetheringManager.StartTetheringAsync()) ([Windows.Networking.NetworkOperators.NetworkOperatorTetheringOperationResult])


            if ($startResult.Status -eq 0) {

                Write-Host "Da bat lai hotspot thanh cong !" -ForegroundColor Green

            } else {

                Write-Error "Không thể bật lại hotspot. Mã lỗi: $($startResult.Status)"

            }

        } else {

            Write-Error "Không thể tắt hotspot. Mã lỗi: $($stopResult.Status)"

        }

    }

    else {

        Write-Host "Hotspot đang tat! Đang bat len..." -ForegroundColor Yellow


        # Bật hotspot

        $startResult = Await ($tetheringManager.StartTetheringAsync()) ([Windows.Networking.NetworkOperators.NetworkOperatorTetheringOperationResult])


        if ($startResult.Status -eq 0) {

            Write-Host "Da bat hotspot thanh cong!" -ForegroundColor Green

        } else {

            Write-Error "Không thể bật hotspot. Mã lỗi: $($startResult.Status)"

        }

    }

}

catch {

    Write-Error "Đã xảy ra lỗi: $($_.Exception.Message)"

    Write-Host "`nGợi ý khắc phục:" -ForegroundColor Cyan

    Write-Host "1. Chạy PowerShell với quyền Administrator" -ForegroundColor White

    Write-Host "2. Kiểm tra xem thiết bị có hỗ trợ Mobile Hotspot không" -ForegroundColor White

    Write-Host "3. Đảm bảo có kết nối mạng hoạt động (Ethernet hoặc Wi-Fi)" -ForegroundColor White

    Write-Host "4. Kiểm tra Windows Update và driver mạng" -ForegroundColor White

}


05 tháng 11 2025

Wifi Hotspot trong window 10 bị tự tắt hoặc disconnect

 Thực hiện vào network adapter, Direct Virtual Adapter và vào mục config -> Power Management và tắt  Allow the computer to turn off this device to safe power.



01 tháng 11 2025

Dọn rác trong nixos

 

Mục tiêuLệnh
Dọn gói không dùngsudo nix-collect-garbage
Dọn tất cả cũ + rollbacksudo nix-collect-garbage -d
Giữ lại 3 ngày gần nhấtsudo nix-collect-garbage --delete-older-than 3d
Dọn cache tải vềsudo rm -rf /nix/var/nix/downloads
Hợp nhất file trùngsudo nix-store --optimise
Xóa generation cũsudo nix-env --delete-generations old


Mẹo quản lý lâu dài

Thêm vào configuration.nix để tự dọn định kỳ:

{ nix.gc = { automatic = true; dates = "weekly"; options = "--delete-older-than 14d"; }; }

→ Nix sẽ tự chạy nix-collect-garbage mỗi tuần, giữ hệ thống gọn gàng.

Cài gói trong nixos

 

Mục tiêuCách làm
Cài gói vào toàn hệ thốngenvironment.systemPackages = with pkgs; [ ... ];
Cài gói cho usernix profile install nixpkgs#pkg
Cài qua Home Managerhome.packages = with pkgs; [ ... ];
Gỡ góiXóa dòng rồi nixos-rebuild switch
Rollbacksudo nixos-rebuild switch --rollback

23 tháng 10 2025

Lựa chọn Router Microtik cho gói mạng 400Mbps (megabit per second)

 

Trung bình một gói tin trên mạng tầm 600 byte. Nên tính toán dựa vào thông số này.

1) Tính pps cần thiết cho 400 Mbps với gói 600 byte (phải làm từng bước)

  • Kích thước gói = 600 byte = 600 × 8 = 4800 bit.

  • Băng thông = 400 Megabit/s = 400 000 000 bit/s.

  • Số gói/giây = 400 000 000 ÷ 4800.

Bây giờ tính chữ số-một-một:

  • 4800 × 83 333 = 399 998 400.

  • 4800 × 83 334 = 400 003 200.

Nên

pps83333.3 packets/second\text{pps} ≈ 83\,333.3\ \text{packets/second}

Khoảng 83.3k pps (gói 600 byte) để đạt 400 Mbps.

2) So sánh với các dòng MikroTik (dựa trên ước lượng trước đó)

(đã có ước lượng pps ở câu trước)

  • RB750Gr3 / hEX (SOHO): ~200–300k pps ước tính → đủ (còn dư headroom).

  • RB4011: ~2.0 million pps ước tính → rất dư.

  • CCR2004 / CCR1072: hàng chục triệu pps → quá mạnh/overkill cho 400 Mbps.

3) Yếu tố thực tế ảnh hưởng

  • Nếu mạng chỉ routing thuần (không nhiều rule) → con số 83k pps là ít, hầu hết thiết bị SOHO/văn phòng đều xử lý tốt.

  • Nếu bật NAT + nhiều firewall rule / mangle / queues / IPS/IDS / VPN → hiệu năng thực tế có thể giảm đáng kể (thường giảm 30–70% tuỳ mức độ).

    • Ví dụ: sau NAT + firewall nặng, 200–300k pps thực tế của thiết bị nhỏ có thể xuống còn 80–150k pps — vẫn có model vừa vặn nhưng phải kiểm tra.

  • FastTrack / FastPath / connection tracking offload / hardware offload: bật đúng sẽ tăng đáng kể hiệu năng cho NAT/firewall.

4) Khuyến nghị thực tế (dựa trên 400 Mbps, gói 600 B)

  • Nếu mạng bạn đơn giản (web/email, NAT cơ bản, số lượng rule ít): RB750Gr3 (hEX) hoặc tương đương là đủ và chi phí thấp.

  • Nếu có nhiều rule firewall, nhiều kết nối đồng thời, VPN, hoặc muốn dự phòng tăng trưởng: chọn RB4011 (an toàn, nhiều headroom).

  • Nếu bạn chạy dịch vụ nặng (IPS, nhiều VPN/ACLs, HW encryption ở tốc độ cao) hoặc hoạch định mở rộng lớn: cân nhắc CCR2004 trở lên.

5) Các bước tối ưu

  1. Bật FastTrack cho các session TCP/UDP thích hợp.

  2. Giữ rule firewall rõ ràng, sắp xếp rule thường xuyên khớp lên trước.

  3. Dùng hardware offload / switch chip cho bridge nếu có.

  4. Giám sát CPU/conntrack để thấy khi nào cần nâng cấp.


Tóm tắt ngắn: để chạy 400 Mbps với gói 600 byte bạn cần ~83.3k pps. Hầu hết MikroTik phổ thông (RB750Gr3) xử lý được; nếu có nhiều firewall/NAT/VPN hoặc muốn dự phòng, chọn RB4011

17 tháng 10 2025

Fix Sửa máy in in qua mạng chậm, gửi lệnh in rất lâu mới in (ricoh)

 Máy in có hiện tượng in qua mạng chậm, gửi lệnh in rất lâu mới in. Có thể máy đang cấu hình port WSD. Cần chuyển qua cấu hình port sử dụng TCP/IP sẽ nhanh hơn

07 tháng 10 2025

Tìm giá trị có trong một cột

 =IF(COUNTIF(E31:E53, A31)>0, "Đã tồn tại", "Không tồn tại")

26 tháng 9 2025

Excel: Di chuyển tới một hàng bất kỳ

 Nếu cần kéo công thức mà dài ko muốn cuộn chuột thì bấm CTRL -G sau đó chọn cell muốn di chuyển tới ví dụ E1000. Trước khi bấm OK có thể bấm giữ Shift phục vụ mục đích chọn cell để fill value

25 tháng 9 2025

Để chạy m3u8 một số trang cần thêm cả header vào lệnh để chạy

 Để chạy với vlc cần cấu hình nâng cao một chút


https://gist.github.com/milesrichardson/4661c311199b98023701f6cecd3b89b0


Excel dữ liệu là cross join của 2 cột ban đầu

 Bạn có 2 cột E, 4,5,6 và cột F A,B,C

Bạn cần tạo ra bảng là cross join có kết quả như sau:


4 A

4 B

4 B

5 A

5 B 

5 C

6 A

6 B

6 C


ở cột A: =INDEX($E$1:$E$3,INT((ROW()-1)/3)+1)

ở cột B  =INDEX($F$1:$F$54,MOD(ROW()-1,3)+1)



30 tháng 7 2025

Google sheet: Công thức để condition formating đổi màu nền khi cell có giá trị là thứ bảy hoặc chủ nhật ở định dạng cell datetime

 Công thức để condition formating đổi màu nền khi đó là thứ bảy hoặc chủ nhật ở định dạng cell datetime

=OR(WEEKDAY(B5:B35)=7;WEEKDAY(B5:B35)=1)

27 tháng 6 2025

Ricoh mp301spf bị mờ khi in mặc dù đã bơm hộp mực đầy

 Kiểm tra trong trống mực có thể còn ít mực quá, cần tiếp thêm mực vào trống mực (drum) sao cho khi nhìn thanh từ và quay thanh từ thấy mực bám dính vào thanh từ và ko bị trắng quá (bột mực từ không bị mỏng quá)

13 tháng 6 2025

Ricoh mp301spf điều chỉnh độ đậm nhạt sắc nét khi in bị mờ

 Vào sp mode system. Điều chỉnh trong mã code 2908



Máy in ricoh mp301spf bị mờ một sọc dọc khi in

 Nguyên nhân: Có thể kính laser đã bị bám mực in gây mờ. Hãy tháo hộp mực và trống drum máy inra, mở cạnh bên của máy in ra. Mặt kính laser nằm ngay cạnh bên dưới hộp mực. Hãy lấy tăm bông hoặc bông tẩy trang lau nhẹ nhàng mặt kính. Sau đó lắp 

08 tháng 5 2025

Toàn bộ dải mạng của google ngày 08/05/2025

Thôgn tin lấy ở https://www.gstatic.com/ipranges/goog.json

route add 8.8.4.0 mask 255.255.255.0

route add 8.8.8.0 mask 255.255.255.0

route add 8.34.208.0 mask 255.255.240.0

route add 8.35.192.0 mask 255.255.240.0

route add 23.236.48.0 mask 255.255.240.0

route add 23.251.128.0 mask 255.255.224.0

route add 34.0.0.0 mask 255.254.0.0

route add 34.2.0.0 mask 255.255.0.0

route add 34.3.0.0 mask 255.255.254.0

route add 34.3.3.0 mask 255.255.255.0

route add 34.3.4.0 mask 255.255.255.0

route add 34.3.8.0 mask 255.255.248.0

route add 34.3.16.0 mask 255.255.240.0

route add 34.3.32.0 mask 255.255.224.0

route add 34.3.64.0 mask 255.255.192.0

route add 34.4.0.0 mask 255.252.0.0

route add 34.8.0.0 mask 255.248.0.0

route add 34.16.0.0 mask 255.240.0.0

route add 34.32.0.0 mask 255.224.0.0

route add 34.64.0.0 mask 255.192.0.0

route add 34.128.0.0 mask 255.192.0.0

route add 35.184.0.0 mask 255.248.0.0

route add 35.192.0.0 mask 255.252.0.0

route add 35.196.0.0 mask 255.254.0.0

route add 35.198.0.0 mask 255.255.0.0

route add 35.199.0.0 mask 255.255.128.0

route add 35.199.128.0 mask 255.255.192.0

route add 35.200.0.0 mask 255.248.0.0

route add 35.208.0.0 mask 255.240.0.0

route add 35.224.0.0 mask 255.240.0.0

route add 35.240.0.0 mask 255.248.0.0

route add 57.140.192.0 mask 255.255.192.0

route add 64.15.112.0 mask 255.255.240.0

route add 64.233.160.0 mask 255.255.224.0

route add 66.22.228.0 mask 255.255.254.0

route add 66.102.0.0 mask 255.255.240.0

route add 66.249.64.0 mask 255.255.224.0

route add 70.32.128.0 mask 255.255.224.0

route add 72.14.192.0 mask 255.255.192.0

route add 74.114.24.0 mask 255.255.248.0

route add 74.125.0.0 mask 255.255.0.0

route add 104.154.0.0 mask 255.254.0.0

route add 104.196.0.0 mask 255.252.0.0

route add 104.237.160.0 mask 255.255.224.0

route add 107.167.160.0 mask 255.255.224.0

route add 107.178.192.0 mask 255.255.192.0

route add 108.59.80.0 mask 255.255.240.0

route add 108.170.192.0 mask 255.255.192.0

route add 108.177.0.0 mask 255.255.128.0

route add 130.211.0.0 mask 255.255.0.0

route add 136.22.160.0 mask 255.255.240.0

route add 136.22.176.0 mask 255.255.248.0

route add 136.22.184.0 mask 255.255.254.0

route add 136.22.186.0 mask 255.255.255.0

route add 136.124.0.0 mask 255.254.0.0

route add 142.250.0.0 mask 255.254.0.0

route add 146.148.0.0 mask 255.255.128.0

route add 152.65.208.0 mask 255.255.252.0

route add 152.65.214.0 mask 255.255.254.0

route add 152.65.218.0 mask 255.255.254.0

route add 152.65.222.0 mask 255.255.254.0

route add 152.65.224.0 mask 255.255.224.0

route add 162.120.128.0 mask 255.255.128.0

route add 162.216.148.0 mask 255.255.252.0

route add 162.222.176.0 mask 255.255.248.0

route add 172.110.32.0 mask 255.255.248.0

route add 172.217.0.0 mask 255.255.0.0

route add 172.253.0.0 mask 255.255.0.0

route add 173.194.0.0 mask 255.255.0.0

route add 173.255.112.0 mask 255.255.240.0

route add 192.104.160.0 mask 255.255.254.0

route add 192.158.28.0 mask 255.255.252.0

route add 192.178.0.0 mask 255.254.0.0

route add 193.186.4.0 mask 255.255.255.0

route add 199.36.154.0 mask 255.255.254.0

route add 199.36.156.0 mask 255.255.255.0

route add 199.192.112.0 mask 255.255.252.0

route add 199.223.232.0 mask 255.255.248.0

route add 207.223.160.0 mask 255.255.240.0

route add 208.65.152.0 mask 255.255.252.0

route add 208.68.108.0 mask 255.255.252.0

route add 208.81.188.0 mask 255.255.252.0

route add 208.117.224.0 mask 255.255.224.0

route add 209.85.128.0 mask 255.255.128.0

route add 216.58.192.0 mask 255.255.224.0

route add 216.73.80.0 mask 255.255.240.0

route add 216.239.32.0 mask 255.255.224.0

route add 216.252.220.0 mask 255.255.252.0