uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

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

Ko'proq ko'rsatish
1 417
Obunachilar
-224 soatlar
-37 kunlar
-630 kunlar
Postlar arxiv
ToCode
1 417
ื–ื” ืœืงื— ืจืง ืฉืชื™ ื”ื•ื“ืขื•ืช ื›ื•ืœื ืžื“ื‘ืจื™ื ืขืœ base44. ื—ื‘ืจ ืื—ื“ ืขืฉื” ืื™ืชื• ืžืฉื—ืง ื›ื–ื” ื•ื—ื‘ืจ ืื—ืจ ืžืฉื—ืง ืื—ืจ, ืื– ืืžืจืชื™ ื™ืืœืœื” ื’ื ืื ื™ ืจื•ืฆื” ืœื ืกื•ืช. ืื—ืจื™ ืฉืชื™ ื”ื•ื“ืขื•ืช ืงื™ื‘ืœืชื™ ืžืžื ื• ืืช ื”ืชืฉื•ื‘ื”:
However, I don't see an integration available for audio transcription in the current platform. This would significantly limit the tool's usefulness.
ืื ื™ ืžื›ื‘ื“ ืืช ื”ื›ื ื•ืช. ื›ืœื™ื ืื—ืจื™ื ื”ื™ื• ื™ื›ื•ืœื™ื ืœืงื—ืช ืื•ืชื™ ื‘ Loop ื“ืงื•ืช ืืจื•ื›ื•ืช ืขื“ ืฉื”ื™ื™ืชื™ ืžื‘ื™ืŸ ืฉืื ื—ื ื• ื‘ื“ืจืš ืœืœื ืžื•ืฆื. ื•ื”ื›ื ื•ืช ื”ื–ืืช ื”ื™ื ื‘ื“ื™ื•ืง ื”ืกื™ืคื•ืจ ืฉืœ ื” AI ื‘ืคื™ืชื•ื— ืฉืื ื™ ื—ื•ืฉื‘ ืฉืœื ืžืกืคื™ืง ืžื“ื‘ืจื™ื ืขืœื™ื•. ื›ืŸ ื–ื” ื›ืœื™ ืžื“ื”ื™ื. ื›ืŸ ืืคืฉืจ ืœื›ืชื•ื‘ ืงื•ื“ ื™ื•ืชืจ ืžื”ืจ. ื›ืŸ ื–ื” ืžืงืฆืจ ื–ืžื ื™ื ื•ื”ื•ืคืš ืคืจื•ื™ืงื˜ื™ ืฆื“ ืœื”ืจื‘ื” ื™ื•ืชืจ ืงืœื™ื ื•ื›ื™ืคื™ื. ืื‘ืœ ื’ื ื”ื™ื•ื ืคื™ืชื•ื— ืžื•ืฆืจ ืชื•ื›ื ื” (ื’ื ืคืจื•ื™ืงื˜ ืฆื“) ื“ื•ืจืฉ ื™ื“ืข ื‘ืชื•ื›ื ื”, ืœืคื—ื•ืช ื”ื—ืœ ืžื ืงื•ื“ื” ืžืกื•ื™ืžืช. ื”ื“ืจืš ื”ืžื”ื™ืจื” ื‘ื™ื•ืชืจ ืงื“ื™ืžื” ื”ื™ื ืœื ื‘ื”ื›ืจื— ื–ื• ืฉืžืฆืจื™ื›ื” ื”ื›ื™ ืคื—ื•ืช "ืœื›ืชื•ื‘ ืงื•ื“" ืืœื ื–ื• ืฉืžืืคืฉืจืช ืœื ื• ืœืฉืœื‘ ื‘ื™ืŸ ืงื•ื“ ื•ื™ื›ื•ืœื•ืช ืฉืœื ื• ืœื‘ื™ืŸ ื”ืžื”ื™ืจื•ืช ืฉืœ ื” AI. ื›ืฉืื ื—ื ื• ืœื ืžืคื—ื“ื™ื ืœืงื•ื“ื“ ื•ืžื•ื›ื ื™ื ืœืฆืœื•ืœ ื•ืœื”ื‘ื™ืŸ ืืช ื”ืงื•ื“ ืฉืœ ื” AI, ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœืงื—ืช ืืช ื”ืจืขื™ื•ื ื•ืช ื”ืžื”ื™ืจื™ื ืฉืœื• ื•ืœืฉืœื‘ ืื•ืชื ืœืชื•ืš ืžื‘ื ื™ื ื ื›ื•ื ื™ื ืฉืžืชืื™ืžื™ื ืœื™ื™ืฉื•ื ืฉืœื ื•. ื•ื›ืŸ ืืœื” ื‘ื“ื™ื•ืง ื”ืขืงืจื•ื ื•ืช ืฉืื ื—ื ื• ืžืชืจื’ืœื™ื ื‘ืชื•ื›ื ื™ืช ื”ืœื™ื•ื•ื™ ื”ื—ื“ืฉื” ืฉื™ืฆืจืชื™. ื”ืงื‘ื•ืฆื” ื”ื‘ืื” ื™ื•ืฆืืช ืœื“ืจืš ื‘ื™ื•ื ื™ ื•ืืคืฉืจ ืœืœืžื•ื“ ืขื•ื“ ื‘ื“ืฃ ื”ืชื•ื›ื ื™ืช ืคื” ื‘ืืชืจ.

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

