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
ืกืš ื”ื›ืœ ื›ืœ ื”ื›ื‘ื•ื“ ืœื’ืืžืจื•ื“ ืขืœ ื”ืฉื™ืชื•ืฃ ื•ื”ืคืชื™ื—ื•ืช. ืžืขื‘ืจ ืœืงื•ื“ ืคืชื•ื— ืคื•ืชื— ื”ื–ื“ืžื ื•ื™ื•ืช ืœืงื”ื™ืœื” ืœื’ื“ื•ืœ ื•ืœืžืคืชื—ื™ื ืื—ืจื™ื ืœืœืžื•ื“ ื•ื‘ืžื™ื•ื—ื“ ื›ืฉืžื“ื•ื‘ืจ ืขืœ ืžืขืจื›ืช ืคืจื•ื“ืงืฉืŸ ืืžื™ืชื™ืช. ื–ื” ื”ืงื•ื“ ื‘ื’ื™ื˜ื”ืื‘ ืฉืชื•ื›ืœื• ื’ื ืœื”ื ื•ืช ื•ืœืœืžื•ื“: https://github.com/antiwork/gumroad

ToCode
1 417
ืฉืœื•ืฉื” ื“ื‘ืจื™ื ืฉืœืžื“ืชื™ ืžื”ืงื•ื“ ืฉืœ Gumroad ืื– Gumroad ืขื‘ืจื• ืœืงื•ื“ ืคืชื•ื— ื•ื–ื• ื”ื–ื“ืžื ื•ืช ืžืฆื•ื™ื ืช ืœืœืžื•ื“ ืขืœ ืžื‘ื ื” ืคืจื•ื™ืงื˜ ืจื™ื™ืœืก ื’ื“ื•ืœ ืฉืœ ืžืขืจื›ืช ืืžื™ืชื™ืช. ืื ื™ ื‘ื˜ื•ื— ืฉื‘ื™ืžื™ื ื”ืงืจื•ื‘ื™ื ืื‘ืœื” ื™ื•ืชืจ ื–ืžืŸ ืขื ื”ืจื™ืคื• ืฉืœื”ื ืื‘ืœ ื”ื ื” ืฉืœื•ืฉื” ื“ื‘ืจื™ื ืžืจื›ื–ื™ื™ื ืฉืงื•ืคืฆื™ื ืœืขื™ืŸ: ืžื•ื“ืœื™ื ืฉื˜ื•ื—ื™ื, ืงื•ื ืกืจื ื™ื ืžืงื•ื ื ื™ื ื™ืฉ ื”ืžื•ืŸ ืžื•ื“ืœื™ื ื‘ื’ืืžืจื•ื“ ื•ืœืžืจื•ืช ื–ืืช ื›ื•ืœื ื‘ืื•ืชื” ืชื™ืงื™ื”. ืžื•ื“ืœ ืžื™ื™ืฆื’ ื˜ื‘ืœื” ื‘ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ื•ืฉืžื™ืจืช ื›ืœ ื”ืžื•ื“ืœื™ื ื‘ืื•ืชื” ืชื™ืงื™ื” ืžืกื“ืจืช ืืช ืชื™ืงื™ื™ืช models ื‘ืฆื•ืจื” ืžืงื‘ื™ืœื” ืœืกื›ื™ืžื” ื•ื›ืš ืงืœ ืœืžืฆื•ื ื“ื‘ืจื™ื. ืžืฆื“ ืฉื ื™ ืžื‘ื ื” ืชื™ืงื™ื•ืช ื‘ืžืขืจื›ืช ืงื‘ืฆื™ื ื›ืŸ ืขื•ื–ืจ ืœื ื• ืœื”ืชืžืฆื ืื– ืืช ื”ืœื•ื’ื™ืงื” ื”ื ื›ืชื‘ื• ื‘ืงื‘ืฆื™ concerns ืฉืžืกื•ื“ืจื™ื ื‘ืชื™ืงื™ื•ืช. ืื™ืŸ ืœื”ื ื‘ืขื™ื” ืขื Concern-ื™ื ืฉื ื˜ืขื ื™ื ืจืง ืžืžื•ื“ืœ ืื—ื“ ืœืžืฉืœ ื”ืžื•ื“ื•ืœ Follower::AudienceMember ืฉื ื˜ืขืŸ ืจืง ืžืชื•ืš:
class Follower < ApplicationRecord
  include ExternalId
  include TimestampScopes
  include Follower::From
  include Deletable
  include ConfirmedFollowerEvent::FollowerCallbacks
  include Follower::AudienceMember
ื‘ื“ื™ืงื•ืช ื‘ื›ืœ ืžืงื•ื ืžื‘ื“ื™ืงื” ืžื“ื’ืžื™ืช ื›ืœ ืžื•ื“ืœ ืฉื ื›ื ืกืชื™ ืืœื™ื• ื”ื›ื™ืœ ืงื•ื“ ื‘ื“ื™ืงื”, ืœื“ื•ื’ืžื”:
* frozen_string_literal: true *

require "spec_helper"

RSpec.describe Community do
  subject(:community) { build(:community) }

  describe "associations" do
    it { is_expected.to belong_to(:seller).class_name("User") }
    it { is_expected.to belong_to(:resource) }
    it { is_expected.to have_many(:community_chat_messages).dependent(:destroy) }
    it { is_expected.to have_many(:last_read_community_chat_messages).dependent(:destroy) }
    it { is_expected.to have_many(:community_chat_recaps).dependent(:destroy) }
  end

  describe "validations" do
    it { is_expected.to validate_uniqueness_of(:seller_id).scoped_to([:resource_id, :resource_type, :deleted_at]) }
  end

  describe "#name" do
    it "returns the resource name" do
      community = build(:community, resource: create(:product, name: "Test product"))

      expect(community.name).to eq("Test product")
    end
  end

  describe "#thumbnail_url" do
    it "returns the resource thumbnail url for email" do
      community = build(:community, resource: create(:product))

      expect(community.thumbnail_url).to eq(ActionController::Base.helpers.asset_url("native_types/thumbnails/digital.png"))
    end
  end
end
ืื ื™ ืžื•ื“ื” ืฉื‘ื—ืœืง ืžื”ืžืงื•ืžื•ืช ื”ื‘ื“ื™ืงื” ื“ื•ืจืฉืช ืงืฆืช ืžืืžืฅ ื‘ืงืจื™ืื”, ืœื“ื•ื’ืžื” ื”ื‘ื“ื™ืงื” ื”ื‘ืื”:
it "returns affiliates sorted by # of products" do
  order = [affiliate_user_1, affiliate_user_3, affiliate_user_2]

  expect(seller.direct_affiliates.sorted_by(key: "products", direction: "asc")).to eq(order)
  expect(seller.direct_affiliates.sorted_by(key: "products", direction: "desc")).to eq(order.reverse)
