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
ืื™ืš ืขื•ื‘ื“ ืคืจื•ื™ืงื˜ Rails ืขื ESBuild ื”ื—ืœื•ื ืฉืœ DHH ืขื‘ื•ืจ ืจื™ื™ืœืก ื”ื•ื ืœื•ื•ืชืจ ืขืœ ื” Build Step ื•ืคืฉื•ื˜ ืœืฉืœื‘ ื‘ื“ืฃ ื” HTML ืืช ื”ืงื™ืฉื•ืจื™ื ืœืกืงืจื™ืคื˜ื™ื ื‘ืืžืฆืขื•ืช ES Modules. ื‘ื–ื›ื•ืช ื”ืชืžื™ื›ื” ืฉืœ ื“ืคื“ืคื ื™ื ื‘ HTTP2 ื•ื‘ Import maps ื”ืกื™ืคื•ืจ ื”ื–ื” ืืคื™ืœื• ืขื•ื‘ื“ ื“ื™ ื˜ื•ื‘ ื‘ืคืจื•ื™ืงื˜ื™ ืจื™ื™ืœืก ื”ืžืกืชืžื›ื™ื ืขืœ JavaScript. ืื‘ืœ ื›ืฉืื ื—ื ื• ืžื•ืกื™ืคื™ื TypeScript ื•ืจื™ืืงื˜ ืœืชืžื•ื ื” ื”ืขืกืง ืžืกืชื‘ืš ื•ืฉืœื‘ ื‘ื ื™ื” ื”ื•ืคืš ื”ื›ืจื—ื™. ื’ื™ืจืกื” 7 ืฉืœ ืจื™ื™ืœืก ืฉื™ืœื‘ื” ืžืžืฉืง ืกื˜ื ื“ืจื˜ื™ ืœื‘ื ื™ื™ืช ืงื‘ืฆื™ Front End ืฉื ืงืจื JS Bundling. ืžื ื’ื ื•ืŸ ื–ื” ืžืืคืฉืจ ืœืขื‘ื•ื“ ืขื esbuild, webpack ืื• rollup ื•ืœืฉืœื‘ ืื•ืชื ื‘ืชื•ืš ืคืจื•ื™ืงื˜ ืจื™ื™ืœืก. ืื‘ืœ ืžื” ืฉืžื™ื•ื—ื“ ื‘ JS Bundling ื‘ืขื•ืœื ืฉืœ ืจื™ื™ืœืก ื”ื•ื ืฉืื™ืŸ ืงื•ื‘ืฅ ื”ื’ื“ืจื•ืช ืื—ื“ ืฉืขื•ื‘ื“ ืขืœ ื›ืœ ื”ื›ืœื™ื ื•ื‘ืžืงื•ื ื–ื” ืขืœื™ื ื• ืœื‘ื—ื•ืจ ืืช ืื—ื“ ืžื”ื›ืœื™ื ื•ืœื‘ื ื•ืช ืœื• ืืช ืงื•ื‘ืฅ ื”ื”ื’ื“ืจื•ืช ื‘ืขืฆืžื ื•. ืœืคื ื™ ื›ืžื” ืฉื‘ื•ืขื•ืช ืคืจืกืžืชื™ ื›ืืŸ ืžื“ืจื™ืš ืฉืžืกื‘ื™ืจ ืื™ืš ืœืฉืœื‘ React ื• TypeScript ื‘ืคืจื•ื™ืงื˜ ืจื™ื™ืœืก ื•ืฉื ื”ืฆืขืชื™ ืขืœ ื”ืกืคืจื™ื” vite-ruby. ื”ื™ื•ื ืื ื™ ืจื•ืฆื” ืœื”ืจืื•ืช ืžื‘ื ื” ืคืจื•ื™ืงื˜ ื“ื•ืžื” ืื‘ืœ ื”ืคืขื ื‘ืขื–ืจืช esbuild ื•ืชื•ืš ืฉื™ืžื•ืฉ ื‘ JSBundling. ื™ืฆื™ืจืช ื”ืคืจื•ื™ืงื˜ ื•ื”ื’ื“ืจื•ืช ืชื—ื™ืœื” ืื ื™ ื™ื•ืฆืจ ืคืจื•ื™ืงื˜ ืจื™ื™ืœืก ื—ื“ืฉ ืขื ื”ืคืงื•ื“ื”:
$ rails new myapp -j esbuild
ื”ืคืจื•ื™ืงื˜ ืฉื ื•ืฆืจ ื›ื•ืœืœ ืงื•ื‘ืฅ package.json ืขื ื”ื’ื“ืจืช ืกืงืจื™ืคื˜ ืœื‘ื ื™ื”:
  "scripts": {
    "build": "esbuild app/javascript/*.* --bundle --sourcemap --format=esm --outdir=app/assets/builds --public-path=/assets"
  },
