uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

ื˜ื™ืคื™ื ืงืฆืจื™ื ืœืžืชื›ื ืชื™ื ืžืืช ื™ื ื•ืŸ ืคืจืง

Ko'proq ko'rsatish
1 419
Obunachilar
+124 soatlar
-17 kunlar
-530 kunlar
Postlar arxiv
ToCode
1 419
ื”ืฉืชืžืฉื• ื‘ืื™ื–ื” ืกืคืจื™ื•ืช ืฉืชืจืฆื• ืจืื™ืชื™ ืืช ื”ืžืฉืคื˜ ื”ื–ื” ื‘ืื™ื–ื” ืžืฉื™ืžืช ื‘ื™ืช ื‘ืจื™ืืงื˜ ืฉืžื™ืฉื”ื• ืคืจืกื, ืžืฉื”ื• ื›ืžื• "ื›ืชื‘ื• ืงื•ืžืคื•ื ื ื˜ื” ืฉืžืฆื™ื’ื” ืจืฉื™ืžื” ืฉืœ ื ืชื•ื ื™ื ืžื—ื•ืœืงื™ื ืœืขืžื•ื“ื™ื ื•ื›ืคืชื•ืจื™ื ืœื“ืคื“ืฃ ืงื“ื™ืžื” ื•ืื—ื•ืจื”. ื”ืฉืชืžืฉื• ื‘ืื™ื–ื” ืกืคืจื™ื•ืช ืฉืชืจืฆื•". ื”ื‘ืขื™ื” ืขื "ืื™ื–ื” ืกืคืจื™ื•ืช ืฉืชืจืฆื•" ื”ื™ื ืฉื–ื• ื”ืกื—ืช ื“ืขืช. ื™ืฉ ืื ืฉื™ื ืฉืžื›ื™ืจื™ื ืกืคืจื™ื” ืื• ืฉืชื™ื™ื ืฉื‘ื“ื™ื•ืง ืคื•ืชืจื•ืช ืืช ื”ื‘ืขื™ื” ื•ื™ืกื™ื™ืžื• ืžื”ืจ ืืช ื”ืžืฉื™ืžื”; ื™ืฉ ืื—ืจื™ื ืฉืžื›ื™ืจื™ื ืกืคืจื™ื•ืช ืฉืœื ื”ื›ื™ ืžืชืื™ืžื•ืช ืื‘ืœ ื™ืขืฉื• ืžืืžืฅ ืœื”ืชืื™ื ืื•ืชืŸ ืœืžืฉื™ืžื” ื•ื™ื™ื›ืฉืœื• ืื• ื™ืกืชื‘ื›ื•; ืื—ืจื™ื ื™ื—ืคืฉื• ื‘ื’ื•ื’ืœ ืกืคืจื™ื•ืช ื•ื™ื‘ื–ื‘ื–ื• ืืช ื›ืœ ื–ืžืŸ ื”ืžืฉื™ืžื” ืขืœ ื—ื™ืคื•ืฉ ื”ืกืคืจื™ื” ื”ื˜ื•ื‘ื” ื‘ื™ื•ืชืจ ื•ืขื•ื“ ืื ืฉื™ื ื™ืคืกืคืกื• ืœื’ืžืจื™ ืืช ื”ืจืขื™ื•ืŸ ืฉืœ ืกืคืจื™ื•ืช ื•ื™ื›ืชื‘ื• ื”ื›ืœ ื‘ืจื™ืืงื˜ ื‘ืœื™ ืกืคืจื™ื•ืช ื”ืจื—ื‘ื”, ืžื” ืฉื™ื’ืจื•ื ืœืงื•ื“ ืฉืœื”ื ืœื”ื™ืจืื•ืช ื™ื•ืชืจ ืืจื•ืš ืื• ืฉื”ืžืฉื™ืžื” ืชื™ืงื— ืœื”ื ื™ื•ืชืจ ื–ืžืŸ. ืฉืชื™ ืืคืฉืจื•ื™ื•ืช ื™ื•ืชืจ ื˜ื•ื‘ื•ืช ืœื“ืขืชื™ ืœืžืฉื™ืžื•ืช ื‘ื™ืช: 1. ืื™ืŸ ืœื”ืฉืชืžืฉ ื‘ืกืคืจื™ื•ืช ื”ืจื—ื‘ื” - ืชื›ืชื‘ื• ืืช ืงื•ื“ ื”ืชืงืฉื•ืจืช ืœื‘ื“ ื‘ืจื™ืืงื˜ ื•ืืช ื”ืขื™ืฆื•ื‘ ื‘ CSS ืื• style. ื‘ืจื•ืจ ืฉื™ื™ืงื— ื™ื•ืชืจ ื–ืžืŸ ื•ืœื ื‘ื˜ื•ื— ืฉื ืจืื” ืืช ื”ืžื•ืฆืจ ื”ื›ื™ ืžืขื•ืฆื‘, ืื‘ืœ ืื•ืœื™ ื ืจื•ื•ื™ื— ืฉื™ื—ื” ืžืขื ื™ื™ื ืช ืขืœ ื”ืงื•ื“. 2. ื”ืฉืชืžืฉื• ืจืง ื‘ืกืคืจื™ื•ืช X, Y ื• Z - ืคื” ื™ืฉ ืกื•ื’ ืฉืœ ื™ื™ืชืจื•ืŸ ืœืื ืฉื™ื ืฉื›ื‘ืจ ืžื›ื™ืจื™ื ืžืจืืฉ ืืช ื”ืกืคืจื™ื•ืช ืฉื‘ื—ืจื ื• ืœืžืฉื™ืžื”, ืื‘ืœ ืจื•ื‘ ื”ื–ืžืŸ ื‘ืคืจื•ื ื˜ ืื ื“ ืงืœ ืœืื ืฉื™ื ืœื”ืฉืชืžืฉ ื‘ืกืคืจื™ื•ืช ืจืœื•ื•ื ื˜ื™ื•ืช ื’ื ืื ืœื ืขื‘ื“ื• ืื™ืชืŸ ื‘ืขื‘ืจ. ื›ืœื•ืžืจ ืžื™ ืฉืขื‘ื“ ืขื react-query ื™ืฆืœื™ื— ืœื”ืกืชื“ืจ ืžื”ืจ ืขื swr. ืžื™ ืฉืขื‘ื“ ืขื emotion ื™ืฆืœื™ื— ืœื”ืกืชื“ืจ ืขื styled components ื•ื›ื•. ื‘ืจื•ืจ ืืœ ืชื‘ื—ืจื• ืคื” ืจื™ื“ืืงืก ืื• ืกืคืจื™ื•ืช ืฉืงืฉื” ืœืœืžื•ื“, ืืœื ืื ื›ืŸ ืืชื ืกืคืฆื™ืคื™ืช ืžื—ืคืฉื™ื ืœื’ื™ื™ืก ืื ืฉื™ื ืฉืžื›ื™ืจื™ื ืกืคืจื™ื•ืช ืืœื”. ื™ื•ืชืจ ืžื“ื™ ื’ืžื™ืฉื•ืช ื™ื›ื•ืœื” ืœืขื‘ื•ื“ ืœืจืขืชื›ื, ื’ื ื‘ืžืฉื™ืžื•ืช ื‘ื™ืช.

ToCode
1 419
ื”ื™ื•ื ืœืžื“ืชื™: ืžืขืจื›ืช ื”ืงื‘ืฆื™ื ื”ืกื•ื“ื™ืช ืฉืœ ื”ื“ืคื“ืคื ื™ื ื ืžืืก ืœื›ื ืžื”ืžื’ื‘ืœื” ืฉืœ 5 ืžื’ื” ืฉืœ local storage? ืจื•ืฆื™ื ืœื›ืชื•ื‘ ื•ืœืงืจื•ื ืžื”ืจ ืœืงื‘ืฆื™ื ืฉื™ื™ืฉืžืจื• ืื‘ืœ ืืชื ืชืงื•ืขื™ื ื‘ืชื•ืš ื“ืคื“ืคืŸ? ืžืกืชื‘ืจ ืฉื™ืฉ ืคื™ืชืจื•ืŸ ื™ื—ืกื™ืช ื—ื“ืฉ ื•ืœื ืžืกื•ื‘ืš ืฉื ืงืจื Origin private file system ืื• ื‘ืงื™ืฆื•ืจ OPFS. ืžื ื’ื ื•ืŸ ื–ื” ืžืกืคืง ืœื ื• ืžืฉื”ื• ืฉืขื•ื‘ื“ ื‘ื“ื™ื•ืง ื›ืžื• ืžืขืจื›ืช ืงื‘ืฆื™ื ืื‘ืœ ืกื’ื•ืจ ื‘ืชื•ืš ื”ื“ืคื“ืคืŸ. ื›ืจื•ื ืืฆืœื™ ืขืœ ื”ืžื—ืฉื‘ ื ืชืŸ ืœื™ Quota ืฉืœ 500 ื’'ื™ื’ื” ืืคื™ืœื• ื‘ืœื™ ืœื‘ืงืฉ ืจืฉื•ืช. ื“ื•ื’ืžื” 1 - ื›ืชื™ื‘ืช ืงื•ื‘ืฅ ื”ืžืžืฉืง ื–ืžื™ืŸ ื“ืจืš ื”ืื•ื‘ื™ืงื˜ navigator.storage, ื•ื‘ืฉื‘ื™ืœ ืœืจืื•ืช ืื™ืš ื–ื” ืขื•ื‘ื“ ื”ืœื›ืชื™ ืœ ChatGPT ื•ื‘ื™ืงืฉืชื™ ืฉืชื™ ื“ื•ื’ืžืื•ืช. ื“ื•ื’ืžื” ืจืืฉื•ื ื” ื›ื•ืชื‘ืช ืงื•ื‘ืฅ ืœื“ื™ืกืง:
async function create1MBFileInOPFS() {
    // Request a handle to the OPFS root directory
    const rootDir = await navigator.storage.getDirectory();
    
    // Create a new file in OPFS
    const fileHandle = await rootDir.getFileHandle('1MB_text_file.txt', { create: true });
    
    // Create a writable stream
    const writableStream = await fileHandle.createWritable();
    
    // Generate 1MB of text data (1 character = 1 byte for plain text)
    const sizeInBytes = 1024 * 1024; // 1MB
    const largeText = 'A'.repeat(sizeInBytes); // A string with 1MB of 'A' characters
    
    // Write the text data to the file
    await writableStream.write(largeText);
    
    // Close the writable stream to save the file
    await writableStream.close();
    
    console.log('1 MB text file created in OPFS');
}
ื ืงืจื ืืช ื–ื” ื™ื—ื“ - 1. ื”ืคืงื•ื“ื” getDirectory ื ื•ืชื ืช ืœื™ ื ืงื•ื“ืช ื›ื ื™ืกื” ืœ storage. 2. ื”ืคืงื•ื“ื” getFileHandle ืžื—ื‘ืจืช ืื•ืชื™ ืœืงื•ื‘ืฅ, ื•ื”ืื•ืคืฆื™ื” create ืื•ืžืจืช ืื ืœื™ืฆื•ืจ ืืช ื”ืงื•ื‘ืฅ ื‘ืžื™ื“ื” ื•ืœื ืงื™ื™ื. 3. ื”ืคืงื•ื“ื” createWritable ืžื—ื–ื™ืจื” ื–ืจื ืœื›ืชื™ื‘ื” ืœืงื•ื‘ืฅ. 4. ื”ืคืงื•ื“ื” write ืฉืœ ื–ืจื ื”ื›ืชื™ื‘ื” ืžืงื‘ืœืช ืžื—ืจื•ื–ืช ื•ื›ื•ืชื‘ืช ืื•ืชื” ืœืงื•ื‘ืฅ. 5. ื‘ืกื•ืฃ ืžืคืขื™ืœื™ื close ื›ื“ื™ ืœืกื™ื™ื ืืช ื”ืขื‘ื•ื“ื” ืขื ื”ืงื•ื‘ืฅ. ื›ืœ ื”ืคื•ื ืงืฆื™ื•ืช ื”ืŸ ืืกื™ื ื›ืจื•ื ื™ื•ืช ื•ืขื•ื‘ื“ื•ืช ื’ื ืž Web Worker. ื“ื•ื’ืžื” 2 - ื”ืฆื’ืช ืจืฉื™ืžืช ืงื‘ืฆื™ื ื”ื“ื•ื’ืžื” ื”ืฉื ื™ื” ืžืฆื™ื’ื” ืืช ืจืฉื™ืžืช ื”ืงื‘ืฆื™ื:
async function listFilesInOPFS() {
    // Request a handle to the OPFS root directory
    const rootDir = await navigator.storage.getDirectory();

    // Iterate over the entries in the root directory
    for await (const [name, handle] of rootDir) {
        if (handle.kind === 'file') {
            console.log(\File: ${name}\);
        } else if (handle.kind === 'directory') {
            console.log(\Directory: ${name}\);
        }
    }
}