end
ืžื—ื™ื™ื‘ืช ืื•ืชื™ ืœื’ืœื•ืœ ืœืชื—ื™ืœืช ื”ืงื•ื‘ืฅ ื›ื“ื™ ืœื”ื‘ื™ืŸ ืื™ื–ื” ืžืฉืชืžืฉ ื ื•ืฆืจ ืขื ื›ืžื” ืžื•ืฆืจื™ื ื•ืื™ืฉื™ืช ื”ื™ื™ืชื™ ืžืขื“ื™ืฃ ืœืจืื•ืช ืืช ื” create ืฆืžื•ื“ ืœืงื•ื“ ื”ื‘ื“ื™ืงื”, ืื‘ืœ ื‘ื•ืื• - ื›ืžื•ืช ื”ื‘ื“ื™ืงื•ืช ื•ื”ืžื’ื•ื•ืŸ ืžืจืฉื™ืžื™ื. ื™ืฉ ืœื”ื ื‘ื“ื™ืงื•ืช ืžื•ื“ืœื™ื, ื‘ื“ื™ืงื•ืช ืœืงื•ื ื˜ืจื•ืœืจื™ื ื•ื‘ื“ื™ืงื•ืช ืžืขืจื›ืช. ืคืจื•ื ื˜ืื ื“ ื ืจืื” ืžืืชื’ืจ ื’ืืžืจื•ื“ ืžืฉืชืžืฉื™ื ื‘ืจื™ื™ืœืก ืขื‘ื•ืจ ื”ืฉืจืช ื•ืจื™ืืงื˜ ืœืฆื“ ืœืงื•ื—. ืื ื™ ืœื ืžืฆืืชื™ ื‘ื“ื™ืงื•ืช ืœืงื•ืžืคื•ื ื ื˜ื•ืช ื‘ืฆื“ ื”ืคืจื•ื ื˜ืื ื“ ื•ื’ื ื”ืงื•ื“ ืขืฆืžื• ื”ื™ื” ื ืจืื” ืœื™ ื”ืจื‘ื” ืคื—ื•ืช ืžืกื•ื“ืจ: ืงื‘ืฆื™ื ืฉืœ ืžืื•ืช ื•ืืœืคื™ ืฉื•ืจื•ืช, ืคื•ื ืงืฆื™ื•ืช ืฉืžื•ื’ื“ืจื•ืช ื‘ืชื•ืš ื”ืงื•ืžืคื•ื ื ื˜ื•ืช, ืงื•ื“ ื•ืœื•ื’ื™ืงื” ื‘ืชื•ืš JSX, ื•ื‘ืื•ืคืŸ ื›ืœืœื™ ื”ืจื’ืฉื” ืฉืœ ืคื—ื•ืช ืชืฉื•ืžืช ืœื‘. ื“ื•ื’ืžื” ืงื˜ื ื” ื”ืืคืงื˜ ื”ื‘ื ืฉื ื•ืขื“ ืœื”ื’ื“ื™ืœ ื’ื•ื‘ื” ืฉืœ textarea ื›ืฉื”ืชื•ื›ืŸ ืžืฉืชื ื”:
  React.useEffect(() => {
    if (!ref.current) return;

    ref.current.style.height = "inherit";
    ref.current.style.height = \${ref.current.scrollHeight}px\;
  }, [props.value]);
ืฉื”ื™ื” ื ื›ื•ืŸ ื™ื•ืชืจ ืœื›ืชื•ื‘ ืื•ืชื• ื‘ืชื•ืจ layout effect ืื• ื”ื›ื™ ื˜ื•ื‘ ืœื•ื•ืชืจ ืขืœื™ื• ืœื’ืžืจื™ ื•ืœื”ืฉืชืžืฉ ื‘ CSS. ืื• ื‘ืžื‘ื˜ ื™ื•ืชืจ ื’ื‘ื•ื” ื”ื‘ื—ื™ืจื” ืœืฉืžื•ืจ ืื•ื‘ื™ืงื˜ ื‘ืชื•ืš ืงื•ื ื˜ืงืกื˜ ืœืžืฉืœ ื‘ DomainSettings.ts ืฉืœื”ื:
type DomainSettings = {
  scheme: string;
  appDomain: string;
  rootDomain: string;
  shortDomain: string;
  discoverDomain: string;
  thirdPartyAnalyticsDomain: string;
};

const Context = React.createContext<DomainSettings | null>(null);
ืฉืื•ืžืจืช ืฉื›ืœ ืคืขื ืฉืื™ื–ืฉื”ื• ืžืคืชื— ื‘ืื•ื‘ื™ืงื˜ ื™ืฉืชื ื” ื›ืœ ื”ืงื•ืžืคื•ื ื ื˜ื•ืช ืฉืžืงืฉื™ื‘ื•ืช ื’ื ืœืžืคืชื—ื•ืช ืื—ืจื™ื ื™ืชืจื ื“ืจื• ืžื—ื“ืฉ, ืžื” ืฉืคื•ื’ืข ื‘ื‘ื™ืฆื•ืขื™ื.

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

ToCode
1 417
2. ืงืœื•ื“ ื™ื›ื•ืœ ืœื”ื—ืœื™ื˜ ืœื”ืจื™ืฅ ืืช ื”ื›ืœื™ ืžืกืคืจ ืคืขืžื™ื. ื”ืชื•ืฆืื” ืื™ื ื” ืžื•ืคืขืœืช ื‘ื˜ืจื ื–ืืงืฆื™ื” ื•ื‘ื™ื˜ื•ืœ ืจื™ืฆื” ื‘ืืžืฆืข ืคืฉื•ื˜ ื’ื•ืจื ืœื”ืคืกืงืช ื”ืฉื™ืžื•ืฉ ื‘ื›ืœื™, ืžื” ืฉืขืœื•ืœ ืœื”ื•ื‘ื™ืœ ืœื‘ืขื™ื•ืช ืงื•ื ืกื™ืกื˜ื ื˜ื™ื•ืช ืื ื‘ืืžืช ื ื™ืชืŸ ืœื• ืœืขื‘ื•ื“ ืขืœ ืžื™ื“ืข ืืžื™ืชื™. ื ืกื• ืœื’ืจื•ื ืœืงืœื•ื“ ืœื™ืฆื•ืจ 10 ืงื‘ืฆื™ื ื•ื”ืคืกื™ืงื• ืื•ืชื• ื‘ืืžืฆืข ื›ื“ื™ ืœืจืื•ืช ืฉื ืชืงืขืชื ืขื ื—ืœืง ืžื”ืงื‘ืฆื™ื. 3. ื‘ืืชืจ mcp.so ืชื•ื›ืœื• ืœืžืฆื•ื ื”ืžื•ืŸ ืฉืจืชื™ MCP ืฉืื ืฉื™ื ืื—ืจื™ื ื›ืชื‘ื•. ืžื•ืžืœืฅ ืœืงืจื•ื ืืช ื”ืงื•ื“ ืœืคื ื™ ืฉืžืชืงื™ื ื™ื.

