Thứ Tư, 30 tháng 7, 2025

AI ĐÂU TRỞ LẠI MÙA THU TRƯỚC



Blog này một thời gian dài bị bỏ quên, nhưng đồng thời tác giả của nó cũng đã quên đi nhiều thứ trong đời. Vì vậy nó được hồi sinh để ghi lại nhưng điều nên nhớ như của một người bị bệnh memento mà muốn lưu giữ lại tất cả.


You left me and went on your way.
I thought I should mourn for you and set your solitary image in my heart wrought in a golden song.
But ah, my evil fortune, time is short.
Youth wanes year after year; the spring days are fugitive; the frail flowers die for nothing, and the wise man warns me that life is but a dewdrop on the lotus leaf.
Should I neglect all this to gaze after one who has turned her back on me?
That would be rude and foolish, for time is short.
Then, come, my rainy nights with pattering feet; smile, my golden autumn; come, careless April, scattering your kisses abroad.
You come, and you, and you also!
My loves, you know we are mortals.
Is it wise to break one’s heart for the one who takes her heart away? For time is short.
It is sweet to sit in a corner to muse and write in rhymes that you are all my world.
It is heroic to hug one’s sorrow and determine not to be consoled.
But a fresh face peeps across my door and raises its eyes to my eyes.
I cannot but wipe away my tears and change the tune of my song.
For time is short.

Tagore Rabindranath - The gardener






Thứ Tư, 23 tháng 7, 2025

Nom Na Tong

Render font Nom Na Tong