// Call the function to list files in the root directory
listFilesInOPFS();
ืฉื•ื‘ ืžืฉืชืžืฉื™ื ื‘ getDirectory ื›ื“ื™ ืœื”ื™ื›ื ืก ืœืชื™ืงื™ื™ื” ื•ืื– ืืคืฉืจ ืœืจื•ืฅ ื‘ืœื•ืœืื” ืขืœ ืื•ืชื” ื”ืชื™ืงื™ื” ื›ื“ื™ ืœืงื‘ืœ ืืช ื”ืงื‘ืฆื™ื ื•ื”ืชื™ืงื™ื•ืช ืฉื‘ืชื•ื›ื”. ื›ืœ ื“ื‘ืจ ืฉื”ื•ื ืžืกื•ื’ directory ืžืืคืฉืจ ืื™ื˜ืจืฆื™ื” ืขื for ื›ืš ืฉืืคืฉืจ ื”ื™ื” ืœื”ืžืฉื™ืš ืจืงื•ืจืกื™ื‘ื™ืช ื•ืœื”ื“ืคื™ืก ืืช ื›ืœ ื”ืงื‘ืฆื™ื ื•ื”ืชื™ืงื™ื•ืช ืขืœ ื”ื“ื™ืกืง ื”ื•ื™ืจื˜ื•ืืœื™. ื ืฉื™ื ืœื‘- 1. ื”ื“ื™ืกืง ื”ื•ื™ืจื˜ื•ืืœื™ ืžื”ื™ืจ ื•ืžืกืคืจ ื”ืžื•ืŸ ืžืงื•ื ืขื‘ื•ื“ื”. ื–ื” ื˜ื•ื‘ ืื ืืชื ื‘ื•ื ื™ื ืžืขืจื›ืช ื•ื•ื‘ ื•ืฆืจื™ื›ื™ื ืœืฉืžื•ืจ ื”ืจื‘ื” ืžื™ื“ืข ืฉื™ื”ื™ื” ื–ืžื™ืŸ ืื•ืคืœื™ื™ืŸ. 2. ื”ื“ื™ืกืง ื”ื•ื™ืจื˜ื•ืืœื™ ืกืคืฆื™ืคื™ ืœื“ื•ืžื™ื™ืŸ, ื‘ื“ื™ื•ืง ื›ืžื• ืขื•ื’ื™ื•ืช ื• local storage. 3. ืื—ืจื™ื•ืช ืฉืœื›ื ืœื ืงื•ืช ืืช ื”ืงื‘ืฆื™ื ืขื ืคืงื•ื“ืช removeEntry ื›ืฉืืชื ื›ื‘ืจ ืœื ืฆืจื™ื›ื™ื ืื•ืชื. 4. ืืคืฉืจ ืœืจืื•ืช ืืช ื”ื’ื•ื“ืœ ืฉืชื•ืคืกื™ื ื›ืœ ื”ืงื‘ืฆื™ื ื‘ืžืกืš ื›ืœื™ ื”ืคื™ืชื•ื— ื‘ื˜ืื‘ application. ืœื ืžืฆืืชื™ ื‘ืžืกืš ื›ืœื™ ื”ืคื™ืชื•ื— ื“ืจืš ืœืฉื•ื˜ื˜ ื‘ืชื™ืงื™ื•ืช ื”ื•ื™ืจื˜ื•ืืœื™ื•ืช ืื• ื‘ืชื•ื›ืŸ ื”ืงื‘ืฆื™ื ืขืฆืžื. ื›ืŸ ืืคืฉืจ ืœืขืฉื•ืช ืืช ื–ื” ืžืชื•ืš ืงื•ื“ JavaScript ื›ืœ ืขื•ื“ ืืชื ื‘ื“ื•ืžื™ื™ืŸ ืฉื™ืฆืจ ืืช ื”ืงื‘ืฆื™ื.

ToCode
1 419
ื” vimrc ืฉืœื™ ืœืคื™ืชื•ื— ืจื™ื™ืœืก ื”ืจื•ืžืŸ ืฉืœื™ ืขื vim ื”ื•ื ืžื—ื–ื•ืจื™ - ืคืขื ื‘ื›ืžื” ื–ืžืŸ ืื ื™ ืžืจื•ืงืŸ ื›ืžืขื˜ ืœื’ืžืจื™ ืืช ื”ื”ื’ื“ืจื•ืช, ืœืื˜ ืœืื˜ ืื ื™ ืžื•ืกื™ืฃ ืคืœืื’ื™ื ื™ื ื•ื”ื’ื“ืจื•ืช ืขื“ ืฉื”ื•ื ืžืชื ืคื— ื›ืœ ื›ืš ืฉืื ื™ ืœื ืžืฆืœื™ื— ืœื”ืฉืชืžืฉ ื‘ื• ื•ืื– ืื ื™ ืžืจื•ืงืŸ ืฉื•ื‘ ื›ื“ื™ ืœื—ื–ื•ืจ ืœื‘ื™ื™ืกื™ืงืก. ื”ืฉื‘ื•ืข ื—ื–ืจืชื™ ืœื‘ื™ื™ืกื™ืงืก ื•ื–ื” ืงื•ื‘ืฅ ื” vimrc ื”ื›ื™ ืงื˜ืŸ ืฉื‘ื ื™ืชื™ ืฉืขื“ื™ื™ืŸ ืžืกืคื™ืง ืœื™ ื‘ืฉื‘ื™ืœ ืœื›ืชื•ื‘ ืจื™ื™ืœืก:
call plug#begin()

" List your plugins here
Plug 'tpope/vim-sensible'
Plug 'tpope/vim-rails'
Plug 'ctrlpvim/ctrlp.vim'
Plug 'preservim/nerdtree'
Plug 'nanotech/jellybeans.vim'

call plug#end()

let mapleader = ","

syntax on
filetype on
set number

colo jellybeans

set hidden
set shiftwidth=2
set expandtab
set tabstop=2
set wildmenu

set incsearch
set hlsearch
set ruler
set smartindent

nnoremap <silent> <C-l> :noh<cr>

let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$|node_modules\/'

nnoremap <Leader>n :NERDTreeToggle<cr>
ื”ืกื‘ืจ ื‘ืงืฆืจื”: 1. ื”ืคืœืื’ื™ืŸ vim-rails ื”ื•ื ืงืกื•ื ื•ื ื•ืชืŸ ื”ืžื•ืŸ ืงื™ืฆื•ืจื™ ืžืงืœื“ืช ืœืขื‘ื•ื“ื” ืขื ืจื™ื™ืœืก. ืœืงื— ืœื™ ืฉื ื™ื ืœื”ื›ื™ืจ ืื•ืชื• ื•ืื ื™ ืœื ืžื•ื•ืชืจ ืขืœื™ื•. 2. ืคืœืื’ื™ืŸ ctrl-p ืžื—ืคืฉ ื‘ืงื‘ืฆื™ื ืžื”ืจ, ื• nerdtree ืคื•ืชื— ืขืฅ ืชื™ืงื™ื•ืช. ื›ืŸ ื™ืฉ ื™ื•ืชืจ ื—ื“ืฉื™ื ืžื”ื ืื‘ืœ ืฉื ื™ื”ื ืขื•ื‘ื“ื™ื ืœื™ ื˜ื•ื‘. ืฉื™ืžื• ืœื‘ ืฉืœืงืจืืช ืกื•ืฃ ื”ืงื•ื‘ืฅ ืื ื™ ืื•ืžืจ ืœ ctrl-p ืžืžื” ืœื”ืชืขืœื ื•ืžืžืคื” ืืช ื”ื”ืคืขืœื” ื”ืžื”ื™ืจื” ืฉืœ Nerdtree. 3. ื’'ืœื™ื‘ื™ื ืก ื–ื• ืขืจื›ืช ืฆื‘ืขื™ื ืžื•ืฆืœื—ืช. 4. ื›ืคืชื•ืจ ื”ืœื™ื“ืจ ื”ื•ื ืคืกื™ืง, ื›ื™ ืื ื™ ืจื’ื™ืœ. 5. ื—ื™ืคื•ืฉ ืื™ื ืงืจืžื ื˜ืœื™ ืขื ืฆื‘ืขื™ื ืžื’ื™ืข ืž incsearch ื• hlsearch ื•ื”ืžื™ืคื•ื™ ืฉืœ Ctrl L ืขื•ื–ืจ ืœื ืงื•ืช ืืช ื”ื”ื“ื’ืฉื” ืฉืœ ื”ื—ื™ืคื•ืฉ. ืื™ืŸ ื”ืฉืœืžื•ืช ืื•ื˜ื•ืžื˜ื™ื•ืช ืื• ืœื™ื ื˜ื™ื ื’ ื‘ื™ื ืชื™ื™ื ืื‘ืœ ื‘ื˜ื— ืื•ืกื™ืฃ ื‘ื”ืžืฉืš. ื”ืชืงื ืช ืคืœืื’ื™ื ื™ื ืžื‘ื•ืฆืขืช ืขื ืคืœืื’ ืื•ืชื• ื”ืชืงื ืชื™ ื‘ื ืคืจื“ ืžื›ืืŸ: https://github.com/junegunn/vim-plug ื™ืฉ ืœื›ื ื˜ื™ืคื™ื ื•ื”ื’ื“ืจื•ืช ื•ื™ื ืฉืืชื ืœื ื™ื›ื•ืœื™ื ืœื—ื™ื•ืช ื‘ืœื™? ืฉืชืคื• ื‘ืชื’ื•ื‘ื•ืช ืื•ืœื™ ืื•ื›ืœ ืœืืžืฅ ื›ืžื” ืจืขื™ื•ื ื•ืช.

