cuốn sách gpt4 ai đã làm

Cuộc sống nhân tạo (AL: Artificiallife) Mã đa phiên bản Langton Ant html\go\php\python\java

In lại Tác giả: Sahara Thời gian cập nhật: 26-12-2024 14:47:52 56 4
mua khóa gpt4 Nike

Giới thiệu bối cảnh.

Christopher G. Langton, một nhà khoa học máy tính người Mỹ và là một Trong những người sáng lập lĩnh vực cuộc sống nhân tạo năm 1986, Langton đề xuất "Kiến Langton" làm ví dụ về máy tự động Năm sau, 1987. thí nghiệm chế tạo kết quả bom nguyên tử đầu tiên), Langton chính thức xuất ra “Khái niệm “sự sống nhân tạo” được sử dụng công nghệ máy tính để mô phỏng cuộc sống hóa học và mô phỏng cuộc sống của hệ thống.

Khái niệm cuộc sống nhân tạo hiện nay bao gồm hai khía cạnh chính: một hệ thống cuộc sống ảo trong phạm vi khoa học máy tính toán, Đòi hỏi sử dụng kỹ thuật phần mềm máy tính và công nghệ trí tuệ nhân tạo để xây dựng và thực hiện, hai là sự biến đổi nhân tạo của các sinh vật; hệ thống sinh học được thiết kế thành hình thành có mối liên hệ chặt chẽ với công nghệ sinh học tổng hợp Thông qua thao tác tác và thiết kế chính xác các vật liệu truyền sinh học, các đặc tính và chức năng mới được trao đổi cho các vật thể sinh học, từ đó mở rộng ranh giới và khả năng của sự sống và cung cấp ứng dụng học đời sống trong kỹ thuật.

  .

1. Các khái niệm cơ bản về Kiến Langton

  • Định nghĩa: Langton's Ant là một máy Turing hai chiều, bao gồm một mạng đen và một "con kiến".
  • Trình bày: Christopher Langton
  • Các tính năng: Nó có tính logic rất đơn giản và hiệu suất phức tạp, và tính năng Turing hoàn thiện của nó đã được chứng minh vào năm 2000.

2. Quy tắc và hành động mẫu

  • luật:

    1. Trong một hình vuông trên một bề mặt, mỗi nhóm được tô màu đen hoặc trắng.
    2. Có một "con kiến ​​trúc" nằm trên một trong các mạng, với đầu hướng lên, xuống, sang trái hoặc phải.
    3. Nếu con kiến ​​trúc mở trên hình vuông màu trắng, hãy phóng trái 90 độ, đổi hình vuông thành hình vuông màu đen rồi tiến về phía trước một bước.
    4. Nếu con kiến ​​trúc mở trên hình vuông màu đen, hãy phóng phải 90 độ, đổi hình vuông thành hình vuông màu trắng rồi tiến về phía trước một bước.
  • Mô hình hành động:

    1. Giai đoạn ban đầu: Bắt đầu từ nền hoàn toàn trắng, kiến ​​trúc sẽ tái lập nhiều hình thức đối xứng hoặc vòng lặp lại ở một số bước đầu tiên. Toàn màu trắng với hướng lên trên. trắng), thuốc chất. lưới có màu đen, rồi tiến lên một bước. đơn giản trong một vài bước.
    2. Giai đoạn giai đoạn bạo loạn: Khi số bước tăng lên, lộ trình của kiến ​​trúc sẽ trở thành trạng thái giả ngẫu nhiên tương tự như loạn.
    3. Giai đoạn đường cao tốc: Sau khoảng 10.000 bước, lộ trình của loài kiến ​​trúc sẽ chuyển sang chế độ "đường cao tốc" lặp lại vô tận với chu kỳ 104 bước và chuyển theo một hướng cố định như được hiển thị bên dưới:

        .

3. Quảng bá và mở rộng

  • Nhiều màu sắc: Ngoài màu đen và trắng cơ bản, khái niệm mẫu Langton Ant vẫn có thể được mở rộng để sử dụng nhiều màu sắc. Mỗi màu có thể xác định quy tắc cho kiến ​​trúc bên trái hoặc phải. biểu thị mỗi màu trái hoặc phải theo thứ tự.
  • Các dạng hình khác: Ngoài ra, các hình vuông cũng có thể sử dụng các dạng lưới khác, có giới hạn như lưới lục giác.
  • Turmites: Một phần mở rộng hơn nữa là xem xét nhiều trạng thái của máy Turing, tức là bản thân màu sắc của kiến ​​trúc có thể thay thế Change. trưởng thành bạo loạn và tăng trưởng theo hình xoắn ốc.

4. Ý nghĩa và ứng dụng

  • Ý nghĩa lý thuyết: Kiến trúc Langton có thể thực hiện các hành vi phức tạp được tạo ra theo các quy tắc đơn giản, có ý nghĩa lớn trong công việc tìm hiểu các lĩnh vực như máy tự động bào, hệ thống phức hợp và máy Turing.
  • Ứng dụng thực tế:
    1. Tính toán các mạch Boolean: Quỹ đạo của kiến ​​trúc Langton có thể được sử dụng để tính toán các mạch Boolean và với các cấu hình ban cụ thể có thể thực thi các chức năng của logic cổng. Boolean.
    2. Ví dụ: bằng cách thiết kế các công cụ cấm trạng thái đầu tiên, có giới hạn như đặt màu của các mạng nhất định cũng như vị trí và lệnh cấm hướng Đầu tiên của kiến ​​trúc, một máy Turing thuật toán đơn giản có thể được thực hiện.
    3. Tạo mẫu: Trong nghệ thuật và thiết kế, dấu vết của Kiến trúc Langton có thể tạo ra các mẫu và họa tiết độc đáo để trang trí và sáng tạo thiết kế. khi xử lý nghệ thuật.

5. So sánh các dòng máy khác

  • So sánh với trò chơi cuộc sống của Conway: Trò chơi cuộc sống của Conway cũng là một mô hình ô cho tự động cổ điển, Nhưng nó chủ yếu tập trung vào các quy tắc sinh tồn và sinh sản của tế bào, trong khi Kiến Langton chú ý hơn đến những thay đổi năng động trong hành động của cá nhân và công việc tạo đường đi.
  • So sánh với automata tế bào: Automata tế bào thường liên quan đến sự thay đổi trạng thái của nhiều tế bào, trong khi kiến ​​​​Langton tập trung vào hành động của một "con kiến ​​trúc" duy nhất. phức tạp.
  • So sánh với máy Turing: Máy Turing là một mô hình tính toán tổng hợp và Langton Ant đạt được tính hoàn thiện Turing thông qua các quy tắc đơn đơn giản, có thể thực hiện sức mạnh tính toán phức tạp trong một hệ thống đơn giản.

This is code:

Kiến trúc Langton html\go\php\python\java.

Mỗi phiên bản thực hiện cùng một chức năng:

Mô phỏng chuyển động của Kiến trúc Langton trên mạng.

Sử dụng màu đen và trắng để thể hiện mạng trạng thái.

Đánh dấu vị trí hiện tại của kiến ​​trúc bằng màu đỏ.

Hỗ trợ bất kỳ điều kiện nào được hỗ trợ.

  .

Phiên bản HTML:

DOCTYPE html>
<html>
<cái đầu>
    <meta http-tương thích="Loại bỏ nội dung" nội dung="văn bản/html; bộ ký tự=UTF-8">
    <tiêu đề>Kiến Langtontiêu đề>
    <phong cách>
        html, nội dung {
            dòng: 0 !quan trọng;
            đệm: 0 !quan trọng;
        }
        body {
            trưng bày: một công cụ;
            nội dung minh biện: trung tâm;
            căn chỉnh các mục: trung tâm;
            màu nền: #555555;
            chiều cao: 100vh;
        }
        vẽ vải {
            trưng bày: khối khối;
            màu nền: trắng;
        }
        #nhiệt độ {
            trưng bày: không có;
        }
    phong cách>