ToCode
1 417
ื›ืžื” ืžื™ืœื™ื ื•ื“ื•ื’ืžื” ืขืœ MCP ืคืจื•ื˜ื•ืงื•ืœ MCP ื”ื•ื ื”ื“ืจืš ืฉืœื ื• ืœื”ื•ืกื™ืฃ ื™ื›ื•ืœื•ืช ืœืกื•ื›ื ื™ ื” AI ืฉืื ื—ื ื• ืžืจื™ืฆื™ื ืขืœ ื”ืžื—ืฉื‘. ื›ืชื‘ืชื™ ืœืคื ื™ ื›ืžื” ื™ืžื™ื ืขืœ ื”ืจืขื™ื•ืŸ ืฉืœ ืฉื™ืžื•ืฉ ื‘ื›ืœื™ื ืžืชื•ืš ืžื•ื“ืœ ืฉืคื”. ืœืžื“ื ื• ืฉื ืฉืžื•ื“ืœ ืฉืคื” ื‘ืกืš ื”ื›ืœ ืงื•ืจื ื•ื›ื•ืชื‘ ื˜ืงืกื˜, ื•ืจื•ื‘ ื›ืœื™ ื” AI ืฉื™ืฉ ืœื ื• ืžืฉืœื‘ื™ื ืžื•ื“ืœ ืฉืคื” ืขื ืงื•ื“ ืฉืขื•ื˜ืฃ ืืช ืื•ืชื•, ืžืฉืคืจ ืงืฆืช ืืช ื”ืงืœื˜ ืœืคื ื™ ืฉื”ื•ื ื ืฉืœื— ืœืžื•ื“ืœ ื”ืฉืคื” ื•ืขื•ืฉื” ืžืฉื”ื• ืขื ื”ืคืœื˜ ืฉืœ ืžื•ื“ืœ ื”ืฉืคื”. ื‘ื“ื•ื’ืžืช ื”ื›ืœื™ื ืจืื™ื ื• ืฉืื ื—ื ื• ื™ื›ื•ืœื™ื ืœืฉื›ื ืข ืืช ืžื•ื“ืœ ื”ืฉืคื” ืœืฉืชื•ืœ "ืจืžื–ื™ื" ื‘ืคืœื˜ ืฉืœื•, ื•ืื– ื”ืกื•ื›ืŸ ืฉืขื•ื˜ืฃ ืืช ืžื•ื“ืœ ื”ืฉืคื” ื™ื›ื•ืœ ืœืชืคื•ืก ืจืžื–ื™ื ืืœื” ื•ืœื”ืฉืชืžืฉ ื‘ื”ื ื›ื“ื™ ืœื”ืจื™ืฅ ืงื•ื“. ืคืจื•ื˜ื•ืงื•ืœ MCP ื”ื•ื ื‘ืกืš ื”ื›ืœ ื“ืจืš ืคื•ืจืžืœื™ืช ื‘ื” ืกื•ื›ืŸ ืžื‘ืงืฉ ืžืžื•ื“ืœ ืฉืคื” ืœืฉืชื•ืœ ืืช ืื•ืชื ืจืžื–ื™ื ื•ืžืคืขื ื— ืืช ื”ืคืœื˜ ืฉืœ ืžื•ื“ืœ ื”ืฉืคื”. ื‘ืคืจื•ื˜ื•ืงื•ืœ MCP ืื ื—ื ื• ืžื’ื“ื™ืจื™ื ื™ื›ื•ืœื•ืช ืœืคื™ ืงื˜ื’ื•ืจื™ื•ืช: 1. ื›ืœื™ื - ื™ื›ื•ืœื•ืช ืฉื’ื•ืจืžื•ืช ืœืฉื™ื ื•ื™ ื›ืœืฉื”ื• ื‘ืขื•ืœื 2. ืžืฉืื‘ื™ื - ื™ื›ื•ืœื•ืช ืฉืงืฉื•ืจื•ืช ืœืžืฉื™ื›ืช ืžื™ื“ืข ืœืงืจื™ืื” ื‘ืœื‘ื“ 3. ืคืจื•ืžืคื˜ื™ื - ื™ื›ื•ืœื•ืช ืฉืงืฉื•ืจื•ืช ืœืงื™ืฆื•ืจื™ ื“ืจืš ื‘ UI ืœื›ืŸ ืื ืื ื™ ืจื•ืฆื” ืฉืืคืœื™ืงืฆื™ื™ืช Claude Desktop ืฉืจืฆื” ืืฆืœื™ ืขืœ ื”ืžื—ืฉื‘ ืชื•ื›ืœ ืœื™ืฆื•ืจ ืงื‘ืฆื™ื ืขืœ ื”ื“ื™ืกืง ืื ื™ ื™ื›ื•ืœ ืœื™ืฆื•ืจ "ื›ืœื™" ืฉื™ื•ืฆืจ ืงื‘ืฆื™ื. ืื ืื ื™ ืจื•ืฆื” ืฉืžืชื•ืš ืฆ'ื˜ ืขื ื”ืืคืœื™ืงืฆื™ื” ื”ื™ื ืชื•ื›ืœ ืœืงืจื•ื ืชื•ื›ืŸ ืฉืœ ืงื‘ืฆื™ื ืžืชื™ืงื™ื™ื” ืžืกื•ื™ืžืช ืื ื™ ืžื•ืกื™ืฃ ืืช ื”ืงื‘ืฆื™ื ื‘ืชื•ืจ ืžืฉืื‘ ืœืงืจื™ืื”. ืืคืฉืจ ืœื—ืฉื•ื‘ ืขืœ "ืฉืจืช MCP" ื‘ืชื•ืจ ืชื•ืกืฃ ืœืืคืœื™ืงืฆื™ื™ืช ืฉื™ื—ื” ืขื ืžื•ื“ืœ ืฉืคื”, ื•ืžื” ืฉื™ืคื” ื‘ื• ืฉื”ื•ื ืžืชื—ื‘ืจ ื‘ืื•ืชื• ืื•ืคืŸ ืœื”ืจื‘ื” ืžืื•ื“ ืืคืœื™ืงืฆื™ื•ืช ืฉื™ื—ื”, ื‘ื“ื•ื’ืžื” ืฉืœื ื• ื’ื Claude Desktop ืชื•ืžืš ื‘ MCP ืื‘ืœ ื’ื Cursor ื•ืœื›ืŸ ื‘ื“ื™ื•ืง ื‘ืื•ืชื• ืคืจื•ื˜ื•ืงื•ืœ ืื ื™ ื™ื›ื•ืœ ืœืชืช ืœ Cursor ืื•ืคืฆื™ื” ืœื”ืจื™ืฅ ืงื•ื“ ืื•ื˜ื•ืžื˜ื™ืช ืื• ืœืงืจื•ื ืžื™ื“ืข ืžื‘ืกื™ืก ื”ื ืชื•ื ื™ื. ื“ื•ื’ืžื”: ืฉืจืช MCP ืœื™ืฆื™ืจืช ืงื‘ืฆื™ื ื‘ืฉื‘ื™ืœ ื”ื“ื•ื’ืžื” ื›ื“ืื™ ืœื”ืชืงื™ืŸ ืืช ืืคืœื™ืงืฆื™ื™ืช Claude Desktop (ื–ื” ื‘ื—ื™ื ื ื•ืขื•ื‘ื“ ื’ื ืขื ื”ืชื•ื›ื ื™ืช ื”ื—ื™ื ืžื™ืช ืฉืœ ืงืœื•ื“). ืœืื—ืจ ืžื›ืŸ ืžืชื•ืš ืกื‘ื™ื‘ื” ื•ื™ืจื˜ื•ืืœื™ืช ื—ื“ืฉื” ืฉืœ ืคื™ื™ืชื•ืŸ ืื ื™ ื™ื•ืฆืจ ืืช ื”ืงื•ื‘ืฅ ื”ื‘ื:
* server.py *
import os
from mcp.server.fastmcp import FastMCP

HOME = os.environ["HOME"]

* Create an MCP server *
mcp = FastMCP("Demo")


* Add an addition tool *
@mcp.tool()
def create_empty_file(name: str):
    """creates a new empty file in the home directory"""
    try:
        filename = f"{HOME}/{name}"
        print(f"Trying to create file {filename}")

        with open(filename, 'a', encoding='utf8'):
            pass
    except Exception:
        raise Exception(f"Failed to create file {filename}")

@mcp.prompt()
def review_code(code: str) -> str:
        return f"Please review this code:\n\n{code}"