ToCode
1 419
ื•ืื ืžื—ืฉื‘ื•ืŸ ื”ื™ื” ื˜ื•ืขื”? ื™ืฉื‘ืชื™ ืœื›ืชื•ื‘ ืงื˜ืข ืงื•ื“ ื”ื™ื•ื ื•ืจืื™ืชื™ ืฉืื ื™ ืžืกืชื‘ืš ืื– ืงืจืืชื™ ืœื—ื‘ืจ ื˜ืœืคื•ื ื™, ื›ืœื•ืžืจ ืœ Chat GPT. ืžื”ืฆื“ ืฉืœื™ ื–ื” ื ืจืื” ื›ื›ื”- 1. ื”ื™ AI ืื ื™ ืฆืจื™ืš ืงื•ื“ ืฉืขื•ืฉื” X 2. ืชื•ื“ื”! ืื‘ืœ ื”ืงื•ื“ ืฉื”ื“ืคืกืช ืœื ื ืจืื” ื™ืขื™ืœ ื‘ืžื™ื•ื—ื“. ื™ื›ื•ืœ ืœื”ืฆื™ืข 5 ืจืขื™ื•ื ื•ืช ืื—ืจื™ื? 3. ืžืกืคืจ ืฉืœื•ืฉ ื ืจืื” ื˜ื•ื‘ ื–ื” ื‘ื’ื“ื•ืœ ื”ื›ื™ื•ื•ืŸ ืฉืจืฆื™ืชื™ ืœืงื—ืช. ื‘ื‘ืงืฉื” ืชืชืงื“ื ืื™ืชื•. 4. ืฉืžืข ื–ื” ื›ืžืขื˜ ืขื‘ื“ ืื‘ืœ ื”ืจืื” ืชื•ืฆืื” ืœื ื ื›ื•ื ื”. ื”ื ื” ื” Data ืขืœื™ื• ื”ืจืฆืชื™. ืจื•ืื” ืืช ื”ื‘ืขื™ื”? 5. ืชื•ื“ื”! ื–ื” ืขื•ื‘ื“ ืžืขื•ืœื”. ืžืฆื“ ืื—ื“ ื™ืฆืืชื™ ืขื ืงื•ื“ ืฉื ืจืื” ืขื•ื‘ื“. ืžืฆื“ ืฉื ื™ ื•ืื•ืœื™ ื”ื™ื•ืชืจ ื—ืฉื•ื‘, ื”ืคืกื“ืชื™ ืืช ื”ื”ื–ื“ืžื ื•ืช ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื” ื‘ืขืฆืžื™, ืœื”ื™ืชืงืข ื•ืœืœืžื•ื“. ืื‘ืœ ืจื’ืข, ืžื” ื‘ืขืฆื ื”ื”ื‘ื“ืœ ื‘ื™ืŸ ื–ื” ืœื‘ื™ืŸ ืžื—ืฉื‘ื•ืŸ? ืืชื” ืœื ืžืฆื™ืข ื›ืืŸ ืœื‘ืฆืข ื—ื™ืฉื•ื‘ื™ื ืžืกื•ื‘ื›ื™ื ืขืœ ื“ืฃ ืจืง ื‘ืฉื‘ื™ืœ ื”"ื—ื•ื•ื™ื”" ืื• ื”"ืžื™ื•ืžื ื•ืช" ืฉืœ ืคื™ืชืจื•ืŸ ืชืจื’ื™ืœื™ ื—ื™ืœื•ืง ืืจื•ืš? ื•ื‘ืืžืช ื”ืคื•ืกื˜ ื”ื–ื” ื”ื•ื ื™ื•ืชืจ ืฉืืœื” ืžืชืฉื•ื‘ื”. ื” AI ื‘ื›ืœ ืžืงื•ื, ืื ื™ ื™ื›ื•ืœ ืœื”ืจื™ืฅ ืื•ืชื• ืžืงื•ืžื™ืช ื•ืœื’ืžืจื™ ื‘ื—ื™ื ื, ื•ื”ื•ื ื—ื•ืกืš ื”ืžื•ืŸ ื”ืžื•ืŸ ื–ืžืŸ. ืžืฆื“ ืฉื ื™ ื•ื‘ื ื™ื’ื•ื“ ืœืžื—ืฉื‘ื•ืŸ ื”ืชื•ืฆืื” ืฉืžืงื‘ืœื™ื ืž AI ืœื ืชืžื™ื“ ื ื›ื•ื ื”, ื•ืืคื™ืœื• ื›ืฉื”ื™ื ืขื•ื‘ื“ืช ืœื ื‘ืจื•ืจ ืขื“ ื›ืžื” ื”ื™ื ื˜ื•ื‘ื”. ื‘ื›ืชื™ื‘ืช ืงื•ื“ ืื ื—ื ื• ืขื“ื™ื™ืŸ ื”ืจื‘ื” ื™ื•ืชืจ ืžื•ื“ืขื™ื ืœื›ืœ ืกื™ืžืŸ ืžืืฉืจ ื‘ืงืจื™ืื” ื•ื”ืขืชืงื”. ืื•ืœื™ ื”ืคื™ืชืจื•ืŸ ื”ื›ื™ ื˜ื•ื‘ ื›ืจื’ืข ื”ื•ื ืœื“ื‘ืจ ืขื ื” AI ื•ืื– ืœืœื›ืช ืœื›ืชื•ื‘ ืืช ื”ืงื•ื“ ืžืืคืก ื‘ IDE. ื•ืื•ืœื™ ืžื” ืฉืฆืจื™ืš ื–ื” ืœื”ืชืจื’ืœ ืœื“ื‘ื’ ื”ืจื‘ื” ื™ื•ืชืจ, ื›ื™ ืœืื•ืจืš ื–ืžืŸ ืื•ืชื ืงื•ื“ื™ื ืฉืจื•ื‘ ื”ื–ืžืŸ ืขื•ื‘ื“ื™ื ื”ื•ืœื›ื™ื ืœื”ืจื›ื™ื‘ ืืช ืจื•ื‘ ื”ืžืขืจื›ื•ืช ืฉืœื ื• ื‘ืขืชื™ื“.

