uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

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

Ko'proq ko'rsatish
1 418
Obunachilar
Ma'lumot yo'q24 soatlar
-17 kunlar
-430 kunlar
Postlar arxiv
ToCode
1 419
sql\CASE WHEN ${t.type} = 'tool-getLocation' THEN ${t.tool_toolCallId} IS NOT NULL AND ${t.tool_state} IS NOT NULL ELSE TRUE END\,
    ),
    check(
      "data_weather_fields_required",
      sql\CASE WHEN ${t.type} = 'data-weather' THEN ${t.data_weather_location} IS NOT NULL AND ${t.data_weather_weather} IS NOT NULL AND ${t.data_weather_temperature} IS NOT NULL ELSE TRUE END\,
    ),
  ],
);

export type MyDBUIMessagePart = typeof parts.$inferInsert;
export type MyDBUIMessagePartSelect = typeof parts.$inferSelect;
ื”ืชื•ื›ืŸ ื ืฉืžืจ ื‘ื˜ื‘ืœื” ืฉื ืงืจืืช parts ื›ืืฉืจ ืœื›ืœ ื”ื•ื“ืขื” ื™ืฉ ื”ืจื‘ื” ื—ืœืงื™ื. ื˜ื‘ืœื” ื–ื• ืžื›ื™ืœื” ืขืžื•ื“ื•ืช ืœื›ืœ "ืกื•ื’" ื—ืœืง ื•ื™ื•ืชืจ ืžื–ื” ืœื›ืœ ื›ืœื™ ืคื•ื˜ื ืฆื™ืืœื™ ื™ืฉ ืฉืชื™ ืขืžื•ื“ื•ืช ืขื‘ื•ืจ ื”ืงืœื˜ ื•ื”ืคืœื˜ ืฉืœ ืื•ืชื• ื›ืœื™. ื›ืฉืฉืืœืชื™ ืืช ืงืœื•ื“ ืขืœ ื”ืกื›ื™ืžื” ื”ื•ื ื›ืชื‘ ื‘ื›ืชื‘ ืžื•ื“ื’ืฉ "This is over-engineered for most AI conversation needs". ืžื›ื™ืจื™ื ื’ื™ืฉื•ืช ื ื•ืกืคื•ืช? ื ื™ืกื™ืชื ื—ืœืง ืžื”ื’ื™ืฉื•ืช ืคื” ื•ืจื•ืฆื™ื ืœืฉืชืฃ ืื™ืš ื”ื™ื”? ืžื•ื–ืžื ื™ื ืœืฉืชืฃ ื‘ืชื’ื•ื‘ื•ืช ื‘ื˜ืœื’ืจื ืื• ื‘ืจืฉืชื•ืช ื”ื—ื‘ืจืชื™ื•ืช.

ToCode
1 419
"messages",
  {
    id: varchar()
      .primaryKey()
      .$defaultFn(() => generateId()),
    chatId: varchar()
      .references(() => chats.id, { onDelete: "cascade" })
      .notNull(),
    createdAt: timestamp().defaultNow().notNull(),
    role: varchar().$type<MyUIMessage["role"]>().notNull(),
  },
  (table) => [
    index("messages_chat_id_idx").on(table.chatId),
    index("messages_chat_id_created_at_idx").on(table.chatId, table.createdAt),
  ],
);