\documentclass[11pt]{article}
\usepackage{fontspec}
\setmainfont{NomNaTong-Regular}
\usepackage{luacode}
\usepackage{longtable,array,xcolor,listings}
\begin{luacode*} 
function print_glyphs(maxCols,maxChars) 
  local id = font.current()         -- get Font ID
  local fnt = font.getfont(id)
  local col = 1
  local maxU4 = 15*(16^3+16^2+16+1)
  a = {}
  for k, v in pairs(fnt.characters) do
    a [#a + 1] = k
  end
  table.sort(a)
  for i, k in ipairs(a) do
    if i >= maxChars then break end
    if col == 1 then
      if k > maxU4 then
        tex.sprint(string.format("U+%06x", k))
      else
        tex.sprint(string.format("U+%04x", k))
      end
      tex.sprint("&") 
    end
    if (i) then
      tex.sprint(string.format([[\char%i]], k))
    else
     tex.sprint("~")
    end
    if col == maxCols then              -- Line finished?
      tex.sprint([[\\\cline{2-]] .. maxCols+1 .. "} ")  -- Yes
      col = 1                           -- newline
    else
      tex.sprint("&")                   -- no, Print &
      col = col + 1                     -- next column
    end
  end
end
\end{luacode*}


\begin{document}

\color{black!20}

\begin{longtable}{>{\color{black!50}\ttfamily\footnotesize}r|
                  *{10}{>{\color{black}}p{1.5em}|}}
\cline{2-11}
\endhead


\directlua{print_glyphs(10,65463)} \\ \cline{2-11}
\end{longtable}

\end{document}

Tách một file pdf gồm 90 trang ra 90 file pdf

Công việc này thực hiện trên MacBook
  1. Cài đặt công cụ (nếu chưa có):
    sudo apt-get install poppler-utils # Ubuntu/Debian brew install poppler # macOS

     

  2. Tạo script split_pdf.sh:
    #!/bin/bash input_pdf="input.pdf" # Thay tên file PDF gốc output_prefix="page" # Tiền tố tên file output # Tách từng trang thành file riêng pdfseparate "$input_pdf" "${output_prefix}_%d.pdf"

     

  3. Chạy script:
    chmod +x split_pdf.sh ./split_pdf.sh

     

Kết quả: page_1.pdf, page_2.pdf, ..., page_90.pdf

 

Thứ Ba, 22 tháng 7, 2025

Tô màu và viết tên tỉnh vào bản đồ Việt Nam 34 tỉnh/thành

Đặt vấn đề. Bài toán tô màu bản đồ trong tô-pô (thường gọi là Định lý Bốn Màu) là một trong những bài toán nổi tiếng nhất của toán học, liên quan mật thiết đến tô-pô và lý thuyết đồ thị. Dưới đây là giải thích chi tiết:

I. Bản chất bài toán:
  1. Mục tiêu: Tìm số màu tối thiểu để tô một bản đồ sao cho hai vùng liền kề (có chung đường biên dài, không chỉ điểm) luôn khác màu.  

  2. Yêu cầu tô-pô: Bài toán không phụ thuộc vào hình dạng hay kích thước vùng, chỉ quan tâm đến quan hệ liền kề. Đây chính là đặc trưng của tô-pô (bảo toàn qua phép biến hình liên tục).
1. Định lý Bốn Màu (1976): Mọi bản đồ phẳng (hoặc mọi đồ thị phẳng) đều có thể tô bằng tối đa 4 màu mà không có hai vùng kề nhau cùng màu.

  Ví dụ:
Bản đồ Việt Nam: Các tỉnh giáp nhau cần tô khác màu.
Bản đồ Thế giới: Các quốc gia láng giềng khác màu.
 
2. Tại sao là bài toán tô-pô?  

Tính chất bất biến: Kết quả (số màu tối thiểu) không thay đổi nếu bản đồ bị kéo giãn, uốn cong (phép đồng phôi trong tô-pô).
Quy về đồ thị phẳng: Mỗi bản đồ được biểu diễn thành đồ thị (graph):
Đỉnh: Đại diện cho vùng.
Cạnh: Nối hai đỉnh nếu hai vùng liền kề.
Định lý khẳng định: Đồ thị phẳng luôn có sắc số ≤ 4.
 
3. Lịch sử và giải pháp  

1852: Francis Guthrie đưa ra bài toán.
1890: Percy Heawood chứng minh định lý Năm Màu (đủ cho mọi bản đồ).
1976: Kenneth Appel và Wolfgang Haken chứng minh thành công Định lý Bốn Màu bằng cách:
Sử dụng máy tính để kiểm tra 1.476 cấu hình cơ bản.
Gây tranh cãi vì là chứng minh đầu tiên dựa vào máy tính.
 
4. Ngoại lệ và lưu ý  

Vùng tách rời (như Alaska của Mỹ): Xem như vùng độc lập, không cần cùng màu với "chính quốc".
Bản đồ không phẳng: Cần nhiều màu hơn (ví dụ: Bản đồ trên hình xuyến cần 7 màu).
 
6. Ý nghĩa toán học  

Mở ra hướng nghiên cứu lý thuyết đồ thị và tô-pô tổ hợp.
Minh chứng cho sự kết hợp giữa toán học trừu tượng và công nghệ máy tính.
 
II. Bản đồ Việt Nam 34 tỉnh thành  

Ở đây chúng tôi dùng $\rm \LaTeX$ để liệt kê 34 tỉnh/thành. Do vấn đề chủ quyền, chúng tôi liệt kê thêm 2 đặc khu trực thuộc Tỉnh/Thành phố.
  Đặc khu Hoàng Sa trực thuộc Thành phố Đà Nẵng.
  Đặc khu Trường Sa trực thuộc Tỉnh Khánh Hòa.
  Các hòn đảo còn lại trực thuộc tỉnh sẽ có màu cùng màu với tỉnh chứa các đảo đó, ví dụ Đảo Phú Quốc cùng màu với tỉnh An Giang, Đảo Hòn Khoai cùng màu với tỉnh Cà Mau v.v…

III. Dùng $\rm \LaTeX$ viết thêm tên tỉnh vào Bản đồ Việt Nam

Bước 1: Xác định hệ trục tọa độ và kẻ carô bản đồ để quan sát tọa độ của 1 điểm trên bản đồ.

\documentclass[10pt]{article}
\usepackage[utf8]{vietnam}
\usepackage{utopia} 
\usepackage[pdftex]{graphicx}
\usepackage{multido} 
\usepackage{wallpaper} 
\usepackage{xcolor} 
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage[
paperwidth=21.5cm,
paperheight=42cm,
left=0cm,
top=-1cm,
bottom=0cm,
nohead,
nofoot
]{geometry}
\pagestyle{empty}
\newcommand{\puttext}[3]{%
  \begin{tikzpicture}[remember picture, overlay]
    \node[anchor=north west, inner sep=0] at 
          ($(current page.north west) + (#1 * 1px, -#2 * 1px)$) {#3};
  \end{tikzpicture}%
}

\begin{document}

\multido{\i=50+50}{11}{\puttext{\i}{5}{\i}}
\multido{\i=50+50}{15}{\puttext{\i}{0}
{\color{blue}\rule{0.1pt}{\textheight}{0.1pt}}}
\multido{\i=50+50}{32}{\puttext{0}{\i}
{\i \color{blue}\rule{1.2\textwidth}{0.1pt}}}

\ULCornerWallPaper{1}{VN_map2025} 

\end{document}

Chủ Nhật, 20 tháng 7, 2025

Ai đâu trở lại mùa thu trước, nhặt lấy cho tôi những lá vàng

Blog này một thời gian dài bị bỏ quên, nhưng đồng thời tác giả của nó cũng đã quên đi nhiều thứ trong đời. Vì vậy nó được hồi sinh để ghi lại nhưng diều nên nhớ như của một người bị bệnh memento mà muốn lưu giữ lại tất cả.



You left me and went on your way.
I thought I should mourn for you and set your solitary image in my heart wrought in a golden song.
But ah, my evil fortune, time is short.
Youth wanes year after year; the spring days are fugitive; the frail flowers die for nothing, and the wise man warns me that life is but a dewdrop on the lotus leaf.
Should I neglect all this to gaze after one who has turned her back on me?
That would be rude and foolish, for time is short.
Then, come, my rainy nights with pattering feet; smile, my golden autumn; come, careless April, scattering your kisses abroad.
You come, and you, and you also!
My loves, you know we are mortals.
Is it wise to break one’s heart for the one who takes her heart away? For time is short.
It is sweet to sit in a corner to muse and write in rhymes that you are all my world.
It is heroic to hug one’s sorrow and determine not to be consoled.
But a fresh face peeps across my door and raises its eyes to my eyes.
I cannot but wipe away my tears and change the tune of my song.
For time is short.


Tagore Rabindranath - The gardener

Thứ Bảy, 7 tháng 10, 2023

Các scripts hữu ích




    Trong Texmaker đôi khi ta copy một đoạn văn bản từ nơi khác vào và nếu ta muốn chuyển đoạn văn bản này sang Uppercase (toàn chữ in hoa) hay Lowercase (toàn chữ viết thường), ngoài phương pháp dùng macro truyền thống của $\rm \LaTeX$, ta có thể dùng script để chuyển case. Thầy Sơn sẽ hướng dẫn cách sử dụng script, còn dưới đây là code của các script đó.



  1. to uppercase
    var txt = TM.selection; 
    if (txt != "") {
    var pos = TM.selectionStart; 
    txt = txt.toUpperCase(); 
    TM.insertText(txt); 
    TM.selectRange(pos, txt.length); 
    }
    
  2. to lowercase
    var txt = TM.selection; 
    if (txt != "") {
    var pos = TM.selectionStart; 
    txt = txt.toLowerCase(); 
    TM.insertText(txt); 
    TM.selectRange(pos, txt.length); 
    }