ToCode
1 419
ื—ื“ืฉ ื‘ืืชืจ ืงื•ืจืก ืžื‘ื•ื ืœ Git ืืช ืงื•ืจืก Git Hero ืฉื‘ืืชืจ ื”ืงืœื˜ืชื™ ืื—ืจื™ ื”ืจื‘ื” ื”ื“ืจื›ื•ืช ื’ื™ื˜ ืืฆืœ ืœืงื•ื—ื•ืช. ื‘ื›ืœ ื”ื”ื“ืจื›ื•ืช ื•ื”ื™ื™ืขื•ืฆื™ื ืžืฆืืชื™ ืื ืฉื™ื ืฉื”ืชื—ื™ืœื• ืœืขื‘ื•ื“ ืขื ื’ื™ื˜ ื‘ืœื™ ืœืœืžื•ื“ ืื•ืชื• ื‘ืฆื•ืจื” ืžืกื•ื“ืจืช. ื”ื ื”ืฆืœื™ื—ื• ืœื”ืกืชื“ืจ ืจื•ื‘ ื”ื–ืžืŸ ืื‘ืœ ื›ืฉื“ื‘ืจื™ื ื”ืกืชื‘ื›ื• ื”ื ืขืฉื• ื˜ืขื•ื™ื•ืช, ื‘ื’ืœืœ ืฉืœื ื”ื‘ื™ื ื• ืื™ืš ื’ื™ื˜ ื‘ืืžืช ืขื•ื‘ื“ ื•ืžื” ื” Best Practices ืฉื›ื“ืื™ ืœืืžืฅ. ื‘ืื•ืชื• ืงื•ืจืก ืื ื™ ืžืจืื” ืœืคืจื˜ื™ ืคืจื˜ื™ื ืื™ืš ื’ื™ื˜ ืขื•ื‘ื“, ื›ื•ืœืœ ืื™ืš ื ืฉืžืจ ื”ืžื™ื“ืข ื‘ืชื™ืงื™ื™ื” .git ืฉืœื• - ืžื” ืฉื ื•ืชืŸ ืœืชืœืžื™ื“ื™ื ื”ื‘ื ื” ืžืขืžื™ืงื” ื•ื‘ื™ื˜ื—ื•ืŸ ื‘ืขื‘ื•ื“ื” ืขื ื’ื™ื˜ ืขืœ ืคืจื•ื™ืงื˜ื™ื ื’ื“ื•ืœื™ื. ืžืื– ืฉื”ืขืœื™ืชื™ ืื•ืชื• ื’ื™ืœื™ืชื™ ืฉื™ืฉ ืœื ืžืขื˜ ืื ืฉื™ื ืฉืจืง ืžืชื—ื™ืœื™ื ืœืขื‘ื•ื“ ืขื ื’ื™ื˜ ื•ื’ื ื”ื™ื• ืฉืžื—ื™ื ืœืงื‘ืœ ื”ื“ืจื›ื” ืงืฆืจื” ืขืœ ืžื” ื–ื” ื‘ื›ืœืœ ื’ื™ื˜, ืœืžื” ืฆืจื™ืš ืื•ืชื• ื•ืื™ืš ืขื•ืฉื™ื ื“ื‘ืจื™ื ืคืฉื•ื˜ื™ื. ื“ื•ื•ืงื ื‘ื’ืœืœ ื›ืžื•ืช ื”ืžื™ื“ืข ื•ืื™ื ืกื•ืฃ ื”ืžื“ืจื™ื›ื™ื ืฉื™ืฉ ื‘ืื™ื ื˜ืจื ื˜ ืขืœ ื’ื™ื˜, ืื ืฉื™ื ื”ืœื›ื• ืœืื™ื‘ื•ื“ ื•ื”ื™ื• ืจื•ืฆื™ื ืžื“ืจื™ืš ืื—ื“, ืžืžื•ืงื“ ืฉื™ืืคืฉืจ ืœื”ืชื—ื™ืœ ืœื”ืฉืชืžืฉ ื‘ Git ืขืœ ืคืจื•ื™ืงื˜ ืื• ืœืฉืชืฃ ืคืจื•ื™ืงื˜ ื‘ืจืฉืช ื“ืจืš GitHub. ื”ื™ื•ื ืื ื™ ืฉืžื— ืœื”ืฉื™ืง ื‘ื“ื™ื•ืง ืืช ื–ื” - ืงื•ืจืก ื’ื™ื˜ ืžืงื•ืฆืจ ื•ืžื“ื•ื™ืง, ืœืื ืฉื™ื ืฉืืฃ ืคืขื ืœื ืจืื• ื’ื™ื˜ ื•ืจื•ืฆื™ื ืœื”ืฉืชืชืฃ ื‘ืคืจื•ื™ืงื˜ ืขื ื’ื™ื˜ ืื• ืœื”ืชื—ื™ืœ ืคืจื•ื™ืงื˜ ืจืืฉื•ืŸ ืฉืœื”ื. ื”ืงื•ืจืก ืœื ื“ื•ืจืฉ ื™ื“ืข ืงื•ื“ื, ืื ื—ื ื• ืขื•ื‘ื“ื™ื ืฉื ืขื ืืคืœื™ืงืฆื™ื™ืช Github Desktop ื›ืš ืฉืืคื™ืœื• ืœื ืฆืจื™ืš ืœื”ื›ื™ืจ ืืช ื›ืœื™ ืฉื•ืจืช ื”ืคืงื•ื“ื”, ื•ื‘ืคื—ื•ืช ืžืฉืขืชื™ื™ื ืฉืœ ืœื™ืžื•ื“ ื™ื™ืชืŸ ืœื›ื ืืช ื›ืœ ื”ื›ืœื™ื ื”ื‘ืกื™ืกื™ื™ื ื›ื“ื™ ืœื”ืชื—ื™ืœ ืœืขื‘ื•ื“ ืขื ื’ื™ื˜ ื‘ืœื™ ืœื˜ืขื•ืช ื•ื‘ืœื™ ืœื”ื™ื‘ื”ืœ. ืงื•ืจืก ืžื‘ื•ื ืœ Git ืœื ืžื—ืœื™ืฃ ืืช ืงื•ืจืก Git Hero ืฉื‘ืืชืจ ืืœื ืžืฉืœื™ื ืื•ืชื• ื‘ืชื•ืจ ืฆืขื“ ืจืืฉื•ืŸ. ืื ื—ื™ืคืฉืชื ื“ืจืš ืžื”ื™ืจื” ื•ืงืœื” ืœื”ืชื—ื™ืœ ืœืขื‘ื•ื“ ืขื Git ืื ื™ ืžื–ืžื™ืŸ ืืชื›ื ื•ืืชื›ืŸ ืœื”ืขื™ืฃ ืžื‘ื˜: https://www.tocode.co.il/bundles/pregit ื‘ื ื™ื’ื•ื“ ืœืฉืืจ ื”ืงื•ืจืกื™ื ื‘ืืชืจ ื”ืงื•ืจืก ื”ื–ื” ื—ื™ื ืžื™ ืœื’ืžืจื™ ื’ื ืœืœื ืžื ื•ื™. ืชืจื’ื™ืฉื• ื—ื•ืคืฉื™ ืœื”ื™ื›ื ืก ื•ืœืœืžื•ื“ ืื• ืœื”ืขื‘ื™ืจ ืื•ืชื• ืœื—ื‘ืจื™ื ื•ื—ื‘ืจื•ืช ืฉืฆืจื™ื›ื™ื ื”ืชื—ืœื” ืžื–ื•ืจื–ืช ื‘ Git.

ToCode
1 419
ืžืฉื—ืงื™ื ืงืฆืจื™ื ื•ืืจื•ื›ื™ื ืœืžืฉื—ืงื™ื ืงืฆืจื™ื ื™ืฉ ืกื•ืฃ ื•ื›ื“ืื™ ืœื ืฆื— ื‘ื”ื. ืžืฉื—ืงื™ื ืืจื•ื›ื™ื ืคืฉื•ื˜ ืžืžืฉื™ื›ื™ื ื•ืงื•ื‘ืขื™ื ืื™ืš ื ื’ื™ืข ืœืžืฉื—ืง ื”ืงืฆืจ ื”ื‘ื. ืื– ืจืื™ื•ืŸ ืขื‘ื•ื“ื” ืื• ืืคื™ืœื• ื—ื™ืคื•ืฉ ืขื‘ื•ื“ื” ื–ื” ืกื•ื’ ืฉืœ ืžืฉื—ืง ืงืฆืจ, ืฉื ื’ืžืจ ื›ืฉืžื•ืฆืื™ื ืขื‘ื•ื“ื”. ืœืžื™ื“ื” ื”ื™ื ืกื•ื’ ืฉืœ ืžืฉื—ืง ืืจื•ืš ืฉืงื•ื‘ืข ืื™ืš ื ื’ื™ืข ืœืจืื™ื•ืŸ ื”ืขื‘ื•ื“ื” ื”ื‘ื. ื”ืขืœืืช ื’ื™ืจืกื” ื”ื™ื ืžืฉื—ืง ืงืฆืจ ืฉื™ื™ื’ืžืจ ื›ืฉื”ื’ื™ืจืกื” ื”ื—ื“ืฉื” ืชื”ื™ื” ื‘ืื•ื•ื™ืจ. ืชื”ืœื™ืš ืคื™ืชื•ื— ื ื›ื•ืŸ ื”ื•ื ื”ืžืฉื—ืง ื”ืืจื•ืš ื•ื”ื•ื ื™ืงื‘ืข ื›ืžื” ืžื‘ื•ื”ืœื™ื ื ื”ื™ื” ื‘ื”ืขืœืืช ื”ื’ื™ืจืกื” ื”ื‘ืื”. ื‘ืขื‘ื•ื“ื” ืขืœ ื‘ืขื™ื•ืช ืžืขื ื™ื™ื ื•ืช ื”ื—ื•ื›ืžื” ื”ื™ื ืœืฉื™ื ืœื‘ ืœืžืฉื—ืงื™ื ื”ืงืฆืจื™ื ื•ื”ืืจื•ื›ื™ื ืฉืžืขื•ืจื‘ื™ื ื•ืœื ื”ืœ ืืช ื”ืžืฉืื‘ื™ื ืฉืœื ื• ื›ื“ื™ ืฉื ื•ื›ืœ ืœื”ืฆืœื™ื— ื‘ืฉื ื™ ื”ืกื•ื’ื™ื.

ToCode
1 419
ื ื™ืกื•ื™ ืจื™ื™ืœืก: ืžืฉื—ืง ืื™ืงืก ืขื™ื’ื•ืœ ื—ืœืง 2 ื‘ื—ืœืง ื”ืงื•ื“ื ืฉืœ ื”ื ื™ืกื•ื™ ื‘ื ื™ื ื• ืžืฉื—ืง ืื™ืงืก ืขื™ื’ื•ืœ ื‘ืœื™ ืœื›ืชื•ื‘ JavaScript ืฉืขื“ื™ื™ืŸ ืขื‘ื“ ื“ื™ ืžื”ืจ. ื‘ื—ืœืง ื”ื–ื” ื ืจืื” ืื™ืš ืœื”ื•ืกื™ืฃ ืชืžื™ื›ื” ื‘ Web Sockets ื›ื“ื™ ืฉืืคืฉืจ ื™ื”ื™ื” ืœืฉื—ืง ืžื›ืžื” ื“ืคื“ืคื ื™ื. ืื™ืš ื–ื” ืขื•ื‘ื“ ื”ื˜ืจื™ืง ืฉืœ ืจื™ื™ืœืก ื›ื“ื™ ืœื•ื•ืชืจ ืขืœ JavaScript ื ืงืจื Turbo, ื•ื‘ื—ืœืง ื”ืงื•ื“ื ืจืื™ื ื• ืื™ืš ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™ ืจื™ื™ืœืก ืžื•ืกื™ืฃ ืงื•ื“ ืœื˜ืคืกื™ื ื›ื“ื™ ืฉื”ื ื™ื•ื’ืฉื• ื‘ Ajax. ื‘ืฆื“ ืฉืจืช ืจืื™ื ื• ืืช ื”ืฉื•ืจื”:
format.turbo_stream { render turbo_stream: turbo_stream.replace(@game) }
ืฉื’ื•ืจืžืช ืœืฉืจืช ืœื”ื—ื–ื™ืจ ืืช ื” HTML ืฉืœ ื”ืžืฉื—ืง, ื•ืฉื•ื‘ ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™ ืงื•ื“ ื” Ajax ื‘ื“ืคื“ืคืŸ ืœื•ืงื— ืืช ื”ื˜ืงืกื˜ ืฉื”ื•ื—ื–ืจ ื•ืžื—ืœื™ืฃ ื‘ื–ื” ืืช ืชื•ื›ืŸ ื” div ืฉืœ ื”ืžืฉื—ืง. ื‘ืฉื‘ื™ืœ ืœื”ื•ืกื™ืฃ ืชืžื™ื›ื” ื‘ Web Sockets ื ืฉืชืžืฉ ืขื“ื™ื™ืŸ ื‘ื˜ื•ืจื‘ื• ืื‘ืœ ื‘ืฆื•ืจื” ืงืฆืช ืื—ืจืช: 1. ื ืคืชื— ืขืจื•ืฅ ืชืงืฉื•ืจืช Web Socket ืžื”ื“ืคื“ืคืŸ ืœืฉืจืช. 2. ื‘ืฉืจืช ื›ืœ ืคืขื ืฉื™ืฉ ืฉื™ื ื•ื™ ื‘ืžืฉื—ืง ื ืฉืœื— ื”ื•ื“ืขื” ืœืขืจื•ืฅ. 3. ื‘ื“ืคื“ืคืŸ ื ืงืฉื™ื‘ ืœื”ื•ื“ืขื•ืช ื‘ืขืจื•ืฅ ื•ื ืชื™ื™ื—ืก ืืœื™ื”ืŸ ื›ืžื• ืœืชืฉื•ื‘ื•ืช ืฉืœ ื˜ื•ืคืก, ื›ืœื•ืžืจ ื ื—ืœื™ืฃ ืืช ืชื•ื›ืŸ ื” div ืฉืœ ื”ืžืฉื—ืง ื‘ืžื™ื“ืข ืฉื”ื’ื™ืข ื‘ืขืจื•ืฅ. ืงื•ื“ ื‘ืชื•ืจ ื”ืชื—ืœื” ืื ื™ ืžืขื“ื›ืŸ ืืช ื”ืงื•ื“ ื‘ games_controller.rb ืœืงื•ื“ ื”ื–ื”:
  def play
    GameMove.create!(game_move_params)
    @game.broadcast_replace_to(
      "game_#{@game.id}",
      partial: "games/game",
      locals: { game: @game }
    )

    respond_to do |format|
      format.turbo_stream { render turbo_stream: turbo_stream.replace(@game) }
      format.html         { redirect_to show_game_url(@game.id) }
    end
  end
