uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

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

Ko'proq ko'rsatish
1 419
Obunachilar
Ma'lumot yo'q24 soatlar
-17 kunlar
+230 kunlar
Postlar arxiv
ToCode
1 419
# ื”ื™ื•ื ืœืžื“ืชื™: ืฉื™ื ื•ื™ ืฉื ื‘ git ืฉืืœื” ืฉืœ ืœืงื•ื—ื” ืฉืœื—ื” ืื•ืชื™ ืœื—ืคืฉ ืžื” ื’ื™ื˜ ืขื•ืฉื” ื›ืฉื”ื•ื ื›ื•ืชื‘ ืœื ื• ืฉืงื•ื‘ืฅ ืฉื™ื ื” ืืช ื”ืฉื - ื•ื”ืชืฉื•ื‘ื” ื”ืคืชื™ืขื” ืืคื™ืœื• ืื•ืชื™. ื‘ื•ืื• ื ืคืชื— ืžืื’ืจ ื‘ืฉื‘ื™ืœ ืœืจืื•ืช ื™ื—ื“. ืื ื™ ื‘ืชื™ืงื™ื” ื—ื“ืฉื” ื›ื•ืชื‘:
$ git init .
$ echo hello > file1.txt
$ git add .
$ git commit -m 'initial commit'
ื•ืขื›ืฉื™ื• ื ืฉื ื” ืœืงื•ื‘ืฅ ืืช ื”ืฉื:
$ git mv file1.txt file2.txt
$ git status

On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        renamed:    file1.txt -> file2.txt
        
$ git commit -m 'rename'
ื•ืืคืฉืจ ืœืจืื•ืช ืืช ืฉื™ื ื•ื™ ื”ืฉื ื’ื ื‘ืฆืคื™ื” ื‘ืœื•ื’:
$ git log -p --oneline

25ccbd7 (HEAD -> main) rename
diff --git a/file1.txt b/file2.txt
similarity index 100%
rename from file1.txt
rename to file2.txt
0e6c0e3 initial commit
diff --git a/file1.txt b/file1.txt
new file mode 100644
index 0000000..ce01362
--- /dev/null
+++ b/file1.txt
@@ -0,0 +1 @@
+hello
ืขื›ืฉื™ื• ืื ื—ื ื• ื™ื•ื“ืขื™ื ืฉื›ืœ ืงื•ืžื™ื˜ ื‘ git ื”ื•ื ื‘ืกืš ื”ื›ืœ Snapshot ืฉืœ ื›ืœ ื”ืงื‘ืฆื™ื ื‘ืคืจื•ื™ืงื˜. ืื ื—ื ื• ื™ื•ื“ืขื™ื ืฉื’ื™ื˜ ืœื ืฉื•ืžืจ ืฉื™ื ื•ื™ื™ื ื‘ื™ืŸ ืงื•ืžื™ื˜ื™ื ื•ื›ืฉืื ื—ื ื• ืžื ืกื™ื ืœืžืฆื•ื ืฉื™ื ื•ื™ื™ื ื”ื•ื ืžืฉื•ื•ื” ื‘ื–ืžืŸ ืืžืช ื‘ื™ืŸ ื”ืงื•ืžื™ื˜ื™ื ื›ื“ื™ ืœื–ื”ื•ืช ืืช ื”ืฉื™ื ื•ื™ื™ื. ื‘ืžื™ืœื™ื ืื—ืจื•ืช ืื ื—ื ื• ื™ื•ื“ืขื™ื ืฉืžื‘ื—ื™ื ืช ื’ื™ื˜ ื›ืœ ืงื•ืžื™ื˜ ื”ื•ื ืคืชื™ืช ืฉืœื’ ื™ื™ื—ื•ื“ื™ ืฉืžื›ื™ืœ ืืช ื›ืœ ื”ืžื™ื“ืข ืฉืœ ื”ืคืจื•ื™ืงื˜. ืื– ืื™ืš ื’ื™ื˜ ื™ื•ื“ืข ืฉืงื•ื‘ืฅ ืฉื™ื ื” ืืช ื”ืฉื ื‘ื™ืŸ ืงื•ืžื™ื˜ื™ื? ืื™ืคื” ื”ืžื™ื“ืข ื”ื–ื” ื ืฉืžืจ? ... ืžืกืชื‘ืจ ืฉื‘ืฉื•ื ืžืงื•ื. ื”ืžืคืชื— ื”ื•ื ื” similiarity index ืฉืœ ื”ืงื‘ืฆื™ื. ื›ืฉืื™ื ื“ืงืก ื–ื” ื’ื‘ื•ื” ื’ื™ื˜ ืžื ื™ื— ื‘ืกื‘ื™ืจื•ืช ื’ื‘ื•ื”ื” ืฉืžื“ื•ื‘ืจ ื‘ืื•ืชื• ืงื•ื‘ืฅ ืฉืคืฉื•ื˜ ืฉื™ื ื” ืืช ื”ืฉื. ื–ืืช ื’ื ื”ืกื™ื‘ื” ืฉื’ื™ื˜ ื™ื›ื•ืœ ืœื–ื”ื•ืช ืœื‘ื“ ื›ืฉืงื•ื‘ืฅ ืฉื™ื ื” ืืช ืฉืžื•, ื•ืฉืœืคืขืžื™ื ื”ื•ื ื˜ื•ืขื” ื‘ื–ื™ื”ื•ื™. ื›ืœ ื–ื” ื”ื•ื ื‘ืกืš ื”ื›ืœ ื˜ืงืกื˜ ื™ืคื” ืฉื’ื™ื˜ ืžืฉืชืžืฉ ื‘ื• ื›ื“ื™ ืœื”ืกื‘ื™ืจ ืœื ื• ื“ื‘ืจื™ื ืฉื”ื•ื ื—ื•ืฉื‘ ืฉืื•ืœื™ ืงืจื•, ืื‘ืœ ื‘ืขืฆื ืื™ืŸ ืœื• ื“ืจืš ืžื“ื•ื™ืงืช ืœื“ืขืช ืืช ื–ื”. ื•ื”ื˜ืจื™ืง ืœื”ื™ื•ื ื”ื•ื ื”ืžืชื’ --no-renames ืฉืืคืฉืจ ืœืฆืจืฃ ืœื”ืจื‘ื” ืคืงื•ื“ื•ืช ื’ื™ื˜ ื›ื“ื™ ืœื›ื‘ื•ืช ืืช ืžื ื’ื ื•ืŸ ื–ื™ื”ื•ื™ ืฉื™ื ื•ื™ื™ ื”ืฉื. ื›ืš ืื•ืชื• ื”ืœื•ื’ ื™ืจืื” ื‘ืœื™ ื”ืžื ื’ื ื•ืŸ:
$ git log -p --oneline --no-renames
25ccbd7 (HEAD -> main) rename
diff --git a/file1.txt b/file1.txt

deleted file mode 100644
index ce01362..0000000
--- a/file1.txt
+++ /dev/null
@@ -1 +0,0 @@
-hello
diff --git a/file2.txt b/file2.txt

new file mode 100644
index 0000000..ce01362
--- /dev/null
+++ b/file2.txt
@@ -0,0 +1 @@
+hello
0e6c0e3 initial commit
diff --git a/file1.txt b/file1.txt

new file mode 100644
index 0000000..ce01362
--- /dev/null
+++ b/file1.txt
@@ -0,0 +1 @@
+hello
ื”ืคืขื ื‘ืžืงื•ื ืฉื™ื ื•ื™ ืฉื ื™ืฉ ืœื ื• ืžื—ื™ืงื” ื•ื™ืฆื™ืจื” ืฉืœ ืงื•ื‘ืฅ ื—ื“ืฉ. ืขื‘ื•ืจ ืื•ืชื• ืœื•ื’. ื’ื diff ื™ื›ื•ืœ ืœืงื‘ืœ ืื•ืชื• ื˜ื™ืคื•ืœ ื•ื”ื ื” ืฉืชื™ ื”ืืคืฉืจื•ื™ื•ืช:
$ git diff --name-status HEAD~
R100    file1.txt       file2.txt

