Phát hành Ruby 4.0.0

Đăng bởi naruse vào 25 Dec 2025
Dịch bởi Ngọc Lê

Chúng tôi vui mừng thông báo phát hành Ruby 4.0.0. Ruby 4.0 giới thiệu “Ruby Box” và “ZJIT”, cùng nhiều cải tiến khác.

Ruby Box

Ruby Box là một tính năng mới (thử nghiệm) cung cấp sự phân tách về các định nghĩa. Ruby Box được kích hoạt khi biến môi trường RUBY_BOX=1 được chỉ định. Lớp là Ruby::Box.

Các định nghĩa được tải trong một box được cô lập trong box đó. Ruby Box có thể cô lập/phân tách monkey patch, thay đổi biến toàn cục/biến lớp, định nghĩa lớp/module, và các thư viện native/ruby đã tải từ các box khác.

Các trường hợp sử dụng dự kiến là:

  • Chạy các test case trong box để bảo vệ các test khác khi test case sử dụng monkey patch để ghi đè thứ gì đó
  • Chạy các box ứng dụng web song song để thực hiện blue-green deployment trên app server trong một tiến trình Ruby
  • Chạy các box ứng dụng web song song để đánh giá cập nhật dependency trong một khoảng thời gian nhất định bằng cách kiểm tra khác biệt response sử dụng mã Ruby
  • Sử dụng làm API nền tảng (cấp thấp) để triển khai loại API “package” (cấp cao) (chưa được thiết kế)