ToCode
1 417
ืžื‘ื˜ ื ื•ืกืฃ ืขืœ Jotai ื›ืชื‘ืชื™ ื‘ืขื‘ืจ ืขืœ jotai ื•ืื ื™ ืžื•ื“ื” ืฉื‘ืื•ืชื• ื–ืžืŸ ื”ื•ื ืœื ื”ื™ื” ืกืคืจื™ื™ืช ื ื™ื”ื•ืœ ื”ืกื˜ื™ื™ื˜ ื”ืžื•ืขื“ืคืช ืขืœื™ื™. ื—ืœืคื” ืฉื ื” ื•ื—ืฆื™ ื•ื”ื™ื•ื ืื ื™ ื›ื‘ืจ ื”ืจื‘ื” ื™ื•ืชืจ ืื•ื”ื‘ ืื•ืชื• ื•ืžืžืœื™ืฅ ืขืœื™ื• ืœืคืจื•ื™ืงื˜ื™ื ื—ื“ืฉื™ื. ื‘ื•ืื• ื ืจืื” ืœืžื”. ืื™ืš ื”ืกืชื‘ื›ืชื™ ืขื Jotai ื‘ื“ื•ื’ืžื” ื‘ืคื•ืกื˜ ื”ืงื•ื“ื ืฉื›ืชื‘ืชื™ ืขืœ Jotai ื™ืฆืจืชื™ ืžืขืจืš ืฉืœ ืžื•ื ื™ื, ื›ื•ืœื ืื˜ื•ืžื™ื ื•ื™ืฆืจืชื™ ืื˜ื•ื ืฉืžื—ื–ื™ืง ืืช ื”ืขืจืš ื”ืžืงืกื™ืžืœื™. ืื ื™ ืขื“ื™ื™ืŸ ื—ื•ืฉื‘ ืฉื–ื” ืจืขื™ื•ืŸ ื˜ื•ื‘ ื•ื–ื” ื”ื™ื” ื”ืงื•ื“ ื”ื™ื•ื ืขื ืชื•ืกืคืช ืชืžื™ื›ื” ื‘ื˜ื™ื™ืคืกืงืจื™ืคื˜:
import { Atom, atom, PrimitiveAtom } from "jotai";

export const countersAtom = atom<Array<PrimitiveAtom<number>>>([]);
export const maxValueAtom = atom((get) =>
  get(countersAtom).reduce((acc, val) => (acc > get(val) ? acc : get(val)), 0)
);

export type CounterAtomType = typeof countersAtom extends Atom<Array<infer T>> ? T : never;
ืื‘ืœ ืื– ื ื™ืกื™ืชื™ ืœืขื“ื›ืŸ ืืช ื”ืื˜ื•ื ืžืชื•ืš ื”ืงื•ืžืคื•ื ื ื˜ื•ืช ืœืžืฉืœ:
'use client';
import { useAtom, atom } from "jotai";
import { maxValueAtom, countersAtom } from "@/lib/counters";
import Counter from './counter';

export default function App() {
  const [counters, setCounters] = useAtom(countersAtom);
  const [maxValue, _] = useAtom(maxValueAtom);
  const createCounter = () => {
    setCounters((counters) => [...counters, atom(0)]);
  };

  return (
    <div className="App">
      <h1>Hello Jotai</h1>
      <p>Max value = {maxValue}</p>
      <button onClick={createCounter}>Create Counter</button>
      {counters.map((counter, idx) => (
        <Counter myAtom={counter} />
      ))}
    </div>
  );
}
ื•ื›ื›ื” ื ืชืงืขืชื™ ืขื ื”ืคื•ื ืงืฆื™ื” createCounter ื‘ืชื•ืš ื”ืงื•ืžืคื•ื ื ื˜ื” ื•ื”ื’ื“ืจืช ื”ืื˜ื•ื ื‘ืงื•ื‘ืฅ ื ืคืจื“. ืื™ืš ืื ื™ ืžืฉืชืžืฉ ื‘ Jotai ื”ื™ื•ื ื‘ืžื‘ื˜ ืฉื ื™ ื›ืœ ืžื” ืฉื”ื™ื” ืฆืจื™ืš ื–ื” ืœื”ื–ื™ื– ืงืฆืช ืคื•ื ืงืฆื™ื•ืช ืžืžืงื•ื ืœืžืงื•ื ื›ื“ื™ ืœืฉืคืจ ืืช ื”ืงื•ื“. ืื ื™ ืžื–ื™ื– ืืช ื”ืœื•ื’ื™ืงื” ืœืชื•ืš ื”ืงื•ื‘ืฅ ื‘ื• ื”ืื˜ื•ืžื™ื ื”ื•ื’ื“ืจื• ื•ืžืงื‘ืœ:
export const createCounterAtom = atom(null, 
  (_get, set, _update) => set(countersAtom, counters => [...counters, atom(0)]));

export const deleteCounterAtom = atom(null,
  (_get, set, toDelete: PrimitiveAtom<number>) => set(countersAtom, counters => counters.filter(c => c !== toDelete)))
ื‘ืขืฆื ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื—ืฉื•ื‘ ืขืœ ื”ืขื“ื›ื•ื ื™ื ื‘ืชื•ืจ ืื˜ื•ืžื™ื ื ื’ื–ืจื™ื ืœื›ืชื™ื‘ื” ื‘ืœื‘ื“. ื›ืชื™ื‘ื” ืœืชื•ืš ืื˜ื•ื createCounterAtom ื™ื•ืฆืจืช ืžื•ื ื” ื—ื“ืฉ ื‘ืชื•ืš ื”ืžืขืจืš countersAtom. ื›ืชื™ื‘ื” ืœืชื•ืš ื”ืื˜ื•ื deleteCounterAtom ืžื•ื—ืงืช ืžื•ื ื”. ืžืชื•ืš ื”ืงื•ืžืคื•ื ื ื˜ื” ื–ื” ื ืจืื” ื›ื›ื”:
'use client';
import { useAtomValue, useSetAtom } from "jotai";
import { maxValueAtom, countersAtom, createCounterAtom } from "@/lib/counters";
import Counter from './counter';