$ git diff --name-status --no-renames HEAD~
D       file1.txt
A       file2.txt
ื”ื‘ื—ื™ืจื” ืœื”ืฉืชืžืฉ ื‘ืžื ื’ื ื•ืŸ ื–ื™ื”ื•ื™ ืฉื™ื ื•ื™ ื”ืฉืžื•ืช ืฉืœ ื’ื™ื˜ ื”ื™ื ืฉืœื›ื, ื•ื”ื™ื ืœื ืงืฉื•ืจื” ืœืชื•ื›ืŸ ื”ืงื‘ืฆื™ื ืขืฆืžื ืฉื ืฉืžืจื™ื ื‘ืžืื’ืจ. ืœืคืขืžื™ื ืžื ื’ื ื•ืŸ ื–ื” ื ื•ื— ื•ืขื•ื–ืจ ืœืจืื•ืช ืžื” ืงืจื” ื‘ืœื•ื’ ื‘ืฆื•ืจื” ื™ื•ืชืจ ืžื“ื•ื™ืงืช, ืื‘ืœ ื›ืฉื”ื•ื ืœื ืขื•ื–ืจ ืœื›ื ืืœ ืชืชื‘ื™ื™ืฉื• ืœื›ื‘ื•ืช ืื•ืชื•.

ToCode
1 419
# ื’ื‘ื•ืœื•ืช ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ืฉืœ ืฉืจืช Express ื”ื™ื ืœืืคืฉืจ ื”ืขืœืื” ืฉืœ ืงื‘ืฆื™ื ืขื“ 1 ืžื’ื”. ื–ื” ืื•ืžืจ ืฉืื ืืชื ื›ื•ืชื‘ื™ื ืงื•ื“ ื•ื‘ื•ื“ืงื™ื ืื•ืชื• ื‘ืขืฆืžื›ื ืจืง ืขื ืงื‘ืฆื™ื ืงื˜ื ื™ื, ื›ืฉืชื’ื™ืขื• ืœืคืจื•ื“ืงืฉืŸ ื›ื ืจืื” ืชื’ืœื• ืชืงืœื•ืช ืžืคืชื™ืขื•ืช. ืื‘ืœ ืื ืืชื ืžื›ื™ืจื™ื ืืช ื”ื’ื‘ื•ืœ ืืชื ื™ื•ื“ืขื™ื ืฉื‘ื™ื™ืฉื•ื Express ืฉืžืืคืฉืจ ื”ืขืœืืช ืงื‘ืฆื™ื ืชืžื™ื“ ื›ื“ืื™ ืœื‘ื“ื•ืง ืขืœ ืงื•ื‘ืฅ ืฉืœ ืžื’ื” ื•ื—ืฆื™ ืื• ืฉื ื™ื™ื - ืจืง ืœื™ืชืจ ื‘ื™ื˜ื—ื•ืŸ. ื•ื‘ืื•ืคืŸ ื›ืœืœื™, ื›ืฉืื ื—ื ื• ืžื›ื™ืจื™ื ื’ื‘ื•ืœ ื•ื™ื•ื“ืขื™ื ืฉืคื™ืฆ'ืจ ืžืกื•ื™ื ื‘ื˜ื›ื ื•ืœื•ื’ื™ื” ืžืกื•ื™ืžืช ื“ื•ืจืฉ ื˜ื™ืคื•ืœ ืžื™ื•ื—ื“ (ืกื“ืจ ืงื•ื ื˜ื™ื™ื ืจื™ื ื‘ื“ื•ืงืจ, ืกื™ืžื ื™ื ืžื™ื•ื—ื“ื™ื ื‘ SQL, ืจืฉื™ืžื•ืช ืืจื•ื›ื•ืช ื‘ืจื™ืืงื˜, ื’ื™ื‘ื•ื™ ืฉืžืคืกื™ืง ื‘ืืžืฆืข ื‘ืชื•ื›ื ืช ื’ื™ื‘ื•ื™) ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื‘ื“ื•ืง ืืช ื”ืชื ืื™ ื”ืžื™ื•ื—ื“ ื‘ื›ืœ ืžืขืจื›ืช ื—ื“ืฉื” ืฉื ื›ืชื•ื‘ ืžื”ืกื•ื’ ื”ื–ื”, ื•ืœื•ื•ื“ื ืฉื”ืชื ืื™ ื”ื–ื” ื˜ื•ืคืœ ื›ืฉืื ื—ื ื• ืขื•ื‘ืจื™ื ืขืœ ืงื•ื“ ืฉืœ ืื—ืจื™ื ื‘ Code Review. ื›ืฉืืชื ืœื•ืžื“ื™ื ื˜ื›ื ื•ืœื•ื’ื™ื” ื—ื“ืฉื” ื—ืคืฉื• ืืช ื”ื’ื‘ื•ืœื•ืช. ื”ื™ื›ืจื•ืช ืื™ืชื ืชื—ืกื•ืš ื”ืจื‘ื” ื‘ืขื™ื•ืช ื‘ืžืขื‘ืจ ืž Tutorial ืœืขื•ืœื ื”ืืžื™ืชื™.

ToCode
1 419
$ pip install -r requirements.txt
ื•ืื– ืœื”ืคืขื™ืœ ืืช ืฉืจืช ื”ืคื™ื™ืชื•ืŸ ืขื:
$ python main.py
ื•ืœื‘ืกื•ืฃ ืœื”ืคืขื™ืœ ืืช ืฉืจืช ื”ืคื™ืชื•ื— ืœืฆื“ ืœืงื•ื— ืขื:
$ cd frontend
$ yarn dev
ื ืกื• ืœื”ื™ื›ื ืก ืœ localhost:3000 ืžืžืกืคืจ ื—ืœื•ื ื•ืช ื•ืœื›ืชื•ื‘ ื˜ืงืกื˜ ื‘ืชื™ื‘ื”. ืื ื”ื›ืœ ืขื•ื‘ื“ ื›ืžื• ืฉืฆืจื™ืš ืืชื ืชืจืื• ืืช ื”ื˜ืงืกื˜ ืžื•ืขืชืง ืœื›ืœ ื”ื—ืœื•ื ื•ืช ื”ืื—ืจื™ื.

ToCode
1 419
# ื”ื“ื’ืžืช ืคื™ืชื•ื— ืชืงืฉื•ืจืช ื“ื•-ื›ื™ื•ื•ื ื™ืช ื‘ื™ืŸ ืฉืจืช ืคื™ื™ืชื•ืŸ ืœืœืงื•ื— ืจื™ืืงื˜ ืกืคืจื™ื™ืช socket.io ื”ื™ื ืขื“ื™ื™ืŸ ื”ื“ืจืš ื”ื›ื™ ืคืฉื•ื˜ื” ืœื‘ื ื•ืช ื—ื™ื‘ื•ืจ ืชืงืฉื•ืจืช ืืกื™ื ื›ืจื•ื ื™ ื‘ื™ืŸ ืงื•ื“ ืฆื“ ืœืงื•ื— ืœืงื•ื“ ืฆื“ ืฉืจืช. ื‘ื“ื•ื’ืžื” ื”ื™ื•ื ืื ื™ ืœื•ืงื— ืฉืจืช ืคื™ื™ืชื•ืŸ ื•ืœืงื•ื— ืจื™ืืงื˜ ื›ื“ื™ ืœื‘ื ื•ืช ืชื™ื‘ืช ื˜ืงืกื˜ ืฉืžืจืื” ืืช ืื•ืชื• ื”ื˜ืงืกื˜ ื‘ื™ืŸ ื›ืžื” ื—ืœื•ื ื•ืช - ื›ืœื•ืžืจ ืื ื—ื ื• ืžืฉื ื™ื ืืช ื”ื˜ืงืกื˜ ื‘ื—ืœื•ืŸ ืื—ื“ ื•ืื•ื˜ื•ืžื˜ื™ืช ื‘ื—ืœื•ื ื•ืช ืื—ืจื™ื ื•ื‘ืžื—ืฉื‘ื™ื ืื—ืจื™ื ื”ื˜ืงืกื˜ ื‘ืชื™ื‘ื” ืžืฉืชื ื” ื‘ื”ืชืืžื”. ## ืฆื“ ื”ืฉืจืช: ืคื™ื™ืชื•ืŸ ื• Socket IO ื”ืกืคืจื™ื” python-socketio ืžืกืคืงืช ืžื™ืžื•ืฉ ื ื•ื— ืœืคืจื•ื˜ื•ืงื•ืœ SocketIO ื‘ืฆื“ ืฉืจืช ื‘ืคื™ื™ืชื•ืŸ. ื–ื• ืกืคืจื™ื™ืช ืžืขื˜ืคืช ืฉื™ื›ื•ืœื” ืœื”ืฉืชืžืฉ ื‘ืžืกืคืจ ืกืคืจื™ื•ืช ื ื™ื”ื•ืœ ืื™ืจื•ืขื™ื ื‘ืฉื‘ื™ืœ ื”ืชืงืฉื•ืจืช, ื•ืื ื™ ื”ืœื›ืชื™ ืขืœ ืžื™ืžื•ืฉ ื‘ aiohttp. ื”ื—ืœืง ื”ืžืขื ื™ื™ืŸ ื‘ืงื•ื“ ืฆื“ ื”ืฉืจืช ื”ื•ื ื‘ืœื•ืงื™ื ืžื”ืฆื•ืจื” ื”ื–ื•:
@sio.on('message')
async def print_message(sid, message):
    print("Socket ID: " , sid)
    print(message)
    await sio.emit('message', message, broadcast=True);