cái đầu>
<body>
    <vẽ vải NHẬN DẠNG="bg" chiều rộng="640" chiều cao="640">vẽ vải>
    <vẽ vải NHẬN DẠNG="tạm thời" chiều rộng="640" chiều cao="640">vẽ vải>
    <script script>
        // Xử lý chỉ mục ranh giới
        chu kỳ hằng số = (idx, max max) => (idx + max max) % tối đa;

        // Đã nhận canvas và bối cảnh
        const bg = document.getElementById("bg"); nhiệt độ không đổi = document.getElementById("nhiệt độ"); const ctx = bg.getContext("2 ngày"); const ctempx = temp.getContext("2 ngày");

        // Set base information
        const bgWidth = 640; const bgHeight = 640; constant size = 2; speed không thay đổi = 100; chiều rộng không đổi = bgWidth / cố định chiều kích thước = bgHeight / size;

        // Khởi tạo canvas kích thước
        [bg, temp].forEach(canvas => {canvas.width = bgWidth; canvas.height = bgHeight; });

        // Vị trí ban đầu của kiến ​​trúc (điểm trung tâm)
        use antx = chiều rộng / 2; = chiều cao / 2;

        // Bảng hướng: lên, phải, xuống, trái
        const thư mục = [[0, -1], [1, 0], [0, 1], [-1, 0]]; = 0;

        // Khởi tạo nhóm (sử dụng mảng thuật toán)
        Hãy để lưới = mới Mảng(chiều cao).fill(0).bản đồ(_ => mới Mảng(chiều rộng).fill(1));

        // Hàm di chuyển (dir có thể âm hoặc lớn hơn 3)
        chuyển const = (thư mục) => { thư mục = chu kỳ (dir, dirs.length); += thư mục[thư mục]0]; += thư mục[thư mục]1];antx = chu kỳ (antx, width); = chu kỳ (anty, chiều cao);
            trở lại thư mục }

        // Khởi tạo canvas cài đặt
        ctx.fillStyle = "trắng";ctx.fillRect(0, 0, bgWidth, bgHeight); ctx.scale(size, size); = SAI;

        // Bước đơn chức năng
        const bước = () => { const px = lưới[anty][antx];
            // Màu của mạng hiện tại và chuyển sang mạng tiếp theo
            if if (px > 0) { lưới[anty][antx] = 0;  // chuyển sang màu đen
                thư mục = move(thư mục + 1);    // Rẽ phải
            } khác { lưới[anty][antx] = 7;  // chuyển sang màu trắng
                thư mục = move(thư mục - 1);    // Rẽ trái
            } }

        // chuyển đổi màu sắc chức năng
        const intToColor = (px) => {
            // Màu sắc ứng dụng tương tự:
            // 0 -> đen[0, 0, 0] * 255
            // 7 -> trắng[1, 1, 1] * 255
            // 3 -> đỏ[1, 0, 0] * 255
            // Byte cuối cùng là độ trong suốt
            trở lại [px % 2 * 255,px % 3 * 255,px % 3 * 255, 255];

        // Vẽ sơ đồ chức năng
        const sơn = () => {
            // Tính toán nhiều bước trước khi xuất
             (cho tôi = 0;Tôi < tốc độ của tôi++) { bước chân();
            // Đánh dấu vị trí của đàn kiến ​​​​bằng màu đỏ
            const tmp = lưới[anty][antx]; lưới[anty][antx] = 3; byte không đổi = Grid.flat().map(intToColor).flat() const imgData = mới ImageData(Uint8ClampedArray.from(byte), chiều rộng, chiều cao); lưới [anty] [antx] = tmp; ctempx.putImageData(imgData, 0, 0); ctx.drawImage(temp, 0, 0); }

        // Set image loop
        setInterval(son, 20);
    script script>
body>
html>

Phiên bản Python sử dụng thư viện Pygame để phát triển giao diện đồ họa. phụ thuộc tương ứng: Python: pip install pygame.

nhập khẩu trò chơi vui nhộn
nhập khẩu numpy như np

# Khởi tạo Pygame
pygame.init()

# Set base information
BG_WIDTH = 640
BG_HEIGHT = 640
CELL_SIZE = 2
TỐC ĐỘ = 100
CHIỀU RỘNG =BG_WIDTH // CHIỀU CAO CELL_SIZE = BG_HEIGHT // CELL_SIZE

# Tạo cửa sổ
màn hình = pygame.display.set_mode((BG_WIDTH, BG_HEIGHT)) pygame.display.set_caption("Kiến Langton")

# Khởi tạo nhóm
lưới = np.ones((HEIGHT, WIDTH), dtype=int)

# Vị trí ban đầu của kiến ​​trúc (điểm trung tâm)
ant_x = CHIỀU RỘNG // 2
kiến_y = CHIỀU CAO // 2

# Bảng hướng: lên, phải, xuống, trái
DIRS = [(0, -1), (1, 0), (0, 1), (-1, 0)] dir_idx = 0

chắc chắn chuyển hướng (hướng):
    toàn cầu ant_x, hướng ant_y = hướng % len(DIRS)ant_x = (ant_x + DIRS[hướng] [0]) % kiến trúc chiều rộng = (ant_y + DIRS[hướng][1]) % CHIỀU CAO
    trở lại phương hướng

chắc chắn bước chân():
    toàn cầu dir_idx px = lưới[ant_y][ant_x]
    if if px > 0: lưới[ant_y][ant_x] = 0  # chuyển sang màu đen
        dir_idx = di chuyển(dir_idx + 1)  # Rẽ phải
    khác: lưới[ant_y][ant_x] = 7  # chuyển sang màu trắng
        dir_idx = di chuyển(dir_idx - 1)  # Rẽ trái

chắc chắn int_to_color(px):
    if if px==0:  # Đen
        trở lại (0, 0, 0)
    yêu tinh px==7:  # màu trắng
        trở lại (255, 255, 255)
    khác:  # Màu đỏ (thiết kế)
        trở lại (255, 0, 0)

# vòng lặp chính
đang chạy = Đồng hồ thật = pygame.time.Clock()

mạnhkhi đang chạy:
     sự kiện TRONG pygame.event.get():
        if if sự kiện.type == pygame.QUIT: đang chạy = SAI

    # Tính toán nhiều bước
     _ TRONG phạm vi (TỐC ĐỘ): bước()

    # vẽ tranh
     y TRONG phạm vi (HEIGHT):
         x TRONG phạm vi (WIDTH): màu = int_to_color(grid[y][x]) pygame.draw.ect(màn hình, màu sắc, (x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE))
    
    # Đánh dấu vị trí
    pygame.draw.ort(màn hình, (255, 0, 0), (ant_x * CELL_SIZE, kiến_y * CELL_SIZE, CELL_SIZE, CELL_SIZE)) pygame.display.flip() clock.tick(50) pygame.quit()

  .

Phiên bản Java sử dụng Swing để phát triển giao diện đồ họa.

nhập khẩu javax.swing.*;
nhập khẩu java.awt.*;
nhập khẩu java.awt.image.BufferedImage;

công cộng lớp học Kiến Langton mở rộng JPanel {
    Riêng tư tĩnh cuối cùng int BG_WIDTH = 640;
    Riêng tư tĩnh cuối cùng int BG_HEIGHT = 640;
    Riêng tư tĩnh cuối cùng int CELL_SIZE = 2;
    Riêng tư tĩnh cuối cùng int TỐC ĐỘ=100;
    Riêng tư tĩnh cuối cùng int CHIỀU RỘNG = BG_WIDTH / CELL_SIZE;
    Riêng tư tĩnh cuối cùng int CHIỀU CAO = BG_HEIGHT / CELL_SIZE;

    Riêng tư int[][] lưới;
    Riêng tư int antX, antY, dir;
    Riêng tư cuối cùng int[][] thư mục = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}};
    Riêng tư BufferedImage bộ đệm;

    công cộng LangtonAnt() { setPreferredSize(mới Kích thước (BG_WIDTH, BG_HEIGHT)); tạo bộ đệm khởi độngGrid(); = mới BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); = mới Bộ đếm thời gian(20, e -> { cập nhật(); sơn lại();

    Riêng tư trống rỗng khởi tạoGrid() { lưới = mới int[CHIỀU CAO][RỘNG];
         (int y = 0; y < CHIỀU CAO y++;) {
             (int x = 0; x < CHIỀU RỘNG x++) { lưới[y][x] = 1; } } antX = CHIỀU RỘNG/2;antY = CHIỀU CAO/2; = 0;

    Riêng tư int di chuyển(int hướng) { hướng = (hướng + dirs.length) % dirs.length;antX = (antX + dirs[hướng][0] + WIDTH) % CHIỀU RỘNG; = (antY + dirs[hướng][1] + HEIGHT) % CHIỀU CAO;
        trở lại phương hướng }

    Riêng tư trống rỗng bước chân() {
        int px = lưới[antY][antX];
        if if (px > 0) { lưới[antY][antX] = 0;  // chuyển sang màu đen
            dir = di chuyển(dir + 1);   // Rẽ phải
        } khác { lưới[antY][antX] = 7;  // chuyển sang màu trắng
            dir = di chuyển(dir - 1);   // Rẽ trái
        } }

    Riêng tư trống rỗng cập nhật() {
         (int tôi = 0; tôi < TỐC ĐỘ i++;) { bước(); } } @Ghi đè
    được bảo vệ trống rỗng PaintComponent(Đồ họa g) {
        siêu.paintComponent(g);
        
        // Cập nhật đệm hình ảnh
         (int y = 0; y < CHIỀU CAO y++;) {
             (int x = 0; x < CHIỀU RỘNG x++) { buffer.setRGB(x, y, Grid[y][x] > 0 ? 0xFFFFFF : 0); } } buffer.setRGB(antX, antY, 0xFF0000);  // Vị trí của kiến ​​trúc đánh dấu màu đỏ

        // Draw a zoom image to
        g.drawImage(buffer, 0, 0, BG_WIDTH, BG_HEIGHT, vô giá trị); }

    công cộng tĩnh trống rỗng main(String[] args) { SwingUtilities.invokeLater(() -> {Khung JFrame = mới JFrame("Kiến Lanton"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);mới LangtonAnt()); frame.pack(); frame.setLocationRelativeTo(vô giá trị); frame.setVisible(ĐÚNG VẬY); }); } }

  .

Phiên bản Go sử dụng công cụ trò chơi Ebiten để phát triển giao diện đồ họa. phần phụ thuộc tương ứng: Go: go get github.com/hajimehoshi/ebiten/v2.

failed chủ yếu

nhập khẩu (
    "hình ảnh/màu sắc"
    "nhật ký"

    "github.com/hajimehoshi/ebiten/v2"
)

hằng số (bgWidth  = 640
    bgHeight = 640
    kích thước tế bào = 2
    tốc độ    = 100
    chiều rộng    = bgWidth/ chiều cao kích thước tế bào   = bgHeight/ size)

kiểu Trò chơi cấu hình { lưới [][]int
    antX    int
    kiến trúc    int
    thư mục     int
    thư mục [][2]int
    điểm ảnh[]byte
}

vui vẻ Trò chơi mới()*Trò chơi { g := &Trò chơi lưới: làm([][]int, chiều cao), antX: chiều rộng / 2, antY: chiều cao / 2, thư mục: [][2]int{{0, -1}, {1, 0}, {0, 1}, {-1, 0}}, pixel: làm([]byte, chiều rộng* chiều cao*4), }

     y := phạm vi g.grid { g.grid[y] = làm([]int, chiều rộng)
         x := phạm vi g.grid[y] { g.grid[y][x] = 1
        } }

    trở lại g}

vui vẻ (g *Trò chơi) di chuyển(thư mục int) int { thư mục = (thư mục + len(g.dirs)) % len(g.dirs) g.antX = (g.antX + g.dirs[dir][0] + chiều rộng) % g.antY chiều rộng = (g.antY + g.dirs[dir][1] + chiều cao) % chiều cao
    trở lại thư mục }

vui vẻ (g *Trò chơi) bước() { px:= g.grid[g.antY][g.antX]
    if if px > 0 { g.grid[g.antY][g.antX] = 0 // chuyển sang màu đen
        g.dir = g.move(g.dir + 1)  // Rẽ phải
    } khác { g.grid[g.antY][g.antX] = 7 // chuyển sang màu trắng
        g.dir = g.move(g.dir - 1)  // Rẽ trái
    } }

vui vẻ (g *Trò chơi) Cập nhật() lỗi {
     tôi := 0; tôi < tốc độ; { g.step() }
    trở lại không }

vui vẻ (g *Trò chơi) Vẽ(màn hình *ebiten.Image) {
    // Cập nhật pixel dữ liệu
     y := 0; y < chiều cao; {
         x := 0; x < chiều rộng; {idx:= (y*chiều rộng + x) * 4
            if if g.grid[y][x] > 0 { g.pixel[idx] = 255   // R
                g.pixels[idx+1] = 255 // G
                g.pixels[idx+2] = 255 // B
                g.pixels[idx+3] = 255 // MỘT
            } khác { g.pixel[idx] = 0     // R
                g.pixels[idx+1] = 0   // G
                g.pixels[idx+2] = 0   // B
                g.pixels[idx+3] = 255 // MỘT
            } } }

    // Đánh dấu vị trí
    idx := (g.antY*width + g.antX) * 4
    g.pixels[idx] = 255   // R
    g.pixels[idx+1] = 0   // G
    g.pixels[idx+2] = 0   // B
    g.pixels[idx+3] = 255 // MỘT

    screen.WritePixels(g.pixels) }

vui vẻ (g *Trò chơi) Bố cục(outsideWidth, OutsideHeight int) (int, int) {
    trở lại chiều rộng, chiều cao }

vui vẻ main() { ebiten.SetWindowSize(bgWidth, bgHeight) ebiten.SetWindowTitle("Kiến Langton")

    if if err := ebiten.RunGame(NewGame()); err != không { log.Fatal(err) } }

  .

Phiên bản PHP sử dụng GD thư viện để tạo hình ảnh tĩnh. tương ứng: PHP: Cần cài đặt tiện ích mở rộng GD.

php
Kiến Langton {
$ chiều rộng
chiều cao $
$cellSize
$ốc độ
$gridWidth
$gridHeight
lưới $
[];
$antX
$antY
$dir
= [[0, -1], [1, 0], [0, 1], [-1, 0
$hình ảnh
__cấu trúc() {
->gridWidth =
-> chiều rộng /
size;
->gridHeight =
-> chiều cao/
->antX =
->gridWidth/2
-> kiến ​​trúc =
->gridHeight/2
$y
->gridHeight;
->lưới[
array_điền
(0,
->gridWidth, 1
Tạo hình ảnh
->hình ảnh = imagecreatetruecolor(
-> chiều rộng,
chiều cao); hình ảnh đầy đủ của chữ nhật (
-> Hình ảnh, 0, 0,
-> chiều cao,
hình ảnh phân tích màu bổ sung(
->hình ảnh, 255, 255, 255
)); }
= (
->thư mục)) %
thư mục);
->antX = (
->antX+
->thư mục[
][0] +
->gridWidth) %
lướiChiều rộng;
->antY = (
-> kiến ​​trúc +
[1] +
->gridHeight) %
lướiChiều cao;
$px
->antY][
kiếnX];
> 0
->antX] = 0;
->di chuyển(
+ 1);
->antX] = 7;
- 1);
run(
$bước
$i
bước chân();
vẽ lưới
$x
->gridWidth;
$color
][
] > 0 ?
->hình ảnh, 255, 255, 255):
->hình ảnh, 0, 0, 0
); hình ảnh chữ nhật đầy đủ(
-> Hình ảnh,
-> Kích thước,
+ 1) *
->cellSize-1,
); } }
$đỏ
= imagecolorallocate(
->hình ảnh, 255, 0, 0
->antX*
-> kiến ​​trúc *
->antX + 1) *
->antY + 1) *
hình ảnh đầu ra
('Loại bỏ nội dung: hình ảnh/png'
); hình ảnhpng(
hình ảnh);
hình ảnh); } }
$kiến
LangtonAnt();
->chạy(10000);
Chạy 10.000 bước
Nó có thể hiện các mô hình hành động phức tạp thông qua các quy tắc đơn giản, cung cấp các quan điểm và công cụ mới để chúng ta hiểu biết về các phức tạp hiện tại trong tự nhiên và các nhân hệ thống. ứng dụng của Kiến trúc Langton trong nhiều lĩnh vực hơn, nghĩ ra giới hạn như mô hình hóa hệ thống sinh học, quy hoạch giao thông đô thị, vv, cũng như phát triển các mô hình mở rộng mới để nâng cao sức mạnh tính toán và khả năng biểu diễn của nó.
Cuối cùng, bài viết này về Cuộc sống nhân tạo (AL: Artificiallife) Langton Ant Multi-version Code html\go\php\python\java end tại đây Nếu bạn muốn biết thêm về Cuộc sống nhân tạo (AL: Artificiallife) Langton Về nội dung của Ant. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai!
Docker hình ảnh tối ưu hóa
Trợ giúp với Python Turtle và cập nhật điểm số/cuộc sống
Tôi đang phát triển một trò chơi cuộn sử dụng nhiều con rùa. mối nguy hiểm và lợi ích khi chuyển động trên trục X, chúng sẽ lặp lại và thay đổi vị trí trên trục Y. một hàm gọi là va chạm(
c - SPOJ- Cuộc sống, Vũ trụ và Vạn vật
Tôi không hiểu tại sao họ không chấp nhận đây là giải pháp, họ nói đó là một câu trả lời sai:- #include int main(void) { int val=0;
Cuộc sống của JSF sau khi đăng
Chuỗi công khai đăng xuất() { FacesContext.getCurren
asp.net - IIS 7
Có một cài đặt Thời gian chờ trong nhóm ứng dụng IIS7 Mặc định là 20 phút, cho biết: Lượng thời gian (tính bằng phút) mà một công việc quy trình sẽ xử lý.
Docker-6ren image tối ưu hóa
Docker-1 hình ảnh được tối ưu hóa. tuyệt vời. Docker-6ren
Thời gian cập nhật: 26-12-2024 16:47:42
Là một công cụ chứa công nghệ phổ biến, Docker mang đến cho các nhà phát triển sự tiện lợi tuyệt vời. Nó được tích hợp và đóng gói một ứng dụng. hình image. sử dụng giữ, do đó tăng đáng kể tốc độ tải xuống và phát triển mặt khác, nó cũng có thể tăng cường hiệu quả tính toán bảo mật hệ thống và đảm bảo hoạt động ổn định của ứng dụng.
Trong bài viết này, chúng ta sẽ thảo luận về một loạt các kỹ thuật tối ưu hóa hình ảnh Docker thực tế để giúp đỡ các nhà phát triển dễ dàng nắm bắt kỹ năng quan trọng này, thiết lập nền tảng vững chắc để xây dựng các ứng dụng được đóng gói hiệu quả và đáng tin cậy, đồng thời giúp quá trình phát triển và phát triển khai báo của bạn mượt mà hơn, cải thiện an toàn im lặng.
2. Docker hình ảnh có kỹ năng tối ưu hóa
2.1 Sử dụng hình ảnh cơ bản phù hợp
Chọn cơ sở hình ảnh phù hợp là một bước quan trọng trong công việc tối ưu hóa hình ảnh Docker. Cố gắng chọn một hình ảnh. hình ảnh cơ bản có kích thước nhỏ và có chức năng đơn giản.
Ví dụ: Alpine là một bản phân phối Linux nhẹ nhàng phù hợp để sử dụng nền tảng cho Docker hình ảnh.
Ví dụ: distroless có tính bảo mật cao. các thùng chứa việc gỡ lỗi dựa trên hình ảnh không có bản phân phối".
Ví dụ: sau đây là ví dụ về Dockerfile use Alpine làm cơ sở hình ảnh:
# Sử dụng Alpine làm hình ảnh cơ sở TỪ Alpine:3.15 # Cài đặt các phần phụ thuộc cần thiết RUN apk add --no-cache python3 py3-pip # Đặt thư mục làm việc WORKDIR /app # Sao chép tệp ứng dụng COPY . r require.txt # Khởi động ứng dụng CMD ["python3", "app.py"]
2.2 RUN command
Mỗi RUN lệnh tạo ra một lớp mới, tăng kích thước của hình ảnh. số lượng lớp hình ảnh sẽ làm giảm kích thước của hình ảnh.
# Không nên: thêm apk RUN xây dựng nhiều lớp --no-cache git RUN apk thêm --no-cache Curl
# Khuyến nghị thực hiện: Kết quả RUN lệnh.
Thêm apk RUN --no-cache git Curl
2.3 Dọn dẹp các tập tin không cần thiết
Command up up can be used in Dockerfile để giảm kích thước ảnh.
# Cài đặt các phần phụ thuộc và xóa bộ nhớ cache RUN apk add --no-cache git Curl && rm -rf /var/cache/apk/*
2.4 Sử dụng tệp .dockerignore
Dockerbỏ qua thiết bị được đưa vào hình ảnh.
Ví dụ: tạo tệp .dockerignore trong thư mục gốc của dự án với nội dung sau:
# Loại trừ các tệp và thư mục không cần thiết *.log node_modules/
2.5 Sử dụng nhiều giai đoạn xây dựng các bản dựng
Bản dựng nhiều giai đoạn cho phép bạn sử dụng nhiều hướng dẫn TỪNG trong Dockerfile để sao chép chỉ các tệp được yêu cầu request to the end of image. chi tiết, vui lòng tham khảo bài đăng trên blog "Ý nghĩa của nhiều lệnh trong Dockerfile".
# Giai đoạn 1: Xây dựng ứng dụng TỪ golang:1.22 AS builder #RUN #go env -w GOPROXY=https://goproxy.cn,direct # Chạy ứng dụng này với docker build --build_arg $(go env GOPROXY) để ghi đè goproxy #ARG goproxy=https://goproxy.cn,direct #ENV GOPROXY=$goproxy WORKDIR /workspace COPY ../../apis apis/ COPY ../../clients client/ COPY ../ ../cmd cmd/ COPY ../../pkg/controllers bộ điều khiển/ COPY ../../pkg pkg/ COPY ../.. /pkg/hằng số/ SAO CHÉP ../../swaggerDocs swaggerDocs/ SAO CHÉP ../../go.mod go.mod SAO CHÉP ../../go.sum go.sum CHẠY go mod gọn gàng && go mod nhà cung cấp
# Không buộc xây dựng các bản cập nhật gói (không sử dụng -a) và sử dụng bộ đệm thư mục của RUN biên dịch CGO_ENABLED=0 GOOS=linux GOARCH=${TARGETPLATFORM} go build -o /workspace/ke ./cmd/ ke ke /bin/ke ĐIỂM VÀO ["/bin/ke"]
2.6 Sử dụng thẻ và kiểm soát phiên bản
Việc gắn nhãn cho hình ảnh cho phép kiểm soát và quản lý phiên bản một cách dễ dàng để tránh nhầm lẫn hình ảnh của các phiên bản các bản khác nhau.
# Xây dựng hình ảnh và gắn nhãn cho nó docker build -t helloworld:1.0 .
Trong làn sóng các ứng dụng được đóng gói, việc tối ưu hóa hình ảnh Docker có ý nghĩa rất lớn trong việc cải thiện hiệu quả performance and security application. xây dựng một nền tảng vững chắc và có thể kiểm soát một cách hiệu quả và chức năng vi phạm của hình ảnh. Việc kết hợp khéo léo các liên kết hướng dẫn có thể tránh được việc tăng các lớp hình ảnh một cách không cần thiết và giảm kích thước của một hiệu ứng. dockerignore để Loại trừ các tệp chính xác và thư mục không liên quan, tốc độ xây dựng tăng lên và giảm tải áp dụng chiến lược. xây dựng nhiều giai đoạn và lọc từng bước để chỉ giữ lại các thành phần cần thiết cho hoạt động cuối cùng, giảm độ phức tạp và nâng cao hiệu quả.
Tuân theo quy tắc "vùng hình ảnh chỉ chứa các ứng dụng và thời gian phụ thuộc của chúng", hãy sử dụng sử dụng các kỹ thuật tối ưu hóa này để làm cho Docker hình ảnh được sắp xếp hợp lý và hiệu quả hơn, đảm bảo phát triển khai chia sẻ và nhanh chóng sử dụng các ứng dụng trong khu vực, đồng thời giúp nhà phát triển tận dụng tối đa công việc Docker nghệ thuật.
Tham khảo: "Giới thiệu về hình ảnh không phân phối và vùng chứa lỗi dựa trên hình ảnh không phân phối".
Tham khảo: "Tầm quan trọng của sự tồn tại của nhiều hướng dẫn Từ trong Dockerfile".
Cuối cùng, bài viết về Docker hình ảnh tối ưu này đã kết thúc tại đây. Docker của tôi trong tương lai .
Bằng chứng kiến ​​thức không có một
Viết chương trình đầu tiên sử dụng Cursor
Java-6ren
Xử lý khối lượng tệp lớn hoặc khi quá trình xử lý bị mất nhiều tệp bài viết này sẽ giới thiệu chi tiết cách sử dụng Java-6ren
Chi tiết tệp xử lý đa luồng Java và ví dụ mã hóa
Thời gian cập nhật: 26-12-2024 20:45:52
Trong trình lập Java, xử lý tệp là một nhiệm vụ phổ biến. số lượng tệp lớn hoặc khi xử lý tệp bị mất nhiều thời gian. sử dụng công nghệ đa luồng. có thể chạy trực tiếp.
1. Khái niệm cơ bản về xử lý đa luồng tệp
Cập nhật luồng luồng đến việc chạy nhiều luồng luồng trong một chương trình, với mỗi luồng hoàn thành một tác vụ cụ thể. nhiều luồng để nâng cao quá trình xử lý hiệu ứng.
Các ưu tiên chính của đa luồng xử lý bao gồm:
Cải thiện tốc độ xử lý
: Nhiều luồng xử lý các bài hát tệp, tận dụng tối đa sức mạnh tính toán của CPU đa lõi.
Giảm quá trình xử lý thời gian
: Thời gian cần thiết để xử lý số lượng lớn tệp có thể giảm đáng kể thông qua bài hát xử lý.
Cải thiện việc sử dụng tài nguyên
: Vào/ra.
2. Thực hiện xử lý đa luồng Java
Java cung cấp nhiều cách khác nhau để phát triển luồng đa, bao gồm các kế hoạch cường lớp Thread, phát triển giao diện Runnable và sử dụng ExecutorService. ở đó, việc sử dụng ExecutorService để quản lý thread pool là cách được khuyên dùng hơn vì nó linh hoạt và mạnh mẽ hơn.
1. Thừa kế
Chủ đề
loại
Nhưng phương thức chạy của nó. Giải pháp này không đủ hoạt động vì Java không được hỗ trợ đa phương tiện.
2. Thực hiện
Có thể chạy
Bằng cách phát triển giao diện Runnable, các luồng tác vụ có thể được tách ra khỏi luồng đối tượng, làm cho nó trở nên hoạt động và được xuất ra hơn.
3. Sử dụng
Thực thi dịch vụ
Thông qua ExecutorService, bạn có thể dễ dàng gửi tác vụ, quản lý luồng nhóm và đóng luồng nhóm.
Dưới đây là ví dụ mã chi tiết sử dụng ExecutorService để xử lý tệp. tệp từ một thư mục và thực hiện xử lý đơn giản trên mỗi tệp (chẳng hạn như đọc nội dung tệp và xuất ra control panel).
nhập java.io.BufferedReader; nhập java.io.File; nhập java.io.FileReader; nhập java.io.IOException; nhập java.util.ArrayList ; java.util.concurrent.ExecutorService; java.util.concurrent.Executors; nhập java.util.concurrent.Future lớp công khai MultiThreadFileProcessor { // THREAD_POOL_SIZE = 10;
files = getFilesFromDirectory(directoryPath); // Tạo một nhóm ExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE); // Gửi các tác vụ tới List luồng nhóm<>
> Tương lai = tệp ArrayList<>() mới) { Có thể gọi được
task = new FileProcessingTask(file); Futures.add(executorService.submit(task)); } // Đóng luồng (không chấp nhận nhiệm vụ mới) executorService.shutdown(); hoàn thành nhiệm vụ và nhận kết quả cho (Future
tương lai : tương lai) { thử { // Lấy kết quả xử lý của chuỗi tác vụ = tương lai.get(); System.out.println(result } Catch (InterruptedException | ExecutionException e) { e.printStackTrace() } } } // Lấy tất cả các tệp trong Danh sách tĩnh riêng tư thư mục
getFilesFromDirectory(StringdirectoryPath) { Danh sách
files = new ArrayList<>(); ; if (directory.exists() && folder.isDirectory()) { File[] fileArray = folder.listFiles(); ()) { files.add(file); } } } } return files } // Lớp xử lý tệp lớp tĩnh FileProcessingTask phát triển khai Callable
{ Private File file; public FileProcessingTask(File file) { this.file = file; } @Override public String call() xử lý ngoại lệ { StringBuilder sb = new StringBuilder(); .append(file.getName()).append("\n"); // Sử dụng use BufferedReader to read file nội dung thử (BufferedReader reader = new BufferedReader(new) FileReader (tep))) { Line string; while ((line = reader.readLine()) != null) { sb.append(line). nối thêm("\n"); } } Catch (IOException e) { sb.append("Lỗi xử lý tệp: ").append(file.getName()).append(" - ") .append(e.getMessage()).append("\n "); } return sb.toString();
4. Giải thích mã chi tiết
Xác định luồng nhóm kích thước:
java sao chép mã riêng tư cuối cùng int THREAD_POOL_SIZE = 10;
Hằng số THREAD_POOL_SIZE được xác định rõ để biểu thị kích thước của luồng nhóm, được đặt thành 10 tại đây.
Lấy file để xử lý:
java sao chép mã List
files = getFilesFromDirectory(directoryPath);
Sử dụng phương thức getFilesFromDirectory để lấy tất cả các tệp trong thư mục đã chỉ định.
Tạo một nhóm chủ đề:
java sao chép mã ExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
Sử dụng phương thức Executors.newFixedThreadPool để tạo nhóm luồng có kích thước cố định.
Gửi tác vụ đến nhóm chủ đề:
for (Tệp tệp : files) { Callable
task = new FileProcessingTask(file); Futures.add(executorService.submit(task) }
Đối với mỗi tệp, hãy tạo một tác vụ FileProcessingTask và gửi nó tới nhóm luồng. Kết quả của nhiệm vụ được lưu trữ trong danh sách tương lai.
Đóng nhóm chủ đề:
java sao chép mã executorService.shutdown();
Gọi phương thức tắt máy để đóng nhóm luồng, cho biết rằng nó sẽ không chấp nhận các tác vụ mới nữa.
Đợi mọi công việc hoàn thành và nhận kết quả:
for (Tương lai
tương lai: tương lai) { try { String result = Future.get(); System.out.println(result); } Catch (InterruptedException | ExecutionException e) { e.printStackTrace();
Sử dụng phương thức Future.get() để chờ hoàn thành từng nhiệm vụ và nhận kết quả. Nếu một ngoại lệ xảy ra trong quá trình thực thi tác vụ, thông tin ngoại lệ sẽ được in ra bàn điều khiển.
Lớp tác vụ xử lý tệp:
lớp tĩnh FileProcessingTask triển khai Callable
{ // ... }
Lớp FileProcessingTask triển khai giao diện Callable
và ghi đè phương thức gọi. Trong phương thức gọi, sử dụng BufferedReader để đọc nội dung tệp và lưu trữ nội dung đã đọc trong đối tượng StringBuilder. Cuối cùng, kết quả xử lý được trả về.
Thông qua phần giới thiệu và ví dụ về mã của bài viết này, chúng ta đã học được cách sử dụng đa luồng Java để xử lý tệp. Sử dụng công nghệ đa luồng có thể cải thiện đáng kể hiệu quả xử lý tệp, đặc biệt là xử lý các tác vụ có số lượng tệp lớn. Trong các ứng dụng thực tế, kích thước của nhóm luồng và việc thực hiện các tác vụ xử lý tệp có thể được điều chỉnh theo nhu cầu cụ thể. Tôi hy vọng bài viết này hữu ích cho bạn. Nếu bạn có bất kỳ câu hỏi hoặc đề xuất nào, xin vui lòng để lại tin nhắn để liên lạc.
Cuối cùng, bài viết này về giải thích chi tiết và ví dụ mã của tệp xử lý đa luồng Java kết thúc ở đây. Nếu bạn muốn biết thêm về giải thích chi tiết và ví dụ mã của tệp xử lý đa luồng Java, vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục. duyệt các bài viết liên quan tôi hy vọng tất cả các bạn sẽ ủng hộ blog của tôi trong tương lai! .
Chế độ thiết kế chính - chế độ trang trí
DDD, bạn có thực sự hiểu rõ về nó không? Làm thế nào để hiểu chính xác "đối tượng giá trị"
CogAgent-9B-20241220, mẫu CogAgent mã nguồn mở mới nhất của Zhipu, đi trước một cách toàn diện so với tất cả các mẫu GUIAgent mã nguồn mở và đóng.
DDD, bạn có thực sự hiểu rõ về nó không? Làm thế nào để hiểu chính xác “đối tượng giá trị”-6ren
DDD, bạn có thực sự hiểu rõ về nó không? Làm thế nào để hiểu chính xác “đối tượng giá trị” - Trong những năm gần đây, với sự phát triển không ngừng của ngành công nghiệp phần mềm, các hệ thống phần mềm bắt đầu ngày càng trở nên phức tạp và khó bảo trì. Tại thời điểm này, ngày càng nhiều nhóm phát triển bắt đầu chọn thực hành thiết kế dựa trên miền DDD. Thiết kế hướng miền là một ý tưởng thiết kế phần mềm rất xuất sắc, có thể giúp chúng ta sắp xếp các hoạt động kinh doanh phức tạp rất tốt-6ren
Thời gian cập nhật: 26-12-2024 22:45:52
Trong những năm qua, với sự phát triển không ngừng của ngành công nghiệp phần mềm, các hệ thống phần mềm ngày càng trở nên phức tạp và khó bảo trì hơn. Tại thời điểm này, ngày càng nhiều nhóm phát triển bắt đầu chọn thực hành thiết kế dựa trên miền DDD. Thiết kế hướng miền là một ý tưởng thiết kế phần mềm rất xuất sắc. Nó có thể giúp chúng ta sắp xếp các hoạt động kinh doanh phức tạp và giải quyết việc thiết kế, phát triển, cập nhật và bảo trì các hệ thống kinh doanh quy mô lớn. Tuy nhiên, chi phí học theo miền rất cao, khiến nhiều sinh viên khó hiểu chính xác về DDD và khó thực hiện thiết kế và mã hóa các dự án thực tế. Vì mục đích này, thông qua loạt bài chia sẻ kiến thức này, tôi muốn mọi người hiểu một cách thực sự và chính xác những khái niệm mơ hồ này trong DDD, đặc biệt là cách chúng được triển khai cuối cùng trong thiết kế và phát triển các dự án phần mềm.
Hôm nay, trước tiên chúng ta thảo luận về khái niệm rắc rối và khó hiểu nhất trong DDD - "đối tượng giá trị" là gì? Để hiểu ý tưởng thiết kế về "đối tượng giá trị", trước tiên chúng ta hãy phân loại ý tưởng cốt lõi của điều khiển miền. Domain-driven tin rằng bản chất của phần mềm là sự mô phỏng của thế giới thực. Tiêu chí duy nhất để xác định liệu tất cả logic nghiệp vụ trong phần mềm có đúng hay không là liệu nó có nhất quán với thế giới thực hay không. Nếu chúng nhất quán thì thiết kế sẽ ổn, nếu không người dùng sẽ đưa ra lỗi hoặc thay đổi yêu cầu. Miễn là chúng ta hiểu được bản chất này thì thiết kế phần mềm rất đơn giản: trước tiên chúng ta hiểu hoạt động kinh doanh trong thế giới thực và sau đó hình thành sự hiểu biết của chúng ta về hoạt động kinh doanh thành thiết kế phần mềm.
Tuy nhiên, có một câu hỏi ở đây, đó là phần mềm tương ứng với thế giới thực như thế nào? Sự tương ứng này được thể hiện ở ba khía cạnh sau:
1) Dù có gì trong thế giới thực thì sẽ có đối tượng trong thế giới phần mềm;
2) Những thứ này có những hành vi gì trong thế giới thực và những đối tượng này trong thế giới phần mềm có những phương pháp gì;
3) Mối quan hệ giữa những thứ này trong thế giới thực là gì và mối quan hệ giữa những đối tượng này trong thế giới phần mềm là gì.
Do đó, khi thiết kế phần mềm, trước tiên chúng tôi sử dụng các kịch bản kinh doanh làm đơn vị để phân tích từng đối tượng miền trong từng kịch bản kinh doanh cũng như hành vi và mối quan hệ của chúng với nhau để tạo thành một mô hình miền. Sau đó lấy mô hình miền làm cốt lõi để hoàn thiện việc thiết kế và phát triển phần mềm.
Ví dụ: nếu chúng ta muốn thiết kế một hệ thống thương mại điện tử, nó sẽ được chia thành nhiều chức năng tùy theo nhu cầu kinh doanh và mỗi chức năng là một kịch bản kinh doanh. Ví dụ: trong kịch bản kinh doanh "đặt hàng", những thứ trong thế giới thực là gì? Đầu tiên là "đơn hàng", có thể tạo thành một đối tượng đơn hàng; mỗi đơn hàng tương ứng với một người dùng, nhưng một người dùng có thể có nhiều đơn hàng, do đó có mối quan hệ "nhiều-một" từ đơn hàng đến người dùng; địa chỉ, nhưng một đơn hàng chỉ có thể tương ứng với một địa chỉ...Như được hiển thị bên dưới, chúng tôi thực hiện theo các bước sau để phân tích từng đối tượng miền và mối quan hệ giữa chúng. Cuối cùng, chúng ta phải làm gì với đơn hàng? Có "đặt hàng", "thanh toán", "xem đơn hàng"...
Đây là mô hình miền. Các lớp như đơn hàng, người dùng, địa chỉ, chi tiết đơn hàng, v.v. đều là các đối tượng miền. Tuy nhiên, trong DDD, các đối tượng miền phải được phân chia chặt chẽ thành "thực thể" và "đối tượng giá trị". Lúc này, nhiều học sinh đang bối rối, thực thể là gì? Đối tượng giá trị là gì? Để hiểu chính xác nơi này, trước tiên chúng ta hãy xem cuốn sách gốc "Thiết kế hướng tên miền" nói gì.
Thực thể: Còn được gọi là Đối tượng tham chiếu, nó có vòng đời và trong vòng đời, hình thức và nội dung của nó có thể thay đổi, nhưng danh tính của nó sẽ không bao giờ thay đổi. Điều đó có nghĩa là, mỗi thực thể có một mã định danh duy nhất, chẳng hạn như ID người dùng, được sử dụng để phân biệt "anh ấy" với những người khác trong thế giới thực. Các thực thể có vòng đời, chẳng hạn như đăng ký và hủy bỏ người dùng; mọi thứ trong thực thể có thể thay đổi, ví dụ: Xiao Zhang đã chuyển tài khoản của mình cho Li Si, nhưng ID tài khoản sẽ không thay đổi. Mã định danh duy nhất này là khóa chính Trong hình thức thiết kế này, người dùng có ID người dùng, tài khoản có ID tài khoản và đơn hàng có ID đơn hàng, đây là thiết kế của các thực thể. Rõ ràng, mọi người đều có thể hiểu được thiết kế này và mấu chốt là "đối tượng giá trị".
Đối tượng giá trị: Việc mô tả các đối tượng giá trị trong cuốn “Thiết kế hướng miền” tương đối mù mờ, nhưng chúng ta có thể tóm tắt đại khái thành các đặc điểm sau: phần khai báo đối tượng và các thuộc tính trong đối tượng đều không thay đổi và có thể được tham chiếu và chia sẻ bởi nhiều đối tượng (chứ không phải sao chép), đây là "đối tượng giá trị". Làm thế nào để hiểu những đặc điểm này?
Ví dụ: trong thế giới thực, người dùng có thể có nhiều đơn hàng, vì vậy khi truy vấn đơn hàng, mỗi đơn hàng là một đối tượng đơn hàng và mỗi đối tượng đơn hàng có ID đơn hàng khác nhau. Vì vậy, việc thiết kế đơn đặt hàng là một thực thể. Tuy nhiên, mỗi đơn hàng phải tham chiếu đến một người dùng, trỏ đến một đối tượng người dùng. Vậy ai thực hiện nhiều đơn hàng từ cùng một người dùng trỏ tới? Rõ ràng, người dùng này không thể được sao chép vào nhiều đối tượng, nhưng tất cả các lệnh này đều đề cập đến một đối tượng này. Nói cách khác, đối tượng "người dùng" ở đây là một đối tượng giá trị.
Tuy nhiên, đối tượng giá trị phải là bất biến. Nghĩa là, nếu "người dùng" là một đối tượng giá trị thì người dùng và các thuộc tính liên quan của nó phải là bất biến. Nhưng thực tế là người dùng và thông tin người dùng của họ có thể thay đổi và chúng tôi sẽ thêm, xóa và sửa đổi thông tin người dùng. Đúng vậy, trong thế giới thực, mọi thứ đều thay đổi và không có gì giữ nguyên. Vậy làm thế nào để hiểu được tính bất biến của các đối tượng giá trị?
Trong mô hình miền DDD, ngoài mô hình miền, còn có một thiết kế rất quan trọng gọi là "bối cảnh giới hạn". Mô hình miền mô tả thế giới thực, nhưng thế giới thực là vô hạn Vậy mô hình miền mô tả thế giới thực như thế nào? DDD chia hoạt động kinh doanh của một hệ thống phức tạp thành nhiều bối cảnh bị giới hạn và sau đó thực hiện mô hình hóa miền trong từng bối cảnh bị giới hạn. Theo cách này, mỗi mô hình miền đều có ranh giới riêng và tôi chỉ mô tả hoạt động kinh doanh của mình trong ranh giới này. Kiểu thiết kế này có thể "phân chia và chinh phục" thế giới phức tạp và việc phân tích từng mô hình miền trở nên đơn giản.
Ví dụ: trong trường hợp trên, trước tiên bạn có thể chia việc quản lý người dùng và hồ sơ người dùng của họ thành một ngữ cảnh, được gọi là "bối cảnh người dùng". Trong ngữ cảnh này, người dùng và các thuộc tính của họ có thể thay đổi và cần được thêm, xóa và sửa đổi, do đó thiết kế của đối tượng "người dùng" là một thực thể. Tuy nhiên, trong một "bối cảnh đơn hàng" khác, đơn hàng là một thực thể cần được thêm, xóa hoặc sửa đổi, nhưng "người dùng" và "địa chỉ" được tham chiếu bởi đơn hàng là các đối tượng giá trị. Điều đó có nghĩa là, trong ngữ cảnh đặt hàng, "người dùng" và "địa chỉ" ở chế độ chỉ đọc và chỉ được sử dụng để tham chiếu đối tượng đặt hàng mà không thêm, xóa hoặc sửa đổi chúng. Theo cách này, "người dùng" và "địa chỉ" làm đối tượng giá trị phản ánh tính chất chỉ đọc và bất biến của chúng.
Nếu thiết kế microservice được áp dụng, "cảnh báo người dùng" và "cảnh đặt hàng" sẽ được chia thành các dịch vụ trong mô-đun Người dùng microservice có cơ sở dữ liệu người dùng dữ liệu và microservice set row có đơn cơ sở dữ liệu. Khi microservice đơn hàng muốn truy vấn đơn hàng, nó sẽ lấy đối tượng người dùng liên quan đến đơn hàng bằng cách gọi giao diện của microservice user use. Đây là một khái niệm khái niệm về "giá trị tượng trưng" và việc phát triển thiết kế của họ.
Hoạt động kinh doanh cốt lõi trong bối cảnh là việc bổ sung, xóa và sửa đổi các thực thể, trong khi giá trị đối tượng được nhận liên kết với thực thể và được sử dụng chỉ để tham khảo và truy vấn đặc điểm của các đối tượng. giá trị biểu tượng được đọc chỉ, nhưng có hai dạng hiệu suất trong thực tế dự án:
1) Cần lấy tham chiếu đến các đối tượng trong các dịch vụ khác bằng cách gọi giao diện của các dịch vụ khác. dữ liệu không có trong cơ sở dữ liệu cục bộ của tôi mà chỉ tồn tại trong bộ nhớ và không thể sửa đổi, chỉ được truy vấn;
2) Một số loại thuộc tính từ điển dữ liệu, danh mục, danh mục tương thích, mặc định dữ liệu đã được lưu Ví dụ Ví dụ: thành viên cấp độ, quy tắc tính điểm, phương thức thanh toán, vv
(còn tiếp).
Cuối cùng, bạn đã thực sự hiểu rõ về DDD trong bài viết này chưa? end ở đây. Thêm về DDD, bạn có thực sự hiểu rõ về nó không? tôi hy vọng mong bạn sẽ ủng hộ blog của tôi trong tương lai .
Ghi chú phát triển phần cứng (32): Design set source TPS54331 (5): xuất bảng BOM sơ đồ, xác minh bao bì linh kiện
trố - đúng = sai == đúng
Câu hỏi này đã có câu trả lời ở đây: Đã đóng 12 năm trước. đúng/sai như tôi mong đợi?
ruby - đúng&&true==false?
Ruby? a = %w(foo bar baz) a.include? "foo" # => true a.size == 3
mô hình đánh giá = true
Modelica Modelica, chú thích Đánh giá đầy đủ ảnh hưởng đến các tham số: https://build.openmodelica.org/Documentation/ModelicaReferenc
coldfusion - Sử dụng chuyển đổi trường hợp hợp (đúng) trong phản ứng tổng hợp lạnh?
Tôi sử dụng if lồng nhau và cải thiện khả năng đọc, tôi muốn tạo một lệnh switch(true){ ... } Coldfusion Coldfusion
chuyển đổi javascript (đúng)
Xin chào, tôi đang cố gắng xử lý phản hồi ajax json, đây là mã của tôi thành công: function (j) { switch(true) { case (j.cho
địa chỉ: đếm == sai
Tôi đã sử dụng điều này trước đây trong TF mã hóa của mình: count = "${var.whatever == "true" ? 1 : 0}" hoạt động hoàn hảo cho những gì tôi muốn sử dụng.
MYSQL - Bảng tổng hợp sai/sai
MySQL? (10 câu trả lời) Đã đóng 5 năm trước.
Java - Đặt màn hình (đúng)
Vì vậy, trong hộp thoại, có một phương thức display() trong đó tôi gọi setVisible(true) nhiều lần.
bash chuyển hướng sai/sai
Trong bash 4.2.8(1)-release (x86_64-pc-linux-gnu) trên Ubuntu 11.04 lệnh này [ $(wc -l /var/www/some.log|cut -
c - dừng lại một lúc khi có tín hiệu (đúng)
Tôi đang sử dụng ngôn ngữ c để xử lý đồng thời và tôi có một quy trình nhóm. Để thực hiện điều này, tôi đặt từng quy trình. con element in a while loop (True). tín hiệu để sửa đổi nó để phá vỡ
mysql - chọn từ = true
Tôi đang cố gắng chọn một cơ sở dữ liệu có trường được điền vào. $requete = "CHỌN * TỪ NGÀY NGHỈ Ở ĐÂU
JavaMail setDebug(true)
(Không cần tải mã) nguồn, thay đổi phương thức chấp nhận làm tham số luồng, biên dịch lại luồng, ...) Tổng thông hơn là Java
Chức năng đúng/sai của Javascript
JavaScript: var magicVar = Math.sin // nó trả về false m
MySQL - Truy vấn Đúng/Sai trả lời khác nhau trên hai máy chủ
(Xây dựng từ cùng một vòng/phút) - Ở đâu đó, một số nhà phát triển đã thay đổi điều đó... Máy chủ 1: mysql> choose ( không
Toán tử có điều kiện không có giá trị thay đổi (đúng)?
OpenSSL và tìm thấy các macro sau từ crypto/stack/safestack.h: #define CHECKED_STACK_OF(type, p) \
Ruby, biểu thức đúng/sai
Vì vậy, tôi gặp phải sự cố, biểu thức chính quy của tôi trông như thế này: /true|false/. giá trị đúng của biểu thức chính này, có cách nào để giới hạn nó ở mức độ chính xác là đúng hoặc sai không
javascript - biến không xác định = true;
JavaScript độc hại này: var und xác định = true; Mọi biến thể chưa được khởi động JavaScript JavaScript đều có giá trị bằng không
php - Độ phân tích dài của vi mô thời gian (đúng)?
MySQL. MySQL. lưu trữ nó, nhưng tôi không thể tìm thấy kích thước lý tưởng. microtime(true) là bao nhiêu không, vậy
php - Nhận biến mạnh "true"
Trong PHP, khi bạn đưa bất kỳ nội dung nào như "var=true" vào một URL, thì "true" và "false" trong URL có thể được chuyển đổi thành các biến boolean hay bằng văn bản "true" hoặc "false" "? Ví dụ
Điểm chuẩn đánh giá tự động | Thiết kế nhiệm vụ đánh giá tự động của bạn - 6ren
Thiết kế nhiệm vụ đánh giá tự động của bạn - Thiết kế nhiệm vụ đánh giá tự động động của bạn Đây là bài viết thứ hai trong loạt bài đánh giá điểm chuẩn tự động, vui lòng lưu ý đến loạt bài viết: Các khái niệm cơ bản Thiết kế nhiệm vụ đánh giá tự động của bạn Một số kỹ thuật và Mẹo kiểm tra đánh giá Chọn data-6ren
Điểm chuẩn đánh giá tự động | Thiết kế nhiệm vụ đánh giá tự động của bạn
Thời gian cập nhật: 26-12-2024 22:49:42
Đây là bài thứ 2 trong loạt bài viết về đánh giá tự động điểm chuẩn. Mời bạn theo dõi loạt bài.
Choose data file
Khi thực hiện đánh giá, bạn có thể chọn hiện dữ liệu (tham khảo một số trang đánh giá dữ liệu) làm kiểm tra tập tin hoặc bạn có thể thiết kế dữ liệu của riêng mình. Giá cả có mối liên kết chặt chẽ với chất lượng của dữ liệu được đánh giá.
Use a current data file
Rất khuyến khích đọc phần này một cách thận trọng .
Các vấn đề cần quan tâm với dữ liệu
Ai đã tạo ra mẫu? đại loại như sau: xây dựng dữ liệu chuyên sâu > ghi chú dữ liệu phải trả tiền > có dữ liệu nguồn gốc từ cộng đồng > MTurk data. của dữ liệu, điều này có thể giúp hiểu được ngôn ngữ đa dạng của dữ liệu.
Các mẫu đã được chú thích hoặc tác giả khác chưa xem xét? Bạn cần phải tìm ra nó trước đó:
Kết quả chú thích của các chú thích khác nhau có ít nhất quán không?
Đầy đủ dữ liệu đã được các tác giả xem xét chưa?
Người chú thích thường không phải là người bản ngữ của ngôn ngữ đích (ví dụ: AWS Mechanical Turk), nếu không, họ có thể mắc lỗi chính tả, lỗi ngữ pháp hoặc câu trả lời vô nghĩa.
Người chú thích có được hướng dẫn rõ ràng về cách tạo dữ liệu không? Nói cách khác, các tiêu chuẩn ghi nhãn có nhất quán giữa các mẫu tập dữ liệu không?
Kiểm tra mẫu
Chọn ngẫu nhiên 50 mẫu để kiểm tra thủ công:
Kiểm tra chất lượng
Câu hỏi có rõ ràng và rõ ràng không?
Câu trả lời tương ứng có đúng không? (
Ví dụ: TriviaQA thường chứa nhiều câu trả lời tiêu chuẩn cho mỗi câu hỏi và đôi khi những câu trả lời này xung đột với nhau.
Thông tin có đầy đủ không? (
Ví dụ: MMLU có nhiều câu hỏi thiếu sơ đồ tham khảo.
Kiểm tra sự phụ thuộc của nhiệm vụ
Các câu hỏi mẫu có phải là loại câu hỏi cho một nhiệm vụ đánh giá LLM cụ thể không?
Các mẫu có liên quan đến các trường hợp thử nghiệm không?
Số lượng mẫu tập dữ liệu cũng quan trọng không kém (để đảm bảo rằng các kết quả điểm chuẩn đánh giá tự động có ý nghĩa thống kê, thường cần ít nhất 100 mẫu thử nghiệm).
Thiết kế bộ dữ liệu của riêng bạn
Có 3 phương pháp thiết kế:
Tích hợp dữ liệu
Để đánh giá khả năng thực hiện một tác vụ cụ thể của mô hình bằng bộ thử nghiệm của riêng bạn, bạn có thể đối chiếu và tổng hợp nó từ các nguồn dữ liệu sẵn có khác nhau. Trên thực tế, có nhiều bộ kiểm tra đánh giá được xây dựng theo cách này, chẳng hạn như MATH và LSAT tổng hợp các bộ dữ liệu đánh giá con người. Tất nhiên, khi sắp xếp dữ liệu của bạn, vui lòng làm theo các bước kiểm tra chất lượng và mức độ liên quan của nhiệm vụ ở trên.
Chú thích thủ công
Về nội dung chú thích của con người, hướng dẫn này có phần giới thiệu chi tiết khá dài, bạn có thể nhấp vào Sử dụng con người chú thích để tự đọc.
dữ liệu tổng hợp
Phần tổng hợp sử dụng LLM này các bạn có thể tham khảo blog Cosmopedia của nhân viên HF nhé! Mặc dù bài viết này tập trung vào cách xây dựng tập huấn luyện nhưng các ý tưởng và kỹ thuật cũng có thể áp dụng để xây dựng tập kiểm tra. Bộ kiểm tra tổng hợp vẫn cần được kiểm tra thủ công (làm theo các bước trên).
Tổng hợp dựa trên quy tắc là một phương pháp tuyệt vời để thu được các mẫu thử nghiệm gần như không giới hạn và tránh ô nhiễm dữ liệu nếu nhiệm vụ cho phép. Tham khảo NPHardEval, DyVal, MuSR, BabiQA, v.v.
Chọn phương pháp suy luận
Ngoài bộ kiểm tra, bạn cũng cần chọn phương pháp suy luận phù hợp.
Đối với các bài tập trả lời câu hỏi trắc nghiệm (thường dùng để kiểm tra kiến thức hoặc khả năng phân biệt của mô hình), sử dụng log-probability (MCQA) rất hiệu quả.
Nó được đảm bảo rằng tất cả các mô hình có thể có được câu trả lời chính xác.
Khả năng cung cấp proxy "độ tin cậy" của mô hình (cũng như hiệu chuẩn).
Tốc độ đánh giá nhanh, đặc biệt đối với các tác vụ dự đoán mã thông báo đơn (chọn chỉ mục A/B/C/D hoặc Có/Không, v.v.).
Cho phép thu được tín hiệu về hiệu suất nhiệm vụ của các mô hình nhỏ.
Có thể đánh giá quá cao hiệu suất của các mô hình nhỏ. Nếu không có hạn chế nào, nội dung do mô hình tạo ra sẽ vượt quá phạm vi tùy chọn.
Kết quả lượng có thể không mang tính đại diện. tự có nhiều lựa chọn.
Đối với các nhiệm vụ kiểm tra tính lưu loát, lý luận hoặc khả năng trả lời câu hỏi của mô hình, việc sử dụng thế hệ QA rất hiệu quả.
Phù hợp với mối quan tâm của con người, đó là khả năng LLM tạo ra văn bản trôi.
Có thể gặp khó khăn khi tính điểm (xem bên dưới
data
phần).
Chi phí cao hơn một chút để đánh giá khả năng ghi nhật ký, đặc biệt đối với các mẫu yêu cầu tìm kiếm nhiệm vụ.
Chọn lời nhắc
Các vấn đề chính về thiết kế nhanh:
Lượng thông tin được cung cấp cho mô hình về nhiệm vụ
Cách cung cấp thông tin cho mô hình
Mô hình thiết kế lời nhắc chung cho các nhiệm vụ MCQA hoặc QA thường bao gồm các phần sau:
Nhiệm vụ lời nhắc (tùy chọn): Nhiệm vụ mô tả.
Bối cảnh: Cung cấp thêm thông tin cơ bản cho câu hỏi.
Ví dụ: Đối với nội dung nhiệm vụ sum họp hoặc trích xuất thông tin, nguồn nội dung có thể được cung cấp
Câu hỏi: Nội dung cốt lõi của lời nhắc.
Đối với các thử nghiệm đánh giá nhiệm vụ, có thể bổ sung các tùy chọn.
liên kết (
Option
Chờ đợi).
Những điều cần lưu ý khi có lời nhắc xác định:
Ngay lập tức những thay đổi rất nhỏ trong lời nhắc tương thích về mặt nghĩa cũng có thể dẫn đến kết quả rất khác nhau (xem Khả năng tái tạo giải quyết sự cố để biết chi tiết)
Lời nhắc khác nhau
phần) và lời nhắc định dạng cũng có thể hoạt động ở đầu ra của một mô hình.
Làm cách nào để giảm thiểu vấn đề này:
Phương pháp tiếp cận chi phí cao: nhiều cách đánh giá sử dụng các biến thể có thể đáp ứng theo từng thời điểm khác nhau.
Phương pháp chi phí thấp: Sử dụng nhiều nhắc nhở kiểu để chỉ định nhiều thử nghiệm mẫu có độ khó tương thích với giá đánh giá một lần.
Các ví dụ có thể được thêm vào thông báo nhắc nhở qua các kết nối.
Lưu ý rằng mô hình có thể có xu hướng phù hợp quá mức với một số định dạng nhanh nhất.
Bài viết này khám phá điều này chi tiết hơn, tìm thấy một số mô hình hoạt động tốt hơn qua thử nghiệm
Giá điểm quá cao do trang bị quá mức.
LLM Leaderboard 2, Llama 3.2 và Qwen 2.5 không còn cung cấp định dạng nhắc nhở cho các ví dụ về một số cảnh quay vì lý do này.
Đối với một số thử nghiệm nhiệm vụ chỉ số, bạn có thể muốn giới hạn kết quả đầu ra của mô hình ở một vi phạm nhỏ.
Bạn có thể chuyển đến trang Suy luận và đánh giá Mô hình
Force đầu ra của mô hình
Phần để biết thêm thông tin.
Bấm vào các giá trị đánh giá chỉ
Nếu bạn tập trung vào đánh giá ký hiệu xác thực, số liệu bạn mong đợi sẽ đơn giản: độ chính xác (tầng suất) chọn tùy chọn tốt nhất). Nếu hết, bạn muốn chuẩn hóa (thứ dữ liệu) will return nên phức tạp, thu hồi hoặc điểm F1.
Với đánh giá tổng hợp, bạn sẽ mong đợi một số lượng dữ liệu vi phạm lớn hơn đối với điều này mà bạn cần:
Xác định số đo của các kết quả được tạo, so sánh trực tiếp các kết quả được tạo ra hay sử dụng một số phương pháp để chuẩn hóa trước đó.
Nhưng nhìn chung, họ đều cung cấp tín hiệu ở cấp độ nhiệm vụ.
Tiêu chuẩn hóa hóa rất quan trọng đối với một số nhiệm vụ nhất định (ngoài giới hạn như đánh giá khả năng học toán) vì bạn có thể cần phải trích xuất hợp lệ kết quả từ đầu ra được định dạng.
Nếu bạn muốn đánh giá độ chính xác bằng cách bổ sung các cơ chế như suy nghĩ chuỗi thì việc chuẩn hóa cũng quan trọng không nguy hiểm vì bạn cần loại bỏ dấu vết suy luận khỏi kết quả thực tế.
Xác định kết quả được tạo ra như thế nào để trả lời câu hỏi tham khảo.
Bạn có thể sử dụng bất kỳ phương pháp so sánh nào. tiền tố, vv; thêm các đánh giá chỉ số.
Nói chung, việc lựa chọn thước đo giá nào sẽ phụ thuộc vào nội dung nhiệm vụ của bạn. lĩnh vực (như y tế, chatbot), bạn có thể không muốn đánh giá hiệu suất trung bình mà cần đánh giá hiệu suất gần nhất (tiếc (Bạn có thể kiểm tra blog này để tìm hiểu thêm).
Nhiệm vụ mới thông tin: Kiểm tra chức năng là gì?
Đối với mã miền, rõ ràng là việc đánh giá nghĩa của mã được tạo là chưa đủ, người ta phải kiểm tra mã thực hiện như thế nào. đoạn mã được tạo bởi một dấu nhắc nhanh nhất, hãy kiểm tra và đánh giá giá trị của dữ liệu có thể vượt qua bài kiểm tra đơn vị một cách chính xác hay không.
Phương pháp thử nghiệm chức năng cực kỳ hứa hẹn vì:
Giúp tạo các trường hợp kiểm tra một cách dễ dàng hơn (trong hầu hết các trường hợp, các trường hợp kiểm tra có thể được tạo dựa trên quy tắc)
Giảm trang quá mức
Một mô hình có thể được đánh giá về khả năng của công cụ chủ
.
IFEval là một ví dụ điển hình, nó là giá trị tiêu chuẩn được sử dụng để kiểm tra khả năng làm theo hướng dẫn của mô hình, bằng cách tạo nhiều định dạng hướng dẫn (ví dụ: thêm một số ký hiệu đặc biệt được chỉ Ý tưởng Việc kiểm tra các chức năng vẫn cần nhiều công việc hơn để có thể mở rộng các tính năng thử nghiệm khác!
Văn bản gốc tiếng Anh: https://github.com/huggingface/evaluation-guidebook/blob/main/translations/zh/contents/automated-benchmarks/designing-your-automatic-evaluation.md.
Cuối cùng, bài viết này về đánh giá chuẩn tự động | ở đây. hoặc tiếp tục duyệt các bài viết liên quan. Sẽ hỗ trợ blog của tôi trong tương lai!
Lập trình đồng thời - tạo, xử lý sự cố và giải quyết quy tắc
PostgreSQL
Scoop: Công cụ quản lý đa môi trường dành cho nhà phát triển-6ren
Scoop: Công cụ quản lý môi trường dành riêng cho nhà phát triển - Scoop là gì? quản lý ứng dụng và phát triển môi trường một cách hiệu quả. gói thông tin qua lệnh và cung cấp phương pháp tổ chức gói đơn giản và dễ sử dụng, minh bạch -6ren
Scoop: Công cụ quản lý môi trường đa dạng dành cho nhà phát triển
Thời gian cập nhật: 27-12-2024 08:49:42
Scoop là gì?
Scoop là gói quản lý dựa trên Windows có thể giúp các nhà phát triển quản lý hiệu quả các ứng dụng và môi trường phát triển.
Nó khuyến nghị cài đặt, cập nhật và cài đặt các gói thông tin qua lệnh dòng. đơn giản và dễ sử dụng, giúp quá trình cài đặt và quản lý trở nên minh bạch.
Vì vậy, khi cài đặt hệ thống truyền tải Windows của ứng dụng, Scoop cho phép người dùng sử dụng lệnh dòng để cài đặt ứng dụng vào thư mục cá nhân của người dùng, loại bỏ nhu cầu về đặc quyền của hệ thống quản trị viên.
Chúng ta hãy xem các ứng dụng được cài đặt cục bộ của tôi.
Cài đặt Scoop
Install thông tin sau.
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser Invoke-RestMethod -Uri https://get.scoop.sh |
Một số khái niệm cốt lõi của Scoop
Ví dụ: chính là Nhóm mặc định chính của Scoop. nhiều ứng dụng hơn. Thêm nhóm mới:
xyz bổ sung thêm các tính năng bổ sung
Ứng dụng
Ứng dụng là cốt lõi của Scoop, được sử dụng để chỉ các ứng dụng được cài đặt và quản lý, có giới hạn như Python, .NET, Node.js, vv
Thư mục gốc của chương trình
Scoop thường xuyên cài đặt các ứng dụng trong thư mục ~/scoop/apps/ để tạo điều kiện cho người dùng quản lý độc lập. Bạn có thể kiểm tra cài đặt đường dẫn bằng lệnh sau:
tiền tố mạnh mẽ
Version (phiên bản quản lý)
Hỗ trợ Scoop quản lý nhiều phiên bản của cùng một ứng dụng và phiên bản mà người dùng có thể chuyển đổi thay đổi bất kỳ lúc nào với bất kỳ thông tin chuyển đổi chức năng nào.
Nguyên tắc quản lý đa phiên bản
Việc quản lý nhiều phiên bản của Scoop được phát triển thông qua các thư mục khác nhau trong thư mục gốc của ứng dụng và mỗi thư mục bản sao được lưu trong một thư mục dành riêng:
~/múc/ứng dụng/
Scoop có thể hướng dẫn bạn đến phiên bản được chỉ định ngày hàng:
/hiện tại ->
Bằng cách này, người dùng có thể chuyển đổi phiên bản bất cứ lúc nào mà không cần cài đặt lại.
Cách cài đặt gói: Lấy .NET và Python làm ví dụ
Installing version
Các phiên bản cài đặt thông tin qua Phiên bản được sử dụng để quản lý các phiên bản cũ của ứng dụng:
Phiên bản bổ sung được trộn
Cài đặt .NET
Cài đặt .NET qua Scoop:
cài đặt dotnet-sdk
Xác định cài đặt:
Cài đặt cả hai phiên bản .NET
Cài đặt một phiên bản cụ thể:
tin sốt dẻo cài đặt dotnet6-sdk tin sốt dẻo cài đặt dotnet7-sdk
Chuyển đổi phiên bản:
thiết lập lại tin sốt dẻo dotnet6-sdk thiết lập lại tin sốt dẻo dotnet7-sdk
Cài đặt Python
Cài đặt Python thông qua Scoop:
cài đặt python
trăn --version
Cài đặt cả hai phiên bản Python
cài đặt phần mềm python27 phần cài đặt python310
thiết lập lại muỗng python27 thiết lập lại muỗng python310
Hoạt động cập nhật muỗng
Cập nhật chính Scoop
Cập nhật Scoop bằng lệnh sau:
cập nhật tin sốt dẻo
Cập nhật tất cả các gói đã cài đặt
Cập nhật tất cả các gói đã cài đặt lên phiên bản mới nhất:
cập nhật tin sốt dẻo*
Cập nhật các gói cụ thể
Nếu bạn chỉ cần cập nhật một gói cụ thể, chẳng hạn như Python:
cập nhật tin sốt dẻo python
Cấu hình phổ biến và giải quyết vấn đề
Đặt đường dẫn cài đặt chung
Nếu bạn cần định cấu hình đường dẫn cài đặt chung cho tất cả người dùng, bạn có thể sửa đổi cấu hình của Scoop:
cấu hình toàn cầu_path đúng
Xung đột biến môi trường
Khi chuyển đổi giữa các phiên bản khác nhau của ứng dụng, bạn có thể gặp phải xung đột biến môi trường. Đặt lại các biến môi trường bằng lệnh sau:
thiết lập lại tin sốt dẻo
Dọn dẹp các phiên bản lỗi thời
Làm sạch các phiên bản ứng dụng cũ để tiết kiệm dung lượng ổ đĩa:
dọn dẹp
Nhanh chóng xây dựng môi trường phát triển thông qua Scoop
Sử dụng Scoop, bạn có thể nhanh chóng xây dựng môi trường phát triển. Ví dụ:
Cài đặt mã VS
cài đặt vscode
Cài đặt Node.js
cài đặt nodejs
Cài đặt Git
cài đặt git
Với những lệnh đơn giản này, bạn có thể nhanh chóng xây dựng một môi trường phát triển đầy đủ chức năng.
Cuối cùng, bài viết về Scoop: công cụ quản lý đa môi trường dành cho nhà phát triển kết thúc ở đây. Nếu bạn muốn biết thêm về Scoop: công cụ quản lý đa môi trường dành cho nhà phát triển, vui lòng tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt các bài viết liên quan. tất cả Hãy ủng hộ blog của tôi trong tương lai! .
Truyền tải cài đặt và thay thế giao diện người dùng chính thức
15 phương pháp hay nhất của Karpenter để dễ dàng thành thạo việc chia tỷ lệ đàn hồi
"Xin chàoGitHub" Số 105
Khám phá lại iptables
15 phương pháp hay nhất của Karpenter để dễ dàng thành thạo việc chia tỷ lệ đàn hồi-6ren
15 phương pháp hay nhất của Karpenter để dễ dàng làm chủ quy mô đàn hồi - Karpenter là một công cụ mở rộng tự động cụm Kubernetes mã nguồn mở linh hoạt, hiệu suất cao hiện đang hỗ trợ AWS và Alibaba Cloud. Nó có thể nhanh chóng khởi động các tài nguyên máy tính có kích thước phù hợp tùy theo tải ứng dụng thay đổi, từ đó cải thiện tính khả dụng của ứng dụng. -6ren
Thời gian cập nhật: 27-12-2024 10:45:52
Karpenter là một công cụ mở rộng tự động cụm Kubernetes mã nguồn mở linh hoạt, hiệu suất cao, hiện hỗ trợ AWS và Alibaba Cloud. Nó có thể nhanh chóng khởi động các tài nguyên máy tính có kích thước phù hợp tùy theo tải ứng dụng thay đổi, từ đó cải thiện tính khả dụng của ứng dụng.
So với Cluster Autoscaler, tính linh hoạt, dễ sử dụng, kiểm soát chi tiết và mức độ tự động hóa cao của Karpenter là một nâng cấp lớn có thể giúp bạn điều chỉnh tài nguyên nhanh hơn, mở rộng kết quả mô hình và liên tục tối ưu hóa.
Giữa năm nay Karpenter tung ra phiên bản 1.0, nghĩa là dự án là GA.
Quá trình chuyển hướng chỉ mất trung bình 20 phút
Việc chuyển sang Karpenter bằng các nút nhóm do EKS quản lý và Fargate rất đơn giản và sẽ gây ra sự gián đoạn tối thiểu vì nó tương thích thích hợp với các cụm Kubernetes hiện có và tận dụng tiêu chuẩn Kubernetes tài nguyên.
"CloudPilot AI".
thợ mộc
CloudPilot AI được xây dựng trên Karpenter. chúng tôi biết khá rõ về Karpenter Sau đây là phương pháp hay nhất cho cấu hình Karpenter:
Use Fargate or group node chuyên dụng
bộ điều khiển đang chạy trên các nút mà nó không quản lý, nó có thể vô hiệu hóa các nút đó, gây mất ổn định hệ thống. Bằng cách sử dụng EKS Fargate, bộ điều khiển vẫn độc lập với các kho lưu trữ nút, đảm bảo tính năng và hiệu ứng ổn định. sức mạnh công việc của ứng dụng, ngăn chặn hơn nữa sự tranh chấp tài nguyên và cải thiện độ tin cậy.
Sử dụng nhóm đoạn ngân sách (PDB)
Karpenter yêu cầu lịch trình hủy bỏ các nút trong quá trình hoạt động bình thường của nó Cách duy nhất để đảm bảo độ tin cậy dịch vụ đáng tin cậy là thông báo cho người cài đặt lịch trình về nhu cầu của từng triển khai hoặc StatefulSet.
Lập trình đoạn ngân sách là rất quan trọng để duy trì tính năng ứng dụng trong quá trình cập nhật hoặc mở quy định mở rộng bằng cách giới hạn số lượng nhóm có thể bị gián đoạn bất kỳ lúc nào. Điều này giúp ngăn chặn thời gian. Ngoài ra, ngân sách hoạt động liên tục giúp cân bằng hoạt động và ở mức độ ổn định, đảm bảo rằng ít nhất một số nhóm tiếp tục chạy trong khi thực hiện Kubernetes.
Tránh sử dụng tùy chọn khởi động mẫu
Hướng dẫn của Karpenter khuyên bạn nên tránh các tùy chọn khởi động mẫu vì chúng không hỗ trợ nâng cấp tự động các nút, Hỗ trợ kiến ​​trúc đa dạng hoặc khám phá bảo mật nhóm.
Thay vì sử dụng mẫu khởi động, bạn có thể sử dụng tùy chỉnh người dùng dữ liệu trong nút AWS mẫu hoặc trực tiếp hơn tùy chỉnh AMI tiếp theo.
Định cấu hình hết hạn nút trong nút nhóm.
thợ mộc bất kỳ hoạt động nào liên tục. cải thiện tính năng bảo mật và ổn định của hệ thống.
Thiết lập nút nhóm dựa trên loại công việc khối lượng
Khối lượng công việc có khả năng chấp nhận thay đổi nút gần hơn, do đó, bạn nên thiết lập cấu hình chỉ use version Theo yêu cầu cho khối lượng công việc đó. có khả năng chịu lỗi, bạn có thể thiết lập nút nhóm chỉ bằng cách sử dụng phiên bản Spot.
Tạo nút nhóm có thể cho khối lượng công việc GPU hoặc tính toán chung
đối số với các tác vụ sử dụng nhiều GPU, nút nhóm được định cấu hình cho các phiên bản GPU sẽ đảm bảo khả năng sử dụng và sử dụng hiệu quả các tài nguyên chuyên sâu này.
Điều thú vị là phiên bản GPU trùng lặp nhanh hơn so với phiên bản điện toán thông thường. use GPU phiên bản cho khối công việc chung, miễn phí là nút nhóm và khối lượng công việc được định cấu hình chính xác thực. Phù hợp, tránh tranh chấp tài nguyên và quản lý công việc đơn giản hóa bằng cách cung cấp các chính sách và cấu hình mở rộng mô độc lập cho các loại công việc khối lượng khác nhau.
Tài nguyên chỉ định cho khai báo/Pod của bạn
Karpenter sẽ tính toán dựa trên yêu cầu tài nguyên của Pod nên tài nguyên phải được chỉ định cho Deployment/Pod. tài nguyên xác định có thể gây ra sự cố khi mở rộng cụm.
Phân phối Pod trên nhiều nút và vùng có sẵn
Việc phân phối Pod trên nhiều nút và vùng ứng dụng có thể nâng cao khả năng phục hồi và tính toán khả năng sử dụng của các ứng dụng Kubernetes. dịch vụ của mình vì nếu một nút hoặc vùng có sẵn bị lỗi thì khối lượng công việc vẫn có thể tiếp tục chạy trên các nút hoặc vùng khác có sẵn.
Karpenter tự động hóa hoạt động phân phối này bằng cách cung cấp các nút ở các khu vực sẵn có khác nhau, đảm bảo cân bằng bằng cách tải và tối ưu hóa công việc sử dụng tài nguyên. rằng Pod được phát triển theo các quy tắc cụ thể để tránh tranh chấp tài nguyên, cải thiện hiệu suất và độ tin cậy, đồng thời gian duy trì các dịch vụ không bị gián đoạn ngay khi các nút hoặc vùng có sẵn bị lỗi.
Ưu tiên các gói tiết kiệm hoặc phiên bản dự trữ
Quay lại đầu trang tiết kiệm chi phí hơn trước khi chuyển sang phiên bản Theo yêu cầu hoặc các loại phiên bản khác Chiến lược này giúp bạn tối ưu đa hóa công suất dự trữ và tiết kiệm chi phí trong khi vẫn duy trì tính linh hoạt cho việc mở rộng.
Phân chia phiên bản theo yêu cầu và phiên bản Spot
Cấu hình này cho phép bạn tạo một hợp nhất phiên bản cài đặt trong đó một phần trăm nút EKS được sử dụng theo Phiên bản yêu cầu và phần còn lại sử dụng Spot Session. tình trạng hoạt động liên tục và mang lại lợi ích về chi phí của phiên bản Spot.
Bạn hoàn tất cấu hình này bằng cách tạo riêng các nút nhóm cho phiên bản Spot và phiên bản Theo yêu cầu, đồng thời phân bổ các giá trị Sau đó, hãy định cấu hình thang đo bằng cách đặt giá trị của thẻ này. Nếu muốn chia 20/80, bạn có thể đặt giá trị ["2", "3", "4", "5"] cho nhóm nút Spot và giá trị ["1"] cho nút Theo yêu cầu bể bơi.
Bảo vệ các dịch vụ hàng loạt trong thời gian bị gián đoạn (hợp nhất)
Nhảy lò cò Tuy nhiên, quá This quy trình có thể làm gián đoạn các Pod đang chạy, bao gồm cả hàng loạt nhiệm vụ quan trọng.
Bằng cách sử dụng chú thích kapenter.sh/do-not-disrupt: “true”, bạn có thể bảo vệ các Pod này khỏi việc chuyển đổi hoặc gián đoạn cho đến khi Nhiệm vụ của họ đã hoàn thành, chắc chắn rằng họ thực hiện và hoàn thành.
Sau đó.
Bằng cách thiết lập gián đoạn, bạn sẽ cho Karpenter biết loại nút nào cần xem xét để hợp lý nhất. có thể tắt tính năng hoàn toàn hợp lý nhất bằng cách đặt chuỗi giá trị "Không bao giờ".
Các phương pháp nâng cao hay nhất
Update các nút bằng Drift
Sự kiện Trôi dạt có thể gây ra nhiều nguyên nhân gây ra, như thay đổi cấu hình NodePool hoặc cập nhật cơ sở hạ tầng (tiện ích) như thay đổi AMI phiên bản). các nút công nhân, đảm bảo chúng vẫn là duy nhất so với các phiên bản và cơ sở hạ tầng được điều khiển mới nhất.
Tự động hóa cấu hình nút với tùy chỉnh người dùng dữ liệu
Bằng cách sử dụng trường userData trong EC2NodeClass, người dùng có thể tự động thực hiện cấu hình bổ sung khi khởi chạy nút nhân mà không mất đi AMI được tối ưu hóa tiêu chuẩn AWS EKS. Kubernetes, gắn ổ đĩa hoặc chạy công cụ khởi động tập lệnh.
Cung cấp trước khả năng để cải thiện tốc độ phản hồi
Chiến lược này được thiết kế để đảm bảo rằng sức mạnh tính toán có sẵn ngay lập tức khi cần bằng cách cung cấp cấp trước quá trình bổ sung tính toán tài nguyên. Sẽ cần khởi động một số lượng Pod lớn cùng lúc, mặc dù cách cung cấp dữ liệu đường ống được xử lý. trước dung lượng quá trình, bạn có thể giảm đáng kể thời gian cần thiết để bắt đầu khối lượng công việc, cải tiến cải thiện hiệu suất và khả năng phản hồi tổng thể.
10-20%.
CloudPilot AI giúp bạn sử dụng Karpenter một cách dễ dàng
CloudPilot AI CloudPilot AI
1. Đơn giản hóa quá trình khai báo cài đặt và phát triển.
Đối với người dùng thông thường, phải mất từ ​​​​1 đến 2 tuần để cài đặt và phát triển khai Karpenter và yêu cầu các kỹ năng CloudPilot AI chỉ mất 5 phút để hoàn tất cài đặt và phát triển khai báo và đây là dịch vụ được thực hiện quản lý hoàn toàn mà không cần vận hành và bảo trì.
CloudPilot AI có thể giúp người dùng nâng cấp tự động và mượt mà. giảm từ vài ngày xuống vài giờ.
2. Vận hành và bảo trì thông tin các phiên bản Spot: dự đoán sự gián đoạn trước 120 phút và tự động khôi phục.
Hầu hết người dùng Karpenter đều sử dụng phiên bản Spot để giảm chi phí đám mây. phiên bản Spot thường tạo ra các kỹ sư mất cảnh giác. chỉ bắt đầu xử lý các nút sau khi nhận được thông báo ngừng hoạt động. Đối với các cụm quy tắc lớn, rủi ro là cực kỳ cao.
CloudPilot AI có thể dự đoán các đoạn sự kiện trong hơn 7.500 trường hợp máy học thuật toán và thông báo thông tin cho người dùng trước 120 phút. hơn và ổn định hơn. bảo trì.
3. Lựa chọn nút thông tin hơn.
thợ mộc Hiệu suất rất lớn, cuối cùng chỉ dẫn đến giảm chi phí một chút nhưng lại giảm hiệu suất rất lớn.
CloudPilot AI nâng cấp chức năng chọn nút một cách thông tin trên cơ sở dữ liệu này. tố chất băng thông mạng, I/O drive disk và các loại chip cũng được xem xét. phiên bản có tính năng chi phí và hiệu suất giảm tài nguyên và tăng cường tính ổn định của ứng dụng.
Spot Insights đang trực tuyến.
AIGC, một công ty sản xuất thiết bị 3D phục vụ hơn 600 khách hàng, có thể giảm 70% GPU chi phí không?
Giải pháp thực tế mở rộng quy mô đàn hồi phục của K8 dựa trên KEDA và Karpenter.
Cuối cùng, bài viết này về 15 phương pháp hay nhất của Karpenter để dễ dàng thành công chia tỷ lệ đàn hồi phục sẽ kết thúc end tại đây. support blog của tôi trong tương lai .
Kỹ năng nâng cao của Hongmeng OS: Tạo ứng dụng Swiper được cá nhân hóa
Người phỏng vấn: Tôi không biết cách tạo danh sách ảo, vậy tại sao bạn lại đề cập đến nó trong sơ yếu lý lịch của mình? -6ren
Người phỏng vấn: Tôi không biết cách tạo danh sách ảo, vậy tại sao bạn lại đề cập đến nó trong sơ yếu lý lịch của mình? Nhưng lại không biết viết tay nên đây không phải là điểm cộng mà là điểm trừ. cách phát triển danh sách ảo có cố định chiều cao, nhưng trong thực tế dự án, nhiều danh sách ảo hơn có chiều cao thay đổi.
Người phỏng vấn: Tôi không biết cách tạo danh sách ảo, vậy tại sao bạn lại đề cập đến nó trong sơ yếu lý lịch của mình?
Thời gian cập nhật: 27-12-2024 10:49:52
Nhiều sinh viên viết danh sách ảo làm điểm nhấn trong sơ yếu lý lịch của mình nhưng lại không biết cách viết tay nên đây không phải là cộng mà là điểm trừ. cố định cao, nhưng trong các dự án thực tế, nhiều danh sách ảo hơn có chiều cao thay đổi Trong bài viết này, Ouyang sẽ hướng dẫn. hướng dẫn bạn phát triển danh sách ảo có chiều cao thay đổi. Ảo có chiều cao cố định trước khi đọc bài viết này để có kết quả tốt hơn.
Âu Dương cũng đang tìm việc, mời tham khảo Thành Đô .
Danh sách ảo có chiều cao thay đổi là gì?
Ý nghĩa của chiều cao thay đổi rất đơn giản, đó là không biết chiều cao cụ thể của từng hạng mục, như hình dưới đây:
Bây giờ chúng tôi đang gặp sự cố. được hiển thị trong các vùng trực tiếp dựa trên ScrollTop của thanh cuộn hiện tại, là giá trị bắt đầu.
Nếu không bắt đầu, không thể chỉ hiển thị các mục trong vùng hiển thị khi cuộn.
Tính toán chiều cao
Vì không biết chiều cao của từng hạng mục nên chúng tôi sử dụng phương pháp ước tính chiều cao để đạt được chiều cao đó. Ví dụ:
const { listData, itemSize } = definProps({ // Liệt kê dữ liệu listData: { type: Array, default: () => [], }, // Chiều cao mục ước tính, không phải chiều cao mục thực tế itemSize: { type: Number, mặc định: 300, }, });
sau This code như sau:
const renderCount = được tính toán (() => Math.ceil(containerHeight.value / itemSize));
Lưu ý: Vì chúng tôi đang ước tính chiều cao nên số lượng renderCount không chính xác.
Nếu chiều cao ước tính cao hơn nhiều so với chiều cao thực tế thì số lượng màn hình thực tế sẽ không đủ, dẫn đến màn hình trắng hiện tại ở trang cuối cùng.
Nếu chiều cao tính toán quá nhỏ thì số lượng mục ở đây sẽ được hiển thị quá nhiều và hiệu suất sẽ không còn tốt như trước.
Vì vậy, ước tính chiều cao của mục cần được đưa ra một cơ sở hợp lý về giá trị dựa trên lý do, kinh doanh thực tế lý thuyết, nên ước tính giá trị nhỏ hơn là ước tính quá cao (nếu cao quá sẽ hiển thị màn hình trắng).
Giá trị ban đầu của phần bắt đầu là 0 và renderCount được tính toán. như sau:
const end = được tính toán (() => start.value + renderCount.value);
Như trong bài viết trước, khi tính toán phần cuối, một mục lại được hiển thị bên dưới. Lần đầu tiên lăn ra khỏi vùng hiển thị, màn hình trắng có thể xảy ra nếu bạn không thực hiện thêm phần hiển thị.
Mã như sau:
const renderList = được tính toán (() => listData.slice(start.value, end.value + 1));
Bằng cách này, chúng tôi biết các mục nào sẽ được hiển thị trong vùng trực tiếp trong quá trình khởi động, nhưng vì trước đó Ở đây chúng tôi đã ước tính chiều cao cho từng mục nên chúng tôi nên sửa đổi chiều cao giá trị này.
cập nhật chiều cao
Để ghi lại chiều cao của từng mục trong danh sách có chiều cao thay đổi, chúng tôi cần một mảng để lưu trữ chiều cao của từng mục.
Vì chiều cao của mỗi mục được lưu trữ nên bạn cũng có thể sử dụng các trường trên cùng và dưới cùng để ghi lại vị trí bắt đầu và kết thúc của từng mục trong danh sách.
Ngoài ra, còn có trường ghi lại chỉ mục giá trị của từng mục được xác định rõ ràng như sau:
vị trí const = ref< { chỉ mục: số; chiều cao: số; trên cùng: số dưới cùng: số;
Việc khởi tạo giá trị của các vị trí là một mảng trống, vậy khi nào bạn chỉ định giá trị cho mảng này?
Vì vậy, chúng tôi xem lắng nghe listData và thêm ngay lập tức: true.
watch(() => listData, initPosition, { ngay lập tức: true, }); function initPosition() {position.value = []; , chiều cao: itemSize, top: chỉ mục * itemSize, đáy: (index + 1) * itemSize, } });
Bằng cách duyệt qua listData và kết hợp itemSize ước tính, chúng ta có thể nhận được các giá trị của trường chiều cao, trên cùng và dưới cùng trong mỗi mục.
Còn một vấn đề nữa, chúng ta cần một phần tử để mở rộng thanh cuộn. Trong danh sách ảo có chiều cao cố định, chúng ta lấy nó thông qua itemSize * listData.length. Rõ ràng điều đó không thể thực hiện được ở đây, vì mảng vị trí lưu trữ vị trí của tất cả các mục, khi đó giá trị dưới cùng của mục cuối cùng là chiều cao thực của danh sách. Trước đây nó không chính xác nhưng nó sẽ ngày càng chính xác hơn khi chúng ta sửa các giá trị ở các vị trí.
Vậy chiều cao thực sự của danh sách là:
const listHeight = được tính toán( () =>positions.value[positions.value.length - 1].bottom );
Lúc này vị trí cụ thể của từng mục đã được ghi vào mảng vị trí, mặc dù vị trí này có sai sót. Tiếp theo chúng ta cần sửa những giá trị sai này. Làm thế nào để sửa chúng?
Câu trả lời rất đơn giản, hãy sử dụng hàm hook onUpdated của Vue, hàm này sẽ được gọi sau khi cập nhật cây DOM của nó để phản hồi các thay đổi trạng thái. Nghĩa là, nó sẽ được kích hoạt sau khi renderList được đưa vào DOM! .
Tại thời điểm này, các mục này đã được hiển thị thành các nút DOM, sau đó chúng ta có thể duyệt qua các nút DOM của các mục này để có được chiều cao thực sự của từng mục. Bây giờ chúng ta đã biết chiều cao thực sự của từng mục, chúng ta có thể cập nhật phần trên cùng và phần dưới cùng của tất cả các mục bên trong. Mã này như sau:
{{ item.index }}
{{ item.value }}
Sử dụng: data-index="item.index" để liên kết chỉ mục với mục. Khi cập nhật, bạn có thể lấy chỉ mục của mục tương ứng thông qua +el.getAttribution("data-index").
itemRefs lưu trữ các phần tử DOM của tất cả các mục bằng cách duyệt qua nó, bạn có thể lấy từng mục, sau đó lấy chỉ mục và chiều cao thực của từng mục trong danh sách dài.
Giá trị của diffVal là chiều cao ước tính lớn hơn bao nhiêu so với chiều cao thực tế. Nếu giá trị của diffVal không bằng 0, điều đó có nghĩa là chiều cao ước tính không chính xác. Lúc này, bạn cần cập nhật chiều cao của mục hiện tại. Vì chiều cao chỉ ảnh hưởng đến giá trị đáy nên bạn chỉ cần cập nhật chiều cao và đáy của mục hiện tại.
Vì chiều cao của mục hiện tại đã thay đổi nên nếu giá trị của diffVal là dương, điều đó có nghĩa là chiều cao ước tính của chúng tôi quá lớn. Tại thời điểm này, chúng ta cần bắt đầu duyệt từ phần tử tiếp theo của mục hiện tại cho đến khi duyệt qua toàn bộ danh sách dài. Nếu chúng ta ước tính quá nhiều, chúng ta chỉ cần di chuyển toàn bộ các mục tiếp theo lên trên và khoảng cách di chuyển là chênh lệch ước tính diffVal.
Vì vậy, ở đây bạn cần bắt đầu duyệt qua chỉ số + 1 và trừ diffVal khỏi giá trị trên cùng và dưới cùng của tất cả các phần tử được duyệt qua.
Tất cả các mục được hiển thị trong vùng hiển thị đều được duyệt qua, chiều cao và vị trí của từng mục được sửa, đồng thời sửa phần trên và dưới của các mục không được hiển thị sau đó để chiều cao được cập nhật. Về mặt lý thuyết, nếu bạn cuộn từ đầu đến cuối, tất cả các vị trí và độ cao trong toàn bộ danh sách dài sẽ được sửa.
bắt đầu cuộn
Thông qua việc điều chỉnh giá trị chiều cao ước tính trước đó, chiều cao và vị trí của mục được hiển thị sẽ được điều chỉnh. Tại thời điểm này, chúng ta cần cách tính vị trí bắt đầu mới và giá trị offset sau khi cuộn.
Nó vẫn tương tự như việc thiết lập chiều cao. Khi thanh cuộn cuộn ở giữa mục, thanh cuộn của trình duyệt sẽ được sử dụng lại. Khi cuộn từ mục này sang mục khác, giá trị bắt đầu và giá trị offset cần được cập nhật. Nếu bạn không hiểu câu này, tôi khuyên bạn trước tiên nên đọc bài viết trước của tôi về cách triển khai danh sách ảo có chiều cao cố định.
Chúng ta nên tính giá trị bắt đầu mới nhất tại thời điểm này như thế nào?
Rất đơn giản! Có hai trường được lưu trữ ở các vị trí, trên cùng và dưới cùng, tương ứng với vị trí bắt đầu và vị trí kết thúc của mục hiện tại. Nếu ScrollTop của thanh cuộn hiện tại nằm chính xác giữa trên và dưới, tức là ScrollTop >= top && ScrollTop < dưới cùng, thì điều đó có nghĩa là cuộn hiện tại vừa đến vị trí của mục này?
Và vì giá trị của đáy trong mảng vị trí ngày càng tăng nên vấn đề trở thành việc tìm cuộnTop < dưới cùng của mục đầu tiên. Vì vậy, chúng tôi nhận được:
hàm getStart(scrollTop) { return vị trí.value.findIndex((item) => rollTop < item.bottom }
Tìm kiếm này sẽ được kích hoạt mỗi khi cuộn cuộn, vậy chúng ta có thể tối ưu hóa thuật toán trên không?
Trường dưới cùng trong mảng vị trí ngày càng tăng, phù hợp với quy tắc tìm kiếm nhị phân. Những học sinh không hiểu tìm kiếm nhị phân có thể xem câu hỏi này trên leetcode: https://leetcode.cn/problems/search-insert-position/description/.
Vì vậy, đoạn mã trên có thể được tối ưu hóa như thế này:
hàm getStart(scrollTop) { let left = 0; let right =positions.value.length - 1; while (left <= right) { const mid = Math.floor((left + right) / 2); value[mid].bottom === ScrollTop) { return mid + 1; } else if (positions.value[mid].bottom < ScrollTop) { left = mid + 1; } else { right = mid - 1; } } quay lại bên trái }
Cũng giống như danh sách ảo có chiều cao cố định, khi cuộn trong mục bắt đầu, thao tác cuộn của trình duyệt sẽ được sử dụng lại trực tiếp mà không cần làm gì cả. Do đó, phần bù bù tại thời điểm này phải bằng giá trị cao nhất của mục bắt đầu hiện tại, là chiều cao tổng hợp của tất cả các mục ở phía trước mục bắt đầu. Vậy giá trị của offset là:
offset.value = vị trí.value[start.value].top;
Một số bạn có thể nhầm lẫn, tại sao giá trị cuộn ở mục bắt đầu không được tính vào offset offset?
Bởi vì cuộn trình duyệt được sử dụng trực tiếp khi cuộn trong phạm vi mục bắt đầu, nên đã có cuộnTop, do đó không cần thêm nó vào offset offset.
Vì vậy, chúng tôi nhận được đoạn mã sau khi sự kiện cuộn được kích hoạt:
hàm handScroll(e) { const ScrollTop = e.target.scrollTop; start.value = getStart(scrollTop);
Giá trị offset tương tự được áp dụng cho div trong vùng hiển thị bằng cách sử dụng dịch3d. Mã như sau:
...bỏ qua
FluentAssertions: Thư viện xác nhận kiểm tra đơn vị C#, làm cho mã kiểm tra trở nên trực quan và dễ đọc hơn! -6ren
FluentAssertions: Thư viện xác nhận kiểm tra đơn vị C#, làm cho mã kiểm tra trở nên trực quan và dễ đọc hơn! -Đề xuất thư viện nguồn mở C# để xác nhận trong các bài kiểm tra đơn vị. Nó cung cấp một loạt các phương pháp mở rộng để làm cho các xác nhận của bài kiểm tra đơn vị trông tự nhiên và mượt mà hơn. 01 Giới thiệu dự án FluentAssertions là một thư viện xác nhận dựa trên .NET cung cấp -6ren
FluentAssertions: Thư viện xác nhận kiểm tra đơn vị C#, làm cho mã kiểm tra trở nên trực quan và dễ đọc hơn!
Thời gian cập nhật: 27-12-2024 12:45:53
Tôi khuyên dùng thư viện nguồn mở C# để xác nhận trong các bài kiểm tra đơn vị. Nó cung cấp một loạt các phương pháp mở rộng để làm cho các xác nhận trong các bài kiểm tra đơn vị trông tự nhiên và mượt mà hơn.
FluentAssertions là một thư viện xác nhận dựa trên .NET, cung cấp phương thức gọi chuỗi để viết các câu lệnh xác nhận. Hỗ trợ các framework .NET Framework 4.7, .NET Core 2.1, .NET Core 3.0, .NET 6, .NET Standard 2.0/2.1 và các framework kiểm thử đơn vị MSTest2, NUnit3, XUnit2, MSpec và NSpec3.
Các danh mục phương thức mở rộng được hỗ trợ:
02 Cách sử dụng
1. Gần gũi hơn với ngôn ngữ tự nhiên.
Viết truyền thống.
Assert.AreEqual(5, result);
Sử dụng FluentAssertions:
result.Should().Be(5);
2. Nhiều điều kiện khẳng định, nhiều khẳng định được thực hiện liên tục trong một câu lệnh.
chuỗi thực tế = "ABCDEFGHI"; thực tế.Should().StartWith("AB").And.EndWith("HI").And.Contain("EF").And.HaveLength(9);
3. Ngoài các xác nhận bình đẳng cơ bản, FluentAssertions còn cung cấp nhiều phương pháp xác nhận để xác thực các loại dữ liệu và kịch bản khác nhau. Ví dụ: bạn có thể sử dụng phương thức BeGreaterThan để xác minh xem một số có lớn hơn số khác hay không:
int lớn hơnSố = 10; int nhỏ hơnSố = 5;
03 Địa chỉ dự án
https://github.com/fluentassertions/fluentassertions.
Garnet: Hệ thống bộ đệm nguồn mở chính thức của Microsoft dựa trên .Net 8, có thể thay thế trực tiếp Redis mà không có bất kỳ thay đổi nào và có hiệu suất cao hơn! .
Một bộ thư viện giao diện nguồn mở WinForm với giao diện người dùng tinh tế, các điều khiển phong phú và nhiều chủ đề.
CodeMaid: Plug-in tổ chức mã tự động của Visual Studio! .
websocket-sharp: Thư viện mã nguồn mở máy khách và máy chủ WebSocket trên nền tảng .NET.
Cuối cùng, bài viết này nói về FluentAssertions: Thư viện xác nhận kiểm tra đơn vị C#, giúp mã kiểm tra trực quan và dễ đọc hơn! Bài viết này chỉ vậy thôi, nếu bạn muốn biết thêm về FluentAssertions: Thư viện xác nhận kiểm tra đơn vị C#, làm cho mã kiểm tra trực quan và dễ đọc hơn! Về nội dung, vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Nói một cách ngắn gọn, tôi đã nhờ AI giúp tôi tạo một trang web hình ảnh chữ P!
Hãy nhớ phân tích sự cố của một phần mềm thị giác công nghiệp .NET nhất định
Solonv3.0.5 đã phát hành! (Hệ sinh thái Spring có thể ngừng hoạt động được không?)
symfony - xác nhận\regex và đoán kiểu
Tôi có các trường thực thể sau: /** * @Assert\Regex( * sample = "/^d+\.(jpg|png|gif)$/", * htmlPattern = "/^d+\.(j
Xác nhận bool của cây bách
Tôi có một bảng hiển thị kết quả của một truy vấn. Tôi sử dụng bảng kiểm tra này để chứa các kết quả: cy.get("table", {timeout: 60000}).find("tr[data-index]"). Should("have.le
Làm cách nào để diễn giải (khẳng định) trong c?
void (assert)(int e) { khẳng định (e); } Nó hoạt động như thế nào ở đây? Câu trả lời hay nhấtvoid (assert)(int e) tương đương với void khẳng định(int) Tại sao
Khẳng định - Sự cố với cuộc gọi nội bộ
Xin chào mọi người, tôi đang gặp một số vấn đề với bài kiểm tra đầu tiên của mình. Tôi đang viết đoạn này nhưng tôi vẫn gặp vấn đề này: java.lang.AssertionError tại org.junit.Assert.fail(As
Khẳng định JUnit
Từ một bảng, tôi nhận được danh sách các chuỗi và muốn kiểm tra xem chuỗi "x" có tồn tại trong danh sách bảng hay không khi val!= "A": for (int i = 0; i list = new ArrayList(); for( int tôi=0
Xác nhận VHDL - Hoạt động ngoài báo cáo
Tôi muốn thêm bộ đếm lỗi cho các hoạt động xác nhận VHDL trong mã hiện có. Về cơ bản, mã của tôi trông như thế này: khẳng định dữ liệu = good_data báo cáo "Dữ liệu xấu" mức độ nghiêm trọng er
c - khẳng định - segfault
Tôi có một vấn đề không thể giải quyết được nên tôi nghĩ bạn có thể giúp tôi. Về cơ bản, tôi có một hàm nhận char* làm tham số và thực hiện một số thao tác trên đó (Tôi đã kiểm tra các bước/chức năng và chúng hoạt động tốt). Nếu char* được cung cấp trong hàm là ""
Kiểm tra (xác nhận) ngày hợp lệ không thành công
Tôi có một số mã để kiểm tra xem ngày đã nhập có chính xác không. Chỉ cần kiểm tra xem không quá 12 tháng, ngày trong tháng nhất định có chính xác không và các năm nhuận đó cũng cần được tính đến (vì vậy về cơ bản là kiểm tra ngày bình thường). Điều không phù hợp duy nhất là năm không được thấp hơn năm 2000. Nếu ngày không hợp lệ,
thử nghiệm - khẳng định của Cypress
Tôi có câu hỏi về xác nhận của Cypress, gần đây tôi mới bắt đầu sử dụng nền tảng thử nghiệm này nhưng tôi bị kẹt khi URL trả về một số ngẫu nhiên, như hiển thị bên dưới. /Geocortex/Cần thiết/REST/sites/SITE?f
Khẳng định rằng thuộc tính *any* được đặt
Tôi có một đối tượng mô phỏng Python và tôi muốn xác nhận xem có bất kỳ thuộc tính nào của đối tượng được đặt hay không. Tôi không tin PropertyMock sẽ hoạt động cho mục đích của mình vì tôi phải biết liệu có thuộc tính nào được đặt hay không, không phải thuộc tính cụ thể. Cũng không phải là tôi có thể mô phỏng được
Cách ghi tài liệu/xác nhận khi kế thừa chỉ đưa ra các điều kiện tiên quyết cho một số loại cuối cùng nhất định
Hãy xem xét lớp cơ sở đơn giản Foo này với hàm foo gọi hàm ảo thuần túy foo_, được ghi lại bằng Doxygen: class Foo { public: /** \brief This functi
c - Khẳng định Malloc
đóng cửa. Câu hỏi này yêu cầu chi tiết gỡ lỗi. Hiện tại nó không chấp nhận câu trả lời. Chỉnh sửa câu hỏi để bao gồm hành vi mong muốn, một vấn đề hoặc lỗi cụ thể và
Khẳng định C Malloc
Tôi gặp sự cố khi thực thi malloc trong mã này, /*function started*/ if(NULL==(partial_results=(bignum_t**)malloc(sizeof
Làm cách nào để chúng tôi đưa ra khẳng định For-Each?
Xin chào mọi người, tôi muốn biết cách đặt toàn bộ khối mã vào một xác nhận? Ví dụ: tôi có một mảng và tôi muốn đưa ra xác nhận về từng giá trị của mảng. Mã của tôi trông như thế này: for (int value : value) { khẳng định Wi
Điều kiện tiên quyết/xác nhận của C++
Đây không phải bài tập về nhà của tôi - tôi chỉ đang luyện tập thôi. Tôi dường như không thể hiểu đầy đủ khái niệm khẳng định này. 1) Xác định điều kiện trước cho x đảm bảo điều kiện sau
Xác nhận C++ với dấu thời gian
Có thể ghi thông tin khi xác nhận bằng dấu thời gian không thành công, ví dụ: int a = 10 khẳng định ( a > 100 );
java — Khẳng định IEnumerables
Vì công ty của chúng tôi không sử dụng thử nghiệm đơn vị nên tôi đang tự dạy mình cách thử nghiệm đơn vị mã của riêng mình. Tôi đang thực hiện một số thử nghiệm đơn vị rất cơ bản bằng cách sử dụng khung thử nghiệm .net tiêu chuẩn. Một trong những phương thức của tôi trả về IEnumerable và tôi muốn kiểm tra đầu ra của nó. Vì thế
Xác nhận Chai để kiểm tra các trường nhất định trong mảng đối tượng
Tôi có một mảng các đối tượng như hiển thị bên dưới và chỉ muốn xác nhận đối với một số trường nhất định trong mảng. Mảng đối tượng - var a = [{"key":"key2","value""value2","updatedBy""name1"
vhdl - Xác nhận PSL cho đường ống có độ trễ thay đổi
Tôi đang cố viết một xác nhận PSL để kiểm tra xem số lượng xác nhận đầu vào có khớp với số lượng xác nhận đầu ra hay không. Ví dụ: . Bất cứ điều gì cũng có thể xảy ra bất cứ lúc nào ở đầu vào và đầu ra có thể được xác nhận bất cứ lúc nào. Thời gian chính xác là không rõ và không quan trọng. Điều tôi muốn xác minh là không có thông tin
Cypress khẳng định A hoặc B
Tôi muốn đưa ra một khẳng định trong Cypress như sau: cy.get(a). Should('be.visible').or(()=>{ cy.get(b). Should('be.visible'); } );
Hãy nhớ phân tích sự cố phần mềm thị giác công nghiệp .NET-6ren
Hãy nhớ phân tích sự cố của một phần mềm thị giác công nghiệp .NET nào đó - 1: Bối cảnh 1. Hai ngày trước khi kể câu Chuyện, tôi đã phân tích một bãi chứa cho một sinh viên trong trại huấn luyện không tìm ra nguyên nhân cốt lõi sau khi làm việc với KHÔNG. thứ hai bằng cách sử dụng một số từ trên WeChat nên tôi cũng có thể viết một bài báo - 6ren
Thời gian cập nhật: 27-12-2024 12:47:42
1: Bối cảnh
1. Kể chuyện
Hai ngày trước, tôi phân tích một bãi rác cho một học sinh trong trại huấn luyện, học sinh làm việc cả ngày cũng không tìm ra nguyên nhân, nên tôi có thể tìm hiểu xem tôi phân tích như thế nào? Tôi cũng có thể viết một bài báo và giải thích chi tiết, haha, các học sinh trong trại huấn luyện phải đáp ứng yêu cầu của họ. .
2: Phân tích WinDbg
1. Tại sao nó được treo
Edit sử dụng .ecxr để chuyển sang bối cảnh trước khi xảy ra sự cố, sau đó sử dụng k để quan sát sự cố.
0:044> .ecxr rax=0000000000000000 rbx=00000217a6c78f90 rcx=000000000000000000 rdx=000000000000000000 rsi=000000242c46fdd0 rdi=00000217ff1594a0 rip=00007ffdb35eb699 rsp=000000242c46fb40 rbp=000000242c46fc70 r8=00007ffdb35eb699 r9=00000217ea61fc08 r10=00000000e0434352 r11=0000000000000001 r12=00000217a6c78f90 r13=00000000000000000000 r14=0000000000000000 r15=0000000000000000 iopl=0 nv up ei pl nz na pe nc cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202 KernELBASE!RaiseException+0x69: 00007ffd`b35eb699 0f1f440000 nop dword ptr [rax+rax] 0:044> k *** .thread/.cxr cài lại nó # Trang web cuộc gọi RetAddr Child-SP 00 00000024`2c46fb40 00007ffd`51bf8c6f KernelBASE!RaiseException+0x69 01 00000024`2c46fc20 00007ffd`51890108 clr!UMThunkStubRareDisableWorker+0x3f 02 00000024`2c46fc50 00007ffc`dc826748 clr!UMThunkStub+0x128 03 00000024`2c46fce0 00007ffc`dc827406 MVCAMSDK_X64+0x6748 04 00000024`2c46fd80 00007ffc`dc9d21eb MVCAMSDK_X64!CameraGrabber_GetCameraDevInfo+0xb96 05 00000024`2c46fe50 00007ffc`dc9d227f MVCAMSDK_X64!CameraGigeEnumerateDevice+0x167f2b 06 00000024`2c46fe80 00007ffd`b5a07374 MVCAMSDK_X64!CameraGigeEnumerateDevice+0x167fbf 07 00000024`2c46feb0 00007ffd`b5ebcc91 kernel32!BaseThreadInitThunk+0x14 08 00000024`2c46fee0 00000000`00000000 ntdll!RtlUserThreadStart+0x21
Tiếp theo, hãy đánh mã hàm.
extern "C" VOID __stdcall UMThunkStubRareDisableWorker(Chủ đề* pThread, UMEntryThunk* pUMEntryThunk, Frame* pFrame) { if (!CanRun ManagedCode()) { pThread->m_fPreemptiveGCDisabled = 0; CanRun ManagedCode(BOOL fCannotRunIsUserError, HINSTANCE hInst) { if (g_fForbidEnterEE == TRUE) trả về FALSE; if ((g_fEEShutDown & ShutDown_Finalize2) && !GCHeap::GetGCHeap()->IsCurrentThreadFinalizer()) trả về FALSE; (g_pPreallocatedOutOfMemoryException == NULL) trả về SAI;
Đánh giá từ mã trong thẻ, nguyên nhân là do CanRun ManagedCode() trả về sai.
0:044> dp clr!g_fForbidEnterEE L1 00007ffd`5201d548 00000000`00000000 0:044> dp clr!g_fEEShutDown L1 00007ffd`520140b0 00000000`00000007 0:044> dp clr!g_pPreallocatedOutOfMemoryException L1 00007ffd`52013e08 00000217`e4f513d8
Bạn có thể biết bằng cách xem xét một số biến trong que rằng chương trình hiện tại đang chờ trạng thái EEShutDown khi phát trực tuyến đã hoàn thành việc thực hiện việc này.
2. Nó có thực sự đóng cửa không?
Vừa rồi chúng ta vừa quan sát các biến Tiếp theo, chúng ta ta quan sát thread stack để xác minh thêm.
0:000> ~0s;k;~2s;k win32u!NtUserMsgWaitForMultipleObjectsEx+0x14: 00007ffd`b3dfa104 c3 ret # Trang web gọi RetAddr Child-SP 00 00000024`2773f578 00007ffd`b3f40c8e win32u!NtUserMsgWaitForMultipleObjectsEx+0x14 ... 08 00000024`2773f9c0 00007ffd`518828ff clr!CLREventBase::WaitEx+0xab 09 00000024`2773fa30 00007ffd`51882842 clr!WaitForEndOfShutdown_OneIteration+0xb3 0a 00000024`2773fac0 00007ffd`5171f703 clr!WaitForEndOfShutdown+0x1a 0b 00000024`2773faf0 00007ffd`518243f9 clr!EEShutDown+0xd3 0c 00000024`2773fb40 00007ffd`51823f34 clr!HandleExitProcessHelper+0x29 0d 00000024`2773fb70 00007ffd`51823e14 clr!_CorExeMainInternal+0xf8 0e 00000024`2773fc00 00007ffd`96d7d6ea clr!CorExeMain+0x14 0f 00000024`2773fc40 00007ffd`96c3ac42 mscoreei!CorExeMain+0xfa 10 00000024`2773fca0 00007ffd`b5a07374 mscoree!CorExeMain_Exported+0x72 11 00000024`2773fcd0 00007ffd`b5ebcc91 kernel32!BaseThreadInitThunk+0x14 12 00000024`2773fd00 00000000`00000000 ntdll!RtlUserThreadStart+0x21 chèo_inference_c!paddle::CreatePaddlePredictor
+0x180be: 00007ffc`d39a1a9e 488b01 Mov rax,qword ptr [rcx] ds:00000217`89df37b0=00007ffcd7791ff0 # Child-SP RetAddr Gọi trang web 00 00000024`27eff080 00007ffc`d39a1a8f chèo_inference_c!paddle::CreatePaddlePredictor
+0x180be 01 00000024`27eff0b0 00007ffc`d39a1a8f chèo_inference_c!paddle::CreatePaddlePredictor
+0x180af 02 00000024`27eff0e0 00007ffc`d39a1a8f Mái chèo_inference_c!paddle::CreatePaddlePredictor
+0x180af ... 0e 00000024`27eff3b0 00007ffc`f20cbbde mái chèo_inference_c!PD_PredictorDestroy+0x39 0f 00000024`27eff3e0 00007ffc`f943796a 0x00007ffc`f20cbbde 10 00000024`27eff4b0 00007ffc`f9437930 Sdcb_PaddleInference!Sdcb.PaddleInference.PaddlePredictor.Dispose+0x1a 11 00000024`27eff4e0 00007ffd`518915e6 Sdcb_PaddleInference!Sdcb.PaddleInference.PaddlePredictor.Finalize+0x10 12 00000024`27eff510 00007ffd`5173b6c6 clr!FastCallFinalizeWorker+0x6 13 00000024`27eff540 00007ffd`5173bd73 clr!FastCallFinalize+0x5a 14 00000024`27eff580 00007ffd`5173bcae clr!MethodTable::CallFinalizer+0xb7 15 00000024`27eff5c0 00007ffd`5173b8e7 clr!CallFinalizer+0x5e ... 1e 00000024`27effa50 00000000`00000000 ntdll!RtlUserThreadStart+0x21
Trên thực tế, logic ở đây hoàn toàn rõ ràng. Thời điểm này, vì công cụ thực thi này cần được thực hiện xong trong khoảng thời gian này, bất kỳ luồng nào khác ngoài luồng. Kết thúc luồng bị cấm truy cập vào phương thức được quản lý Sau khi cuộc gọi được thực hiện, một ngoại lệ sẽ được đưa ra. Vẽ một sơ đồ đơn giản như sau:
3. Phương thức quản lý cuộc gọi ở đâu?
Hiện tại xuất hiện đúng là sai, đó là một dạng nan giải. pUMEntryThunk của phương thức UMThunkStubRareDisableWorker, vì m_p ManagedTarget bên trong là lối vào của phương thức được quản lý.mô hình như sau:
class UMEntryThunk { Private: // Bắt đầu mã hóa được quản lý const BYTE* m_p ManagedTarget; // Mã này được sử dụng để lập hồ sơ PTR_MethodDesc m_pMD;
Vậy đào như thế nào? Chỉ cần quan sát mã gắn phương pháp UMThunkStubRareDisableWorker.
0:044>k*** 00000024`2c46fb40 00007ffd`51bf8c6f KernELBASE!RaiseException+0x69 01 00000024`2c46fc20 00007ffd`51890108 clr!UMThunkStubRareDisableWorker+0x3f 02 00000024`2c46fc50 00007ffc`dc826748 clr!UMThunkStub+0x128 03 00000024`2c46fce0 00007ffc`dc827406 MVCAMSDK_X64+0x6748 04 00000024`2c46fd80 00007ffc`dc9d21eb MVCAMSDK_X64!CameraGrabber_GetCameraDevInfo+0xb96 05 00000024`2c46fe50 00007ffc`dc9d227f MVCAMSDK_X64!CameraGigeEnumerateDevice+0x167f2b 06 00000024`2c46fe80 00007ffd`b5a07374 MVCAMSDK_X64!CameraGigeEnumerateDevice+0x167fbf 07 00000024`2c46feb0 00007ffd`b5ebcc91 kernel32!BaseThreadInitThunk+0x14 08 00000024`2c46fee0 00000000`00000000 ntdll!RtlUserThreadStart+0x21 0:044> uf 00007ffd`51890108 00007ffd`5188ffe0 4154 Đưa r12 00007ffd`5188ffe2 55 Đưa rbp 00007ffd`5188ffe3 4883ec78 phụ rsp,78h 00007ffd`5188ffe7 488d6c2420 lea rbp,[rsp+20h] 00007ffd`5188ffec c6454000 mov byte ptr [rbp+40h],0 00007ffd`5188fff0 e8abe0ffff gọi clr!GetThread (00007ffd`5188e0a0) 00007ffd`5188fff5 4885c0 test rax,rax 00007ffd`5188fff8 746f je clr!UMThunkStub+0x89 (00007ffd`51890069) Nhánh ... 00007ffd`518900f9 4c895548 mov qword ptr [rbp+48h],r10 00007ffd`518900fd 498bcc mov RCx,r12 00007ffd`51890100 498bd2 mov rdx,r10 00007ffd`51890103 e8288b3600 cuộc gọi clr!UMThunkStubRareDisableWorker (00007ffd`51bf8c30)
Theo giao thức gọi tìm vị trí ngăn xếp này và cho phép tính đơn giản như vậy.
0:044> ? 00000024`2c46fce0-0x8-0x8-0x8-0x78+0x20 155361672304 = 00000024`2c46fc70 0:044> dp 00000024`2c46fc70+0x48 L1 00000024`2c46fcb8 00000217`ff1594a0 0:044> dp 00000217`ff1594a0 L1 00000217`ff1594a0 00007ffc`f2f49380 0:044> !U 00007ffc`f2f49380 Mã không được quản lý 00007ffc`f2f49380 e98bbd0500 jmp 00007ffc`f2fa5110 00007ffc`f2f49385 5f pop rdi 00007ffc`f2f49386 0f ??? 00007ffc`f2f49387 25e8e35194 và eax,9451E3E8h 00007ffc`f2f4938c 5e pop rsi 00007ffc`f2f4938d 5e pop rsi 00007ffc`f2f4938e 1124e8 adc dword ptr [rax+rbp*8],esp 00007ffc`f2f49391 db5194 và tay dword ptr [rcx-6Ch] 00007ffc`f2f49394 5e pop rsi 00007ffc`f2f49395 5e pop rsi 0:044> !ip2md 00007ffc`f2fa5110 MethodDesc: 00007ffcf33bd9e8 Tên phương thức: baslerCamera.MVCam.CameraGrabberFrameCallback(IntPtr, IntPtr, baslerCamera.tSdkFrameHead ByRef, IntPtr) Lớp: 00007ffcf33c1c98 MethodTable: 00007ffcf33be828 mdToken: 0000000006000067 00007ffcf2352f60 IsJitted: có CodeAddr: 00007ffcf2fa5110 Tính minh bạch: Quan trọng
Dưới góc nhìn của baslerCamera, nó là một máy ảnh công nghiệp Tiếp theo, nhanh chóng tìm kiếm mã nguồn.
M_FrameCallback trong hình là một chức năng và được chuyển tới C++ thông qua phương thức CameraGrabber_SetRGBCallback Do đó, khi đóng chương trình, Trước tiên, bạn phải giải nén lệnh gọi lại này để tách bản thân khỏi C++, nếu không họa họa sẽ xảy ra.
Ba: Tóm tắt
Bài viết này chủ yếu nhắm đáp ứng yêu cầu của bạn trong trại huấn luyện. như thế này sẽ giúp ích rất nhiều cho việc cải thiện khả năng gỡ lỗi của bạn.
Cuối cùng, bài viết về công việc ghi phân tích sự cố của một phần mềm thị giác công nghiệp .NET nhất định sẽ kết thúc tại đây. vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. tôi trong tương lai .
Hệ thống thực hiện: thích chi tiết về thiết kế mô hình hóa đơn và giao thức lệnh
.net - Người dùng cuối cùng của ứng dụng asp.net cần cài đặt .net
Người sử dụng truy cập www.fakesite.com/default.aspx và nếu framework của họ chưa được cài đặt, anh ta
.net - Chia sẻ các biến đúng giữa các luồng (.NET/VB.NET)
Tôi đã đọc rất nhiều blog khác nhau và các câu hỏi về StackOverflow để cố gắng tìm câu trả lời cho câu hỏi của mình, nhưng cuối cùng tôi không tìm thấy gì cả, vì vậy tôi nghĩ tôi sẽ tự mình đặt câu hỏi. một công việc chuỗi dài thực hiện một cú sốc
.net - Tại sao .NET được gọi là .NET?
Khônga vì câu hỏi này câu lạc đề nhưng có ý nghĩa lịch sử. Microsoft chọn lại một cái tên bất kỳ, không thân Họ chỉ
Các khái niệm và sự khác biệt giữa .Net Framework .Net .NET Standard
Sự khác biệt giữa .Net Framework .Net .NET Standard 1. .NET Framework Trong tương lai, .NET Framework có thể trở thành thành thạo nhưng nó vẫn được sử dụng ở nhiều nơi here.
.net - ASP.NET Webforms + ASP.NET Ajax ASP.NET MVC và Ajax
Lựa chọn ASP.NET Webforms + ASP.NET AJAX hoặc ASP.NET MVC + JavaScript Framework
asp.net - .net ứng dụng web asp.net đang cố gắng kết nối với crl.verisign.net
ServicePointManager.ServerCertificateValidationCallbac
asp.net - Ứng dụng web ASP.NET (.NET Framework) và Ứng dụng web ASP.NET Core (.NET Framework)
Tại sao tôi nên chọn Ứng dụng web ASP.NET (.NET Framework) thay vì Ứng dụng web ASP.NET Core (.NET Framework) ở đây?
Quy ước đặt tên .NET cho các giải pháp dự án .NET Standard, .NET Core và .NET Framework
NET chuẩn, .NET Core và .NET Framework.
.net - .NET Compact có phải là tập hợp hoàn hảo của .NET không?
.NET Compact có phải là tập hợp hoàn hảo của .NET không? tránh các lớp và phương thức mà .NET Compact không hỗ trợ hoặc .NET Compact là một GUI khác và không tương thích
.net - Cài đặt cấu hình Quản lý kết nối .NET có ứng dụng cho tất cả các ứng dụng .Net không?
Tôi đã đọc tất cả các bài viết, tôi có thể tìm thấy tối đa cài đặt kết nối trong Quản lý kết nối: cụ có thể là http://support.microsoft.com/kb/821268
.net - Asp.net MVC json hoặc Json.net?
Tôi hiện đang sử dụng asp.net mvc và tự hỏi liệu sử dụng Json hoặc Json.Net tích hợp phải là lựa chọn tốt hơn hay không, Nhưng tôi không chắc liệu cái này có lợi thế hơn cái kia hay không. chọn
.net - Sự khác biệt giữa các loại dự án .NET Core và .NET Standard Class Library là gì?
Trong Visual Studio, bạn có thể tạo ít nhất ba loại thư viện lớp khác nhau: Thư viện lớp (.NET Framework) Thư viện lớp (.NET Standard) Thư viện lớp (.NET Core) Trong khi loại đầu tiên là thứ chúng tôi đã sử dụng trong nhiều năm, nhưng tôi
.net - Sự khác biệt giữa .NET và ASP.NET là gì
Sự khác biệt giữa .NET và ASP.NET là gì? Chúng ta có liên quan như thế nào? cung cấp các tính năng bổ sung để phát triển web. Bạn có thể xem bài viết trên wikipedia
.net - Cài đặt khung .net trước đó trước khi cài đặt khung .net mới?
Tôi có cần cài đặt .net framework 1.1 và 2.0 trước khi cài đặt phiên bản cao hơn (3.0) hay chỉ cần cài đặt khung 3.0 và cung cấp Hỗ trợ phần mềm được viết trên các phiên bản khung trước đó có đủ không? tôi
asp.net - Nhận giá trị trước đó của hộp văn bản asp.net vb.net
Tôi đang làm việc trên một dự án nơi mọi người có thể "cập nhật" các danh mục, ví dụ: thay đổi tên của danh mục Tôi. đã nhận được thông báo sau.
.net - Chuỗi .NET System.Net.CookieContainer có an toàn không?
Lớp .NET System.Net.CookieContainer có an toàn không --CẬP NHẬT: Trả lời chính--- cách nào để đảm bảo rằng các biến được chỉnh sửa thay đổi trong yêu cầu không đồng bộ (tức là HttpWebRequest.Coo
.net - JScript.NET
Tôi đang sử dụng JScript.NET để viết tập lệnh trong ứng dụng C# WinForms mà tôi đang viết. thử đưa ra một số đã ném ra
.net - ASP.NET VB - Một số phép toán cho .NET
Ví dụ 3.0 = 3 3,1 = 4 3,2 = 4 3,3 = 4 3,4 = 4 3,5 = 4 3,6 = 4 3,7 = 4 3.
.net - ADO.NET có phải là cách duy nhất để truy cập cơ sở dữ liệu trong .net không?
http://msdn.microsoft.com/en-us/library/dw70f090.aspx http://msdn.microsoft.com/en-us/library/dw70f090.aspx ASP.NET (2-3 năm trước).
asp.net - Cách sử dụng .NET Framework, .NET Standard và .NET Core?
NET Standard, nên làm cách nào tốt nhất để tải ứng dụng cài đặt cho tập tin hợp lệ, web.config hoặc appSettings.{env
Cài đặt máy chủ MinIO-6ren trên Ubuntu
Tải tập tin xuống MinIO dựa trên Apache Lic-6ren
Cài đặt MinIO máy chủ trên Ubuntu
Thời gian cập nhật: 27-12-2024 14:49:42
Thì công việc tự động
MinIO là một đối tượng lưu trữ dịch vụ dựa trên giấy phép Apache mở nguồn giao thức v2.0. lưu trữ đám mây Amazon S3 và rất phù hợp để lưu trữ dung lượng lớn dữ liệu cấu trúc phi cấu trúc, như hình ảnh, video, nhật ký tệp, sao lưu dữ liệu và hình ảnh chứa/máy ảo, vv và đối tượng tệp có thể ở bất kỳ lúc nào bất kỳ kích thước nào, từ một số khác nhau, từ kb đến tối đa 5T.
MinIO là một dịch vụ rất nhẹ nhàng, có thể dễ dàng tích hợp các ứng dụng khác như NodeJS, Redis hoặc MySQL.
Trang web tiếng Trung của MiniIO: https://www.minio.org.cn/docs/minio/linux/Operations/installation.html.
Triển khai MinIO và đổi mật khẩu tài khoản minioadmin
Các bước như sau:
Tải xuống MinIO máy chủ.
wget https://dl.min.io/server/minio/release/linux-amd64/minio
Thêm quyền thực thi vào MinIO phân tách nhị phân.
chmod +x minio
Tạo một thư mục ở vị trí thích hợp để lưu trữ tệp dữ liệu mà MinIO có thể tải lên.
# Tạo minio-data thư mục trong gốc thư mục để lưu trữ tệp dữ liệu được tải lên bởi MinIO mkdir ~/minio-data
Cài đặt MinIO.
sudo mv minio /usr/local/bin/
Sử dụng liên kết môi trường biến để làm tài khoản đăng nhập và mật khẩu cho bảng điều khiển MinIO.
Chỉnh sửa tệp .bashrc, sử dụng nano tại đây.
nano ~/.bashrc
Thêm môi trường biến vào tệp cuối cùng.
xuất MINIO_ROOT_USER=người dùng root mới xuất MINIO_ROOT_PASSWORD=mật khẩu newroot
Tải lại .bashrc để thay đổi hiệu ứng.
nguồn ~/.bashrc
Bắt đầu MinIO.
máy chủ minio nohup --secure ~/minio-data
Nohup được sử dụng ở đây để đảm bảo MinIO sẽ không dừng sau khi phiên đóng. Bạn cũng có thể sử dụng các công nghệ phiên như màn hình hoặc khởi động MinIO dưới dạng dịch vụ. Không có nhiều giới thiệu ở đây.
Sau khi khởi động MinIO, hãy truy cập bảng điều khiển web MinIO bằng cách truy cập vào cổng ip+9000 trong trình duyệt. Nếu không thể truy cập được, trước tiên hãy kiểm tra xem hai cổng của MinIO có mở không. Một là cổng WebUI của MinIO, cổng còn lại là cổng API của MinIO, được cố định ở mức 9000.
Truy cập ip+9000 trong trình duyệt sẽ thực sự chuyển sang cổng WebUI. Nhưng khi sử dụng API để upload và download file thì cần sử dụng cổng 9000.
Cấu hình tên miền cho MinIO
Nếu bạn không muốn hiển thị trực tiếp địa chỉ và cổng của MinIO, bạn có thể sử dụng Nginx để định cấu hình quyền truy cập tên miền cho MinIO.
Trước đó, bạn cần chuẩn bị một tên miền đã đăng ký và phân giải nó đến máy chủ hiện tại.
Các bước thực hiện như sau:
Cài đặt Nginx trước (nếu bạn chưa có).
cập nhật sudo apt-get sudo apt-get cài đặt nginx
Thông thường, không nên thay đổi trực tiếp tệp cấu hình chính nginx nằm trong /etc/nginx/nginx.conf. Sử dụng phương pháp cấu hình sau:
Tạo tệp cấu hình mới trong /etc/nginx/sites-available/, bạn có thể sử dụng trực tiếp tên miền và tên tệp được cấu hình hiện tại. Vì tôi cần định cấu hình nhiều tên miền ở đây nên tên tệp là minio.conf.
cd /etc/nginx/sites-available/ touch minio.conf
Viết tập tin cấu hình.
nanominio.conf
Ví dụ về tập tin cấu hình.
# Máy chủ cấu hình WebUI { listen 80; server_name yourdomain.com; # Thay thế bằng vị trí tên miền của bạn / { proxy_pass http://localhost:44366; # Thay thế bằng cổng thực tế proxy_set_header Host $host; ; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; X-Forwarded-Proto $scheme; } } # Máy chủ cấu hình API { listen 80; server_name api.yourdomain.com; # Thay thế bằng vị trí tên miền API của bạn / { proxy_pass http://localhost:9000; proxy_set_header Máy chủ $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;
Kích hoạt hồ sơ mới được tạo. Liên kết /etc/nginx/sites-available/minio.conf với thư mục /etc/nginx/sites-enabled/.
sudo ln -s /etc/nginx/sites-available/minio.conf /etc/nginx/sites-enabled/
Bạn có thể kiểm tra nginx trước để đảm bảo không có lỗi cú pháp.
nginx -t
Khởi động lại dịch vụ nginx.
sudo systemctl khởi động lại nginx
Tại thời điểm này, bạn sẽ có thể truy cập bảng điều khiển Minio bằng tên miền trên trình duyệt cục bộ của mình.
Ví dụ về lệnh gọi MinIO
Được gọi trong SpringBoot
Thêm phụ thuộc trước
8.4.3
Sau đó tạo một lớp dịch vụ để triển khai tải lên và tải xuống tệp.
nhập io.minio.*; nhập io.minio.messages.Item; nhập java.io.InputStream; nhập java.security.SecureRandom; nhập java.util.Base64; nhập @Service lớp công khai MinIOService { riêng tư cuối cùng MinioClient minioClient; public MinIOService() { try { // Thay đổi cấu hình của riêng bạn, bạn nên ghi nó vào tệp cấu hình this.minioClient = MinioClient.builder() .endpoint("http://localhost:9000") .credentials("minioadmin", "minioadmin") .build() } Catch (MinioException e) { ném RuntimeException mới ("Không thể tạo MinioClient" ", e); } } public String uploadFile(String BuckName, String objectName, luồng inputStream, kích thước dài) { try { minioClient.putObject(bucketName, objectName, luồng, size); return "Tệp được tải lên thành công." } Catch (MinioException | IOException e) { Throw New RuntimeException("Tải lên tệp không thành công.", e); Chuỗi xôName, Chuỗi đối tượng) { thử { return minioClient.getObject(bucketName, objectName } Catch (MinioException | IOException e) { ném RuntimeException mới("Tải tập tin không thành công.", e } } });
Và viết Controller tương ứng cho nó.
nhập org.springframework.beans.factory.annotation.Autowired; nhập org.springframework.core.io.InputStreamResource; nhập org.springframework.core.io.Resource; nhập org.springframework.http.HttpHeaders; .ResponseEntity nhập org.springframework.web.bind.annotation.*; org.springframework.web.multipart.MultipartFile; nhập java.io.IOException; nhập java.io.InputStream; @RestController @RequestMapping("/minio") lớp công khai MinIOController { @Autowired Private MinIOService minIOService; ") public String uploadFile(@RequestParam("file") MultipartFile file) { String BuckName = "my-bucket"; Chuỗi objectName = UUID.randomUUID().toString(); thử (InputStreamstream = file.getInputStream()) { return miniIOService.uploadFile(bucketName, objectName, stream, file.getSize()); Catch (IOException e) { return "Không thể tải tệp lên." } } @GetMapping("/download/{objectName}") public ResponseEntity
downloadFile(@PathVariable String objectName) { Chuỗi BucketName = "my-bucket"; luồng inputStream = minIOService.downloadFile(bucketName, objectName); trả về ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename); =\"" + objectName + "\"") .body(mới inputStreamResource(stream)); } }
Được gọi trong Flask
Tải xuống phần phụ thuộc
cài đặt pip minio
Sau đó tạo Flask để tích hợp MinIO.
from jar import Flask, request, send_file, jsonify from minio import Minio from minio.error import S3Error app = Flask(__name__) # Cấu hình MinIO minio_client = Minio( # Thay đổi thành "localhost:9000", access_key="minioadmin" của riêng bạn secret_key="minioadmin", safe=False ) @app.route('/upload', Method=['POST']) def upload_file(): file = request.files['file'] xô_name = 'my-bucket' object_name = file.filename thử: với open('/tmp/' + object_name, 'wb') là f: f.write( file.read()) minio_client.fput_object(bucket_name, object_name, '/tmp/' + object_name) return jsonify({'message': 'File đã tải lên thành công'}), 200 ngoại trừ S3Error dưới dạng exec: return jsonify({'error': str(exc)}), 500 @app.route('/download/
', Method=['GET']) def download_file(object_name): xô_name = 'my-bucket' thử: reply = minio_client.get_object(bucket_name, object_name) return send_file( reply.stream, as_attachment=True, attachment_filename=object_name, mimetype=response.headers['content-type'] ) ngoại trừ S3Error as exec: return jsonify({'error': str(exc)}), 500 if __name__ == '__main__': app.run(debug=True)
Đề nghị đọc
MinIO Plus: https://mp.weixin.qq.com/s/kSkC3X-SQqo5GzXt-H66xw
Cuối cùng, bài viết về xây dựng máy chủ MinIO trên Ubuntu kết thúc tại đây. Nếu bạn muốn biết thêm về cách xây dựng máy chủ MinIO trên Ubuntu, vui lòng tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt qua các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ tôi trong tương lai. blog! .
Quản lý gói Python không còn là vấn đề đau đầu: bắt đầu nhanh chóng với các công cụ uv
Sử dụng phần mềm trung gian giới hạn tốc độ trong ASP.NET Core
Tìm hiểu cách bẻ khóa chương trình Android
Tuân thủ các quy tắc - xây dựng giám sát k8 từ đầu (1)
asp.net - server.MapPath ("."), server.MapPath ("~"), server.MapPath(@"\"), server.MapPath ("/"). Sự khác biệt là gì?
Có ai có thể giải thích sự khác biệt giữa Server.MapPath(".."), Server.MapPath("~"), Server.MapPath(@"\") và Server.MapPath("/") không? câu trả lời hay nhất
c# - Server.UrlEncode & Server.UrlDecode
Tôi không biết tại sao chúng ta lại sử dụng Server.UrlEncode() & Server.UrlDecode()? !Trong QueryString chúng ta thấy mọi thứ trong URL vậy tại sao chúng ta phải mã hóa chúng
ssl - Chuỗi SSL máy chủ chưa hoàn chỉnh (Máy chủ Inmotion)
Tôi đã cài đặt chứng chỉ ssl trên một trong các tên miền của mình thông qua WHM. Trang web đang hoạt động với https://xyz.com Nhưng nó không hoạt động với https://www.xyz.com. Tôi đã kiểm tra chứng chỉ và nó cũng hoạt động với www.
Cách sử dụng WMI hoặc WMI khác trong C++ để phát hiện phần mềm diệt virus cài đặt trên Windows 2003 Server và 2008 Server 2003 Server R2 và 2008 Server R2
Tôi đã sử dụng WMI để phát hiện sự hiện diện của phần mềm chống vi-rút trên HĐH và nó hoạt động tốt và hiển thị cho tôi thông tin chống vi-rút bằng cách sử dụng không gian tên như tên và id phiên bản trên win xp và window7:\root\SecurityC
Máy chủ Hive 1 và Máy chủ Hive 2
Chúng tôi có phiên bản Hive 0.10 và chúng tôi muốn biết liệu mình nên sử dụng Hive Server 1 hay Hive Server2. Một vấn đề khác là kết nối với máy chủ Hive chạy trên cổng 10000, sử dụng bên thứ 3
c++ - Máy chủ HTTPS API của Windows Server
Tôi muốn thiết lập máy chủ HTTPS bằng C++ bằng API Windows Server, tôi đã sử dụng mã mẫu và nó hoạt động tốt trên HTTP nhưng tôi không thể làm cho nó hoạt động trên HTTPS. (Tôi không muốn khách hàng S
smtpclient không hoạt động với máy chủ Exchange nhưng hoạt động với máy chủ smtp
Tôi đã viết một lớp rất cơ bản để gửi email. Tôi đã thử nghiệm nó với máy chủ smtp và nó hoạt động tốt, nhưng khi tôi thử sử dụng máy chủ trao đổi của công ty mình, nó đưa ra ngoại lệ: máy chủ SMTP yêu cầu kết nối an toàn hoặc máy khách không được xác thực. Quần áo
delphi - Máy chủ DataSnap - Chuyển hướng yêu cầu HTTP sang máy chủ DataSnap khác
Ứng dụng của tôi chứa máy chủ DataSnap REST "cổng" là điểm truy cập đầu tiên cho tất cả máy khách. Tùy thuộc vào tên người dùng được khách hàng chuyển trong yêu cầu (Xác thực cơ bản), yêu cầu cần được chuyển hướng đến một máy chủ DataSnap khác. câu hỏi của tôi
Servlet hoạt động với máy chủ Tomcat của tôi nhưng không hoạt động với máy chủ Glassfish4 của tôi
Tôi có máy chủ Tomcat và máy chủ Glassfish4. Servlet của tôi khởi động tốt trên máy chủ Tomcat nhưng mang lại cho tôi "Trạng thái HTTP 4" trên máy chủ Glassfish4
Không thể truy cập máy chủ Ubuntu từ một máy tính khác ngoài máy chủ lưu trữ máy ảo (tức là máy chủ Ubuntu của tôi)
Tôi đã tạo một máy chủ Ubuntu trên vmware. Tôi sử dụng nó như một máy chủ tập tin. Nếu tôi kết nối thông qua máy chủ của máy ảo, tôi có thể truy cập nó. Tôi không thể thực hiện việc này từ một máy tính khác trên cùng mạng. Cảm ơn trước! Câu trả lời hay nhất trước tiên!
ruby-on-rails - Khởi động lại máy chủ Rails, tách máy chủ Rails
Làm cách nào để khởi động lại máy chủ Rails? Tôi đã khởi động Rails bằng server -d để máy chủ được tách ra và cách duy nhất tôi biết là thực hiện ps helper |
Máy chủ XMPP Vysper và OpenFire/Tigase (cách tạo máy chủ XMPP đơn giản)
Tôi thực sự đang cố gắng tìm cách tốt nhất để viết một máy chủ XMPP đơn giản hoặc tìm một máy chủ có dung lượng rất nhỏ. Tôi chỉ quan tâm đến chức năng cốt lõi của XMPP (trạng thái, nhắn tin, nhắn tin nhóm). Hiện tại vẫn đang học giao thức XMPP (proto
Tôi thực sự đang cố gắng tìm cách tốt nhất để viết một máy chủ XMPP đơn giản hoặc tìm một máy chủ có dung lượng rất nhỏ. Tôi chỉ quan tâm đến các chức năng cốt lõi của XMPP (thống kê, tin nhắn, tin nhắn nhóm). Hiện tại mình cũng đang học giao thức XMPP nên
Sử dụng jax-ws trong máy chủ MobileFirst (máy chủ Liberty)
Chúng tôi đang cố gắng truy cập dịch vụ web SOAP 1.1 từ bộ điều hợp Java JAX-RS. được tạo từ WSDL. Nhưng khi giải mã SOAP không thành công, chúng tôi gặp lỗi sau: ... C
Python khởi động HTTP máy chủ bằng mã hóa (tạo .py để khởi động HTTP máy chủ)
Hiện tại, tôi và nhiều người khác đang sử dụng máy chủ Python HTTP trên nhiều nền tảng (Windows, OS X và có thể cả Linux). sử dụng HTTP Python máy chủ để thử nghiệm trò chơi JavaScript
Trao đổi dữ liệu giữa máy chủ C# (không phải web máy chủ) và PHP
Tôi có một chương trình chạy liên tục trên máy chủ (C#/.NET 2.0 trên Linux với mono) và tôi muốn kết nối với chương trình đó từ đó tập lệnh PHP để hiển thị trạng thái thông tin trên trang web. có Flash
msbuild - Triển khai web không thành công sau khi nâng cấp web máy chủ (Server 2012 R2)
Chúng tôi vừa nâng cấp thử nghiệm web máy chủ của mình từ Server 2008 lên Server 2012 R2. chúng tôi đưa trang web lên máy chủ thì không thành công.
apache - Không thể khởi động máy chủ SpagoBI (tất cả máy chủ spagobi trong một) phiên bản 5.2
Ở Catalina, lỗi là - * NGHIÊM TRỌNG: Không thể xử lý Jar mục nhập [
node.js - Sự khác biệt giữa máy chủ nodejs và máy chủ apache tomcat (Máy chủ ứng dụng) là gì?
Khi họ truy cập vào ứng dụng máy chủ (Apache tomcat), nó sẽ tạo một luồng để xử lý yêu cầu của chúng tôi và kết nối với tomcat, thiết lập kết nối, tomcat tạo một luồng khác để xử lý yêu cầu và chuyển nó đến kết nối, kết nối luồng will move it
ASP.NET Core-6ren
Việc sử dụng phần mềm trung gian giới hạn tốc độ trong ASP.NET Core - Giới thiệu Trong ASP.NET Core, phần mềm trung gian giới hạn tốc độ API Web hoặc MVC Sau đây là một số cách sử dụng cơ sở dữ liệu AddRateLimiter-6ren
Thời gian cập nhật: 27-12-2024 14:49:52
Lõi ASP.NET request for API Web ứng dụng hoặc MVC chặn trạng thái chặn quá tải của máy chủ và cải thiện tính bảo mật.
AddRateLimiter:
1. Đăng ký dịch vụ
Startup.cs hoặc Program.cs, bạn cần đăng ký dịch vụ AddRateLimiter. Điều này có thể được thực hiện với đoạn mã sau:
builder.Services.AddRateLimiter(options => { // Định cấu hình tùy chọn giới hạn tỷ lệ});
2. Thêm chính sách giới hạn tỷ lệ
Có thể thêm các loại chính sách giới hạn tốc độ khác nhau, bao gồm cố định cửa sổ, thanh trượt cửa sổ, nhóm thông báo mã hóa và giới hạn thời gian.
Cố định cửa sổ giới hạn
Khi khoảng cách Ví dụ: một chính sách có thể được thiết lập để cho phép tối đa 4 yêu cầu trong mỗi khoảng thời gian 12 giây.
builder.Services.AddRateLimiter(options => { options.AddFixedWindowLimiter("fixed", opt => { opt.Window = TimeSpan.FromMinutes(1); // Khoảng thời gian opt.PermitLimit = 3; // Được phép trong khoảng thời gian Số thời gian lượng tối đa yêu cầu opt.QueueProcessingOrder = QueueProcessingOrder.OldestFirst //; được phép tối đa trong hàng đợi } });
Tức là số lượng yêu cầu trong một thời gian cố định. lượng đó sẽ được đặt lại trong cửa sổ tiếp theo trong thời gian.
Sau khi thử nghiệm, các yêu cầu dư thừa vẫn sẽ chờ.
https://www.cnblogs.com/guoxiaotian/p/17834892.html.
Thanh trượt cửa sổ giới hạn
Thanh trượt cửa sổ toán học:
Cửa sổ trượt một đoạn tại mỗi khoảng thời gian của đoạn. phân tích số lượng trên mỗi cửa sổ).
Giới hạn số lượng yêu cầu cho một cửa sổ để cho phépGiới hạn các yêu cầu.
Mỗi thời gian của cửa sổ được chia thành một đoạn của một cửa sổ.
Các yêu cầu được nhận từ khoảng thời gian hết hạn quay trở lại một cửa sổ (n đoạn trước đoạn phân đoạn hiện tại) sẽ được thêm vào hiện tại phân đoạn. hết hạn gần đây nhất là "phân đoạn đã hết hạn".
Vui lòng xem bảng đánh giá sau đây hiển thị bộ giới hạn cửa sổ trượt với cửa sổ 30 giây, ba đoạn phân tích trên mỗi cửa yêu cầu sổ và giới hạn 100:
Hàng và cột đầu tiên hiển thị trong khoảng thời gian.
Dòng thứ hai hiển thị lại số lượng yêu cầu. có sẵn ngoại trừ số lượng yêu cầu được xử lý và số lượng yêu cầu được tái sử dụng.
Số lượng yêu cầu mỗi lần chuyển dọc theo đường chéo màu xanh.
Bắt đầu từ thời điểm 30, các yêu cầu hết hạn sẽ được thêm lại vào yêu cầu giới hạn, như được show bằng đường màu đỏ.
Bảng bên dưới được định dạng để hiển thị dữ liệu trong biểu đồ phía trên. 100 yêu cầu cầu có sẵn vì không có đoạn nào trước đó.
Có sẵn
Đã nhận được số lượng yêu cầu
Số lượng yêu cầu được tái chế từ các phân đoạn đã hết hạn
Số dư yêu cầu số lượng
services.AddRateLimiter(options => { options.AddSlidingWindowLimiter("sliding", opt => { opt.Window = TimeSpan.FromMinutes(1); // Tổng thời gian của cửa sổ là 1 phút opt.SegmentsPerWindow = 6; // Thay đổi 1 phút PermitLimit = 10; // Số lượng yêu cầu tối đa được phép trong toàn bộ cửa sổ } });
Giới hạn thông báo mã nhóm
Nó bổ sung thêm thông báo mã hóa. một tỷ lệ nhất định và khi yêu cầu dịch vụ xảy ra, dịch vụ sẽ cố gắng trích xuất mã thông báo (giảm số thông báo mã hóa) để đáp ứng yêu cầu. sẽ bị chặn.
services.AddRateLimiter(configureOptions => { configureOptions.AddTokenBucketLimiter("token-bucket", options => { options.TokenLimit = 100; // Thời gian bổ sung TokensPerPeriod = 10; TokensPerPeriod = 10; bất kỳ tùy chọn.AutoReplenishment=true; hàng đợi.QueueLimit = 10; // Yêu cầu giới hạn độ dài hàng đợi } } ) ;
Đồng thời giới hạn
Bộ giới hạn thời gian là hình thức giới hạn tốc độ đơn giản nhất. tập trung vào số lượng yêu cầu đồng thời.
services.AddRateLimiter(options => { options.AddConcurrencyLimiter("concurrency", options => { options.PermitLimit = 1; // QueueLimit = 10 ; // Yêu cầu hàng dài giới hạn } });
3. Sử dụng phần mềm trung gian
Program.cs, bạn cần sử dụng phần mềm trung gian UseRateLimiter:
app.UseRateLimiter();
4. Áp dụng chính sách giới hạn tỷ giá
Tỷ lệ giới hạn chính sách có thể được áp dụng trên toàn cầu hoặc áp dụng cho các bộ điều khiển hoặc hành động cụ thể:
Cấu hình toàn cầu
app.MapControllers().RequireRateLimiting("đã sửa");
Áp dụng cho một công cụ điều khiển
[EnableRateLimiting("fixed")] lớp công khai RateLimitTestController : ControllerBase { // Hành động của bộ điều khiển }
ứng dụng cho các công cụ hành động
[EnableRateLimiting("fixed")] Nhiệm vụ không đồng bộ công khai
Get() { // Hành động logic }
5. Vô hiệu hóa giới hạn tốc độ
Ngoài ra còn có tùy chọn tắt giới hạn tốc độ, ở bộ điều khiển cấp độ hoặc ở cấp độ hành động cụ thể:
Vô hiệu hóa bộ điều khiển tốc độ giới hạn
[DisableRateLimiting] lớp công khai RateLimitTestController : ControllerBase { // Hành động của bộ điều khiển }
Tắt tốc độ giới hạn cho các công cụ hành động
[DisableRateLimiting] Nhiệm vụ không đồng bộ công khai
Phản hồi có thể được tùy chỉnh khi khách hàng vượt quá tốc độ giới hạn. lại OnRejected để tùy chỉnh phản hồi:
options.OnRejected = (context, token) => { context.HttpContext.Response.StatusCode = StatusCodes.Status429TooManyRequests context.HttpContext.Response.Headers["Retry-After"] = "60"; sau 60 giây hãy thử context.HttpContext.Response.StatusCode = StatusCodes.Status429TooManyRequests; context.HttpContext.Response.WriteAsync("Quá nhiều yêu cầu. Vui lòng thử lại sau.", cancelToken: token return Task.CompletedTask };
Triển khai các chính sách giới hạn tốc độ hiệu quả trong các ứng dụng ASP.NET Core để bảo vệ API khỏi bị lạm dụng và quá tải. Chào mừng bạn theo dõi tài khoản công khai của tôi: Chia sẻ mạng.
Cuối cùng, bài viết này về việc sử dụng phần mềm trung gian giới hạn tốc độ trong ASP.NETCore kết thúc tại đây. Nếu bạn muốn biết thêm về việc sử dụng phần mềm trung gian giới hạn tốc độ trong ASP.NETCore, vui lòng tìm kiếm bài viết CFSDN hoặc duyệt qua các bài viết liên quan. bạn sẽ ủng hộ blog của tôi trong tương lai! .
JPanel trong JFrame JScrollPane trong JTextPane
Điều tôi muốn làm là làm cho JTextPane chiếm nhiều dung lượng nhất có thể trong JPanel. Đối với UpdateInfoPanel tôi đang sử dụng: public class UpdateInfoPanel mở rộng JP
Sự cố với JScrollPane trong JPanel trong JTextArea trong JFrame
Tôi có JTextArea trong JPanel và tôi muốn sử dụng nó với JScrollPane. Tôi đang sử dụng GridBagLayout. Khi tôi chạy nó, khung công tác dường như nhường chỗ cho JScrollPane, nhưng
UITableView trong UIViewController trong iOs Xcode
Tôi muốn triển khai chức năng sau trong xcode. Tôi có Trình điều khiển xem. Trong UIViewController này, tôi có UITabBar. Bên dưới chúng là UIView. Thay đổi UITab
sql - Hàm tương đương với STUFF trong SQL (GROUP_CONCAT trong MySQL/Listagg trong Oracle)
Có ai biết Firebird 2.5 có chức năng tương tự chức năng "STUFF" trong SQL không? Tôi có một bảng chứa các bản ghi người dùng gốc và một bảng khác chứa các bản ghi người dùng con liên quan đến cha mẹ. Tôi muốn có thể trích xuất một chuỗi "ROLES" được phân tách bằng dấu phẩy do người dùng sở hữu, trong khi
Phân tích cú pháp Json trong Mirth hoặc Json trong Mirth hoặc HL7 thành JSON trong Mirth
Tôi muốn sử dụng JSON làm đầu vào và đầu ra của kênh phản ánh, chẳng hạn như lưu thông tin chi tiết trong cơ sở dữ liệu hoặc tạo thông báo HL7. Nói tóm lại, đầu vào là JSON, phân tích cú pháp và xuất ra bất kỳ định dạng nào. Đối tượng trả lời tốt nhất
Nếu cột A trong tệp 1 = cột A trong tệp 2, thay thế bằng cột B trong tệp 2
Thông thường tôi sẽ sử dụng R và thực hiện merge.by, nhưng tệp này có vẻ quá lớn để bất kỳ máy tính nào trong bộ phận có thể xử lý nó! (Thông tin bổ sung cho bất kỳ ai làm việc trong lĩnh vực di truyền học) Về cơ bản, việc quy định dường như sẽ bị xóa Sau khi nhận được số rs của ID snp, tôi chỉ có
HAML trong Javascript Javascript trong
Tôi có một câu hỏi có thể đã được hỏi trước đây nhưng tôi gặp khó khăn khi tìm mô tả chính xác. Tôi hy vọng ai đó có thể giúp tôi. Trong đoạn mã bên dưới, tôi đã thiết lập varprice và tôi muốn thêm biến javascript accu_id để tra cứu bản ghi trong cơ sở dữ liệu của mình thông qua Rails
SVG trong HTML HTML trong
Tôi có một tệp SVG đơn giản có thể xem tốt trong Firefox - nó có một số văn bản gói chứa một số HTML bằng cách sử dụng đối tượng nước ngoài - văn bản được gói trong một div:
"Hoặc" trong khối If trong Ruby
Vì vậy, tôi đang viết một chương trình Ruby dành cho trường học để thay đổi giá trị bool thành true nếu giá trị là 1 hoặc 3 và thành false nếu nó là 0 hoặc 2. Vì tôi có nền tảng Java nên tôi nghĩ mã này sẽ hoạt động:
amazon-web-services - Cách gọi hàm AWS Lambda trong Tài khoản B (Lambda trong VPC) từ Lambda trong Tài khoản A (Lambda trong VPC)
Những gì tôi đã làm: Tôi đã tạo VPC ngang hàng giữa các tài khoản này Cổng Internet cũng được kết nối với từng VPC Bảng định tuyến cũng được định cấu hình (để cho phép lưu lượng truy cập từ cả hai phía) Trường hợp 1: Khi hai VPC này nằm trong cùng một tài khoản Trong thời gian chờ đợi, tôi đã thử nghiệm thành công nó từ một La khác
php - Làm cách nào để lấy các hàng có giá trị1 trong cột1 và giá trị2 trong cột2 nhưng giá trị2 trong cột1 không có giá trị1 trong cột2?
Tôi có một bảng gọi là danh bạ: user_id contact_id 10294 10295 10294 10293 10293 10294 102
getChildHtml trong foreach trong Magento
Tôi đang sử dụng mẫu mới trong Magento. Để tránh trùng lặp mã, tôi muốn sử dụng cùng một mẫu con cho mỗi bản xem trước sản phẩm. Cụ thể là tôi đã tạo một màn hình như thế này: $products = Mage::getModel('catalog/pro
giao thức - "defimpl" trong "for" trong Elixir thực sự kiểm tra điều gì?
"for" có luôn kiểm tra loại tham số đầu tiên trong mọi hàm được xác định trong giao thức không? Chỉnh sửa (viết lại): Khi một phương thức giao thức chỉ có một tham số, việc triển khai được tìm thấy dựa trên loại tham số đơn đó (trực tiếp hoặc tùy ý). Khi thỏa thuận (p
javascript - JavaScript trong PHP PHP trong JavaScript
Tôi muốn gọi hàm JavaScript từ mã PHP của mình. Tôi đã đạt được điều này bằng cách sử dụng: echo ' drawChart($id); '; Điều này hoạt động tốt, nhưng tôi muốn lấy dữ liệu từ mã PHP của mình, tôi sử dụng
javascript - html trong html JavaScript trong html
Câu hỏi này đã có câu trả lời: Sự kiện ràng buộc trên các phần tử được tạo động? (23 câu trả lời) Đã đóng 5 năm trước. Tôi có một biểu mẫu động mà tôi muốn nối thêm một số h
setState trong .map trong thành phầnDidMount()
Tôi đang cố gắng tìm giải pháp sử dụng setState trên các mục được ánh xạ trong thành phầnDidMount. Tôi đang sử dụng GraphQL cùng với Gatsby để trả về nhiều mục dữ liệu nhưng yêu cầu điều đó trong một thao tác cụ thể
android - OnTouchListener trong Chế độ xem trong ScrollView
Tôi có Chế độ xem bên trong ScrollView. Tôi muốn gọi phương thức này cứ sau 80 mili giây miễn là người dùng giữ Chế độ xem. Đây là những gì tôi đã thực hiện: rung Runnable cuối cùng = Runnab mới
android - dvmAbort trong dvmDecodeIndirectRef trong GetStringUTFChars
Tôi đã phát triển một ứng dụng Android bằng jni. Tôi nhận được một dvmabort trong dvmDecodeIndirectRef của GetStringUTFChars. Tôi chỉ phá thai một lần. Tại sao điều này lại xảy ra?
RecyclerView trong FragmentPagerAdapter trong Hoạt động android -
Khi tôi truy cập Hoạt động của mình, tôi gọi FragmentPagerAdapter để xử lý các tab khác nhau của mình. Trong một trong các tab của mình, tôi muốn hiển thị RecyclerView nhưng anh ấy không bao giờ xuất hiện, với một điểm ngắt mà tôi thấy
RecyclerView trong DialogFragment trong Hoạt động android - RecyclerView trong DialogFragment trong Hoạt động
Khi tôi nhấn một nút trong Hoạt động, DialogFragment sẽ bật lên. Trong đoạn hộp thoại, có một RecyclerView trông giống như một ListView bình thường. Hành vi tôi muốn là khi
Quản lý gói Python không còn là vấn đề đau đầu: bắt đầu nhanh chóng với uv tools-6ren
Quản lý gói Python không còn là vấn đề đau đầu: Bắt đầu nhanh chóng với các công cụ uv - Có rất nhiều công cụ trong hệ sinh thái quản lý gói Python, chẳng hạn như pip, pip-tools, thơ, conda, v.v., mỗi công cụ có một số chức năng nhất định. UV được giới thiệu hôm nay là P-6ren do Astral phát triển và viết bằng Rust.
Thời gian cập nhật: 27-12-2024 14:51:42
Có nhiều công cụ trong hệ sinh thái quản lý gói Python, chẳng hạn như pip, pip-tools, thơ, conda, v.v., mỗi công cụ có một số chức năng nhất định.
UV được giới thiệu hôm nay là một công cụ quản lý gói Python dựa trên Rust do Astral đưa ra, nhằm mục đích trở thành "Cargo of Python".
Nó cung cấp trải nghiệm quản lý gói nhanh chóng, đáng tin cậy và dễ sử dụng với hiệu suất, khả năng tương thích và chức năng tuyệt vời, mang đến các tùy chọn mới cho việc phát triển và quản lý các dự án Python.
1. Tại sao nên sử dụng tia cực tím
So với các công cụ quản lý gói khác trong Python, uv có nhiều ưu điểm hơn:
nhanh
: Hưởng lợi từ
tia cực tím
Tốc độ của công cụ này thật đáng kinh ngạc. Ví dụ: cài đặt các phần phụ thuộc nhanh hơn nhiều so với các công cụ khác.
Chức năng toàn diện
Đúng"
Dịch vụ một cửa
"Các công cụ từ cài đặt Python, quản lý môi trường ảo đến cài đặt và quản lý các gói, đến quản lý các phần phụ thuộc của dự án, nó đều có thể xử lý rất tốt mọi thứ
Tương lai tươi sáng
: Có những công ty đầu tư mạo hiểm đằng sau nó
Tinh tú
Được hỗ trợ và thông qua
MIT
Cấp phép nên ngay cả khi có vấn đề phát sinh trong tương lai, cộng đồng vẫn có cách giải quyết
Sử dụng uv, bạn cũng có thể quản lý các phần phụ thuộc một cách thuận tiện như các dự án NodeJS hoặc Rust.
2. Cách cài đặt
Việc cài đặt uv rất đơn giản. Bạn có thể sử dụng tập lệnh cài đặt chính thức hoặc cài đặt thông qua pip.
# Trên macOS và Linux -LsSf https://astral.sh/uv/install.sh | Trên Windows. powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" # With pip install uv.
Sau khi cài đặt, bạn có thể kiểm tra xem quá trình cài đặt có thành công hay không qua trợ giúp uv thông tin:
3. Cách sử dụng
Phần sau đây trình bày cách sử dụng uv để quản lý các dự án Python.
Trước khi sử dụng uv, việc tạo một dự án Python đối với tôi chỉ là tạo một thư mục.
Vui lòng sửa cho tôi bất kỳ thiếu sót hoặc sai sót nào!
Tiếp theo, hãy bắt đầu bằng cách tạo một dự án để trình bày một số chức năng tôi thường sử dụng khi sử dụng sử dụng tia cực tím.
Đầu tiên, hãy giới thiệu hai tệp được sử dụng chủ yếu bởi các công cụ uv:
pyproject.toml
:
Version và other information
uv.lock
: Ghi lại tất cả các phần phụ thuộc của dự án, bao gồm tất cả các phần phụ thuộc và nền tảng khác để đảm bảo tính nhất quán của quá trình cài đặt trong các môi trường khác nhau.
Quản lý tự động, không chỉnh sửa thủ công
3.1.
Tiếp theo, tạo một dự án và sử dụng lệnh uv init
$ uv init myproject Dự án đã khởi tạo `myproject` tại `D:\projects\python\myproject` $ cd .\myproject\ $ ls Thư mục: D:\projects\python\myproject Mode LastWriteTime Tên dài --- - ---- --------- ------ ---- -Một---- 27/12/2024 12:06:08 109 .gitignore -a---- 2024/12/27 12:06:08 5 .python-version -a---- 2024/12/27 12:06:08 87 hello.py -a---- 27/12/2024 12:06: 08 155 pyproject.toml -a---- 27/12/2024 12:06:08 0 README.md
Sau khi tạo dự án thông qua init, công cụ uv đã giúp chúng tôi tạo một số tệp mặc định theo cách chug.
Trong số đó, hello.py chỉ là một đoạn mã để trình diễn.
Sau đó, chúng tôi có thể xóa tệp mã hóa này và thay thế bằng mã thực tế của riêng mình theo nhu cầu thực tế của dự án.
$ cat .\hello.py def main(): print("Xin chào từ dự án của tôi!") if __name__ == "__main__": main()
Có một số dự án thông tin trong pyproject.toml:
$ cat .\pyproject.toml [project] name = "myproject" version = "0.1.0" description = "Thêm mô tả của bạn vào đây" readme = "README.md" require-python = ">=3.12" dependency =[]
Git.
3.2. Môi trường hoạt động
Sau khi tạo dự án, điều đầu tiên họ làm khi vào thư mục gốc của dự án là đồng bộ hóa các thành phần phụ thuộc của dự án MỘT.
$ uv sync Sử dụng trình dịch CPython 3.12.4 tại: D:\miniconda3\envs\databook\python.exe Gói trong 15ms được kiểm tra trong 0,05 mili giây
Sau khi đồng bộ hóa, phiên bản thích hợp của Python sẽ tự động được tìm thấy hoặc tải xuống môi trường ảo của dự án dự án sẽ được tạo và cài đặt, đồng thời một danh sách phụ thuộc sẽ được xây dựng và ghi lại.
uv.lock và cuối cùng là đồng bộ hóa các phần phụ thuộc vào môi trường ảo.
Dự án của chúng tôi là một dự án mới được tạo và không có sự phụ thuộc nào, vì nội dung trong tệp uv.lock tương thích đối đơn giản.
$ ls Thư mục: D:\projects\python\myproject Mode LastWriteTime Tên dài ---- ------------- tốc độ ------ ---- d---- -- 27/12/2024 12:12:39 .venv -a---- 2024/12/27 12:06:08 109 .gitignore -a---- 2024/12/27 12:06:08 5 .python-version -a---- 2024/12/27 12:06:08 87 hello.py -a---- 2024/12/27 12:06: 08 155 pyproject.toml -a--- - 27/12/2024 12:06:08 0 README.md -a---- 2024/12/27 12:12:39 116 uv.lock $ cat .\uv.lock version = 1 require-python = ">=3.12" [[gói]] name = " myproject" phiên bản = "0.1.0" nguồn = { ảo = "." }
Sau khi đồng bộ hóa uv được đồng bộ hóa, bạn có thể chạy dự án mã hóa.
Vì chúng tôi sử dụng uv để quản lý dự án nên chúng tôi sẽ sử dụng lệnh uv để chạy mã thay vì sử dụng python xxx.py như trước.
Chúng tôi có thể thử chạy mã được tạo tự động khi dự án được tạo.
$ uv run .\hello.py Xin chào từ dự án của tôi!
3.3. Quản lý thuộc tính
Quản lý các phần phụ thuộc là mục tiêu chính của công việc sử dụng các công cụ uv. npm và Cargo.
$ uv add pandas 7 gói trong 3,41 giây Chuẩn bị 6 giây trong 4,63 giây Đã cài đặt 6 giây trong 1,80 giây + numpy==2.2.1 + pandas==2.2.3 + python-dateutil==2.9.0.post0 + pytz= =2024.2 + sáu==1.17.0 + tzdata==2024.2
Tôi đã cố gắng cài đặt phần phụ thuộc của gấu trúc (các gói mà gấu trúc phụ thuộc cũng được cài đặt tự động) động).
Bây giờ hãy xem những thay đổi trong tệp uv.lock.
$ cat .\uv.lock version = 1 require-python = ">=3.12" [[package]] name = "myproject" version = "0.1.0" source = { virtual = "." } phụ thuộc = [ { name = "pandas" }, ] [package.metadata] require-dist = [{ name = "pandas", specifier = ">=2.2.3" }] [[gói]] name = Phiên bản "gấu trúc" = "2.2.3" nguồn = { đăng ký = "https://pypi.org/simple" } phụ thuộc = [ { name = "numpy" } , { name = "python-dateutil" }, { name = "pytz" }, { name = "tzdata" }, ] [[gói]] name = "pytz" phiên bản = "2024.2" source = { register = "https://pypi.org/simple" }
Tôi đã xóa rất nhiều nội dung trong nhật ký vì nội dung tổng hợp có thể quá nhiều. từng gói và các gói không phụ thuộc.
Chúng tôi không cần phải chỉnh sửa file uv.lock.
Sau khi giới thiệu gấu trúc, hãy xem liệu nó có thể được sử dụng trong hello.py hay không.
$ cat .\hello.py nhập gấu trúc dưới dạng pd def main(): print("Xin chào từ dự án của tôi!") df = pd.DataFrame( { "A": [1, 2, 3], "B": [4 , 5, 6], } ) print(df) if __name__ == "__main__": main() $ uv run .\hello.py Xin chào từ myproject! 4 1 2 5 2 3 6
Bạn có thể sử dụng gói pandas đã cài đặt một cách bình thường. Bây giờ hãy thử xóa các phần phụ thuộc.
$ uv loại bỏ gấu trúc Đã giải quyết 1 gói trong 12 mili giây Đã gỡ cài đặt 6 gói trong 1,18 giây - numpy==2.2.1 - pandas==2.2.3 - python-dateutil==2.9.0.post0 - pytz==2024.2 - six==1.17 .0 - tzdata==2024.2 $ cat .\uv.lock version = 1 require-python = ">=3.12" [[gói]] tên = "myproject" phiên bản = "0.1.0" nguồn = { ảo = "."
Sau khi sử dụng lệnh uv Remove để xóa gói pandas, các gói khác mà pandas phụ thuộc cũng sẽ tự động bị xóa.
Chúng ta thấy file uv.lock cũng được khôi phục về nội dung ban đầu.
Hãy thử chạy lại hello.py và xem.
$ uv run .\hello.py Traceback (cuộc gọi gần đây nhất gần đây nhất): Tệp "D:\projects\python\myproject\hello.py", dòng 1, trong
nhập gấu trúc dưới dạng pd ModuleNotFoundError: Không có mô-đun nào có tên 'pandas '
Chắc chắn là nó không thể chạy được.
3.4 Phân biệt môi trường phát triển và môi trường sản xuất
Một chức năng thường được sử dụng khác là phân biệt sự phụ thuộc của môi trường phát triển và môi trường sản xuất. Chức năng này rất phổ biến trong NodeJS và Rust.
Ví dụ: chúng tôi muốn cài đặt gấu trúc vào môi trường phát triển và cài đặt các yêu cầu vào môi trường sản xuất.
$ uv add --group dev pandas Đã giải quyết 7 gói trong 1,72 giây Đã cài đặt 6 gói trong 1,39 giây + numpy==2.2.1 + pandas==2.2.3 + python-dateutil==2.9.0.post0 + pytz==2024.2 + six==1.17.0 + tzdata==2024.2 $ uv add --group yêu cầu sản xuất Đã giải quyết 12 gói trong 2,72 giây Chuẩn bị 5 gói trong 1,31 giây Đã cài đặt 5 gói trong 68 mili giây + certifi==2024.12.14 + charset-normalizer==3.4.1 + idna==3.10 + request==2.32.3 + urllib3==2.3.0
Sau khi cài đặt, tệp uv.lock sẽ tự động thêm các gói khác nhau và các gói phụ thuộc của chúng, những gói này sẽ không được mô tả ở đây.
Từ pyproject.toml của dự án, bạn có thể thấy các gói phụ thuộc của các môi trường khác nhau.
$ cat .\pyproject.toml [project] name = "myproject" version = "0.1.0" description = "Thêm mô tả của bạn vào đây" readme = "README.md" require-python = ">=3.12" dependency = [] [nhóm phụ thuộc] dev = [ "pandas>=2.2.3", ] production = [ "requests>=2.32.3", ]
4. Sự phát triển trong tương lai
uv cũng có thể xây dựng và xuất bản các gói Python lên PyPi. Các chi tiết cụ thể sẽ không được thảo luận trong bài viết này.
Kể từ khi phát hành uv, nhóm đã cam kết ưu tiên khả năng tương thích, hiệu suất và độ ổn định trên nhiều nền tảng, đồng thời giúp người dùng chuyển đổi suôn sẻ các dự án sang sử dụng uv để quản lý.
Về lâu dài, uv sẽ phát triển thành một trình quản lý gói và dự án Python hoàn chỉnh, cung cấp trải nghiệm phát triển toàn diện, bao gồm tất cả các khía cạnh từ cài đặt Python đến quản lý dự án, đơn giản hóa hơn nữa quy trình phát triển của các dự án Python và nâng cao hiệu quả phát triển.
Cuối cùng, bài viết này về Không còn đau đầu trong quản lý gói Python: Bắt đầu nhanh chóng với các công cụ uv kết thúc tại đây. Nếu bạn muốn biết thêm về Không còn đau đầu trong quản lý gói Python: Bắt đầu nhanh chóng với các công cụ uv, vui lòng tìm kiếm bài viết CFSDN hoặc. tiếp tục duyệt các bài viết liên quan, tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Ví dụ dòng lệnh FFmpeg
Ví dụ dòng lệnh FFmpeg-6ren
Ví dụ về dòng lệnh FFmpeg-1 Trích xuất luồng video/luồng âm thanh//Tách luồng video và luồng âm thanh ffmpeg -i input_file -vcodec copy -an out_file_video ffmpeg -i input_fi-6ren
Thời gian cập nhật: 27-12-2024 16:47:42
1 Trích xuất luồng video/luồng âm thanh
// Tách luồng video và luồng âm thanh ffmpeg -i input_file -vcodec copy -an out_file_video ffmpeg -i input_file -acodec copy -vn out_file_audio
2 Đóng gói truyền tải video
ffmpeg –i test.mp4 –vcodec sao chép –acodec sao chép –f m4v test.m4v ffmpeg –i test.avi –vcodec sao chép –acodec sao chép –f m4v test.m4v
3 Chuyển mã video
ffmpeg –i test.mp4 –vcodec h264 –s 352*278 –an –f m4v test.264 ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an –f m4v test.264 ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi
Mô tả một số tùy chọn: -bf, số khung B; -g, kiểm soát kích thước gop; -s, độ phân giải.
4 bao bì video
ffmpeg –i video_file –i audio_file –vcodec sao chép –acodec sao chép đầu ra_file
5 cắt video
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy out.avi
Mô tả một số tùy chọn: -r, tần suất trích xuất hình ảnh; -ss, thời gian bắt đầu; -t thời lượng.
6 ảnh chụp màn hình video
Đầu tiên hãy chạy lệnh sau để kiểm tra nó:
ffmpeg -ss 00:00:08 -i test.mp4 -f image2 test.jpg
Người ta thấy rằng ảnh chụp màn hình đã được tạo bình thường, nhưng dòng lệnh có thông báo lỗi sau: [image2 @ 0x1370f80] Không thể lấy tên tệp khung số 2 từ mẫu 'test.jpg' (đặt cập nhật hoặc sử dụng mẫu như % 03d trong mẫu tên tệp) av_interleaved_write_frame (): Đối số không hợp lệ.
Tham khảo "Giải pháp cho một số lỗi và thông báo ffmpeg" để biết nguyên nhân như sau:
Lỗi này thường xảy ra do tên đầu ra bất thường hoặc thiếu một số tùy chọn: Nếu xuất một hình ảnh duy nhất, bạn nên thêm tùy chọn đầu ra "-frames:v 1"; Nếu xuất ra một loạt hình ảnh, bạn nên sử dụng tên chính xác; biểu mẫu, chẳng hạn như tệp đầu ra. Khi được đặt tên là out_%03d.png, out_001.png, out_002.png, out_003.png, v.v. sẽ được tạo theo trình tự; Nếu xuất ra một hình ảnh duy nhất, luôn ghi đè hình ảnh cũ bằng hình ảnh mới nhất thì nên thêm tùy chọn "-update 1".
Dựa trên những gợi ý trên, lệnh sửa đổi như sau:
Trích xuất một hình ảnh duy nhất
Trích xuất một khung hình ở giây thứ 8:
ffmpeg -ss 00:00:08 -i ring.mp4 -frames:v 1 -f image2 ring.jpg
Mô tả từng tham số như sau: "-ss 00:00:08": Tùy chọn đầu vào, chặn hình ảnh ở giây thứ 8 trong tệp đầu vào "-frames:v 1": Tùy chọn đầu ra, ghi khung hình video vào đầu ra "-f image2": Tùy chọn đầu ra, chỉ định định dạng đầu ra là image2.
Lưu ý rằng "-ss 00:00:08" phải được đặt trước "-i ring.mp4" làm tùy chọn đầu vào để nhanh chóng có được ảnh chụp màn hình video. Nếu nó được đặt sau "-i ring.mp4", nó sẽ trở thành tùy chọn đầu ra. Khi thực hiện tùy chọn đầu ra, ffmpeg sẽ tiếp tục đọc từ tệp đầu vào cho đến khi đạt đến thời điểm đã chỉ định trước khi có thể chụp được ảnh chụp màn hình. xảy ra ở cuối tệp, bạn phải đợi cho đến khi toàn bộ video được phát trước khi có thể lấy được ảnh chụp màn hình video.
Trích xuất một loạt hình ảnh
Trích xuất một khung hình cứ sau 1 giây (1Hz):
ffmpeg -i ring.mp4 -r 1 -f image2 ring-%3d.jpg
"-r 1": Tùy chọn đầu ra, đặt tốc độ khung hình, đáp ứng tốc độ khung hình này bằng cách lặp lại (lớn hơn tốc độ khung hình của tệp đầu vào) hoặc loại bỏ các khung hình video (nhỏ hơn tốc độ khung hình của tệp đầu vào).
Từ video dài 10 giây bắt đầu từ giây thứ 8, cứ sau 1 giây lại trích xuất một hình ảnh (1Hz):
ffmpeg -ss 00:00:08 -t 00:00:10 -i ring.mp4 -r 1 -f image2 ring-%03d.jpg
Từ video dài 10 giây bắt đầu từ giây thứ 8, trích xuất 3 khung hình đầu tiên:
ffmpeg -ss 00:00:08 -t 00:00:10 -i ring.mp4 -frames:v 3 -f image2 ring-%03d.jpg
Trích xuất hình ảnh từ khung
ffmpeg -i video.avi -frames:v 1 -vf field=top top%d.png
7 quay video
Ghi lại các luồng mạng.
ffmpeg –i rtsp://192.168.2.104:1235/test –vcodec copy out.avi
Quay video biểu đồ kiểm tra (testsrc), dài 12 giây.
ffmpeg -ss 00:00:00 -t 00:00:12 -f lavfi -i testrc testrc.flv
8 Lưu tập tin YUV
ffmpeg -i Tiger.m2ts -an -c:v rawvideo -pixel_format yuv422p -ss 00:00:08 -frames:v 5 Tiger_422_8b.yuv ffmpeg -i Tiger.m2ts -an -c:v rawvideo -pixel_format yuv422p10 -ss 00 :00:08 -frames:v 5 Tiger_422_10b.yuv ffmpeg -i fifa.ts -an -c:v rawvideo -vf format=yuv422p -ss 00:01:00 -frames:v 5 fifa_3840x2160_422_8b.yuv ffmpeg -f lavfi -i nullsrc=s=3840x2160:r=60,lutrgb=0:255:0 -frames:v 5 -vf format=yuv422p -c:v rawvideo green_3840x2160_422p_8b.yuv
Cuối cùng, bài viết về các ví dụ dòng lệnh FFmpeg này kết thúc tại đây. Nếu bạn muốn biết thêm về các ví dụ dòng lệnh FFmpeg, vui lòng tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Mạng đám mây lai quá phức tạp? ENS mang đến cho bạn trải nghiệm tuyệt vời nhất về mạng lưới toàn cầu
Làm cách nào để chọn được phiên bản hệ thống phù hợp nhất với nhu cầu của bạn trong số rất nhiều phiên bản Ubuntu? Sử dụng máy tính công nghiệp DeThành GM-1100 để phân tích sâu ô cửa
Ví dụ về IPv6 Ví dụ về Wireshark
Câu hỏi này đã có câu trả lời ở đây: Đã đóng 11 năm trước. Wireshark cung cấp trên trang web của nó, tôi có thể tải xuống bất cứ thứ gì?
c# - Kéo và giải phóng nhiều lần trong WPF - ví dụ/ví dụ/hướng dẫn?
Tôi đang tìm một ví dụ hoặc bất kỳ giải pháp sẵn có nào có thể tích hợp được vào ứng dụng hiện có và sử dụng sử dụng chức năng kéo và thả nhiều lần. nhiều mục từ một điều khiển như ListBox sang ListBox khác.
c# - Ví dụ nhúng GATE Ví dụ về lỗi NoClassFound
Tôi mới sử dụng GATE Embedded, tôi đã thử ví dụ đơn giản và nhận được NoClassDefFoundError. D:\dự án\gate-7.0
Eclipse-rcp - Ví dụ JFace trong Eclipse giống như ví dụ SWT?
Có ví dụ điều khiển JFace tất cả trong một giống như ví dụ SWT trong Eclipse không? Tìm kiếm (googling và tìm kiếm trên stackoverflow.com) không giúp được gì cho tôi nếu đó là một ứng dụng độc lập hoặc ecl
google-compute-engine - Ví dụ/ví dụ/hướng dẫn về Google Computer Engine .NET API
Ai có thể chỉ định tôi điều gì không? Tái bút Tôi biết tài liệu tham khảo API (https://developers.google.
Một ví dụ về C# dựa trên Basicauth
Gần đây, khi thực hiện một dự án cho công ty, khách hàng có nhu cầu của chúng tôi thường xuyên lấy dữ liệu từ ma trận hệ thống của họ. Tại sao bạn vẫn sử dụng nó? Nhưng không có cách nào,
Ví dụ về YAML
Tuy nhiên, điều này (rõ rõ ràng) có nghĩa là tôi cần có khả năng xác định, cú pháp phân tích và cú pháp xác thực chính xác của YAML trong cấu hình tệp, phải có một tập hợp/chuỗi được gọi là .cái này.
ví dụ về python
Tôi đã đọc được rằng có lớp smb.SMBConnection.SMBConnection(username, pass, my_name, remote_name
Ví dụ: iptables limit ssh link server
hôm nay tôi muốn giới hạn chế độ it, tức là cho phép một số nguồn IP kết nối với máy chủ. Quy tắc iptables xử lý phương pháp: ed.
Ví dụ về Sonarqube PostProjectAnalysisTask?
Trang này nói rằng plugin HipChat sử dụng hook này, nhưng đối với tôi, có vẻ như nó vẫn sử dụng Po cũ
Ví dụ về GWT CustomScrollPanel
CustomScrollPanel CustomScrollPanel GWT KHÔNG. cuộn gốc
Ví dụ CRUD Marionette
Tôi đang cố gắng phát triển ứng dụng Backbone Marionette và tôi cần biết cách thực hiện tốt nhất các hoạt động CRUD (Tạo, Đọc, Cập nhật và Hủy).
Ví dụ về BLE của Android
đóng cửa câu hỏi này yêu cầu chi tiết hoặc rõ ràng. hỏi điều này?
Ví dụ Django về việc gửi nhiều phiên bản của biểu mẫu tới cơ sở dữ liệu?
Tôi cần biểu thị mẫu django gửi nhiều yêu cầu đặc biệt và tôi không thể tìm thấy ví dụ về cách thực hiện công việc này mà không có Biểu tượng mẫu sẽ liệt kê tất cả các sửa chữa có thể có mà cửa hàng có thể thực hiện và người dùng sẽ chọn những gì họ có muốn thực hiện
mùa xuân - Ví dụ MultiTenantSpringLiquibase.
Tôi có đơn đăng ký Multi-Tenancy. Tuy nhiên, ứng dụng tương tự này có liquidibase. myapp.yml
Ví dụ TDD cho ứng dụng kinh doanh
Tôi hiểu ý tưởng chung về thử nghiệm đơn vị và đã sử dụng nó trong các vấn đề tương tác phức tạp xảy ra trong hệ thống, nhưng tôi vẫn thắc mắc về việc kết hợp tất cả các nguyên tắc này với nhau. cảnh báo không kiểm tra khung hoặc cơ sở dữ liệu. must of people. Khung công tác MVC không bao gồm một
Ví dụ về Clojure để hiểu
Tôi đang sử dụng docjure và chức năng chọn cột của nó yêu cầu cột bản đồ. họ định nghĩa theo cách thủ công. :B :C :D :E ... :A
yii - ví dụ findByAttribution
hướng dẫn sử dụng $condition và $param trong findByAttribut trong Yii Trong hầu hết các trường hợp, đây là cách tôi sử dụng findByAttribut Person::model()->f
ví dụ về qtcreator chưa được bật
Tôi đã cài đặt qtcreator trên Ubuntu 11.10 sudo apt-get install qtcreator Các phiên bản đã cài đặt là: QT Creator 2.2.1, QT 4.7.3 Khi tôi bắt đầu
Làm cách nào để chọn phiên bản hệ thống phù hợp nhất với nhu cầu của bạn trong số rất nhiều phiên bản Ubuntu? Sử dụng máy tính công nghiệp DeThành GM-1100 để phân tích sâu các cửa-6ren
Làm cách nào để chọn phiên bản hệ thống phù hợp nhất với nhu cầu của bạn trong số rất nhiều phiên bản Ubuntu? Sử dụng máy tính công nghiệp Dechen GM-1100 để phân tích sâu quy trình - Ubuntu là hệ điều hành Linux dựa trên Debian GNU/Linux, được hỗ trợ architecture x86, amd64 (x64) và ppc, đồng thời tập trung vào các ứng dụng máy tính để bàn. Nam Phi
Thời gian cập nhật: 27-12-2024 16:47:52
Ubuntu là hệ điều hành Linux dựa trên Debian GNU/Linux, hỗ trợ kiến ​​trúc x86, amd64 (x64) và ppc, tập trung vào các ứng dụng máy tính Ubuntu là một khái niệm của quốc gia châu Phi và là. một trong những nguyên tắc sáng lập của Cộng hòa Nam Phi. vào. mối quan hệ giữa con người với nhau và trung thành. tôn trọng, hỗ trợ lẫn nhau, chia sẻ, giao tiếp, quan tâm, tin tưởng, lòng vị tha và các ý nghĩa khác.
Vì vậy, “hệ thống Ubuntu” giống như tên gọi của nó, là nguồn mở mã chính xác, chia sẻ, miễn phí, có cộng đồng hỗ trợ và giao tiếp rộng lớn, được nhiều doanh nghiệp và người dùng cá nhân trong và ngoài nước yêu thích. Nhưng có rất nhiều phiên bản. điều hành Ubuntu, Make you doing. Bạn nên cài đặt phiên bản nào? hợp với bạn?
Ubuntu version Ubuntu tung ra phiên bản hệ thống mới vào tháng 4 và tháng 10 hàng năm .
Do đó, phiên bản đầu tiên của Ubuntu có tên là 4.10 (tháng 10 năm 2004), và sau mỗi phiên bản được phát hành, các phiên bản Phần phụ của nó sẽ tiếp tục được cập nhật. Có rất nhiều phiên bản Ubuntu (vui lòng tham khảo bảng sau chỉ danh sách list các phiên bản lớn hơn. dài như Cảnh ven sông trong Lễ hội Thanh Minh).
Cài đặt cách tên của nó là "tính từ + tên động vật", và chữ cái đầu tiên của tính từ và con vật phải giống nhau, bắt. Ubuntu 6.06, các chữ cái đầu tiên được sắp xếp theo thứ tự bảng chữ cái tiếng Anh ABCD.
Ví dụ: Ubuntu 23.10 phát hành vào tháng 10 năm 2023 có mã tên là Mantic Minotaur (Prophetic Minotaur), với chữ cái đầu tiên là M, còn tên mã của thế hệ tiếp theo là N theo thứ tự bảng chữ cái, vì vậy Ubuntu 24.04 LTS phát hành vào tháng 4 năm 2024, The mật danh là Noble Numbat (thú ăn kiến ​​​​cao quý), và chữ cái đầu tương ứng là N. (hình ảnh bên) dưới).
Version LTS sẽ được hỗ trợ thời gian và bảo trì tới 5 năm và LTS sẽ được tối ưu hóa. hệ thống không có LTS hầu hết là phiên bản phát triển và thử nghiệm, hỗ trợ thời gian trong thời gian ngắn.
Ubuntu. Vídụ: Ubuntu 24.04 LTS là phiên bản ổn định với sự hỗ trợ hỗ trợ lâu dài. Phiên bản này được trang là kernel Linux 6.8 mới nhất, bao gồm Python 3.12, Ruby 3.2., PHP 8.3, Go 1.22, OpenJDK 21 và .NET 8.
Ubuntu 24.04 LTS: https://cn.ubuntu.com/download/desktop.
Hạt nhân Ubuntu Vì có rất nhiều phiên bản của hệ điều hành Ubuntu, nên cài đặt phiên bản nào? Kernel là phần cốt lõi của hệ điều hành và chịu trách nhiệm về phần cứng, kiểm soát hệ thống tệp, đa nhiệm và các chức năng khác. Số phiên bản của kernel bao gồm ba phần "ABC". Ví dụ: kernel 4.4.117 có nghĩa là số phiên bản. bản chính là 4 và số phiên bản phụ là 4. Số phiên bản là 4 và số phiên bản được điều chỉnh là 117. Số càng lớn thì phiên bản càng cao mới.
Số phiên bản của Ubuntu thường gắn liền với một số phiên bản kernel. dựa trên nhân Linux 4.15 nên mỗi phiên bản mới của hệ thống sẽ được cập nhật để có khả năng tương thích tốt hơn phần cứng mới trên trường. nên chỉ có kernel so sánh bảng của LTS phiên bản được liệt kê ở đây.
lntel Linux phiên bản hỗ trợ hệ thống Sau khi hiểu hệ thống phiên bản và phiên bản kernel của Ubuntu trước đó, chúng tôi có thể chọn phiên bản phù hợp với CPU của máy tính. system Intel Linux Phiên bản nhân Linux và phiên bản hệ thống được hỗ trợ nền tảng này.
Máy tính công nghiệp Dechen GM-1100 có thể hỗ trợ bộ xử lý Intel thế hệ 14/13/12. Loại CPU như vậy? Lấy bộ xử lý Intel thế hệ thứ 14 làm ví dụ, nền tảng (Nền tảng) của nó là Raptor Lake-S Refresh. Tương ứng với nhân Linux được hỗ trợ (Phiên bản hạt nhân) được hỗ trợ trong hệ thống hỗ trợ bảng là 6.1 và phiên bản Ubuntu của hệ thống là 22.04. cơ sở tương thích của nó, sau đó tìm thấy phiên bản Linux tương ứng và phiên bản hệ thống Ubuntu tương ứng từ tên nền post.
Bạn có thể trực tiếp tìm nền Intel thế: CPU Intel thoải mái hệ thứ 8, nền tảng của nó là Coffee Lake, phiên bản nhân Linux được hỗ trợ là 4.14 và phiên bản hệ thống Ubuntu là 18.04.
Do bên ngoài Chúng tôi cũng có thể tìm thấy phiên bản phù hợp để cài đặt bản cập nhật hệ thống phiên bản.
Ngoài ra, việc hỗ trợ thường xuyên xuyên suốt 18.04 LTS đã kết thúc vào ngày 31/5/2023 nên chúng tôi có thể chọn phiên bản 20.04 LTS tiếp theo để cài đặt hoặc chọn phiên bản mới nhất 24.04 LTS của hệ điều hành Ubuntu.
Đặt nằm Ubuntu20.04.4 LTS làm ví dụ, nhấn Ctrl + Alt + T để mở terminal và nhập lệnh trong terminal:
Kiểm tra phiên bản Ubuntu cat /etc/issue và nó hiển thị: Ubuntu 20.04.4 LTS \n \l.
Kiểm tra phiên bản kernel uname –r hiển thị: 5.13.0-30-generic.
Xem chi tiết kernel uname –a show: Linux ubuntu 5.13.0-30-generic #40~20.04.4-Ubuntu SMP Thứ Sáu ngày 27 tháng 12 13:10:12 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux.
Kết luận: Làm thế nào để chọn được phiên bản hệ thống phù hợp nhất với nhu cầu của bạn trong số rất nhiều Ubuntu phiên bản? Nhưng khi cài đặt chúng, phiên bản hỗ trợ dài hạn được ưu tiên hỗ trợ với LTS.
Tiếp theo, chúng tôi cần xác định CPU của máy tính và nền tảng tên tương thích của nó, sau đó tìm phiên bản Linux tương thích match and version của hệ thống Ubuntu tương thích với nền tên. 12 đến 14. Lấy máy tính công nghiệp làm ví dụ, có thể thấy rằng CPU thế hệ 13/14 hỗ trợ nhân Linux phiên bản 6.1, Ubuntu phiên bản 22.04 và The 12. CPU thế hệ hỗ trợ nhân Linux phiên bản 5.10/5.15 và Ubuntu phiên bản 22.04.
Bảng tương ứng được cung cấp trong bài viết này có thể dễ dàng tìm kiếm theo thế hệ CPU Intel và nó tương thích trực tiếp với Phiên bản Linux được hỗ trợ và phiên bản hệ thống Ubuntu. this system, hãy tham khảo bảng này. hợp lý sau điều này.
URL tham khảo 1: https://cn.ubuntu.com/.
URL tham khảo 2: https://www.cincoze-china.com/goods_info.php?id=537.
URL tham khảo 3: https://www.intel.cn/content/www/cn/zh/partner/showcase/offering/a5bHo0000003vtqIAA/gm1100-embedded-mxm-gpu-computer.html.
Cuối cùng, bài viết này nói về cách chọn phiên bản hệ thống phù hợp nhất với nhu cầu của bạn trong số rất nhiều phiên bản Ubuntu bản? chọn phiên bản hệ thống phù hợp nhất với nhu cầu của mình trong số rất nhiều phiên bản Ubuntu để sử dụng máy tính? công nghiệp Dechen GM-1100 phân tích nội dung ô sâu, các bạn vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Mong các bạn sẽ ủng hộ blog của mình trong thời gian tới nhé!
Dự đoán nguồn mở NetCore, phù hợp cho người mới học
java - system.out.println, system.err.println
Tôi có mã này: System.err.print("number of terms = "); System.out.println(allTerms.size());
Tôi có thể sử dụng Ant để phát hiện xem tôi có đang sử dụng hệ thống Linux không (trái ngược với hệ thống Unix chung) không?
Tôi gặp vấn đề sau: Tôi phải thực hiện các hoạt động khác nhau giữa OS là Linux và khi OS là MacO. Ant command sau: /u
System() close() sau hành động không xác định
Tôi đang gọi system("bash ../tools/bashScript\"This is anargument!\"&") và sau đó tôi đang gọi close(socketFD) trực tiếp trên hệ thống
Các tính năng cưỡng bức của mảng trong hệ thống verilog
Buộc loại bỏ một ngẫu nhiên các phần tử liên kết bằng cách sử dụng các phần tử ngẫu nhiên tạo lệnh cấm là hợp lệ. ghi nhớ hình ảnh và có lớp sau: class abc rand bit[5:0;
hệ thống ca cao() tiến trình?
Tôi đang tạo một ứng dụng phải sử dụng các hệ thống hàm(const char*) để thực hiện một số việc nặng và tôi cần có kh ả Ví dụ: nếu hệ điều hành đang chuyển tệp cho bạn thì nó sẽ cung cấp cho bạn một tiến trình thanh toán,
kiến trúc - Bạn mô tả giải pháp/hệ thống của mình như thế nào?
Tôi sắp xếp một số tiêu chuẩn/hướng dẫn và mẫu mà người quản lý dự án, nhà phát triển và nhà phân tích kinh doanh sẽ use. Phần công việc này cung cấp các tiêu chuẩn/hướng dẫn để biên dịch các phương pháp. trường hợp kinh doanh/nhu cầu của người dùng
hiệu suất - Hệ thống đệm/hệ điều hành để ứng dụng bộ đệm
Khi phát triển một ứng dụng sử dụng chỉ mục đĩa nén hoặc tệp đĩa, trong đó các phần của chỉ mục hoặc tệp được truy cập liên tục (vì mục đích tranh luận, giả sử điều gì đó giống như bản phân phối Zipfian), tôi muốn biết khi nào là đủ/tốt hơn để dựa vào về hoạt động Bộ đệm cấp hệ thống (ví dụ: Debia
Hệ thống "plugin" Powershell
Chúng tôi đã viết một tập lệnh powershell xử lý hình ảnh từ hệ thống nội bộ và gửi chúng đến một hệ thống khác. Bây giờ, một bộ phận khác của doanh nghiệp muốn tham gia, tự xử lý dữ liệu và chuyển nó sang hệ thống khác. Sau khi hỏi thăm xung quanh, có một số người xung quanh công ty
c# - System.ApplicationException
Tôi đang cố gắng kiểm tra ứng dụng của mình nhưng tôi gặp phải lỗi sau: System.Web.HttpUnhandledException: Một ngoại lệ của loại 'System.Web.HttpUnhandledException' đã bị ném
javascript - sản phẩm/hệ thống tạo hướng dẫn về cách sử dụng trang web của bạn
c - lỗi 'hệ thống' không được khai báo trong phạm vi này
Vì vậy, tôi không gặp lỗi này trong các chương trình khác, nhưng tôi gặp lỗi này trong chương trình này. Chương trình này là một ví dụ mà tôi không gặp lỗi. #include int main() { system("pause"); } // vi
c# - System.UriFormatException
Tôi gặp sự cố với System.URI.FormatExption trong c# Để rõ ràng, tôi đang sử dụng phương pháp Matlab của Segseuil và nó trả về kết quả đường dẫn hình ảnh. Tôi muốn lưu cái này cho những người dùng khác
c# - tham chiếu system.drawing
Tôi đang cố gắng đặt màu nền của hộp văn bản như thế này: txtCompanyName.BackColor = Draw.Color.WhiteSmoke; Nó không thích vì nó muốn tôi thêm hệ thống ở phía trước, ví dụ: txtCo;
c# - System.StackOverflowException
Vui lòng giúp tôi giải quyết System.StackOverflowException Tôi muốn ghi bản ghi vào cơ sở dữ liệu bằng .aspx Tôi đang sử dụng kiến trúc 4 tầng để đạt được điều này, mọi thứ đều hoạt động tốt nhưng khi tôi biên dịch trang thì nó hiển thị các trường để chèn dữ liệu và khi tôi đặt dữ liệu
API hệ thống Android
Tôi đang sử dụng một số API thường được hệ thống gọi. Vì vậy, tôi đã thêm android:sharedUserId="android.uid.system" vào tệp kê khai và sử dụng Android từ GIT
Cài đặt lại từ ứng dụng/hệ thống
Tôi đang cố gắng tạo một ứng dụng nhỏ yêu cầu quyền truy cập đọc/ghi vào thư mục/hệ thống (nó đang cố xóa một tệp và tạo một tệp mới vào vị trí của nó). Tôi có thể kết nối lại thư mục đó mà không gặp vấn đề gì khi sử dụng adb và nếu tôi làm điều này, ứng dụng của tôi sẽ
java - cài đặt lại /system từ ứng dụng hệ thống;
Tôi muốn kết nối lại /system dưới dạng RW từ ứng dụng riêng tư của hệ thống mà không có su. Làm cách nào tôi có thể thực hiện việc này theo chương trình? Bạn sẽ chỉ sử dụng Runtime.getruntime().exec() để thực thi lệnh shell phải không?
hệ thống C#. Ngoại lệ hoạt động không hợp lệ
Tôi đang cố gắng tạo một chương trình với hệ thống đăng nhập. Tôi chưa quen với điều này nhưng tôi đã làm việc liên tục 8 giờ để tìm ra điều này. Đây là mã lỗi tôi nhận được + ServerVersion 'con.ServerVersion' đã ném
Lệnh gọi System() để thực thi hàng loạt tệp truyền phát khiến chương trình được đặt lại trên Windows
Khi tôi "xây dựng và chạy" chương trình trong Code::Blocks, nó chạy hoàn toàn bình thường! Nhưng khi tôi chạy thủ công từ thư mục "/bin", khi nó cố gọi "temp.bat" bằng system() , thì nó sẽ thiết lập lại. tại sao vậy? nó không
Cuộc gọi hệ thống/đường dẫn thay đổi các ký tự đặc biệt trong lệnh được truyền để thực thi
Tôi muốn sử dụng lệnh hệ thống/ống để thực thi lệnh với các ký tự đặc biệt. Dưới đây là mã mẫu. Sau khi thực hiện lệnh thông qua hệ thống/ống, nó sẽ thay đổi lệnh bằng cách thay đổi các ký tự đặc biệt. Tôi rất ngạc nhiên khi thấy lệnh hệ thống đang thay đổi văn bản được truyền dưới dạng lệnh. chạy(ch
Dự án mã nguồn mở NetCore, phù hợp cho người mới học-6ren
Dự án mã nguồn mở NetCore, phù hợp cho người mới học - VerEasy.Core Giới thiệu Đây là một framework dễ phát triển dựa trên .NET Core, với vue3 front-end framework. Cung cấp một chương trình API hiệu quả và có thể mở rộng. Hỗ trợ xác thực JWT, vận hành cơ sở dữ liệu, ghi nhật ký, xử lý không đồng bộ và các tính năng đặc biệt khác-6ren
Thời gian cập nhật: 27-12-2024 16:49:52
VerEasy.Core
Đây là một framework dễ phát triển dựa trên .NET Core, có đính kèm framework vue3 front-end. Cung cấp một chương trình API hiệu quả và có thể mở rộng.
Nó hỗ trợ xác thực JWT, vận hành cơ sở dữ liệu, ghi nhật ký, xử lý không đồng bộ và các tính năng khác, có thể đáp ứng hầu hết các nhu cầu kinh doanh.
Dự án có thể được tích hợp liền mạch với các ứng dụng front-end, ứng dụng di động và các dịch vụ khác, cung cấp cho các nhà phát triển các giải pháp linh hoạt và hiệu quả.
Tính năng và tiến bộ
Mô-đun khung
⭐Khung này được áp dụng tổng thể
Kho bãi + dịch vụ + giao diện
⭐Giao diện chủ yếu áp dụng hình thức không đồng bộ
không đồng bộ/đang chờ
⭐Áp dụng khung ORM nguồn mở trong nước
SqlSugar
⭐Hỗ trợ sử dụng nhiều thư viện và có thể hỗ trợ nhiều cơ sở dữ liệu (trang web chính thức của sqlsugar)
⭐Tệp hạt giống dữ liệu tích hợp dự án, bảng và dữ liệu cơ bản khởi tạo khởi động dự án
⭐Chức năng ghi nhật ký huyết thanh
Ghi âm tự động toàn cầu hỗ trợ đầu ra
Tệp cục bộ, cơ sở dữ liệu, bảng điều khiển
⭐Hỗ trợ tạo mã
1. Bảng tạo thực thể
2. Thực thể tạo bảng
3. Tệp nghiệp vụ tạo bảng (kho bãi, dịch vụ, bộ điều khiển)
4. Tạo dữ liệu hạt giống từ cơ sở dữ liệu
⭐Sử dụng tài liệu SwaggerAPI
⭐Sử dụng Automapper để ánh xạ giữa các thực thể
⭐Sử dụng AutoFac làm vùng chứa phần chèn phụ thuộc và hỗ trợ chèn hàng loạt (chẳng hạn như nhiều AOP)
⭐Hỗ trợ xử lý tên miền chéo của Cors
⭐Hỗ trợ xử lý xác thực và ủy quyền JWT
⭐Gói
Ngoại lệ toàn cầu
Bộ lọc ngoại lệ toàn cầu
Thạch anh
Hỗ trợ xử lý tác vụ theo lịch trình
⭐Việc áp dụng tổng thể
Id bông tuyết
ID bông tuyết
⭐ Đã triển khai phân quyền cho menu vai trò người dùng
kết cấu khung
Toàn bộ framework theo đuổi mục tiêu dễ dàng mở rộng và sử dụng, với một dự án front-end gắn liền với Vue3, nhưng framework tổng thể sẽ không quá phức tạp, giúp dễ dàng tích hợp với các dự án front-end hiện có. Nếu muốn xóa mã, bạn cũng cần điều chỉnh lại các tham chiếu tương ứng,… là điều khó tránh khỏi.
├── VerEasy.Common/ lớp phương thức công khai (dành cho các phương thức phổ biến toàn cầu) │ ├── FastCode/ thư mục liên quan đến tạo mã │ ├── Thư mục phương thức trợ giúp/ phụ trợ │ ├── LogHelper/ cho bảng điều khiển đầu ra Phương thức mở rộng nhật ký │ ├─ ─ Lớp Utils/ Tool (tương tự như đọc file cấu hình, tạo ID Snowflake, v.v.) ├── VerEasy.Core.Api/ lớp giao diện │ ├── Thư mục bộ điều khiển/ bộ điều khiển │ ├── Bộ lọc/ thư mục bộ lọc │ ├── wwwroot/ thư mục tĩnh ├── VerEasy.Core.IRepository/ warehousing Lớp giao diện │ ├─ ─ Giao diện bổ sung, xóa và sửa đổi cơ bản/cơ bản │ ├── IRepository/ Phương thức cơ bản không thể đáp ứng lớp giao diện kho bãi có thể mở rộng │ │ ├── IDepartmentRepository.cs ├── Lớp giao diện VerEasy.Core.IService/ Service (giống như trên) │ ├── Base/ │ │ ├── IBaseService. cs │ ├── IService/ │ │ ├── IDepartmentService.cs ├── VerEasy.Core.Models/ Lớp mô hình │ ├── Lớp cơ sở trường cơ sở/ thống nhất (chẳng hạn như Id, công cụ sửa đổi, thời gian sửa đổi, v.v.) │ │ ├── BaseModel.cs │ ├ ── Lớp Dtos/Dto, dùng để đóng gói và trả về định dạng trả về thống nhất, v.v.│ ├── Thư mục lớp Enums/ Enumeration (doanh nghiệp cần xác định các bảng liệt kê hoặc các bảng liệt kê sẽ được sử dụng trên toàn cầu) │ ├── Thư mục ViewModels/ Entity (thư mục thực thể tương ứng với cấu trúc bảng) ├── VerEasy.Core .Repository/ Warehousing lớp triển khai (kế thừa lớp giao diện kho bãi và triển khai giao diện đã xác định, cấu trúc giống như trên) │ ├── Base/ │ ├── Repository/ ├── VerEasy.Core.Service/ Lớp triển khai dịch vụ (kế thừa lớp giao diện dịch vụ và triển khai giao diện đã xác định, cấu trúc giống như trên) │ ├── Base/ │ ├── Dịch vụ/ ├ ── VerEasy.Core .Tasks/ Lớp nhiệm vụ theo lịch trình (đóng gói Quartz) │ ├── Quartz.Net/ Các thư mục liên quan đến Quartz (mở rộng các thư mục khác khi rảnh) │ │ ├── Giao diện IScheduleCenter.cs Scheduler (cho phép liên quan đến bộ lập lịch, chẳng hạn như thực hiện một công việc và dừng một công việc) │ │ ├── JobFactory.cs Job Factory, kế thừa IJobFactory chính thức │ │ ├── JobListener Quartz Listen, giám sát việc thực hiện các tác vụ đã lên lịch │ │ ├── Triển khai giao diện bộ lập lịch ScheduleCenter │ │ ├── Công việc/ Thư mục tác vụ đã lên lịch cụ thể ├── VerEasy.Extensions/ Thư viện lớp mở rộng (chủ yếu đưa vào các dịch vụ khác) │ ├── Thư mục Aop/ AOP │ ├── Ủy quyền/ Liên quan đến xác thực danh tính (Jwt) │ ├── HostedService/ Quản lý các dịch vụ cần được thực thi khi dự án bắt đầu (chẳng hạn như Persistent Quartz) │ ├── Thư mục ServiceExtensions/ Dịch vụ mở rộng (cấu hình tiêm của nhiều dịch vụ khác nhau) │ │ ├─ ─ HttpContext / Ngăn nhà phát triển tự động lấy thông tin đăng nhập bằng cách không cập nhật thời gian sửa đổi và các thông tin khác của người sửa đổi │ │ ├── Mô-đun/ Các dịch vụ khác (chẳng hạn như: cấu hình mối quan hệ ánh xạ bản đồ) │ │ │ ├── MappingProfileModule.cs │ ├── Thư mục đường dẫn ServiceMiddlewares/ Middleware ├── VerEasy.Serilog/ Thư viện lớp nhật ký │ ├── LoggerConfigurationExtensions.cs Cấu hình đầu ra nhật ký (đầu ra cơ sở dữ liệu hoặc cục bộ, v.v., được chuẩn hóa tổng thể)
Dưới sự phát triển không ngừng
Dự án này vẫn đang được phát triển và bảo trì tích cực, đồng thời các tính năng mới sẽ tiếp tục được bổ sung và các mô-đun hiện có sẽ được tối ưu hóa trong tương lai. Chào mừng bạn đến theo dõi dự án và tìm hiểu về những diễn biến mới nhất! Sự ủng hộ của bạn là động lực để chúng tôi tiến về phía trước! ✨ .
Nếu bạn thích dự án này
Nếu bạn thích dự án này, đừng quên cho nó một ⭐Sao! Sự ủng hộ của bạn là động lực lớn nhất để chúng tôi không ngừng cải tiến! .
Tham gia và đóng góp
Nếu bạn có đề xuất hoặc ý tưởng để cải thiện dự án này, vui lòng gửi Vấn đề hoặc Yêu cầu kéo! Chúng tôi rất mong được bạn tham gia và cùng nhau làm cho dự án này trở nên mạnh mẽ hơn! .
Cuối cùng, bài viết về dự án mã nguồn mở NetCore phù hợp cho người mới học sẽ kết thúc tại đây. Nếu bạn muốn biết thêm về dự án mã nguồn mở NetCore phù hợp cho người mới tìm hiểu, vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục. để duyệt các bài viết liên quan, tôi hy vọng bạn sẽ ủng hộ tôi trong tương lai! .
Ba phương pháp để xuất dữ liệu nhị phân gói mạng Wireshark
Tính đa dạng của các thuộc tính và tham số trong UML
c# - Vừa/lấp đầy hình ảnh?
Tôi đang tạo một chương trình đơn giản để thay đổi nền máy tính của mình. Tôi đã tìm thấy một câu hỏi về stackoverflow trực tuyến ít nhiều đề cập đến những gì tôi muốn làm. Bây giờ tôi có thể thay đổi thành công hình nền của mình thành ô xếp, căn giữa và kéo dài từ URL hình ảnh trực tuyến (str
mysql - giá trị tối đa trong một nhóm phù hợp với mệnh đề Where
Đúng, đây là một trong những vấn đề lớn nhất với mọi nhóm! Tôi đã cố gắng giải quyết vấn đề này trong vài ngày nay nhưng không có kết quả. Mình cũng đang tìm nhưng không biết có tìm đúng chỗ không. Phiên bản đơn giản nhất của vấn đề như sau. Tôi có 2 bảng, một bảng là nhiều-nhiều và một bảng
Đề xuất trình biên dịch phù hợp với cú pháp JavaME?
Tôi muốn phân tích một số dữ liệu và tôi có ngữ pháp BNF để phân tích nó. Có ai có thể giới thiệu bất kỳ trình biên dịch cú pháp nào có thể tạo mã có thể sử dụng trên thiết bị di động không? Vì đây là dành cho JavaME nên mã được tạo phải: Hy vọng có rất ít sự phụ thuộc vào các thư viện Java bên ngoài
r - phù hợp với mô hình ARIMA
Tôi có một đối tượng chuỗi thời gian sở thú, tốc độ: 2011-05-01 00:00:00 7.52 2011-05-01 00:10:00 7.69 2011-05-01 00:20:00 7.67 2011
osgi - Một framework phù hợp cho các ứng dụng như ERP
Tôi muốn tạo một hệ thống quản lý sản xuất để một công ty sản xuất nhỏ sử dụng. Hệ thống sẽ cho phép ghi lại các giai đoạn khác nhau của quá trình sản xuất thiết bị. Các yêu cầu như sau: 1. Giao diện không dựa trên trình duyệt. Cần thứ gì đó dựa trên Swing hoặc AWT. Mặc dù tôi hiểu sự tiện lợi của việc triển khai giải pháp dựa trên trình duyệt
clojure - Lamson thích hợp với clojure?
Có thư viện thư java hoặc clojure nào có thể triển khai chức năng của lamson không? Đặc biệt chức năng định tuyến thư của lamson rất hay http://verpa.wordpress.com/2010/11/13/mak
python - Sklearn - điều chỉnh, mở rộng quy mô và biến đổi
Phương thức fit() trong sklearn dường như phục vụ các mục đích khác nhau trong cùng một giao diện. Khi áp dụng cho tập huấn luyện, như sau: model.fit(X_train, y_train) fit() được sử dụng để học p p sẽ được sử dụng sau này trên tập kiểm tra
javascript - Phù hợp với giới hạn trong bản đồ
Tôi đang sử dụng OSM để hiển thị ranh giới quận. Nó hoạt động tốt trong hầu hết các trường hợp, nhưng trong một số trường hợp, các quận lớn hơn và không vừa với bản đồ. Làm cách nào tôi có thể điều chỉnh mức thu phóng trước khi bắt đầu hiển thị? var map = L.map("mapCnty").setV
javascript - Đúng kích cỡ cho JavaScript
Tôi đang cố gắng thu nhỏ và làm xấu đi các tệp javascript của mình. Tôi muốn biết kích thước phù hợp là bao nhiêu. Nếu tôi hợp nhất tất cả các tệp js thành một tệp (được rút gọn và xấu) thì nó sẽ lớn hơn 1mb. Tôi nghĩ, sẽ tốt hơn nếu chia chúng thành 2-3 file (mỗi file
android — TextArea phù hợp với GridPane
Tôi mới làm quen với Java. Tôi muốn đặt TextArea bên trong GridPane. Tôi đã thử điều này trong vài giờ qua và đây là kết quả: Như bạn có thể thấy, TextArea lớn hơn nhiều so với Gridpane của tôi. Đây là mã của tôi:
r - Phương sai của chuỗi thời gian phù hợp với mô hình ARIMA
Tôi nghĩ đây là một câu hỏi cơ bản, nhưng có lẽ tôi đang nhầm lẫn các khái niệm. Giả sử tôi điều chỉnh mô hình ARIMA cho chuỗi thời gian bằng cách sử dụng hàm auto.arima() từ gói dự báo R. Mô hình giả định phương sai không đổi. Làm thế nào để tôi có được sự khác biệt đó? Nó bị vô hiệu hóa
android — Điều chỉnh văn bản trong ô UItableView
Tôi có một nhãn rất dài, đây là nhãn đầu tiên của tôi và tôi muốn đặt nó vào ô của mình. Đây là những gì tôi có nhưng nó không hoạt động. Tôi có UITabelviewCell tùy chỉnh với một số nhãn bên trong nó. -(CGFloat)bảng
python - phù hợp với WCS để chữa
Giả sử tôi có tệp FITS chứa tiêu đề WCS để tôi có thể thực hiện những thao tác sau: #import Healpy as hp #import astropy.io.fits as pyfits #
jQuery dành cho người thiết kế web mới bắt đầu
Đã đóng cửa. Câu hỏi này không tuân thủ nguyên tắc Stack Overflow. Câu trả lời không được chấp nhận vào thời điểm này. Sự cố này dường như không liên quan đến việc lập trình trong phạm vi được xác định trong trung tâm trợ giúp. Đã đóng cửa 10 năm trước. Cải thiện
c# - Nhà máy trừu tượng cho Unity
Chúng tôi đang xây dựng một ứng dụng có nhiều điểm tiếp xúc tích hợp với các hệ thống khác. Chúng tôi sử dụng Unity một cách hiệu quả cho tất cả các nhu cầu chèn phần phụ thuộc của mình. Toàn bộ lớp nghiệp vụ được xây dựng bằng cách sử dụng phương pháp tiếp cận dựa trên giao diện và việc triển khai thực tế nằm trong ứng dụng
Chú thích phù hợp với các phần MKMapView
Tôi có MKMapView và một số chú thích. Tôi sử dụng mã tiếp theo để hiển thị tất cả các chú thích: NSArray *coordines = [self.mapView valueForKeyPath:@"annotat
php - Thích hợp cho MySQL truy vấn trạng thái mới nhất
Tôi làm việc cho một công ty lưu trữ và chúng tôi thường xuyên nhận được yêu cầu cài đặt, tên miền mới, sửa lỗi lag, v.v. Để biết những gì vẫn còn mở, tôi quyết định tạo một hệ thống bán vé rất đơn giản. Tôi có một ít kiến thức về php và một ít kiến thức về MySQL. Hiện tại, chúng tôi sẽ căn cứ vào
android — Kích thước hình ảnh vừa với toàn bộ nền của UITableView
Tôi muốn thêm hình nền vào UITableView phù hợp với giao diện người dùng và cũng có NavigationController và thanh công cụ. Trong trường hợp đó, tôi không tìm thấy chế độ xem bảng phù hợp với các màn hình khác nhau của iPhone và iPad
Tính đa dạng của các thuộc tính và tham số UML-6ren
Tính đa dạng của các thuộc tính và tham số trong UML - Trong UML, tính bội số đề cập đến phạm vi số tiềm năng của một mục. Tính bội số có thể được sử dụng cho các thuộc tính, tham số thao tác và mối quan hệ. Siêu mô hình UML cũng sử dụng bội số để hạn chế mối quan hệ giữa các phần tử siêu mô hình. Bội số luôn chứa giá trị số lượng, là số lượng mục có liên quan trong thế giới thực chính xác. -6ren
Thời gian cập nhật: 27-12-2024 16:51:42
Trong UML, bội số đề cập đến phạm vi tiềm năng của một mục. thuộc tính, tham số thao tác và mối quan hệ. siêu mô hình phần tử. 1. Tính đa dạng của các thuộc tính Giả sử chúng ta cần định nghĩa một lớp Sách đại diện cho một cuốn sách chứa một loạt thuộc tính. Theo tiền đề này, các thuộc tính liên quan của Sách được thể hiện bằng sơ đồ lớp như sau: Trong hình trên, tác giả của cuốn sách là một người, nhưng trong thế giới thực, một cuốn sách có thể có nhiều tác vụ hơn để điều chỉnh. Ba tác Lớp sơ đồ được sửa đổi như sau: Tuy nhiên, vẫn còn một số vấn đề trong thiết kế. thảo luận riêng bên dưới. không? Rõ ràng xóa 3500 tác giả là rất hiếm, nhưng để có thể khởi tạo một danh sách với nhiều tác giả thì phải bổ sung thêm nhiều thuộc tính giả hơn. Nhưng có bao nhiêu tác giả phù hợp là một câu hỏi khó xác định. vì việc phát triển khai báo mã sẽ rối loạn và không có hiệu quả. thuộc tính giả định không? Giải thích được cung cấp UML cho vấn đề được định nghĩa là bội số của thuộc tính, có nghĩa là bằng cách đánh dấu bội số Lớp sơ đồ Sách sử dụng bội số như sau: Như bạn có thể tìm thấy trong hình trên, tác giả thuộc tính bổ sung "[1..*]" sau loại Person of it "[1..*]" đến vô hạn hoặc thuộc tính giả có ít nhất một giá trị. it allow it in "[1..*]", 1 limit under, cho vô cực, vì vậy tính tác giả là từ 1 Khí sử dụng dấu ngoặc vuông "[]" để biểu thị bội số, giới hạn trên phải lớn hơn hoặc bằng giới hạn bên dưới. Thông thường một cuốn sách có ít nhất một tác giả, nhưng trong một số trường hợp đặc biệt, tác giả thông tin Trọng nó phải được cài đặt thành "[0..*]", biểu thị rằng không có hoặc nhiều tác vụ. bằng 0 và nhiều nhất là không có giới hạn, điều đó cho biết thuộc tính đó là thuộc tính tùy chọn và thuộc tính có có thể có nhiều giá trị. "[*]". người ta có thể nghĩ rằng các trang thuộc tính cũng nên được xác định chỉ với bội số. Tuy nhiên, đối với một cuốn sách định nghĩa nhất, có thể có nhiều tác vụ nhưng số trang của nó là giá trị tối đa được định nghĩa. Nếu bạn định nghĩa giới hạn số trang được phép trong một cuốn sách, bạn có thể chỉ định điều này bằng cách cách sử dụng một lệnh kill. bội số. có một giá trị. "[1..1]" hoặc "[1]". Trong UML, mặc định giá trị của bội số số là "[1]", nghĩa là nếu một thuộc tính không được định nghĩa nhiều số, điều đó có nghĩa là thuộc tính phải có và chỉ một giá trị, hai sơ đồ này tương thích. ví dụ: khi một cuốn sách được nhà sản xuất bản chính thức, người biên tập sẽ đảm nhận trách nhiệm biên tập và đánh giá cuốn sách. sửa.1]" để thể hiện rằng đó là tùy chọn. kill các thuộc tính của trang. nội tuyến trong thuộc tính hoặc có thể được sử dụng trong thuộc tính. trong phần chú thích của lớp sơ đồ. thuộc tính. lời giải thích. Ví dụ Ví dụ: khi tính toán đa dạng và ràng buộc các thuộc tính của trang được đánh dấu cùng lúc, có thể sử dụng hình sau:
2. Tính bội số của các tham số Chúng tôi cũng có thể áp dụng tính bội số cho các tham số và cách sử dụng nó tương tự như việc áp dụng nó cho các thuộc tính. Nó chứa ba tham số biểu thị bội số: bội số của tham số là "[1..*]", biểu thị các cuộc đua tham gia trong chuyến đi Có ít nhất một; số của itenerary tham số là "[2..* ]", biểu thị rằng đường dẫn có ít nhất hai điểm (điểm bắt đầu và điểm kết thúc end, time cũng có thể bao gồm một số điểm đi qua); Nói chung, if a number is tùy chọn thì phải chỉ định một mặc định giá trị cho nó. Kết quả lớp sơ đồ là một ví dụ khác. Ví dụ trên, trong đó số lượng nhiều giá trị cho mỗi tham số được thay đổi, ba tham số đầu tiên được phép trong phép toán có số lượng giá trị value bị giới hạn nghiêm ngặt. công dụng của nó nói chung là giống nhau.
Nếu bạn muốn biết thêm về tính toán đa dạng các thuộc tính và tham số UML, vui lòng tìm kiếm bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. tương lai .
WxPython
thuộc tính thuộc tính javascript.net
Bạn có thể so sánh các thuộc tính mà tôi muốn tắt "txtName". phương pháp nào tốt hơn và tại sao? Câu trả lời tốt nhất cho tôi
Hướng dẫn VBS: Thuộc tính-Đếm thuộc tính
Thuộc tính Count trả về một số mục mà một bộ sưu tập hoặc từ điển đối tượng chứa đối tượng duy nhất. object.Count có thể là bất kỳ bộ sưu tập hoặc cặp nào được liệt kê trong danh sách "áp dụng cho"
Hướng dẫn VBS: Thuộc tính - CompareMode Thuộc tính
tham số object.CompareMode[=so sánh]
Hướng dẫn VBS: Thuộc tính-Cột
TextStream. object.Column tượng trưng thường là tên của TextStream đối tượng.
Hướng dẫn VBS: Thuộc tính-Thuộc tính không có sẵn
Thuộc tính AvailableSpace trả về số lượng không có sẵn cho người dùng trên một ổ đĩa hoặc chia sẻ mạng được chỉ định. đối tượng.AvailableSpace phải là Drive 
Hướng dẫn VBS: Thuộc tính-Thuộc tính thuộc tính
Thuộc tính thuộc tính hoặc trả về các thuộc tính của tệp hoặc thư mục. thuộc vào thuộc tính object tham số object.Attribut [= newattributes]
Hướng dẫn VBS: Thuộc tính-AtEndOfStream Thuộc tính
Thuộc tính AtEndOfStream Trả về True nếu con trỏ tệp ở tệp TextStream cuối cùng nếu không thì trả về Sai nếu nó không ở chế độ chỉ read.object.A
Hướng dẫn VBS: Thuộc tính-AtEndOfLine Thuộc tính
Thuộc tính AtEndOfLine Trong tệp TextStream, nếu con trỏ trỏ đến dòng cuối cùng, nó sẽ trả về True; nếu không, nó sẽ trả về Sai if it not read only mode.AtEn.
Hướng dẫn VBS: Thuộc tính-Thuộc tính RootFolder
Thuộc tính RootFolder trả về một thư mục đại diện đối tượng cho gốc thư mục của ổ đĩa được chỉ định. Chỉ đọc đối tượng object.RootFolder phải là Dr
Hướng dẫn VBS: Thuộc tính-Đường dẫn thuộc tính
Đường dẫn phải là tên của Tệp, Thư mục hoặc Ổ đĩa đối tượng. gốc.
Hướng dẫn VBS: Thuộc tính-Thuộc tính ParentFolder
Thuộc tính ParentFolder trả về thư mục gốc của tệp tệp hoặc thư mục đã được xác định rõ ràng. là tên của Tệp hoặc Thư mục tượng trưng.
Hướng dẫn VBS: Thuộc tính-Tên thuộc tính
Đặt tên thuộc tính hoặc trả về tên của tệp hoặc thư mục được chỉ định. object tham số object.Name [= newname] bị bắt buộc. Nên là Tệp hoặc &
Hướng dẫn VBS: Thuộc tính thuộc tính của dòng
Dòng thuộc tính là thuộc tính đọc chỉ, trả về số dòng hiện tại trong TextStream tệp. của TextStream object.
Hướng dẫn VBS: Thuộc tính-Thuộc tính khóa
Thông thường từ từ điển 
Hướng dẫn VBS: Thuộc tính-Thuộc tính thuộc tính
Đặt hoặc trả về mục thuộc tính tương ứng với khóa được xác định chỉ trong Từ điển đối tượng hoặc trả về các mục dựa trên bộ sưu tập dựa trên khóa được chỉ định rõ ràng.
Hướng dẫn VBS: Thuộc tính-Thuộc tính IsRootFolder
Thuộc tính IsRootFolder trả về True nếu thư mục được chỉ định là thư mục gốc; nếu không, nó sẽ trả về Sai. object.IsRootFolder phải là &nphp

lớp học Kiến Langton {
    Riêng tư $ chiều rộng = 640;
    Riêng tư chiều cao $ = 640;
    Riêng tư $cellSize = 2;
    Riêng tư $ốc độ = 100;
    Riêng tư $gridWidth;
    Riêng tư $gridHeight;
    Riêng tư lưới $ = [];
    Riêng tư $antX;
    Riêng tư $antY;
    Riêng tư $dir = 0;
    Riêng tư $dir = [[0, -1], [1, 0], [0, 1], [-1, 0]];
    Riêng tư $hình ảnh;

    công cộng chức năng __cấu trúc() {
        $cái này->gridWidth = $cái này-> chiều rộng / $cái này->size;
        $cái này->gridHeight = $cái này-> chiều cao/ $cái này->size;
        $cái này->antX = $cái này->gridWidth/2;
        $cái này-> kiến ​​trúc = $cái này->gridHeight/2;

        // Khởi tạo nhóm
         ($y = 0; $y < $cái này->gridHeight; $y++) {
            $cái này->lưới[$y] = array_điền(0, $cái này->gridWidth, 1); }

        // Tạo hình ảnh
        $cái này->hình ảnh = imagecreatetruecolor($cái này-> chiều rộng, $cái này->chiều cao); hình ảnh đầy đủ của chữ nhật ($cái này-> Hình ảnh, 0, 0, $cái này-> chiều rộng, $cái này-> chiều cao, 
                            hình ảnh phân tích màu bổ sung($cái này->hình ảnh, 255, 255, 255)); }

    Riêng tư chức năng di chuyển($dir) {
        $dir = ($dir + đếm($cái này->thư mục)) % đếm($cái này->thư mục);
        $cái này->antX = ($cái này->antX+ $cái này->thư mục[$dir][0] + $cái này->gridWidth) % $cái này->lướiChiều rộng;
        $cái này->antY = ($cái này-> kiến ​​trúc + $cái này->thư mục[$dir[1] + $cái này->gridHeight) % $cái này->lướiChiều cao;
        trở lại $dir;

    Riêng tư chức năng bước chân() {
        $px = $cái này->lưới[$cái này->antY][$cái này->kiếnX];
        if if ($px > 0) {
            $cái này->lưới[$cái này->antY][$cái này->antX] = 0;  // chuyển sang màu đen
            $cái này->thư mục = $cái này->di chuyển($cái này->thư mục + 1);   // Rẽ phải
        } khác {
            $cái này->lưới[$cái này->antY][$cái này->antX] = 7;  // chuyển sang màu trắng
            $cái này->thư mục = $cái này->di chuyển($cái này->thư mục - 1);   // Rẽ trái
        } }

    công cộng chức năng run($bước) {
         ($i = 0; $i < $bước; $i++) {
            $cái này->bước chân();

        // vẽ lưới
         ($y = 0; $y < $cái này->gridHeight; $y++) {
             ($x = 0; $x < $cái này->gridWidth; $x++) {
                $color = $cái này->lưới[$y][$x] > 0 ? 
                    hình ảnh phân tích màu bổ sung($cái này->hình ảnh, 255, 255, 255): 
                    hình ảnh phân tích màu bổ sung($cái này->hình ảnh, 0, 0, 0); hình ảnh chữ nhật đầy đủ(
                    $cái này-> Hình ảnh,
                    $x * $cái này-> Kích thước,
                    $y * $cái này-> Kích thước,
                    ($x + 1) * $cái này->cellSize-1,
                    ($y + 1) * $cái này->cellSize-1,
                    $color
                ); } }

        // Đánh dấu vị trí
        $đỏ = imagecolorallocate($cái này->hình ảnh, 255, 0, 0); hình ảnh chữ nhật đầy đủ(
            $cái này-> Hình ảnh,
            $cái này->antX* $cái này-> Kích thước,
            $cái này-> kiến ​​trúc * $cái này-> Kích thước,
            ($cái này->antX + 1) * $cái này->cellSize-1,
            ($cái này->antY + 1) * $cái này->cellSize-1,
            $đỏ
        );

        // hình ảnh đầu ra
        tiêu đề('Loại bỏ nội dung: hình ảnh/png'); hình ảnhpng($cái này->hình ảnh);$cái này->hình ảnh); } }

$kiến = mới LangtonAnt();
$kiến->chạy(10000);  // Chạy 10.000 bước

Nó có thể hiện các mô hình hành động phức tạp thông qua các quy tắc đơn giản, cung cấp các quan điểm và công cụ mới để chúng ta hiểu biết về các phức tạp hiện tại trong tự nhiên và các nhân hệ thống. ứng dụng của Kiến trúc Langton trong nhiều lĩnh vực hơn, nghĩ ra giới hạn như mô hình hóa hệ thống sinh học, quy hoạch giao thông đô thị, vv, cũng như phát triển các mô hình mở rộng mới để nâng cao sức mạnh tính toán và khả năng biểu diễn của nó.

Cuối cùng, bài viết này về Cuộc sống nhân tạo (AL: Artificiallife) Langton Ant Multi-version Code html\go\php\python\java end tại đây Nếu bạn muốn biết thêm về Cuộc sống nhân tạo (AL: Artificiallife) Langton Về nội dung của Ant. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai!

56 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress