ToCode
Ir al canal en Telegram
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Mostrar mรกs1 419
Suscriptores
+124 horas
-17 dรญas
-530 dรญas
Archivo de publicaciones
1 419
ืืฉืชืืฉื ืืืืื ืกืคืจืืืช ืฉืชืจืฆื
ืจืืืชื ืืช ืืืฉืคื ืืื ืืืืื ืืฉืืืช ืืืช ืืจืืืงื ืฉืืืฉืื ืคืจืกื, ืืฉืื ืืื "ืืชืื ืงืืืคืื ื ืื ืฉืืฆืืื ืจืฉืืื ืฉื ื ืชืื ืื ืืืืืงืื ืืขืืืืื ืืืคืชืืจืื ืืืคืืฃ ืงืืืื ืืืืืจื. ืืฉืชืืฉื ืืืืื ืกืคืจืืืช ืฉืชืจืฆื".
ืืืขืื ืขื "ืืืื ืกืคืจืืืช ืฉืชืจืฆื" ืืื ืฉืื ืืกืืช ืืขืช. ืืฉ ืื ืฉืื ืฉืืืืจืื ืกืคืจืื ืื ืฉืชืืื ืฉืืืืืง ืคืืชืจืืช ืืช ืืืขืื ืืืกืืืื ืืืจ ืืช ืืืฉืืื; ืืฉ ืืืจืื ืฉืืืืจืื ืกืคืจืืืช ืฉืื ืืื ืืชืืืืืช ืืื ืืขืฉื ืืืืฅ ืืืชืืื ืืืชื ืืืฉืืื ืืืืืฉืื ืื ืืกืชืืื; ืืืจืื ืืืคืฉื ืืืืื ืกืคืจืืืช ืืืืืืื ืืช ืื ืืื ืืืฉืืื ืขื ืืืคืืฉ ืืกืคืจืื ืืืืื ืืืืชืจ ืืขืื ืื ืฉืื ืืคืกืคืกื ืืืืจื ืืช ืืจืขืืื ืฉื ืกืคืจืืืช ืืืืชืื ืืื ืืจืืืงื ืืื ืกืคืจืืืช ืืจืืื, ืื ืฉืืืจืื ืืงืื ืฉืืื ืืืืจืืืช ืืืชืจ ืืจืื ืื ืฉืืืฉืืื ืชืืงื ืืื ืืืชืจ ืืื.
ืฉืชื ืืคืฉืจืืืืช ืืืชืจ ืืืืืช ืืืขืชื ืืืฉืืืืช ืืืช:
1. ืืื ืืืฉืชืืฉ ืืกืคืจืืืช ืืจืืื - ืชืืชืื ืืช ืงืื ืืชืงืฉืืจืช ืืื ืืจืืืงื ืืืช ืืขืืฆืื ื CSS ืื style. ืืจืืจ ืฉืืืงื ืืืชืจ ืืื ืืื ืืืื ืฉื ืจืื ืืช ืืืืฆืจ ืืื ืืขืืฆื, ืืื ืืืื ื ืจืืืื ืฉืืื ืืขื ืืื ืช ืขื ืืงืื.
2. ืืฉืชืืฉื ืจืง ืืกืคืจืืืช X, Y ื Z - ืคื ืืฉ ืกืื ืฉื ืืืชืจืื ืืื ืฉืื ืฉืืืจ ืืืืจืื ืืจืืฉ ืืช ืืกืคืจืืืช ืฉืืืจื ื ืืืฉืืื, ืืื ืจืื ืืืื ืืคืจืื ื ืื ื ืงื ืืื ืฉืื ืืืฉืชืืฉ ืืกืคืจืืืช ืจืืืื ืืืืช ืื ืื ืื ืขืืื ืืืชื ืืขืืจ. ืืืืืจ ืื ืฉืขืื ืขื react-query ืืฆืืื ืืืกืชืืจ ืืืจ ืขื swr. ืื ืฉืขืื ืขื emotion ืืฆืืื ืืืกืชืืจ ืขื styled components ืืื. ืืจืืจ ืื ืชืืืจื ืคื ืจืืืืงืก ืื ืกืคืจืืืช ืฉืงืฉื ืืืืื, ืืื ืื ืื ืืชื ืกืคืฆืืคืืช ืืืคืฉืื ืืืืืก ืื ืฉืื ืฉืืืืจืื ืกืคืจืืืช ืืื.
ืืืชืจ ืืื ืืืืฉืืช ืืืืื ืืขืืื ืืจืขืชืื, ืื ืืืฉืืืืช ืืืช.
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 ืื ืขืื ืืชื ืืืืืืื ืฉืืฆืจ ืืช ืืงืืฆืื.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
ืืฉ ืืื ืืืคืื ืืืืืจืืช ืืื ืฉืืชื ืื ืืืืืื ืืืืืช ืืื? ืฉืชืคื ืืชืืืืืช ืืืื ืืืื ืืืืฅ ืืื ืจืขืืื ืืช.1 419
ืืื ืืืฉืืื ืืื ืืืขื?
ืืฉืืชื ืืืชืื ืงืืข ืงืื ืืืื ืืจืืืชื ืฉืื ื ืืกืชืื ืื ืงืจืืชื ืืืืจ ืืืคืื ื, ืืืืืจ ื Chat GPT. ืืืฆื ืฉืื ืื ื ืจืื ืืื-
1. ืื AI ืื ื ืฆืจืื ืงืื ืฉืขืืฉื X
2. ืชืืื! ืืื ืืงืื ืฉืืืคืกืช ืื ื ืจืื ืืขืื ืืืืืื. ืืืื ืืืฆืืข 5 ืจืขืืื ืืช ืืืจืื?
3. ืืกืคืจ ืฉืืืฉ ื ืจืื ืืื ืื ืืืืื ืืืืืื ืฉืจืฆืืชื ืืงืืช. ืืืงืฉื ืชืชืงืื ืืืชื.
4. ืฉืืข ืื ืืืขื ืขืื ืืื ืืจืื ืชืืฆืื ืื ื ืืื ื. ืื ื ื Data ืขืืื ืืจืฆืชื. ืจืืื ืืช ืืืขืื?
5. ืชืืื! ืื ืขืืื ืืขืืื.
ืืฆื ืืื ืืฆืืชื ืขื ืงืื ืฉื ืจืื ืขืืื. ืืฆื ืฉื ื ืืืืื ืืืืชืจ ืืฉืื, ืืคืกืืชื ืืช ืืืืืื ืืช ืืคืชืืจ ืืช ืืืขืื ืืขืฆืื, ืืืืชืงืข ืืืืืื. ืืื ืจืืข, ืื ืืขืฆื ืืืืื ืืื ืื ืืืื ืืืฉืืื? ืืชื ืื ืืฆืืข ืืื ืืืฆืข ืืืฉืืืื ืืกืืืืื ืขื ืืฃ ืจืง ืืฉืืื ื"ืืืืื" ืื ื"ืืืืื ืืช" ืฉื ืคืืชืจืื ืชืจืืืื ืืืืืง ืืจืื?
ืืืืืช ืืคืืกื ืืื ืืื ืืืชืจ ืฉืืื ืืชืฉืืื. ื AI ืืื ืืงืื, ืื ื ืืืื ืืืจืืฅ ืืืชื ืืงืืืืช ืืืืืจื ืืืื ื, ืืืื ืืืกื ืืืื ืืืื ืืื. ืืฆื ืฉื ื ืืื ืืืื ืืืืฉืืื ืืชืืฆืื ืฉืืงืืืื ื AI ืื ืชืืื ื ืืื ื, ืืืคืืื ืืฉืืื ืขืืืืช ืื ืืจืืจ ืขื ืืื ืืื ืืืื. ืืืชืืืช ืงืื ืื ืื ื ืขืืืื ืืจืื ืืืชืจ ืืืืขืื ืืื ืกืืื ืืืฉืจ ืืงืจืืื ืืืขืชืงื.
ืืืื ืืคืืชืจืื ืืื ืืื ืืจืืข ืืื ืืืืจ ืขื ื AI ืืื ืืืืช ืืืชืื ืืช ืืงืื ืืืคืก ื IDE. ืืืืื ืื ืฉืฆืจืื ืื ืืืชืจืื ืืืื ืืจืื ืืืชืจ, ืื ืืืืจื ืืื ืืืชื ืงืืืื ืฉืจืื ืืืื ืขืืืืื ืืืืืื ืืืจืืื ืืช ืจืื ืืืขืจืืืช ืฉืื ื ืืขืชืื.
1 419
ืืืฉ ืืืชืจ ืงืืจืก ืืืื ื Git
ืืช ืงืืจืก Git Hero ืฉืืืชืจ ืืงืืืชื ืืืจื ืืจืื ืืืจืืืช ืืื ืืฆื ืืงืืืืช. ืืื ืืืืจืืืช ืืืืืขืืฆืื ืืฆืืชื ืื ืฉืื ืฉืืชืืืื ืืขืืื ืขื ืืื ืืื ืืืืื ืืืชื ืืฆืืจื ืืกืืืจืช. ืื ืืฆืืืื ืืืกืชืืจ ืจืื ืืืื ืืื ืืฉืืืจืื ืืกืชืืื ืื ืขืฉื ืืขืืืืช, ืืืื ืฉืื ืืืื ื ืืื ืืื ืืืืช ืขืืื ืืื ื Best Practices ืฉืืืื ืืืืฅ. ืืืืชื ืงืืจืก ืื ื ืืจืื ืืคืจืื ืคืจืืื ืืื ืืื ืขืืื, ืืืื ืืื ื ืฉืืจ ืืืืืข ืืชืืงืืื
.git ืฉืื - ืื ืฉื ืืชื ืืชืืืืืื ืืื ื ืืขืืืงื ืืืืืืื ืืขืืืื ืขื ืืื ืขื ืคืจืืืงืืื ืืืืืื.
ืืื ืฉืืขืืืชื ืืืชื ืืืืืชื ืฉืืฉ ืื ืืขื ืื ืฉืื ืฉืจืง ืืชืืืืื ืืขืืื ืขื ืืื ืืื ืืื ืฉืืืื ืืงืื ืืืจืื ืงืฆืจื ืขื ืื ืื ืืืื ืืื, ืืื ืฆืจืื ืืืชื ืืืื ืขืืฉืื ืืืจืื ืคืฉืืืื. ืืืืงื ืืืื ืืืืช ืืืืืข ืืืื ืกืืฃ ืืืืจืืืื ืฉืืฉ ืืืื ืืจื ื ืขื ืืื, ืื ืฉืื ืืืื ืืืืืื ืืืื ืจืืฆืื ืืืจืื ืืื, ืืืืงื ืฉืืืคืฉืจ ืืืชืืื ืืืฉืชืืฉ ื Git ืขื ืคืจืืืงื ืื ืืฉืชืฃ ืคืจืืืงื ืืจืฉืช ืืจื GitHub.
ืืืื ืื ื ืฉืื ืืืฉืืง ืืืืืง ืืช ืื - ืงืืจืก ืืื ืืงืืฆืจ ืืืืืืง, ืืื ืฉืื ืฉืืฃ ืคืขื ืื ืจืื ืืื ืืจืืฆืื ืืืฉืชืชืฃ ืืคืจืืืงื ืขื ืืื ืื ืืืชืืื ืคืจืืืงื ืจืืฉืื ืฉืืื. ืืงืืจืก ืื ืืืจืฉ ืืืข ืงืืื, ืื ืื ื ืขืืืืื ืฉื ืขื ืืคืืืงืฆืืืช Github Desktop ืื ืฉืืคืืื ืื ืฆืจืื ืืืืืจ ืืช ืืื ืฉืืจืช ืืคืงืืื, ืืืคืืืช ืืฉืขืชืืื ืฉื ืืืืื ืืืชื ืืื ืืช ืื ืืืืื ืืืกืืกืืื ืืื ืืืชืืื ืืขืืื ืขื ืืื ืืื ืืืขืืช ืืืื ืืืืืื.
ืงืืจืก ืืืื ื Git ืื ืืืืืฃ ืืช ืงืืจืก Git Hero ืฉืืืชืจ ืืื ืืฉืืื ืืืชื ืืชืืจ ืฆืขื ืจืืฉืื. ืื ืืืคืฉืชื ืืจื ืืืืจื ืืงืื ืืืชืืื ืืขืืื ืขื Git ืื ื ืืืืื ืืชืื ืืืชืื ืืืขืืฃ ืืื:
https://www.tocode.co.il/bundles/pregit
ืื ืืืื ืืฉืืจ ืืงืืจืกืื ืืืชืจ ืืงืืจืก ืืื ืืื ืื ืืืืจื ืื ืืื ืื ืื. ืชืจืืืฉื ืืืคืฉื ืืืืื ืก ืืืืืื ืื ืืืขืืืจ ืืืชื ืืืืจืื ืืืืจืืช ืฉืฆืจืืืื ืืชืืื ืืืืจืืช ื Git.1 419
ืืฉืืงืื ืงืฆืจืื ืืืจืืืื
ืืืฉืืงืื ืงืฆืจืื ืืฉ ืกืืฃ ืืืืื ืื ืฆื ืืื. ืืฉืืงืื ืืจืืืื ืคืฉืื ืืืฉืืืื ืืงืืืขืื ืืื ื ืืืข ืืืฉืืง ืืงืฆืจ ืืื.
ืื ืจืืืื ืขืืืื ืื ืืคืืื ืืืคืืฉ ืขืืืื ืื ืกืื ืฉื ืืฉืืง ืงืฆืจ, ืฉื ืืืจ ืืฉืืืฆืืื ืขืืืื. ืืืืื ืืื ืกืื ืฉื ืืฉืืง ืืจืื ืฉืงืืืข ืืื ื ืืืข ืืจืืืื ืืขืืืื ืืื.
ืืขืืืช ืืืจืกื ืืื ืืฉืืง ืงืฆืจ ืฉืืืืืจ ืืฉืืืืจืกื ืืืืฉื ืชืืื ืืืืืืจ. ืชืืืื ืคืืชืื ื ืืื ืืื ืืืฉืืง ืืืจืื ืืืื ืืงืืข ืืื ืืืืืืื ื ืืื ืืืขืืืช ืืืืจืกื ืืืื.
ืืขืืืื ืขื ืืขืืืช ืืขื ืืื ืืช ืืืืืื ืืื ืืฉืื ืื ืืืฉืืงืื ืืงืฆืจืื ืืืืจืืืื ืฉืืขืืจืืื ืืื ืื ืืช ืืืฉืืืื ืฉืื ื ืืื ืฉื ืืื ืืืฆืืื ืืฉื ื ืืกืืืื.
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-toe1 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-toe1 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. ืืื ืชื ืืืื ืืืฉืืง ืืฉ ืืืคืก ืืฉืื.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, ืืื ืื ืืืืื ืืฉืื ืฉืืืืชื ืฉืืงื ืืคืจืืืงืืื ืืืฉืื ืื ืืกืงืจืืคืืื ืฉืกืคืฆืืคืืช ืืฉืชืืฉืื ืืงืื ืืจืืื ืชืืืืืื ืื ืืกืืืืื ืืืขืืืช ืืืืืืช.1 419
ืืืืืจื ืื ืืืขืช
ืื ืืืืืื ืืืขืช ืกืคืจืืืช ืืฉืืื ืืื ืืช ืืืืืืงื ืืืื ืืช. ืื ืืืืืื ืืืืืช ืจืืื ืืฉืืื ืื ืืคืืื ืืืืื ืืืกืื ืืฉืืื ืืคืชืื ืขืกืง. ืื ืืืืืื ืืืขืช ืืืชืงืื ืฉืจืชืื ืืื ืืืืืช ืืคืชืื ืืื ืืื ืฆืจืื ืืืืืช ืจืงืื ืื ืืื ืืจืงืื ืขื ืืืฉืคืื ืืืชืื ื. ืืฉ ืืืื ืืืจืื ืฉืื ืื ื ืขืืฉืื ืืื ืืืืืช ืืงืฆืืขืืื ืืื ืื ื ืืชื ืื ืืืืจืื ืืขืฉืืช ืืฉืืืื ื.
ืืืจืืง ืขื ืืืืืจื ืื ืืืขืช ืืื ืื ืืืคืื ืืช ืื ืืืืืืืืืืื. ืืืงืื ืืืืื "ืขืืืฃ ืฉืืคืชืืื ืืชืจืืื ืืื ืืืช ืืืืืจืืชืืื ืืืชื ื ืืื ืฉื DevOps ืืืชืงืื ืืช ืืฉืจืชืื. ืืฉืืคืชืืื ืืชืงืื ืื ืฉืจืชืื ืื ืจืง ืืืฆืจืื ืืขืืืช ืืืืื" ืืคืฉืจ ืืืืื "ืื ื ืืจืืข ืืขืืืคื ืืืชืืงื ืืืืืืจืืชืืืงื ืืืืช ืืืื ืืขื ืืื ืืื ืืื ืืืืื ืืืชืจ ืขื ืืชืงื ืช ืฉืจืชืื".
ืื ืืกืืคืืจ ืฉืื ืื ื ืืกืคืจืื ืืขืฆืื ื ืืืื ืืืืืช ืืขืชืื ืืกื ืืฆืืืื. ืขืืืฃ ืืืฉืืืจ ืืช ืืืืช ืืืืช ืคืชืืื.
ยกYa disponible! Investigaciรณn de Telegram 2025 โ los principales insights del aรฑo 