ื”ืงื•ื‘ืฅ ืžื›ื™ืœ ื›ืœื™ ืื—ื“ ื• prompt ืื—ื“. ื”ื›ืœื™ ื ืงืจื create_empty_file. ื™ืฉ ืœื• ืคืจืžื˜ืจ ื‘ืฉื name ื•ื”ื•ื ืคืฉื•ื˜ ื™ื•ืฆืจ ืงื•ื‘ืฅ ืจื™ืง ื—ื“ืฉ ื‘ืชื™ืงื™ื™ืช ื”ื‘ื™ืช ื‘ืฉื ืฉื‘ื—ืจืชื™. ืžื—ืจื•ื–ืช ื”ืชื™ืขื•ื“ ืฉืœ ื”ืคื•ื ืงืฆื™ื” ื ืฉืžืจืช ื‘ืชื•ืจ ื”ืชื™ืขื•ื“ ืฉืœ ื”ื›ืœื™. ื‘ื ื•ืกืฃ ื”ื›ืœื™ ืžื›ื™ืœ ืคืจื•ืžืคื˜ ื‘ืฉื review_code ืฉื›ื•ืœืœ ืคืจืžื˜ืจ ืื—ื“ ื‘ืฉื code ื•ืžื—ื–ื™ืจ ืคืจื•ืžืคื˜ ืกื˜ื ื“ืจื˜ื™ ืฉืขื•ื˜ืฃ ืืช ื”ืงื•ื“ ืฉื”ืขื‘ืจืชื™. ืฉื™ืžื•ืฉ ื‘ืฉืจืช ื”ื—ื“ืฉ ื‘ืฉื‘ื™ืœ ืœื”ืชืงื™ืŸ ืืช ื”ืฉืจืช ื”ื—ื“ืฉ ื‘ืงืœื•ื“ ืื ื™ ืžืจื™ืฅ ืžืฉื•ืจืช ื”ืคืงื•ื“ื”:
pip install "mcp[cli]"
ื•ืžืงื‘ืœ ืืช ื”ื›ืœื™ mcp ื‘ืชื•ืš ืกื‘ื™ื‘ืช ื”ืคื™ื™ืชื•ืŸ ื”ื•ื™ืจื˜ื•ืืœื™ืช ืฉืœื™. ืขื›ืฉื™ื• ืื ื™ ืžืคืขื™ืœ:
mcp install server.py
ื‘ืฉื‘ื™ืœ ืœื—ื‘ืจ ืืช ื”ืฉืจืช ืฉืœื™ ืœืืคืœื™ืงืฆื™ื™ืช Claude Desktop. (ื‘ืืคืœื™ืงืฆื™ื•ืช ืื—ืจื•ืช ื”ื”ืชืงื ื” ืชื”ื™ื” ืฉื•ื ื” ื›ืœ ืืคืœื™ืงืฆื™ื” ืขื ื”ืฉื™ื˜ื” ืฉืœื”). ืื—ืจื™ ื”ื”ืชืงื ื” ืžืคืขื™ืœื™ื ืžื—ื“ืฉ ืืช ืงืœื•ื“ ื•ืืคืฉืจ ืœื‘ืงืฉ ืžืžื ื• ื‘ืฆ'ืื˜ ืœื™ืฆื•ืจ ืงื‘ืฆื™ื. ืงืœื•ื“ ื™ื–ื”ื” ืฉื™ืฉ ืœื• Tool ืฉื™ื•ื“ืข ืœื™ืฆื•ืจ ืงื‘ืฆื™ื ื•ื™ืฆื™ืข ืœื”ืคืขื™ืœ ืืช ื”ื›ืœื™ ื•ืื—ืจื™ ืื™ืฉื•ืจ ืฉืœื›ื ื‘ืชื•ืš ื”ืฆ'ืื˜ ื”ื›ืœื™ ืžื•ืคืขืœ ื•ื”ืงื•ื‘ืฅ ืื• ื”ืงื‘ืฆื™ื ื ื•ืฆืจื™ื. ืžื” ืœื’ื‘ื™ ื”ืคืจื•ืžืคื˜? ืื•ืชื• ืื ื—ื ื• ืžืคืขื™ืœื™ื ื“ืจืš ื”ืชืคืจื™ื˜ื™ื. ื‘ืืคืœื™ืงืฆื™ื™ืช Claude Desktop ื‘ื“ื™ื•ืง ืžืชื—ืช ืœืฉื•ืจืช ื”ืฆ'ืื˜ ื™ืฉ ืื™ื™ืงื•ืŸ ืฉืœ ืฉื ื™ ื“ื‘ืจื™ื ืžืชื—ื‘ืจื™ื, ืœื•ื—ืฆื™ื ืขืœื™ื• ื•ืื– ื‘ื•ื—ืจื™ื ื‘ Choose an integration ืืช ื”ืคืจื•ืžืคื˜ ืฉื™ืฆืจื ื•. ื™ื•ืคื™ืข ืžืกืš ืงื•ืคืฅ ื‘ื• ื ืชื‘ืงืฉ ืœื”ืงืœื™ื“ ืขืจืš ืœืคืจืžื˜ืจ code (ื”ืคืจืžื˜ืจ ืฉื”ื’ื“ืจื ื• ืœืคื•ื ืงืฆื™ื”) ื•ืื—ืจื™ ืื™ืฉื•ืจ ื”ืžื—ืจื•ื–ืช ืฉื—ื–ืจื” ืžื”ืคื•ื ืงืฆื™ื” ื ืฉืœื—ืช ืœืžื•ื“ืœ ื”ืฉืคื” ื‘ืชื•ืจ ื”ืคืจื•ืžืคื˜. ืžื” ื”ืœืื” ื›ืžื” ื ื™ืกื•ื™ื™ื ืฉืื ื™ ืžืžืœื™ืฅ ื’ื ืœื›ื ืœืขืฉื•ืช ืขืœ ืžื•ื“ืœ ื”ืฉืคื” ื• MCP- 1. ืžื•ื“ืœ ื”ืฉืคื” ืžื—ืœื™ื˜ ืœืงืจื•ื ืœื›ืœื™ ื›ื™ ืชื™ืื•ืจ ื”ื›ืœื™ ื ืจืื” ืœื• ืžืชืื™ื ืœื‘ืงืฉื” ืฉืœื ื• ืœื ื‘ื’ืœืœ ืฉื”ื•ื ื™ื•ื“ืข ืžื” ื”ื›ืœื™ ืขื•ืฉื”. ื ืกื• ืœืฉื ื•ืช ืืช ืฉื ื”ืคื•ื ืงืฆื™ื” ื•ืชื™ืื•ืจ ื”ื›ืœื™ ื›ื“ื™ ืœื”ื‘ื™ืŸ ืžื” ืขื•ื‘ื“ ื•ืžื” ืœื ืขื•ื‘ื“, ื•ืื™ืš ืืคืฉืจ ืœื‘ืœื‘ืœ ืงืฆืช ืืช ืงืœื•ื“. ืื—ืจื™ ื–ื” ื ืกื• ืœื”ื•ืกื™ืฃ ืขื•ื“ ืคื•ื ืงืฆื™ื•ืช ืขื ืฉืžื•ืช ื“ื•ืžื™ื ืื• ืฉื•ื ื™ื ื•ืชืจืื• ืื™ืš ืงืœื•ื“ ืžืชืžื•ื“ื“ ืขื ืงื•ื ืคืœื™ืงื˜ื™ื. ืฉื™ืžื• ืœื‘ ื’ื ืฉืžืกืคื™ืง ืœืฉื ื•ืช ืืช ืงื•ื‘ืฅ ื” server.py ื•ืœื”ืคืขื™ืœ ืžื—ื“ืฉ ืืช ืงืœื•ื“ ื›ื“ื™ ืฉื”ื•ื ื™ืฉืชืžืฉ ื‘ื›ืœื™ื ื”ื—ื“ืฉื™ื, ื›ืœื•ืžืจ ืžื™ ืฉืžืจื™ืฅ ืืช ื”ืฉืจืช ื–ื” ืืคืœื™ืงืฆื™ื™ืช ืงืœื•ื“ ืขืฆืžื”.