export const parts = pgTable(
  "parts",
  {
    id: varchar()
      .primaryKey()
      .$defaultFn(() => generateId()),
    messageId: varchar()
      .references(() => messages.id, { onDelete: "cascade" })
      .notNull(),
    type: varchar().$type<MyUIMessage["parts"][0]["type"]>().notNull(),
    createdAt: timestamp().defaultNow().notNull(),
    order: integer().notNull().default(0),

    // Text fields
    text_text: text(),

    // Reasoning fields
    reasoning_text: text(),

    // File fields
    file_mediaType: varchar(),
    file_filename: varchar(), // optional
    file_url: varchar(),

    // Source url fields
    source_url_sourceId: varchar(),
    source_url_url: varchar(),
    source_url_title: varchar(), // optional

    // Source document fields
    source_document_sourceId: varchar(),
    source_document_mediaType: varchar(),
    source_document_title: varchar(),
    source_document_filename: varchar(), // optional

    // shared tool call columns
    tool_toolCallId: varchar(),
    tool_state: varchar().$type<ToolUIPart["state"]>(),
    tool_errorText: varchar().$type<ToolUIPart["state"]>(),

    // tools inputs and outputss are stored in separate cols
    tool_getWeatherInformation_input:
      jsonb().$type<getWeatherInformationInput>(),
    tool_getWeatherInformation_output:
      jsonb().$type<getWeatherInformationOutput>(),

    tool_getLocation_input: jsonb().$type<getLocationInput>(),
    tool_getLocation_output: jsonb().$type<getLocationOutput>(),

    // Data parts
    data_weather_id: varchar().$defaultFn(() => generateId()),
    data_weather_location: varchar().$type<MyDataPart["weather"]["location"]>(),
    data_weather_weather: varchar().$type<MyDataPart["weather"]["weather"]>(),
    data_weather_temperature:
      real().$type<MyDataPart["weather"]["temperature"]>(),

    providerMetadata: jsonb().$type<MyProviderMetadata>(),
  },
  (t) => [
    // Indexes for performance optimisation
    index("parts_message_id_idx").on(t.messageId),
    index("parts_message_id_order_idx").on(t.messageId, t.order),

    // Check constraints
    check(
      "text_text_required_if_type_is_text",
      // This SQL expression enforces: if type = 'text' then text_text IS NOT NULL
      sql\CASE WHEN ${t.type} = 'text' THEN ${t.text_text} IS NOT NULL ELSE TRUE END\,
    ),
    check(
      "reasoning_text_required_if_type_is_reasoning",
      sql\CASE WHEN ${t.type} = 'reasoning' THEN ${t.reasoning_text} IS NOT NULL ELSE TRUE END\,
    ),
    check(
      "file_fields_required_if_type_is_file",
      sql\CASE WHEN ${t.type} = 'file' THEN ${t.file_mediaType} IS NOT NULL AND ${t.file_url} IS NOT NULL ELSE TRUE END\,
    ),
    check(
      "source_url_fields_required_if_type_is_source_url",
      sql\CASE WHEN ${t.type} = 'source_url' THEN ${t.source_url_sourceId} IS NOT NULL AND ${t.source_url_url} IS NOT NULL ELSE TRUE END\,
    ),
    check(
      "source_document_fields_required_if_type_is_source_document",
      sql\CASE WHEN ${t.type} = 'source_document' THEN ${t.source_document_sourceId} IS NOT NULL AND ${t.source_document_mediaType} IS NOT NULL AND ${t.source_document_title} IS NOT NULL ELSE TRUE END\,
    ),
    check(
      "tool_getWeatherInformation_fields_required",
      sql\CASE WHEN ${t.type} = 'tool-getWeatherInformation' THEN ${t.tool_toolCallId} IS NOT NULL AND ${t.tool_state} IS NOT NULL ELSE TRUE END\,
    ),
    check(
      "tool_getLocation_fields_required",

ToCode
1 419
ืคืจื™ื™ืžื•ื•ืจืงื™ื ืื’'ื ื˜ื™ื™ื ื•ืฉืžื™ืจืช ื”ื•ื“ืขื•ืช ื‘ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ืื—ื“ ื”ืคืขืจื™ื ื‘ื™ืŸ ืกืคืจื™ื•ืช ืœื›ืชื™ื‘ืช ืžืขืจื›ื•ืช ืžืฉื•ืœื‘ื•ืช AI ื”ื•ื ื”ืื•ืคืŸ ื‘ื• ืžืขืจื›ื•ืช ืืœื” ืฉื•ืžืจื•ืช ื”ื•ื“ืขื•ืช ื‘ื‘ืกื™ืก ื”ื ืชื•ื ื™ื. ื‘ื•ืื• ื ืจืื” ืฉืœื•ืฉ ืชื‘ื ื™ื•ืช ืžืจื›ื–ื™ื•ืช ื•ืžื”ืŸ ื ืœืžื“ ืขืœ ืžื” ื—ืฉื•ื‘ ืœื”ืกืชื›ืœ. ื ืชื—ื™ืœ ืขื OpenAI Agents SDK, ืกืคืจื™ื” ื™ื—ืกื™ืช ื—ื“ืฉื” ืฉืœ OpenAI. ื–ืืช ื”ื“ื•ื’ืžื” ืžืชื•ืš ื”ืชื™ืขื•ื“ ืฉืœื”ื:
import asyncio

from agents import Agent, Runner, SQLiteSession

async def main():
    agent = Agent(name="Assistant", instructions="Reply very concisely.")

    # Create session instance
    session = SQLiteSession("conversation_123", "chats.db")

    # First turn
    result = await Runner.run(agent, "What city is the Golden Gate Bridge in?", session=session)
    print(result.final_output)
    # San Francisco

    # Second turn - agent automatically remembers previous context
    result = await Runner.run(agent, "What state is it in?", session=session)
    print(result.final_output)
    # California

if __name__ == '__main__':
    asyncio.run(main())
ื”ืกืคืจื™ื” ืฉื•ืžืจืช ืืช ื›ืœ ื”ื”ื•ื“ืขื•ืช ื”ื™ืฉื ื•ืช ื‘ื‘ืกื™ืก ื ืชื•ื ื™ื SQLite ืื• ื‘ื–ื™ื›ืจื•ืŸ. ื‘ื“ืฃ ื”ืชื™ืขื•ื“ ื”ื ืžืฆื™ืขื™ื ืœื™ ืœื›ืชื•ื‘ Custom Session Backend ืื ืื ื™ ืจื•ืฆื” ืœื”ืฉืชืžืฉ ื‘ืกืคืจื™ื” ื‘ืคืจื•ื“ืงืฉืŸ ื›ื“ื™ ืœืฉืžื•ืจ ืืช ื”ืฉื™ื—ื•ืช ื‘ Postgresql ืื• ืจื“ื™ืก, ืื‘ืœ ื”ื ืœื ืžืกืคืงื™ื ืื—ื“. ื‘ื›ื ื™ืกื” ืœื‘ืกื™ืก ื”ื ืชื•ื ื™ื ืฉื ื•ืฆืจ ืื ื™ ื™ื›ื•ืœ ืœื–ื”ื•ืช ืฉื ื˜ื‘ืœื” ืฉืœ ืฉื™ื—ื•ืช ื•ื˜ื‘ืœื” ืฉืœ ื”ื•ื“ืขื•ืช:
sqlite> .tables
agent_messages  agent_sessions
sqlite> select * from agent_messages ;
1|conversation_123|{"content": "What city is the Golden Gate Bridge in?", "role": "user"}|2025-07-30 13:35:36
2|conversation_123|{"id": "msg_688a1fa7fbe0819b9f4096e23741045f0d855ca99eba94a7", "content": [{"annotations": [], "text": "San Francisco.", "type": "output_text", "logprobs": []}], "role": "assistant", "status": "completed", "type": "message"}|2025-07-30 13:35:36
3|conversation_123|{"content": "What state is it in?", "role": "user"}|2025-07-30 13:35:37
4|conversation_123|{"id": "msg_688a1fa8fde0819b958bac6b45c84f900d855ca99eba94a7", "content": [{"annotations": [], "text": "California.", "type": "output_text", "logprobs": []}], "role": "assistant", "status": "completed", "type": "message"}|2025-07-30 13:35:37
sqlite> select * from agent_sessions ;
conversation_123|2025-07-30 13:35:36|2025-07-30 13:35:37
ื›ืœ ื”ื•ื“ืขื” ื ืฉืžืจืช ื‘ืชื•ืจ JSON ื‘ืœื™ ืกื›ื™ืžื” ืžืกื•ื“ืจืช. ื™ืฉ ืคื” ื™ืชืจื•ืŸ ืฉื”ืžื™ืžื•ืฉ ืคืฉื•ื˜ ื•ืื ื™ื”ื™ื• ืœื ื• ื—ืœืงื™ื ื ื•ืกืคื™ื ืœื”ื•ื“ืขื” ื™ื”ื™ื” ืงืœ ืœื”ื•ืกื™ืฃ ื”ื•ื“ืขื•ืช ื—ื“ืฉื•ืช ืขื ืื•ืชื ื—ืœืงื™ื, ืื‘ืœ ื’ื ื—ื™ืกืจื•ืŸ ืฉืงืฉื” ืœื”ืจื™ืฅ ืฉืื™ืœืชื•ืช ืขืœ JSON ืื• ืœื•ื•ื“ื ื ื›ื•ื ื•ืช ืฉืœ ื”ืชื•ื›ืŸ. ืกืคืจื™ื” ืฉื ื™ื” ื”ื™ื RubyLLM ื‘ืฉืคืช ืจื•ื‘ื™ ืฉืžืชื—ื‘ืจืช ืขื ืจื™ื™ืœืก ื•ืžืฆื™ืขื” ืืช ื”ืžื‘ื ื” ื”ื‘ื:
rails g model Chat model_id:string user:references
rails g model Message chat:references role:string content:text model_id:string input_tokens:integer output_tokens:integer tool_call:references
rails g model ToolCall message:references tool_call_id:string:index name:string arguments:jsonb
ื”ืฉื™ื ื•ื™ ื”ืจืืฉื•ืŸ ืฉืื ื—ื ื• ืจื•ืื™ื ื”ื•ื ื”ื‘ื—ื™ืจื” ืœื”ืฉืชืžืฉ ื‘ืกื›ื™ืžื” ืžืกื•ื“ืจืช, ืœื›ืœ ื”ื•ื“ืขื” ื™ืฉ ืชื•ื›ืŸ, role, ื˜ื•ืงื ื™ื ื•ืื™ื–ื” ืžื•ื“ืœ ื™ืฆืจ ืื•ืชื”, ื•ื‘ื ื•ืกืฃ ื™ืฉ ืœื ื• ื˜ื‘ืœื” ืฉืœ ื”ืคืขืœืช ื›ืœื™ื ืฉืฉื•ืžืจืช ืืช ื”ืคืจืžื˜ืจื™ื ื•ืฉืžื•ืช ื›ืœ ื”ื›ืœื™ื ืฉื ืงืจืื•. ื›ืœ ToolCall ืžื—ื•ื‘ืจ ืœืฉืชื™ ื”ื•ื“ืขื•ืช, ื”ื”ื•ื“ืขื” ืฉื”ืคืขื™ืœื” ืืช ื”ื›ืœื™ ื•ื”ื”ื•ื“ืขื” ืขื ื”ืชื•ืฆืื”. ื™ืฉ ืคื” ืฆืขื“ ืงื“ื™ืžื” ืžื‘ื—ื™ื ืช ื‘ื˜ื™ื—ื•ืช ื”ืžื™ื“ืข ื•ื—ื™ื‘ื•ืจ ืœื‘ืกื™ืกื™ ื ืชื•ื ื™ื ืืžื™ืชื™ื™ื. ื—ืœืงื™ื ืื—ืจื™ื ื‘ื”ื•ื“ืขื” ื›ืžื• ืงื‘ืฆื™ื ืื• ืชืžื•ื ื•ืช ื™ื™ืฉืžืจื• ื‘ื˜ื‘ืœื” ื ืคืจื“ืช ืฉืœ ืงื‘ืฆื™ื ืžืฆื•ืจืคื™ื ื‘ืžื ื’ื ื•ืŸ Active Storage. ืžืฉืชืžืฉื™ื ืฉืจื•ืฆื™ื ื™ื›ื•ืœื™ื ืœื”ื•ืกื™ืฃ ืขื•ื“ ืขืžื•ื“ื•ืช ืœื˜ื‘ืœืช ื”ื”ื•ื“ืขื•ืช ื›ืžื• metadata. ืกืคืจื™ื” ืฉืœื™ืฉื™ืช ืœืกืงื™ืจื” ื”ื™ื Vercel AI SDK ื•ื”ื™ื ืžืฆื™ืขื” ืืช ื”ืคื™ืชืจื•ืŸ ื”ืžื•ืจื›ื‘ ืžื›ื•ืœืŸ. ื›ืš ื ืจืื™ืช ืกื›ื™ืžื” ืžื”ื“ื•ื’ืžื” ืฉืœื”ื:
import {
  check,
  index,
  integer,
  jsonb,
  pgTable,
  real,
  text,
  timestamp,
  varchar,
} from "drizzle-orm/pg-core";
import { MyDataPart, MyUIMessage, MyProviderMetadata } from "../message-type";
import { generateId, ToolUIPart } from "ai";
import { sql } from "drizzle-orm";
import {
  getLocationInput,
  getLocationOutput,
  getWeatherInformationInput,
  getWeatherInformationOutput,
} from "@/ai/tools";

export const chats = pgTable("chats", {
  id: varchar()
    .primaryKey()
    .$defaultFn(() => generateId()),
});

export const messages = pgTable(

ToCode
1 419
ื”ื–ืžื ื” ืœื•ื•ื‘ื™ื ืจ: ื‘ื•ืื• ื ื›ืชื•ื‘ ืฉืจืช MCP ื‘ืขื‘ื•ื“ื” ืขื AI ื›ื— ืขืœ ืฉืžืื•ื“ ืขื•ื–ืจ ืœ AI ืœื™ืฆื•ืจ ืงื•ื“ ื˜ื•ื‘ ื™ื•ืชืจ ื”ื•ื ื”ื™ื›ื•ืœืช ืœื”ืคืขื™ืœ "ื›ืœื™ื" - ื›ืœื•ืžืจ ืœื‘ืงืฉ ืžืกื‘ื™ื‘ืช ื”ืคื™ืชื•ื— ืœืขืฉื•ืช ืžืฉื”ื•, ืœืงื‘ืœ ืืช ื”ืชื•ืฆืื” ื•ืœื”ืžืฉื™ืš ืœื™ืฆื•ืจ ื˜ืงืกื˜ ืœืคื™ ื”ืชื•ืฆืื” ืฉื”ืชืงื‘ืœื”. ืกื‘ื™ื‘ื•ืช ืคื™ืชื•ื— ืžืฉื•ืœื‘ื•ืช AI ื™ื•ื“ืขื•ืช ืœื”ืชื—ื‘ืจ ืœื›ืœื™ื ื—ื™ืฆื•ื ื™ื™ื ื“ืจืš ืืจื›ื™ื˜ืงื˜ื•ืจื” ืฉื ืงืจืืช MCP, ืงื™ืฆื•ืจ ืฉืœ Model Context Protocol. ืื ืืชื ืขื•ื‘ื“ื™ื ื‘ืกื‘ื™ื‘ืช ืคื™ืชื•ื— ืžืฉื•ืœื‘ืช AI ื•ื”ืชื ืกื™ืชื ื‘ืžืฆื‘ ืกื•ื›ืŸ ืฉืœ ื”ืกื‘ื™ื‘ื” ื›ื‘ืจ ืจืื™ืชื ืขื‘ื•ื“ื” ืขื ื›ืœื™ื - ื–ื” ื”ืกื•ื›ืŸ ืฉืžื‘ืงืฉ ืœืงื‘ืœ ืชื•ื›ืŸ ืฉืœ ืงื•ื‘ืฅ, ืœื”ืจื™ืฅ ืคืงื•ื“ื” ื‘ืฉื•ืจืช ื”ืคืงื•ื“ื” ืื• ืืคื™ืœื• ืœื”ืชื—ื‘ืจ ืœื‘ืกื™ืก ื”ื ืชื•ื ื™ื, ืœื’ื™ื˜ื”ืื‘ ืื• ืœืื™ื ื˜ืจื ื˜. ื—ืœืง ืžื”ื›ืœื™ื ื”ื’ื™ืขื• ืžื•ื‘ื ื™ื ื‘ืกื‘ื™ื‘ื”, ืืช ื—ืœืงื ืื•ืœื™ ื”ืชืงื ืชื ื‘ืขืฆืžื›ื ื“ืจืš ื”ืื™ื ื˜ืจื ื˜. ื•ื”ืืžืช ืฉืžืื•ื“ ืงืœ ื’ื ืœื›ืชื•ื‘ ื›ืœื™ื ื›ืืœื” ื‘ืขืฆืžื›ื. ืžื—ืจ (ื” 31.7) ื‘ืขืฉืจ ื‘ื‘ื•ืงืจ ืืจืื” ืœื›ื ื‘ืฉื™ื—ืช ื–ื•ื ืคืชื•ื—ื” ืื™ืš ืœื›ืชื•ื‘ ืฉืจืช MCP ื•ืœื”ืขืœื•ืช ืื•ืชื• ืœืื™ื ื˜ืจื ื˜ ืœืชืฉืชื™ืช ืฉืœ Cloudflare Worker. ืื ื—ื ื• ื ืจืื”: 1. ืื™ืš ืœืคืชื•ื— ืคืจื•ื™ืงื˜ MCP Server ื—ื“ืฉ ื‘ื˜ื™ื™ืคืกืงืจื™ืคื˜. 2. ื ื›ื™ืจ ืืช ื”ืžื‘ื ื” ืฉืœ ืฉืจืช MCP ืฉื™ื•ื“ืข ืœืขื‘ื•ื“ ืขืœ ืงืœืื•ื“ืคืœื™ื™ืจ ื“ืจืš ืกืคืจื™ื™ืช ื”ืกื•ื›ื ื™ื ืฉืœื”ื. 3. ื ื—ื‘ืจ ืืช ืฉืจืช ื” MCP ืœืื—ืกื•ืŸ KV ื‘ืงืœืื•ื“ืคืœื™ื™ืจ ื•ื ืจืื” ืžื” ื”ื”ื‘ื“ืœ ื‘ื™ืŸ ืกื˜ื™ื™ื˜ ืฉืœ ื”ืฉืจืช ืœื‘ื™ืŸ ืžื™ื“ืข ืงื‘ื•ืข ืฉื ืฉืžืจ. 4. ื ื“ื‘ืจ ืขืœ ืื•ืชื ื˜ื™ืงืฆื™ื” ื•ื ื‘ื™ืŸ ืื™ืš ืขื•ื‘ื“ ื ื™ื”ื•ืœ ื’ื™ืฉื” ืœืฉืจืช ืขื OAuth. ื›ืจื’ื™ืœ ื‘ืžืคื’ืฉื™ื ืืœื” ืชื”ื™ื” ืฉื™ื—ื” ืคืชื•ื—ื” ืขื ื”ืžื•ืŸ ืžืงื•ื ืœืฉืืœื•ืช ื•ื”ืืจื•ืช ืฉืœื›ื. ืœื ืชื”ื™ื” ื”ืงืœื˜ื” ืื‘ืœ ืื ืืชื ืœื ืžืกืคื™ืงื™ื ืœื”ื’ื™ืข ืชื›ืชื‘ื• ืœื™ ื•ื ืืจื’ืŸ ืฉื™ื“ื•ืจ ื—ื•ื–ืจ. ืื ืืชื ื‘ืงื‘ื•ืฆื” ืื– ื™ืฉ ืœื›ื ื›ื‘ืจ ืืช ื”ืœื™ื ืง ืœื–ื•ื ืžื”ืžืคื’ืฉื™ื ื”ืงื•ื“ืžื™ื, ื•ืื ืขื“ื™ื™ืŸ ืœื ื ื›ื ืกืชื ืื– ืฆืจื™ืš ืจืง ืœื”ื–ื™ืŸ ืืช ื”ืžื™ื™ืœ ื‘ืชื™ื‘ื” ื‘ืขืžื•ื“ ื”ื–ื”: https://tocode.ravpage.co.il/tocodeai ื•ืืชื ืžืงื‘ืœื™ื ืืช ื”ืœื™ื ืง ืœื–ื•ื ื™ืฉืจ ืœืžื™ื™ืœ ื›ืžื• ื’ื ื”ื–ืžื ื•ืช ืœืžืคื’ืฉื™ื ื”ื‘ืื™ื ื‘ื ื•ืฉืื™ AI. ื ืชืจืื” ื‘ื–ื•ื.

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

ToCode
1 419
ืื ื™ ืžืชื›ื ืชืช ืคืจื•ื ื˜-ืื ื“ ื•ืคื•ื—ื“ืช ืฉ AI ื™ื™ืงื— ืœื™ ืืช ื”ืขื‘ื•ื“ื” ืžืชื›ื ืชืช ืคืจื•ื ื˜ ืื ื“ ื›ืชื‘ื” ื‘ืจื“ื™ื˜- > ื”ืชื—ืœืชื™ ืœื”ืฉืชืžืฉ ื‘ื›ืœื™ AI ืœืงื™ื“ื•ื“ ื•ื–ื” ืžื˜ื•ืจืฃ. ืื ื™ ืœื ื™ื•ื“ืขืช ืื™ืคื” ืœื”ืชื—ื™ืœ. ืื ื™ ื‘ื˜ื•ื—ื” ืฉื‘ืงืจื•ื‘ ื”ืขื‘ื•ื“ื” ืฉืœื™ ืชื”ื™ื” ืžื™ื•ืชืจืช. ืกื™ื›ื•ื ื”ืชื’ื•ื‘ื•ืช ืฉืœ ื”ืื ืฉื™ื ืœื ืฆืจื™ืš ืœื”ืคืชื™ืข ืืฃ ืื—ื“ ืžืื™ืชื ื• ื•ื—ืฉื•ื‘ ืœื”ืฉืื™ืจ ืื•ืชื• ื‘ืจืืฉ ื•ืœื”ื™ืฉืืจ ืžืคื•ืงืกื™ื ื‘ืขื‘ื•ื“ื” ืขื ื›ืœื™ื ืืœื”: 1. ื”ืฉืงื™ืขื™ ื‘ืœื™ืžื•ื“ ื” Basics: ืชืœืžื“ื™ ืืจื›ื™ื˜ืงื˜ื•ืจื”, ืชืœืžื“ื™ ืื™ืš ื”ื—ืœืงื™ื ื”ืฉื•ื ื™ื ืฉืœ ื”ืžืขืจื›ืช ืขื•ื‘ื“ื™ื ื™ื—ื“, ืชืœืžื“ื™ ืžื” ื–ื” ืงื•ื“ ื ืงื™ ื•ืื™ืš ื ืจืื” ืงื•ื“ ืฉืงืฉื” ืœืชื—ื–ืง. ืœืžื“ื™ ืื™ืš ืœื›ืชื•ื‘ ื•ืœืขืจื•ืš ืงื•ื“ ื‘ืฆื•ืจื” ืฉื ื™ืชื ืช ืœืชื—ื–ื•ืงื” ืœืื•ืจืš ื–ืžืŸ. 2. ืœ AI ื™ืฉ ื ื˜ื™ื™ื” ืœื›ืชื•ื‘ ืคื™ืชืจื•ื ื•ืช ืฉืขื•ื‘ื“ื™ื ื‘ืืžืฆืขื•ืช ืฉื›ืคื•ืœ ืชื‘ื ื™ื•ืช ืžื•ื›ืจื•ืช. ืจื•ื‘ ื”ื–ืžืŸ ื”ืคื™ืชืจื•ื ื•ืช ื”ืืœื” ื‘ื–ื‘ื–ื ื™ื™ื ืื• ืœื ืžืชืื™ืžื™ื ืœ Use Case. ืœืžื“ื™ ืœื–ื”ื•ืช ืคื™ืชืจื•ื ื•ืช ื˜ื•ื‘ื™ื ื•ืœื ื˜ื•ื‘ื™ื ื•ืœื“ืจื•ืฉ ืืช ื”ืคื™ืชืจื•ื ื•ืช ื”ื ื›ื•ื ื™ื. ืฉื™ืžื™ ืœื‘ ืฉ AI ื›ื•ืชื‘ ื”ืžื•ืŸ useEffect ื’ื ื›ืฉืœื ืฆืจื™ืš ื•ืœื ื™ื•ื“ืข ืœื—ืœืง ืคื™ืชืจื•ืŸ ืœืงื•ืžืคื•ื ื ื˜ื•ืช. ื”ืชืžืงื“ื™ ื‘ืžื™ื•ืžื ื•ื™ื•ืช ืืœื”. 3. ืœื, AI ื”ื•ื ืœื "ื˜ื•ื‘ ื‘ืจืžื•ืช ืื—ืจื•ืช" ืืœื ื”ื•ื ืžืืชื’ืจ ืืช ื”ื‘ื™ื ื•ื ื™ื•ืช. ืžื™ ืฉืจืง ืจื•ืฆื” ืœื‘ื•ื ืœืขื‘ื•ื“ื” ื›ื“ื™ ืœื”ื“ื‘ื™ืง ื—ืœืงื™ ืงื•ื“ ืžื”ืื™ื ื˜ืจื ื˜ ื™ืฆื˜ืจืš ืœืžืฆื•ื ืขื‘ื•ื“ื” ืื—ืจืช. ื™ื”ื™ื• ืฉื™ื ื•ื™ื™ื. ื™ื”ื™ื• ืžืฉืจื•ืช ืฉื™ื™ืกื’ืจื• ื•ืื—ืจื•ืช ืฉื™ื™ืคืชื—ื•. ื•ื–ื” ื™ืงืจื” ืžื”ืจ. ื›ื›ืœ ืฉ AI ื™ื›ืชื•ื‘ ื™ื•ืชืจ ืงื•ื“ ื›ืš ื ืฆื˜ืจืš ื™ื•ืชืจ ืžืคืชื—ื™ื ื‘ืจืžื” ื’ื‘ื•ื”ื” ืฉื™ื•ื›ืœื• ืœืขืจื•ืš ืืช ื”ืงื•ื“ ืฉื ื•ืฆืจ, ืœืกื“ืจ ืื•ืชื• ื‘ืžืงื•ื ื•ืœื™ืฆื•ืจ ืžื‘ื ื™ื ื˜ื•ื‘ื™ื ื™ื•ืชืจ.

ToCode
1 419
ื›ืžื” ืจืขื™ื•ื ื•ืช ื™ื•ืชืจ ื˜ื•ื‘ื™ื ืžื”ืฉืœืžืช ื˜ืื‘ื™ื ื›ื“ื™ ืœืœืžื•ื“ ื™ื•ืฆืจื™ ืงืจืกืจ ืกื™ืคืจื• ื‘ืจืื™ื•ืŸ ืฉื”ื™ื” ืœื”ื ื—ืฉื•ื‘ ืœื”ืฉืงื™ืข ื‘ื”ืฉืœืžืช ืงื•ื“ ืื•ื˜ื•ืžื˜ื™ืช ืขื ื˜ืื‘ ื•ืœื”ืจื—ื™ื‘ ืืช ื”ืคื™ืฆ'ืจ ืžืขื‘ืจ ืœืจืง ื”ืฉืœืžืช ืงื•ื“. ื‘ืงืจืกืจ ื”ื˜ืื‘ ื’ื ืงื•ืคืฅ ืœืžืงื•ื ื”ื‘ื ืฉืชืจืฆื• ืœืขืจื•ืš, ืžืฉื ื” ืงื•ื“ ื™ืฉืŸ ืื• ืžื•ื—ืง ืงื•ื“. ื”ื˜ื™ืขื•ืŸ ืฉืœื”ื ื”ื™ื” ืฉืชื›ื ื•ืช ืžืขืจื‘ ืžืขื˜ ื ืงื•ื“ื•ืช ื”ื—ืœื˜ื” (ื—ืฉื™ื‘ื”) ื•ื”ืจื‘ื” ื”ืžืฉืš ืื•ื˜ื•ืžื˜ื™ ืœืื•ืชื” ื”ื—ืœื˜ื”. ื•ื™ืฉ ื‘ื–ื” ืœื ืžืขื˜. ื”ื™ื•ื ื›ืฉืื ื™ ื›ื•ืชื‘ ืงื•ื“ ืขื LLM ืื ื™ ืจื•ืื” ืืช ื”ืชื•ืคืขื” ื”ื–ื• ื‘ื‘ื™ืจื•ืจ: ื” LLM ืžืฆืœื™ื— ืœื‘ื ื•ืช ืคื™ืฆ'ืจื™ื ืžื”ืจ ื›ืฉื”ืชืฉืชื™ืช ื‘ื ื•ื™ื” ืœืคื™ืฆ'ืจ ื”ื—ื“ืฉ, ืื‘ืœ ื”ื•ื ืœื ื™ื›ื•ืœ ืœืฉื™ื ืœื‘ ื•ืœื”ื—ืœื™ื˜ ื”ื—ืœื˜ื•ืช ื™ืฆื™ืจืชื™ื•ืช ืœื’ื‘ื™ ื”ืงื•ื“, ื”ื—ืœื˜ื•ืช ืฉื™ืืคืฉืจื• ืœื• ืœื‘ื ื•ืช ืืช ื”ืกื˜ ื”ื‘ื ืฉืœ ื”ืคื™ืฆ'ืจื™ื. ื‘ื—ื–ืจื” ืœื˜ืื‘ - ืื– ื”ืฉืœืžืช ื”ืงื•ื“ ืขื ื˜ืื‘ ืžืฉื—ืงืช ืžืฉื—ืง ื›ื–ื”, ืžืžื™ืœื ื™ืฉ ืœืš ืžืขื˜ ื ืงื•ื“ื•ืช ื—ืฉื™ื‘ื” ื•ื”ืจื‘ื” ื›ืชื™ื‘ื” ืื•ื˜ื•ืžื˜ื™ืช ืฉืœ ืงื•ื“, ืื ื—ื ื• ืœื ื™ื•ื“ืขื™ื ื‘ืฆื•ืจื” ืื•ื˜ื•ืžื˜ื™ืช ืžืชื™ ืฆืจื™ืš ืœื—ืฉื•ื‘ ื•ืžืชื™ ืฆืจื™ืš ืœืจื•ืฅ ืื•ื˜ื•ืžื˜ื™ืช ืื– ื ืจื•ืฅ ืชืžื™ื“ ืื•ื˜ื•ืžื˜ื™ืช ื•ืื ืฆืจื™ืš ืœื—ืฉื•ื‘ ืืชื” ืื—ืจืื™ ืœืœื—ื•ืฅ ืขืœ ื”ื‘ืœืžื™ื (ื‘ืžืงืจื” ืฉืœ ื˜ืื‘ ื–ื” ื›ืคืชื•ืจ Escape), ืœื—ืฉื•ื‘ ื•ืœื›ืชื•ื‘ ืงื•ื“ ืื—ืจ. ืžืคืชื—ื™ื ืจื‘ื™ื ืžืจื’ื™ืฉื™ื ืฉืžื ื’ื ื•ืŸ ื–ื” ืขื•ื–ืจ ืœื”ื ืœืœืžื•ื“: ื”ื ืขืฉื• ืืช ื”ื—ืฉื™ื‘ื” ืื‘ืœ ืขื›ืฉื™ื• ืœื ื‘ื˜ื•ื—ื™ื ืื™ืš ื™ืจืื” ื”ืกื™ื ื˜ืงืก ื•ืฆืคื™ื™ื” ื‘ืงื•ื“ ืฉื ื›ืชื‘ ืื•ื˜ื•ืžื˜ื™ืช ื™ื›ื•ืœื” ืœืขื–ื•ืจ ืœืงื‘ืœ ืจืขื™ื•ื ื•ืช ืœืžื™ืžื•ืฉื™ื. ื”ื‘ืขื™ื” ืฉื‘ื ื™ ืื“ื ืœื ื˜ื•ื‘ื™ื ื‘ืžื™ื•ื—ื“ ื‘ืœื™ืžื•ื“ ื“ืจืš ืฆืคื™ื™ื” ื‘ืื—ืจื™ื. ื’ื ืื ื™ืฉ ื”ืืจื•ืช ืžืขื ื™ื™ื ื•ืช ืฉื ืจื•ื•ื™ื— ืžืฆืคื™ื” ื‘ืงื•ื“ ืฉื ื›ืชื‘, ื”ืจื•ื‘ ื™ื™ืฉื›ื— ืžื”ืจ. ื‘ืžืงื•ื ืœืฆืคื•ืช ื‘ืงืจืกืจ ืื• ืงื•ืคื™ื™ืœื•ื˜ ื›ื•ืชื‘ ืงื•ื“ ื”ื ื” ื›ืžื” ื“ื‘ืจื™ื ืฉืชื•ื›ืœื• ืœื ืกื•ืช ื•ื™ื•ืชืจ ื™ืขื–ืจื• ืœื›ื ืœื”ืชืงื“ื ื‘ืคื™ืชื•ื—: 1. ืœื“ื‘ืจ ืขื AI ื‘ื—ืœื•ืŸ ืื—ื“, ืœื›ืชื•ื‘ ืœื‘ื“ ื‘ื—ืœื•ืŸ ืื—ืจ - ื›ื™ ืื™ืŸ ืชื—ืœื™ืฃ ืœื”ืงืœื“ื”. ื‘ื•ื ื•ืก, ืื—ืจื™ ืฉื”ืคื™ืฆ'ืจ ืขื•ื‘ื“ ืฉื•ืžืจื™ื ืืช ื”ืงื•ื“ ื‘ืขื ืฃ ืื—ืจ ื‘ื’ื™ื˜, ื—ื•ื–ืจื™ื ืœืขื ืฃ ื”ืžืงื•ืจื™ ื•ืžืงืœื™ื“ื™ื ืžืืคืก ืืช ื”ืคื™ืชืจื•ืŸ. 2. ืœืชืช ืœ AI ืœื›ืชื•ื‘ ืืช ื”ืงื•ื“ ื“ืจืš Agent Mode ื‘ื—ืœื•ืŸ ื”ืฆื“ ื•ืื– ืœืขื‘ื•ืจ ืขืœ ื”ืงื•ื“ ื•ืœืฉืื•ืœ ืขืœื™ื• ืฉืืœื•ืช. ื“ื™ืืœื•ื’ ืžืืœืฅ ืื•ืชื ื• ืœื”ื‘ื™ืŸ ื•ืœื—ืฉื•ื‘ ื™ื•ืชืจ ืžืืฉืจ ืฆืคื™ื™ื” ื‘ืžื™ืฉื”ื• ืื—ืจ ืขื•ืฉื”. 3. ืœืชืช ืœ AI ืœื›ืชื•ื‘ ืืช ื”ืงื•ื“ ื•ืœื”ื“ื‘ื™ืง ืืช ื”ืชื•ืฆืื” ืœื—ืœื•ืŸ ืฉื™ื—ื” ื ืคืจื“ ื‘ื“ืคื“ืคืŸ, ื•ืฉื ืœื‘ืงืฉ ื”ืกื‘ืจ ืขืœ ื”ืงื•ื“ ืฉื ื›ืชื‘ ื•ืชืจื’ื™ืœื™ื ืฉื™ืขื–ืจื• ืœื›ื ืœื”ื‘ื™ืŸ ืื•ืชื• ื˜ื•ื‘ ื™ื•ืชืจ. 4. ืœื›ืชื•ื‘ ืชื™ืขื•ื“ ืœืคื ื™ ืฉื” AI ืžืงื•ื“ื“ ื•ืœืชืช ืœ AI ืœืžืžืฉ. ืฉื—ืงื• ืขื ื’ื™ืจืกืื•ืช ืฉื•ื ื•ืช ืฉืœ ื”ืชื™ืขื•ื“ ื•ืชืจืื• ืžื™ืžื•ืฉื™ื ืฉื•ื ื™ื ืฉืœ AI. 5. ืœื”ืกืชื›ืœ ืขืœ ืžื™ืžื•ืฉ ืกืคืฆื™ืคื™ ื•ืœื›ืชื•ื‘ ืœื• ืชื™ืขื•ื“, ืื—ืจื™ ื–ื” ืœื”ื“ื‘ื™ืง ืืช ื”ืชื™ืขื•ื“ ืฉื›ืชื‘ืชื ื•ื”ืžื™ืžื•ืฉ ืœื—ืœื•ืŸ ืฉื™ื—ื” ื ืคืจื“ ื•ืœื‘ืงืฉ ืคื™ื“ื‘ืง. 6. ืœืชืช ืœ AI ืœืžืžืฉ ื•ืœื”ืขืชื™ืง ืืœื™ื ื• ืœืงื•ื“ ื›ืœ ืคืขื ืคื•ื ืงืฆื™ื” ืื• ื‘ืœื•ืง ืงืฆืจ ืืคื™ืœื• ื‘ Copy/Paste. ืœืงืจื•ื, ืœื•ื•ื“ื ืฉื”ื‘ื ืชื ื•ืœืชืช Code Review ืœ AI ืขืœ ื›ืœ ื‘ืœื•ืง ื›ื–ื”. ื›ืŸ ืื ื™ ืžื‘ื™ืŸ ืฉื›ืœ ืื—ืช ืžื”ื”ืฆืขื•ืช ืฉืœื™ ื›ืืŸ ืœื•ืงื—ืช ื™ื•ืชืจ ื–ืžืŸ ืžืœื”ืชื‘ื•ื ืŸ ื‘ AI ื›ื•ืชื‘ ืงื•ื“ ืชื•ืš ื›ื“ื™ ืœื—ื™ืฆื•ืช ืขืœ Tab. ื•ื–ื” ื‘ืกื“ืจ - ื’ื ืื ื” AI ืขื•ื–ืจ ืœื›ืชื•ื‘ ืงื•ื“ ืžื”ืจ ื™ื•ืชืจ, ืื™ืŸ ืœื• ืื™ืš ืœืขื–ื•ืจ ืœื ื• ืœื”ื‘ื™ืŸ ืžื”ืจ ื™ื•ืชืจ.

ToCode
1 419
ื˜ื™ืค ืจื•ื‘ื™: ืžื™ืœื™ื ื•ืื™ื ื“ืงืกื™ื ื‘ืžื—ืจื•ื–ืช ืœืจื•ื‘ื™ ืื™ืŸ ื‘ืขื™ื” ืœื”ืคืจื™ื“ ืžื—ืจื•ื–ืช ืœืžื™ืœื™ื ืขื ืื•ืชื” ืคืงื•ื“ืช split ืฉืื ื—ื ื• ืžื›ื™ืจื™ื ื’ื ืžืฉืคื•ืช ืื—ืจื•ืช:
3.3.5 :027 > "hello world".split
 => ["hello", "world"]
ืื‘ืœ ื›ืฉื™ื•ืฆืื™ื ืžืขื•ืœื ื”ื“ื•ื’ืžืื•ืช ื”ืงื˜ื ื•ืช ื”ืงื•ื“ ื”ื–ื” ืžืชื—ื™ืœ ืœืื›ื–ื‘. ื”ื ื” ืขื•ื“ ื ื™ืกื™ื•ืŸ ืขื ืžืฉืคื˜ ื™ื•ืชืจ ืžืืชื’ืจ:
3.3.5 :029 > "Don't. go. there".split
 => ["Don't.", "go.", "there"]
ืฉื”ื™ื” ืขื•ื‘ื“ ื”ืจื‘ื” ื™ื•ืชืจ ื˜ื•ื‘ ื‘ืœื™ ื”ื ืงื•ื“ื•ืช ืฉืฆืžื•ื“ื•ืช ืœืžื™ืœื™ื. ื“ืจืš ืื—ืช ืœืกื“ืจ ืืช ื–ื” ื”ื™ื ืœื—ืคืฉ "ื”ืชืืžื•ืช" ื‘ืžืงื•ื "ื”ืคืจื“ื•ืช" ื•ื‘ืฉื‘ื™ืœ ื–ื” ื™ืฉ ืœื ื• ืืช scan:
3.3.5 :032 > "Don't. go. there".scan(/\p{L}+(?:'\p{L}+)*/u)
 => ["Don't", "go", "there"]
ืœ scan ืื ื™ ื ื•ืชืŸ ื‘ื™ื˜ื•ื™ ืจื’ื•ืœืืจื™, ื‘ืžืงืจื” ืฉืœื ื• ื‘ื™ื˜ื•ื™ ืจื’ื•ืœืืจื™ ืฉืžื—ืคืฉ ืื•ืชื™ื•ืช, ืื—ืจื™ ื–ื” ืื•ืœื™ ื’ืจืฉ (ื‘ื’ืœืœ ืžื™ืœื™ื ื›ืžื• Don't) ื•ืื– ืขื•ื“ ืื•ืชื™ื•ืช. ื–ื” ืขื•ื–ืจ ื›ื“ื™ ืœืงื‘ืœ ืจืง ืืช ื”ืžื™ืœื”, ืื‘ืœ ืขื›ืฉื™ื• ืžื” ืื ืื ื—ื ื• ืจื•ืฆื™ื ื’ื ืืช ื”ืื™ื ื“ืงืก ืฉืœ ื›ืœ ืžื•ืคืข? ืื™ ืืคืฉืจ ืคืฉื•ื˜ ืœื—ืคืฉ ืืช ื”ืื™ื ื“ืงืก ืื—ืจื™ ืฉื›ื‘ืจ ืžืฆืื ื• ืืช ื”ื”ืชืืžื” ื›ื™ ืœืคืขืžื™ื ื™ืฉ ืžื™ืœื™ื ื›ืคื•ืœื•ืช:
3.3.5 :036 > text = "Don't means Don't - Don't press the button"
 => "Don't means Don't - Don't press the button"
3.3.5 :037 > third_word = text.scan(/\p{L}+(?:'\p{L}+)*/u)[2]
 => "Don't"
3.3.5 :038 > index_of_third_word = text.index(third_word)
 => 0
ื–ื” ื”ื—ื–ื™ืจ 0 ื›ื™ ื”ืžื™ืœื” ื”ืฉืœื™ืฉื™ืช ื–ื”ื” ืœืžื™ืœื” ื”ืจืืฉื•ื ื”. ื“ืจืš ืื—ืช ืฉืขื‘ื“ื” ืœื™ ื›ื“ื™ ืœืคืชื•ืจ ืืช ื–ื” ื‘ืจื•ื‘ื™ ื”ื™ื ืœื™ืฆื•ืจ Enumerator ืฉืœ ื”ื”ืชืืžื•ืช ืœื‘ื™ื˜ื•ื™ ื”ืจื’ื•ืœืืจื™. ืžื›ืœ ื”ืชืืžื” ื ื•ื›ืœ ืœืงื‘ืœ ืืช ื”ื˜ืงืกื˜ ื•ื’ื ืืช ืื™ื ื“ืงืก ื”ื”ืชื—ืœื” ืฉืœื”, ื•ื‘ื’ืœืœ ืฉืื ื—ื ื• ื‘ืจื•ื‘ื™ ืืคืฉืจ ืœื”ื•ืกื™ืฃ ืืช ื–ื” ืœืžื—ืœืงื” String ื›ื“ื™ ืฉืืคืฉืจ ื™ื”ื™ื” ืœืงืจื•ื ืœืงื•ื“ ืขืœ ื›ืœ ืžื—ืจื•ื–ืช. ื”ื ื” ื”ืงื•ื“:
3.3.5 :039 > class String
3.3.5 :040 >     def tokenize
3.3.5 :041 >     regex = Regexp.new(/\p{L}+(?:'\p{L}+)*/u)
3.3.5 :042 >
3.3.5 :043 >     Enumerator.new do |y|
3.3.5 :044 >       pos = 0
3.3.5 :045 >       while m = regex.match(self, pos)
3.3.5 :046 >         y << m
3.3.5 :047 >         pos = m.end(0)
3.3.5 :048 >       end
3.3.5 :049 >     end
3.3.5 :050 >   end
3.3.5 :051 > end

3.3.5 :056 > text.tokenize.to_a
 =>
[#<MatchData "Don't">,
 #<MatchData "means">,
 #<MatchData "Don't">,
 #<MatchData "Don't">,
 #<MatchData "press">,
 #<MatchData "the">,
 #<MatchData "button">]
ืขื›ืฉื™ื• ื‘ืฉื‘ื™ืœ ืœืงื‘ืœ ืืช ื›ืœ ื”ืžื™ืœื™ื ื•ืื™ื ื“ืงืก ื”ื”ืชื—ืœื” ืฉืœ ื›ืœ ืžื™ืœื” ืื ื™ ื›ื•ืชื‘:
3.3.5 :057 > text.tokenize.map { |m| [m.to_s, m.begin(0)] }
 => [["Don't", 0], ["means", 6], ["Don't", 12], ["Don't", 20], ["press", 26], ["the", 32], ["button", 36]]
ื•ื‘ืฉื‘ื™ืœ ืœืงื‘ืœ ืืช ืื™ื ื“ืงืก ื”ื”ืชื—ืœื” ืฉืœ ื”ืžื™ืœื” ื”ืฉืœื™ืฉื™ืช ืื ื™ ื›ื•ืชื‘:
3.3.5 :060 > text.tokenize.drop(2).first.begin(0)
 => 12

ToCode
1 419
ื•ืื ืงืœื•ื“ ื”ื—ื–ื™ืจ ืœื™ PR ืฉืœ 700 ืฉื•ืจื•ืช? ื™ืฉ ืชื™ืงื•ื ื™ ื‘ืื’ื™ื ืฉื“ื•ืจืฉื™ื ืฉื‘ื•ืขื•ืช ืฉืœ ืžื—ืงืจ ืขื“ ืฉืื ื—ื ื• ืžื•ืฆืื™ื ืืช ื”ืคืกื™ืง ื”ื–ื” ืฉืฆืจื™ืš ืœื”ื•ืกื™ืฃ ื•ืคื•ืชืจ ืืช ื›ืœ ื”ื‘ืขื™ื”. ื•ื™ืฉ ื‘ืื’ื™ื ืฉื™ื™ืงื— ืฉื‘ื•ืขื•ืช ืœืชืงืŸ ื›ื™ ื”ืชื™ืงื•ืŸ ื“ื•ืจืฉ ื—ืฉื™ื‘ื” ืžื—ื“ืฉ ืขืœ ื”ืžื‘ื ื” ื”ื‘ืกื™ืกื™ ืฉืœ ื”ืžืขืจื›ืช. ื™ืฉ ืคื™ืฆ'ืจื™ื ืฉืžืื•ื“ ืงืœ ืœื›ืชื•ื‘ ื•ืœื‘ื“ื•ืง, ื•ืื—ืจื™ื ืฉื ืฆื˜ืจืš ืœืขื‘ื•ื“ ืงืฉื” ื‘ืฉื‘ื™ืœ ืœื”ื‘ื™ืŸ ืื ื”ื ืขื•ื‘ื“ื™ื ื‘ื›ืœ ื”ืžืฆื‘ื™ื. ื™ืฉ ืžืขืจื›ื•ืช ืฉืžื›ื™ืœื•ืช ื”ืžื•ืŸ ืžื™ื“ืข ืฉืœ ืœืงื•ื—ื•ืช ื•ื›ืœ ืฉื™ื ื•ื™ ื‘ DB ืฆืจื™ืš ืœืขืฉื•ืช ื‘ืคื™ื ืฆื˜ื”, ื•ื™ืฉ ืกื˜ืืจื˜ืืคื™ื ืฉืขื“ื™ื™ืŸ ืื™ืŸ ืœื”ื ืœืงื•ื—ื•ืช ื•ืื™ืŸ ืฉื•ื ื‘ืขื™ื” ืœืฉื‘ื•ืจ ืืช ื›ืœ ื” DB ื•ืœื‘ื ื•ืช ืžื—ื“ืฉ. ืชื™ืงื•ืŸ ื‘ืขื™ื™ืช ื‘ื™ืฆื•ืขื™ื ื–ื” ืœื ืžื—ืงืจ ืขืœ ื”ื˜ืžืขืช ื˜ื›ื ื•ืœื•ื’ื™ื” ื—ื“ืฉื” ื•ื–ื” ืœื ื”ืชืืžืช ืืชืจ ืœืชืงืŸ ื ื’ื™ืฉื•ืช. ืคื™ืชื•ื— ืชื•ื›ื ื” ื–ื” ืขื‘ื•ื“ื” ืฉืžื•ืจื›ื‘ืช ืžื”ืžื•ืŸ ืกื•ื’ื™ื ืฉืœ ืžืฉื™ืžื•ืช ื‘ืจืžื•ืช ืงื•ืฉื™ ืฉื•ื ื•ืช. ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉื‘ืขืชื™ื“ ื™ื”ื™ื” AI ืฉื™ื•ื›ืœ ืœืคืชื•ืจ ืืช ื›ืœ ื”ื‘ืขื™ื•ืช ื”ืืœื” ืื‘ืœ ื‘ื™ื ืชื™ื™ื ืื ื—ื ื• ืœื ืฉื. ื›ืฉืžื™ืฉื”ื• ืื•ืžืจ ืฉื”ื•ื ื ื•ืชืŸ ืœืงืœื•ื“ ืœื›ืชื•ื‘ 100% ืžืงื•ื“ ื”ืžืขืจื›ืช ืื• ืžืชืืจ Flow ืžืกื•ื™ื ืœืขื‘ื•ื“ื” ืขื AI ืฉ"ืชืžื™ื“ ืขื•ื‘ื“" ืื ื™ ืœื•ืงื— ืฆืขื“ ืื—ื•ืจื”. ื›ืฉ AI ืžืกื•ื’ืœ ืœื›ืชื•ื‘ ืืช ื”ืงื•ื“ ืฉืื ื™ ืจื•ืฆื” ืื ื™ ืฉืžื— ืœืฉืœื‘ ืืช ื”ืงื•ื“ ื‘ืคืจื•ื™ืงื˜. ื›ืฉ AI ืœื ืžืฆืœื™ื— ืœื›ืชื•ื‘ ืืช ื”ืงื•ื“ ืฉืื ื™ ืจื•ืฆื” ื›ื™ ืืคื™ืœื• ืื ื™ ืขื•ื“ ืœื ื™ื•ื“ืข ืžื” ืื ื™ ืจื•ืฆื” ืื ื™ ืฉืžื— ืœืจืื•ืช ื›ืžื” ื’ื™ืจืกืื•ืช ื•ื‘ืกื•ืฃ ืœื‘ื—ื•ืจ ืžื”ืŸ ืื• ืœื›ืชื•ื‘ ืžืฉื”ื• ืื—ืจ ื‘ืขืฆืžื™. ื›ืฉ AI ืขื•ื–ืจ ืœื™ ืœืžืฆื•ื ื‘ืื’ ืื ื™ ืฉืžื— ืœื”ื˜ืžื™ืข ืืช ื”ืชื™ืงื•ืŸ ืฉืœื•, ื•ื›ืฉ AI ืœื ืžืฆืœื™ื— ืœืคืชื•ืจ ืืช ื”ื‘ืื’ ืื ื™ ืœื ืœื•ืงื— ืœืœื‘ ื•ืžืชืงืŸ ื‘ืขืฆืžื™. ื•ื›ืฉ AI ืžืชืขืงืฉ ืœื›ืชื•ื‘ ืคื™ืชืจื•ืŸ ืฉืœ 700 ืฉื•ืจื•ืช ืฉืื ื™ ืœื ื™ื›ื•ืœ ืœื”ื‘ื™ืŸ ืœื‘ืขื™ื” ืื ื™ ืื•ืžืจ ืœื ืชื•ื“ื” ื•ื”ื•ืœืš ืœื“ื™ื™ืง ืืช ื”ื‘ืขื™ื”. ื”ืžื˜ืจื” ื”ื™ื ืœื ืœืชืช ืœืงืœื•ื“ ืœื›ืชื•ื‘ 100% ืžื”ืงื•ื“. ื”ืžื˜ืจื” ื”ื™ื ืœื”ืฉืชืžืฉ ื‘ืงืœื•ื“ ื›ื“ื™ ืœื”ืชืงื“ื ืžื”ืจ ื™ื•ืชืจ ื•ืœื‘ื ื•ืช ืžืขืจื›ื•ืช ื™ืฆื™ื‘ื•ืช ื™ื•ืชืจ, ื™ืคื•ืช ื™ื•ืชืจ ื•ื˜ื•ื‘ื•ืช ื™ื•ืชืจ.

ToCode
1 419
ืœื—ืคืฉ ืืช ื”"ื ื›ื•ืŸ" ืื—ื“ ื”ื™ืชืจื•ื ื•ืช ืฉืœ ืžืคืชื—ื™ื ืžื ื•ืกื™ื ืฉืžืชื—ื™ืœื™ื ืœืขื‘ื•ื“ ืขื AI ื”ื•ื ื”ื™ื›ื•ืœืช ืœื”ื‘ื“ื™ืœ ื‘ื™ืŸ ืงื•ื“ื‘ื™ื™ืก "ื ื›ื•ืŸ" ืœืงื•ื“ื‘ื™ื™ืก ืžืกื•ืจื‘ืœ. ืžืจืกืœ ื ื™ื•ืžืŸ ืกื™ืคืง ื“ื•ื’ืžื” ืœื›ื–ืืช ืื‘ื—ื ื” ื‘ืคื•ืกื˜ ืฉืคืจืกื ืขืœ ืคื™ืชื•ื— ืืคืœื™ืงืฆื™ื™ืช Cross Platform ืขื React Native. ืžืจืกืœ ื”ื’ื™ืข ืœืคืจื•ื™ืงื˜ ื‘ืœื™ ืœื”ื›ื™ืจ React Native ืื‘ืœ ืขื ื ื™ืกื™ื•ืŸ ืฉืœ ื›ืขืฉืจ ืฉื ื™ื ื‘ืคื™ืชื•ื— ืชื•ื›ื ื”. ื”ื•ื ื”ืชื—ื™ืœ ืขื Vibe Coding, ื ืชืŸ ืœ AI ืœื‘ื ื•ืช ื”ื›ืœ, ื•ืื– ื ื›ื ืก ืœื”ืกืชื›ืœ ืขืœ ื”ืงื•ื“, ื”ื‘ื™ืŸ ืฉื™ืฉ ืคื” ื‘ืขื™ื” ื•ื›ืžื• ืฉื”ื•ื ืžืชืืจ ืืช ื–ื” "ื™ื—ื“ ืขื ื” AI ื‘ื™ืฆืขื ื• ืจื™ืคืงื˜ื•ืจ ืœื›ืœ ืคื™ืฆ'ืจ ื‘ื™ื™ืฉื•ื ืขื“ ืฉื”ืงื•ื“ ื™ื”ื™ื” ื ืงื™". ื”ืชื”ืœื™ืš ืขืฆืžื• ื”ื™ื” ืžื‘ื—ื™ื ืชื• ื›ืžื• ืฆืคื™ื™ื” ื‘ืกืจื˜ - ื”ื•ื ืฉื•ืืœ ืืช ื” AI ืฉืืœื•ืช ื•ื” AI ืžืœืžื“ ืื•ืชื• ืจื™ืืงื˜ ื• React Native, ืชื•ืš ื›ื“ื™ ืฉื”ื•ื ืžืกื‘ื™ืจ ื›ืœ ืคื™ืฆ'ืจ ื‘ืžืขืจื›ืช ื•ื“ืจืš ื”ืฉืืœื•ืช ืฉืœ ืžืจืกืœ ื’ื ืžื‘ืฆืข ืืช ื”ืจื™ืคืงื˜ื•ืจื™ื ื’ ืœื’ื™ืจืกื” ื™ื•ืชืจ ืคืฉื•ื˜ื”. ื”ื™ื›ื•ืœืช ืœืจืื•ืช ืขื‘ื•ื“ื” ื•ืœื”ื‘ื™ืŸ ืžื”ืจ ืžืื•ื“ ืžื” ื”ืื™ื›ื•ืช ืฉืœื” ื•ืื™ืคื” ืืคืฉืจ ืœืฉืคืจ ืชืžื™ื“ ื”ื™ืชื” ื—ืฉื•ื‘ื”, ืื‘ืœ ืขื›ืฉื™ื• ื”ื™ื ืžืฉืžืขื•ืชื™ืช ื™ื•ืชืจ ืžืชื’ืžืœืช. ื”ื™ื ืžืืคืฉืจืช ืœื ืจืง ืœืงื‘ืœ ืื• ืœื“ื—ื•ืช ืงื•ื“ AI, ืืœื ื’ื ืœื“ืจื•ืฉ ืžื” AI ืฉื™ืคื•ืจื™ื ืกืคืฆื™ืคื™ื™ื ื•ื›ืš ื”ืงื•ื“ ื›ื•ืœื• ื”ื•ืคืš ื˜ื•ื‘ ื™ื•ืชืจ. ื”ืื ื™ื•ื ืื—ื“ ื ื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘ AI ื›ื“ื™ ืœื”ื‘ื™ืŸ ืื AI ืื—ืจ ืœื ื‘ื›ื™ื•ื•ืŸ ื•ืœื ื•ื•ื˜ ืื•ืชื• ืœื›ืชื•ื‘ ืงื•ื“ ื˜ื•ื‘ ื™ื•ืชืจ? ืื ื™ ืœื ื™ื•ื“ืข. ื‘ื™ื ืชื™ื™ื ื–ื” ืขื•ื“ ืžืฉื”ื• ืฉืฉื•ื•ื” ืœื ื• ืœื”ืชืžืงืฆืข ื‘ื•. ื›ื›ืœ ืฉื” Feedback Loop ืฉืœ ื›ืชื™ื‘ืช ืงื•ื“ ืžืชืงืฆืจ ื›ืš ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื ืกื•ืช ืขื•ื“ ืคืจื•ืžืคื˜ื™ื ื•ืขื•ื“ Refactor-ื™ื ืขื“ ืฉื ื’ื™ืข ืœืื•ืชื• ืงื•ื“ ืฉื›ื™ืฃ ืœืขื‘ื•ื“ ืขืœื™ื•. (ื .ื‘. ืื•ืชื• ืจืขื™ื•ืŸ ื ื›ื•ืŸ ื’ื ืžื—ื•ืฅ ืœืขื•ืœื ื”ืงื•ื“ - ืื ืฉื™ื ืฉืžื ื•ืกื™ื ื‘ื—ื™ืคื•ืฉ ืขื‘ื•ื“ื” ื™ื•ื“ืขื™ื ืžืชื™ ื—ื™ืคื•ืฉ ืขื‘ื•ื“ื” "ืœื ืžืจื’ื™ืฉ ื ื›ื•ืŸ" ื•ืฆืจื™ืš ืœืฉื ื•ืช ืžืฉื”ื•; ืื ืฉื™ื ืฉืžื ื•ืกื™ื ื‘ืคืชื™ื—ืช ืขืกืงื™ื ื™ื•ื“ืขื™ื ืžืชื™ ืขืกืง "ืœื ืžืจื’ื™ืฉ ื ื›ื•ืŸ" ื•ืฆืจื™ืš ืœืฉื ื•ืช ื›ื™ื•ื•ืŸ; ืื ืฉื™ื ืฉืžื ื•ืกื™ื ื‘ืฉื™ื•ื•ืง ื™ื“ืขื• ืœื”ื’ื™ื“ ืžืชื™ ืงืžืคื™ื™ืŸ ืฉื™ื•ื•ืงื™ ืœื ืขื•ื‘ื“ ื•ืฆืจื™ืš ืœืฉื ื•ืช. ื‘ื›ืœ ื”ืžืงืจื™ื ืื ื—ื ื• ืžื“ื‘ืจื™ื ืขืœ ืชื”ืœื™ื›ื™ื ืฉื“ื•ืจืฉื™ื ื”ืชืžื“ื” ื‘ื›ื™ื•ื•ืŸ ื”ื ื›ื•ืŸ. ื›ืฉืฆืจื™ืš ืœืฉื ื•ืช ื›ื™ื•ื•ืŸ ืื ื—ื ื• ืžืจื•ื•ื™ื—ื™ื ื›ื›ืœ ืฉืžืฉื ื™ื ื›ื™ื•ื•ืŸ ื™ื•ืชืจ ืžื•ืงื“ื, ื•ื›ืฉืฆืจื™ืš ืœื”ืชืžื™ื“ ืื ื—ื ื• ืžืจื•ื•ื™ื—ื™ื ื›ื›ืœ ืฉื ืชืžื™ื“ ืขื“ ืœื”ืฉื’ืช ื”ืชื•ืฆืื”).

ToCode
1 419
ืชืฉื•ืžืช ืœื‘ - ื”ืžื™ื•ืžื ื•ืช ืฉืœ ื”ืขืฉื•ืจ ื”ื‘ื ื—ื‘ืจื” ื ืชื ื” ืœ AI ืœื›ืชื•ื‘ ืคื™ืฆ'ืจ ืฉืžื•ื—ืง ืจื•ื•ื—ื™ื ืžื”ืชื—ืœื” ืื• ืกื•ืฃ ืฉืœ ืฉื ืœืคื ื™ ืฉืžื™ืจื”. ื” AI ื›ืชื‘ ืืช ื”ืงื•ื“ ื•ื’ื ื›ืชื‘ ืœื• ืืช ื”ื‘ื“ื™ืงื” ื”ื‘ืื”:
test 'Person name with only spaces is trimmed to empty' do
  b = Person.new(name: '   ')
  b.save
  assert_equal('', b.name)
end
ื”ื‘ื“ื™ืงื” ืขื‘ืจื” ื•ืื ื™ ืงื™ื‘ืœืชื™ ืืช ื” PR. ื”ื‘ืขื™ื” ื”ื™ื—ื™ื“ื”? ื‘ืžืขืจื›ืช ื™ืฉ ื•ื•ืœื™ื“ืฆื™ื” ืฉืžื•ื•ื“ืืช ืฉ name ืœื ื™ื›ื•ืœ ืœื”ื™ื•ืช ืจื™ืง. ื‘ืงืจื™ืื” ืฉื ื™ื” ื‘ืจื•ืจ ืžื” ืงื•ืจื” ืคื” - ืคืงื•ื“ืช save ืฉืœ ืจื™ื™ืœืก ืžื—ื–ื™ืจื” ืขืจืš ื‘ื•ืœื™ืื ื™ ืื ื”ืฉืžื™ืจื” ื”ืฆืœื™ื—ื” ืื• ื ื›ืฉืœื”. ืืฃ ืื—ื“ ืœื ืžืกืชื›ืœ ืขืœ ืขืจืš ื–ื” ื•ื‘ืขืฆื ื” AI ื”ืคืขื™ืœ save ืจืง ื‘ืฉื‘ื™ืœ ืœื”ื˜ืจื™ื’ ืืช ื”ืงื•ื“ ืฉืœื• ืฉืžื•ื—ืง ืจื•ื•ื—ื™ื ื•ืื– ื”ื•ื ืžื•ื•ื“ื ืฉื”ืจื•ื•ื— ื ืžื—ืง. ืื‘ืœ ืขื›ืฉื™ื• ื”ืฉืืจื ื• ื‘ืงื•ื“ ืžื•ืงืฉ. ืื ื‘ืขืชื™ื“ AI ืื• ื‘ืŸ ืื“ื ื™ื™ืชืงืœ ื‘ื‘ื“ื™ืงื” ื”ื–ืืช ื”ื ืขืœื•ืœื™ื ืœื—ืฉื•ื‘ ืฉื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ืื•ื‘ื™ืงื˜ื™ Person ืขื ืฉืžื•ืช ืจื™ืงื™ื. ื™ืฉ ืœื ืžืขื˜ ืžืคืชื—ื™ AI ืฉื™ืชื ื• ืœ AI ืœืกื“ืจ ืืช ื–ื”. ืื ื™ ืžื•ื“ื” ืฉืื ื™ ืœื ืื—ื“ ืžื”ื ื•ื‘ืžืงืจื™ื ื›ืืœื” ืื ื™ ื ื›ื ืก ืœืงื•ื“ ื•ืžืชืงืŸ ื™ื“ื ื™ืช ืืช ื”ืฉื•ืจื” ื”ืืžืฆืขื™ืช:
test 'Person name with only spaces is trimmed to empty' do
  b = Person.new(name: '   ')
  b.valid? # trigger validation to trim b.name
  assert_equal('', b.name)
end
ื‘ื›ืœ ืžืงืจื” ื‘ืขื™ื ื™ื™ ื–ื” ื”ื™ื•ืคื™ ื‘ืคื™ืชื•ื— ื‘ืขื–ืจืช AI - ื›ืฉื“ื‘ืจื™ื ืขื•ื‘ื“ื™ื ืื ื™ ื™ื›ื•ืœ ืœื”ืชืžืงื“ ื‘ืื™ืš ืœืฉืžื•ืจ ืขืœ ื”ืงื•ื“ ื ืงื™ ื›ื™ ืืช ืขื‘ื•ื“ืช ื”ื”ืงืœื“ื” ืขื•ืฉื” ื” AI.

ToCode - Telegram kanali @tocodeil statistikasi va tahlili