ื”ืฉื•ืจื” ื”ื—ื“ืฉื” ื”ื™ื ื”ืฉื•ืจื” ื”ืฉื ื™ื” ื‘ืคื•ื ืงืฆื™ื”. ื”ื™ื ืฉื•ืœื—ืช ื”ื•ื“ืขืช "ื”ื—ืœืคื”" ืœืขืจื•ืฅ ืฉืฉืžื• ืžื•ืจื›ื‘ ืžื”ืžื™ืœื” game, ืงื• ืชื—ืชื™ ื•ืื– ืžื–ื”ื” ื”ืžืฉื—ืง. ื‘ืฉื‘ื™ืœ ืชื•ื›ืŸ ื”ื”ื•ื“ืขื” ื”ื™ื ืžืคืขื™ืœื” ืืช ื”ืชื‘ื ื™ืช games/_game.html.erb ื•ืžืขื‘ื™ืจื” ืœื” ื‘ืชื•ืจ ืžืฉืชื ื” ืืช ื”ืžืฉื—ืง ื”ื ื•ื›ื—ื™. ืื’ื‘ ื’ื ืืช ื”ืชื‘ื ื™ืช ืงืฆืช ืฉื™ื ื™ืชื™ ื›ื“ื™ ืฉืชืขื‘ื•ื“ ืขื ืฉื ื”ืžืฉืชื ื” game ื•ืœื @game. ืื‘ืœ ื”ืฉื™ื ื•ื™ ื”ื›ื™ ื’ื“ื•ืœ ื‘ืงื•ื‘ืฅ ื”ื•ื ื”ืฉื•ืจื” ื”ืจืืฉื•ื ื” ืฉืžืงืฉื™ื‘ื” ืœืขื“ื›ื•ื ื™ื ืžื”ืขืจื•ืฅ ื•ืžื˜ืคืœืช ื‘ื”ื:
<%= turbo_stream_from dom_id(@game) %>

<div id="<%= dom_id game %>">
  <p>Now playing: <%= game.next_player %></p>
  <table>
    <tbody>
      <% (0..2).each do |row_index| %>
      <tr>
        <% (0..2).each do |column_index| %>
          <% text = game.at(row_index, column_index) %>    
          <td
            class="<%= class_names(playable: text == '.') %>">
            <%= form_for :game_move, url: play_game_path(game.id) do |f| %>
              <%= f.hidden_field :row, {value: row_index} %>
              <%= f.hidden_field :column, {value: column_index} %>
              <%= f.hidden_field :game_id, {value: game.id} %>
              <%= f.hidden_field :player, {value: game.next_player } %>
              <%= f.submit text %>    
            <% end %>            
          </td>
        <% end %>
      </tr>
      <% end %>
    </tbody>
  </table>
</div>
ื•ื›ืŸ ื–ื” ื›ืœ ืžื” ืฉื”ื™ื” ืฆืจื™ืš. ืžื” ืงื™ื‘ืœื ื• ื”ืชื•ืฆืื” ื“ื™ ืžืจืฉื™ืžื”: 1. ื‘ื’ืœืœ ืฉื”ืขื“ื›ื•ืŸ ื”ื™ื” ื‘ืชื‘ื ื™ืช ื”ืžืฉื—ืง, ื›ื•ืœืœ ืชื•ืกืคืช ื”ื”ืื–ื ื” ืœ Web Socket, ืื– ื›ืœ ืคืขื ืฉืชื‘ื ื™ืช ื–ื• ืชื•ืคื™ืข ืจื™ื™ืœืก ื™ืขื“ื›ืŸ ืื•ืชื” ื‘ืฆื•ืจื” ื“ื™ื ืžื™ืช ื“ืจืš ื” Web Socket ืžืฆื“ ื”ืฉืจืช. ื–ื” ืคื•ืชืจ ืœื ื• ืืช ื›ืœ ื‘ืขื™ื•ืช ื ื™ื”ื•ืœ ื”ืกื˜ื™ื™ื˜ ื‘ื›ืœื•ื ืงื•ื“ - ื›ืœ ื”ืกื˜ื™ื™ื˜ ืžืื•ื—ืกืŸ ื‘ DB, ื›ืœ ืฉื™ื ื•ื™ ื‘ DB ื ืฉืœื— ืื•ื˜ื•ืžื˜ื™ืช ืœื“ืคื“ืคืŸ ื“ืจืš ื” Web Socket ื•ืœื›ืŸ ื”ื“ืคื“ืคืŸ ืชืžื™ื“ ื™ืจืื” ืืช ืžืฆื‘ ื”ืขื•ืœื ื”ื›ื™ ืžืขื•ื“ื›ืŸ. 2. ื‘ื›ืœ ืžืงื•ื ืฉืžืฉืชืžืฉื™ื ื‘ืชื‘ื ื™ืช ื”ืžืฉื—ืง ื”ื™ื ืชืชืขื“ื›ืŸ ื‘ืฆื•ืจื” ืื•ื˜ื•ืžื˜ื™ืช ืžื”ืฉืจืช. ื–ื” ื ื›ื•ืŸ ื‘ืžืกืš ื”ืžืฉื—ืง ืื‘ืœ ื’ื ื‘ืžืกืš ืจืฉื™ืžืช ื”ืžืฉื—ืงื™ื. ืืคืฉืจ ืœืจืื•ืช ื‘ื›ืœื™ ื”ืคื™ืชื•ื— ืฉื‘ืžืกืš ืจืฉื™ืžืช ื”ืžืฉื—ืงื™ื ื™ืฉ ืขื“ื™ื™ืŸ Web Socket ืื—ื“ ืื‘ืœ ื”ื•ื ืžืขื‘ื™ืจ ื”ื•ื“ืขื•ืช ืœืžืกืคืจ ืขืจื•ืฆื™ื, ืขืจื•ืฅ ืœื›ืœ ืžืฉื—ืง ืคืขื™ืœ. ืขื›ืฉื™ื• ื ื›ื•ืŸ ืฉื™ื‘ื•ืื• ื—ื›ืžื™ื ื•ื™ื’ื™ื“ื• ืฉื–ื” ืœื ืžืกืคื™ืง ื˜ื•ื‘ ื›ื™ ืื™ ืืคืฉืจ ืœืฉืžื•ืจ ืืช ื›ืœ ื”ืกื˜ื™ื™ื˜ ื‘ืฉืจืช, ื•ืฉื›ืฉืฉื•ืžืจื™ื ืกื˜ื™ื™ื˜ ืฆื“-ืœืงื•ื— ื‘ืจื™ืืงื˜ ื‘ื“ืคื“ืคืŸ ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœืฉืคืจ ืžืฉืžืขื•ืชื™ืช ืืช ื”ื‘ื™ืฆื•ืขื™ื ื•ืฉืžืฉืชืžืฉื™ื ืœืคืขืžื™ื ื ืžืฆืื™ื ืื•ืคืœื™ื™ืŸ ื•ื‘ื›ืœ ืžืงืจื” ืœื ืจื•ืฆื™ื ืœื—ื›ื•ืช ืœืชืฉื•ื‘ื” ืžื”ืจืฉืช ื‘ืฉื‘ื™ืœ ืœืจืื•ืช ืขื“ื›ื•ื ื™ื. ื”ื›ืœ ื ื›ื•ืŸ, ืื‘ืœ ื—ืฉื•ื‘ ืœืกื™ื™ื’ ื•ืœื”ื‘ื™ืŸ ืื™ื–ื” ืžืขืจื›ืช ืื ื—ื ื• ื‘ื•ื ื™ื. ื‘ืกื•ืฃ ื™ืฉ ืคื” Trade Off ืžื—ืฉื‘ืชื™ ื• Trade Off ืฉืœ ืžื•ืจื›ื‘ื•ืช. ืื ืื ื™ ืœื ืžืชืขืกืง ื‘ื›ืœืœ ืขื ืกื˜ื™ื™ื˜ ืฆื“ ืœืงื•ื— ื•ืกื™ื ื›ืจื•ืŸ ืฉืœื• ืขื ื”ืฉืจืช ืื ื™ ื™ื›ื•ืœ ืœื•ื•ืชืจ ืขืœ ื”ืจื‘ื” ื›ืื‘ ืจืืฉ ื‘ื–ืžืŸ ื”ืคื™ืชื•ื— ื•ืœืงื‘ืœ ืงืฆื‘ ืคื™ืชื•ื— ืžื”ื™ืจ ื‘ื”ืจื‘ื”. ื .ื‘. ืงื•ื“ ื”ืคืจื•ื™ืงื˜ ื”ืžืขื•ื“ื›ืŸ ื ืžืฆื ื‘ืงื™ืฉื•ืจ: https://github.com/ynonp/rails-demo-tic-tac-toe