ToCode
1 417
ืชื–ื›ื•ืจืช: ืžื” ืืชื” ืื•ื”ื‘ ื‘ืขืฆื ื‘ืคื™ืชื•ื— ืชื•ื›ื ื” ืืœ ืžื•ืœ ื’ืœื™ ื” AI ืื ื™ ืžืจื’ื™ืฉ ืฉื—ื•ื‘ื” ืœื”ื–ื›ื™ืจ: 1. ืื ื™ ืื•ื”ื‘ ืœืงืจื•ื ืงื•ื“ ื•ืœื”ื‘ื™ืŸ ืื•ืชื•. 2. ืื ื™ ืื•ื”ื‘ ืœื”ื‘ื™ืŸ ืœืžื” ืžืขืจื›ืช ืžืชื ื”ื’ืช ื›ืžื• ืฉื”ื™ื ืžืชื ื”ื’ืช, ื•ืื™ืš ื”ื™ื ืชื™ืฉื‘ืจ. ื–ืืช ื”ืกื™ื‘ื” ืฉื”ื’ืขืชื™ ืœืคื™ืชื•ื— ืชื•ื›ื ื”. ื–ื” ืžื” ืฉืžืฉืื™ืจ ืื•ืชื™ ื›ืืŸ. 3. ืื ื™ ืื•ื”ื‘ ืœืคืชื•ืจ ื‘ืขื™ื•ืช ืฉืงืฉื•ืจื•ืช ืœื™ื™ืฆื•ื’ ื™ื“ืข ื•ืœื”ื‘ื™ืŸ ืื™ืš ืœื™ื™ืฆื’ ืืช ื”ืžื™ื“ืข ืฉืœื™ ื‘ืฆื•ืจื” ืฉืชืืคืฉืจ ืœื™ ืœืขื ื•ืช ืžื”ืจ ืขืœ ืฉืืœื•ืช ืžืขื ื™ื™ื ื•ืช. 4. ืื ื™ ืื•ื”ื‘ ืœื—ืฉื•ื‘ ืื™ืš ื“ื‘ืจื™ื ื”ื•ืœื›ื™ื ืœื”ืฉืชื ื•ืช ื‘ืขืชื™ื“, ื•ืื™ืš ืœืืจื’ืŸ ืืช ื”ืžื™ื“ืข ื•ื”ืงื•ื“ ื›ื“ื™ ืฉื™ื”ื™ื” ืงืœ ืœื”ืชืื™ื ืืช ื”ืžืขืจื›ืช ืœืฉื™ื ื•ื™ื™ื ืขืชื™ื“ื™ื™ื. ืื ื›ืฉืืชื ืื•ืžืจื™ื ืฉืขื AI ืื ื™ ืื‘ื ื” ืžืขืจื›ื•ืช ืคื™ 10 ื™ื•ืชืจ ืžื”ืจ ืืชื ืžืชื›ื•ื•ื ื™ื ืฉื” AI ื™ื‘ื ื” ืžืขืจื›ืช ื‘ืœื™ ืฉืืฆื˜ืจืš ืœื—ืฉื•ื‘ ืขืœ ื›ืœ ื”ืžืฉืžืขื•ื™ื•ืช ืฉืœ ื›ืœ ืฉื•ืจืช ืงื•ื“ ืื ื™ ื—ื•ืฉืฉ ืฉื›ื•ืœื ื• ื”ื•ืœื›ื™ื ืœื”ืชืื›ื–ื‘. ื”ืžืฉื™ืžื” ืฉืœื ื• ื”ื™ื•ื ื”ื™ื ืœื”ื‘ื™ืŸ ืื™ื–ื” ื—ืœืงื™ื ื‘ืขื‘ื•ื“ื” ืฉืœื ื• ื” AI ื™ื›ื•ืœ ืœื™ื™ืขืœ, ื•ืื™ื–ื” ื—ืœืงื™ื ื–ื” ืจืง ื ืจืื” ื›ืื™ืœื• ื”ื•ื ืžื™ื™ืขืœ ืื‘ืœ ื‘ืขืฆื ื”ื•ื ืฉื•ืชืœ ื‘ืงื•ื“ ืžื•ืงืฉื™ื ืฉื™ื”ื™ื” ืœื ื• ืงืฉื” ืœื ื˜ืจืœ ื‘ืขืชื™ื“.

ToCode
1 417
ืžื™ ื–ื” ืื ื“ืจื™ื™? ื›ื›ืœ ืฉืื ื™ ืขื•ื‘ื“ ืขื ืงื•ืคื™ื™ืœื•ื˜ ืื ื™ ืžืงื‘ืœ ื”ืฉืœืžื•ืช ืžืขื ื™ื™ื ื•ืช: ืžืฉืชื ื” ืกื‘ื™ื‘ื” ืžืื•ืชื—ืœ ืœืชื™ืงื™ื™ืช ื‘ื™ืช ืฉืœ ืื™ื–ื” ืื ื“ืจื™ื™, ืžืคืชื— API ืžืื•ืชื—ืœ ืœืขืจืš ืœื ื—ื•ืงื™ ืื‘ืœ ืฉืžืชืื™ื ืœืคื•ืจืžื˜, ืฉื ืžืฉืชืžืฉ ื•ืกื™ืกืžื” ืžืงื‘ืœื™ื ื”ืฉืœืžื” ืื•ื˜ื•ืžื˜ื™ืช ืœ admin ื• admin. ื‘ืจื•ืจ ืื™ืš ื–ื” ืงื•ืจื” - ืžื•ื“ืœ ืฉืคื” ืœื ื™ื•ื“ืข ืœื”ื‘ื“ื™ืœ ื‘ื™ืŸ ืžื™ื“ืข ืื™ืฉื™ ืœืžื™ื“ืข ืฆื™ื‘ื•ืจื™, ื”ื•ื ืœื "ืžื‘ื™ืŸ" ืžื” ืžื•ืชืจ ื•ืžื” ืืกื•ืจ ืœื”ืฆื™ืข. ื‘ืจื•ืจ ืฉื”ื—ื‘ืจื•ืช ืฉืžืคืขื™ืœื•ืช ืืช ืžื•ื“ืœื™ ื”ืฉืคื” ืžืชืงื™ื ื•ืช ืขืœื™ื”ื ืžื ื’ื ื•ื ื™ ื”ื’ื ื” ื•ืฆื ื–ื•ืจื” ืื‘ืœ ืื™ ืืคืฉืจ ืœืชืคื•ืก ื”ื›ืœ. ื›ื“ืื™ ืœืฉื™ื ืœื‘: 1. ืขื•ืœื ื” AI ื”ื•ื ื—ื“ืฉ ื•ื‘ื›ืœ ืขื•ืœื ื—ื“ืฉ ื™ืฉ ืื™ื ืกื•ืฃ ื‘ืขื™ื•ืช ืื‘ื˜ื—ืช ืžื™ื“ืข. ื–ื” ืฉ Cursor ืฉืžื™ื ืžืฆื‘ "ืคืจื˜ื™ื•ืช" ืœื ืื•ืžืจ ืฉื”ืงื•ื“ ืฉืœื›ื ื ืฉืืจ ืขืœ ื”ืžื—ืฉื‘ ืฉืœื›ื (ื–ื” ื‘ืกืš ื”ื›ืœ ืื•ืžืจ ืฉืงืจืกืจ ืœื ืฉื•ืžืจื™ื ืืฆืœื ืืช ื”ืงื•ื“ ืฉืœื›ื). 2. ืงื•ื“ ืœื ืžืื•ื‘ื˜ื— ื ื›ืชื‘ ื•ื™ื™ื›ืชื‘ ื›ื›ืœ ืฉื ื™ืชืŸ ืœ AI ืœื›ืชื•ื‘ ื™ื•ืชืจ ืงื•ื“. ืื ื—ื ื• ืขื“ื™ื™ืŸ ืœื ื™ื•ื“ืขื™ื ืžื” ื™ื”ื™ื• ื”ื‘ืขื™ื•ืช ื”ืื•ืคื™ื™ื ื™ื•ืช ืžื‘ื—ื™ื ืช ืื‘ื˜ื—ื” ืœืงื•ื“ ืฉ AI ื›ื•ืชื‘. ื”ืขื•ืœื ื”ื–ื” ื“ื™ื ืžื™ ืžืื•ื“. 3. ืคืจื•ื˜ื•ืงื•ืœื™ื ืžืื•ื‘ื˜ื—ื™ื ืœืฉื™ืžื•ืฉ ื‘ื›ืœื™ื ืขื“ื™ื™ืŸ ืœื ืงื™ื™ืžื™ื. ืœ MCP ื™ืฉ ื‘ืขื™ื•ืช ื•ื›ื‘ืจ ืื ื—ื ื• ืจื•ืื™ื ืžืชืงืคื•ืช ืฉืžืชื‘ืกืกื•ืช ืขืœ ื”ืชืงื ืช ื›ืœื™ื ื–ื“ื•ื ื™ื™ื ื‘ IDE. ื‘ืžืขืจื›ื•ืช ืจื’ื™ืฉื•ืช ืขื“ื™ื™ืŸ ื›ื“ืื™ ืœื”ืฉืชืžืฉ ื‘ืžืžืฉืง ื” Chat ื•ืœื”ืงืคื™ื“ ืขืœ ื‘ืงืจื” ืขืœ ื”ืงื•ื“ ืฉืžื“ื‘ื™ืงื™ื ืืฆืœื• ื•ืžืขืชื™ืงื™ื ืžืžื ื•. ื‘ืงืฆื” ื”ืฉื ื™ ื‘ืคืจื•ื™ืงื˜ื™ ืฆื“ ื• POC-ื™ื ื›ืžื•ื‘ืŸ ืฉืื™ืŸ ื‘ืขื™ื” ืœื”ืฉืชื•ืœืœ ืขื ื›ืœื™ื ื›ื™ ืื™ืŸ ืžื” ืฉื™ื™ืฉื‘ืจ. ื›ืœ ืžื™ ืฉื‘ืืžืฆืข ืฆืจื™ืš ืœืงื‘ืœ ื”ื™ื•ื ื”ื—ืœื˜ื•ืช ืงืฉื•ืช ื•ืœืื–ืŸ ื‘ื™ืŸ ื”ืจืฆื•ืŸ ืœื”ืฉืชืžืฉ ื‘ื›ืœื™ ื”ืคื™ืชื•ื— ื”ื›ื™ ืžืชืงื“ืžื™ื ืœืฆื•ืจืš ื‘ืฉืžื™ืจื” ืขืœ ืกื˜ื ื“ืจื˜ื™ื ืฉืœ ืคื™ืชื•ื— ืžืื•ื‘ื˜ื—.