ื›ืœ ืžืชื•ื“ื” ืฉืžืกื•ืžื ืช ืขื ื” Decorator ืฉืœ SocketIO ืชื”ื™ื” ืžืชื•ื“ื” ืฉืžืื–ื™ื ื” ืœืื™ืจื•ืข. ื‘ืงื•ื“ ื”ื“ื•ื’ืžื” ืžืื–ื™ื ื™ื ืœืื™ืจื•ืข ื‘ืฉื message. ื”ืคื•ื ืงืฆื™ื” emit ืฉื•ืœื—ืช ืื™ืจื•ืขื™ื ื”ื—ื•ืฆื” ื•ื”ืคืจืžื˜ืจ broadcast ื’ื•ืจื ืœืคืจืžื˜ืจ ืœื”ื™ืฉืœื— ืœื›ืœ ื”ืœืงื•ื—ื•ืช. ื–ื” ื ื•ื— ืœืชื™ื‘ืช ื˜ืงืกื˜ ืฉืฆืจื™ื›ื” ืœื”ื™ื•ืช ืžืกื•ื ื›ืจื ืช ื‘ื™ืŸ ื›ืžื” ืžื›ื•ื ื•ืช ื›ื“ื™ ืฉื›ืœ ืฉื™ื ื•ื™ ื‘ืžื›ื•ื ื” ืื—ืช ืื•ื˜ื•ืžื˜ื™ืช ื™ื™ืฉืœื— ืœื›ืœ ื”ืžื›ื•ื ื•ืช ื”ืื—ืจื•ืช. ืงื•ื“ ื”ืฉืจืช ื”ืžืœื ื”ื•ื ื‘ืกืš ื”ื›ืœ ืงื•ื‘ืฅ ืคื™ื™ืชื•ืŸ ืื—ื“ ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
from aiohttp import web
import socketio

static_files = {
    '/static': './frontend/dist',
}


sio = socketio.AsyncServer(cors_allowed_origins='*', aync_mode='aiohttp')
app = web.Application()
app.add_routes([web.static('/static', './public')])

sio.attach(app)

@sio.on('message')
async def print_message(sid, message):
    print("Socket ID: " , sid)
    print(message)
    await sio.emit('message', message, broadcast=True);

if __name__ == '__main__':
    web.run_app(app)
ืื ื™ ื”ื•ืกืคืชื™ CORS Headers ื›ื“ื™ ืฉื™ื”ื™ื” ื ื•ื— ื‘ืžืฆื‘ ืคื™ืชื•ื— ืœื”ืคืขื™ืœ ืฉืจืช Webpack ื•ืœื”ืชื—ื‘ืจ ืžืžื ื• ืœืฉืจืช ื” SocketIO (ื›ืœ ืื—ื“ ืžื”ื ืจืฅ ืขืœ ืคื•ืจื˜ ืื—ืจ). ื‘ืžืฆื‘ ื™ื™ืฆื•ืจ ืืคืฉืจ ืœื•ื•ืชืจ ืขืœ ื–ื” ื•ืœื”ื’ื™ืฉ ืืช ื”ืงื‘ืฆื™ื ืžืื•ืชื• ื“ื•ืžื™ื™ืŸ ื“ืจืš nginx ืื• ื‘ืืžืฆืขื•ืช ืžื ื’ื ื•ืŸ ื” Static Files ืฉืœ ืฉืจืช aiohttp. ## ืฆื“ ื”ืœืงื•ื—: ืจื™ืืงื˜ ื• socket.io-react-hook ื‘ืฆื“ ื”ืœืงื•ื— ื”ืงื•ื“ ืžื—ื•ืœืง ืœืฉื ื™ ืงื‘ืฆื™ื: ื‘ืงื•ื‘ืฅ ื” index.js ืื• main.js (ืชืœื•ื™ ื‘ืชื‘ื ื™ืช ื”ืคืจื•ื™ืงื˜ ืฉืœื›ื) ืื ื™ ืฆืจื™ืš ืœื”ื•ืกื™ืฃ ืืœืžื ื˜ ื‘ืฉื IoProvider ืžืกื‘ื™ื‘ ืœื›ืœ ื”ืืคืœื™ืงืฆื™ื” ืฉืœื™:
import React from 'react'
import ReactDOM from 'react-dom'
import './index.css'
import App from './App'

import { IoProvider } from 'socket.io-react-hook';

ReactDOM.render(
  <React.StrictMode>
    <IoProvider>
      <App />
    </IoProvider>
  </React.StrictMode>,
  document.getElementById('root')
)
ื•ื”ื—ืœืง ื”ืžืขื ื™ื™ืŸ ื”ื•ื ื”ืงื•ืžืคื•ื ื ื˜ื” ืขืฆืžื”: ืฉื ืื ื™ ืžืฉืชืžืฉ ื‘ Hooks ื”ื‘ืื™ื: 1. ื”ืคื•ื ืงืฆื™ื” useSocket ืžืชื—ื‘ืจืช ืœืฉืจืช Socket IO ืžืจื•ื—ืง. 2. ื”ืคื•ื ืงืฆื™ื” useSocketEvent ืžืชื—ื‘ืจืช ืœืื™ืจื•ืข ืฉื”ืฉืจืช ื™ื›ื•ืœ ืœืฉืœื•ื—, ื•ื›ืœ ืคืขื ืฉื”ืฉืจืช ืฉื•ืœื— ืืช ื”ืื™ืจื•ืข ืื•ื˜ื•ืžื˜ื™ืช ืชื’ืจื•ื ืœ Render ืžื—ื“ืฉ ืฉืœ ื”ืงื•ืžืคื•ื ื ื˜ื”. ื‘ืขื–ืจืช useEffect ืื ื™ ืžื—ื‘ืจ ื‘ื™ืŸ ื”ืื™ืจื•ืข ืฉื—ื•ื–ืจ ืž useSocketEvent ืœื˜ืงืกื˜ ืฉืžื•ืฆื’: ื›ืœ ืคืขื ืฉืงื™ื‘ืœื ื• ื”ื•ื“ืขื” ืžื”ืฉืจืช ื ื‘ื“ื•ืง ืื ื”ื™ื ืฉื•ื ื” ืžื”ื˜ืงืกื˜ ืฉืฉืžื•ืจ ืืฆืœื ื• ื ืฆื™ื’ ืื•ืชื” ื‘ืขื–ืจืช ืฉืžื™ืจืชื” ืœืžืฉืชื ื” ื” State. ื”ืงื•ื“ ื”ืžืœื ื‘ืงื•ื‘ืฅ App.jsx ื ืจืื” ื›ืš:
import './App.css'
import { useState, useEffect } from 'react';
import { useSocket, useSocketEvent } from 'socket.io-react-hook';

function App() {
  const [text, setText] = useState('');
  const { socket, error } = useSocket('http://localhost:8080');  
  const { lastMessage } = useSocketEvent(socket, 'message');

  useEffect(function() {
    if (lastMessage && lastMessage !== text) {
      setText(lastMessage);
    }
  }, [lastMessage]);

  if (error) {
    return <p>{String(error)}</p>
  }

  function handleChange(e) {
    setText(e.target.value);
    socket.emit('message', e.target.value);
  }

  return (
    <div>
      <input type="text" value={text} onChange={handleChange} />
      <p>Last message = {lastMessage}</p>
    </div>
  );
}