export default function App() {
  const counters = useAtomValue(countersAtom);
  const maxValue = useAtomValue(maxValueAtom);
  const createCounter = useSetAtom(createCounterAtom)

  return (
    <div className="App">
      <h1>Hello Jotai</h1>
      <p>Max value = {maxValue}</p>
      <button onClick={createCounter}>Create Counter</button>
      {counters.map((counter, idx) => (
        <Counter myAtom={counter} key={idx} />
      ))}
    </div>
  );
}
ื•ืขื›ืฉื™ื• ืื™ืŸ ืœื ื• ื‘ื›ืœืœ ืœื•ื’ื™ืงื” ื‘ืชื•ืš ื”ืงื•ืžืคื•ื ื ื˜ื•ืช ื•ื”ืจื‘ื” ื™ื•ืชืจ ืงืœ ืœืงืจื•ื ื•ืœืชื—ื–ืง ืื•ืชืŸ. ื‘ื“ื™ืงืช ืื˜ื•ืžื™ื ื‘ืœื™ ืจื™ืืงื˜ ืžืฉื—ืง ื ื•ืกืฃ ืฉืœื ื”ื›ืจืชื™ ื›ืฉื›ืชื‘ืชื™ ืืช ื”ืคื•ืกื˜ ื”ืงื•ื“ื ื”ื™ื” ื”ืืคืฉืจื•ืช ืœืขื‘ื•ื“ ืขื ื”ืื˜ื•ืžื™ื ื•ืœื‘ื“ื•ืง ืืช ื”ืœื•ื’ื™ืงื” ื’ื ืžื—ื•ืฅ ืœืงื•ืžืคื•ื ื ื˜ื•ืช ืจื™ืืงื˜. ื ืชื‘ื•ื ืŸ ื‘ืงื•ื“ ื”ื‘ื“ื™ืงื” ื”ื‘ื:
import {test} from 'node:test';
import assert from 'node:assert';
import { maxValueAtom, countersAtom, createCounterAtom } from "@/lib/counters";
import { createStore } from 'jotai'

test('demo test', () => {
  const store = createStore()
  store.set(createCounterAtom, null);
  store.set(createCounterAtom, null);
  store.set(createCounterAtom, null);

  const countersAtomValue = store.get(countersAtom);
  store.set(countersAtomValue[0], 4);
  store.set(countersAtomValue[1], 2);
  store.set(countersAtomValue[2], 1);

  const maxValue = store.get(maxValueAtom);
  assert(maxValue === 4);
})

ToCode
1 417
ืืจื‘ืขื” ื“ื‘ืจื™ื ืฉืื”ื‘ืชื™ ื‘ืคืœื™ื™ืจื™ื™ื˜ (ื•ืื—ื“ ืฉืื”ื‘ืชื™ ืคื—ื•ืช) ืคืœื™ื™ืจื™ื™ื˜ ื”ื™ื ืกืคืจื™ื™ืช ื›ืชื™ื‘ืช ื‘ื“ื™ืงื•ืช ืžืงืฆื” ืœืงืฆื” ืœืืคืœื™ืงืฆื™ื•ืช ื•ื•ื‘ ืฉืžืชืื™ืžื” ืœืคื™ื™ืชื•ืŸ, TypeScript / JavaScript, ื’'ืื•ื•ื” ื•ื“ื•ื˜ื ื˜. ื‘ื–ื›ื•ืช ื›ืžื” ืคื™ืชืจื•ื ื•ืช ื•ืจืขื™ื•ื ื•ืช ื™ื™ื—ื•ื“ื™ื™ื ื•ืขื•ื“ ื›ืžื” ืจืขื™ื•ื ื•ืช ื˜ื•ื‘ื™ื ืฉื”ื ืืกืคื• ืžืžืงื•ืžื•ืช ืื—ืจื™ื ื”ืขื‘ื•ื“ื” ืขื ืคืœื™ื™ืจื™ื™ื˜ ืžืจื’ื™ืฉื” ื ื›ื•ื ื” ืžื”ืจื’ืข ื”ืจืืฉื•ืŸ. ื”ื ื” 4 ื“ื‘ืจื™ื ืฉืื ื™ ืžืื•ื“ ืื”ื‘ืชื™ ื‘ืกืคืจื™ื” ื•ืื—ื“ ืฉืคื—ื•ืช. ื ืชื—ื™ืœ ื‘ื˜ื•ื‘ื™ื: 1. ืชื™ืขื•ื“ - ืื ื™ ื™ื•ื“ืข ื–ื” ื›ืื™ืœื• ืœื ื—ืœืง ืžื”ืกืคืจื™ื” ืื‘ืœ ื”ืืžืช ืฉื›ืฉืžืชื—ื™ืœื™ื ืœืขื‘ื•ื“ ืขื ืกืคืจื™ื” ื•ืžื’ืœื™ื ืขืžื•ื“ื™ ืชื™ืขื•ื“ ืžื•ืฉืงืขื™ื ืฉื›ื•ืœืœื™ื ื’ื ื”ืกื‘ืจ ืžืคื•ืจื˜, ื’ื ื•ื™ื“ืื• ื›ืฉืฆืจื™ืš ื•ื’ื ืžื“ืจื™ื›ื™ื ื• Best Practice ืืชื” ื›ื‘ืจ ืžืจื’ื™ืฉ ื‘ื™ื“ื™ื™ื ื˜ื•ื‘ื•ืช. 2. ื›ืชื™ื‘ืช ื‘ื“ื™ืงื•ืช ื‘ืืžืฆืขื•ืช ื”ืงืœื˜ื” - ืžืชื•ืš ืฉื•ืจืช ื”ืคืงื•ื“ื” ื›ืชื‘ืชื™ npx playwright test --debug ื•ื ื›ื ืกืชื™ ืœืžืฆื‘ ื”ื“ื™ื‘ืื’ ืฉืœ ื”ื‘ื“ื™ืงื•ืช, ืฉื ื”ื™ื” ืœื™ ื“ืคื“ืคืŸ ืฉื”ืจืื” ืืช ื”ืขืžื•ื“ ื•ื›ืคืชื•ืจ "ื”ืงืœื˜ื”" ืฉืคืฉื•ื˜ ืžืชืจื’ื ืืช ื”ืคืขื•ืœื•ืช ืฉืœื™ ืœืงื•ื“ ื‘ื“ื™ืงื”. ื ื›ื•ืŸ ื”ื•ื ืœื ื™ื“ืข ืœื›ืชื•ื‘ ืืช ื” expect ื›ื™ ื”ื•ื ืœื ื™ื“ืข ืœืžื” ืœืฆืคื•ืช, ืื‘ืœ ื›ืœ ื”ืฉืืจ ืขื‘ื“ ืžืžืฉ ื‘ืกื“ืจ. ื–ื• ื‘ื“ื™ืงื” ืœื“ื•ื’ืžื” ืฉื›ืชื‘ืชื™ ืœืืชืจ ื˜ื•ืงื•ื“ ื‘ืืžืฆืขื•ืช ื”ืžืงืœื™ื˜ ืฉืœื”ื:
test('sign up to receive daily posts', async ({page}) => {
    await page.goto('https://www.tocode.co.il/blog');
    await page.getByRole('textbox', { name: 'you@wherever.you.are' }).click();
    await page.getByRole('textbox', { name: 'you@wherever.you.are' }).fill('ynon@tocode.co.il');
    await page.getByRole('button', { name: 'ืฉืœื—ื• ืœื™ ืœืžื™ื™ืœ' }).click();
    await expect(page.getByText('ื ืฉืœื— ืืœื™ืš ืžื™ื™ืœ ืขื ืงื™ืฉื•ืจ ืœืื™ืฉื•ืจ ื”ื”ืจืฉืžื”. ื™ืฉ ืœืคืชื•ื— ืืช ื”ืžื™ื™ืœ ื•ืœืœื—ื•ืฅ ืขืœ ื”ื›ืคืชื•ืจ ืœืื™ืฉื•ืจ')).toBeVisible();
})
3. ืชืžื™ื›ื” ืžืœืื” ื‘ื›ืœ ื”ื“ืคื“ืคื ื™ื ื•ื’ื“ืœื™ ื”ืžืกืš - ื‘ืืžืฆืขื•ืช ื”ื’ื“ืจื” ื‘ืงื•ื‘ืฅ ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ื”ืฆืœื—ืชื™ ืžืื•ื“ ืžื”ืจ ืœื‘ื“ื•ืง ืขืœ ื™ื•ืชืจ ืื• ืคื—ื•ืช ื“ืคื“ืคื ื™ื ื•ื’ื ืœื‘ื—ื•ืจ ืืžื•ืœื˜ื•ืจื™ื ืœื’ื“ืœื™ ืžืกืš ืฉื•ื ื™ื ื‘ืืžืฆืขื•ืช ืคื™ืฆ'ืจ Device Mode ืฉืœ ื”ื“ืคื“ืคื ื™ื. ื”ื ื” ื“ื•ื’ืžื” ืœืงื•ื ืคื™ื’ื•ืจืฆื™ื”:

import { defineConfig, devices } from '@playwright/test'; // import devices

export default defineConfig({
  projects: [
    {
      name: 'chromium',
      use: {
        ...devices['Desktop Chrome'],
      },
    },
    {
      name: 'Mobile Safari',
      use: {
        ...devices['iPhone 13'],
      },
    },
  ],
});
4. ื”ืขื“ืคื” ืœื›ืชื™ื‘ ื” Role - ืœืžืจื•ืช ืฉื‘ืชื•ืจ ื›ื•ืชื‘ ื‘ื“ื™ืงื” ื–ื” ื™ื›ื•ืœ ืœืขื™ื™ืฃ, ืื‘ืœ ื”ื”ืขื“ืคื” ืฉืœ ืคืœื™ื™ืจื™ื™ื˜ ืœื›ื™ื•ื•ืŸ Locators ืฉืžืฉืชืžืฉื™ื ื‘ Aria Role ืขื•ื–ืจืช ืœื”ื“ื’ื™ืฉ ืืช ื” Role ืฉืœ ื›ืœ ื“ื‘ืจ ื‘ืืชืจ ื•ืœืจืื•ืช ืžื”ืจ ื›ืฉื”ื’ื“ืจื•ืช ื” Aria ืœื ื ื›ื•ื ื•ืช, ื•ื–ื” ืืคื™ืœื• ืœืคื ื™ ืฉืกื™ื™ืžื ื• ืœื›ืชื•ื‘ ืืช ื”ื‘ื“ื™ืงื•ืช. ืื’ื‘ ื™ืฉ ืœื”ื ื’ื ืชื•ืกืฃ ืœื‘ื“ื™ืงืช ื‘ืขื™ื•ืช ื ื’ื™ืฉื•ืช ื•ื”ื›ืœ ืžืฉื•ืœื‘ ื‘ืคื ื™ื ืฉื™ืžื• ืœื‘ ืœื“ื•ื’ืžื” ื”ื–ื•:
import { test, expect } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright'; // 1

test.describe('homepage', () => { // 2
  test('should not have any automatically detectable accessibility issues', async ({ page }) => {
    await page.goto('https://your-site.com/'); // 3

    const accessibilityScanResults = await new AxeBuilder({ page }).analyze(); // 4

    expect(accessibilityScanResults.violations).toEqual([]); // 5
  });
});
5. ื•ืžื” ืคื—ื•ืช? ืื ื™ ืžืฆืืชื™ ืืช ื›ืชื™ื‘ ื” expect ืžื‘ืœื‘ืœ ื‘ืžื™ื•ื—ื“ ื›ืฉื—ืœืง ืžื”ื‘ื“ื™ืงื•ืช ืกื™ื ื›ืจื•ื ื™ื•ืช ื•ืื—ืจื•ืช ืืกื™ื ื›ืจื•ื ื™ื•ืช ืœื“ื•ื’ืžื” ืฉืชื™ ื”ื‘ื“ื™ืงื•ืช ื”ืืœื” ืื™ื ืŸ ื–ื”ื•ืช:
await expect(page).toHaveURL('...');
await expect(page.url()).toBe('...');
ื‘ืจืืฉื•ื ื” toHaveURL ื”ื™ื ื‘ื“ื™ืงื” ืืกื™ื ื›ืจื•ื ื™ืช ืฉืžื—ื›ื” ืขื“ ืฉื” URL ื™ืฉืชื ื” ื‘ืขืงื‘ื•ืช ืœื—ื™ืฆื” ืื• ื”ืคื ื™ื”, ืื‘ืœ ื”ื‘ื“ื™ืงื” ื”ืฉื ื™ื” ื”ื™ื ื‘ื“ื™ืงื” ืžื™ื™ื“ื™ืช ื›ื™ page.url ื”ื™ื ืคื•ื ืงืฆื™ื” ืกื™ื ื›ืจื•ื ื™ืช ื• toBe ื”ื™ื ื‘ื“ื™ืงื” ืกื™ื ื›ืจื•ื ื™ืช. ื” await ื‘ืฉื•ืจื” ื”ืฉื ื™ื™ื” ืœื ืขื•ืฉื” ื›ืœื•ื ื›ื™ื•ื•ืŸ ืฉืื™ืŸ ืฉื ืฉื•ื Promise. ื‘ืคื•ืขืœ ืžื‘ื ื” ื–ื” ื“ื•ืจืฉ ืœื”ืกืชื›ืœ ืขืœ ื”ื˜ื™ืคื•ืกื™ื ื›ืœ ืคืขื ืฉื›ื•ืชื‘ื™ื ื‘ื“ื™ืงื” ื›ื“ื™ ืœื”ื‘ื™ืŸ ืื ืคื•ื ืงืฆื™ื™ืช ื”ื‘ื“ื™ืงื” ื”ื™ื ืกื™ื ื›ืจื•ื ื™ืช ืื• ืืกื™ื ื›ืจื•ื ื™ืช. ืกืš ื”ื›ืœ ืžืื•ื“ ืื”ื‘ืชื™ ืืช ืคืœื™ื™ืจื™ื™ื˜ ื•ืื ืืชื ืฆืจื™ื›ื™ื ืกืคืจื™ื™ืช ื‘ื“ื™ืงื•ืช End To End ืœืคืจื•ื™ืงื˜ ืื™ืŸ ืกืคืง ืฉืžื“ื•ื‘ืจ ื‘ื‘ื—ื™ืจื” ื˜ื•ื‘ื” ื•ื‘ื˜ื•ื—ื”.