ToCode
1 417
import { useRouter } from 'next/navigation';
import { RefreshContext } from '@/lib/refresh-provider';

export default function AutoRefresh() {
  const router = useRouter();
  const addClients = use(RefreshContext)

  useEffect(() => {
    addClients(1);
    return () => addClients(-1);
  }, [router]);

  return null;
}

ืขื›ืฉื™ื• ืœื ืžืฉื ื” ื›ืžื” ืคืขืžื™ื ื ื•ืกื™ืฃ ืื•ืชื• ืœืขืžื•ื“ ื” interval ื™ืจื•ืฅ ืจืง ืคืขื ืื—ืช, ื•ื›ืฉืœื ื™ื”ื™ื• ื™ื•ืชืจ ืืœืžื ื˜ื™ Auto Refresh ืขืœ ื”ืขืžื•ื“ ื”ืจื™ืขื ื•ืŸ ื”ืื•ื˜ื•ืžื˜ื™ ื™ื™ืคืกืง.

ToCode
1 417
ืจื™ืขื ื•ืŸ ืื•ื˜ื•ืžื˜ื™ ืœืžื™ื“ืข ืฆื“ ืฉืจืช ื‘ next.js ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“ ืฉืจืช ื‘ node ื™ื›ื•ืœื•ืช ืœืขืฉื•ืช ื“ื‘ืจื™ื ืžื•ืคืœืื™ื, ืœืžืฉืœ ืœืงืจื•ื ืงื•ื‘ืฅ ืžืžืขืจื›ืช ื”ืงื‘ืฆื™ื ื•ืœื”ืฆื™ื’ ืื•ืชื• ื‘ืงืœื•ืช ืขืœ ื”ืžืกืš ืื• ืœืงืจื•ื ืžื™ื“ืข ืžื‘ืกื™ืก ื”ื ืชื•ื ื™ื. ื”ื‘ืขื™ื” ืžืชื—ื™ืœื” ื›ืฉื ืชื•ื ื™ ืฆื“ ื”ืฉืจืช ื”ืืœื” ืžืชืขื“ื›ื ื™ื. ืคืขื ื›ืฉื”ื™ืชื” ืœื ื• ืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ืœืงื•ื— ืฉืงืจืื” ืืช ื”ืžื™ื“ืข ืขื react-query ื™ื“ืขื ื• ืœืจืขื ืŸ ืืช ื”ืžื™ื“ืข ื›ืœ ื›ืžื” ืฉื ื™ื•ืช ืื• ืœื‘ื ื•ืช Web Socket ื›ื“ื™ ืœืงื‘ืœ ืขื“ื›ื•ืŸ ืžื”ืฉืจืช ื›ืฉื”ืžื™ื“ืข ืžืชืขื“ื›ืŸ. ื‘ืคื•ืกื˜ ื”ื™ื•ื ื ืจืื” ื“ื•ื’ืžื” ืงืฆืจื” ืื™ืš ืœืขืฉื•ืช ื“ื‘ืจ ื“ื•ืžื” ื•ื‘ืงืœื•ืช ื‘ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“ ืฉืจืช. ืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ืฉืจืช ืฉืžืฆื™ื’ื” ืชื•ื›ืŸ ืฉืœ ืงื•ื‘ืฅ ื”ืงื•ื“ ื”ื‘ื ื‘ page.tsx ื”ื•ื ืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ืฉืจืช ืฉืžืฆื™ื’ื” ืชื•ื›ืŸ ืฉืœ ืงื•ื‘ืฅ ื•ืœื™ื“ื” ืชื™ื‘ืช ื˜ืงืกื˜:
import fs from 'node:fs/promises';