export default App
## ืื™ืš ืžืคืขื™ืœื™ื ืื ืืชื ืจื•ืฆื™ื ืœืฉื—ืง ืขื ื”ืคืจื•ื™ืงื˜ ืชืฉืžื—ื• ืœืฉืžื•ืข ืฉืฉืžืชื™ ืืช ื›ืœ ื”ืงื•ื“ ื‘ื’ื™ื˜ื”ืื‘ ื‘ืžืื’ืจ https://github.com/ynonp/python-socketio-demo. ื‘ืฉื‘ื™ืœ ืœื”ืคืขื™ืœ ืื•ืชื• ืฆืจื™ืš ืœื”ืจื™ืฅ ืงื•ื“ื ื›ืœ ืืช ื”ื”ืชืงื ื•ืช ื‘ืคื™ื™ืชื•ืŸ ืขื:

ToCode
1 419
# ืืชื’ืจ ืจื™ืคืงื˜ื•ืจื™ื ื’ ื‘ JavaScript ื™ื ื™ื‘ ื”ื™ื” ืฆืจื™ืš ืคื•ื ืงืฆื™ื” ืฉืžื—ื–ื™ืจื” ืงื•ื“ HTML ืœืืœืžื ื˜ ืงื™ืฉื•ืจ ืœืคื™ ืžืกืคืจ ืžืืคื™ื™ื ื™ื. ื”ืคื•ื ืงืฆื™ื” ืžืงื‘ืœืช ืื•ื‘ื™ืงื˜ ื‘ืฉื props ื•ืชื•ืžื›ืช ื‘ืžืืคื™ื™ื ื™ื ื”ื‘ืื™ื: 1. ืื ื”ืื•ื‘ื™ืงื˜ ืžื›ื™ืœ ืืช ื”ืžืืคื™ื™ืŸ href ืื– ืœ a ื™ื”ื™ื” href ืขื ื”ืขืจืš ื”ืžืชืื™ื. ืื—ืจืช ืœื ื™ื”ื™ื” ืœื•. 2. ืื ื”ืื•ื‘ื™ืงื˜ ืžื›ื™ืœ ืืช ื”ืืœืžื ื˜ title ืื– ืœ a ื™ื”ื™ื” title ืขื ื”ืขืจืš ื”ืžืชืื™ื. ืื—ืจืช ืœื ื™ื”ื™ื” ืœื•. 3. ืื ื”ืื•ื‘ื™ืงื˜ ืžื›ื™ืœ ืืช ื”ืืœืžื ื˜ text ืื– ืœ a ื™ื”ื™ื” ื˜ืงืกื˜ ืขื ื”ืขืจืš ืฉืขื‘ืจ. ื–ืืช ื”ืคื•ื ืงืฆื™ื” ืฉื™ื ื™ื‘ ื›ืชื‘:
function showLink(props) {
  return (
    `<a
      ${props.href ? `href="${props.href}"` : ''}
      ${props.title ? `title="${props.title}"` : ''}
      >${props.text ? props.text : ''}
    </a>`
  );
}
ื›ืฉื“ื ื” ื”ืกืชื›ืœื” ืขืœ ื”ืงื•ื“ ื”ื™ื ื”ืจื’ื™ืฉื” ืฉื”ืคื•ื ืงืฆื™ื” ืžืกื•ืจื‘ืœืช ืžื“ื™. ื”ื™ื ื”ืฆื™ืขื” ืœืฉื›ืชื‘ ืื•ืชื” ื‘ืขื–ืจืช ืฉืชื™ ืคื•ื ืงืฆื™ื•ืช ืขื–ืจ ืœืงื•ื“ ื”ื‘ื:
function showLinkBetter(props) {
  const { href, title } = attrs(props);
  const { text } = values(props);

  return (
    `<a ${href} ${title}>${text}</a>`
  );
}
"ื•ื™ื•ืชืจ ืžื–ื”", ื”ืชืœื”ื‘ื” ื“ื ื”, "ืขื ืคื•ื ืงืฆื™ื•ืช ื”ืขื–ืจ ืฉืœื™ ืืชื” ื™ื›ื•ืœ ืœืชืžื•ืš ื‘ืžืืคื™ื™ื ื™ื ื—ื“ืฉื™ื ื‘ืฆื•ืจื” ืงืœื” ื‘ืœื™ ืœืฉื ื•ืช ืืช ื”ืคื•ื ืงืฆื™ื•ืช attrs ื• values ืฉื›ืชื‘ืชื™ - ืจืง ืชื•ืš ืฉื™ื ื•ื™ ื”ืคื•ื ืงืฆื™ื” showLinkBeter". ืื™ืš ื ืจืื” ื”ืžื™ืžื•ืฉ ืฉืœ attrs ื• values ืฉื“ื ื” ื›ืชื‘ื”? ## ืคื™ืชืจื•ืŸ ื”ื‘ืขื™ื” ืฉื“ื ื” ื”ื™ืชื” ืฆืจื™ื›ื” ืœื”ืชืžื•ื“ื“ ืื™ืชื” ื”ื™ื ืœื ื˜ืจื™ื•ื•ื™ืืœื™ืช: ื™ืฉ ืœืฉื ื•ืช ืืช ื›ืœ ื”ืขืจื›ื™ื ื‘ืื•ื‘ื™ืงื˜, ื›ื•ืœืœ ื›ืืœื” ืฉื‘ื›ืœืœ ืœื ื ืžืฆืื™ื ื‘ื•! ื”ืื•ื‘ื™ืงื˜ ืฉ attrs ืžื—ื–ื™ืจื” ืฆืจื™ืš ืœื“ืขืช ืœื”ื—ื–ื™ืจ ืžื—ืจื•ื–ืช ืจื™ืงื” ืขื‘ื•ืจ ื›ืœ ืžืคืชื— ืฉื™ื‘ืงืฉื• ืžืžื ื• ื•ืฉืœื ื ืžืฆื ื‘ืื•ื‘ื™ืงื˜ ื” props. ื“ืจืš ืื—ืช ืœื’ืฉืช ืœืคืชื•ืจ ืืช ื–ื” ื”ื™ื ืœื“ื—ื•ืช ืืช ื”ื—ื™ืฉื•ื‘ ืฉืœ ืขืจืš ื”ื”ื—ื–ืจ ืขื“ ืฉื‘ืืžืช ืžื™ืฉื”ื• ืžื‘ืงืฉ ืžืคืชื— ื›ืœืฉื”ื•. ื‘ JavaScript ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœืขืฉื•ืช ืืช ื–ื” ืขื ื”ื’ื“ืจืช Getter (ืื‘ืœ ืื– ื ืฆื˜ืจืš ืœื“ืขืช ืื™ืš ืงื•ืจืื™ื ืœืžืคืชื—), ืื• ืขื ื”ื’ื“ืจืช Proxy. ืื ื™ ืœื ื™ื•ื“ืข ืžื” ื“ื ื” ื›ืชื‘ื”, ืื‘ืœ ื–ื” ื”ืคื™ืชืจื•ืŸ ืฉืื ื™ ื”ื™ื™ืชื™ ื›ื•ืชื‘ ื‘ืขื–ืจืช proxy ื›ื“ื™ ืœืžืžืฉ ืืช attrs ื• values:
function returnTextProxy(props, withPrefix) {
  return new Proxy(props, {
    get: function(target, prop, _receiver) {
      if (target[prop]) {
        return withPrefix ? `${prop}="${target[prop]}"` : target[prop];
      } else {
        return "";
      }
    }
  });
}

function attrs(props) {
  return returnTextProxy(props, true);
}

function values(props) {
  return returnTextProxy(props, false);
}
ื™ืฉ ืœื›ื ืจืขื™ื•ื ื•ืช ืื—ืจื™ื? ืืœ ืชืชื‘ื™ื™ืฉื• ื•ืฉืชืคื• ื‘ืชื’ื•ื‘ื•ืช.

