ToCode
Open in Telegram
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Show more1 419
Subscribers
No data24 hours
No data7 days
-530 days
Posts Archive
1 419
ืื OpenAI ืขืืจื ืืจืืืงืก
ืืจืฉืช ืืืขืฉืช ืกืืื ืืืขืืจ ืฉื OpenAI ื next ื remix. ืืืื ืืฉืชืคืื ืืืืืืช ืืืกืืืจืื ืืื ืื ืืื ืืื ืงืฉื ืืขืืื ืขื next ืืืื ื App Router ืืืืฉ ืืกืืื ืืื. ืื ืกื ืืขืฉืืช ืงืฆืช ืกืืจ:
1. ืืคืืืงืฆืืืช ืขืืื-ืืืื (SPA) ืื ืืกืืื. ืื ืชืืื ืืื. ืกืคืจืืืช ืืคืืชืื SPA ืืื react-router ืงืืืืืช ืืืืืง ืืืื ืฉืื ืืกืืื ืืฉืืืฃ ืืื ืืื ืื ืืืคื ืืืืืฆืืช ืขื ืืคืชืืจ "ืืืืจื" ืืกืืื ืืืช ืืืคืืคื. ืื ืื ื ืืื ืื SPA ืื ืืคืขืืื ืื ื ืืชื ืืืืืช ืฉืืืืฉ ืืืื ืืืชืจ.
2. ืจืื ืืืจ ืืฆื ืฉืจืช (SSR) ืื ืืคืืื ืขืื ืืืชืจ ืืกืืื, ืื ืืฉ ืื ื ืืช ืื ืืกืืืื ืฉื SPA ืืื ืืกืฃ ืฆืจืืืื ืืืชืืืื ืขื ื ืืืื Cache ืืฆื ืฉืจืช ืืืืืื ืฉืืงืื ืฉื ืืงืืืคืื ื ืืืช ืื ืืคืขืื ืืืจืื ืฉืฆืจืืืื ืืช window ืืฉืืื ืจืฅ ืืฉืจืช. ืื ืื ื ืืจื ืืจืื ืืฆื ืฉืจืช ืื ืื ืืขื ืืืคืืฉ, ืงืืจืื ืืกื ืืขืื ืืืื ืจืืื ืืืจืื ืืืืืื ืืงืื ืืช ื HTML ืืืื ืื ืื ืื ืื ืืจืืฆืื JavaScript.
3. ืงืืืคืื ื ืืืช ืฆื ืฉืจืช (RSC) ืื ืืคืืื ืขืื ืืืชืจ ืืกืืื ืืจืื ืืืจ ืฆื ืฉืจืช. ืืจืื ืืืจ ืฆื ืฉืจืช ืจืืื ืื ืืงืื ืฉื ืืืคืืืงืฆืื ืืฉืืฉ ืืื ืืืช ื HTML ืืื ื ืฉืื ืืืคืืคื ืืื ืืืืกืืฃ ืืช ื JavaScript ืืงืื ืืืืคืื ืืืืจืืขืื. ืืืื ื ืฉื ืงืืืคืื ื ืืืช ืฆื ืฉืจืช ืฆืจืื ืืืืืจ ืืจืืฉ ืืืื ืงืืืคืื ื ืืืช ืืืืืืช ืงืื JavaScript ืฉืฆืจืื ืืจืืฅ ืืืคืืคื (ืืื ื"ืืืื" ืื ืืงืืืคืื ื ืืืช ืฆื ืืงืื) ืืืช ืืงืื ืฉืืื ืื ื ืฉืืืืื ืืืคืืคื, ืืืฉ ืงืืืคืื ื ืืืช ืืืจืืช ืฉืืื ืืื ืงืื ืืืคืื ืืืืจืืขืื ืืืื ื ืขืืืฃ ืื ืืฉืืื ืืช ืืงืื ืฉืืื ืืืคืืคื. ืืื ืืืคืืืงืฆืื ืืืืื ืืคืฉืจ ืืฉืืื ืืืคืืคื ืคืืืช ืงืื ืืืงืื ืฉืืคืืจ ืืืื ื ืืืขืื ื ืืืืืืืช ืืืฉืชืืฉ.
ืื ืืื ืฉื ืืืชืจ ืืื ืืคืชืืื ืืื ืืืืืจ ืืช ืฉืืืช ืืขืืืื ืืื ืืกืืืืช ืื ืืืื ื ืฆืืจื ืืช ืื ืืขืชืื. ืื ืื ืฉืงืจื ื OpenAI, ืฉืืื ืื ืืคืืืงืฆืืืช SPA ืืื ืืฉืชืืฉื ื next.js ืฉืืชืืื ืืงืืืคืื ื ืืืช ืฆื ืฉืจืช. ืืฉืื ืืกืืื ืื ืื ืจืื ืืืื ื ืฉืื ืืฉืืืื ืืืชืจ ืืื ืขื ืืืืืจื ืืืื ืืืืืืช ืฉืืื ืืขืืจื ืืืคืืืงืฆืืืช SPA ืจืืืื ืขื ืจืืืงืก, ืฉืืื ืืกืคืืง ืืืืจืื ื ืืืชืืื ืืืจื ืืชืื React Router.
ืื ืฉืืืคืฉ ืชืืืืฉืช ืืืืื ืืืืื ืืืืื ื ืืื next.js ื react router ืืืขืชื ืื ืืืฆื ืืืชื ืืื. ืื ืืืจ ืืฉ ืคื ืจืง ืืืืื ืฉื ืืืืื ืืื ืฉื ื ืืืืื ืืืื ื ืืืชืจ ืืืืืงืช ืฉื ืื ืืชืืื ืืื. ืืืืคื ืืืื ืืชืืื ืฉื ืฉืืืช ืืขืืืื ืืืชืืจ ืืืชื ืื ืื ื ืืชืืืืืื ืืืืืืืฆืื ืืืื ืืืืืืื ืฉื ืืืขืจืืช ืฉืื ื ืืืช ืืืจื ืืืืื ืืืืชืจ ืืืืืจ ืกืคืจืืืช ืืคืจืืืงื ืืื ืฉืื ื.
1 419
ื ืืกืื Hono - ืกืื ืืจืื ืขืจื ืืื ืืคืืคื ืื
ืืชืืืื ืฉื ืืื ื ื Web Standards ืืืืื ืืื ืฉืืืื ืงื ืืืชืื ืงืื ืืื ื ืฉืืฉืชืืฉ ื Streams ืืื ืืงืื ืืืืขืืช ืืืืืฉืื ืืืืืื ืืืชื ืืืื ืืืืืฉืื ืืืืจืื ืืืชืจ, ืืื ื SSE. ืืืื ื ืจืื ืืื ืืืืจ ืืช ืืืืืื ืืคืจืืืงื ืืื ื ื Hono.
ืื ืื ืื ื ืืื ืื
ืืืชืจ ืืืื ืชืืืช ืืงืกื ืืืคืชืืจ. ืื ืืฉ ืืกืคืจ ืืืืฉืื ืฉืืืืืจืื ืืืชืจ ืืืื ืืื ืืืืฅ ืขื ืืืคืชืืจ ืื ืืขืจื ืืชืืืช ืืืงืกื ืืืฉืื ืืื ืืืคืืคื ืื ืฉื ืืืืืฉืื ืืืืจืื ืืืขืืืื ืขื ืืืกื ืฉืืื.
ืงืื ืฆื ืฉืจืช
ืงืื ืฆื ืืฉืจืช ืืืจืื ืืฉื ื ื ืชืืืื - ืืื ืืืคื ืืขืืืืื ืืืฉื ื ืืืคื ืืจืืฉืื. ืื ืืืืฉ ืฉื ืื ืก ืืืชืจ ืคืืชื ืืืืืจ ืื ืชืื ืืจืืฉืื, ืืื ืคืขื ืฉืืืืฆืื ืขื ืืืคืชืืจ ืืืืืฉืื ืฉืืืืื ืืืืขืช POST ืื ืชืื ืืขืืืืื. ืื ื ืืชืืื ืืืืืจืช ืืขืจื ืฉื ืื ืืืืืฉืื ืฉืืจืืข ืืืืืจืื:
const clients: Array<SSEStreamingApi> = [];
ืืืืฉืง SSEStreamingApi ืืืืข ื Hono ืืืืคืฉืจ ืืฉืืื ืืืจืืขื ืฆื ืฉืจืช ืืืงืืืืช ืฉืืืชืื ืื ืืื. ื ืชืื ืืจืืฉืื ื ืจืื ืื:
app.get('/count', (c) => {
return streamSSE(c, async (stream) => {
stream.writeln("data: Start\n\n");
clients.push(stream);
const id = clients.length - 1;
stream.onAbort(() => {
clients.splice(id, 1);
console.log(\removed client ${id}\);
});
while(true) {
await stream.sleep(1000);
}
})
})
ืืงืืืืช ืฉืืชืืืจืื ืืืชืจ ืืืื ืกื ืื ืชืื ืื ืืื ืืืืจืฉื ืืงืืืช ืืืืขืืช. ืืคืื ืงืฆืื streamSSE ืืืืขื ื hono. ืืื ืืงืืืช ืืช ืืืืืงื ืืืืืืจ ืฉื hono ืขืฆืื ืืคืื ืงืฆืืืช Callback. ืื ืคืขื ืฉืืงืื ืืชืืืจ ืืืคืขืืช ืคืื ืงืฆืืืช ื Callback ืขื ืืคืจืืืจ stream ืฉืืืืฆื ืืช ืืจื ืืชืงืฉืืจืช ืืืืชื ืืืืฉ. ืืงืื ืืืืืื ืื ื ืืืืืง ืืช ืืืืืืงื ืืื ืืืขืจื ืืื ืจืืฉื ืขืืื ืคืื ืงืฆืืืช ืืืืื ืื ืฉืืฉืืืจื ืืืกืืจ ืืืืืืืืช ืืื ืืืกืจ ืืืืขืจื.
ืืคืื ืงืฆืื ืืกืชืืืืช ืืืืืื ืืื ืกืืคืืช ืฉืืืจืชื ืืฉืืืจ ืืช ืืืืืืจ ืืืืื. ืืช ืืืชืืื ืื ื ืืืฆืข ืืงืื ืืืืคืื ืื ืชืื ืืขืืืืื:
app.post('/count', async (c) => {
console.log(\POST /count\);
const { value } = await c.req.json();
console.log(\Got ${value}\);
clients.forEach(c => {
c.writeSSE({ data: value });
})
return c.json({ message: 'Value received' });
})
ืงืื ืื ื ืงืจื ืื ืคืขื ืฉื ืฉืืืช ืืงืฉืช POST ืื ืชืื ืืขืืืืื. ืืงืื ืจืฅ ืขื ืื ืืืงืืืืช ืืืขืจื ืืืืชื ืืื ืืื ืืื ืืช ืืขืจื ืฉื ืฉืื.
ืืขืืืชื ืืช ืืงืื ืืืื ืฉื main.ts ืขื ืื ื import-ืื ืืืืืืื ืืืืื ืื ืืืฆืื ืืืชื ืืืฃ ืืคืจืืืงื:
https://github.com/ynonp/hono-sync-counter-demo
ืงืื ืฆื ืืงืื
ืืฆื ืืืงืื ืื ื ืจืืฆื ืืืชืืืจ ืื ืชืื ืืจืืฉืื ืืขืืืื, ืืืืจื ืื ืืฉืืื ืืืืขืืช POST ืื ืชืื ืืขืืืื ืื ืคืขื ืฉืืืืฆืื ืขื ืืืคืชืืจ. ืื ืงืืืฅ ื JavaScript ืฉืื ื ืฉืืื ืืืงืื:
// client/sync.js
const evtSource = new EventSource("/count");
const ti = document.querySelector('input');
evtSource.onmessage = (event) => {
ti.value = event.data;
};
document.querySelector('button').addEventListener('click', async () => {
await fetch('/count', {
method: "POST",
body: JSON.stringify({ value: ti.value }),
contentType: 'application/json',
});
});
ืืขืืืื ืขื SSE ืืืคืืคื ืืืื ื ืืื ืืื ื ืืขืืืฃ ืืืชื ืขื ืคื ื Web Sockets ืขืืืจ ืขืืืืื ืื ืืกืื ืืจืื ืืื ืืฆื ืฉืจืช.1 419
ืืื ืืงืืืจ ืืช ืื
ืื ืขืืฉื ืจืืฉืช ืืฆืืืช ืฉืืืื ืฉืืื ืชืฉืชืืช ืืืืจื ืืืืืงืืช ืืืืืืืืืช ืืืขืจืืช? ืื ืขืืฉื ืืืคืชืืช ืฉืืืื ื ืฉืืื ืืชืจ ืชืืขืื ืืฃ ืืื ืื ืืืื ืืช ืืคืจืืืืืืจืง ืฉืืื ืืื ื?
ืืชืจืืืช ืืชืขืฉืืื ืฉืื ื ืืขืืืืช ืืืืืช ืืืื ืืืืืช ืคื ืืืืช. ืื ืื ื ืืขืืืคืื ืืคืชืืจ ืืขืืืช ืขื ืืืืื ืฉืขืืืืื ืืจืฉืืชื ื, ืืื ืืื ืคืืชืจืื ืืื ืืื ืืกืื ืืืื ืืืฉืื. ืืคืชืืช ืฉืชืืื ืคืจืืืืืืจืง ืขื ืชืืขืื ืืืืืงืืช ืชืงืื ืืืชืจ ืงืจืืื ืขื ืืขืืืื ืฉืื, ืืคืืื ืื ืื ืืื ืืขืืจ ืืืจืืฉืืช. ืจืืฉ ืืฆืืืช ืฉืืฆืืื ืืืืจืื ืืช ืืืืช ืืืืืื ืืืืฆืขืืช ืฉืืืื ืืขืจืืช ืืืืงืืช ืืืืืืืืืช ืืืื ืืชืืืื ืืืฆืืง.
ืืืชืืจ ืืื ืื ืฉืงืืจืืื ืืืขืืช Job Security - ืืฆืืจื ืฉื ืืืชื ืื ืฉืื ืืืืฉืื ืืชืืืง ืืช ืืืืฆืจืื ืฉืื ืืื ืืกื ืืคืืื ืืืจื ืฉืื ืืืฉืืืื ืืชืคืงืืืื ืืืฉืื ืืืืจื ืืืคืขืืื ืื ืืชืืจ ืคืจืืืื ืกืจืื ืืืจื ืฉืขืืืืื ืืช ืืืืจื. ืืืฉื ืชืืืืงืช ืืืฆืจืื ืืฉื ืื ืื ืื ืืืื ืืจืก ืฉื ืืฃ ืืื. ืืืืจื ืืคืกืืื ืื ืืื ืชืืืื ืืืคืชื ืืืื, ืืืคืชื ืืคืกืื ืื ืืื ืื ืืฆืืื ืืืชืคื ืืช 100% ืืคืจืืืงืืื ืืืฉืื, ืืืคืจืืืงื ืืคืกืื ืื ืืืืข ืืื ืฉืื ืืงืื ืืื ืืืืข ืืคื ืื ืฆืืจื ืืืชืื ืืขืจืืช ืืืฉื.
ืืืฆืจืื ืคื ืืืืื, ืืื ืืืฆืจืื ืืืฆืื ืืื, ืืืืืื "ืืชืคืืก" ืื ืื. ืืื ืืงืก ืืืื ืืช ืืจืื ืืืืฆืจ ืคื ืืื, ืืื ืืจืืข ืฉืืืื ืืืืจื ืืฉืชืืฉื ืื ืืื ืืจืืจ ืฉืืื ืืจื ืืืจื. ืชืฉืชืืช ืืืืงืืช ืคื ืืืืช ืฉืืืฉืื ืื ื ืืฉืืื ืืฆืืืช ืฉืื ืืืืื ืืงืืืช ืืืคืื ืืืืฆืจ ืืืื ืฉื ืืืืจื ืืืงืื ืฆืืืช ืฉืืืจืื ืืืจืืื ืืืคืชื ืืืชื. ืืืืืชื ืืืื ืืืฆืจืื ืคื ืืืืื, ืืื ืืืฆืจืื ืืืฆืื ืืื, ืืืืืื ืืืืฉืืจ ืืฉืืืืฉ ืฉื ืืกืคืจ ืงืื ืฉื ืืคืชืืื ืืืืืฉืื ืืืืืช ืืชืืืืงืื ืขื ืืื ืืืชื ืืคืชื ืืืืื ืฉืืชื ืืืชื ืืคื ื ืฉื ืื. ืืฉืื ืงืืจื ืืื ืืืื ืจืฆืื ืืื ืืืืจ ืืืืื ืฉืืฉืืืจ ืืืชื ืืืืื ืฉืืื ืืชืื ื ืืืขื ืกืืื ืืืื ืืืืชื ืืืฆืจืื.
ืืืชืืจ ืืืืื ืช ืืืืจื ืืื ืฉืืืืืจื ืื ืื ื ืจืง ืืจืืืืืื - ืืฉ ืื ื ืืืฆืจ ืขื ืืคืก ืขืืืช ืชืืืืงื ืื ืืืืจื ืืืคืืชืื ืืชืืืง ืืืชื ืื ืืกืฃ ืืขืืืื ืืจืืืื ืฉืื ืืื ืืชืืื ื. ืืืืื ืืจืืืง ืืืขื ืืชืฉืืื ืืืืข ืืืจืืืืช, ืืฉืืืืจื ืืืคืืชืื ืืืืื ืืขืืื ืื ืืฆื ืืช ืขืฆืื ื ืืืคืฉืื ืืคืชื TypeScript ืฉืื ืืืืข awk ืืฉืืื ืืืืืืฃ ืืืชื.
1 419
ืฆืืืช ืชืฉืชืืืช
ืงืืืืืืืื ื ืฉืืจืฆื ืืขืืืจ 400 ืง"ื ืืื ืืืืืข ืืืื'ืื ืืืืืืื ืืฆืืจื ืืฉืืช 10 ืฉืขืืช ืืืืืืืืก. ืฆืจืคืชื ืฉืืจืฆื ืืขืืืจ ืืช ืืืชื ืืจืืง ืืคืจืื ืืืืจืื ืืฆืืจื ืจืง ืฉืขืชืืื ืืืฆื ืืจืืืช. ืืืืกืืื ืืืื ืืื ืขืฆืื ืืื ืื ืืคืฉืจืืืืช ืืืจืืื - ืืจืืืช ืืคืฉืจ ืืขืืื ืชืื ืืื ื ืกืืขื ืืืงืืืืืช ืืืืืื ืืืชืจ ืืืคืฉืจ ืืืขืืืจ ืืืขื ืื.
ืืื ืืืืื ืืื ืืฉืคืืข ืขื ืืืืืื? ืขื ืืชืจืืืช? ืขื ืืืืข? ืขื ืืืืื?
ืขืืืื ืขื ืชืฉืชืืืช ืื ืฆืจืืื ืืืืืช ืจืง ืชืืืืงื ืืชืืงืื ืชืงืืืช ืืืืืฉ. ืฆืืืชื ืชืฉืชืืืช ืืืืื ืื ืืื ืฉืืื ืื ืืช ืืขืชืื. ืื ืืืคืฉืจืื ืืคืืชืื ืืืืื ืืืืื ืืืืคืืื ืืช ืืืืืืืช ืืืื ืืืคืฉืจืืื. ืฆืืืชื ืชืฉืชืืืช ืื ืืื ืฉืื ืืืื ืืช ืืกืืืช ืืจืืืช. ืืืขืืจ ืืชืืืืงื ืืืืืื ืืื ืืื ืืืฉืืืื ืฉื ืขืฉื ืืงืจืืืจื.
(ื .ื. ืืงืืฉื ืืคืจืืืงืื ืชืฉืชืืช ืืืืื ืืืื ืืงืืฉื ืืืื ืืคืืชืื ืืืฆืจืื - ืืื ืืืืขืื ืื ืืื ืืช ืืืื ืื ืฉืื ื ืืื ื ืืืืช ืืขืืืจ. ืจืง ืืืื ืฉืืคืฉืจ ืืืขืืืจ ืืช ืื ืืืืจื ืืงืืืจื ืืืก ืื ืืืืจ ืฉืื ืืืืจ ืื ืืื ืืขืฉืืช. ืืืชืืจ ืืืื ืืืชืจ ืืื ืคืขื ืืขืืจ ืืื ืืืืื ืืช ืฆืจืื ืืืืจื ืืืขืฉืืช ืืช ืืฉืื ืืืื ืฉืืืจืื ืคืืืืื ืืขืฉืืช ืืื ืื ืืคืชืื ืืืชืืช ืืืฆืืื).
1 419
ืืื ืืืฉืืืช ืขื ืกืืืง ืืืืจืคืื ื AI
ืืื Stack Overflow ืื ืจืืฆืื ืฉ Chat GPT ืืขื ื ืขื ืฉืืืืช? ืืื ืื ืืืืจ ืขื ืฉืืจ ืืืืจืื ืฉืื ืื ื ืจืืฆืื ืื ืื ืจืืฆืื ืืขืฉืืช ืขื AI?
ื ืชืืื ืขื ืืืงืจืื ืืงืืื - ืื ืื ื ืฆืจืื ืืืืกืืฃ ื ืืชืื ืืคืจืืงืกื ืืืฉ ืขื ืฉืจืช ื Apache ืฉืื ืืจืืจ ืฉืื ื ืืืื ืืืฉืชืืฉ ื AI ืืื ืืืืฆืจ ืืช ืงืืืฅ ืืืืืจืืช. ืื ืืฉืืื ืืืฆืืจ ืื ืืคืกื ืืงืืืจื ืืืก, ืืืืืจ ืงืืืฅ JSON ื YAML ืืืืฆืืจ ื ืชืื ืื ืืงืจืืืื ืืืืืงืืช. ืื ืืืงืจืื ืืืื ื ืจืืื ืืืืื ืืื ืื ืืื ืืืจืื ืฉืืืืืชื ืืงืืืช ืืืฆืื ืืชืืขืื ืืจืฉืช, ืืคืฉืจ ืืืืื ืฉื AI ืื ืืกื ืื ืคื ืืืื ืขืืืื.
ืืื ืืืช ืจืง ืืืชืืื. ืื ืืืื ืืงืื ืืืืืชื? ืขืืืื ื ืจืื ืื ืืืืื ื ืืืงืฉ ื AI ืืืชืื ืื ืฉืืืืชืช SQL, ืื ืื ืืื ืืกืืืืช, ืืื ืืช ืืฉืืืื ืืืืง CSS ืื ืื ืืื ืืฉืชืืฉ ืืืืืืืช CSS ืฉืื ื ืื ืืืฉ ืืืืจ ืืืคืืื ืืขืฆื ืืืฆืืืจ ืงืื ืืงืืืคืื ื ืืช ืจืืืงื ืืืื ืืคืื ืงืฆืืื ืืืืืช ืฉืื. ืืื ืืืงืจืื ืืืื ืื ื ืืืจ ืื ืืืฉื ืขื ืืชืืฆืื ืฉื AI ืืืืฆืจ ืืชืืจ ืืฉืื ืฉืืืืชื ืืืื ืืืฆืื ืืจืฉืช, ืืื ืื ื ืืืฉื ืขื ื AI ืืชืืจ ืืืฉืื ืฉืขืืื ืืฉืืืื. ืืขืื ืขืืืจ ืืืจืืืืื ืฉื ืื ืก ืืงืื ืืขืืืจ ืื ืืืฆืื ืชืงืืืช ืืืืืกืืฃ ืคืืฆ'ืจืื ืงืื ืื. ืืคืฉืจ ืืืืืื ืฉืืืื ืฉืื ื ืืฉืื ืกืืื ืืืืฉื ื Open AI ืื ืื ื ืืืื ืืืฉืชืืฉ ืืงืื ืฉื ืืืชื ืขืืืจ ืืืจืืืืื ืืืืชื ืืืคื ืฉืืืืชื ืืืื ืืืขืกืืง ืืชืื ืช ืืืืชื ืืืืฉืชืืฉ ืืงืื ืฉืืื ืืืชื (ืจืง ืืจืื ืืืชืจ ืืื).
ืืกืืืืช ืืื ืื ืื ื ืื ืืจืืืฉืื ืื ืื ืืชืช ื AI ืืื ืืช ืขืืืจื ื ืืคื ื ืืืชื, ืืขืืืจ ืื ืืกืื ืืืืืื, ืืืขืืืช ืจืขืืื ืืช ืืืฉืื (ืฉืืื ืืื ืื ื ืฆืื ืืืชื ืืคืืืฉื ืืชืืจ ืจืขืืื ืืช ืฉืื ื), ืืืืฆืจ ืืจืคืืงื ืื ืืืืืงื ืืขืื ืขืืืืืช ืงืจืืืืืืื ืฉืืืื ืืืื ืืช ืื ื ืืื ืืืืืืช ืืืฆืจืื.
ืื ืื ืืืื Stack Overflow? ืืคืืกืืื ืืืืื? ืื ืฆืืืฆืื ืืืืื ืจืฉืช ืืืจืชืืช? ืื ืืคืืื ืืจืืช ืืื ืืืืืช ืืงืจืื ืืฉืคืื? ืขืืฉืื ืื ื ืจืื ืืจืืจ - ืืืฉืืง ืืื ืื ืืื ื AI ื ืืชื ืชืืฆืื ืืืื, ืืื ืืื ืืฉืื ืื ื ืชืืื ืืืชื ืื ืืืืชื ืืฆืืื. ืืฉืื ืื ื ืืืคืฉืื ืชืฉืืื ืฉื ืื ืืื ืืืืืขืื ืืืงืกื ืฉื AI ืื ืคืืืข ืืืืื ืฉืื ื ืืืืชื ืืืืื. ืื ืืืฉืื ืคืขื ืืืช ืืฉืื ืื ืืจืื ืฉืืชื AI ืื ื ืื ืืงืจื ืืืชืจ ืืช ืืืจืืืช ืฉืืืชื ืืืจ ืืฉืื ืืขืชืื. ืื ืืืื ืฉืืืืืจ ืคืขื ืืืช ืคืืจืกื ืคืืกื ืฉืืชื ืขืืืจื AI ืื ื ืื ืืืจื ืืงืจืื ืืช ืืคืืกืืื ืฉื ืืืชื ืืืืืจ ืืขืชืื. ืืขืืจ ืืฉืืืช ืืืืืง, ืืืืืจื ืฉื ืกืืืง ืืืืจืคืื ืืืชืจืื ืจืืื ื ืืกืคืื ืืื ืืืืจืช ืืืืื, ืืืื ืกืื ืืชืจ ืื ืื ื ืจืืฆืื ืืืืืช ืืืืื ืกืื ืืฉืชืืฉืื ืื ืื ื ืจืืฆืื ืฉืืืืขื. ืืืืจื ืืื ืื ื ืื ืืชืคืื ืื ืืชืฉืืืืช ืฉื Chat GPT ืืืื ืืืืืช ืืืชืจ ืืืชืฉืืืืช ืฉื ืืฆื ืืกืืืง ืืืืจืคืื, ืืฉื ืฉืืืกืืจืื ืฉืื ืืืืืื ืืืืืช ืืืืื ืืืชืจ ืืคืืกืืื ืืืืืืื ืื ืฆืืืฆืื ืืจืฉืชืืช ืืืจืชืืืช. ืืื ืืืืงื ืืื ืฉืืืกืืจืื ืฉื ื AI ืืืฉืืื ืืืฉืชืคืจ ืื ืจืง ืืืืืฉ ืืช ืืืงืื ืฉื ืชืืื ืืงืืจื, ืืฆืืจืชื ืืืืฉื ืฉืื ื ืืื ืืืชืืื.
1 419
ืขืจื ืจืืง ืืืืฉืง
ืืื ืืืืจืื ืฉืชืืื ืืืืืืื ืืืชื ืืื ืืืฉืืขืืช ืฉื ืขืจืืื ืจืืงืื ืืชืื ืืืฉืงืื. ืืื ืืืืืืืช ืืืชืงืืคื ืืืืจืื ื:
1. ื Rails ืืคืฉืจ ืืืืืืจ ื
config.hosts ืจืฉืืื ืฉื ืืืืืื ืื ืืืจืฉืื. ืืขืจื ืจืืง ืืืืจ ืฉืื ืืืืืืื ืื ืืืจืฉืื, ืืืื ืื ืื ื "ืจืง" ืืืกืืฃ ืขืจื ืืืขืจื ืืขืฆื ืื ื ืืคืขืื ืืืืงืช ืืืืื ืืืฉื.
2. ื Gremlin ืืคืงืืื g.V(id) ืืืืืจื ืฆืืืช ืืืืจืฃ ืืคื id. ืืคืฉืจ ืืืขืืืจ ืืกืคืจ ืืืืื ืืื ืืงืื ืืกืคืจ ืฆืืชืื ืืืฉื g.V(2, 3, 5) ืืืืืจ ืืช ืืฆืืชืื 2, 3 ื-5. ืืขืืจื ืฉื ืขืจื ืจืืง (ืืื ืืืื ืืชืื ืืกืืืจืืื) ืืืืืจื ืืช ืื ืืฆืืชืื ืืืจืฃ.
3. ืืคืงืืื cat ืืืื ืืงืก ืืืงืืช ืฉื ืงืืืฅ ืืืฆืืื ืืืชื ืขื ืืืกื. ืื ื ืขืืืจ ืื ืืกืคืจ ืงืืฆืื ืืื ืชืืคืืก ืืช ืืืื, ืืื ืื ืื ื ืขืืืจ ืืฃ ืฉื ืืื ืชืืคืืก ืืช ืืชืืื ืฉื STDIN ืฉืื, ืืืืืจ ืชืื ืก ืืืฆื ืฉื ืงืืืืช ืฉืืจืืช ืืชืืืืจ ืขื ืื ืฉืืจื ืฉืื ืื ื ืืืชืืื ืขื ืฉื ืืืฅ Ctrl+D ืืกืืื ืืช ืืงืื.
ืืฆืืจืช ืืชื ืืืืช ืฉืื ื ืืคืื ืงืฆืื ืขืืืจ ืขืจื ืจืืง ืืืืื ืืืืืช ืืจืืง ืืืื ืืืืืขื ืืืจ ืืื ืืงืฆืจ ืงืฆืช ืืช ืืงืื ืืืื ืืจืื ืคืขืืื ืื ืงืืฆืืจ ืฉืืคืชื ืืืื ืืก. ืืคืืขื ืืงืืฆืืจืื ืืืื ืืจืื ืคืขืืื ืืืืืืื ืืฉืชืืฉืื ืืืฉืื ืืจืง ืืืคืืื ืืช ืืืืฉืง ืฉืืื ืืคืืืช ืืืืืืชื.1 419
ืืื ื ืืฉืชืื ืขื ืื ืื ืื ืืืืืงืืช ืืืืืืืืืืช ืฉื ืืื ื ืืฆืืจื ืืืื ืืช. ื ืืฆืืจ ืชืืงืืื ืืฉื
tests ืืืชืืื ืงืืืฅ ืืฉื tests/demo1_test.ts ืขื ืืชืืื ืืื:
import { expect } from "jsr:@std/expect";
import demo1 from '../routes/demo1.ts';
// basic test
Deno.test("simple test", async () => {
const res = await demo1.request('/text')
expect(res.status).toBe(200)
expect(await res.text()).toBe('Hello Hono!')
});
ืืคืฉืจ ืืืคืขืื ืืช ืืืืืงื ืขื:
$ deno test
ืื ืืืืืฆื ืขื ืืืืงืื ืืืจืฆื ืืืฉืืืฉ ืืื ืงืื ืืืืืงื ืฉืืืคืืข ืืืืืืืืช ื VS Code.
ืืขืืื ืืจืฉืช
ืืืืืื ืืืื ืฉืื ืืื ื ืืฉ ืื ื ืืขืืื ืืืืืืืืช ืืจืฉืช ืืืื ื ื denodeploy. ืฆืจืื ืจืง ืืืชืื:
deployctl deploy
ืืฉืืจืช ืืคืงืืื ืืืขืงืื ืืืจ ืืืืจืืืช. ืืคืจืืืงื ืฉืื ืืืื ืืืจ ืืงืืฉืืจ:
https://ynonp-hono-demo.deno.dev/demo1/api/hello
ืืืชื ืืืืื ืื ืืขืืืจ ืขื ืืงืื ืืืื ืืืืืืื ืืงืืฉืืจ:
https://github.com/ynonp/hono-demo
ืกื ืืื ืืขืืืื ืขื ืืื ื ืืืชื ืื ืื ืฉ Express ืืื ืคืขื - ืืืฃ, ืขืืื ืืื ืืื ืจืืฉ ืืขืืฉื ืื ืื ืฉืฆืจืื.1 419
ืืื ื ืืื ืื ืื ืฉืจืฆืืชื ื express
ืืื ื (hono) ืืื ืกืคืจืืื ืืคืืชืื ืืื ืฉืงืฆืช ืืืืืจื ืืช ืืงืกืคืจืก ืืื ืขื ืกืืจืืืืืื - ืืฉ ืื ืชืืืื ืืืื ืืื ืกืืืืช ืืจืฆืช JavaScript, ืชืืืื ืืืื ืืช ืืืืืงืืช, ืืืืคืกืงืจืืคื ืืฉืจ ืืืงืืคืกื, ืืื ืืืชืจ ืืืืจ ืืื ืืืืข ืขื ืกืคืจืืืช ืฆื-ืืงืื ืฉืืืืืจื ืืช ืจืืืงื ืืื ืืจืื ืืืชืจ ืงืื ื. ืื ื ืฉืืืฉ ืืืืืืืช ืืืืจืืช ืืื ืืืชืจืฉื ืืื ื.
ืคืืชืื ืคืจืืืงื ืืืฉ
ืื ืื ืฉืฆืจืื ืืฉืืื ืืคืชืื ืคืจืืืงื hono ืืืฉ ืื ืืช ืืื ื ืืืชืงื ืืืืจืืฅ ืืช ืืคืงืืื:
deno run -A npm:create-hono@latest my-app
ืื ื ืืืืจ ืืช ืืื ื ืืชืืจ ืกืืืืช ืืจืืฆื ืืื ืืื. ืขืืฉืื ืืคืฉืจ ืืืคืขืื VS Code ืืชืืงืืื ืืืืชืืื ืืขืืื.
ืืืืจ ืืจืืฉืื ืฉืื ื ืจืืฆื ืืฉื ืืช ืืืืืจืืช ืืคืจืืืงื ืืืื ืืงืืืฅ deno.json ืืื ืืืืกืืฃ ืืชืื ืืช ืืฉืืื ืฉื ืคืืชืื ืฉืชืขืืื ืืืฆื watch. ืื ื ืืขืืื ืืช ืืงืืืฅ ืืืืจื ืืฉืื ืื ืืื ื ืจืื ืื:
{
"imports": {
"hono": "jsr:@hono/hono@^4.5.10"
},
"tasks": {
"start": "deno run --allow-net main.ts",
"dev": "deno run --allow-net --watch main.ts"
},
"compilerOptions": {
"jsx": "precompile",
"jsxImportSource": "hono/jsx"
},
"deploy": {
"project": "b737e735-3715-4077-a44b-782fc7424cb5",
"exclude": [
"**/node_modules"
],
"include": [],
"entrypoint": "main.ts"
}
}
ืืฉืืจื ืืืืืื ืฉืืืกืคืชื ืืื ืืขืจื dev ืืชืื ืืืืืืงื tasks.
ืืฉืืจืช ืืคืงืืื ืื ื ืืคืขืื:
deno task dev
ืืืฉ ืื ืฉืจืช ืฉืืงืฉืื ืขื ืคืืจื 8000 ืืื ื ืืืื ืืืชืืื ืืขืืื, ืืงืื ืืชืื ืืืืืคืกืงืจืืคื ืืื ืฉืื ืื ืงืื ืืืืืืืืช ืืจืขื ื ืืช ืืฉืจืช.
ืืืืื 1 - ืืืืจืช ืืืืข
ืื ื ืืืฆืจ ืชืืงืื ืืืฉื ืืฉื routes ืืืชืืื ืงืืืฅ ืืฉื demo1.ts ืขื ืืชืืื ืืื:
import { Hono } from "hono";
const router = new Hono();
let counter = 0;
router.get('/text', (c) => {
return c.text('Hello Hono!')
})
router.get('/api/hello', (c) => {
return c.json({
ok: true,
message: 'Hello Hono!',
})
})
router.get('/api/counter', (c) => {
return c.json({
value: counter++,
})
})
export default router;
ืืงืืืฅ ืืืืืจ ืฉืืืฉื ื ืชืืืื, ืืื ืืืืืจ ืืงืกื, ืืฉื ื ืืืฉืืืฉื ืืืืืจืื ืืืืืงืื JSON. ืืฉืืื ืืืฉืช ืื ืชืืืื ืื ื ืฆืจืื ืืืืจ ืืืชื ืืฉืจืช ืืืื ืื ื ืืืื ืืงืืืฅ main.ts ืืฉื ืืขืืื ืืช ืืงืืืฅ ืืชืืื ืืื:
import { Hono } from 'hono'
import demo1 from './routes/demo1.ts';
const app = new Hono()
app.route('demo1', demo1);
Deno.serve(app.fetch)
ืขืืฉืื ืืืคืืคื ืื ื ืืืืฉ ื localhost:8000/demo1/text ืืื ืืจืืืช ืืช ืืืงืกื, ื localhost:8000/demo1/api/hello ืืื ืืจืืืช ืืช ืืืืืืงื ืืจืืฉืื ืื localhost:8000/demo1/api/counter ืืื ืืจืืืช ืืช ืืืืืืงื ืืฉื ื.
ืืืืื 2 - ืืืฉื ืืคืจืืืจืื ืฉื ืืืงืฉื
ืืืื ื ืคืชื ืงืืืฅ ื ืืกืฃ ืืฉื routes/demo2.ts ืืืคืขื ืขื ืืชืืื ืืื:
import { Hono } from "hono";
const router = new Hono();
router.get('hello', (c) => {
const name = c.req.query('name') ?? 'Guest';
return c.text(\Hello! ${name}\);
});
router.post('item', async (c) => {
const props = await c.req.json();
console.log(props);
return c.json(props);
})
export default router;
ืืงืืืฅ ืืืืืจ ืฉื ื ื ืชืืืื - ื ืชืื ืืื ืืืงื ืืช ืืคืจืืืจ name ืื Query String ืืืืืืจ ืืงืกื ืฉืืืื ืืช ืืขืจื ืฉื ืืคืจืืืจ ืื ืฉื ืืจืืจืช ืืืื. ืื ืชืื ืืฉื ื ืืืงื ืืช ืืืฃ ืืืงืฉื ืืชืืจ ืืืืืงื JSON ืืืืืืจ ืืืชื. ืืฉืืื ืืืืจ ืืืชื ืืืคืืืงืฆืื ืฆืจืื ืจืง ืืืืกืืฃ ืืช ืืฉืืจื:
app.route('demo2', demo2);
ืืงืืืฅ main.ts, ืืื ืืคืืื ืื ืฆืจืื ืืกืืืจ ืืืคืชืื ืืช ืืชืืื ืืช ืืื ืคืฉืื ืืชืจืขื ื ืืืจืื ืืช ืื ืชืืืื ืืืขืืืื ืื.
ืืืืื 3 - ืฉืืืืช HTML
ืืงืืืฅ ืืฉืืืฉื ืฉืื ื ื ืงืจื routes/demo3.tsx, ืืื ืืกืืืืช ืืื tsx ืืื ts ืืคืขื. ืื ืืชืืื ืฉืื:
import { Hono } from "hono";
const router = new Hono();
const View = ({name = "Guest"}) => {
return (
<html>
<body>
<h1>Hello! {name}</h1>
</body>
</html>
)
}
router.get('/', (c) => {
return c.html(<View name="ynon" />)
})
export default router;
ืืชื ืื ืืืขืื - ืื ื ืจืื ืืื JSX ืืื ืืื ืื. ื Hono ืืฉ ืืจื ืืืื ืืช ืืคืฉืืื ืืืชืื HTML ืืืืฆืขืืช jsx. ืืฉ ืฉื ืขืื ืื ืืื ื ืงืืฆืืจืื ืื ื CSS ืืืคืืื ืกืคืจืืืช JavaScriptืฉืืืืืช ืขื ืื ืืืืคืฉืจืช ืืืืกืืฃ ืชืืืื ื Hooks ืืื useEffect, ืืื ืื ืืืจ ืกืืคืืจ ืืคืืกื ืืืจ.
ืืืืงืืช ืืืืืืืืืช1 419
ืืื ืื ืืฉ ืืงืื ืืืืกืง?
ืืคืื ืฉื ืฉืชื ืืคืงืืืืช ืืืื ืขื ืืฉืจืช ืืคืชืืข ืืืชื -
ynon@schooler-prod-2:~$ touch a
touch: cannot touch 'a': No space left on device
ynon@schooler-prod-2:~$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 7.9G 0 7.9G 0% /dev
tmpfs 1.6G 8.5M 1.6G 1% /run
/dev/sda 315G 103G 197G 35% /
tmpfs
ืืื ืืืื ืืืืืช ืฉ touch ืื ืืืื ืืืฆืืจ ืงืืืฅ ืืืฉ ืืืชืืื ื ืฉืืื ืืกืคืืง ืืงืื ืขื ืืืืกืง, ืืฉ df ืืจืื ืฉืืฉ ืืืืงื ืืืื ืืงืื? ืืื df ืืฉืงืจ? ืืื ืืฉ corruption ืืืขืจืืช ืืงืืฆืื? ืื ืงืืจื ืคื?
ืืืชืื. ืืื ืืคื ื ืฉืจืฆืื ืืืคืขืื fsck ืฉืืื ืื ืกืืช ืื ืืช df -i. ืืขืจืืืช ืงืืฆืื ืืืื ืืงืก ืฆืจืืืืช ืืฉืืืจ ืื ืืกืฃ ืืงืืฆืื ืขืฆืื ืื ืืื ืืงืก ืฉืืงืฉืจ ืืื ืฉื ืืงืืืฅ ืืชืืื ืฉืื ืขื ืืืืกืง. ืืืื ืืงืก ืืื ืื ืชืืคืก ืืงืื ืืืืื ื ืฉืื ืืืฆืจ ืืืืื ืขื ืืกืคืจ ืืงืืฆืื ืฉืืคืฉืจ ืืฉืืืจ ืืชืืงืืื. ืืคืงืืื df -i ืืฆืืื ืืื ืงืืฆืื ืืคืฉืจ ืืฉืืืจ ืขื ืื ืืื ื ืืืื ืืฉ ืืื, ืืื ืงืฉืจ ืืืืื ืฉืืื.
ืืฉืืฉ ืืงืื ืขื ืืืืกืง ืืื ืืื ืืกืคืืง inodes ืคื ืืืื, ืืคืงืืื touch (ืืืฆืืจืช ืงืืฆืื ืืืืคื ืืืื) ืืฆืืื ืืช ืืืชื ืืืืขืช ืฉืืืื ืืืืืืช No space left on device, ืืืจืืช ืฉืื ืืื ืฆืจืืืื ืืืืื Not enough free inodes on device.1 419
ืืืืืข ื ืืกืฃ ืขื ืืกืคืจืื ืืขืื ืืื ืกืืฃ ืืืืืืืช ืฉืืื ืืืงืจ ืืืชืจ ืฉืืื ืืงืืฉืืจ:
https://observablehq.com/plot/
1 419
ืืืืจื ืืช Observable Plot - ืืืืจืกื ืืงืื ืฉื D3
ืื ื ืืืื ืืช D3 ืื ืืคืฉืจ ืืขืฉืืช ืืืชื ืืื ืืืฉ ืืื ืกืืฃ ืืืืืืืช ืืจืฉืช, ืืื ืื ืืคืฉืจ ืืืืืืฉ ืฉ D3 ืงืฆืช ืืกืืื ืืืืื ืฉืคื ืืืืฉืืื ืฉืื ืืืืื ืืฉ ืื ืืืืืจ. ืื ืืชื ืจืง ืฆืจืืืื ืืืืกืืฃ ืืืื ืืจืฃ ืืืกืื ืื ืืืื ืฉืืื ืืื ืืืชืจ ืืื ืืื ืืจืงืฆืื ืกืคืจืืืช Observable Plot ืืืืื ืืชืช ืคืืชืจืื ืืืืจ. ืืฉืืืืฉ ืืขืืงืจื ืฉืื ืืื ืืื ืืชืื ืืืืจืืช ื'ืืคืืืจ ืืฉืฆื ืืฉืจืช ืืื deno.
ืืืืื 1 - ืฆืืืจ ืืคืื ืงืฆืื x ืืจืืืืข
ืืืืืื ืืจืืฉืื ื ื ืจืื ืืจืฃ ืคืฉืื ืฉื ืืคืื ืงืฆืื x ืืจืืืืข. ืืช observable plot ืืคืฉืจ ืืืขืื ืืจื jsdeliver ืืฉืืจืืช ืืืคืืคื ืขื ืืคืงืืื:
import * as Plot from "https://cdn.jsdelivr.net/npm/@observablehq/plot@0.6/+esm";
ืืืืจื ืฉื Observable Plot ืืื ืืงืืช ืืืืข ืืืืจืืืช ืืื ืืืฆืื ืืืชื ืืืืืจ ืืืชื ืืื ืืืจืฃ, ืืื ืื ืื ื ืืชืืืืื ืขื ืืฆืืจืช ืืืืืข:
const data = Array.from({length: 100}, (_, i) => {
let x = i - 50;
return {x, y: x * x};
});
ืื ืฉืืืฆืจ ืืขืจื ืฉื ืืื ืชืืื, ืื ืชื ืืืื ืืืืืงื ืขื ืฉืื ืืฉื x ืฉืืืื ืืกืคืจ (ืืื ืืื ืืก 50 ื 50) ืืฉืื y ืฉืืืื ืืช x ืืจืืืืข.
ืืืืง ืืฉื ื ืืืงื ืืช ืืืขืจื ืืืืจืืืช ืืื ืืืฆืื ืืืชื ืืืืฆืจ ืืืืืงื plot:
const plot = Plot.plot({
marks: [
Plot.line(data, {x: "x", y: "y", stroke: "blue"})
],
x: {label: "x"},
y: {label: "f = xยฒ"},
})
ืืชืืฆืื plot ืืื ืืืฉ SVG ืฉืืคืฉืจ ืืืืกืืฃ ื DOM. ืืคืฉืจ ืืจืืืช ืืช ืืงืื ืืืื ืืืชืืฆืื ืืงืืืคื:
https://codepen.io/ynonp/pen/abgamwv?editors=1010
ืื ืืืืืข:
<iframe height="300" style="width: 100%;" scrolling="no" title="Untitled" src="https://codepen.io/ynonp/embed/abgamwv?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
See the Pen <a href="https://codepen.io/ynonp/pen/abgamwv">
Untitled</a> by Ynon Perek (<a href="https://codepen.io/ynonp">@ynonp</a>)
on <a href="https://codepen.io">CodePen</a>.
</iframe>
ืืืืื 2 - ืืืกืืืืจืืช ืชืืืจืืช ืืืืื
ืืืืื ืฉื ืื ืืงืฆืช ืืืชืจ ืืืจืืืช ืืื ืฆืืืจ ืืืกืืืืจืืช ืชืืืจืืช ืืืคืขื ืฉื ืืืืื ืืืงืกื. ืื ื ืืชืืื ืขื ืืืืืข:
const wordFrequency = [
{word: "quick", count: 4},
{word: "brown", count: 2},
{word: "fox", count: 2},
{word: "jumps", count: 1},
{word: "over", count: 1},
{word: "the", count: 5},
{word: "lazy", count: 3},
{word: "dog", count: 2},
{word: "is", count: 3},
{word: "very", count: 2},
{word: "and", count: 1},
{word: "agile", count: 1},
{word: "not", count: 1},
{word: "as", count: 1},
{word: "but", count: 1},
{word: "certainly", count: 1}
];
ืืื ืืื ืืขืื ืืงืืช ืืืจืืืช ืืืืืฆืจ ืืช ืืืืืข ืืื ืืื ืืืช, ืคืฉืื ืจืฆืืชื ืืืจืืืช ืืื ืืช ืืืืืข ืืื ืฉืืื ืขืืืจ ื Observable Plot.
ืืืืง ืืฉื ื ืื ื ืืืฆืจ ืืช ื SVG:
const plot = Plot.plot({
marks: [
Plot.barY(wordFrequency, {x: "word", y: "count", sort: {x: "y", reverse: true}})
],
x: {
label: "Word",
tickRotate: -45
},
y: {
label: "Frequency",
tickFormat: d => d, // Ensure only integer ticks are shown
ticks: Math.max(...wordFrequency.map(d => d.count)) + 1 // Set the number of ticks to match the highest count
},
height: 400,
width: 600
});
ืืคืขื ืืฉ ืงืฆืช ืืืชืจ ืงืื ืื ืจืฆืืชื ืืฉืืื ืืืืคื ืฆืืืจ ืืฉื ืชืืช ืขื ืฆืืจ ื y ืืืืืื ืฉืื ืืืคืืขื ืืฆืื ืืกืคืจืื. ืขืืืื ืื ืฉืืฉืื ืื ืืืืคืื ืืื ืืืืืงื ืืืืืข ื plot, ืืืคืื ืฉืื ืืืื ืืืืื ืืฉืืจื:
Plot.barY(wordFrequency, {x: "word", y: "count", sort: {x: "y", reverse: true}})
ืืชืืฆืื ืฉืื ืืงืืืคื:
https://codepen.io/ynonp/pen/gONdwZK?editors=1010
ืื ืืืืืขืช:
<iframe height="300" style="width: 100%;" scrolling="no" title="Untitled" src="https://codepen.io/ynonp/embed/gONdwZK?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
See the Pen <a href="https://codepen.io/ynonp/pen/gONdwZK">
Untitled</a> by Ynon Perek (<a href="https://codepen.io/ynonp">@ynonp</a>)
on <a href="https://codepen.io">CodePen</a>.
</iframe>
Available now! Telegram Research 2025 โ the year's key insights 