ToCode
1 419
2. ื”ื˜ื•ืคืก ืžืฆื™ื’ ืืช ืชื•ื›ืŸ ื”ืชื ื•ืฉื“ื•ืช ื ืกืชืจื™ื ืฉืžื—ื–ื™ืงื™ื ืืช ื”ืžื™ืงื•ื ืฉืœ ื”ืชื, ื›ื“ื™ ืฉื›ืฉื”ืžื™ื“ืข ื”ื–ื” ื™ื’ื™ืข ืœืฉืจืช ืืคืฉืจ ื™ื”ื™ื” ืœื™ืฆื•ืจ ืžืžื ื• GameMove. 3. ื›ืคืชื•ืจ Submit ืฉืœ ื”ื˜ื•ืคืก ืคื•ื ื” ืœื ืชื™ื‘ ืžื™ื•ื—ื“ ืฉื‘ื ื™ืชื™ ื‘ืฉืจืช ืœื˜ืคืœ ื‘ืžื”ืœื›ื™ื ื‘ืžืฉื—ืง. ื˜ื™ืคื•ืœ ื‘ื”ื’ืฉืช ื”ื˜ื•ืคืก ื”ื—ืœืง ื”ืื—ืจื•ืŸ ืฉืœ ื”ื ื™ืกื•ื™ ืžื•ื’ื“ืจ ื‘ืงื•ื‘ืฅ app/controllers/games_controller.rb ื•ื‘ื“ื™ืขื‘ื“ ืื ื™ ื—ื•ืฉื‘ ืฉืขื“ื™ืฃ ื”ื™ื” ืœืฉื™ื ืื•ืชื• ื‘ game_moves_controller ืื‘ืœ ื›ืžื• ืฉื›ืชื‘ืชื™ ื‘ืชื—ื™ืœืช ื”ืคื•ืกื˜ ืื ื—ื ื• ื‘ืื™ืœื•ืฆื™ ื–ืžืŸ ื”ื™ื•ื. ื–ื” ื”ืงื•ื“ ืฉื”ื•ืกืคืชื™ ืœืฉื:
  def play
    GameMove.create!(game_move_params)
    respond_to do |format|
      format.turbo_stream { render turbo_stream: turbo_stream.replace(@game) }
      format.html         { redirect_to show_game_url(@game.id) }
    end
  end
  
  def game_move_params
    params.expect(game_move: [:row, :column, :player, :game_id])
  end
ืกืš ื”ื›ืœ ืœื ื ื•ืจื - ื™ืฉ ืคื” ืคื•ื ืงืฆื™ื” ืื—ืช ืฉืžื•ืฆื™ืื” ืžื”ื˜ื•ืคืก ืืช ื”ืคืจืžื˜ืจื™ื ืฉืžืขื ื™ื™ื ื™ื ืื•ืชื™, ื•ืคื•ื ืงืฆื™ื” ื ื•ืกืคืช ืฉืžื˜ืคืœืช ื‘ื™ืฆื™ืจืช ื” GameMove. ื ื›ื•ืŸ ืื™ืŸ ื˜ื™ืคื•ืœ ื‘ืฉื’ื™ืื•ืช ืื• ืื‘ื˜ื—ืช ืžื™ื“ืข. ื–ื” ื ื™ืกื•ื™ ืืœ ืชื™ืงื—ื• ืžืคื” ืงื•ื“ ืจืง ืจืขื™ื•ื ื•ืช. ื‘ื›ืœ ืžืงืจื” ื”ืฉื•ืจื” ืฉืขื•ืฉื” ืืช ื”ืงืกื ื”ื™ื:
format.turbo_stream { render turbo_stream: turbo_stream.replace(@game) }
ืฉื•ืจื” ื–ืืช ื’ื•ืจืžืช ืœืฉืจืช ืœื”ื—ื–ื™ืจ ืœื˜ื•ืคืก ืืช ื”ืชื•ื›ืŸ ืฉืœ ื”ืชื‘ื ื™ืช ืฉืจืื™ื ื• ืงื•ื“ื, ื›ืœื•ืžืจ ื”ืฉืจืช ื”ื•ืกื™ืฃ GameMove ื—ื“ืฉ ืœื‘ืกื™ืก ื”ื ืชื•ื ื™ื, ื”ืจื™ืฅ ืืช ืงื•ื“ ื”ืชื‘ื ื™ืช ืžื—ื“ืฉ ื•ืฉืœื— ืืช ื” HTML ืฉื™ืฆื ืœื“ืคื“ืคืŸ. ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™ JavaScript ืฉืœ ื˜ื•ืจื‘ื• ืฉืจืฅ ื‘ื“ืคื“ืคืŸ ืœื•ืงื— ืืช ื” HTML ื”ื–ื” ื•ืžื—ืœื™ืฃ ืืช ื”ืืœืžื ื˜ื™ื ืขืœ ื”ืžืกืš ื‘ืงื•ื“ ื”ื—ื“ืฉ, ืžื” ืฉื’ื•ืจื ืœืžืกืš ืœื”ืชืขื“ื›ืŸ ื•ืœื”ืฆื™ื’ ืืช ืžืฆื‘ ื”ืžืฉื—ืง ืื—ืจื™ ื”ืžื”ืœืš ื”ื—ื“ืฉ. ืžืกืงื ื•ืช ื•ืชื•ื›ื ื™ืช ืœื”ืžืฉืš ืื ื”ื™ื™ืชื™ ืฆืจื™ืš ืœื›ืชื•ื‘ ืื™ืงืก ืขื™ื’ื•ืœ ื‘ืจื™ืืงื˜ ื‘ืฆื“ ืœืงื•ื— ื‘ืœื‘ื“ ืื ื™ ื‘ื˜ื•ื— ืฉื”ื™ื™ืชื™ ืžืกื™ื™ื ื™ื•ืชืจ ืžื”ืจ, ืืคื™ืœื• ืื ื”ื™ื™ืชื™ ืฆืจื™ืš ืœื”ืฉืชืžืฉ ื‘ Redux (ื•ื›ื ืจืื” ืฉืœื ื”ื™ื™ืชื™ ื‘ื•ื—ืจ ื‘ืจื™ื“ืืงืก ืœื ื™ืกื•ื™ ื›ื–ื”). ืื‘ืœ ืื– ืœื ื”ื™ื” ืœื™ ื—ื™ื‘ื•ืจ ืœื‘ืกื™ืก ื ืชื•ื ื™ื. ืžื”ื‘ื—ื™ื ื” ื”ื–ืืช ืงื•ื“ ืจื™ื™ืœืก ื”ืจื‘ื” ื™ื•ืชืจ ื“ื•ืžื” ืœืคื™ืชื•ื— ืขื next ื• Server Actions, ื•ืœื“ืขืชื™ ื‘ื”ืฉื•ื•ืื” ื›ื–ืืช ื”ืงื•ื“ ืฉืœ ืจื™ื™ืœืก ื™ื•ืฆื ื™ื•ืชืจ ื ืงื™ ื›ื™ ืœ next ืขื“ื™ื™ืŸ ืื™ืŸ ืžื ื’ื ื•ืŸ ืื•ื˜ื•ืžื˜ื™ ื ื•ื— ืœืขื“ื›ื•ืŸ ื”ืžืกืš ืื—ืจื™ ื”ื’ืฉืช ื”ื˜ื•ืคืก. ื•ื›ืŸ ื‘ืจื•ืจ ืœื™ ืฉื”ื“ื•ื’ืžื” ืคื” ืžื•ืžืฆืืช ื•ืงืœื” ื•ื–ื” ื‘ืกืš ื”ื›ืœ ืžืฉื—ืง ืื™ืงืก ืขื™ื’ื•ืœ ื•ื‘ืืคืœื™ืงืฆื™ื” ื’ื“ื•ืœื” ื—ื™ื™ื‘ื™ื JavaScript ืื‘ืœ ืื•ืœื™ ื™ืฉ ื’ื ืžืกืคื™ืง ืืคืœื™ืงืฆื™ื•ืช ืœื ื’ื“ื•ืœื•ืช ืฉืืคืฉืจ ืœื›ืชื•ื‘ ื‘ืฆื•ืจื” ื›ื–ืืช. ื”ื—ืœืง ื”ืฉื ื™ ืฉืื ื™ ืžืชื›ื ืŸ ืœื ื™ืกื•ื™ ื™ื”ื™ื” ื—ื™ื‘ื•ืจ Web Sockets. ื›ืจื’ืข ื”ืžืฉืชืžืฉ ืฉื”ื’ื™ืฉ ืืช ื”ื˜ื•ืคืก ืจื•ืื” ืืช ื”ืขื“ื›ื•ืŸ ืฉืœ ืœื•ื— ื”ืžืฉื—ืง ืขืœ ื”ืžืกืš, ืื‘ืœ ืžืฉืชืžืฉื™ื ืžื—ืœื•ื ื•ืช ืื—ืจื™ื ื™ืฆื˜ืจื›ื• ืœืจืขื ืŸ ื‘ืฆื•ืจื” ื™ื–ื•ืžื” ืืช ื”ื—ืœื•ืŸ ื›ื“ื™ ืœืงื‘ืœ ืืช ื’ื™ืจืกืช ื”ืžืฉื—ืง ื”ืžืขื•ื“ื›ื ืช ื‘ื™ื•ืชืจ. ื‘ืขื–ืจืช Web Sockets ื ื•ื›ืœ ืœื”ื•ื“ื™ืข ืœื›ืœ ืžื™ ืฉืžืกืชื›ืœ ืขืœ ืžืฉื—ืง ืžืกื•ื™ื ืขืœ ืขื“ื›ื•ื ื™ื ื•ื›ืš ืžืกืคืจ ืžืฉืชืžืฉื™ื ื™ื•ื›ืœื• ืœืฉื—ืง ื‘ื›ืžื” ื—ืœื•ื ื•ืช. ืงื•ื“ ื”ื ื™ืกื•ื™ ื”ืžืœื ื ืžืฆื ื‘ื’ื™ื˜ื”ืื‘ ื‘ืงื™ืฉื•ืจ: https://github.com/ynonp/rails-demo-tic-tac-toe