ToCode
1 417
ื”ื™ื•ื ืœืžื“ืชื™: ืืงื•ืจื“ื™ื•ืŸ ืœืœื JavaScript ื”ื ื” ื˜ืจื™ืง HTML ื ื—ืžื“ ืฉืžืกืชื‘ืจ ืฉื ืชืžืš ื›ื‘ืจ ืชืงื•ืคื” ื•ืื™ื›ืฉื”ื• ื“ื™ืœื’ืชื™ ืขืœื™ื• - ืœื ืฆืจื™ืš ื™ื•ืชืจ JavaScript (ืื• ืืคื™ืœื• ืื ื›ื‘ืจ ื™ืฉ ืœื›ื JavaScript ืœื ืฆืจื™ืš ืœืฉืžื•ืจ ืžืฉืชื ื” ืกื˜ื™ื™ื˜) ืจืง ื‘ืฉื‘ื™ืœ ืœื ื”ืœ ืืงื•ืจื“ื™ื•ืŸ ืขื ื“ื‘ืจื™ื ืฉื ืคืชื—ื™ื ื•ื ืกื’ืจื™ื. ื›ืœ ืžื” ืฉืฆืจื™ืš ื–ื” ืืœืžื ื˜ details ืฉืœ HTML ื•ื–ื” ื ืจืื” ื›ื›ื”:
<details >
<summary>Toggle me</summary>
  <div > 
    <p>Look there's no JavaScript involved ... yay</p> 
  </div> 
</details>
ื•ื”ืงื•ื“ืคืŸ: <iframe height="300" style="width: 100%;" scrolling="no" title="Untitled" src="https://codepen.io/ynonp/embed/wBvPpjy?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true"> See the Pen <a href="https://codepen.io/ynonp/pen/wBvPpjy"> Untitled</a> by Ynon Perek (<a href="https://codepen.io/ynonp">@ynonp</a>) on <a href="https://codepen.io">CodePen</a>. </iframe> ื•ืื ืืชื ืฆืจื™ื›ื™ื ืœืขืฆื‘ ืื•ืชื• ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ :open ื‘ CSS ื›ื“ื™ ืœืชืคื•ืก ืืช ื”ืžืฆื‘ ื”ืคืชื•ื— (ืœื ืขื•ื‘ื“ ื‘ืกืคืืจื™ ื‘ื™ื ืชื™ื™ื) ืœื“ื•ื’ืžื”:
details:open > summary {
  background-color: pink;
}

:is(select, input):open {
  background-color: pink;
}
ืื• ื‘ open ื‘ืชื•ืš ืกื•ื’ืจื™ื™ื ืžืจื•ื‘ืขื™ื ืฉื›ืŸ ืขื•ื‘ื“ ื’ื ื‘ืกืคืืจื™:
details summary {
  background: pink;
}

details {
  background: lightgreen;
}

details[open] summary {
  background: red;
}
ื•ื‘ื ื•ืฉื ืื—ืจ - ืื ื™ ืคื•ืชื— ื”ื™ื•ื ืืช ื”ืจื™ืฉื•ื ืœืงื‘ื•ืฆืช ืคื™ืชื•ื— ื”ืคืจื•ื™ืงื˜ื™ื ื”ื‘ืื” ืฉืชืฆื ืœื“ืจืš ื‘ื™ื•ื ื™. ื–ื” ืžืกืœื•ืœ ืžืขื•ืœื” ืฉื ื•ืชืŸ ืœืžืฉืชืชืคื™ื ืืช ื”ืžืกื’ืจืช, ื”ื™ื“ืข ื•ื”ืžื•ื˜ื™ื‘ืฆื™ื” ืœื‘ื ื•ืช ืคืจื•ื™ืงื˜ ืžืงืฆื” ืœืงืฆื”. ืื ืžืขื ื™ื™ืŸ ืืชื›ื ืฉื•ื•ื” ืœื”ืขื™ืฃ ืžื‘ื˜ ื‘ื“ืฃ ื”ืคืจื•ื™ืงื˜ ื•ืœืงื‘ื•ืข ืฉื ืคื’ื™ืฉืช ื”ื™ื›ืจื•ืช.

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