export default function Home() {
  const data = fs.readFile('README.md', 'utf-8')
  return (
    <div>
      <input type="text" />
      <div>
        {data}
      </div>
    </div>
  )
}
ืจื™ืขื ื•ืŸ ืื•ื˜ื•ืžื˜ื™ ืžืชื•ืš ืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ืœืงื•ื— ื›ืืฉืจ ื”ืชื•ื›ืŸ ืขืœ ื”ื“ื™ืกืง ืžืฉืชื ื” ืื™ืŸ ืฉื•ื ืฉื™ื ื•ื™ ืขืœ ื”ืžืกืš. ื”ืžืฉืชืžืฉ ื™ืจืื” ืืช ื”ืชื•ื›ืŸ ื”ื—ื“ืฉ ืจืง ื›ืฉื™ืœื—ืฅ ืจื™ืขื ื•ืŸ. ืœืคืขืžื™ื ื–ื” ืžืกืคื™ืง ื˜ื•ื‘ ืื‘ืœ ืœืคืขืžื™ื ืื ื—ื ื• ื›ืŸ ืจื•ืฆื™ื ืขื“ื›ื•ืŸ ืื•ื˜ื•ืžื˜ื™. ื“ืจืš ืื—ืช ืงืœื” ืœื”ืฆื™ื’ ืชืžื™ื“ ืืช ื”ืžื™ื“ืข ื”ืขื“ื›ื ื™ ื”ื™ื ืœื”ืคืขื™ืœ "reload" ืฉืœ next ื‘ืื•ืคืŸ ื™ื–ื•ื. ืื ื™ ื›ื•ืชื‘ ืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ืœืงื•ื— ื—ื“ืฉื” ื‘ืฉื AutoRefresh ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
'use client';
import { useEffect } from 'react';
import { useRouter } from 'next/navigation';

export default function AutoRefresh() {
  const router = useRouter();
  useEffect(() => {
    const interval = setInterval(() => {
      router.refresh();
    }, 1000);

    return () => clearInterval(interval);
  }, [router]);

  return null;
}
ื•ืžื•ืกื™ืฃ ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ืœ page:
import fs from 'node:fs/promises';
import AutoRefresh from './auto-refresh';

export default function Home() {
  const data = fs.readFile('README.md', 'utf-8')
  return (
    <div>
      <AutoRefresh />
      <input type="text" />
      <div>
        {data}
      </div>
    </div>
  )
}
ื•ืขื›ืฉื™ื• ื”ื“ืคื“ืคืŸ ืฉืœื™ ืžื•ืฉืš ื›ืœ ืฉื ื™ื” ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ื”ืžืจื•ื ื“ืจืช ืžื”ืฉืจืช ื•ืžืขื“ื›ืŸ ืืช ื”ืขืžื•ื“ ืขื ื”ืชื•ื›ืŸ ื”ื—ื“ืฉ. ื›ื™ืฃ ืœืฉื™ื ืœื‘ ืฉืื™ืŸ ื“ืจื™ืกื” ืฉืœ ื” input, ื›ืœื•ืžืจ ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“ ืœืงื•ื— ืฉืขื•ื“ื›ื ื• ื‘ืฆื“ ื”ืœืงื•ื— ื™ืฉืžืจื• ืขืœ ืขืจื›ืŸ ืœืžืจื•ืช ื”ืจื™ืขื ื•ืŸ. ืžื” ื”ืœืื” ื›ืžื•ื‘ืŸ ืฉื˜ืขื™ื ื” ืžื—ื“ืฉ ื›ืœ ืฉื ื™ื” ื™ื•ืฆืจืช ืขื•ืžืก ืžื™ื•ืชืจ ืขืœ ื”ืฉืจืช. ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœืฉืคืจ ืืช ื”ืžื ื’ื ื•ืŸ ืื ื ื•ืกื™ืฃ SSE ืื• Websockets ืฉื™ืฉืœื—ื• ืœืœืงื•ื—ื•ืช ื”ื•ื“ืขื” ื›ืœ ืคืขื ืฉื™ืฉ ืฉื™ื ื•ื™ ื‘ืžื™ื“ืข ื‘ืฆื“ ืฉืจืช, ื•ืื– ื”ื“ืคื“ืคืŸ ื™ื˜ืขืŸ ืžื—ื“ืฉ ืืช ื”ืขืžื•ื“ ืจืง ืื—ืจื™ ืฉืžืงื‘ืœ ื”ื•ื“ืขื” ื›ื–ื•. ื”ื—ื™ืกืจื•ืŸ ื”ืฉื ื™ ื‘ื’ื™ืฉื” ื–ื• ื”ื•ื ืฉืœื ื ืจืฆื” ืœืฉื™ื ืืช ืงื•ืžืคื•ื ื ื˜ืช AutoRefresh ื™ื•ืชืจ ืžืคืขื ืื—ืช ื‘ื™ื™ืฉื•ื. ืžื ื’ื ื•ืŸ ื™ื•ืชืจ ืžื•ืฆืœื— ื™ื”ื™ื” ืœื”ืฉืชืžืฉ ื‘ Provider ื›ื“ื™ ืœื”ืคืขื™ืœ ืืช ื”ืืคืงื˜ ื•ืœืฉืžื•ืจ ื›ืžื” ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆืจื™ื›ื•ืช ืืช ื”ืจื™ืขื ื•ืŸ. ื›ืœ ืงื•ืžืคื•ื ื ื˜ื” ืฉืชืฉืœื‘ ืืช AutoRefresh ืชืขืœื” ืืช ื”ืžื•ื ื” ื‘-1 ื•ืื•ืชื• Provider ื™ืคืขื™ืœ ืืช ื”ื˜ื™ื™ืžืจ ืจืง ืื ืžืกืคืจ ื”ืงื•ืžืคื•ื ื ื˜ื•ืช ืฉืžืฉืชืžืฉื•ืช ื‘ AutoRefresh ื‘ืขืžื•ื“ ื’ื“ื•ืœ ืž-1. ื‘ื’ื™ืฉืช ื” Provider ืื ื™ ื›ื•ืชื‘ ืงื•ื‘ืฅ ื‘ืฉื refresh-provider.tsx ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
'use client';
import { useEffect, useState, createContext } from 'react';
import { useRouter } from 'next/navigation';
export const RefreshContext = createContext((n: number) => {})
export default function RefreshProvider({ children }: { children: React.ReactNode }) {
  const [clients, setClients] = useState(0);
  const router = useRouter();

  const addClients = (n: number) => setClients(c => c + n);

  useEffect(() => {
    if (clients > 0) {
      const timer = setInterval(() => {
        router.refresh();
      }, 1000);
      return () => {
        clearInterval(timer);
      }
    }
  }, [router, clients > 0]);
  return (
    <RefreshContext value={addClients}>
      {children}
    </RefreshContext>
  );
}
ืื ื™ ืžืขื“ื›ืŸ ืืช layout.tsx ื›ื“ื™ ืœื”ืฉืชืžืฉ ื‘ืคืจื•ื‘ื™ื™ื“ืจ:
export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  return (
    <html lang="en">
      <body className={\${geistSans.variable} ${geistMono.variable}\}>
        <RefreshProvider>
          {children}
        </RefreshProvider>        
      </body>
    </html>
  );
}
ื•ืžืขื“ื›ืŸ ืืช auto-refresh ื‘ืื•ืคืŸ ื”ื‘ื:
'use client';
import { useEffect, use } from 'react';

ToCode
1 417
if __FILE__ == $PROGRAM_NAME
  puts solve_file('input.txt')
end
ืฉื™ืคื•ืจ? ืื ื™ ืœื ื‘ื˜ื•ื—.