ToCode
1 419
ื ื™ืกื•ื™ ืจื™ื™ืœืก: ืžืฉื—ืง ืื™ืงืก ืขื™ื’ื•ืœ ืื ื™ ื›ื•ืชื‘ ืคื” ื”ืจื‘ื” ืขืœ ืคื™ืชื•ื— ืืคืœื™ืงืฆื™ื•ืช JavaScript ืขืฉื™ืจื•ืช ื‘ React ื•ืขื•ื“ ืคืจื™ื™ืžื•ื•ืจืงื™ื ื•ื—ืฉื‘ืชื™ ืฉื™ื”ื™ื” ืžืขื ื™ื™ืŸ ืœืขืฉื•ืช ื ื™ืกื•ื™ ืฉืœ ื›ืชื™ื‘ืช ื™ื™ืฉื•ื ืื™ื ื˜ืจืงื˜ื™ื‘ื™ ื‘ืคืจื™ื™ืžื•ื•ืจืง ืฆื“-ืฉืจืช ืœืฉื ืฉื™ื ื•ื™. ื•ื›ืŸ ื‘ืจื•ืจ ืฉืจื™ื™ืœืก ืžืื•ื“ ื˜ื•ื‘ ื‘ืขื‘ื•ื“ื” ืขื ื‘ืกื™ืกื™ ื ืชื•ื ื™ื ื•ืžืฉื™ืžื•ืช ื‘ืจืงืข ื•ื›ืœ ืžื” ืฉืฉืจืชื™ื ืขื•ืฉื™ื, ืื‘ืœ ื”ืื ื”ื•ื ื™ื›ื•ืœ ืœืขื–ื•ืจ ื’ื ื‘ืคื™ืชื•ื— ื™ื™ืฉื•ืžื™ื "ืžื•ื“ืจื ื™ื™ื"? ืื ืกื” ื‘ื ื™ืกื•ื™ ื”ื–ื” ืœืขื ื•ืช ืขืœ ื”ืฉืืœื”. ืขืงื‘ ืื™ืœื•ืฆื™ ื–ืžื ื™ื ืื ื™ ืžื—ืœืง ืืช ื”ื ื™ืกื•ื™ ืœ-2. ื‘ืคื•ืกื˜ ื”ื™ื•ื ืื ื™ ืืจืื” ืงื•ื“ ืœืžืฉื—ืง ืื™ืงืก ืขื™ื’ื•ืœ ื‘ืจื™ื™ืœืก ืฉืขื•ื‘ื“ ื‘ืฆื•ืจื” ืื™ื ื˜ืจืงื˜ื™ื‘ื™ืช ื•ื‘ืœื™ ื›ืชื™ื‘ืช JavaScript ื›ืœืœ. ื”ืžืฉื—ืง ืขื•ื‘ื“ ื›ืฉืžืฉื—ืงื™ื ื‘ื• ืžืื•ืชื• ื“ืคื“ืคืŸ ืžืžืฉ ื‘ืกื“ืจ. ื‘ื—ืœืง ื”ืฉื ื™ ืฉืœ ื”ื ื™ืกื•ื™ ืื•ืกื™ืฃ ืœื–ื” ื’ื Web sockets ื‘ืฉื‘ื™ืœ ืœื‘ื ื•ืช ืžืฉื—ืง ืื™ืงืก ืขื™ื’ื•ืœ ืฉืืคืฉืจ ืœืฉื—ืง ืžื›ืžื” ืžื—ืฉื‘ื™ื ื‘ืžืงื‘ื™ืœ. ื”ื›ืœื™ื ืฉืจื™ื™ืœืก ืžืกืคืง ื›ืœื™ ื”ืขื‘ื•ื“ื” ื”ืžืจื›ื–ื™ ืœื ื™ืกื•ื™ ื ืงืจื Turbo Stream. ื–ื” ืžื ื’ื ื•ืŸ ื™ื—ืกื™ืช ื—ื“ืฉ ืฉืœ ืจื™ื™ืœืก ืฉืขื•ื–ืจ ืœื›ืชื•ื‘ ื™ื™ืฉื•ืžื™ ื•ื•ื‘ ืžื•ื“ืจื ื™ื™ื ื•ืžื”ื™ืจื™ื ืื‘ืœ ื‘ืœื™ ืœื›ืชื•ื‘ JavaScript. ื”ืจืขื™ื•ืŸ ืžื‘ื•ืกืก ืขืœ Ajax ืื•ื˜ื•ืžื˜ื™ ื›ืš ืฉืื ื—ื ื• ื›ื•ืชื‘ื™ื HTML ืขื ื˜ื•ืคืก ื•ื˜ื•ืจื‘ื• ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™ ืžื’ื™ืฉ ืืช ื”ื˜ื•ืคืก ื‘ืฆื•ืจื” ืืกื™ื ื›ืจื•ื ื™ืช, ืœื•ืงื— ืืช ืชืฉื•ื‘ืช ื”ืฉืจืช ื•ืžื“ื‘ื™ืง ืื•ืชื” ื‘ืชื•ืš ื” DOM ื‘ืžืงื•ื ืžื” ืฉื”ื™ื” ืฉื ืงื•ื“ื ื•ื›ื›ื” ืจื•ืื™ื ืขืœ ื”ืžืกืš ื‘ืื•ืคืŸ ืžื™ื™ื“ื™ ืืช ื”ืชื•ืฆืื”. ื”ื™ื™ืชืจื•ืŸ ืžื‘ื—ื™ื ืช ืงื•ื“ ื”ื•ื ืžืื•ื“ ืžืขื ื™ื™ืŸ ื›ื™ ืคื™ืชื•ื— ื›ื–ื” ื ื•ืชืŸ ืœื ื• ื—ื™ื‘ื•ืจ ืื•ื˜ื•ืžื˜ื™ ืœื‘ืกื™ืก ื ืชื•ื ื™ื ื•ืœื›ืœ ืžื” ืฉืฆืจื™ืš ื‘ืฆื“ ืฉืจืช. ืื ื™ ืžืชื—ื™ืœ ืืช ืžืฉื—ืง ื”ืื™ืงืก ืขื™ื’ื•ืœ ืฉืœื™ ื‘ืฉืชื™ ื˜ื‘ืœืื•ืช ื‘ื‘ืกื™ืก ื”ื ืชื•ื ื™ื - ื˜ื‘ืœืช ืžืฉื—ืงื™ื ื•ื˜ื‘ืœืช ืžื”ืœื›ื™ื ื‘ืžืฉื—ืง:
ActiveRecord::Schema[8.0].define(version: 2024_10_09_113739) do
  create_table "game_moves", force: :cascade do |t|
    t.integer "game_id", null: false
    t.integer "turn"
    t.string "player"
    t.integer "row"
    t.integer "column"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["game_id"], name: "index_game_moves_on_game_id"
  end

  create_table "games", force: :cascade do |t|
    t.string "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  add_foreign_key "game_moves", "games"
end
ื ืชืชื™ ืœืจื™ื™ืœืก ืœื™ืฆื•ืจ ืงื•ื ื˜ืจื•ืœืจื™ื ื•ืžื•ื“ืœื™ื ืœืฉืชื™ ื”ื˜ื‘ืœืื•ืช ืขื rails g scaffold ื•ื™ืฆืืชื™ ืœื“ืจืš. ืคื™ืชื•ื— ืžืชื•ื“ื•ืช ืขื–ืจ ื‘ืžื•ื“ืœ ื‘ืฉื‘ื™ืœ ืฉื™ื”ื™ื” ืงืœ ืœื”ืฆื™ื’ ืืช ื”ืœื•ื— ื”ื•ืกืคืชื™ ืœืžื•ื“ืœ ืืช ื”ืคื•ื ืงืฆื™ื•ืช ื”ื‘ืื•ืช:
class Game < ApplicationRecord
  has_many :game_moves, inverse_of: :game

  def at(row, column)
    start = [['.', '.', '.'],
             ['.', '.', '.'],
            ['.', '.', '.']]
    board = game_moves.reduce(start) do |g, move|
      g.tap { |g| g[move.row][move.column] = move.player }
    end
    board[row][column]
  end

  def next_player
    ['X', 'O'][game_moves.count % 2]
  end
end
ื”ืคื•ื ืงืฆื™ื” next_player ืžื—ื–ื™ืจื” ืžื™ ื”ืฉื—ืงืŸ ืฉืขื›ืฉื™ื• ืฆืจื™ืš ืœืฉื—ืง ื• at ืžื—ื–ื™ืจื” ืžื” ืžืฆื•ื™ืจ ื‘ืžืฉื‘ืฆืช ืžืกื•ื™ืžืช. ื ืฉื™ื ืœื‘ ืฉื”ื ื—ืช ื”ืขื‘ื•ื“ื” ื›ืืŸ ื”ื™ื ืฉื›ืœ ื”ืžื”ืœื›ื™ื ื—ื•ืงื™ื™ื ื•ืฉืื™ืŸ ื—ืฉื™ื‘ื•ืช ืœืกื“ืจ ื‘ื™ืŸ ื”ืžื”ืœื›ื™ื, ื•ื’ื ืœื ื˜ื™ืคืœืชื™ ื‘ืžืฉื—ืงื™ื ืฉื”ืกืชื™ื™ืžื• ื•ื ื™ืฆื—ื•ื ื•ืช. ื”ืฆื’ืช ืœื•ื— ื”ืžืฉื—ืง ืขื™ืงืจ ื”ืงื•ื“ ืฉืœ ื”ื ื™ืกื•ื™ ื”ื•ื ื‘ืงื•ื‘ืฅ app/views/games/_game.html.erb. ื–ื” ืชื•ื›ืŸ ื”ืงื•ื‘ืฅ:
<div id="<%= dom_id game %>">
  <p>Now playing: <%= @game.next_player %></p>
  <table>
    <tbody>
      <% (0..2).each do |row_index| %>
      <tr>
        <% (0..2).each do |column_index| %>
          <% text = @game.at(row_index, column_index) %>    
          <td
            class="<%= class_names(playable: text == '.') %>">
            <%= form_for :game_move, url: play_game_path(@game.id) do |f| %>
              <%= f.hidden_field :row, {value: row_index} %>
              <%= f.hidden_field :column, {value: column_index} %>
              <%= f.hidden_field :game_id, {value: @game.id} %>
              <%= f.hidden_field :player, {value: @game.next_player } %>
              <%= f.submit text %>    
            <% end %>            
          </td>
        <% end %>
      </tr>
      <% end %>
    </tbody>
  </table>
</div>
ื”ืงื•ื“ ื”ื•ื Template ืžืกื•ื’ ERB ืฉืžืฆื™ื™ืจืช ืœื•ื— ืžืฉื—ืง. ืื ืฉื™ ืจื™ืืงื˜ ื™ื›ื•ืœื™ื ืœื—ืฉื•ื‘ ืขืœ ื–ื” ื› JSX ืฉืœ Server Component, ื›ืœื•ืžืจ ื”ืงื•ื“ ืจืฅ ื‘ืฉืจืช, ืžื™ื™ืฆืจ HTML ื•ืฉื•ืœื— ืœื“ืคื“ืคืŸ ืืช ื” HTML ืฉื™ืฆื. ืœืชื‘ื ื™ืช ื™ืฉ ื’ื™ืฉื” ืžืœืื” ืœื‘ืกื™ืก ื”ื ืชื•ื ื™ื ื•ื”ื•ื ื‘ืกืš ื”ื›ืœ ืงื•ืจื ืฉื•ื‘ ื•ืฉื•ื‘ ืœืคื•ื ืงืฆื™ื” at ื›ื“ื™ ืœื—ืฉื‘ ื•ืœืฆื™ื™ืจ ืืช ื”ืœื•ื—. ื”ื—ืœืง ื”ืžืขื ื™ื™ืŸ ื‘ืงื•ื“ ื–ื” ื”ื˜ื•ืคืก: 1. ืœื›ืœ ืชื ื‘ืœื•ื— ื”ืžืฉื—ืง ื™ืฉ ื˜ื•ืคืก ืžืฉืœื•.