ToCode
1 417
ื›ืŸ ืจื™ืืงื˜ ื ื”ื™ื” ืžืกื•ื‘ืš ืžื“ื™ ืจื™ืืงื˜ ืชืžื™ื“ ื”ื™ื” ืžืกื•ื‘ืš ืื‘ืœ ืกื•ื’ ื”ืกื™ื‘ื•ืš ื”ืฉืชื ื”. ืคืขื ื”ื™ื” ืงืฉื” ืœื”ื‘ื™ืŸ ืืช ื”ืจืขื™ื•ืŸ ืฉืœ ืจื™ืืงื˜ ืื‘ืœ ื” API ืฉืœื• ื”ื™ื” ื™ื—ืกื™ืช ืงื˜ืŸ, ื‘ื˜ื— ื‘ื”ืฉื•ื•ืื” ืœืื ื’ื•ืœืจ. ืžืคืชื—ื™ ืจื™ืืงื˜ ืฉื”ื›ืจืชื™ ืœืคื ื™ 8 ืฉื ื™ื ื™ื“ืขื• ื‘ืขืœ ืคื” ืžื” ืขื•ืฉื” ื›ืœ ืคืงื•ื“ื” ื‘ืกืคืจื™ื”. ื”ื™ื•ื ื”ืกื™ืคื•ืจ ืงืฆืช ื™ื•ืชืจ ืžืกื•ื‘ืš, ื•ื‘ืฉื‘ื™ืœ ืœื”ื•ื›ื™ื— ืืช ื–ื” ืื ื™ ืจืง ืื–ืจื•ืง ืคื” ืจืฉื™ืžื” ืฉืœ Hooks ืžื”ืชื™ืขื•ื“. ื ืกื• ืœืกืคื•ืจ ื›ืžื” ืืชื ืžื›ื™ืจื™ื ืื• ื‘ื›ืžื” ื”ืฉืชืžืฉืชื: 1. useId 2. useDeferredValue 3. useDebugValue 4. useInsertionEffect 5. useImperativeHandle 6. useOptimistic 7. useSyncExternalStore 8. useActionState 9. useFormStatus ื”ื‘ืขื™ื” ืขื ืขื•ืžืก ื” Hooks ื”ื™ื ืฉื›ืœ Hook ื ื•ืขื“ ืœืคืชื•ืจ ื‘ืขื™ื” ืžืื•ื“ ืกืคืฆื™ืคื™ืช. ื—ืœืงื ื‘ืืžืช ืคืฉื•ื˜ื™ื ื›ืžื• useDebugValue ืื‘ืœ ื›ืœ ืื—ื“ ืžื”ืจืฉื™ืžื” ื”ื–ืืช ืžืชืืจ "ืžืขืงืฃ" ืื• ื‘ืขื™ื” ืฉืื™ ืืคืฉืจ ืœืคืชื•ืจ ืขื ื”ื›ืœื™ื ื”ืจื’ื™ืœื™ื ืฉืœ ืจื™ืืงื˜. ื‘ืขื•ืœื ืžื•ืฉืœื ื›ืœ ื”-9 ื”ืืœื” ื•ื›ื ืจืื” ื’ื ื—ืœืง ืžื” Hooks ื”ื™ื•ืชืจ ืฉื’ืจืชื™ื™ื ื”ื™ื• ื‘ื ื•ื™ื™ื ื‘ืชื•ืจ ืกืคืจื™ื•ืช ื—ื™ืฆื•ื ื™ื•ืช ืขื‘ื•ืจ ืื•ืชื ืžืงืจื™ื ืฉืฆืจื™ื›ื™ื ืื•ืชื.

ToCode
1 417
ืžื” ืขื•ืฉื™ื ื‘ืžืงื•ื URL Params ื‘ืืคืœื™ืงืฆื™ื™ืช ืฆื“ ืœืงื•ื— ืขื Next.js ื”ื‘ืื’ ื”ื–ื” ื‘ Next ืขื•ืจืจ ื“ื™ื•ืŸ ืกื•ืขืจ: https://github.com/vercel/next.js/discussions/64660 ื‘ืงืฆืจื” ื›ืฉืื ื™ ื‘ื•ื ื” ืืคืœื™ืงืฆื™ื™ืช ืฆื“-ืœืงื•ื— ื‘ืœื‘ื“ ืขื output: 'export' ื‘ next.js ืื™ ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ื ืชื™ื‘ื™ื ื“ื™ื ืžื™ื™ื, ื›ืœื•ืžืจ ื ืชื™ื‘ ื›ื–ื” ืœื ื™ืขื‘ื•ื“:
/blog/[slug]
ื”ื”ืกื‘ืจ ื”ื•ื ืฉื›ืฉื ืงืกื˜ ืจื•ืื” ื›ื–ื” ื“ื‘ืจ ื”ื•ื ืœื ื™ื•ื“ืข ืื™ื–ื” ืงื•ื‘ืฅ HTML ืœื‘ื ื•ืช, ื›ื™ ืฆืจื™ืš ืœื–ื›ื•ืจ ืฉื›ืœ ืžื ื’ื ื•ืŸ ื”ื ื™ืชื•ื‘ ืฉืœ ื ืงืกื˜ ื‘ืืคืœื™ืงืฆื™ื™ืช ืฆื“ ืœืงื•ื— ื‘ื ื•ื™ ืขืœ ื–ื” ืฉื”ื•ื ืžืจื™ืฅ ืืช ืงื‘ืฆื™ ื”ืงื•ืžืคื•ื ื ื˜ื•ืช ืœืคื™ ืžืขืจื›ืช ื”ืงื‘ืฆื™ื ื•ืžื™ื™ืฆืจ ืžืขืจื›ืช ืงื‘ืฆื™ HTML ืžืงื‘ื™ืœื” ืœืงื‘ืฆื™ ื” JavaScript, ื›ืœื•ืžืจ ืžืจื ื“ืจ ืืช ื›ืœ ืงื‘ืฆื™ ื” page.tsx ื•ืฉื•ืžืจ ืืช ื”ืชื•ืฆืื•ืช ื‘ืชื•ืจ HTML-ื™ื. ื•ืื ื ืฉื™ื ื‘ืฆื“ ืืช ื›ืœ ื”ืคื™ืชืจื•ื ื•ืช ื”ืžืชื•ื—ื›ืžื™ื ื•ืืช ื›ืœ ื”ืชืงื•ื•ืช ืฉื‘ืงืจื•ื‘ ื”ื—ื‘ืจื™ื ื‘ Vercel ื™ืคืชืจื• ืืช ื–ื” (ื”ื ื”ื‘ื˜ื™ื—ื• ืคื™ืชืจื•ืŸ ื‘ืื–ื•ืจ ืžืื™-ื™ื•ื ื™), ืื‘ืœ ื›ื‘ืจ ื‘ื™ื ืชื™ื™ื ืืคืฉืจ ืœื‘ื ื•ืช ืคื™ืชืจื•ืŸ ืžืงื‘ื™ืœ ื•ื“ื™ ืคืฉื•ื˜ - ื‘ืžืงื•ื ืœื”ืฉืชืžืฉ ื‘ Route Params ื ืฉืชืžืฉ ื‘ Search Params, ื›ืœื•ืžืจ ื”ื ืชื™ื‘ ื™ื”ื™ื”:
/blog/post?slug=hello-world
ื‘ืงื•ื“ next ืงืฆืช ื ื•ื“ื ื™ืง ื•ื‘ืฉื‘ื™ืœ ืœื’ืฉืช ืœ Search Params ืื ื™ ืฆืจื™ืš ืœืขื˜ื•ืฃ ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ื‘ Suspense ืœื›ืŸ ืžื‘ื—ื™ื ืช ืงื•ื“ ื‘ page.tsx ืื ื™ ื›ื•ืชื‘:
'use client'
import ShowPost from './show-post';
import { Suspense } from 'react';