ToCode
1 419
# ื”ื™ื•ื ืœืžื“ืชื™: ืืจื›ื™ื˜ืงื˜ื•ืจื•ืช ื• Docker Images ืื—ื“ ื”ื“ื‘ืจื™ื ืฉืžื‘ืœื‘ืœื™ื ื‘ืขื‘ื•ื“ื” ืขื ื“ื•ืงืจ ื–ื” ื”ื“ืžื™ื•ืŸ (ื•ื”ื”ื‘ื“ืœ) ื‘ื™ืŸ ืงื•ื ื˜ื™ื™ื ืจื™ื ืœืžื›ื•ื ื•ืช ื•ื™ืจื˜ื•ืืœื™ื•ืช. ื”ื™ื™ื ื• ืžืื•ื“ ืจื•ืฆื™ื ืœื—ืฉื•ื‘ ืขืœ ืงื•ื ื˜ื™ื™ื ืจ ื‘ืชื•ืจ ืžืฉื”ื• ืฉืืคืฉืจ ืœื”ืจื™ืฅ ื‘ื›ืœ ืžืงื•ื, ืื‘ืœ ืžืฆื“ ืฉื ื™ ืื ื—ื ื• ื’ื ื™ื•ื“ืขื™ื ืฉืื™ืžื’' ื”ื•ื ืœื ืžื—ืฉื‘ ืžืœื ื•ื™ืฉ ื“ื‘ืจื™ื ืฉื”ื•ื ืœื•ืงื— ืžืžืขืจื›ืช ื”ื”ืคืขืœื”. ืื™ืš ืฉื ื™ ื”ื“ื‘ืจื™ื ื”ืืœื” ืžืกืชื“ืจื™ื ื™ื—ื“? ื”ื ื” ืขื™ืงืจื™ ื”ื“ื‘ืจื™ื: 1. ื‘ื‘ื ื™ื™ืช Docker Image ืื ื—ื ื• ื‘ื•ื ื™ื ืื™ืžื’' ืกืคืฆื™ืคื™ ืœืืจื›ื™ื˜ืงื˜ื•ืจืช ื”ืžืขื‘ื“ ื•ืœืžืขืจื›ืช ื”ื”ืคืขืœื” ืขืœื™ื” ืื ื—ื ื• ืžืจื™ืฆื™ื ืืช ืชื”ืœื™ืš ื”ื‘ื ื™ื”. 2. ื”ืžื ื•ืข ืฉืžืจื™ืฅ ืืช ื” build ืœื ื—ื™ื™ื‘ ืœื”ื™ื•ืช ื–ื”ื” ืœืžืขืจื›ืช ื”ื”ืคืขืœื” ืฉื™ืฉ ืœื›ื ืขืœ ื”ืžื—ืฉื‘, ื•ื–ื” ื”ื—ืœืง ื”ืžื‘ืœื‘ืœ. ื‘ Windows ืื ื—ื ื• ื‘ื“ืจืš ื›ืœืœ ืžืจื™ืฆื™ื ืืช ื” build ืžืžื ื•ืข ืฉืจืฅ ื‘ WSL ื›ืœื•ืžืจ ื‘ืžื›ื•ื ืช ืœื™ื ื•ืงืก ื•ื™ืจื˜ื•ืืœื™ืช. ื“ื•ืงืจ ืขืœ ื”ืžืง ืžืฉืชืžืฉ ื‘ืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช ืื—ืจืช ื›ื“ื™ ืœื”ืจื™ืฅ ืืช ื”ืžื ื•ืข, ืื‘ืœ ื’ื ื”ื™ื ืžืจื™ืฆื” ืœื™ื ื•ืงืก. ืœื›ืŸ ืื ืœื ืขืฉื™ืชื ืžืฉื”ื• ืžื•ื–ืจ ืชื”ืœื™ืš ื” build ื™ื‘ื ื” ืื™ืžื’' ืœ Linux. 3. ื”ืจื‘ื” ืื™ืžื’'ื™ื ื‘ื“ื•ืงืจ ื”ืื‘ ื ื‘ื ื• ื›ืžื” ืคืขืžื™ื, ืขื‘ื•ืจ ืžืกืคืจ ืžืขืจื›ื•ืช ื”ืคืขืœื” ื•ืืจื›ื™ื˜ืงื˜ื•ืจื•ืช ืžืขื‘ื“. ื‘ื‘ื ื™ื” ื›ื–ืืช ืžื™ ืฉืžืคืจืกื ืืช ื”ืื™ืžื’' ื‘ืขืฆื ื‘ื•ื ื” ื•ืžืคืจืกื ื›ืžื” ืื™ืžื’'ื™ื ื•ื‘ืกื•ืฃ ืžืื—ื“ ืืช ื›ื•ืœื ืœืฉื ืื—ื“ ื‘ Dockerhub. ืชืจืื• ืœืžืฉืœ ืืช ื”ืื™ืžื’' ืฉืœ ืคื™ื™ืชื•ืŸ. ื”ืชื’ 3.9.8 ืžื›ื™ืœ ืจืฉื™ืžื” ืฉืœ 11 ืื™ืžื’'ื™ื ืฉื•ื ื™ื, ื›ืœ ืื—ื“ ืœื–ื•ื’ ืื—ืจ ืฉืœ ืืจื›ื™ื˜ืงื˜ื•ืจืช ืžืขื‘ื“ ื•ืžืขืจื›ืช ื”ืคืขืœื”. 4. ื›ืœ ืคืขื ืฉืืชื ื›ื•ืชื‘ื™ื docker run ืื• docker pul ื”ืžื ื•ืข ืฉืœ ื“ื•ืงืจ ืžื—ืคืฉ ืื™ืžื’' ืฉืžืชืื™ื ืœืืจื›ื™ื˜ืงื˜ื•ืจื” ื•ืœืžืขืจื›ืช ื”ืคืขืœื” ืฉื”ื•ื ืจืฅ ื‘ื” ื›ืจื’ืข. ื–ื” ืื•ืžืจ ืฉื›ืฉืื ื™ ืื›ืชื•ื‘ docker run python ืขืœ ืžืขืจื›ืช ืœื™ื ื•ืงืก ื•ืขืœ ืžืขืจื›ืช Windows, ืื ื™ ืืงื‘ืœ ืื™ืžื’' ืฉื•ื ื” ื‘ื›ืœ ืžืขืจื›ืช. ืืคืฉืจ ืœืจืื•ืช ืืช ื–ื” ืื ืชืคืขื™ืœื• docker image ls ื‘ื›ืœ ืื—ืช ืžืฉืชื™ ื”ืžื›ื•ื ื•ืช ื•ืชืจืื• ืืช ื” Digest ื”ืฉื•ื ื”. 5. ื›ืœ ืฉืœื•ืฉืช ืžืขืจื›ื•ืช ื”ื”ืคืขืœื” ื™ื•ื“ืขื•ืช ืœื‘ื ื•ืช ืื™ืžื’'ื™ื ืœ Linux ื•ืœื›ืŸ ืจื•ื‘ ื”ื–ืžืŸ ื”ื”ื‘ื“ืœื™ื ื ืฉืืจื™ื ืžื•ืกืชืจื™ื. ืื‘ืœ ื ืงื•ื“ื” ืื—ืช ืฉืงืฉื” ืœื”ืกืชื™ืจ ื”ื™ื ืืจื›ื™ื˜ืงื˜ื•ืจืช ื”ืžืขื‘ื“. ื“ื•ืงืจ ืฉืจืฅ ืขืœ ืžื—ืฉื‘ Arm ื™ื‘ื ื” ื•ื™ืจื™ืฅ ืื™ืžื’'ื™ื ืœ Arm, ื•ื“ื•ืงืจ ืฉืจืฅ ืขืœ ืžื—ืฉื‘ ืื™ื ื˜ืœ ื™ื‘ื ื” ื•ื™ืจื™ืฅ ืื™ืžื’'ื™ื ืฉืœ ืื™ื ื˜ืœ. 6. ืงืœืืกื˜ืจื™ื ื•ืงื•ื‘ืจื ื˜ืก ื›ืŸ ืจืฆื™ื ืขืœ ืืจื›ื™ื˜ืงื˜ื•ืจืช ืžืขื‘ื“ ืกืคืฆื™ืคื™ืช ื•ืฉื ื™ืฉ ืœื ื• ื‘ื—ื™ืจื” ื›ืฉืžืงื™ืžื™ื ืืช ื”ืงืœืืกื˜ืจ. ืœ AWS ื™ืฉ ืœื“ื•ื’ืžื” ืžืขื‘ื“ ืฉื ืงืจื Graviton2 ื”ืžื‘ื•ืกืก ARM ื•ืœืคื™ ื˜ืขื ืชื ื™ื›ื•ืœ ืœื—ืกื•ืš ื‘ืขืœื•ืช ื”ืงืœืืกื˜ืจ ื‘ื”ืฉื•ื•ืื” ืœืžืขื‘ื“ ืื™ื ื˜ืœ. ืื‘ืœ, ืื ื”ืื™ืžื’' ืฉืœื™ ื‘ื ื•ื™ ืจืง ื‘ืืจื›ื™ื˜ืงื˜ื•ืจืช amd64 ืื ื™ ืœื ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืงืœืืกื˜ืจ ื›ื–ื”. ืืžื–ื•ืŸ ืืคื™ืœื• ืžืกื‘ื™ืจื™ื ืื™ืš ืœื‘ื ื•ืช ืื™ืžื’' ืœืืจื›ื™ื˜ืงื˜ื•ืจืช ARM ืœืžื™ ืฉื›ืŸ ืจื•ืฆื” ืœื—ืกื•ืš. 7. ืืคืฉืจ ืœื‘ื“ื•ืง ืžื” ื”ืืจื›ื™ื˜ืงื˜ื•ืจื” ืฉื” Docker Engine ืฉืœื›ื ื›ืจื’ืข ืžืจื™ืฅ ืขื docker version. ื—ืคืฉื• ืืช ื”ืžืคืชื— OS/Arch. 8. ืžืฉืชื ื” ื”ืกื‘ื™ื‘ื” DOCKER_DEFAULT_PLATFORM ืงื•ื‘ืข ืœืื™ื–ื” ืืจื›ื™ื˜ืงื˜ื•ืจืช ื™ืขื“ ืื ื—ื ื• ื‘ื•ื ื™ื ืืช ื”ืื™ืžื’'ื™ื ื›ืฉืžืจื™ืฆื™ื docker build. ื‘ืฉื‘ื™ืœ ืœื‘ื ื•ืช ืœืžืขื‘ื“ื™ ืื™ื ื˜ืœ ื›ืฉืื ื™ ืจืฅ ืขืœ ืžื›ื•ื ืช ARM ืื ื™ ืงื•ื‘ืข ืืช ื”ืขืจืš ืœ linux/amd64. ื‘ืฉื‘ื™ืœ ืœื‘ื ื•ืช ืกื›ื™ืžื•ืช ื™ื•ืชืจ ืžืชื•ื—ื›ืžื•ืช ื™ืฉ ืžื ื’ื ื•ืŸ ืฉื ืงืจื buildx. ืœืžืจื•ืช ืฉืงื•ื ื˜ื™ื™ื ืจื™ื ืžืจื’ื™ืฉื™ื ื›ืžื• ืžืฉื”ื• ืฉืขื•ื‘ื“ ื‘ื›ืœ ืžืงื•ื ื”ืืžืช ื”ื™ื ืงืฆืช ื™ื•ืชืจ ืžื•ืจื›ื‘ืช. ื”ื‘ื ื” ื˜ื•ื‘ื” ืฉืœ ื”ืžื ื•ืข ื•ืกื‘ื™ื‘ืช ื”ืจื™ืฆื” ืฉืœื• ื™ื›ื•ืœื” ืœืขื–ื•ืจ ืœื›ื ืœื”ืชืžื•ื“ื“ ืขื ื‘ืื’ื™ื ืžื•ื–ืจื™ื ื•ืœืคืขืžื™ื ื’ื ืœื—ืกื•ืš ื‘ืขืœื•ื™ื•ืช ื”ืฉืจืชื™ื.