Để biết chi tiết về “Ruby Box”, xem Ruby::Box. [Feature #21311] [Misc #21385]

ZJIT

ZJIT là trình biên dịch just-in-time (JIT) mới, được phát triển như thế hệ tiếp theo của YJIT. Bạn cần Rust 1.85.0 hoặc mới hơn để biên dịch Ruby với hỗ trợ ZJIT, và ZJIT được kích hoạt khi --zjit được chỉ định.

Chúng tôi đang xây dựng trình biên dịch mới cho Ruby vì chúng tôi muốn vừa nâng cao trần hiệu suất (kích thước đơn vị biên dịch lớn hơn và SSA IR) vừa khuyến khích nhiều đóng góp từ bên ngoài hơn (bằng cách trở thành trình biên dịch phương thức truyền thống hơn). Xem bài blog của chúng tôi để biết thêm chi tiết.

ZJIT nhanh hơn trình thông dịch, nhưng chưa nhanh bằng YJIT. Chúng tôi khuyến khích bạn thử nghiệm với ZJIT, nhưng có thể nên tạm hoãn triển khai trong môi trường production bây giờ. Hãy chờ ZJIT trong Ruby 4.1.

Cải tiến Ractor

Ractor, cơ chế thực thi song song của Ruby, đã nhận được nhiều cải tiến. Lớp mới Ractor::Port được giới thiệu để giải quyết các vấn đề liên quan đến gửi và nhận tin nhắn (xem bài blog của chúng tôi). Ngoài ra, Ractor.shareable_proc giúp chia sẻ đối tượng Proc giữa các Ractor dễ dàng hơn.

Về mặt hiệu suất, nhiều cấu trúc dữ liệu nội bộ đã được cải thiện để giảm đáng kể tranh chấp trên khóa toàn cục, mở khóa khả năng song song tốt hơn. Các Ractor cũng giờ chia sẻ ít dữ liệu nội bộ hơn, dẫn đến ít tranh chấp bộ nhớ đệm CPU hơn khi chạy song song.

Ractor được giới thiệu lần đầu trong Ruby 3.0 như một tính năng thử nghiệm. Chúng tôi nhắm đến việc loại bỏ trạng thái “thử nghiệm” của nó vào năm tới.

Thay đổi ngôn ngữ

  • *nil không còn gọi nil.to_a, tương tự như cách **nil không gọi nil.to_hash. [Feature #21047]

  • Các toán tử nhị phân logic (||, &&, andor) ở đầu dòng tiếp tục dòng trước đó, giống như dấu chấm fluent. Các ví dụ mã sau là tương đương:

      if condition1
         && condition2
        ...
      end
    

    Trước đây:

      if condition1 && condition2
        ...
      end
    
      if condition1 &&
         condition2
        ...
      end
    

    [Feature #20925]

Cập nhật các lớp lõi

Lưu ý: Chúng tôi chỉ liệt kê các cập nhật lớp đáng chú ý.

  • Array

    • Array#rfind được thêm vào như một thay thế hiệu quả hơn cho array.reverse_each.find [Feature #21678]
    • Array#find được thêm vào như một override hiệu quả hơn của Enumerable#find [Feature #21678]
  • Binding

    • Binding#local_variables không còn bao gồm các tham số được đánh số. Ngoài ra, Binding#local_variable_get, Binding#local_variable_set, và Binding#local_variable_defined? từ chối xử lý các tham số được đánh số. [Bug #21049]

    • Binding#implicit_parameters, Binding#implicit_parameter_get, và Binding#implicit_parameter_defined? được thêm vào để truy cập các tham số được đánh số và tham số “it”. [Bug #21049]

  • Enumerator

    • Enumerator.produce giờ chấp nhận đối số từ khóa size tùy chọn để chỉ định kích thước của enumerator. Nó có thể là một số nguyên, Float::INFINITY, một đối tượng callable (như lambda), hoặc nil để biểu thị kích thước không xác định. Khi không được chỉ định, kích thước mặc định là Float::INFINITY.

        # Enumerator vô hạn
        enum = Enumerator.produce(1, size: Float::INFINITY, &:succ)
        enum.size  # => Float::INFINITY
      
        # Enumerator hữu hạn với kích thước đã biết/có thể tính
        abs_dir = File.expand_path("./baz") # => "/foo/bar/baz"
        traverser = Enumerator.produce(abs_dir, size: -> { abs_dir.count("/") + 1 }) {
          raise StopIteration if it == "/"
          File.dirname(it)
        }
        traverser.size  # => 4
      

      [Feature #21701]

  • ErrorHighlight

    • Khi một ArgumentError được raise, giờ nó hiển thị các đoạn mã cho cả lời gọi phương thức (caller) và định nghĩa phương thức (callee). [Feature #21543]

      test.rb:1:in 'Object#add': wrong number of arguments (given 1, expected 2) (ArgumentError)
      
          caller: test.rb:3
          | add(1)
            ^^^
          callee: test.rb:1
          | def add(x, y) = x + y
                ^^^
              from test.rb:3:in '<main>'
      
  • Fiber

    • Giới thiệu hỗ trợ cho đối số Fiber#raise(cause:) tương tự Kernel#raise. [Feature #21360]
  • Fiber::Scheduler

    • Giới thiệu Fiber::Scheduler#fiber_interrupt để ngắt một fiber với ngoại lệ cho trước. Trường hợp sử dụng ban đầu là ngắt một fiber đang chờ trên thao tác IO blocking khi thao tác IO bị đóng. [Feature #21166]

    • Giới thiệu Fiber::Scheduler#yield để cho phép fiber scheduler tiếp tục xử lý khi signal exception bị vô hiệu hóa. [Bug #21633]

    • Giới thiệu lại hook Fiber::Scheduler#io_close cho IO#close bất đồng bộ.

    • Gọi Fiber::Scheduler#io_write khi flush bộ đệm ghi IO. [Bug #21789]

  • File

    • File::Stat#birthtime giờ khả dụng trên Linux thông qua lệnh hệ thống statx khi được hỗ trợ bởi kernel và hệ thống tệp. [Feature #21205]
  • IO

    • IO.select chấp nhận Float::INFINITY làm đối số timeout. [Feature #20610]

    • Hành vi đã bị deprecated, tạo tiến trình bằng các phương thức lớp IO với ký tự | ở đầu, đã bị loại bỏ. [Feature #19630]

  • Kernel

    • Kernel#inspect giờ kiểm tra sự tồn tại của phương thức #instance_variables_to_inspect, cho phép kiểm soát các biến instance nào được hiển thị trong chuỗi #inspect:

        class DatabaseConfig
          def initialize(host, user, password)
            @host = host
            @user = user
            @password = password
          end
      
          private def instance_variables_to_inspect = [:@host, :@user]
        end
      
        conf = DatabaseConfig.new("localhost", "root", "hunter2")
        conf.inspect #=> #<DatabaseConfig:0x0000000104def350 @host="localhost", @user="root">
      

      [Feature #21219]

    • Hành vi đã bị deprecated, tạo tiến trình bằng Kernel#open với ký tự | ở đầu, đã bị loại bỏ. [Feature #19630]

  • Math

  • Pathname

    • Pathname đã được thăng cấp từ gem mặc định thành lớp lõi của Ruby. [Feature #17473]
  • Proc

    • Proc#parameters giờ hiển thị các tham số tùy chọn ẩn danh là [:opt] thay vì [:opt, nil], làm cho đầu ra nhất quán với khi tham số ẩn danh là bắt buộc. [Bug #20974]
  • Ractor

    • Lớp Ractor::Port được thêm vào như cơ chế đồng bộ mới để giao tiếp giữa các Ractor. [Feature #21262]

        port1 = Ractor::Port.new
        port2 = Ractor::Port.new
        Ractor.new port1, port2 do |port1, port2|
          port1 << 1
          port2 << 11
          port1 << 2
          port2 << 12
        end
        2.times{ p port1.receive } #=> 1, 2
        2.times{ p port2.receive } #=> 11, 12
      

      Ractor::Port cung cấp các phương thức sau:

      • Ractor::Port#receive
      • Ractor::Port#send (hoặc Ractor::Port#<<)
      • Ractor::Port#close
      • Ractor::Port#closed?

      Kết quả là, Ractor.yieldRactor#take đã bị loại bỏ.

    • Ractor#joinRactor#value được thêm vào để chờ kết thúc của một Ractor. Chúng tương tự như Thread#joinThread#value.

    • Ractor#monitorRactor#unmonitor được thêm vào như các giao diện cấp thấp được sử dụng nội bộ để triển khai Ractor#join.

    • Ractor.select giờ chỉ chấp nhận Ractor và Port. Nếu Ractor được truyền vào, nó trả về khi một Ractor kết thúc.

    • Ractor#default_port được thêm vào. Mỗi Ractor có một port mặc định, được sử dụng bởi Ractor.send, Ractor.receive.

    • Ractor#close_incomingRactor#close_outgoing đã bị loại bỏ.

    • Ractor.shareable_procRactor.shareable_lambda được giới thiệu để tạo Proc hoặc lambda có thể chia sẻ. [Feature #21550], [Feature #21557]

  • Range

    • Range#to_set giờ thực hiện kiểm tra kích thước để ngăn các vấn đề với range vô tận. [Bug #21654]

    • Range#overlap? giờ xử lý đúng các range vô hạn (không có giới hạn). [Bug #21185]

    • Hành vi Range#max trên các range số nguyên không có điểm bắt đầu đã được sửa. [Bug #21174] [Bug #21175]

  • Ruby

    • Module cấp cao nhất Ruby mới đã được định nghĩa, chứa các hằng số liên quan đến Ruby. Module này được dành riêng trong Ruby 3.4 và giờ được định nghĩa chính thức. [Feature #20884]
  • Ruby::Box

  • Set

    • Set giờ là một lớp lõi, thay vì một lớp stdlib được tải tự động. [Feature #21216]

    • Set#inspect giờ sử dụng hiển thị đơn giản hơn, tương tự như mảng literal. (ví dụ, Set[1, 2, 3] thay vì #<Set: {1, 2, 3}>). [Feature #21389]

    • Truyền đối số cho Set#to_setEnumerable#to_set giờ đã bị deprecated. [Feature #21390]

  • Socket

    • Socket.tcp & TCPSocket.new chấp nhận đối số từ khóa open_timeout để chỉ định timeout cho kết nối ban đầu. [Feature #21347]
    • Khi timeout do người dùng chỉ định xảy ra trong TCPSocket.new, trước đây có thể raise Errno::ETIMEDOUT hoặc IO::TimeoutError tùy thuộc vào tình huống. Hành vi này đã được thống nhất để IO::TimeoutError giờ được raise nhất quán. (Xin lưu ý rằng, trong Socket.tcp, vẫn có các trường hợp Errno::ETIMEDOUT có thể được raise trong các tình huống tương tự, và trong cả hai trường hợp Errno::ETIMEDOUT có thể được raise khi timeout xảy ra ở cấp hệ điều hành.)
  • String

    • Cập nhật Unicode lên Phiên bản 17.0.0 và Emoji Phiên bản 17.0. [Feature #19908][Feature #20724][Feature #21275] (cũng áp dụng cho Regexp)

    • String#strip, strip!, lstrip, lstrip!, rstrip, và rstrip! được mở rộng để chấp nhận đối số *selectors. [Feature #21552]

  • Thread

    • Giới thiệu hỗ trợ cho đối số Thread#raise(cause:) tương tự Kernel#raise. [Feature #21360]

Cập nhật thư viện chuẩn

Chúng tôi chỉ liệt kê các thay đổi stdlib là các thay đổi tính năng đáng chú ý.

Các thay đổi khác được liệt kê trong các phần sau. Chúng tôi cũng liệt kê lịch sử phát hành từ phiên bản bundled trước đó là Ruby 3.4.0 nếu có GitHub releases.

Các bundled gem sau được thăng cấp từ default gem.

Default gem sau được thêm vào.

  • win32-registry 0.1.2

Các default gem sau được cập nhật.

Các bundled gem sau được cập nhật.

RubyGems và Bundler

Ruby 4.0 đóng gói RubyGems và Bundler phiên bản 4. Xem các liên kết sau để biết chi tiết.

Nền tảng được hỗ trợ

  • Windows

    • Ngừng hỗ trợ các phiên bản MSVC cũ hơn 14.0 (_MSC_VER 1900). Điều này có nghĩa là giờ cần Visual Studio 2015 hoặc mới hơn.

Vấn đề tương thích

  • Các phương thức sau đã bị loại bỏ khỏi Ractor do việc thêm Ractor::Port:

    • Ractor.yield
    • Ractor#take
    • Ractor#close_incoming
    • Ractor#close_outgoing

    [Feature #21262]

  • ObjectSpace._id2ref đã bị deprecated. [Feature #15408]

  • Process::Status#&Process::Status#>> đã bị loại bỏ. Chúng đã bị deprecated trong Ruby 3.3. [Bug #19868]

  • rb_path_check đã bị loại bỏ. Hàm này được sử dụng cho kiểm tra đường dẫn $SAFE đã bị loại bỏ trong Ruby 2.7, và đã bị deprecated. [Feature #20971]

  • Backtrace cho ArgumentError của “wrong number of arguments” giờ bao gồm tên lớp hoặc module của receiver (ví dụ, trong Foo#bar thay vì trong bar). [Bug #21698]

  • Backtrace không còn hiển thị các frame internal. Các phương thức này giờ xuất hiện như thể nằm trong tệp mã Ruby, nhất quán với các phương thức được triển khai bằng C khác. [Bug #20968]

    Trước:

    ruby -e '[1].fetch_values(42)'
    <internal:array>:211:in 'Array#fetch': index 42 outside of array bounds: -1...1 (IndexError)
            from <internal:array>:211:in 'block in Array#fetch_values'
            from <internal:array>:211:in 'Array#map!'
            from <internal:array>:211:in 'Array#fetch_values'
            from -e:1:in '<main>'
    

    Sau:

    $ ruby -e '[1].fetch_values(42)'
    -e:1:in 'Array#fetch_values': index 42 outside of array bounds: -1...1 (IndexError)
            from -e:1:in '<main>'
    

Vấn đề tương thích thư viện chuẩn

  • Thư viện CGI đã bị loại bỏ khỏi default gem. Giờ chúng tôi chỉ cung cấp cgi/escape cho các phương thức sau:

    • CGI.escapeCGI.unescape
    • CGI.escapeHTMLCGI.unescapeHTML
    • CGI.escapeURIComponentCGI.unescapeURIComponent
    • CGI.escapeElementCGI.unescapeElement

    [Feature #21258]

  • Với việc chuyển Set từ stdlib thành lớp lõi, set/sorted_set.rb đã bị loại bỏ, và SortedSet không còn là hằng số được tải tự động. Vui lòng cài đặt gem sorted_setrequire 'sorted_set' để sử dụng SortedSet. [Feature #21287]

  • Net::HTTP

    • Hành vi mặc định tự động đặt header Content-Type thành application/x-www-form-urlencoded cho các request có body (ví dụ, POST, PUT) khi header chưa được đặt rõ ràng đã bị loại bỏ. Nếu ứng dụng của bạn dựa vào giá trị mặc định tự động này, các request của bạn giờ sẽ được gửi mà không có header Content-Type, có thể gây ra vấn đề tương thích với một số server nhất định. [GH-net-http #205]

Cập nhật C API

  • IO

    • rb_thread_fd_close đã bị deprecated và giờ là no-op. Nếu bạn cần expose file descriptor từ C extension cho mã Ruby, tạo một instance IO sử dụng RUBY_IO_MODE_EXTERNAL và dùng rb_io_close(io) để đóng nó (điều này cũng ngắt và chờ tất cả các thao tác đang chờ trên instance IO). Đóng trực tiếp file descriptor không ngắt các thao tác đang chờ, và có thể dẫn đến hành vi không xác định. Nói cách khác, nếu hai đối tượng IO chia sẻ cùng file descriptor, đóng một đối tượng không ảnh hưởng đến đối tượng kia. [Feature #18455]
  • GVL

    • rb_thread_call_with_gvl giờ hoạt động có hoặc không có GVL. Điều này cho phép các gem tránh kiểm tra ruby_thread_has_gvl_p. Vui lòng vẫn cẩn thận với GVL. [Feature #20750]
  • Set

    • C API cho Set đã được thêm vào. Các phương thức sau được hỗ trợ: [Feature #21459]

      • rb_set_foreach
      • rb_set_new
      • rb_set_new_capa
      • rb_set_lookup
      • rb_set_add
      • rb_set_clear
      • rb_set_delete
      • rb_set_size

Cải thiện triển khai

  • Class#new (ví dụ, Object.new) nhanh hơn trong mọi trường hợp, nhưng đặc biệt khi truyền đối số từ khóa. Điều này cũng đã được tích hợp vào YJIT và ZJIT. [Feature #21254]
  • Các heap GC của các pool kích thước khác nhau giờ phát triển độc lập, giảm sử dụng bộ nhớ khi chỉ một số pool chứa đối tượng tồn tại lâu
  • Quét GC nhanh hơn trên các trang chứa đối tượng lớn
  • Các đối tượng “generic ivar” (String, Array, TypedData, v.v.) giờ sử dụng đối tượng “fields” nội bộ mới để truy cập biến instance nhanh hơn
  • GC tránh duy trì bảng id2ref nội bộ cho đến khi nó được sử dụng lần đầu, làm cho việc phân bổ object_id và quét GC nhanh hơn
  • object_idhash nhanh hơn trên các đối tượng Class và Module
  • Các số nguyên bignum lớn hơn có thể vẫn được nhúng sử dụng phân bổ chiều rộng biến
  • Random, Enumerator::Product, Enumerator::Chain, Addrinfo, StringScanner, và một số đối tượng nội bộ giờ được bảo vệ bởi write-barrier, giúp giảm overhead GC.

Ractor

Rất nhiều công việc đã được thực hiện để làm cho Ractor ổn định hơn, hiệu suất cao hơn và dễ sử dụng hơn. Những cải tiến này đưa triển khai Ractor gần hơn đến việc thoát khỏi trạng thái thử nghiệm.

  • Cải thiện hiệu suất
    • Chuỗi đã đóng băng và bảng symbol nội bộ sử dụng hash set không cần khóa [Feature #21268]
    • Tra cứu bộ nhớ đệm phương thức tránh khóa trong hầu hết các trường hợp
    • Truy cập biến instance của lớp (và generic ivar) nhanh hơn và tránh khóa
    • Tránh tranh chấp bộ nhớ đệm CPU trong phân bổ đối tượng bằng cách sử dụng counter cho mỗi ractor
    • Tránh tranh chấp bộ nhớ đệm CPU trong xmalloc/xfree bằng cách sử dụng counter thread-local
    • object_id tránh khóa trong hầu hết các trường hợp
  • Sửa lỗi và ổn định
    • Sửa các deadlock có thể xảy ra khi kết hợp Ractor và Thread
    • Sửa các vấn đề với require và autoload trong Ractor
    • Sửa các vấn đề encoding/transcoding giữa các Ractor
    • Sửa các race condition trong thao tác GC và vô hiệu hóa phương thức
    • Sửa các vấn đề với tiến trình fork sau khi khởi động Ractor
    • Số lượng phân bổ GC giờ chính xác dưới Ractor
    • Sửa TracePoint không hoạt động sau GC [Bug #19112]

JIT

  • ZJIT
    • Giới thiệu trình biên dịch JIT dựa trên phương thức thử nghiệm. Khi khả dụng, ZJIT có thể được kích hoạt tại runtime với tùy chọn --zjit hoặc bằng cách gọi RubyVM::ZJIT.enable. Khi biên dịch Ruby, cần Rust 1.85.0 hoặc mới hơn để bao gồm hỗ trợ ZJIT.
    • Tính đến Ruby 4.0.0, ZJIT nhanh hơn trình thông dịch, nhưng chưa nhanh bằng YJIT. Chúng tôi khuyến khích thử nghiệm với ZJIT, nhưng khuyên không nên triển khai trong môi trường production bây giờ.
    • Mục tiêu của chúng tôi là làm cho ZJIT nhanh hơn YJIT và sẵn sàng cho production trong Ruby 4.1.
  • YJIT
    • RubyVM::YJIT.runtime_stats
      • ratio_in_yjit không còn hoạt động trong bản build mặc định. Sử dụng --enable-yjit=stats khi configure để kích hoạt nó với --yjit-stats.
      • Thêm invalidate_everything vào thống kê mặc định, được tăng lên khi mọi mã bị vô hiệu hóa bởi TracePoint.
    • Thêm các tùy chọn mem_size:call_threshold: cho RubyVM::YJIT.enable.
  • RJIT
    • --rjit đã bị loại bỏ. Chúng tôi sẽ chuyển triển khai API JIT bên thứ ba sang kho lưu trữ ruby/rjit.

Xem NEWS hoặc nhật ký commit để biết thêm chi tiết.

Với những thay đổi này, 3889 tệp thay đổi, 230769 thêm(+), 297003 xóa(-) kể từ Ruby 3.4.0!

Chúc Giáng sinh vui vẻ, Năm mới hạnh phúc, và Happy Hacking với Ruby 4.0!

Tải về

  • https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.gz

    SIZE: 23955109
    SHA1: 754e39e9ad122e1b6deaed860350bac133a35ed3
    SHA256: 2e8389c8c072cb658c93a1372732d9eac84082c88b065750db1e52a5ac630271
    SHA512: 688254e939b197d564e896fb951bc1abf07142f489e91c5ed0b11f68f52d6adb6b1f86616fe03f1f0bb434beeef7e75e158b9c616afb39bb34403b0b78d2ee19
    
  • https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.xz

    SIZE: 18008368
    SHA1: 05ec670e86f84325c5353ef2f2888e53b6adc602
    SHA256: a72bacee9de07283ebc19baa4ac243b193129f21aa4e168c7186fb1fe7d07fe1
    SHA512: 2d5b2e566eaf70a5f3ea6ce6afc0611c0415de58a41336ef7a0b855c9a91eda9aa790a5f8b48e40a1eb9d50f8ea0f687216e617f16c8d040a08474f3116518a4
    
  • https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.zip

    SIZE: 29253204
    SHA1: 0b69f89d1d140157251c0d3a6032f6c45cdf81e8
    SHA256: 70cb1bf89279b86ab9a975d504607c051fc05ee03e311d550a5541b65e373455
    SHA512: a72e076ef618c0aeb9d20cf22e6fb12fda36809c0064ef0f98153b95a0bac257ef606342444a38f992c4594bf376a4d264686cf597463aa6f111220798784302
    

Ruby là gì

Ruby được phát triển lần đầu bởi Matz (Yukihiro Matsumoto) vào năm 1993, và hiện được phát triển dưới dạng Mã nguồn Mở. Nó chạy trên nhiều nền tảng và được sử dụng trên toàn thế giới, đặc biệt cho phát triển web.

Tin mới nhất

Diện mạo mới cho tài liệu Ruby

Tiếp theo việc thiết kế lại ruby-lang.org, chúng tôi có thêm tin vui để kỷ niệm 30 năm Ruby: docs.ruby-lang.org có diện mạo hoàn toàn...

Đăng bởi Stan Lo vào 23 Dec 2025

Thiết kế lại nhận diện trang web

Chúng tôi vui mừng thông báo về việc thiết kế lại toàn diện trang web của chúng tôi. Thiết kế cho bản cập nhật này...

Đăng bởi Hiroshi SHIBATA vào 22 Dec 2025

Thêm Tin...