export default function BlogPost() {
  return (
    <div>
      <Suspense fallback={<p>Loading post</p>}>
        <ShowPost />
      </Suspense>
    </div>
  )
}
ื•ื‘ show-post.tsx ื™ืฉ ืœื™:
'use client'
import Link from 'next/link';
import { getPost } from '@/lib/blog';
import { useSearchParams, notFound } from 'next/navigation';

export default function BlogPost() {
  const slug = useSearchParams().get('slug')!;    
  const post = getPost(slug);
  if (!post) {
    return <p>Not flund. slug = {slug}</p>
  }

  return (
    <div>
      <h1>{post.title}</h1>
      <p><Link href="/blog">Back to blog</Link></p>
      <p>{post.fulltext}</p>
    </div>
  )
}
ื•ื‘ื”ื ื—ื” ืฉืืชื ื™ื•ื“ืขื™ื ืื™ืš ืœืงื‘ืœ ืคื•ืกื˜ ืœืคื™ slug ื”ืงื•ื“ ื™ืขื‘ื•ื“ ื•ื™ืฉ ืœื›ื ื‘ืœื•ื’ ื‘ืชื•ืจ ืืคืœื™ืงืฆื™ื™ืช ืขืžื•ื“ ื™ื—ื™ื“.

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

ToCode
1 417
ื˜ื™ืค ืคื™ื™ืชื•ืŸ: ื”ืžืจื” ืœื‘ื•ืœื™ืื ื™ื ื”ืงื•ื“ ื”ื–ื” ืขื•ื‘ื“ ื™ืคื” ื‘ืคื™ื™ืชื•ืŸ:
import re

if re.search('a', 'hello'):
    print("a found in hello")
else:
    print("a not found in hello")
ืื‘ืœ ื–ื” ืœื ื›ืœ ื›ืš:
if 'hello'.find('a'):
    print("found a")
else:
    print("a not found")
ืœืžืจื•ืช ืฉืคื™ื™ืชื•ืŸ ืœื ืื•ื”ื‘ ืœื”ืžื™ืจ ื˜ื™ืคื•ืกื™ื ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™, ื‘ื›ืœ ื”ื ื•ื’ืข ืœื‘ื•ืœื™ืื ื™ื ื”ื’ื™ืฉื” ืฉืœ ืคื™ื™ืชื•ืŸ ื”ืคื•ื›ื”, ืืœื” ื”ื›ืœืœื™ื: 1. ืื ื™ืฉ ืคื•ื ืงืฆื™ื™ืช __bool__ ืœื“ื‘ืจ, ืคื™ื™ืชื•ืŸ ื™ืคืขื™ืœ ืื•ืชื” ื›ื“ื™ ืœื’ืœื•ืช ืžื” ื”ืขืจืš ื”ื‘ื•ืœื™ืื ื™. 2. ืื ืื™ืŸ __bool__ ืื‘ืœ ื™ืฉ __len__, ืคื™ื™ืชื•ืŸ ื™ืคืขื™ืœ ืืช __len__ ื•ื™ื‘ื“ื•ืง ืื ื”ืชื•ืฆืื” ืื™ื ื” ืืคืก. 3. ืื ืื™ืŸ __bool__ ื•ืื™ืŸ __len__ ืžื—ื–ื™ืจื™ื True. ื”ื ื” ื›ืžื” ื ื™ืกื•ื™ื™ื:
>>> None.__bool__()
False
>>> (-1).__bool__()
True
ืžื” ืขื ื“ื•ื’ืžืช ื”ื‘ื™ื˜ื•ื™ ื”ืจื’ื•ืœืืจื™?
>>> re.search('a', 'hallo')
<re.Match object; span=(1, 2), match='a'>
>>> re.search('a', 'hallo').__bool__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 're.Match' object has no attribute '__bool__'. Did you mean: '__copy__'?
>>> re.search('a', 'hallo').__len__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 're.Match' object has no attribute '__len__'. Did you mean: '__le__'?
ืœื‘ื™ื˜ื•ื™ ืจื’ื•ืœืืจื™ ืื™ืŸ __bool__ ื•ืื™ืŸ __len__ ืœื›ืŸ ื”ื•ื ืžื—ื–ื™ืจ True. ื•ื”ื ื” ื ื™ืกื•ื™ ืขื ืงืœืืกื™ื ืฉืœื™:
class Foo:
    def __bool__(self):
        return False

class Bar:
    pass

f = Foo()
if f:
    print("Foo 1")
else:
    print("Foo 2")

b = Bar()
if b:
    print("Bar 1")
else:
    print("Bar 2")

ื”ืคืœื˜ ื›ืฆืคื•ื™ Foo 2 ื• Bar 1.