ToCode
1 419
const countries = Object.keys(db);
const selectedCountry = ref("");
const cities = computed(() => db[selectedCountry.value] || []);
const selectedCity = ref("");

watchEffect(() => {
  if (!cities.value.includes(selectedCity.value)) {
    selectedCity.value = '';
  }
});

</script>

<template>
<div>
  <select v-model="selectedCountry">
    <option value="" disabled="true">Please select a country</option>
    <option v-for="country in countries" :value="country">{{country}}</option>
  </select>

  <p>Selected country = {{selectedCountry}}</p>
  <pre>Cities = {{cities}}</pre>

  <select v-model="selectedCity">
    <option value="" disabled="true">Please select city</option>
    <option v-for="city in cities" :value="city">{{city}}</option>
  </select>
  <p>You selected country = {{selectedCountry}} and city = {{selectedCity}}</p>
</div>
</template>

<style scoped>
</style>

ToCode
1 419
# ื—ื™ื“ืช ืจื™ืืงื˜: ืคืจื™ื“ื” ืžืงื•ืžืคื•ื ื ื˜ื” ื ืชื•ืŸ ื”ืงื•ื“ ื”ื‘ื ืฉื›ื•ืœืœ ืฉืชื™ ืงื•ืžืคื•ื ื ื˜ื•ืช:
import React from 'react';

function Yo() {
  React.useEffect(function() {
    alert('bye bye');
  }, []);

  return <p>Yo</p>;
}

export default function App() {
  function handleClick() {
  }

  return (
    <div className="App">
      <Yo />
      <button onClick={handleClick} >Say bye bye</button>
    </div>
  );
}
ืขื“ื›ื ื• ืืช ืงื•ื“ ื”ืงื•ืžืคื•ื ื ื˜ื” App ื›ืš ืฉืœื—ื™ืฆื” ืขืœ ื”ื›ืคืชื•ืจ ืชื’ืจื•ื ืœื”ืฆื’ืช ื” alert ืฉืžื•ื’ื“ืจ ื‘ Yo. ืื™ืŸ ืฆื•ืจืš ืœืฉื ื•ืช ืืช ื”ืงื•ื“ ืฉืœ Yo ื•ืื™ืŸ ืœื‘ืฆืข ื›ืœ ืฉื™ื ื•ื™ ื•ื™ื–ื•ืืœื™ ื‘ืžืžืฉืง.

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

ToCode
1 419
ื–ื” ื”ืชืจื’ื™ืœ ื”ืจืืฉื•ืŸ ื‘ื• ื™ืฉ ื”ื‘ื“ืœ ืžืกื•ื™ื ื‘ื™ืŸ ืคื™ืชืจื•ืŸ ื”ืคื™ื™ืชื•ืŸ ื”ืžื•ืฆืข ืœืคื™ืชืจื•ืŸ ื”ืงื•ืงื ืื˜ ืฉืื ื™ ื—ืฉื‘ืชื™ ืขืœื™ื• - ื‘ืคื™ื™ืชื•ืŸ ื”ื ื™ืฆืจื• ืจืฉื™ืžื” ื—ื“ืฉื” ื•ื”ื•ืกื™ืคื• ืืœื™ื” ืืช ื”ืืœืžื ื˜ื™ื ื”ื›ืคื•ืœื™ื. ื‘ืงื•ืงื ืื˜ ื”ืฉืชืžืฉืชื™ ื‘ filter ื• map ื›ื“ื™ ืœื™ืฆื•ืจ ืืช ื”ื›ืœ ื‘ืื•ืชื• Pipeline. ื“ื‘ืจ ืื—ื“ ืฉื›ื‘ืจ ืื ื—ื ื• ืจื•ืื™ื ืฉืžื˜ืจื™ื“ ืœื’ื‘ื™ ื”ืฉืคื” ื”ื•ื ืฉืื™ืŸ ืชืžื™ื›ื” ื‘ Destructuring ื‘ืืจื’ื•ืžื ื˜ื™ื ืฉืœ ืคื•ื ืงืฆื™ื•ืช, ื•ืœื›ืŸ filter ืžื•ื’ื“ืจืช ืœืงื‘ืœ ืžืฉืชื ื” ื™ื—ื™ื“ x ื•ืฆืจื™ื›ื” ืœื’ืฉืช ืœืžืงื•ื ื”ืฉื ื™ ื‘ื• (ื‘ืžืงื•ื ืœืงื‘ืœ ื–ื•ื’ ื•ืœื‘ืฆืข ื”ืฉืžื”). ื›ืœื•ืžืจ ื”ื™ื™ืชื™ ืจื•ืฆื” ืœื›ืชื•ื‘ ืืช ื”ื‘ื™ื˜ื•ื™:
|> filter$((k, v) -> v > 1)
ืื‘ืœ ื–ื” ืœื ื”ื™ื” ืงื•ืงื ืื˜ ืชืงื ื™. ## ืžืฉื•ืœืฉ ืžืกืคืจื™ื ืชืจื’ื™ืœ ืื—ืจื•ืŸ ืœืกื™ื‘ื•ื‘ ื”ื–ื” ื”ื•ื ื”ื“ืคืกืช ืžืฉื•ืœืฉ ืžืกืคืจื™ื, ื›ืœื•ืžืจ ื›ืชื‘ื• ืชื•ื›ื ื™ืช ืฉืžื“ืคื™ืกื” ืืช ืชื‘ื ื™ืช ื”ืžืกืคืจื™ื ื”ื‘ืื”:
1 1 1 1 1 
2 2 2 2 
3 3 3 
4 4 
5
ืคื™ืชืจื•ืŸ ื‘ืฉืคืช ืคื™ื™ืชื•ืŸ:
rows = 5
x = 0
# reverse for loop from 5 to 0
for i in range(rows, 0, -1):
    x += 1
    for j in range(1, i + 1):
        print(x, end=' ')
    print('\r')