ToCode
1 417
ืคื™ืชืจื•ืŸ Advent Of Code 2024 ื™ื•ื 7 - ืœื ืœื”ื™ื‘ื”ืœ, ืื ื™ ื™ื•ื“ืข ืœืฉื ื•ืช ืืช Integer ื™ื•ื 7 ืฉืœ Advent Of Code ืœื ื”ื™ื” ืžืกื•ื‘ืš ื•ื”ื–ื›ื™ืจ ืœื™ ื›ืžื” ื›ื™ืฃ ืฉืืคืฉืจ ื‘ืจื•ื‘ื™ ืœืฉื ื•ืช ืืช ื”ืžื—ืœืงื•ืช ื”ืžื•ื‘ื ื•ืช ื‘ืฉืคื”. ื‘ื•ืื• ื ืจืื” ืžื” ื”ื™ื” ืฉื. ื”ืืชื’ืจ ื ืชื•ืŸ ืงืœื˜ ืฉืžื•ืจื›ื‘ ืžืชื•ืฆืื” ื•ืื•ืคืจื ื“ื™ื:
190: 10 19
3267: 81 40 27
83: 17 5
156: 15 6
7290: 6 8 6 15
161011: 16 10 13
192: 17 8 14
21037: 9 7 18 13
292: 11 6 16 20
ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœืžืฆื•ื ืื ืืคืฉืจ ืœื”ื•ืกื™ืฃ ืืช ื”ืื•ืคืจื˜ื•ืจื™ื ืคืœื•ืก ื•ื›ืคื•ืœ ื‘ื™ืŸ ื”ืื•ืคืจื ื“ื™ื ื›ื“ื™ ืœื”ื’ื™ืข ืœืชื•ืฆืื”. ื‘ื—ืœืง ื”ืฉื ื™ ืฉืœ ื”ืืชื’ืจ ืžื•ืกื™ืคื™ื ืœื ื• ืื•ืคืจื˜ื•ืจ ื‘ืฉื || ืฉืžืฉืžืขื•ืชื• "ืฉืจืฉื•ืจ" ืฉื ื™ ืื•ืคืจื ื“ื™ื ื›ืš ืฉ:
10 || 19 = 1019
ื•ืจื•ืฆื™ื ืœืจืื•ืช ืื ืืคืฉืจ ืœื”ื’ื™ืข ืœืชื•ืฆืื” ืขื ื”ืื•ืคืจื˜ื•ืจ ื”ื—ื“ืฉ. ืคื™ืชืจื•ืŸ ื”ื—ืœืง ื”ืžืจื›ื–ื™ ืฉืœ ื”ืคื™ืชืจื•ืŸ ืœืงื— ื‘ืกืš ื”ื›ืœ ืžืกืคืจ ืฉื•ืจื•ืช ื‘ืจื•ื‘ื™:
def count_options(target, values)
  results = [:+, :*].repeated_permutation(values.size - 1).to_a.map do |seq|
    values[1..].zip(seq).reduce(values[0]) { |a, (v, op)| a.send(op, v) } == target
  end
  results.count(true)
end
ื”ืคื•ื ืงืฆื™ื” repeated_permutation ืžื•ืคืขืœืช ืขืœ ืžืขืจืš ื•ืžื—ื–ื™ืจื” ืืช ื›ืœ ื”ืคืจืžื•ื˜ืฆื™ื•ืช ืขื ื—ื–ืจื•ืช ืขืœ ื”ืื™ื‘ืจื™ื ืฉืœื•. ื”ื ื” ื“ื•ื’ืžื”:
3.3.5 :003 > [1, 2].repeated_permutation(3).to_a
 => [[1, 1, 1], [1, 1, 2], [1, 2, 1], [1, 2, 2], [2, 1, 1], [2, 1, 2], [2, 2, 1], [2, 2, 2]]
ืžื” ืขื•ืฉื™ื? ืœื•ืงื—ื™ื ืืช ื›ืœ ื”ืคืจืžื•ื˜ืฆื™ื•ืช ืฉืœ ื”ืื•ืคืจื˜ื•ืจื™ื ื•ืฉื•ืชืœื™ื ืื•ืชืŸ ื‘ืจืฉื™ืžืช ื”ืื•ืคืจื ื“ื™ื ืขื zip. ืื—ืจื™ ื–ื” ืžืคืขื™ืœื™ื reduce ื›ื“ื™ ืœืจื•ืฅ ืขืœ ื”ืจืฉื™ืžื” ื•ืœื‘ืฆืข ืืช ื”ืคืขื•ืœื•ืช ืฉื”ื’ืจืœื ื• ื•ื‘ืกื•ืฃ ื‘ื•ื“ืงื™ื ืื ื”ื’ืขื ื• ืœืชื•ืฆืื”. ื‘ืฉื‘ื™ืœ ืœืงืจื•ื ืืช ื”ืงืœื˜ ื”ื™ื” ืฆืจื™ืš ืจืง ืขื•ื“ ื‘ื™ื˜ื•ื™ ืจื’ื•ืœืืจื™:
puts (File.readlines('input.txt').map do |line|
  target, values = line.match(/(\d+): (.*)/).captures
  count_options(target.to_i, values.split.map(&:to_i)).positive? ? target.to_i : 0
end.sum)
ื•ืžื” ืขื ื”ื—ืœืง ื”ืฉื ื™? ืžืื•ื“ ืคืฉื•ื˜, ืฆืจื™ืš ืจืง ืœื”ื•ืกื™ืฃ ืžืชื•ื“ื” ืœ Integer:
class Integer
  def op_concat(other)
    (to_s + other.to_s).to_i
  end
end
ื•ืื– ืืคืฉืจ ืœื”ื™ืฉืืจ ืขื ืื•ืชื” ืคื•ื ืงืฆื™ื” ืงืฆืจื” ื•ืจืง ืœืฉื ื•ืช ืืช ืžืขืจืš ื”ืื•ืคืจื˜ื•ืจื™ื:
def count_options(target, values)
  results = [:+, :*, :op_concat].repeated_permutation(values.size - 1).to_a.map do |seq|
    values[1..].zip(seq).reduce(values[0]) { |a, (v, op)| a.send(op, v) } == target
  end
  results.count(true)
end
ืกืš ื”ื›ืœ ื”ืคื™ืชืจื•ืŸ ื”ืžืœื ื‘ืจื•ื‘ื™ ืขื ืคื—ื•ืช ืž 20 ืฉื•ืจื•ืช ื”ื™ื”:
class Integer
  def op_concat(other)
    (to_s + other.to_s).to_i
  end
end

def count_options(target, values)
  results = [:+, :*, :op_concat].repeated_permutation(values.size - 1).to_a.map do |seq|
    values[1..].zip(seq).reduce(values[0]) { |a, (v, op)| a.send(op, v) } == target
  end
  results.count(true)
end

puts (File.readlines('input.txt').map do |line|
  target, values = line.match(/(\d+): (.*)/).captures
  count_options(target.to_i, values.split.map(&:to_i)).positive? ? target.to_i : 0
end.sum)
ื•ืื—ืจื™ ืฉื ืชืชื™ ืœืงืœื•ื“ ืœืฉืคืจ ืงื™ื‘ืœืชื™ ืืช ื–ื”:
class Integer
  # Method to concatenate two numbers as strings and convert back to integer
  def op_concat(other)
    (to_s + other.to_s).to_i
  end
end

def count_options(target, values)
  # Early return if only one value
  return (values[0] == target ? 1 : 0) if values.size == 1
  
  # Define available operations
  operations = [:+, :*, :op_concat]
  
  # Count combinations that equal the target
  operations.repeated_permutation(values.size - 1).count do |ops|
    result = values[0]
    values[1..].zip(ops).each do |value, op|
      result = result.send(op, value)
    end
    result == target
  end
end

def solve_file(filename)
  # Read the file and process each line
  File.readlines(filename).sum do |line|
    if line.strip.empty?
      0  # Handle empty lines
    else
      # Parse the target and values
      match = line.match(/(\d+):(.*)/)
      if match
        target = match[1].to_i
        values = match[2].strip.split.map(&:to_i)
        
        # If there's at least one way to reach the target, count that target
        count_options(target, values).positive? ? target : 0
      else
        0  # Handle invalid lines
      end
    end
  end
end

* Execute the solution if run as a script *