ToCode
1 417
ื—ื’ื•ืจื•ืช ื‘ื˜ื™ื—ื•ืช ืžื•ืœ ื›ืจื™ื•ืช ืื•ื•ื™ืจ ืืช ื—ื’ื•ืจื•ืช ื”ื‘ื˜ื™ื—ื•ืช ืจื•ืื™ื. ื™ืฉ ืงืœื™ืง ื›ืฉื”ื™ืœื“ื™ื ืฉืžื™ื ื—ื’ื•ืจื”, ื•ื›ืฉืžื™ืฉื”ื• ืฉื•ื›ื— ืœืฉื™ื ื—ื’ื•ืจื” ื”ืื•ื˜ื• ืžืฆืคืฆืฃ. ื—ื’ื•ืจื•ืช ื”ื‘ื˜ื™ื—ื•ืช ืœื ืจืง ืžื’ื™ื ื•ืช ืขืœื™ืš ืžืชืื•ื ื” ื”ืŸ ื’ื ืžืื•ื“ ื ื•ื›ื—ื•ืช ื‘ื–ืžืŸ ื”ื ืกื™ืขื”. ืื•ืชื• ื“ื‘ืจ ื”ืžื•ื‘ื™ืœืื™ื™ ืฉืžืฆืคืฆืฃ ื›ืœ ืคืขื ืฉืืชื” ืงืฆืช ื™ื•ืฆื ืžื”ื ืชื™ื‘ ืื• ืžืชืงืจื‘ ืœืื•ื˜ื• ืฉืœืคื ื™ืš. ื›ืจื™ื•ืช ืื•ื•ื™ืจ ืขื•ื‘ื“ื•ืช ืื—ืจืช. ื”ืŸ ื™ื”ื™ื• ืฉื ื›ืฉื ืฆื˜ืจืš ืื‘ืœ ืจื•ื‘ ื”ื–ืžืŸ ืื™ืŸ ืœื ื• ืื™ื ื˜ืจืงืฆื™ื” ืื™ืชืŸ. ื’ื ื—ื’ื•ืจื•ืช ื‘ื˜ื™ื—ื•ืช ื•ื’ื ื›ืจื™ื•ืช ืื•ื•ื™ืจ ื“ื•ืจืฉื•ืช ืžื™ื“ื” ืœื ืžื‘ื•ื˜ืœืช ืฉืœ ืืžื•ืŸ. ืื ื—ื ื• ืžืงื•ื•ื™ื ืฉื›ืฉืชื”ื™ื” ืชืื•ื ื” ื”ืŸ ื™ืขื‘ื“ื•, ืื‘ืœ ืื™ืŸ ื“ืจืš ืœื”ื™ื•ืช ื‘ื˜ื•ื—ื™ื ืžืจืืฉ. ืืฃ ืื—ื“ ืœื ื™ืขืฉื” ืชืื•ื ื” ืจืง ื‘ืฉื‘ื™ืœ ืœืจืื•ืช ืฉื—ื’ื•ืจืช ื”ื‘ื˜ื™ื—ื•ืช ื‘ืืžืช ืžื—ื•ื‘ืจืช ื›ืžื• ืฉืฆืจื™ืš. ื‘ืงื•ื“ ื”ืžืฆื‘ ืฉื•ื ื” ื•ื™ืฉ ืœื ื• ืืช ื”ืคืจื™ื‘ื™ืœื’ื™ื” ืœื‘ื“ื•ืง ืืช ืžื ื’ื ื•ื ื™ ื”ื”ื’ื ื” ืฉืœื ื• ืœืคื ื™ ืจื’ืข ื”ืืžืช. ื›ืฉื’ื™ื˜ื”ืื‘ ืžืฆื™ืขื™ื Push Protection ืฉื™ื–ื”ื” ืื•ื˜ื•ืžื˜ื™ืช ื•ื™ื—ืกื•ื ื›ืฉืื ื—ื ื• ืžื ืกื™ื ืœื“ื—ื•ืฃ ืกื™ืกืžืื•ืช ืื• ืกื•ื“ื•ืช ืœืจื™ืคื•, ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื‘ื“ื•ืง ืืช ื–ื” ืขื ืกื•ื“ ืžื–ื•ื™ืฃ ืจืง ื‘ืฉื‘ื™ืœ ืœืจืื•ืช ืฉื”ื•ื ื—ื•ืกื ืื•ืชื ื•. ื›ืฉืื ื—ื ื• ืžืงื™ืžื™ื ืžืขืจื›ืช ื’ื™ื‘ื•ื™ ืœื‘ืกื™ืก ื”ื ืชื•ื ื™ื, ืืคืฉืจ ื•ืจืฆื•ื™ ืœืงื—ืช ื™ื•ื ื•ืœื ืกื•ืช ืœืฉื—ื–ืจ ื›ื“ื™ ืœืจืื•ืช ืฉื”ื’ื™ื‘ื•ื™ ื‘ืืžืช ื™ื”ื™ื” ืฉื ื›ืฉื ืฆื˜ืจืš. ืื ื™ืฉ ืœื™ ื›ืžื” ืฉืจืชื™ื ื• Load Balancer, ืื ื™ ื™ื›ื•ืœ (ื•ืืคื™ืœื• ื›ื“ืื™) ืคืขื ื‘ื›ืžื” ื–ืžืŸ ืœื”ืจื™ืฅ ืขื•ืžืก ื™ื–ื•ื ืขืœ ืื—ื“ ื”ืฉืจืชื™ื ื›ื“ื™ ืœืจืื•ืช ืฉื” Load Balancer ืžืชืคืงื“ ื•ืžืคืกื™ืง ืœื”ื›ื ื™ืก ืชื ื•ืขื” ืœืฉืจืช ื”ืขืกื•ืง. ืจืง ื‘ื’ืœืœ ืฉืื ื—ื ื• ืจื•ืื™ื ืžืฉื”ื• ื›ืœ ื”ื–ืžืŸ ืœื ืื•ืžืจ ืฉื”ื•ื ืขื•ื‘ื“ (ื•ืจืง ื‘ื’ืœืœ ืฉืื ื—ื ื• ืœื ืจื•ืื™ื ืžืฉื”ื• ืœื ืื•ืžืจ ืฉื”ื•ื ืžื‘ื•ื˜ืœ). ื›ืœ ืžื ื’ื ื•ืŸ ื”ื’ื ื” ื“ื•ืจืฉ ืชื—ื–ื•ืงื” ื•ื‘ื“ื™ืงื” ืฉื•ื˜ืคืช, ื•ืขื“ื™ืฃ ื›ืฉื”ืขื ื™ื™ื ื™ื ืจื’ื•ืขื™ื ื•ืœื ื‘ืžืฆื‘ ื—ื™ืจื•ื.