ืคื™ืชืจื•ืŸ ืฉืœื™ ื‘ืงื•ืงื ืื˜:
def triangle(size)= (
    range(size, 0, -1)
    |> map$(i -> [i, size-i + 1])
    |> map$(x -> f"{x[1]} " * x[0])
    |> '\n'.join)


print(triangle(5))
ื—ื™ืฉื•ื‘ื™ ืื™ื ื“ืงืกื™ื ืืฃ ืคืขื ืœื ื”ื™ื• ื”ืฆื“ ื”ื—ื–ืง ืฉืœื™ ืื‘ืœ ื”ืคืขื ื ืจืื” ืฉืงื•ื“ ืงื•ืงื ืื˜ ื—ื•ืกืš ืœื™ ื—ืœืง ืžื”ื—ื™ืฉื•ื‘ื™ื ื•ืžืืคืฉืจ ืœื”ืชืžืงื“ ื‘"ืžื” ืฆืจื™ืš ืœืขืฉื•ืช" ื‘ืžืงื•ื ื‘ืื™ืš. ื‘ืžืงื•ื ืœื”ืกืชื›ืœ ืขืœ ื”ื‘ืขื™ื” ื‘ืชื•ืจ ืœื•ืœืื” ื›ืคื•ืœื” ืื ื™ ืžืกืชื›ืœ ืขืœื™ื” ื›ืกื™ื“ืจื” ืฉืœ ืฉืชื™ ืคื•ื ืงืฆื™ื•ืช map ืฉืžื™ื™ืฆืจื•ืช ืืช ื”ืขืจืš ืœื”ื“ืคืกื”. ื™ืฉ ืขื•ื“ ื”ืžื•ืŸ ื“ื‘ืจื™ื ืฉ coconut ื™ื•ื“ืขืช ืœืขืฉื•ืช ื•ืœื ื”ื•ืคื™ืขื• ื›ืืŸ ื‘ื“ื•ื’ืžืื•ืช ื”ืงืฆืจื•ืช, ื‘ืคืจื˜ ื™ืฉ ื›ืžื” ืžื ื’ื ื•ื ื™ื ื ื—ืžื“ื™ื ืœืคื™ืชื•ื— ืžืงื‘ื™ืœื™ ื•ืชืžื™ื›ื” ืžื•ื‘ื ื™ืช ื‘ Pattern Matching (ืฉืขื›ืฉื™ื• ืงื™ื™ื ื›ื‘ืจ ื’ื ื‘ืคื™ื™ืชื•ืŸ). ืกืš ื”ื›ืœ ื”ืชื—ื‘ื™ืจ ื‘ืขื™ื ื™ื™ ื™ื•ืชืจ ื ื•ื— ืžืงื•ื“ ืคื™ื™ืชื•ืŸ ืžืงื‘ื™ืœ. ืœืžื™ื“ืข ื ื•ืกืฃ ืขืœ coconut ืฉื•ื•ื” ืœื‘ืงืจ ื‘ื“ืฃ ื”ืชื™ืขื•ื“ ื”ืจืืฉื™ ืฉืœื”ื ื‘ืงื™ืฉื•ืจ: https://coconut.readthedocs.io/en/master/DOCS.html.

ToCode
1 419
# ื—ืžืฉ ืชื•ื›ื ื™ื•ืช coconut ื›ื“ื™ ืœื”ื›ื™ืจ ืฉืคื” ื—ื“ืฉื” ืงื•ืงื•ื ืื˜ ื”ื™ื ืฉืคื” ืคื•ื ืงืฆื•ื ืืœื™ืช ืฉืžืชืงืžืคืœืช ืœืคื™ื™ืชื•ืŸ ื•ื ื•ืชื ืช ื’ื™ืฉื” ืžืœืื” ืœื›ืœ ื”ืืงื•ืกื™ืกื˜ื ืฉืœ ืคื™ื™ืชื•ืŸ ืื‘ืœ ื‘ื›ืชื™ื‘ ืคื•ื ืงืฆื™ื•ื ืืœื™ ืขื ื›ืœ ื”ืคื™ื ื•ืงื™ื. ืžืชืงื™ื ื™ื ืื•ืชื” ื›ืžื• ื›ืœ ืกืคืจื™ื™ืช ืคื™ื™ืชื•ืŸ ืขื:
$ pip install coconut
ื•ืื—ืจื™ ื”ื”ืชืงื ื” ืืคืฉืจ ืœื™ืฆื•ืจ ืชื•ื›ื ื™ื•ืช ืงื•ืงื•ื ืื˜ ื‘ืชื•ืš ืงื‘ืฆื™ื ืขื ืกื™ื•ืžืช coco ืื• ืœื”ืคืขื™ืœ ืืช ื” interpreter ืขื ื”ืคืงื•ื“ื” coconut ื•ืœื”ืจื™ืฅ ื‘ื™ื˜ื•ื™ื™ ืงื•ืงืื ื˜. ื•ื™ืฉ ื’ื ืกื‘ื™ื‘ืช ื”ืจืฆื” ื ื•ื—ื” ื‘ืขื ืŸ ื‘ืงื™ืฉื•ืจ: https://cs121-team-panda.github.io/coconut-interpreter/. ื‘ืฉื‘ื™ืœ ืœื”ื›ื™ืจ ืืช ื”ืฉืคื” ืœืงื—ืชื™ ืžืกืคืจ ืชืจื’ื™ืœื™ ืคื™ื™ืชื•ืŸ ื•ื ื™ืกื™ืชื™ ืœืžืžืฉ ืื•ืชื ื‘ืงื•ืงื ืื˜. ื”ืชื•ืฆืื•ืช ืœืคื ื™ื›ื: ## ื”ื™ืคื•ืš ื›ืœ ืžื™ืœื” ื‘ืžื—ืจื•ื–ืช ื ืชื•ื ื” ื”ืžื—ืจื•ื–ืช:
text = 'My Name is Jessa'
ื›ื™ืชื‘ื• ืชื•ื›ื ื™ืช ืฉืชื“ืคื™ืก ืืช ื”ืžื—ืจื•ื–ืช ืชื•ืš ื”ื™ืคื•ืš ืกื“ืจ ื”ืื•ืชื™ื•ืช ื‘ื›ืœ ืžื™ืœื”, ื›ืœื•ืžืจ ื”ืคืœื˜ ื”ืฆืคื•ื™ ื™ื”ื™ื”:
yM emaN si asseJ
ืคื™ืชืจื•ืŸ ื‘ืคื™ื™ืชื•ืŸ ืžืชื•ืš ืืชืจ ื”ืชืจื’ื•ืœ:
def reverse_words(Sentence):
    words = Sentence.split(" ")
    new_word_list = [word[::-1] for word in words]
    res_str = " ".join(new_word_list)
    return res_str