ื‘ืฉื‘ื™ืœ ืœื”ืคืขื™ืœ ืืช ื”ืคืจื•ื™ืงื˜ ืžืฉื•ืจืช ื”ืคืงื•ื“ื” ืื ื—ื ื• ื›ื•ืชื‘ื™ื:
./bin/dev
ื–ื” ื’ื•ืจื ืœื”ืคืขืœืช ื”ืคืงื•ื“ื•ืช ืžืชื•ืš ื”ืงื•ื‘ืฅ Procfile ืฉื’ื ื ื•ืฆืจ ื‘ืื•ืชื” ืชื™ืงื™ื™ื”:
web: env RUBY_DEBUG_OPEN=true bin/rails server
js: yarn build --watch
ืคืงื•ื“ืช ื” js ืฉื ืžืคืขื™ืœื” ืืช ืกืงืจื™ืคื˜ ื”ื‘ื ื™ื™ื” ื•ืžื•ืกื™ืคื” ืœื• ืืช ื”ืžืชื’ watch. ื‘ืฆื•ืจื” ื›ื–ืืช ื”ืชื”ืœื™ืš ืฉืœ js ื™ืžืฉื™ืš ืœืจื•ืฅ ื•ืœื‘ื ื•ืช ืžื—ื“ืฉ ืืช ืงื‘ืฆื™ ื” JavaScript ื›ืœ ืคืขื ืฉื™ื”ื™ื” ืฉื™ื ื•ื™ ื‘ืงื‘ืฆื™ื ื‘ืขื–ืจืช esbuild. ื›ืฉื ืจืฆื” ืœื‘ื ื•ืช ืืช ื”ืคืจื•ื™ืงื˜ ืœืคืจื•ื“ืงืฉืŸ ื ืคืขื™ืœ:
./bin/rails assets:precompile
ื•ื–ื” ื™ืจื™ืฅ ืื•ื˜ื•ืžื˜ื™ืช ืืช ืกืงืจื™ืคื˜ ื” build ืžืงื•ื‘ืฅ ื” package.json. ื‘ื’ืœืœ ืคืงื•ื“ืช ื”ื‘ื ื™ื” ืฉืžื•ื’ื“ืจืช ืฉื ESBuild ื™ื‘ื ื” ืืช ืงื‘ืฆื™ ื” JavaScript ื•ื™ืฉืžื•ืจ ืื•ืชื ืœืชื•ืš ืชื™ืงื™ื™ืช app/assets/build. ืฉื ื™ืืกื•ืฃ ืื•ืชื sprockets ื‘ื’ืœืœ ืงื•ื‘ืฅ ื”ื”ื’ื“ืจื•ืช app/assets/config/manifest.js. ื–ื” ืชื•ื›ื ื•:
//= link_tree ../images
//= link_directory ../stylesheets .css
//= link_tree ../builds
ื‘ืขื–ืจืช sprockets ื”ืงื‘ืฆื™ื ื™ื•ืขืชืงื• ืœืชื™ืงื™ื™ืช public ื•ื’ื ื™ืงื‘ืœื• ืชื•ืกืคืช ืฉืœ digest ืœืฉืžื. ืื—ืจื™ ื‘ื ื™ื™ื” ืื ื™ ืžื•ืฆื ืืช ื”ืงื‘ืฆื™ื ื”ื‘ืื™ื ืฉื:
$ ls public/assets/*.js
public/assets/actioncable-1c7f008c6deb7b55c6878be38700ff6bf56b75444a086fa1f46e3b781365a3ea.js
public/assets/actioncable.esm-06609b0ecaffe2ab952021b9c8df8b6c68f65fc23bee728fc678a2605e1ce132.js
public/assets/actiontext-78de0ebeae470799f9ec25fd0e20ae2d931df88c2ff9315918d1054a2fca2596.js
public/assets/actiontext.esm-328ef022563f73c1b9b45ace742bd21330da0f6bd6c1c96d352d52fc8b8857e5.js
public/assets/activestorage-503a4fe23aabfbcb752dad255f01835904e6961d5f20d1de13987a691c27d9cd.js
public/assets/activestorage.esm-b3f7f0a5ef90530b509c5e681c4b3ef5d5046851e5b70d57fdb45e32b039c883.js
public/assets/application-c3ea1831495badf025afd8fd7722fb857c51927f0cc017c366fda52f0d926be2.js
public/assets/common-4e2a87d110376bedbe6f1edea889eb9c368a64a988cab5d3d8527dafd52dc067.js
public/assets/hello-7301560822385b452fd44614e6fc857b520f5082b343eed0dea9d5d2812db9e4.js
public/assets/manifest-dad05bf766af0fe3d79dd746db3c1361c0583026cdf35d6a2921bccaea835331.js
public/assets/stimulus-autoloader-c584942b568ba74879da31c7c3d51366737bacaf6fbae659383c0a5653685693.js
public/assets/stimulus-f75215805563870a61ee9dc5a207ce46d4675c7e667558a54344fd1e7baa697f.js
public/assets/stimulus-importmap-autoloader-db2076c783bf2dbee1226e2add52fef290b5d31b5bcd1edd999ac8a6dd31c44a.js
public/assets/stimulus-loading-3576ce92b149ad5d6959438c6f291e2426c86df3b874c525b30faad51b0d96b3.js
public/assets/stimulus.min-dd364f16ec9504dfb72672295637a1c8838773b01c0b441bd41008124c407894.js
public/assets/trix-686ab55c2aea8035a7f728b61ec7afedfe857f70d6279ab453da775b7469e9e8.js
public/assets/turbo-84e828a0e6f1f9418a277df89df877e9a30524438cf8dc007c066655017a44bc.js

ToCode
1 419
ืื ?? ื›ืœ ื›ืš ื™ื•ืชืจ ื˜ื•ื‘, ืœืžื” ืœื ืžืฉืชืžืฉื™ื ื‘ื• ื™ื•ืชืจ? ืื•ืคืจื˜ื•ืจ ?? ื‘ JavaScript, ืื• ื‘ืฉืžื• ื”ืจืฉืžื™ Nullish Coalescing operator, ื”ื•ื ื’ื™ืจืกื” ื”ื’ื™ื•ื ื™ืช ื™ื•ืชืจ ืฉืœ ||. ื˜ื•ื‘ ืœืคื—ื•ืช ื”ื’ื™ื•ื ื™ืช ื™ื•ืชืจ ืœื—ืœืง ืžืฉืžืขื•ืชื™ ืžื”ืžืฆื‘ื™ื. ืขื‘ื•ืจ || ื”ืขืจืš 0 ื ื—ืฉื‘ ืœ"ืฉืงืจ" ื•ืขื‘ื•ืจ ?? ื”ื•ื ื ื—ืฉื‘ ืœ"ืืžืช". ื–ื” ืื•ืžืจ ืฉืขื || ื™ืฉ ืœื ื•:
> const items = [10, 20, 30, 40]
undefined
> const firstIndexOfTenOrFifty = items.indexOf(10) || items.indexOf(50)
undefined
> firstIndexOfTenOrFifty
-1
ืœืขื•ืžืชื• ืขื ?? ืื ื—ื ื• ืžืงื‘ืœื™ื ืืช ื”ืื™ื ื“ืงืก ื”ื ื›ื•ืŸ ืฉืœ ื”ืžืกืคืจ 10:
> const items = [10, 20, 30, 40]
undefined
> const firstIndexOfTenOrFifty = items.indexOf(10) ?? items.indexOf(50)
undefined
> firstIndexOfTenOrFifty
0
ืื– ืœืžื” ื‘ื›ืœ ื–ืืช ืื ื—ื ื• ื›ืžืขื˜ ืœื ืจื•ืื™ื ืื•ืชื• ื‘ืงื•ื“? ื›ืžื” ืจืขื™ื•ื ื•ืช: 1. ืื ื—ื ื• ืคื—ื•ืช ืžื›ื™ืจื™ื ื•ืคื—ื•ืช ืจื’ื™ืœื™ื ืœื”ืฉืชืžืฉ ื‘ืชื—ื‘ื™ืจ ื—ื“ืฉ. 2. ืื ื—ื ื• ื—ื•ืฉืฉื™ื ืฉืืœื” ืฉื™ืงืจืื• ืืช ื”ืงื•ื“ ืœื ืžื›ื™ืจื™ื. 3. ืื ื—ื ื• ืœื ื‘ื˜ื•ื—ื™ื ื‘ืื™ื–ื” ื“ืคื“ืคื ื™ื ื”ื•ื ื™ืขื‘ื•ื“ (ืขื•ื‘ื“ ื‘ื›ืœ ืžืงื•ื). 4. ืžืžื™ืœื ืจื•ื‘ ื”ื–ืžืŸ ืื ื—ื ื• ื‘ื•ื“ืงื™ื "ืื•" ื‘ื™ืŸ ืขืจื›ื™ื ื‘ื•ืœื™ืื ื™ื, ืื– ื–ื” ืœื ื›ื–ื” ืžืฉื ื”. ืžื” ื“ืขืชื›ื? ื‘ืื™ื–ื• ืžื™ื“ื” ืืชื ืžืฉืชืžืฉื™ื ื‘ืฉื ื™ ืกื™ืžื ื™ ื”ืฉืืœื”? ื•ืœืžื” ืืชื ืœื ืžืฉืชืžืฉื™ื ื‘ื• ื™ื•ืชืจ?

ToCode
1 419
ืืชื” ืขื•ื“ ืชืฉืœื ืขืœ ื–ื” ืื ื™ ืขื•ื–ืจ ืœืœืงื•ื— ืœืฉื“ืจื’ ืžืขืจื›ืช ืจื™ื™ืœืก. ื”ื”ืชื—ืœื” ื ืจืืชื” ืžื‘ื˜ื™ื—ื” ืื‘ืœ ืฉืกื™ื™ืžื ื• ืืช ื›ืœ ืฉื™ื ื•ื™ื™ ื”ื’ื™ืจืกืื•ืช ื•ืขื‘ื•ื“ื” ืœืคื™ ื›ืœ ืžื“ืจื™ื›ื™ ื”ืฉื™ื“ืจื•ื’ ื”ื’ื™ืข ื”ื—ืœืง ื”ืงืฉื” - ื›ืœ ืคืขื ืฉืžืชื›ื ืช ืื• ืžืชื›ื ืชืช ื‘ืคืจื•ื™ืงื˜ ื—ืฉื‘ื• ืฉื”ื ื™ื•ื“ืขื™ื ื™ื•ืชืจ ื˜ื•ื‘ ืžื”ืชื™ืขื•ื“ ื•ื‘ื ื• ืžื ื’ื ื•ืŸ ืžืชื•ื—ื›ื ื›ื“ื™ ืœื”ืชืžื•ื“ื“ ืขื ืžืฉื”ื• ืฉื ืชืคืก ื‘ืขื™ื ื™ื”ื ื›ืžื’ื‘ืœื” ืฉืœ ื”ืกืคืจื™ื” ื”ืคื›ื” ืœื”ื™ื•ืช ืžืกืข ืฉืœ ืคื™ืชื•ื— ืžื—ื“ืฉ ืฉืœ ื”ืžื ื’ื ื•ืŸ, ื›ื™ ื”ื’ื™ืจืกื” ื”ื—ื“ืฉื” ืฉืœ ื”ืกืคืจื™ื” ืœื ืžืชืื™ืžื” ืœืจืขื™ื•ืŸ ื”ืžืชื•ื—ื›ื ืžืœืคื ื™ ืฉื ืชื™ื™ื. ืืœื” ื”ื“ื‘ืจื™ื ืฉืกื™ื‘ื›ื• ืื•ืชื ื• ืขื“ ืขื›ืฉื™ื•: 1. ื›ืœ ืžื ื’ื ื•ืŸ ื‘ื ื™ื™ืช ื” JavaScript/CSS ื”ืฉืชื ื” ืžืื•ื“ ื‘ืจื™ื™ืœืก ื‘ืฉื ื™ื ื”ืื—ืจื•ื ื•ืช. ื›ืฉื”ืคืจื•ื™ืงื˜ ื ื›ืชื‘ ื‘ืžืงื•ืจ ืœื ื”ื™ืชื” ื“ืจืš ืกื˜ื ื“ืจื˜ื™ืช ืœืฉืœื‘ FrontEnd App ืขื ืงื•ื“ ืจื™ืืงื˜ ื•ืœื›ืŸ ื›ืœ ืคืจื•ื™ืงื˜ ื ืจืื” ืื—ืจืช. 2. ืฉื™ืžื•ืฉ ื‘ Composite Primary Keys ื‘ืขื‘ืจ ืœื ื ืชืžืš ื‘ืจื™ื™ืœืก. ื”ื™ื•ื ื”ื•ื ื›ื‘ืจ ื ืชืžืš ื•ืœื›ืŸ ื™ืฉ ืœืขื“ื›ืŸ ืืช ื”ืงื•ื“ ืฉื™ืขืฉื” ืฉื™ืžื•ืฉ ื‘ืžื ื’ื ื•ืŸ ื”ื—ื“ืฉ (ื›ื™ ื”ืคื™ืชืจื•ืŸ ื”ื™ืฉืŸ ื ืฉื‘ืจ). 3. ืžื ื’ื ื•ืŸ ืงื‘ืฆื™ื ืžืฆื•ืจืคื™ื ื”ืคืš ืกื˜ื ื“ืจื˜ื™ ื‘ืจื™ื™ืœืก, ืžื” ืฉืžื—ื™ื™ื‘ ืœืฉื ื•ืช ืืช ื”ืžื ื’ื ื•ืŸ ื‘ืงื•ื“ ื•ืœืขื“ื›ืŸ ืืช ื”ื ืชื•ื ื™ื ื‘ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ืขืœ ื”ืงื‘ืฆื™ื ืฉื›ื‘ืจ ืฉืžื•ืจื™ื ื‘ืžืขืจื›ืช. ื‘ืกื•ืฃ ื”ื›ืœ ื™ืขื‘ื•ื“ ื˜ื•ื‘ ื™ื•ืชืจ ื–ื” ื‘ืจื•ืจ, ืื‘ืœ ื‘ื™ื ืชื™ื™ื ื”ืฉื™ื“ืจื•ื’ ื”ื–ื” ื”ื•ื ืชื–ื›ื•ืจืช ื˜ื•ื‘ื” ืœืžื” ืขื“ื™ืฃ ืœืฉื“ืจื’ ื‘ืฆืขื“ื™ื ืงื˜ื ื™ื ื•ืชืžื™ื“ ืœืขื‘ื•ื“ ื‘ืฆื•ืจื” ืกื˜ื ื“ืจื˜ื™ืช.

ToCode
1 419
ื” Killer Feature ื”ื—ื“ืฉ ืฉืœ node.js (ืื•: ื”ืื ื–ื” ื”ืกื•ืฃ ืฉืœ ื“ื™ื ื•?) ืœื ืจื—ื•ืง ื”ื™ื•ื ื‘ื• ื ื•ื›ืœ ืœื”ืคืขื™ืœ ืงื‘ืฆื™ TypeScript ื‘ node.js, ื›ืš ืœืคื™ ื“ื™ื•ืŸ ื‘ื ื•ืฉื ื‘ื’ื™ื˜ื”ืื‘ ืฉืœ ื ื•ื“ (ื›ื‘ืจ ืขื•ื‘ื“ ื‘ Nightly). ืืœื” ื”ื“ื’ืฉื™ื ืฉืœ ื”ืคื™ืฆ'ืจ: 1. ืื™ืŸ ื‘ื“ื™ืงืช ื˜ื™ืคื•ืกื™ื ื‘ื”ืจืฆื”. ื–ื• ืื’ื‘ ื’ื ื”ื”ืชื ื”ื’ื•ืช ืฉืœ deno, ื‘ืืŸ ื•ื’ื esbuild ื‘ืคืจื•ื ื˜ ืื ื“. ื”ืกื™ื‘ื” ื”ื™ื ืฉืื™ืŸ ื˜ืขื ืœื‘ื“ื•ืง ื˜ื™ืคื•ืกื™ื ืœืคื ื™ ื”ืจืฆื”, ื•ืขื“ื™ืฃ ืœื”ืฉืชืžืฉ ื‘ื˜ื™ืคื•ืกื™ื ื‘ืชื•ืจ ื˜ื™ืคื™ื ืœ IDE ืื• ืœื‘ื“ื™ืงื” ื™ื–ื•ืžื” ื›ื—ืœืง ืžื”ืจืฆืช ื‘ื“ื™ืงื•ืช ืื• CI/CD. 2. ืื™ืŸ ืชืžื™ื›ื” ืžื•ื‘ื ื™ืช ื‘ npm ื›ืžื• ืฉื™ืฉ ืœื“ื™ื ื•, ื‘ืžื•ื‘ืŸ ื–ื” ืฉื™ืฉ ื—ื‘ื™ืœื” ืฉื”ื™ื ื—ื‘ื™ืœืช TypeScript ืฉืžื’ื™ืขื” ืขื ื”ื’ื“ืจื•ืช ื”ื˜ื™ืคื•ืกื™ื. ืžืคื™ืฆื™ ื—ื‘ื™ืœื•ืช ื™ื›ื•ืœื™ื ืœื›ืชื•ื‘ ืงื•ื‘ืฅ ื˜ื™ืคื•ืกื™ื ื•ืœื”ืคื™ืฅ ืื•ืชื•, ืื• ื™ื›ื•ืœื™ื ืœื”ืคื™ืฅ ืืช ื”ื˜ื™ืคื•ืกื™ื ื‘ืžืกื’ืจืช ื—ื‘ื™ืœื” ื—ื™ืฆื•ื ื™ืช ืื• ืžื” ืฉื™ืจืฆื•. ื‘ื›ืœ ื–ืืช ืื™ืŸ ืœื™ ืกืคืง ืฉืืคืฉืจื•ืช ืœื”ืจื™ืฅ TypeScript ื‘ืœื™ ืฉื•ื ืกืคืจื™ื™ื” ื—ื™ืฆื•ื ื™ืช ืชื”ืคื•ืš ืืช node ืœื”ืจื‘ื” ื™ื•ืชืจ ืชื—ืจื•ืชื™ ื•ืชื•ืฆื™ื ื”ืจื‘ื” ืžื”ืื•ื•ื™ืจ ืž deno ื• bun. ื‘ื”ื™ื ืชืŸ ืฉื”ืืงื•ืกื™ืกื˜ื ืฉืœ node ื”ื•ื ืขื“ื™ื™ืŸ ื”ื’ื“ื•ืœ ื‘ื™ื•ืชืจ ื•ื›ืš ื›ื ืจืื” ื™ื™ืฉืืจ, ื”ื™ื™ืชืจื•ืŸ ื”ืžืจื›ื–ื™ ืฉืœ ื“ื™ื ื• ื”ื•ื deno deploy ื•ืฉืœ bun ื–ื” ื”ื‘ื™ืฆื•ืขื™ื.

ToCode
1 419
ืฉืžื•ืช ืžื•ืขื“ื™ื ืœืคื•ืจืขื ื•ืช ื”ืกืคืจื™ื” swr ืžืฉืžืฉืช ืœืžืฉื™ื›ืช ืžื™ื“ืข ืžื”ืจืฉืช ื‘ื™ื™ืฉื•ื ืจื™ืืงื˜. ื‘ืฉื™ืžื•ืฉ ื”ื‘ืกื™ืกื™ ื”ืงื•ื“ ืขืฉื•ื™ ืœื”ื™ืจืื•ืช ื›ืš:
import React from "react";
import useSWR from "swr";

const fetcher = (url) => fetch(url).then((res) => res.json());

export default function App() {
  const { data, error, isLoading } = useSWR(
    "https://api.github.com/repos/vercel/swr",
    fetcher
  );

  if (error) return "An error has occurred.";
  if (isLoading) return "Loading...";
  return (
    <div>
      <h1>{data.name}</h1>
      <p>{data.description}</p>
      <strong>๐Ÿ‘ {data.subscribers_count}</strong>{" "}
      <strong>โœจ {data.stargazers_count}</strong>{" "}
      <strong>๐Ÿด {data.forks_count}</strong>
    </div>
  );
}
ืงืฉื” ืœืจืื•ืช ืžื”ืงื•ื“ ืื‘ืœ ื—ื•ืฅ ืžื”ื‘ืืช ืžื™ื“ืข ืžื”ืจืฉืช ื”ืงืจื™ืื” ืœ useSWR ื’ื ื“ื•ืื’ืช ืœืขื“ื›ื•ืŸ ืื•ื˜ื•ืžื˜ื™ ืฉืœ ื”ืžื™ื“ืข ื‘ื›ืœ ื”ื–ื“ืžื ื•ืช ืฉื”ื™ื ื™ื›ื•ืœื” ื•ื‘ืžื™ื•ื—ื“ ื‘ืขืช ืฉื™ื ื•ื™ ืคื•ืงื•ืก. ื•ื›ื›ื” ืžื’ื™ืขื™ื ืœื‘ืื’ ืฉืงืฉื” ืœืืชืจ - ืžืฉืชืžืฉื™ื ืžืชืœื•ื ื ื™ื ืฉืžื“ื™ ืคืขื ื“ื‘ืจื™ื ืžืฉืชื ื™ื ืœื”ื ืขืœ ื”ืžืกืš, ืื—ืจื™ ื—ื™ืคื•ืฉ ืื ื—ื ื• ืžื’ืœื™ื ืฉื”"ืžื“ื™ ืคืขื" ื”ื–ื” ืงื•ืจื” ื›ืฉืขื•ื‘ืจื™ื ืœื—ืœื•ืŸ ืื—ืจ ื•ื—ื•ื–ืจื™ื ืœื—ืœื•ืŸ ืฉืœ ื”ืืคืœื™ืงืฆื™ื” ื•ื”ืฉื™ื ื•ื™ ื ื’ืจื ื›ื™ ื”ืฉืจืช ืžื—ื–ื™ืจ ืžื™ื“ืข ืงืฆืช ืฉื•ื ื” ื›ืœ ืคืขื. ืืคื™ืœื• ื‘ื“ื•ื’ืžืช ื”ืงื•ื“ ืฉื”ื“ื‘ืงืชื™ ื–ื” ื™ื›ื•ืœ ืœื”ื™ื•ืช ืžืื•ื“ ืžื‘ืœื‘ืœ ืœืžืฉืชืžืฉื™ื ื›ืฉื”ื ืขื•ื‘ืจื™ื ื‘ื™ืŸ ื—ืœื•ื ื•ืช ื•ืคืชืื•ื ืžืกืคืจ ื”ื›ื•ื›ื‘ื™ื ืฉืœ ืจื™ืคื• ืžืฉืชื ื”, ืฉืœื ืœื“ื‘ืจ ืžืฆื‘ื™ื ื‘ื”ื ื”ืฉืจืช ืฉื•ืœื— ืžื™ื“ืข ืืงืจืื™ ืื• ืืคื™ืœื• ื‘ืกื“ืจ ืืงืจืื™. ืžื” ืขื•ืฉื™ื? ืชืฉืžื—ื• ืœืฉืžื•ืข ืฉ SWR ืžื’ื™ืขื” ืขื ืขื•ื“ ืคื•ื ืงืฆื™ื” ื‘ืฉื ื”ืžื•ืคืœื useSWRImmutable. ื”ื™ื ื ื•ืขื“ื” ืœืคื™ ื”ืชื™ืขื•ื“ ืœืžืงืจื™ื ื‘ื”ื ื”ืžืฉืื‘ (ื›ืœื•ืžืจ ื”ื“ื‘ืจ ืฉืื ื—ื ื• ืžืงื‘ืœื™ื ืžื”ืฉืจืช) ืœืขื•ืœื ืœื ืžืฉืชื ื”, ื•ืœื›ืŸ SWR ืœื ื™ื ืกื” ืืฃ ืคืขื ืœืžืฉื•ืš ืžื—ื“ืฉ ืืช ื”ืžื™ื“ืข ืขืœ ื“ืขืช ืขืฆืžื•. ื”ืฉืืœื” ื”ื™ื—ื™ื“ื” ืฉื ืฉืืจื” ื”ื™ื ืœืžื” ืœืงืจื•ื ืœืคื•ื ืงืฆื™ื” useSWRImmutable ื›ืฉื‘ืจื•ืจ ืฉื”ืื ืฉื™ื ื”ื™ื—ื™ื“ื™ื ืฉืฆืจื™ื›ื™ื ืœื”ืคืขื™ืœ ืื•ืชื” ื”ื ืืœื” ืฉื”ืžืฉืื‘ ืฉื”ื ืžื•ืฉื›ื™ื ืžื”ืฉืจืช ื”ื•ื ืœื Immutable...

ToCode
1 419
ืžื” ืฉืืคืฉืจ ืœืชืงืŸ ืœืคื™ ื”ืชืคื™ืกื” ื”ืจื•ื•ื—ืช ืœื’ื‘ื™ ืื™ื›ื•ืช ืฉืœ ืžืชื›ื ืชื™ื (ื ื™ื ื’'ื•ืช, ื›ืคื™ ืฉืžื›ื•ื ื™ื ื‘ืžื•ื“ืขื•ืช ื”ื“ืจื•ืฉื™ื) ืืœื” ื”ื“ื‘ืจื™ื ืฉื›ื“ืื™ ืœื”ืกืชื›ืœ ืขืœื™ื”ื ื›ืฉืื ื—ื ื• ืžื’ื™ืขื™ื ืœื”ืขืจื™ืš ืžืชื›ื ืช ืื• ืžืชื›ื ืชืช: 1. ื”ื™ื›ื•ืœืช ืœื‘ื—ื•ืจ ืกื˜ืืง ื˜ื›ื ื•ืœื•ื’ื™ ืžืชืื™ื ืœื‘ืขื™ื” ื•ืœื”ืฆื“ื™ืง ืืช ื”ื‘ื—ื™ืจื”. 2. ื”ื™ื›ื•ืœืช ืœืคืชื•ืจ ื‘ืขื™ื” ืžื”ืจ ื‘ืชื•ืš ื”ืกื˜ืืง ื”ื˜ื›ื ื•ืœื•ื’ื™ ื”ืจืœื•ื•ื ื˜ื™. 3. ื”ื™ื›ื•ืœืช ืœื”ื™ื›ื ืก ืœืงื•ื“, ืœืชืงืŸ ืื• ืœื”ืจื—ื™ื‘ ืื•ืชื• ื‘ืœื™ ืœืฉื‘ื•ืจ ื“ื‘ืจื™ื ืงื™ื™ืžื™ื. 4. ื”ื™ื›ื•ืœืช ืœื–ื”ื•ืช ื‘ืขื™ื•ืช ืžื”ืจ. 5. ื”ื™ื›ื•ืœืช ืœื‘ื—ื•ืจ ืžื‘ื™ืŸ ืžืกืคืจ ืืœื˜ืจื ื˜ื™ื‘ื•ืช ืืช ื”ืคื™ืชืจื•ืŸ ื”ื™ืขื™ืœ ื‘ื™ื•ืชืจ. ืืœื” ื’ื ื”ื™ื›ื•ืœื•ืช ืขืœื™ื”ืŸ ืื ื—ื ื• ื ื‘ื—ื ื™ื ื‘ืจืื™ื•ื ื•ืช ืขื‘ื•ื“ื” ื•ืืœื” ื”ื™ื›ื•ืœื•ืช ืฉืžืชื›ื ืชื™ื ืจื‘ื™ื ืžื ืกื™ื ืœืฉืคืจ. ื”ื‘ืขื™ื”, ืื ื‘ืžืงืจื” ื ื™ืกื™ืชื ืœืฉืคืจ ื™ื›ื•ืœื•ืช ืืœื”, ื”ื™ื ืฉื–ื” ืžืื•ื“ ืงืฉื”. ืื™ืŸ ืกืคืจ ืฉืžืกื‘ื™ืจ "ืื™ืš ืœืคืชื•ืจ ื‘ืขื™ื•ืช ืžื”ืจ" ื•ืืœื” ืฉื™ืฉ ืœื ืžืžืฉ ืขื•ื–ืจื™ื. ื›ืœ ื”ืžื™ื•ืžื ื•ื™ื•ืช ื”ืืœื” ื ื‘ื ื•ืช ืขื ื”ื–ืžืŸ ื•ืขื ื”ื ื™ืกื™ื•ืŸ, ื‘ืชื ืื™ ืฉืื ื—ื ื• ื™ื•ื“ืขื™ื ืœื ืฆืœ ืืช ื”ื–ืžืŸ ื•ื”ื ื™ืกื™ื•ืŸ ื‘ืฆื•ืจื” ื ื›ื•ื ื”. ื‘ืžื™ืœื™ื ืื—ืจื•ืช ื›ื›ืœ ืฉื ืขื‘ื•ื“ ื‘ืฆื•ืจื” ืžืงืฆื•ืขื™ืช ื™ื•ืชืจ ืœืื•ืจืš ื–ืžืŸ ืื•ืชืŸ ื™ื›ื•ืœื•ืช ืฉืงืฉื” ืœืฉืคืจ ื™ืฉืชืคืจื• ืžืขืฆืžืŸ. ื”ื“ืจืš ืงื“ื™ืžื” ื”ื™ื ืœืฉื™ื ืœื‘ ืœืชื”ืœื™ืš ื”ืžืงืฆื•ืขื™: 1. ื”ืžื—ื•ื™ื‘ื•ืช ืœื”ืฉืื™ืจ ืงื•ื“ ื ืงื™ ืื—ืจื™ ืฉืคื•ืชืจื™ื ื‘ืขื™ื”. 2. ื”ืžื—ื•ื™ื‘ื•ืช ืœื”ื‘ื™ืŸ ืœืขื•ืžืง ื›ืœ ืฉื•ืจืช ืงื•ื“ ืฉืื ื—ื ื• ืžื›ื ื™ืกื™ื ืœืžืขืจื›ืช, ื’ื ืื "ื–ื” ืขื•ื‘ื“". 3. ื”ืžื—ื•ื™ื‘ื•ืช ืœื—ืคืฉ ืžืงืจื™ ืงืฆื” ื•ืœื˜ืคืœ ื‘ื”ื, ื’ื ื›ืฉื” Happy Path ื›ื‘ืจ ื›ืชื•ื‘. 4. ื”ืžื—ื•ื™ื‘ื•ืช ืœื—ืคืฉ ื›ืžื” ื“ืจื›ื™ ืคืขื•ืœื” ื›ื“ื™ ืฉืืคืฉืจ ื™ื”ื™ื” ืœื‘ื—ื•ืจ ืืช ื”ื˜ื•ื‘ื” ื‘ื™ื•ืชืจ. 5. ื”ืžื—ื•ื™ื‘ื•ืช ืœื‘ื ื•ืช ืชื”ืœื™ื›ื™ื ืฉื™ืขื–ืจื• ื’ื ืœืžืชื›ื ืชื™ื ืฉื™ื‘ื•ืื• ืื—ืจื™ื ื•. 6. ื”ืžื—ื•ื™ื‘ื•ืช ืœื—ืคืฉ ืžืงื•ืžื•ืช ืขื‘ื•ื“ื” ืžืืชื’ืจื™ื ื•ืฉื•ืชืคื™ื ืฉืืคืฉืจ ืœืœืžื•ื“ ืžื”ื. ืžื—ื•ื™ื‘ื•ืช ืœืžืฆื•ื™ื ื•ืช ืœืื•ืจืš ื–ืžืŸ ื”ื™ื ื”ื“ืจืš ื”ื™ื—ื™ื“ื” ื•ื”ื‘ื˜ื•ื—ื” ืœื”ืชืงื“ื.

ToCode
1 419
ื”ืกืคืจ ืฉืœื ืกื™ื™ืžืชื™ ื”ื›ืœืœ ื”ื‘ืกื™ืกื™ ืฉืœ ืœื™ืžื•ื“ ื“ืจืš ื”ืจื’ืœื™ื - ืžื•ืชืจ ืœืขื–ื•ื‘ ืกืคืจ, ืืกื•ืจ ืœืขื–ื•ื‘ ืืช ื”ื”ืจื’ืœ. ืื ื”ืชื—ืœืช ืœืงืจื•ื ืกืคืจ ืขืœ SQL ื›ื“ื™ ืœืœืžื•ื“ ืืช ื”ื˜ื›ื ื•ืœื•ื’ื™ื” ื•ื’ื™ืœื™ืช ืฉื”ืกืคืจ ืžืฉืขืžื ืื™ืŸ ืฉื•ื ื‘ืขื™ื” ืœืขื‘ื•ืจ ืœืœืžื•ื“ ื“ืจืš ืงื•ืจืก, ื“ืจืš ืชืจื’ื•ืœ, ื“ืจืš ืฆืคื™ื” ื‘ื”ืจืฆืื•ืช ื‘ื™ื•ื˜ื™ื•ื‘, ื“ืจืš ืงืจื™ืืช ืชื™ืขื•ื“ ืื• ื‘ื›ืœ ืฉื™ื˜ื” ืื—ืจืช. ืžื” ืฉื—ืฉื•ื‘ ื–ื” ืœื”ืžืฉื™ืš ืœืœืžื•ื“ ืืช ื”ื ื•ืฉื ื—ืฆื™ ืฉืขื” ื‘ื™ื•ื (ืื• ื›ืžื” ืฉืชื›ื ื ืช ืœืงืจื•ื ืืช ื”ืกืคืจ). ื”ื ื” ืขื•ื“ ื›ืžื”, ืขื ื”ื“ื’ืฉื™ื ื”ืจืœื•ื•ื ื˜ื™ื™ื- 1. (ื›ืฉืœื•ืžื“ื™ื ื ื•ืฉื ื“ืจืš ืคื™ืชื•ื— ืคืจื•ื™ืงื˜) ืžื•ืชืจ ืœืขื–ื•ื‘ ืคืจื•ื™ืงื˜, ืืกื•ืจ ืœืขื–ื•ื‘ ืืช ื”ืงื™ื“ื•ื“. ื•ื”ื“ื’ืฉ - ืฉื™ืžื• ืœื‘ ืฉื‘ืคืจื•ื™ืงื˜ ื™ืฉ ืฉืœื‘ื™ื. ืื™ ืืคืฉืจ ืœื”ืชืงื“ื ืื ืขื•ืฉื™ื ืจืง ื”ืชื—ืœื•ืช ืฉืœ ืคืจื•ื™ืงื˜ื™ื (ืื• ืจืง ืกื•ืคื™ื). 2. (ื›ืฉืœื•ืžื“ื™ื ื ื•ืฉื ื“ืจืš ืงื•ืจืก) ืžื•ืชืจ ืœืขื–ื•ื‘ ืชืจื’ื™ืœ, ืืกื•ืจ ืœืขื–ื•ื‘ ืืช ื”ืงื•ืจืก. ื•ื’ื ืคื” ื ืฉื™ื ืœื‘ ืฉืื ื—ื ื• ืœื ืจื•ืฆื™ื ืœื“ืœื’ ืขืœ ื›ืœ ื”ืชืจื’ื™ืœื™ื ืฉืงืฉื•ืจื™ื ืœืคืจืง ืžืกื•ื™ื, ืื‘ืœ ืื™ืŸ ืฉื•ื ื‘ืขื™ื” ืœืงื—ืช ื›ืžื” ืงื•ืจืกื™ื ื•ืœืขืฉื•ืช Mix & Match ืœืชืจื’ื™ืœื™ื ืžืงื•ืจืกื™ื ืฉื•ื ื™ื. 3. (ื›ืฉืžื ืกื™ื ืœื”ืฉืชืคืจ ื‘ืขื‘ื•ื“ืช ืฆื•ื•ืช) ืžื•ืชืจ ืœืขื–ื•ื‘ ืืช ื”ืงื‘ื•ืฆื”, ื‘ืชื ืื™ ืฉืžื•ืฆืื™ื ืงื‘ื•ืฆื” ืื—ืจืช ื‘ืžืงื•ื. ื•ื”ื“ื‘ืจ ื”ื—ืฉื•ื‘ ื›ืฉืœื•ืžื“ื™ื ืขื‘ื•ื“ืช ืฆื•ื•ืช ื”ื•ื ืœื”ืชืืžืŸ ืขืœ ื›ืžื” ืฉื™ื•ืชืจ ืชืคืงื™ื“ื™ื ื‘ืชื•ืš ื”ืงื‘ื•ืฆื”.

ToCode
1 419
ื˜ื™ืค ืกืงืืœื”: ืฉืจืช REST API ืคืฉื•ื˜ ืขื cask ื”ื ื™ืกื™ื•ืŸ ื”ืจืืฉื•ืŸ ืฉืœื™ ืœื›ืชื•ื‘ ืฉืจืช API ื‘ืกืงืืœื” ื”ื™ื” ืขื ืกืคืจื™ื™ื” ื‘ืฉื Tapir. ื˜ืคื™ืจ ืžืงืกื™ืžื”, ื™ืฉ ืœื” ื”ืžื•ืŸ ืชื™ืขื•ื“ ื•ื”ืจื‘ื” ื™ื›ื•ืœื•ืช ืžืชืงื“ืžื•ืช, ืื‘ืœ ื“ื•ื•ืงื ื‘ื“ื‘ืจื™ื ื”ืคืฉื•ื˜ื™ื ืžืฆืืชื™ ืคืขืจื™ื ื‘ืชื™ืขื•ื“ ื•ื’ื ื‘ืคื•ื ืงืฆื™ื•ื ืืœื™ื•ืช. ื”ืžืฉืš ื—ื™ืคื•ืฉื™ื ื”ื‘ื™ื ืื•ืชื™ ืœืกืคืจื™ื” ื‘ืฉื cask ืขืœื™ื” ืื ื™ ืจื•ืฆื” ืœืกืคืจ ื”ื™ื•ื. ืื‘ืœ ืงื•ื“ื ื”ืงื•ื“:
package restapi
import cask._
import cask.model.{Request, Response}
import io.circe._
import io.circe.generic.auto._
import io.circe.syntax._
case class Demo(text: String)

object MyServer extends cask.MainRoutes {
  val JsonCorsHeaders: Seq[(String, String)] = Seq(
    "Content-Type" -> "application/json",
    "Access-Control-Allow-Origin" -> "*",
    "Access-Control-Allow-Methods" -> "GET, POST, PUT, DELETE, OPTIONS",
    "Access-Control-Allow-Headers" -> "Origin, X-Requested-With, Content-Type, Accept, Authorization"
  )

  @cask.options("/*")
  def options() = {
    cask.Response(
      "",
      headers = JsonCorsHeaders
    )
  }

  @cask.route("/", methods = Seq("get"))
  def hello() = {
    cask.Response(
      Demo("hello").asJson.toString,
      headers = JsonCorsHeaders
    )
  }


  initialize()
}
ื”ืงื•ื“ ื™ืฆืจ ืื•ื‘ื™ืงื˜ ืฉืืคืฉืจ ืœื”ืจื™ืฅ ืื•ืชื• (ืœื ืฆืจื™ืš ืœื”ื•ืกื™ืฃ ืœื–ื” main ืื• ืฉื•ื ื“ื‘ืจ), ืฉืžืคืขื™ืœ ืฉืจืช ื•ื•ื‘ ืขื ื ืชื™ื‘ ืื—ื“ - ืจืง ื”ื ืชื™ื‘ ื”ืจืืฉื™, ืฉืžื—ื–ื™ืจ ืชืžื™ื“ ืื•ื‘ื™ืงื˜ JSON ืขื ืžืคืชื— ื‘ืฉื text ื•ื”ืขืจืš hello. ื”ื•ื ืžื—ื–ื™ืจ ื’ื ืกื˜ ืฉืœ ื›ื•ืชืจื•ืช ืฉื”ื’ื“ืจืชื™ ืขื‘ื•ืจ CORS, ื•ืื ื™ื”ื™ื• ื›ืžื” ื ืชื™ื‘ื™ื ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ืื•ืชื• ืกื˜ ื›ื•ืชืจื•ืช ืœื›ื•ืœื. ื‘ื ื•ืกืฃ ื”ืงื•ื“ ืžื’ื“ื™ืจ ื˜ื™ืคื•ืœ ื’ื ืจื™ ืœืžืชื•ื“ืช OPTIONS, ืฉื•ื‘ ื‘ืฉื‘ื™ืœ ื” CORS ืฉืฉื•ืœื—ืช ืจืง ืืช ื”ื›ื•ืชืจื•ืช ื›ื“ื™ ืฉื“ืคื“ืคื ื™ื ื™ื•ื›ืœื• ืœืงื‘ืœ ืžื™ื“ืข ืžืฉืจืช ื–ื” ืžื›ืœ ื“ื•ืžื™ื™ืŸ. ื‘ืฉื‘ื™ืœ ืœื”ืชืงื™ืŸ ืืช Cask ื™ืฉ ืœื”ื•ืกื™ืฃ ืœ build.sbt ืืช ื”ืฉื•ืจื”:
libraryDependencies += "com.lihaoyi" %% "cask" % "0.9.1"
ื•ื›ืŸ ืื ื™ ื™ื•ื“ืข ืฉื”ื™ื™ืชื ื›ื•ืชื‘ื™ื ื›ื–ื” ื‘ node.js, ืคื™ื™ืชื•ืŸ ืื• ืจื•ื‘ื™ ื‘ืขืฉืจ ื“ืงื•ืช. ื‘ืกืงืืœื” ื–ื” ืœืงื— ืœื™ ืฉืขืชื™ื™ื, ื‘ืขื™ืงืจ ื‘ื’ืœืœ ื‘ืขื™ื•ืช ื‘ืชื™ืขื•ื“ ื•ื™ื•ืชืจ ืžื“ื™ ืกืคืจื™ื•ืช ืฉืœ ืฉืจืชื™ ื•ื•ื‘. ืœื›ืœ ืฉืคื” ื™ืฉ ื’ื ืืช ื”ื—ืกืจื•ื ื•ืช ืฉืœื”.

ToCode
1 419
ื›ื–ื” ื ื™ืกื™ืชื™: Webvm.io ืฆืจื™ื›ื™ื ืกื‘ื™ื‘ืช ืœื™ื ื•ืงืก ืœืชืจื’ื•ืœื™ื? webvm.io ื”ื•ื ืื—ื“ ื”ืคืจื•ื™ืงื˜ื™ื ื”ืžืขื ื™ื™ื ื™ื ืฉืจืื™ืชื™ ื‘ืื–ื•ืจ ื”ื–ื”. ื”ื ืœืงื—ื• ืืช Debian ื•ืžืจื™ืฆื™ื ืื•ืชื” ื‘ื“ืคื“ืคืŸ ื‘ืชื•ืจ ืืคืœื™ืงืฆื™ื™ืช Client Side ื‘ืœื‘ื“ ื“ืจืš ื•ื•ื‘ ืืกืžื‘ืœื™, ื•ื’ื ื‘ื ื• ืžื ื’ื ื•ืŸ ืฉืžืืคืฉืจ ืœื‘ื ื•ืช ื›ืœ Dockerfile ืœืžื›ื•ื ืช ืœื™ื ื•ืงืก ืฉืจืฆื” ื‘ื“ืคื“ืคืŸ. ืžืกืคื™ืง ืœื”ื™ื›ื ืก ืœืœื™ื ืง ื›ื“ื™ ืœื”ืชืจืฉื ื•ื”ื ื” ืขื•ื“ ื›ืžื” ื“ื‘ืจื™ื ืฉืื”ื‘ืชื™ ื‘ืคืจื•ื™ืงื˜: 1. ื”ืžื›ื•ื ื” ืžืžืฉื™ื›ื” ืœืจื•ืฅ ื›ืœ ื”ื–ืžืŸ (ื˜ื•ื‘, ื›ืœ ืขื•ื“ ื”ื“ืคื“ืคืŸ ื“ื•ืœืง). ืืคื™ืœื• ื›ืฉืขื‘ืจืชื™ ืœืžืฆื‘ ืฉื™ื ื” ื•ื”ืคืขืœืชื™ ืืช ื”ืžื—ืฉื‘ ืฉื•ื‘ ืื—ืจื™ ืฉืขื•ืช ื”ื›ืœ ื—ื–ืจ ืœืื•ืชื• ืžืฆื‘. ื›ื›ื” ื–ื” ื›ืฉืื™ืŸ ืฆื“ ืฉืจืช. 2. ื”ืจื‘ื” ื“ื‘ืจื™ื ืขื•ื‘ื“ื™ื ืื‘ืœ ืœืื˜. ื”ืคืขืœื” ืจืืฉื•ื ื” ืฉืœ ืคืงื•ื“ื” ื”ื™ื ืื™ื˜ื™ืช ื‘ืžื™ื•ื—ื“ ื•ืื—ืจื™ ื–ื” ื”ื™ื ืจืง ืงืฆืช ืื™ื˜ื™ืช. 3. ื™ืฉ ืชืžื™ื›ื” ื‘ืจืฉืช ื“ืจืš ืฉื™ืจื•ืช ืฉื ืงืจื Tailscale. ืื ื™ ืžื•ื“ื” ืฉื‘ื™ื ืชื™ื™ื ื”ืฆืœื—ืชื™ ืจืง ืœื—ื‘ืจ ืืช ื”ืžื›ื•ื ื” ืœื›ืชื•ื‘ืช IP ืฆื™ื‘ื•ืจื™ืช, ืื‘ืœ ืขื“ื™ื™ืŸ ืœื ืœื”ื’ื™ืข ืืœื™ื” ื‘ SSH ืื• ืœืฆืืช ืžืžื ื”. ืฉื ื™ ื”ื“ื‘ืจื™ื ืืžื•ืจื™ื ืœื”ื™ื•ืช ืืคืฉืจื™ื™ื. 4. ื™ืฉ ืชืžื™ื›ื” ื‘ืขื‘ื•ื“ื” ื‘ืชื•ืจ root (ื ื• ื–ื” ืจืฅ ื‘ื“ืคื“ืคืŸ ืื– ืื™ืŸ ืฉื•ื ื‘ืขื™ื™ืช ืื‘ื˜ื—ื”). ืคืฉื•ื˜ ืžืคืขื™ืœื™ื su ื•ื›ื•ืชื‘ื™ื ืืช ื”ืกื™ืกืžื” password. 5. ื™ืฉ ืขืœ ื”ืžื›ื•ื ื” ื›ื‘ืจ ื›ืžื” ืชื•ื›ื ื•ืช ื›ืžื• python, perl, gcc, vim, ruby. ื‘ื’ืœืœ ืฉืœื ื”ืฆืœื—ืชื™ ืœื”ืคืขื™ืœ ืืช ื”ื—ื™ื‘ื•ืจ ืœืจืฉืช ื’ื ืœื ื”ืฆืœื—ืชื™ ืœื”ืชืงื™ืŸ ืชื•ื›ื ื•ืช ืื—ืจื•ืช. 6. ืฉื™ื ื•ื™ื™ื ื‘ crontab ืฉื ื™ืกื™ืชื™ ืœืขืฉื•ืช ืœื ื ื›ืชื‘ื• ืœื›ืŸ ืื ื™ ืžื ื™ื— ืฉื—ืœืง ืžื”ืงื‘ืฆื™ื ื”ื ืœืงืจื™ืื” ื‘ืœื‘ื“. ืœื ื”ื™ืชื” ื‘ืขื™ื” ืœื™ืฆื•ืจ ืงื‘ืฆื™ื ื‘ืชื™ืงื™ื™ืช ื”ื‘ื™ืช, ืœื”ืคืขื™ืœ ืชื•ื›ื ื•ืช ืื• ื›ืœ ืžืฉื™ืžื” ืื—ืจืช ืฉืœ ืžืฉืชืžืฉ ืจื’ื™ืœ. ืกืš ื”ื›ืœ ืื ืืชื ืžื ืกื™ื ืœืœืžื•ื“ ืœื™ื ื•ืงืก ื•ื‘ืžื™ื•ื—ื“ ืขื‘ื•ื“ื” ืžืฉื•ืจืช ื”ืคืงื•ื“ื”, ื•ืžื—ืคืฉื™ื ืกื‘ื™ื‘ืช ืชืจื’ื•ืœ ืฉืคืฉื•ื˜ ืชืขื‘ื•ื“ ื‘ืœื—ื™ืฆืช ื›ืคืชื•ืจ ืืชืจ webvm ื”ื•ื ื”ืคื™ืชืจื•ืŸ ื”ื˜ื•ื‘ ื•ื”ืžื”ื™ืจ ื‘ื™ื•ืชืจ ืฉืชื•ื›ืœื• ืœืžืฆื•ื. ื ืกื• ื•ืฉืชืคื• ื—ื•ื•ื™ื•ืช.