ToCode
1 419
ืคื™ื™ืชื•ืŸ ื‘ืœื™ GIL ื’ื™ืจืกื” 3.13 ืฉืœ ืคื™ื™ืชื•ืŸ ืฉืฉื•ื—ืจืจื” ืžืžืฉ ืขื›ืฉื™ื• ื”ื™ื ื”ืจืืฉื•ื ื” ืฉืชื•ืžื›ืช ืจืฉืžื™ืช ื‘ืจื™ืฆื” ืœืœื GIL, ื•ืืœื” ื—ื“ืฉื•ืช ืžืกืคื™ืง ืžืœื”ื™ื‘ื•ืช ื‘ืฉื‘ื™ืœ ืœืขืฆื•ืจ ื”ื›ืœ ื•ืœืจืื•ืช ืืช ื”ืืคืงื˜. ื‘ืจืžืช ื”ืชื™ืื•ืจื™ื” ื” GIL ื–ื” ื”ื—ืœืง ื‘ืคื™ื™ืชื•ืŸ ืฉืฉื•ืžืจ ืขืœ ื” Interpreter ื›ืฉืื ื—ื ื• ืžืจื™ืฆื™ื ืชื•ื›ื ื™ืช ืžืจื•ื‘ืช ืชื”ืœื™ื›ื•ื ื™ื. ื’ื™ืจืกื” ืœืœื GIL ืื•ืžืจืช ืฉืื™ืŸ ื™ื•ืชืจ ืžื‘ื ื™ ื ืชื•ื ื™ื ื‘ืชื•ืš ืคื™ื™ืชื•ืŸ ืฉืฆืจื™ืš ืœื”ื’ืŸ ืขืœื™ื”ื, ื•ืœื›ืŸ ืคื™ื™ืชื•ืŸ ื™ื›ื•ืœื” ืœื”ืจื™ืฅ ืงื•ื“ ืžืจื•ื‘ื” ืชื”ืœื™ื›ื™ื ื‘ืœื™ ื ืขื™ืœื•ืช - ื›ืœื•ืžืจ ื”ืจื‘ื” ื™ื•ืชืจ ืžื”ืจ. ื‘ืฉื‘ื™ืœ ืœื”ืชืงื™ืŸ ืืช ื’ื™ืจืกืช ื”ืคื™ื™ืชื•ืŸ ื ื˜ื•ืœืช ื” GIL ืขื pyenv ื”ืคืขืœืชื™:
CONFIGURE_OPTS=--disable-gil PYENV_VERSION_SUFFIX='-free-threaded' pyenv install -f -v 3.13.0rc3t
ื•ื™ื“ืืชื™ ืฉืื ื™ ืžืจื™ืฅ ืืช ื”ื’ื™ืจืกื” ื”ื ื›ื•ื ื” ืขื:
$ python --version
Python 3.13.0rc3
ื•ืื– ื ืชืชื™ ืœื• ืœืกืคื•ืจ ื›ืžื” ืžืกืคืจื™ื ืจืืฉื•ื ื™ื™ื ื™ืฉ ืขื“ ืžื™ืœื™ื•ืŸ ืขื ื”ืงื•ื“ ื”ื–ื”:
import sys
import math
import multiprocessing.dummy as mp

def is_prime(n):
 for i in range(2, int(math.sqrt(n) + 1)):
  if n % i == 0:
   return False
 return True

if __name__ == "__main__":
    print(f"GIL enabled = {sys._is_gil_enabled()}")
    with mp.Pool(4) as p:
        print(sum(p.map(is_prime, range(1_000_000))))
ืืœื” ื”ื–ืžื ื™ื ืฉืžื“ื“ืชื™ ื‘ื”ืจืฆื” ืขืœ ื”ืœืคื˜ื•ืค:
ynonp@Ynons-MacBook-Air ~/tmp $ time PYTHON_GIL=0 python gil.py
GIL enabled = False
78500
PYTHON_GIL=0 python gil.py  2.83s user 0.04s system 306% cpu 0.938 total
ynonp@Ynons-MacBook-Air ~/tmp $ time PYTHON_GIL=0 python gil.py
GIL enabled = False
78500
PYTHON_GIL=0 python gil.py  2.85s user 0.04s system 305% cpu 0.944 total
ynonp@Ynons-MacBook-Air ~/tmp $ time PYTHON_GIL=0 python gil.py
GIL enabled = False
78500
PYTHON_GIL=0 python gil.py  2.88s user 0.04s system 317% cpu 0.919 total
ynonp@Ynons-MacBook-Air ~/tmp $ time PYTHON_GIL=1 python gil.py
GIL enabled = True
78500
PYTHON_GIL=1 python gil.py  2.61s user 0.05s system 96% cpu 2.753 total
ynonp@Ynons-MacBook-Air ~/tmp $ time PYTHON_GIL=1 python gil.py
GIL enabled = True
78500
PYTHON_GIL=1 python gil.py  2.62s user 0.05s system 97% cpu 2.741 total
ynonp@Ynons-MacBook-Air ~/tmp $ time PYTHON_GIL=1 python gil.py
GIL enabled = True
78500
PYTHON_GIL=1 python gil.py  2.64s user 0.05s system 93% cpu 2.865 total
ื‘ืžืžื•ืฆืข ืฉืœ 3 ืจื™ืฆื•ืช ืขื GIL ื•-3 ืœืœื GIL ื”ื”ื‘ื“ืœ ื”ื•ื ื‘ื™ืŸ ื‘ืขืจืš 2.7 ืฉื ื™ื•ืช ืœืงืฆืช ืคื—ื•ืช ืžืฉื ื™ื”, ื›ืœื•ืžืจ ืžืฉื”ื• ื›ืžื• ืคื™ 3 ื™ื•ืชืจ ืžื”ืจ ืœื˜ื•ื‘ืช ื”ื’ื™ืจืกื” ืœืœื GIL. ืขื“ื™ื™ืŸ ืงืฉื” ืœื“ืขืช ืื™ืš ื–ื” ื™ืฉืคื™ืข ืขืœ ืžื•ื“ื•ืœื™ื ื—ื™ืฆื•ื ื™ื™ื ื•ืงื•ื“ ืงื™ื™ื ื•ื‘ื™ื ื™ื ื• ืœื ื”ื™ื™ืชื™ ืจืฅ ืœืฉื“ืจื’ ืกืงืจื™ืคื˜ื™ื ืงื™ื™ืžื™ื ืœื’ื™ืจืกื” ืœืœื GIL, ืื‘ืœ ื–ื” ื‘ื”ื—ืœื˜ ืžืฉื”ื• ืฉื”ื™ื™ืชื™ ืฉื•ืงืœ ืœืคืจื•ื™ืงื˜ื™ื ื—ื“ืฉื™ื ืื• ืœืกืงืจื™ืคื˜ื™ื ืฉืกืคืฆื™ืคื™ืช ืžืฉืชืžืฉื™ื ื‘ืงื•ื“ ืžืจื•ื‘ื” ืชื”ืœื™ื›ื•ื ื™ื ื•ืกื•ื‘ืœื™ื ืžื‘ืขื™ื™ืช ืื™ื˜ื™ื•ืช.

ToCode
1 419
ื”ื‘ื—ื™ืจื” ืœื ืœื“ืขืช ืœื ื—ื™ื™ื‘ื™ื ืœื“ืขืช ืกืคืจื“ื™ืช ื‘ืฉื‘ื™ืœ ืœื”ื ื•ืช ืžืžื•ื–ื™ืงื” ืœื˜ื™ื ื™ืช. ืœื ื—ื™ื™ื‘ื™ื ืœื”ื™ื•ืช ืจื•ืื” ื—ืฉื‘ื•ืŸ ืื• ืืคื™ืœื• ืœื”ื‘ื™ืŸ ื‘ืžืกื™ื ื‘ืฉื‘ื™ืœ ืœืคืชื•ื— ืขืกืง. ืœื ื—ื™ื™ื‘ื™ื ืœื“ืขืช ืœื”ืชืงื™ืŸ ืฉืจืชื™ื ื›ื“ื™ ืœื”ื™ื•ืช ืžืคืชื—ื™ ื•ื•ื‘ ื•ืœื ืฆืจื™ืš ืœื”ื™ื•ืช ืจืงื“ื ื™ื ื›ื“ื™ ืœืจืงื•ื“ ืขื ื”ืžืฉืคื—ื” ื‘ื—ืชื•ื ื”. ื™ืฉ ื”ืžื•ืŸ ื“ื‘ืจื™ื ืฉืื ื—ื ื• ืขื•ืฉื™ื ื‘ืœื™ ืœื”ื™ื•ืช ืžืงืฆื•ืขื™ื™ื ื‘ื”ื ืื• ื ื•ืชื ื™ื ืœืื—ืจื™ื ืœืขืฉื•ืช ื‘ืฉื‘ื™ืœื ื•. ื”ื˜ืจื™ืง ืขื ื”ื‘ื—ื™ืจื” ืœื ืœื“ืขืช ื”ื•ื ืœื ืœื”ืคื•ืš ืืช ื–ื” ืœืื™ื“ืื•ืœื•ื’ื™ื”. ื‘ืžืงื•ื ืœื”ื’ื™ื“ "ืขื“ื™ืฃ ืฉืžืคืชื—ื™ื ื™ืชืจื›ื–ื• ื‘ื‘ื ื™ื™ืช ืืœื’ื•ืจื™ืชืžื™ื ื•ื™ืชื ื• ืœืื ืฉื™ DevOps ืœื”ืชืงื™ืŸ ืืช ื”ืฉืจืชื™ื. ื›ืฉืžืคืชื—ื™ื ืžืชืงื™ื ื™ื ืฉืจืชื™ื ื”ื ืจืง ื™ื•ืฆืจื™ื ื‘ืขื™ื•ืช ืื‘ื˜ื—ื”" ืืคืฉืจ ืœื”ื’ื™ื“ "ืื ื™ ื›ืจื’ืข ืžืขื“ื™ืคื” ืœื”ืชืžืงื“ ื‘ืืœื’ื•ืจื™ืชืžื™ืงื” ื‘ืืžืช ื™ื”ื™ื” ืžืขื ื™ื™ืŸ ื™ื•ื ืื—ื“ ืœืœืžื•ื“ ื™ื•ืชืจ ืขืœ ื”ืชืงื ืช ืฉืจืชื™ื". ื’ื ื”ืกื™ืคื•ืจ ืฉืื ื—ื ื• ืžืกืคืจื™ื ืœืขืฆืžื ื• ื™ื›ื•ืœ ืœื”ื™ื•ืช ื‘ืขืชื™ื“ ื—ืกื ืœืฆืžื™ื—ื”. ืขื“ื™ืฃ ืœื”ืฉืื™ืจ ืืช ื”ื“ืœืช ื”ื–ืืช ืคืชื•ื—ื”.