# Given String
str1 = "My Name is Jessa"
print(reverse_words(str1))
ืคื™ืชืจื•ืŸ ืฉืœื™ ื‘ coconut:
def reverse_words(sentence) = (
    sentence
       |> .split(" ")
       |> map$(n -> n[::-1])
       |> list
       |> ' '.join)

reverse_words("My Name is Jessa") |> print
ืžืื•ื“ ื“ื•ืžื” ืœืงื•ื“ ืคื™ื™ืชื•ืŸ ื”ืžืงื•ืจื™ ืื‘ืœ ื‘ื–ื›ื•ืช ื”ืฉื™ืžื•ืฉ ื‘ Pipeline Operator ืœื ืฆืจื™ืš ืœื”ื’ื“ื™ืจ ืžืฉืชื ื™ ื‘ื™ื ื™ื™ื ื•ื‘ืขืฆื ื”ืชื•ืฆืื” ืฉืœ ื›ืœ ืคื•ื ืงืฆื™ื” ืžืžืฉื™ื›ื” ืœืคื•ื ืงืฆื™ื” ื”ื‘ืื” ื‘ Pipeline. ## ื”ื—ืœืคืช ืชื•ื™ ืกื•ืฃ ืฉื•ืจื” ื‘ืจื•ื•ื—ื™ื ื›ืชื‘ื• ืชื•ื›ื ื™ืช ืฉืงื•ืจืืช ืืช ื”ืงื•ื‘ืฅ sample.txt ื•ืžื“ืคื™ืกื” ืืช ื›ืœ ื”ืฉื•ืจื•ืช ื‘ื• ืžื•ืคืจื“ื•ืช ื‘ืจื•ื•ื—ื™ื (ื‘ืžืงื•ื ื‘ืชื• ื™ืจื™ื“ืช ืฉื•ืจื”). ืคื™ืชืจื•ืŸ ืคื™ื™ืชื•ืŸ:
with open('sample.txt', 'r') as file:
    data = file.read().replace('\n', ' ')
    print(data)
ืคื™ืชืจื•ืŸ ืงื•ืงืื ืื˜ ืฉืœื™:
with open("sample.txt") as file:
    (file.read()
    |> .replace("\n", " ")
    |> print)
ืฉื•ื‘ ืžืื•ื“ ื“ื•ืžื” ืœืงื•ื“ ื”ืžืงื•ืจื™ - ื•ื–ื• ื‘ื“ื™ื•ืง ื”ืžื˜ืจื”. ืงื•ืงื ื˜ ืขื•ื–ืจืช ืœืžืชื›ื ืชื™ ืคื™ื™ืชื•ืŸ ืฉืžื›ื™ืจื™ื ืชื›ื ื•ืช ืคื•ื ืงืฆื™ื•ื ืืœื™ ืœื›ืชื•ื‘ ืงื•ื“ ื™ื•ืชืจ ื™ื“ื™ื“ื•ืชื™. ื”ื“ื‘ืจ ื”ื™ื—ื™ื“ ืฉืžืขืฆื‘ืŸ ื‘ื™ื ืชื™ื™ื ื”ื•ื ืฉื—ื™ื™ื‘ื™ื ืœื”ืงื™ืฃ ื›ืœ Pipeline ื‘ืกื•ื’ืจื™ื™ื ืื• ืœื›ืชื•ื‘ ืื•ืชื• ื‘ืฉื•ืจื” ืื—ืช. ื˜ืจื™ืง ืžืขื ื™ื™ืŸ ื ื•ืกืฃ ื›ืืŸ ื”ื•ื ื”ืงืจื™ืื” ืœ .replace. ืื ื—ื ื• ืจื’ื™ืœื™ื ืžืคื™ื™ืชื•ืŸ ืฉืœืคื ื™ ื”ืคืขืœืช ืžืชื•ื“ื” ืฆืจื™ืš ืœื‘ื•ื ืื•ื‘ื™ืงื˜, ื•ืคื” ื‘ืงื•ืงื ื˜ ืงืจื™ืื” ื–ื• ื”ื™ื Partial Application ืฉืœ ื”ืคื•ื ืงืฆื™ื”, ื›ืœื•ืžืจ ื”ื™ื ืžื™ื™ืฆืจืช ืคื•ื ืงืฆื™ื” ืฉื›ืฉื™ื’ื™ืข ืืœื™ื” ืื•ื‘ื™ืงื˜ ื”ื™ื ืคืฉื•ื˜ ืชืคืขื™ืœ ืืช ืคื•ื ืงืฆื™ื™ืช replace ืฉืœื•. ## ืžื™ืคื•ื™ ืžื™ืœื•ืŸ ื”ืคื•ืš ื‘ื”ื™ื ืชืŸ ืžื™ืœื•ืŸ:
ascii_dict = {'A': 65, 'B': 66, 'C': 67, 'D': 68}
ื›ืชื‘ื• ืชื•ื›ื ื™ืช ืฉืชื”ืคื•ืš ืืช ื”ืžืคืชื—ื•ืช ื•ื”ืขืจื›ื™ื ื•ืชื“ืคื™ืก:
{65: 'A', 66: 'B', 67: 'C', 68: 'D'}
ืคื™ืชืจื•ืŸ ื‘ืงื•ื“ ืคื™ื™ืชื•ืŸ:
ascii_dict = {'A': 65, 'B': 66, 'C': 67, 'D': 68}
# Reverse mapping
new_dict = {value: key for key, value in ascii_dict.items()}
print(new_dict)
ืคื™ืชืจื•ืŸ ื‘ืงื•ื“ ืงื•ืงื ืื˜:
({'A': 65, 'B': 66, 'C': 67, 'D': 68}
    |> fmap$((k, v) -> [v, k])
    |> print)
ื”ืคื•ื ืงืฆื™ื” fmap ืฉืœ ืงื•ืงื ื˜ ื”ื™ื ืคืฉื•ื˜ ืคื•ื ืงืฆื™ื™ืช map ื’ื ืจื™ืช ืฉืืคืฉืจ ืœื”ืคืขื™ืœ ืขืœ ื›ืœ ืื•ื‘ื™ืงื˜ ื•ื”ื™ื ืชืžื™ื“ ืขื•ืฉื” ืืช ื”ื“ื‘ืจ ื”ื ื›ื•ืŸ. ืขืœ ืžื™ืœื•ืŸ ื”ื™ื ืžืคืขื™ืœื” ืืช ื”ืคื•ื ืงืฆื™ื” ืขืœ ื” items ืฉืœ ื”ืžื™ืœื•ืŸ ื•ื–ื” ื‘ืขืฆื ืžื—ืœื™ืฃ ืืช ื” Dictionary Comprehension ืฉืจืื™ื ื• ื‘ืคื™ื™ืชื•ืŸ. ## ื”ื“ืคืกืช ื›ืœ ื”ืขืจื›ื™ื ื‘ืจืฉื™ืžื” ืฉืžื•ืคื™ืขื™ื ื™ื•ืชืจ ืžืคืขื ืื—ืช ื‘ื”ื™ื ืชืŸ ืจืฉื™ืžื” ืฉืœ ืžืกืคืจื™ื:
sample_list = [10, 20, 60, 30, 20, 40, 30, 60, 70, 80]
ื”ืฆื™ื’ื• ืืช ื›ืœ ื”ืคืจื™ื˜ื™ื ืžื”ืจืฉื™ืžื” ืฉืžื•ืคื™ืขื™ื ื™ื•ืชืจ ืžืคืขื ืื—ืช. ื‘ื“ื•ื’ืžื” ืฉืœื ื• ืืœื” 20, 60 ื• 30. ืคื™ืชืจื•ืŸ ื‘ืงื•ื“ ืคื™ื™ืชื•ืŸ:
import collections

sample_list = [10, 20, 60, 30, 20, 40, 30, 60, 70, 80]

duplicates = []
for item, count in collections.Counter(sample_list).items():
    if count > 1:
        duplicates.append(item)
print(duplicates)
ืคื™ืชืจื•ืŸ ื‘ืงื•ื“ ืงื•ืงื ืื˜:
import collections
sample_list = [10, 20, 60, 30, 20, 40, 30, 60, 70, 80]

(sample_list
    |> collections.Counter
    |> .items()
    |> filter$(x -> x[1] > 1)
    |> map$(x -> x[0])
    |> list
    |> print)

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