uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

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

Ko'proq ko'rsatish
1 420
Obunachilar
+124 soatlar
+17 kunlar
-430 kunlar
Postlar arxiv
ToCode
1 420
ื“ื‘ืจื™ื ืงื˜ื ื™ื ื›ืฉืœื ืžื‘ื™ื ื™ื, ื’ื ื“ื‘ืจื™ื ืงื˜ื ื™ื ื ืจืื™ื ืžืœื—ื™ืฆื™ื. ื”ื ื’ื•ืจืžื™ื ืœืื ืฉื™ื ื˜ื•ื‘ื™ื ืœื”ื™ื‘ื”ืœ ื•ืœื—ืคืฉ ืคื™ืชืจื•ื ื•ืช ืžื”ื™ืจื™ื, ืจืง ื‘ืฉื‘ื™ืœ ืœื”ื‘ื˜ื™ื— ืœืขืฆืžื ื• ืฉื”ื‘ืขื™ื” ืœื ื’ื“ื•ืœื” ื›ืžื• ืฉื–ื” ื ืจืื”- ืดืœืžื” ื”ืงื•ื ื˜ื™ื™ื ืจ ืฉืœื™ ืœื ื ื“ืœืง?!ืด ืดืœืžื” ืื™ืŸ ืขื“ื™ื™ืŸ ืจื•ื•ื—ื™ื ืžื”ืžืขืจื›ืช?!ืด ืดืœืžื” ื”ื“ืฃ ื ื˜ืขืŸ ื›ืœ ื›ืš ืœืื˜?!ืด ืœืคืขืžื™ื ื”ืคื™ืชืจื•ืŸ ื‘ืืžืช ื™ื™ืงื— ื“ืงื”. ืœืคืขืžื™ื ื™ื•ืชืจ. ื”ื“ื‘ืจ ื”ื—ืฉื•ื‘ ื”ื•ื ืœืฉื™ื ืœื‘ ืฉื›ื›ืœ ืฉืžื‘ื™ื ื™ื ื™ื•ืชืจ ื›ืš ื ืœื—ืฆื™ื ืคื—ื•ืช, ื•ื™ื•ื“ืขื™ื ื™ื•ืชืจ ื˜ื•ื‘ ืžื” ืœืขืฉื•ืช. ื‘ื”ืชืžื•ื“ื“ื•ืช ืขื ืืชื’ืจ ืœื ืžื•ื›ืจ ืฉื•ื•ื” ืœื‘ื—ื•ืจ ื‘ืื—ืช ืžืฉืชื™ ื“ืจื›ื™ื: 1. ืœืœืžื•ื“ ืืช ืขื•ืœื ื”ืชื•ื›ืŸ ื‘ืจืžื” ืžืกืคื™ืง ื˜ื•ื‘ื” ื›ื“ื™ ืœื”ืชืžื•ื“ื“ ืขื ื”ืืชื’ืจ ื”ื–ื”. 2. - ืื• - ืœืฉืœื ืœืžื™ืฉื”ื• ืฉืœืžื“ ื›ื‘ืจ ืืช ืขื•ืœื ื”ืชื•ื›ืŸ ื›ื“ื™ ืฉื™ืขื–ื•ืจ ืœื ื• ืœืคืชื•ืจ ืืช ื”ืืชื’ืจ. ื”ื˜ืขื•ืช ืฉื›ื“ืื™ ืœื”ื™ื–ื”ืจ ืžืžื ื” ื”ื™ื ืœืœืžื•ื“ ืจืง ืงืฆืช ืžืชื•ืš ืขื•ืœื ื”ืชื•ื›ืŸ "ืžืกืคื™ืง ื‘ืฉื‘ื™ืœ ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื”" ื•ืื– ืœืคืชื•ืจ ื“ื‘ืจื™ื ืขืงื•ื. ื”ืชื•ืฆืื” ื‘ื“ืจืš ื›ืœืœ ืชื”ื™ื” ืฉื”ื‘ืขื™ื” ืชื™ืฉืืจ ื•ืจืง ืชื™ืจืื” ืขื•ื“ ื™ื•ืชืจ ืžืกื•ื‘ื›ืช.

ToCode
1 420
ืกื•ื’ืจื™ื™ื ืื– ื›ืžื• ืชืžื™ื“ ืื—ืจื™ ืฉืื ื™ ืžื‘ืœื” ื™ื•ืชืจ ืžื“ื™ ื–ืžืŸ ื‘ืœื“ื‘ื’ ืžืฉื”ื• ื˜ืคืฉื™ ืื ื™ ื”ื•ืœืš ืœื›ืชื•ื‘ ืืช ื–ื” ื›ืืŸ ื›ื“ื™ ืœื ืœืฉื›ื•ื— ื•ื›ื“ื™ ืฉืœืคื—ื•ืช ื ืœืžื“ ืžืฉื”ื• ืžื”ืกื™ืคื•ืจ, ื•ื”ื™ื•ื ืื ื—ื ื• ืจื•ืฆื™ื ืœื“ื‘ืจ ืขืœ ืกื•ื’ืจื™ื™ื ื•ืกืงืืœื”. ื ื•, ืจื•ืฆื™ื ื–ืืช ืžื™ืœื” ื’ื“ื•ืœื”, ืืฃ ืื—ื“ ืœื ืจื•ืฆื” ืœื“ื‘ืจ ืขืœ ืกื•ื’ืจื™ื™ื. ื•ื‘ื›ืœ ื–ืืช ืœืคืขืžื™ื ืฆืจื™ืš ื•ื‘ืžื™ื•ื—ื“ ื›ืฉืกื•ื’ืจื™ื™ื ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ืžื‘ืœื‘ืœื™ื. ื ืชื—ื™ืœ ื‘ืงื•ื“-
  @main
  def parens(): Unit =
    val result = if (Random.nextInt() > 0) {
      Try { throw new Exception("20") }
    } else {
      Try { throw new Exception("30") }
    }.recover { err => 30 }

    println(result)
ื•ื”ืฉืืœื” ืžื” ื”ืขืจืš ืฉืœ result? ื‘ืฉื‘ื™ืœ ืœืขื ื•ืช ืขืœ ื–ื” ื ืชื—ื™ืœ ืขื ื“ื•ื’ืžืช ืงื•ื“ ื™ื•ืชืจ ืคืฉื•ื˜ื” ื•ื ื•ืจื™ื“ ืืช ื” recover. ืขื›ืฉื™ื• ื‘ืœื•ืง ื” then ื•ื‘ืœื•ืง ื” else ืฉืงื•ืœื™ื:
  @main
  def parens(): Unit =
    val result = if (Random.nextInt() > 0) {
      Try { throw new Exception("20") }
    } else {
      Try { throw new Exception("30") }
    }
ื• result ื™ื”ื™ื” ืฉื•ื•ื” ืœืื•ื‘ื™ืงื˜ Failure ืฉื” Exception ืฉืœื• ืชืœื•ื™ื” ื‘ืชื•ืฆืื” ืฉืœ ื”ื—ื™ืฉื•ื‘ ื”ืืงืจืื™. ืคืงื•ื“ืช recover ื‘ืกืงืืœื” ืฉืžื•ืคืขืœืช ืขืœ ืื•ื‘ื™ืงื˜ Try ืžืฉื ื” ืื•ืชื• ืž Failure ืœ Success ืขื ื”ืขืจืš ืฉืžื•ืคื™ืข ื‘ recover. ื”ื“ื•ื’ืžื” ื”ื‘ืื” ืœื›ืŸ ื’ื ืฆืคื•ื™ื”:
  @main
  def parens(): Unit =
    val result = if (Random.nextInt() > 0) {
      Try { throw new Exception("20") }
    } else {
      Try { throw new Exception("30") }
    }

    println(result.recover { err => 30 })
ื‘ื’ืœืœ ืฉืœื ืžืฉื ื” ืžื” ื”ื•ื’ืจืœ result ื”ื—ื–ื™ืง ื‘ื›ืœ ืžืงืจื” Failure, ืื– ื”ืคืขืœืช recover ืชืฉื ื” ืืช ื”ืขืจืš ืœ Success ืฉืœ 30 ื•ื–ื” ืžื” ืฉื™ื•ื“ืคืก:
Success(30)
ืื‘ืœ ืžื” ืขื ืงื˜ืข ื”ืงื•ื“ ื”ืจืืฉื•ืŸ ืฉื”ื“ื‘ืงืชื™? ืขื›ืฉื™ื• ืื ื—ื ื• ืžื‘ื™ื ื™ื ืžื” ืจืฆื™ืชื™ ืฉื”ื•ื ื™ืขืฉื” - ืจืฆื™ืชื™ ืฉื”ื•ื ื™ืคืขื™ืœ ืืช recover ืขืœ ื”ืขืจืš ืฉื—ื–ืจ ืžื” if, ืœืคื ื™ ืฉื ืฉืžืจ ื‘ result. ื–ื” ืœื ืžื” ืฉืงืจื”. ื‘ืฉื‘ื™ืœ ืœื”ื‘ื™ืŸ ืžื” ื›ืŸ ืงืจื” ืฆืจื™ืš ืงื•ื“ื ื›ืœ ืœืžื—ื•ืง ืืช ื”ืกื•ื’ืจื™ื™ื ื”ืžืกื•ืœืกืœื™ื:
    val result = if (Random.nextInt() > 0)
                    Try { throw new Exception("20") }
                 else Try { throw new Exception("30")
ื›ื“ืื™ ืœื—ืฉื•ื‘ ืขืœ ื”"ื‘ืœื•ืง" ื‘ืกืงืืœื” ื‘ืชื•ืจ ืคืจืžื˜ืจ ืœ if ืื• ืœ else. ืœื›ืŸ ืื™ืŸ ื‘ืขื™ื” ืœื›ืชื•ื‘ ืืช ื”ืฉื•ืจื” ื‘ืœืขื“ื™ื• ื•ืœื›ืŸ ื”ื’ื™ืจืกื” ื”ืจืืฉื•ื ื” ืฉืœ ื”ืงื•ื“ ืฉืงื•ืœื” ืœื’ื™ืจืกื” ื”ื–ื•:
val result = if (Random.nextInt() > 0)
                Try { throw new Exception("20") }
                else
                Try { throw new Exception("30") }.recover { _ => 30 }
ืขื›ืฉื™ื• ื–ื” ื‘ืจื•ืจ - ื” recover ื”ืฉืคื™ืข ืจืง ืขืœ ื‘ืœื•ืง ื” else ื•ืœื ืขืœ ื›ืœ ื” if. ื”ืงื•ื“ ื”ื—ื–ื™ืจ Success ื›ืฉื”ืžืกืคืจ ื”ืืงืจืื™ ื”ื™ื” 0 ืื• ืฉืœื™ืœื™, ื•ื‘ืžืกืคืจื™ื ื—ื™ื•ื‘ื™ื™ื ื”ื—ื–ื™ืจ Failure. ื›ืฉืžื‘ื™ื ื™ื ืื™ืš ื–ื” ืขื•ื‘ื“ ืงืœ ื’ื ืœืชืงืŸ:
  @main
  def parens(): Unit =
    val result = (if (Random.nextInt() > 0) {
      Try { throw new Exception("20") }
    } else {
      Try { throw new Exception("30") }
    }).recover { _ => 30 }

    println(result.recover { err => 30 })

ToCode
1 420
ื•ืื– ื’ื™ืœื™ืชื™ ืื ื™ ื›ื•ืชื‘ ืขื›ืฉื™ื• ื‘ื•ื˜ ืœื˜ืœื’ืจื ืฉื›ื•ืœืœ ื”ื•ื“ืขื•ืช ืขื ื›ืคืชื•ืจื™ื, ืœืžืฉืœ ื“ืžื™ื™ื ื• ื”ื•ื“ืขื” ืขืœ ื”ืคื•ืกื˜ ื”ื–ื” ืฉื›ื•ืœืœืช ื›ืคืชื•ืจ "ืœื™ื™ืง". ื”ืžื™ืžื•ืฉ ืžืกืชื‘ืจ ืžื—ื–ื™ืจ ืื•ืชื ื• ืœืืชื’ืจ ื”ืงืœืืกื™ ืฉืœ ื›ืคืชื•ืจื™ื ื‘ืžืžืฉืง - ืื™ืš ืœื”ื•ืกื™ืฃ ืžื™ื“ืข ืžืขื ื™ื™ืŸ ืœืื™ืจื•ืข ื”ืœื—ื™ืฆื” ืขืœ ื”ื›ืคืชื•ืจ. ื•ืื ื™ ืืกื‘ื™ืจ. ื›ืฉืžืฉืชืžืฉ ืœื•ื—ืฅ ืขืœ ื›ืคืชื•ืจ "ืœื™ื™ืง" ืžื•ืคืขืœืช ืคื•ื ืงืฆื™ื”. ืื•ืชื” ืคื•ื ืงืฆื™ื” ืฆืจื™ื›ื” ืœื”ื‘ื™ืŸ ืœืื™ื–ื” ืคื•ืกื˜ ืฆืจื™ืš ืœืกืžืŸ ืืช ื”ืœื™ื™ืง ืœืคื ื™ ืฉืชื•ื›ืœ ืœืœื›ืช ืœืขื“ื›ืŸ ืืช ื”ืคืจื˜ื™ื ื‘ื‘ืกื™ืก ื”ื ืชื•ื ื™ื. ืคื•ื ืงืฆื™ื” ืฉืžื˜ืคืœืช ื‘ืœื—ื™ืฆื” ืขืœ ื›ืคืชื•ืจ ืžืงื‘ืœืช ืืช ื”ืคืจืžื˜ืจื™ื ื”ื‘ืื™ื: flags, game, peer, msg_id, data, password, ื•ืœื›ืŸ ื”ื“ื‘ืจ ืฉื ืจืื” ืœื™ ื”ื›ื™ ื”ื’ื™ื•ื ื™ ื›ืฉื ื™ื’ืฉืชื™ ืœืžืžืฉ ืืช ื–ื” ืคืขื ืจืืฉื•ื ื” ื”ื™ื” ืœืฉื™ื ืืช ื”ืžื™ื“ืข ื”ื—ืฉื•ื‘ ื‘ืฉื“ื” data ืฉืœ ื”ื›ืคืชื•ืจ, ื•ืื– ืœืงื‘ืœ ืืช ื”ืžื™ื“ืข ื”ื–ื” ื‘ื˜ื™ืคื•ืœ ื‘ืœื—ื™ืฆื”. ื‘ื“ื•ื’ืžื” ืฉืœ ื”ืœื™ื™ืง ื ืฉื™ื ืืช ื” URL ืฉืœ ื”ืคื•ืกื˜ ื‘ืชื•ืจ data, ื ืงื‘ืœ ืื•ืชื• ื‘ืคื•ื ืงืฆื™ื” ืฉืชื˜ืคืœ ื‘ืœื—ื™ืฆื” ื›ืœ ื”ื›ืคืชื•ืจ ื•ื”ื›ืœ ื˜ื•ื‘. (ื•ืื– ื’ื™ืœื™ืชื™) ื•ืคื” ื”ืกื™ืคื•ืจ ื ื”ื™ื” ืžืขื ื™ื™ืŸ ื›ื™ ืื—ืจื™ ืฉื”ืชื—ืœืชื™ ืœื‘ื“ื•ืง ืืช ื”ื‘ื•ื˜ ืจืื™ืชื™ ืฉื—ืœืง ืžื”ื›ืคืชื•ืจื™ื ืขื•ื‘ื“ื™ื ื•ื—ืœืง ืœื ืขื•ื‘ื“ื™ื. ื”ืžืฉืš ืžื—ืงืจ ื”ื‘ื™ื ืื•ืชื™ ืœื’ื™ืœื•ื™ ื”ืขืฆื•ื‘ ืฉื™ืฉ ืžื’ื‘ืœืช ืื•ืจืš ืขืœ ืื•ืชื• callback data ืฉืœ 64 ืชื•ื•ื™ื. ืขื ื” URL-ื™ื ื”ืงืฆืจื™ื ืœื ื”ื™ืชื” ื‘ืขื™ื” ืื‘ืœ ื›ืฉื”ื™ื” URL ืืจื•ืš ืžืกืคื™ืง ื”ืงื•ื“ ืœื ืขื‘ื“. ืœื ืงื•ื“ื•ืช ื”ืืœื” ืฉืœ "ืขื›ืฉื™ื• ื’ื™ืœื™ืชื™" ื™ืฉ ืคื•ื˜ื ืฆื™ืืœ ืœื—ืฉื•ืฃ ืžืฉื”ื• ืžืขื‘ืจ ืœืžื™ืžื•ืฉ ื”ืกืคืฆื™ืคื™, ื•ื™ื›ื•ืœืช ืœื“ื—ื•ืฃ ืื•ืชื ื• ืœืคื™ืชืจื•ื ื•ืช ืžื”ื™ืจื™ื ืฉื™ืคื’ืขื• ื‘ื ื• ื‘ื˜ื•ื•ื— ื”ืจื—ื•ืง. ื‘ืžืงืจื” ืฉืœ ื”ื‘ื•ื˜ ื”ื ื” ื›ืžื” ืืคืฉืจื•ื™ื•ืช: 1. ืืคืฉืจ ืœื”ื™ืฉืืจ ืขื ื”ืžื‘ื ื” ืฉืœ ืฉืžื™ืจืช URL-ื™ื ื‘ื›ืคืชื•ืจื™ื, ืื‘ืœ ืคืฉื•ื˜ ืœืขื‘ื•ืจ ื“ืจืš ืฉื™ืจื•ืช ืงื™ืฆื•ืจ URL-ื™ื ื›ื“ื™ ืœื•ื•ื“ื ืฉื›ื•ืœื ืงืฆืจื™ื ื™ื•ืชืจ ืž 64 ืชื•ื•ื™ื. 2. ืืคืฉืจ ืœื™ื™ืฆืจ ื‘ DB ืžื–ื”ื” ืืงืจืื™ ืื—ืจ ืงืฆืจ ื™ื•ืชืจ ืœื›ืœ ืคื•ืกื˜, ื ืงืจื ืœื• "ืžื–ื”ื” ืงืฆืจ ื‘ืฉื‘ื™ืœ ื›ืคืชื•ืจ ื˜ืœื’ืจื" ื•ืœื›ืชื•ื‘ ืื•ืชื• ื‘ืชื•ืจ ื”ืขืจืš ืฉืœ ื” data. 3. ืืคืฉืจ ืœืฉื™ื ืœื‘ ืœืคืจืžื˜ืจ ื ื•ืกืฃ msg_id ื‘ืจืฉื™ืžืช ื”ืคืจืžื˜ืจื™ื ืฉืœ ื˜ื™ืคื•ืœ ื‘ืœื—ื™ืฆื”. ื‘ืขื–ืจืช ืžื–ื”ื” ื”ื”ื•ื“ืขื” ืื ื™ ื™ื›ื•ืœ ืœื”ื’ื™ืข ืœื”ื•ื“ืขื” ืฉื›ืœืœื” ืืช ื”ื›ืคืชื•ืจ ื•ืœื”ืกืชื›ืœ ืฉื ืžื” ื”ื™ื” ื” URL ืฉืœ ื”ืคื•ืกื˜. 4. ืืคืฉืจ ืœืœื›ืช ืขื•ื“ ืฆืขื“ ื•ืœืฉืžื•ืจ ื‘ DB ื›ืœ ื”ื•ื“ืขื” ืฉื”ื‘ื•ื˜ ืฉื•ืœื—, ืขื ืžืคืชื— ื–ืจ ืœืคื•ืกื˜ื™ื. ืขื›ืฉื™ื• ื›ืฉืื ื™ ืืงื‘ืœ msg_id ืื ื™ ืœื ืฆืจื™ืš ืœื—ืคืฉ ื‘ื”ื™ืกื˜ื•ืจื™ื™ืช ื”ื”ื•ื“ืขื•ืช ื‘ื˜ืœื’ืจื ื•ื™ื›ื•ืœ ืœืขืฉื•ืช ืืช ื”ื‘ื“ื™ืงื” ืืฆืœื™ ื‘ DB. "ื•ืื– ื’ื™ืœื™ืชื™" ื–ื• ื ืงื•ื“ื” ืฉื”ื•ืคื›ืช ืื™ืจื•ืข ืฉื‘ื›ืœืœ ืœื ื—ืฉื‘ืชื™ ืขืœื™ื• ื›ืฉื›ืชื‘ืชื™ ืืช ื”ืงื•ื“ ืœืžืฉื”ื• ืžืขื ื™ื™ืŸ. ื•ืื– ื’ื™ืœื™ืชื™, ื•ืขื›ืฉื™ื• ืืคืฉืจ ืœื—ืฉื•ื‘ ืงืฆืช ื™ื•ืชืจ ืœืขื•ืžืง ืขืœ ืคื™ืชืจื•ืŸ, ื•ืขืœ ื”ืจื™ืคืงื˜ื•ืจื™ื ื’ ืฉืฆืจื™ืš ื‘ืฉื‘ื™ืœ ืœื”ื’ื™ืข ืœืื•ืชื• ืคื™ืชืจื•ืŸ, ื•ืื•ืœื™ ืœื—ืฉื•ื‘ ืื™ืš ืœื‘ื ื•ืช ืืช ื–ื” ื›ื“ื™ ืฉื™ื”ื™ื” ืงืœ ืœืขื‘ื•ืจ ืœืคื™ืชืจื•ืŸ Fallback ื ื•ืกืฃ ืื ืื ื™ ืื’ืœื” ืขื•ื“ ื‘ืขื™ื•ืช. "ื•ืื– ื’ื™ืœื™ืชื™" ืืœื” ื”ื”ื–ื“ืžื ื•ื™ื•ืช ืฉืœื ื• ืœืฉืคืจ ืืช ืžื‘ื ื” ื”ืงื•ื“ ื›ื“ื™ ืœื”ืชืžื•ื“ื“ ื˜ื•ื‘ ื™ื•ืชืจ ืขื ืฉื™ื ื•ื™ื™ื ื‘ืขืชื™ื“.

ToCode
1 420
ื›ืขืช ื™ืฉ ืœื ื• ื“ืฃ ืื™ื ื˜ืจื ื˜ ื•ื ื™ืชืŸ ืœืคืจืกืจ ืื•ืชื• ื•ืœื”ืชื—ื™ืœ ืœืฉื—ืง ืื™ืชื•. ื›ื“ื™ ืœืคืจืกืจ ืืช ื”-HTML ืœืขืฅ DOM, ื‘ื—ืจื ื• ื‘- goquery. ื”ืขื‘ื•ื“ื” ืขื ืžื—ืจื•ื–ื•ืช Raw HTML ื›ืืŸ ื”ื™ื ื“ื™ ืžืืชื’ืจืช ื•ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื”ืžื™ืจ ืื•ืชืŸ ืœืื•ื‘ื™ื™ืงื˜ ืฉื ื™ืชืŸ ืœืขื‘ื•ื“ ืื™ืชื•. ื‘ืžื‘ื˜ ืœืื—ื•ืจ, ื™ื™ืชื›ืŸ ืฉื”ื™ื” ืขืœื™ื ื• ืœื”ืฉืชืžืฉ ื‘-Rod ื›ื“ื™ ืœื”ืขื‘ื™ืจ ืืช ืจื›ื™ื‘ื™ ื”-DOM ืืš ื‘ื–ืžืŸ ื”ืืžืช, ื”ื™ื™ื ื• ื–ืงื•ืงื™ื ืœืคืจืกืจ HTML ืงืœ ืžืฉืงืœ ื•ืœืœื ืชืœื•ืช ื• โ€“ goquery ื”ื™ื” ื ืจืื” ื›ืžื• ืคืชืจื•ืŸ ื˜ื•ื‘. ื–ื• ืคื•ื ืงืฆื™ื™ืช ื”ืคื™ืขื ื•ื—:
func ParseHTML(web_data string)*goquery.Document {
// load html string to go query html parser
 doc, err := goquery.NewDocumentFromReader(strings.NewReader(web_data))
 if err != nil {
  log.Fatal(err)
 }
    return doc
}
ืœืคื ื™ ืฉื ืžืฉื™ืš ืขื ืžื ื™ืคื•ืœืฆื™ื•ืช ื”-DOM, ื‘ื•ืื• ื•ื ืกืชื›ืœ ืขืœ ืคื•ื ืงืฆื™ื™ืช ื”ืฉืžื™ืจื”. ื—ืฉื•ื‘ ืœื–ื›ื•ืจ ืฉืขืœื™ื ื• ืœืฉืžื•ืจ ืืช ื”ื ื›ืกื™ื ื”ืงื™ื™ืžื™ื ื‘ืืžืฆืขื•ืช ื”- ETAG ืขืœ ืžื ืช ืœื”ืžื ืข ืžืœืžืœื ืืช ื”ื‘ืงื˜ ืฉืœื ื• ื‘ืงื‘ืฆื™ื ืžืื•ืชื• ื”ืกื•ื’. ืชื—ื™ืœื” ื ื‘ื ื” ืงืœื™ื™ื ื˜ HTTP ืฉื™ืกื™ื™ืข ื‘ื”ื•ืจื“ืช ื”ื ื›ืกื™ื:
//go http client constructor
func goclient(url_path string) (*http.Response, error) {
 // set client with proxy and time out of 10 secs for perf increase
 var client *http.Client
 if GetEnv("HTTP_PROXY") != "" {
  proxyUrl, _ := url.Parse(GetEnv("HTTP_PROXY"))
  client = &http.Client{Timeout: 10 * time.Second, Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}}

 } else {
  client = &http.Client{Timeout: 10 * time.Second}
 }

 req, err := http.NewRequest("GET", url_path, nil)
 if err != nil {
  return nil, errRequest
 }
 req.Header.Add("Accept", GetEnv("accept"))
 req.Header.Add("User-Agent", GetEnv("userAgent"))
 // get response from client req
 resp, err := client.Do(req)
 if err != nil {
  log.Printf("error getting resource %s \\n", err)
 }
 return resp, nil
}
ื›ืขืช ืื ื• ื™ื›ื•ืœื™ื ืœื”ื•ืจื™ื“ ืืช ื”ื ื›ืก.
// get file buffer asset from url
func getAssetContent(url_path string) (string, []byte, error) {
 reader, err := goclient(url_path)
 if err != nil {
  return "", []byte{}, errAssetContent
 }

 if reader != nil {
  buffer, err := ioutil.ReadAll(reader.Body)
  if err != nil {
   fmt.Println("error reading reader as buffer ", err)
  }
  // get hash of content
  hash := fmt.Sprintf("%x", md5.Sum(buffer))
  return hash, buffer, nil
 }

 return "", nil, nil
}
ื•ื ื›ืชื•ื‘ ืคื•ื ืงืฆื™ื™ืช ืฉืžื™ืจื” ืคืฉื•ื˜ื” ื”ืžื‘ื•ืกืกืช ืขืœ ืคื•ื ืงืฆื™ื™ืช ื‘ื“ื™ืงืช S3
//cache already uploaded asset
func cachelink(link string) (bool, string, string, error) {
 etag, err := goclient(link)
 if err != nil {
  return false, "", "", err
 }

 path, _ := url.Parse(link)
 // get file extension from file url
 filetype := filepath.Ext(path.Path)
 if etag != nil {
  // cache files with their etag values
  etag_val := etag.Header.Get("Etag")
  var fileExist bool
  if etag_val != "" {
   // check if file exist in cache
   fileExist = S3KeyCache.Check(etag_val)
  } else {
   // use sha value if file etag value does not exist
   hash, _, err := getAssetContent(link)
   if err != nil {
    return false, "", "", errCacheLink
   }

   if hash != "" {
    etag_val = hash
    fileExist = S3KeyCache.Check(hash)
   }
  }
  // construct new key with file extension
  return fileExist, etag_val, filetype, nil
 }

 return false, "", "", nil
}
ื•ืกื•ืฃ ืกื•ืฃ, ื™ืฉ ืœื ื• ืืช ืคื•ื ืงืฆื™ื™ืช ื”ื”ืขืœืื”. ืื ื• ื ืฉืชืžืฉ ื‘-sync.mutex ืฉืœ golang ื›ื“ื™ ืœื ืฆืœ ืืช ื”ืชืžื™ื›ื” ืฉืœ ื”ืฉืคื” ื‘ืžืงื‘ื™ืœื™ื•ืช:
// fetchAndUploadContent fetches assets and uploads to S3
func fetchAndUploadContent(waitGroup *sync.WaitGroup, mutex *sync.Mutex, info fetchUploadJobInfo) {
 defer waitGroup.Done()

 _, buffer, err := getAssetContent(*info.url)
 if err != nil {
  return
 }

 if buffer != nil {
  newKey := UploadToS3(*info.filename, buffer, *info.filetype)

  mutex.Lock()
  defer mutex.Unlock()

  // add etag to cache
  S3KeyCache.Add(*info.filename)
  info.node.SetAttr(*info.attr, newKey)
 }
}

//add upload to a go routine
func schedule_upload(path string, node *goquery.Selection, attr string, waitGroup *sync.WaitGroup, mutex *sync.Mutex) {
 fileExist, etag, fileType, err := cachelink(path)
 if err != nil {
  return
 }

ToCode
1 420
ืคื•ืกื˜ ืื•ืจื— - ื‘ื ื™ื™ืช ื–ื—ืœืŸ ืจืฉืช Crawling Engine ื”ื›ื•ืชื‘ ื”ื•ื Oragbakosi Valentine, ื‘ืฉืœื•ืฉ ื”ืฉื ื™ื ื”ืื—ืจื•ื ื•ืช ื”ื•ื ืขื•ื‘ื“ ื›ืžืคืชื— ืชื•ื›ื ื” ื‘ื’ื™ื˜ืกื˜ืืจื˜ ื•ืœืคื ื™ ื›ืŸ ืขื‘ื“ ื‘GoSquare. ื’ื™ื˜ืกื˜ืืจื˜ ื”ื™ื ืคืœื˜ืคื•ืจืžืช Code as a Service ืฉื”ื•ืคื›ืช ืืช ืžื” ื™ืฉ ืœื›ื ื‘ื‘ืงืœื•ื’ (backlog) ืœืงื•ื“ ื‘ืื™ื›ื•ืช ื’ื‘ื•ื”ื” ื•ื‘ื• ื–ืžื ื™ืช ืžื˜ืคื—ืช ืงื”ื™ืœื” ื”ื•ืœื›ืช ื•ื’ื“ืœื” ืฉืœ ืžืคืชื—ื™ื ื‘ืจื—ื‘ื™ ื”ืขื•ืœื. ื‘ืชื—ื™ืœืช ื”ืฉื ื” ื”ืฉื™ืงื” ื’ื™ื˜ืกื˜ืืจื˜ ืืช ืคืขื™ืœื•ืชื” ื‘ื™ืฉืจืืœ ื•ื”ื—ืœื” ืœืชืžื•ืš ื‘ืฆื•ื•ืชื™ ืคื™ืชื•ื— ืžืงื•ืžื™ื™ื. ืชื™ืื•ืจ ื”ืคืจื•ื™ืงื˜ ืื—ื“ ื”ืœืงื•ื—ื•ืช ืฉืœื ื•, ื—ื‘ืจื” ืงื˜ื ื” ืฉื ื•ืชื ืช ืฉื™ืจื•ืชื™ brand awareness ืœืœืงื•ื—ื•ืช ื‘ืจื—ื‘ื™ ื”ืขื•ืœื ื‘ื™ืงืฉื” ืžืื™ืชื ื• ืœืคืชื— ื–ื—ืœืŸ ืจืฉืช (engine crawler) ื•-ืคืœื˜ืคื•ืจืžืช ื”ืขืชืงืช ื“ืคื™ ืจืฉืช (web cloning platform). ื”ืคืจื•ื™ืงื˜ ื”ื–ื” ืžืฆื ื—ืŸ ื‘ืขื™ื ื™ ื‘ืžื™ื•ื—ื“ ื‘ื–ื›ื•ืช ื–ื” ืฉื”ื•ื ื ืชืŸ ืœื ื• ื”ื–ื“ืžื ื•ืช ืœืœืžื•ื“ ืœืขื•ืžืง ื›ื™ืฆื“ ื–ื—ืœื ื™ ืจืฉืช ืคื•ืขืœื™ื ื•ืื™ืš ื“ืคื“ืคื ื™ื ืžืชืžื•ื“ื“ื™ื ืขื ืจื™ื ื“ื•ืจ ื•ืคื™ืจืกื•ืจ ืฉืœ HTML. ื”ืคืจื•ื™ืงื˜ ื›ืœืœ: 1. ืคื™ืชื•ื— ืฉืœ ืฉื™ืจื•ืช ืชืžื™ื›ื” ื‘ื”ืขืชืงืช ื“ืคื™ ืื™ื ื˜ืจื ื˜, ื•ืื—ืกื•ืŸ ืฉืœ ื›ืœ ื”ื ื›ืกื™ื (assets) ื‘ื‘ืงื˜ ืฉืœ S3. 2. ืคื™ืชื•ื— ืฉืœ ืฉื™ืจื•ืช ื”ื™ื›ื•ืœ ืœื–ื—ื•ืœ ื‘ืืชืจื™ ืžืกื—ืจ ืืœืงื˜ืจื•ื ื™ื™ื ื•ืœื‘ื—ื•ืจ ืคืจื™ื˜ื™ ืžื™ื“ืข ืžืกื•ื™ื™ืžื™ื ืžื“ืคื™ ืžื•ืฆืจื™ื, ืœื“ื•ื’ืžื: ืฉื ืžื•ืฆืจ, ืžื—ื™ืจ, ืชืžื•ื ื•ืช, ืชื™ืื•ืจ ื•ื›ื•'. (ื”ืฉื™ืจื•ืช ืฆืจื™ืš ืœืชืžื•ืš ื‘ื›ืœ ืกื•ื’ื™ ืืชืจื™ ื”ืžืกื—ืจ ื”ืืœืงื˜ืจื•ื ื™). ื”ืงื•ื“ ื›ื•ืœื• ื ื›ืชื‘ ื‘ Go. ื‘ื•ืื• ื ืžืฉื™ืš ื•ื ืจืื” ืืช ื”ื—ืœืงื™ื ื”ืžืจื›ื–ื™ื™ื ื•ื”ืžืขื ื™ื™ื ื™ื ื‘ืคืจื•ื™ืงื˜. ืฉื™ืจื•ืช ื”ืขืชืงื” ื›ื“ื™ ืœื”ืขืชื™ืง ืืชืจ ื‘ืื•ืคืŸ ืžื™ื™ื“ื™, ื‘ื—ืจื ื• ื‘ื“ืจืš ื”ืคืขื•ืœื” ื”ื‘ืื”: 1. ืœื”ื•ืจื™ื“ ืืช ืงื•ื‘ืฅ ื”- HTML ืฉืœ ื”ืขืžื•ื“ 2. ืœืฉืžื•ืจ ืืช ื”-HTML ื‘ื–ื™ื›ืจื•ืŸ ืžื˜ืžื•ืŸ ื‘ืจื“ื™ืก 3. ืœืคืจืกืจ ืืช ื”-HTML ืœืขืฅ ื”-DOM ืฉื ื™ืชืŸ ืœื”ืคื ื•ืช ืืœื™ื• ื‘ืงืœื•ืช 4. ืœืขื‘ื•ืจ ืขืœ ืขืฅ ื”-DOM ื•ืœืฉืœื•ืฃ ืžืžื ื• assets ื›ืžื• ืงื™ืฉื•ืจื™ื, ืชืžื•ื ื•ืช, ืงื‘ืฆื™ JavaScript, ืงื‘ืฆื™ CSS ื•ื›ื•'. 5. ืœื”ืขื‘ื™ืจ ืืช ื”ื ื›ืกื™ื ื”ืืœื” ืœื–ื™ื›ืจื•ืŸ ืžื˜ืžื•ืŸ ื•ืœื”ืขืœื•ืช ืœื‘ืงื˜ S3 (ื‘ืžื™ื“ื” ื•ื”ืืชืจ ื™ืจื“, ื‘ืื•ืคืŸ ื–ื” ื™ื”ื™ื” ืœื ื• ืขื•ืชืง ืฉืœ ื›ืœ ื”ื ื›ืกื™ื). 6. ืœืฉืžื•ืจ ืืช ืชื›ื•ื ืช ื”-Etag ืฉืœ ื”ืื•ื‘ื™ื™ืงื˜ ื›ืš ืฉืื ื ืชืงืœ ื‘ื ื›ืก ื“ื•ืžื”, ืœื ื™ื”ื™ื” ืขืœื™ื ื• ืœื”ืขืœื•ืช ืžื—ื“ืฉ ืงื‘ืฆื™ื ืžื™ื•ืชืจื™ื. 7. ืœื”ื—ืœื™ืฃ ืงื™ืฉื•ืจื™ ื ื›ืกื™ื ืขื ื”-URL ื‘-S3 ืฉืœ ืขืฅ ื”-DOM. 8. ืœืฉืžื•ืจ ืืช ืขืฅ ื”-DOM ื‘ื—ื–ืจื” ื›ืžื—ืจื•ื–ืช HTML ื ื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘ื’ื™ืฉื” ื”ืžืกื•ืจืชื™ืช ื•ืœื”ืฉืชืžืฉ ื‘ืงืœื™ื™ื ื˜ ื”ื“ื™ืคื•ืœื˜ื™ื‘ื™ ืฉืœ golang ื›ื“ื™ ืœื”ื•ืจื™ื“ ืืช ืขืžื•ื“ ื”ืื™ื ื˜ืจื ื˜ ื›ืคื™ ืฉืžื•ืฆื’ ืœืžื˜ื”:
res, err := http.Get(link)
    if err != nil {
        log.Fatal(err)
    }
    content, err := ioutil.ReadAll(res.Body)
    res.Body.Close()
    if err != nil {
        log.Fatal(err)
    }
    html := string(content)
ืื‘ืœ ืื ื ืขืฉื” ืืช ื–ื” ื ืชืงืœ ื‘ืžื’ื‘ืœื”, ื”ืงืœื™ื™ื ื˜ ืœื ื™ื—ื›ื” ืœื˜ืขื™ื ืช ื›ืœ ื”ืคืจื™ื˜ื™ื ื•ื”ื ื›ืกื™ื ื‘ืขืžื•ื“, ื•ื–ื” ื™ื›ื•ืœ ืœื”ื•ื•ืช ื‘ืขื™ื” ื‘ืžืžืฉืง ืขื single-page applications (SPA) ืœื›ืŸ ื”ื—ืœื˜ื ื• ืœื”ืฉืชืžืฉ ื‘- Headless Browser. ื‘ื”ื•ืจื“ืช ืขืžื•ื“ ืขื "http.Get", ืงื•ื“ ื”- JavaScript ื”ืžื•ื’ื“ืจ ื‘ื“ืฃ ืื™ื ื• ืžื•ืคืขืœ, ื•ืœื›ืŸ ืœืคืขืžื™ื ื ื™ืชืŸ ืœืงื‘ืœ HTML ืจื™ืง (ื›ื™ ื‘-SPA, ื™ืฉ ืฆื•ืจืš ื‘- JavaScript ื›ื“ื™ ืœืจื ื“ืจ ืืช ื”ืชื•ื›ืŸ ืฉืœ ื”ื“ืฃ). ื—ื‘ื™ืœืช Rod ื”ื™ื ื—ื‘ื™ืœื” ืฉืœ golang ืฉื“ื•ืžื” ืœ- selenium ื•ืžืคืขื™ืœื” ื“ืคื“ืคืŸ ื‘ืžืฆื‘ headless. ื‘ืฉื™ืžื•ืฉ ื‘ ROD ืคื•ื ืงืฆื™ื™ืช ื”ื”ื•ืจื“ื” ื ืจืื™ืช ื›ืš:
func RodDownload(url_path string) string{
page := rod.New().MustConnect().MustPage(url_path)
  // set user agent header
  userAgentHeaderOverride := proto.NetworkSetUserAgentOverride{
   UserAgent: GetEnv("userAgent"),
  }
  page.SetUserAgent(&userAgentHeaderOverride)
  webPage := page.MustWaitLoad().MustHTML()

  // expire after 5 hours
  _, err = redis_conn.Do("SETEX", url_path, 18000, webPage)
  if err != nil {
   log.Fatal("error getting web page", err)
  }
  return webPage
]
ื—ื™ื™ื‘ื™ื ืœืฉืžื•ืจ ืืช ื”ื“ืฃ ืœืจื“ื™ืก ืื ื”ื“ืฃ ืื™ื ื• ืงื™ื™ื ืฉื ื›ื‘ืจ. ืื ื• ื ืฉืชืžืฉ ื‘-URL ื›ืžืคืชื— ื‘ืจื“ื™ืก:
func downloadWebPage(url_path string) string {
 var redis_url string
  redis_url = GetEnv("REDIS_URL")
 redis_conn, err := redis.Dial("tcp", redis_url)
 if err != nil {
  // don't proceed if conn to redis fails
  log.Fatal("error connecting to redis server", err)
 }

 defer redis_conn.Close()

 webPage, err := redis.String(redis_conn.Do("HGET", url_path, url_path))
 if err != nil {
  // if redis key is abscent, create one with new content
  webPage= RodDownload(url_path)

 }
 return webPage
}

ToCode
1 420
ืžืฉื—ืงื™ื ืขื ื—ื™ืฉื•ื‘ ืžืงื‘ื™ืœื™ ื‘ืกืงืืœื” ืื—ืช ื”ื‘ืขื™ื•ืช ืฉืœ ืขื‘ื•ื“ื” ืœื ืžื‘ื•ืกืกืช Java ื‘ืชื•ืš ื” JVM ื”ื™ื ืฉื™ืฉ ื™ื•ืชืจ ืžื“ื™ ื“ืจื›ื™ื ืœืขืฉื•ืช ื“ื‘ืจื™ื, ื•ืœื ืชืžื™ื“ ื‘ืจื•ืจ ื‘ืžื” ืœื‘ื—ื•ืจ. ื‘ืžืงืจื” ืฉืœ ืกืงืืœื” ื•ืžืงื‘ื™ืœื™ื•ืช ื–ื” ื ื”ื™ื” ืžืกื•ื‘ืš ื›ื™ ื™ืฉ ื’ื ืฉื™ืงื•ืœื™ื ืฉืœ ืืจื›ื™ื˜ืงื˜ื•ืจื” ื•ืชื›ื ื•ืช ืคื•ื ืงืฆื™ื•ื ืืœื™. ื‘ืฉื‘ื™ืœ ื”ืžืฉื—ืง ืจืฆื™ืชื™ ืœืกืคื•ืจ ื›ืžื” ืžืกืคืจื™ื ืจืืฉื•ื ื™ื™ื ื™ืฉ ืขื“ 10 ืžื™ืœื™ื•ืŸ, ื•ืœืคืฆืœ ืืช ื”ื—ื™ืฉื•ื‘ ืœื›ืžื” ืชื”ืœื™ื›ื•ื ื™ื ืชื•ืš ืฉื™ืžื•ืฉ ื‘ืฉืชื™ ื’ื™ืฉื•ืช ืคืฉื•ื˜ื•ืช ืœืžืงื‘ื™ืœื™ื•ืช ื•ื‘ื”ืฉื•ื•ืื” ืขื ื—ื™ืฉื•ื‘ ืกื“ืจืชื™. ื”ื’ื™ืฉื” ื”ืžืงื‘ื™ืœื™ืช ื”ืจืืฉื•ื ื” ื”ื™ืชื” ืคืฉื•ื˜ ืœืคืชื•ื— Future ืœื›ืœ ืžืกืคืจ ื›ื“ื™ ืœื–ื”ื•ืช ืื ื”ื•ื ืจืืฉื•ื ื™, ื•ืœืชืช ืœ Java ืœืฉื’ืจ ืืช ื”ืชื”ืœื™ื›ื•ื ื™ื. ื”ื’ื™ืฉื” ื”ืžืงื‘ื™ืœื™ืช ื”ืฉื ื™ื” ื”ื™ืชื” ื”ืกืคืจื™ื” parallel-collections ืฉืžืฆื™ืขื” ืžื™ืžื•ืฉ ืฉืœ map ืžืงื‘ื™ืœื™. ื•ื›ืŸ ื ืฆื˜ืจืš ืœืขืฉื•ืช ืคื•ืกื˜ ื”ืžืฉืš ืขื cats-effect. ื˜ื•ื‘ ืงื•ื“? ื™ืืœืœื”. ื–ืืช ื”ืชื•ื›ื ื™ืช:
import scala.concurrent.{Await, ExecutionContext, Future}
import scala.util.Random
import concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import java.net.{URI, URL}
import java.util.concurrent.{CompletableFuture, Executors}
import scala.language.implicitConversions
import scala.util.chaining._
import scala.collection.parallel.CollectionConverters._


object futures {

  private def isPrime(n: Int): Boolean =
    2.to(Math.sqrt(n.toDouble).toInt).forall(n % _ != 0)

  @main
  def virtualThreadsDemo(): Unit =
    val s0 = System.nanoTime()
    1.to(10000000)
      .map(n => Future { isPrime(n) })
      .map(Await.result(_, Duration.Inf))
      .count(identity)
      .pipe(println)

    val s1 = System.nanoTime()

    1.to(10000000)
      .map(isPrime)
      .count(identity)
      .pipe(println)

    val s2 = System.nanoTime()

    1.to(10000000)
      .par
      .map(isPrime)
      .count(identity)
      .pipe(println)

    val s3 = System.nanoTime()

    println(s"1 thread = ${s2 - s1}")
    println(s"* thread = ${s1 - s0}")
    println(s"pmap     = ${s3 - s2}")
}
ื•ื›ืŸ ื‘ืฉื‘ื™ืœ ื”ืžืฉื—ืง ื›ืชื‘ืชื™ ืื•ืชื” ื’ื ื‘ืคื™ื™ืชื•ืŸ ื›ื“ื™ ืฉื ื•ื›ืœ ืœื”ืฉื•ื•ืช ื–ืžื ื™ื:
import time
import multiprocessing
import math

def isprime(n):
    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True

if __name__ == "__main__":
    pool = multiprocessing.Pool(5)

    s0 = time.time_ns()
    print(sum(pool.map(isprime, range(10_000_000))))
    s1 = time.time_ns()
    print(s1 - s0)

ื•ื”ืชื•ืฆืื•ืช ืœืคื—ื•ืช ืืฆืœื™ ืขืœ ื”ืžื—ืฉื‘:
1 thread = 2025199791
* thread = 3463589500
pmap     = 674844834
python   = 14593734000
ืœื ืกื™ืคืจืชื™ ืงื•ื“ื ืื‘ืœ ื ื™ืกื™ืชื™ ื’ื ืœื”ื—ืœื™ืฃ ืืช ื” Executor ืฉืžืจื™ืฅ ืืช ื” Threads ืœื›ื–ื” ืฉืžืฉืชืžืฉ ื‘ Virtual Threads ืฉืœ Java ืื‘ืœ ื”ืชื•ืฆืื•ืช ืœื ืขืฉื• ื—ืฉืง ืœื“ื‘ืจ ืขืœ ื–ื” ืื– ืงื‘ืจืชื™ ืืช ื”ื ื™ืกื•ื™. ืžื” ืœืžื“ืชื™? 1. ื—ื™ืฉื•ื‘ื™ื ื‘ืคื™ื™ืชื•ืŸ ืขื•ื‘ื“ื™ื ืœืื˜. ื’ื ื›ืฉื ื™ืกื™ืชื™ ืœื”ืจื™ืฅ ืืช ื”ืชื•ื›ื ื™ืช ื‘ืคื™ื™ืชื•ืŸ ื‘ืœื™ multiprocessing ื–ื” ืœื ืขื–ืจ. 2. ืื™ ืืคืฉืจ ืกืชื ืœื™ืฆื•ืจ Thread ืœื›ืœ ืžืกืคืจ. ื›ื›ืœ ืฉื”ืžืฉื™ืžื” ืžืกื•ื‘ื›ืช ืฉื•ื•ื” ืœื”ืฉืงื™ืข ื–ืžืŸ ื•ืœื—ืฉื•ื‘ ืื™ืš ืœื—ืœืง ืื•ืชื” ืœืžืกืคืจ ืชื”ืœื™ื›ื•ื ื™ื. 3. ืœื ืกืชื ื‘ื—ืจืชื™ 10 ืžื™ืœื™ื•ืŸ. ื‘ืžืกืคืจื™ื ืงื˜ื ื™ื ื™ื•ืชืจ (ืืคื™ืœื• ืžื™ืœื™ื•ืŸ) ื›ืžืขื˜ ืœื ื”ื™ื” ื”ื‘ื“ืœ ื‘ื™ืŸ ืชื”ืœื™ื›ื•ืŸ ืื—ื“ ืœืžืกืคืจ ืชื”ืœื™ื›ื•ื ื™ื. ื—ืฉื•ื‘ ืœื”ื‘ื™ืŸ ื˜ื•ื‘ ืืช ื”ืžืฉื™ืžื” ืœืคื ื™ ืฉื‘ื•ื ื™ื ืคื™ืชืจื•ืŸ ืžื‘ื•ืกืก ืชื”ืœื™ื›ื•ื ื™ื ื›ื“ื™ ืœื ืœืขืฉื•ืช "ืื•ืคื˜ื™ืžื™ื–ืฆื™ื•ืช" ืžื™ื•ืชืจื•ืช.

ToCode
1 420
ื”ืžืื–ื ื™ื™ื ืฉืœ AI ื•ืงื•ื“ ืžืฆื“ ืื—ื“ AI ืžืืคืฉืจ ืœื›ืชื•ื‘ ืงื•ื“ ืžื”ืจ ื™ื•ืชืจ, ื•ืžืฆื“ ืฉื ื™ AI (ื”ื™ื•ื) ืœื ื™ื•ื“ืข ืœื”ืฆื™ืข ืื‘ืกื˜ืจืงืฆื™ื•ืช ืฉื™ื•ื‘ื™ืœื• ืœื›ืชื™ื‘ืช ืคื—ื•ืช ืงื•ื“. ืจืง ื›ืฉื ื‘ื™ืŸ ืืช ื–ื” ื ื•ื›ืœ ืœืจืื•ืช ืœืžื” ืžืชื›ื ืชื™ื ืžืกื™ื™ืžื™ื ืžืฉื™ืžื•ืช ืžื”ืจ ื™ื•ืชืจ ืขื ืงื•ืคื™ื™ืœื•ื˜. ื›ื‘ืจ ื”ืชืจื’ืœื ื• ืœื”ืกืชื›ืœ ืขืœ ืงื•ื“ ืงื™ื™ื ื‘ืชื•ืจ ื ื˜ืœ, ื•ืœื—ืœื•ื ืขืœ ืคืจื•ื™ืงื˜ื™ Green Fields, ื•ื”ื ื” ืžื’ื™ืข ื” AI ื•ืžืชื—ื™ืœ ืชืžื™ื“ ืžืืคืก, ื•ืžืจืื” ืœื ื• ืฉืื™ืŸ ืฉื•ื ื‘ืขื™ื” ืœื”ืจื™ื ืžืืคืก ื“ืฃ ื ื—ื™ืชื” ื‘ืœื™ ืœืงื—ืช ืืช ื” CSS-ื™ื ืฉืœ ื”ืคืจื•ื™ืงื˜ (ื›ื™ ื”ื•ื ื›ื‘ืจ ื™ืขืฆื‘ ื•ื™ื›ืชื•ื‘ CSS), ืื• ืœื”ื•ืกื™ืฃ ืขื•ื“ ืฉืœื™ืคื” ืžื‘ืกื™ืก ื”ื ืชื•ื ื™ื ื‘ืœื™ ืœื”ืฉืชืžืฉ ื‘ืื‘ืกื˜ืจืงืฆื™ื•ืช ืฉื›ื‘ืจ ืงื™ื™ืžื•ืช ื‘ืงื•ื“, ื›ื™ ื”ืŸ ืœื ื‘ื“ื™ื•ืง ืžืชืื™ืžื•ืช ืœ Use Case ื”ื ื•ื›ื—ื™. ื”ื‘ืขื™ื” ืฉืจืง ืœื”ื•ืกื™ืฃ ืงื•ื“ ื–ื• ืœื ืืกื˜ืจื˜ื’ื™ื” ื˜ื•ื‘ื” ืขื‘ื•ืจ Senior Developers. ื–ื” ืžืขื’ืœ ืฉื˜ื ื™ ืฉื’ื•ืจื ืœืงื•ื“ ืœื”ื™ื•ืช ื™ื•ืชืจ ืงืฉื” ืœืชื—ื–ื•ืงื” ืœืื•ืจืš ื–ืžืŸ, ื•ื”ืงื•ืคื™ื™ืœื•ื˜ ื‘ืชื•ืจื• ืžืชืขืœื ืžื”ืงื•ืฉื™ ื•ืžืžืฉื™ืš ืœืกื‘ืš ืืช ื”ืžืขืจื›ืช ืขื“ ืฉื›ื‘ืจ ืื™ ืืคืฉืจ ื™ื”ื™ื” ื™ื•ืชืจ ืœื”ื™ืขื–ืจ ื‘ื•. ื”ื”ื‘ื ื” ื”ื–ืืช ื”ื™ื ื”ืžืคืชื— ืœืžืขื‘ืจ ืžื’'ื•ื ื™ื•ืจื™ื ืœืกื ื™ื•ืจื™ื. ื’'ื•ื ื™ื•ืจื™ื ืžื—ืคืฉื™ื ืœืคืชื•ืจ ื‘ืขื™ื•ืช, ืกื ื™ื•ืจื™ื ืžื—ืคืฉื™ื ืœื‘ื ื•ืช ืื‘ืกื˜ืจืงืฆื™ื•ืช ื›ื“ื™ ืฉื™ื”ื™ื” ืงืœ ื™ื•ืชืจ ืœืคืชื•ืจ ื‘ืขื™ื•ืช ื‘ืขืชื™ื“.

ToCode
1 420
ื”ื™ื•ื ืœืžื“ืชื™: ื ืงื•ื“ื” ื‘ืคื•ืœื™ื’ื•ืŸ ื•ืคื™ืชืจื•ืŸ AoC 2023 ื™ื•ื 10 ื—ืœืง 2 ื‘ืกืงืืœื” ืœืคื ื™ ืฉื‘ื•ืข ืคืจืกืžืชื™ ื›ืืŸ ืืช ื”ืคื™ืชืจื•ืŸ ืฉืœ ื”ื—ืœืง ื”ืจืืฉื•ืŸ ืฉืœ ื™ื•ื 10 ืž Advent Of Code ื”ืื—ืจื•ืŸ ื‘ืกืงืืœื”, ื‘ื• ืจืื™ื ื• ืื™ืš ืœืžืฆื•ื ืžืขื’ืœ ื‘ื’ืจืฃ ื‘ืืžืฆืขื•ืช DFS. ื”ื—ืœืง ื”ืฉื ื™ ืฉืœ ื”ืชืจื’ื™ืœ ื”ืฆื™ื’ ื‘ืขื™ื” ืžืขื ื™ื™ื ืช ืฉื ืงืจืืช Point In Polygon. ื‘ื•ืื• ื ืจืื” ืื™ืš ื–ื” ืขื•ื‘ื“ ื•ืื™ืš ืœืคืชื•ืจ ืื•ืชื” ืขื ืืœื’ื•ืจื™ืชื Ray Casting. ื”ืืชื’ืจ - ื—ื™ืคื•ืฉ ื ืงื•ื“ื•ืช ื‘ืชื•ืš ื”ืžืขื’ืœ ื‘ื—ืœืง ื”ืจืืฉื•ืŸ ืฉืœ ื”ืชืจื’ื™ืœ ืจืื™ื ื• ืื™ืš ืœืžืฆื•ื ืžืขื’ืœ ื‘ื’ืจืฃ, ืœื“ื•ื’ืžื” ื’ื™ืœื™ื ื• ืืช ื”ืžืขื’ืœ ื”ื–ื”:
...........
.S-------7.
.|F-----7|.
.||.....||.
.||.....||.
.|L-7.F-J|.
.|..|.|..|.
.L--J.L--J.
...........
ื”ืืชื’ืจ ื‘ื—ืœืง ื”ืฉื ื™ ื”ื•ื ืœืžืฆื•ื ืืช ื›ืœ ื”ื ืงื•ื“ื•ืช ืฉื ืžืฆืื•ืช ื‘ืชื•ืš ื”ืžืขื’ืœ - ื‘ื“ื•ื’ืžื” ื”ื–ืืช ืืœื” 4 ื”ื ืงื•ื“ื•ืช ืฉืžืกื•ืžื ื•ืช ื‘ I ื›ืืŸ:
...........
.S-------7.
.|F-----7|.
.||OOOOO||.
.||OOOOO||.
.|L-7OF-J|.
.|II|O|II|.
.L--JOL--J.
.....O.....
ื”ืืœื’ื•ืจื™ืชื Ray Casting ืื ื™ ื—ื™ื™ื‘ ืœื”ื•ื“ื•ืช ืฉื‘ืžื‘ื˜ ืจืืฉื•ืŸ ืขืœ ื”ืชืจื’ื™ืœ ืœื ื”ื™ื” ืœื™ ืžื•ืฉื’ ืื™ืš ืœื’ืฉืช ืืœื™ื• ื•ื”ื™ื™ืชื™ ืฆืจื™ืš ืœื—ืคืฉ ืงืฆืช ื‘ืจืฉืช ืจืขื™ื•ื ื•ืช ืขื“ ืฉื”ื’ืขืชื™ ืœื“ืฃ ื‘ื•ื™ืงื™ืคื“ื™ื” ืฉืžืกื‘ื™ืจ ืขืœ ื”ื‘ืขื™ื”. ื‘ื’ื“ื•ืœ ืื ื—ื ื• ืจื•ืฆื™ื ืœื—ืฉื•ื‘ ืขืœ ื”ืฆื•ืจื” ื”ืžืขื’ืœื™ืช ืฉืœื ื• ื‘ืชื•ืจ ืคื•ืœื™ื’ื•ืŸ, ื•ืื– ืžื›ืœ ื ืงื•ื“ื” ืืคืฉืจ ืœื“ืžื™ื™ืŸ ืงื• ืฉื™ื•ืฆื ืžื”ื ืงื•ื“ื” ืฉืžืืœื” ืขื“ ื”ืงืฆื”. ืื ื ืกืคื•ืจ ื›ืžื” ืคืขืžื™ื ื”ืงื• ื”ื–ื” ืžืชื ื’ืฉ ืขื ื”ืฆื•ืจื” ืฉืœื ื• ื ื•ื›ืœ ืœื“ืขืช ืื ื”ื ืงื•ื“ื” ื ืžืฆืืช ื‘ืชื•ืš ื”ืžืขื’ืœ ืื• ื‘ื—ื•ืฅ. ื ืงื•ื“ื” ืฉื”ืงื• ืฉื™ื•ืฆื ืžืžื ื” ืฉืžืืœื” ืžืชื ื’ืฉ ืขื ื”ืžืขื’ืœ ืžืกืคืจ ืื™ ื–ื•ื’ื™ ืฉืœ ืคืขืžื™ื ื ืžืฆืืช ื‘ืชื•ืš ื”ืžืขื’ืœ (ื•ืื ื”ืชื™ืื•ืจ ืคื” ืœื ื”ื™ื” ืžืกืคื™ืง ืžื•ื‘ืŸ ื ืกื• ืœืงืจื•ื ืืช ื”ื”ืกื‘ืจ ื‘ื•ื™ืงื™ืคื“ื™ื” ื”ื ืžืžืฉ ืžื“ื•ื™ืงื™ื ืฉื ื•ื’ื ื™ืฉ ืฆื™ื•ืจ). ื”ืืชื’ืจ ื”ื™ื—ื™ื“ ืฉื™ืฉ ื›ืืŸ ื‘ืžื™ืžื•ืฉ ื”ื•ื ืœื”ื‘ื™ืŸ ืžืชื™ ื”ืงื• ื™ืชื ื’ืฉ ืขื ื”ืžืขื’ืœ - ืœืžืฉืœ ืื ื ื—ืฉื•ื‘ ืขืœ ืฉื•ืจื” ื›ื–ืืช:
|F|F-JF---7F7-L7L|7|
ืื– ื” F ื•ื” J ื”ืจืืฉื•ื ื™ื ืžื™ื™ืฆืจื™ื ื”ืชื ื’ืฉื•ืช ื›ื™ ื”ืžืขื’ืœ ื”ื•ืœืš ืžืœืžื˜ื” ืœืžืขืœื”, ืื‘ืœ ื” F ื•ื” 7 ืฉืื—ืจื™ื”ื ืœื ืฆืจื™ื›ื™ื ืœื”ื™ืกืคืจ ื›ื™ ื”ืžืขื’ืœ ืžื’ื™ืข ืžืœืžื˜ื” ื•ื™ื•ืจื“ ื—ื–ืจื” ืœืžื˜ื”, ื•ืœื›ืŸ ื‘ืงื•ื“ ืฉืžื—ืคืฉ ื”ืชื ื’ืฉื•ื™ื•ืช ืฆืจื™ืš ืœื‘ื—ื•ืจ ื‘ื›ืœ ืฆืžื“ ื›ื–ื” ืฉืœ F ื• J ืื• 7 ื• L ืืช ืžื™ ืœืกืคื•ืจ. ืื ื™ ืกืคืจืชื™ ืืช ื” L ื•ืืช ื” J ืื‘ืœ ืืคืฉืจ ื”ื™ื” ืœืกืคื•ืจ ื’ื ืืช ื” F ื•ื” 7 ื•ืœืงื‘ืœ ืืช ืื•ืชื” ืชื•ืฆืื”. ืงื•ื“? ื‘ืจื•ืจ ื‘ืฉื‘ื™ืœ ื–ื” ื‘ืื ื•. ืื—ืจื™ ื›ืœ ื”ื—ืคื™ืจื” ื”ืคื•ื ืงืฆื™ื” ืฉื‘ื•ื“ืงืช ืื ื ืงื•ื“ื” ื ืžืฆืืช "ื‘ืชื•ืš" ื”ืžืขื’ืœ ื”ื™ื ื‘ืกืš ื”ื›ืœ:
  def insideLoop(point: (Int, Int),
                 loop: Set[(Int, Int)],
                 map: Map[(Int, Int), Char]): Boolean =
    val crossings = point._2
      .to(0, -1)
      .map(c => (point._1, c))
      .filter(p => loop.contains(p))
      .map(map(_))
      .count(Set('|', 'L', 'J').contains(_))
    !loop.contains(point) && crossings % 2 == 1

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

ToCode
1 420
ืื™ืš ืœืชื—ื–ืง ืคืจื•ื™ืงื˜ ืฉื›ืžืขื˜ ืœื ืฆืจื™ืš ืฉื™ื ื•ื™ื™ื ืื™ืŸ ืกืคืง ืฉืคื™ืชื•ื— ืžืขืจื›ืช ื”ื•ื ืืชื’ืจ ื’ื“ื•ืœ, ืื‘ืœ ื›ืฉืžืคืชื—ื™ื ืžืขืจื›ืช ื™ื•ื ื™ื•ื ื•ืฉืขื” ืฉืขื” ื™ืฉ ื’ื ื™ื™ืชืจื•ืŸ - ืืคืฉืจ ืœื”ื—ื–ื™ืง ืืช ื”ื›ืœ (ืื• ื”ืจื•ื‘) ื‘ืจืืฉ ื•ื”ื›ืœื™ื ื–ืžื™ื ื™ื. ืฉืจืช ื”ืคื™ืชื•ื— ื›ื‘ืจ ื‘ืื•ื•ื™ืจ, ืฉืจืช ื”ื‘ื“ื™ืงื•ืช ืจืฅ, ื‘ื™ืฆืขืช ื›ื‘ืจ ื”ืชื—ื‘ืจื•ืช ืœืžืกืš ื” admin ื•ื›ืœ ื”ืกืคืจื™ื•ืช ื‘ื’ื™ืจืกืื•ืช ื”ื—ื“ืฉื•ืช ื‘ื™ื•ืชืจ. ื‘ืคืจื•ื™ืงื˜ Legacy, ื‘ื ื•ืกืฃ ืœืืชื’ืจ ืฉืœ ืคื™ืชืจื•ืŸ ื‘ืขื™ื” ืกืคืฆื™ืคื™ืช ื™ืฉ ืขื•ื“ ื”ืžื•ืŸ ืืชื’ืจื™ื ืฉืงืฉื•ืจื™ื ืœืขื•ื‘ื“ื” ืฉืืฃ ืื—ื“ ืœื ื ื’ืข ื‘ืงื•ื“ ื›ืžื” ื—ื•ื“ืฉื™ื ืื• ืฉื ื™ื: 1. ื”ืงื•ื“ ืœื ืจืฅ. ื’ื ืœื ืžืชืงืžืคืœ. 2. ืื™ืŸ ืœื™ ืžื•ืฉื’ ืžื” ื”ืกื™ืกืžื” ืœืžืกืš ื”ื ื™ื”ื•ืœ ืขืœ ืฉืจืช ื”ื‘ื“ื™ืงื•ืช. ื”ื™ื ื”ื™ืชื” ืฉืžื•ืจื” ืœื™ ืื™ืคืฉื”ื• ืื‘ืœ ื›ื‘ืจ ืžื–ืžืŸ ืฉื›ื—ืชื™ ืื™ืคื”. 3. ื”ืชื™ืขื•ื“ ื‘ืจืฉืช ืœื ืจืœื•ื•ื ื˜ื™ ื›ื™ ื”ืคืจื•ื™ืงื˜ ืžืฉืชืžืฉ ื‘ืกืคืจื™ื•ืช ื™ืฉื ื•ืช. 4. ืื™ืŸ ืœื™ ืžื•ืฉื’ ืžื” ื”ืชืคืงื™ื“ ืฉืœ ื›ืœ ื—ืœืง ื‘ืงื•ื“ ืื• ืื™ืคื” ืœืžืฆื•ื ืืช ื”ื—ืœืงื™ื ืฉืื ื™ ืฆืจื™ืš ืœืขื“ื›ืŸ. ืืคืฉืจ ืœื ืกื•ืช ืœืคืชื•ืจ ืืช ืจื•ื‘ ื”ื‘ืขื™ื•ืช ื›ืืŸ ืขื ื›ืชื™ื‘ืช ืงื‘ืฆื™ ืชื™ืขื•ื“ ื•ืื•ืœื™ ืืชื ื™ื•ืชืจ ื˜ื•ื‘ื™ื ืžืžื ื™ ื‘ื›ืชื™ื‘ืช ืงื‘ืฆื™ื ื›ืืœื”, ืื‘ืœ ืœืคื—ื•ืช ื‘ืžืงืจื” ืฉืœื™ ืื ื™ ืžืฆืœื™ื— ืœื›ืชื•ื‘ ืงื‘ืฆื™ ืชื™ืขื•ื“ ืื‘ืœ ืืฃ ืคืขื ืœื ื–ื•ื›ืจ ืœืคืชื•ื— ืื•ืชื ื›ืฉืฆืจื™ืš ืžืฉื”ื• ื•ื›ื›ื” ืžืฆื˜ื‘ืจื™ื ืœื™ ื”ืžื•ืŸ ืงื‘ืฆื™ ืชื™ืขื•ื“ ืœื ืจืœื•ื•ื ื˜ื™ื™ื. ืžื” ื›ืŸ ืขื•ื‘ื“ ืœื™- 1. ื™ืฆื™ืจืช ืžื ื’ื ื•ืŸ ื”ืจืฆื” ืกื˜ื ื“ืจื˜ื™, ื’ื ืœืคืจื•ื™ืงื˜ื™ื ื™ืฉื ื™ื - ื›ืœื•ืžืจ ืฆืจื™ืš ืœื•ื•ื“ื ืฉ npm start ืื• docker compose up ืขื•ื‘ื“ื™ื ื•ืžืขืœื™ื ืืช ื”ืกื‘ื™ื‘ื”. ื–ื” ืชืžื™ื“ ืฉื•ื•ื” ืืช ื”ื”ืฉืงืขื”. 2. ื›ืœ ืคืขื ืฉืื ื™ ืžื’ื™ืข ืœืฉื ื•ืช ืงื•ื“ ื•ืœื ืžื‘ื™ืŸ ืžืฉื”ื• ื‘ืงื•ื“ ื™ืฉืŸ ืื ื™ ืžื•ืกื™ืฃ ืชื™ืขื•ื“ ืขืœ ืื•ืชื” ืคื•ื ืงืฆื™ื” ืฉืžืกื‘ื™ืจ ืžื” ื”ื™ื ืขื•ืฉื” ื•ืœืžื”. ืœืื˜ ืœืื˜ ืชื™ืขื•ื“ ื ื›ืชื‘ ื•ืœืื•ืจืš ืฉื ื™ื ื™ื•ืชืจ ืงืœ ืœื™ ืœืชืงืŸ ื‘ืขื™ื•ืช. 3. ืœื’ื‘ื™ ื‘ื“ื™ืงื•ืช - ื”ื™ืชืจื•ืŸ ืฉืœ ื‘ื“ื™ืงื” ืขืœ ืชื™ืขื•ื“ ื”ื•ื ืฉืืคืฉืจ ืœื”ืจื™ืฅ ื‘ื“ื™ืงื”. ื”ื—ื™ืกืจื•ืŸ ืฉืื ืœื ื”ืจืฆืช ื‘ื“ื™ืงื” ื—ืฆื™ ืฉื ื” ื™ืฉ ืœื” ืกื™ื›ื•ื™ ื˜ื•ื‘ ืœื”ื™ื›ืฉืœ. ืื ืืชื ืžืฆืœื™ื—ื™ื ื–ื” ืžืื•ื“ ืขื•ื–ืจ ืฉื™ืฉ ื’ื™ื˜ื”ืื‘ ืืงืฉืŸ ืฉืžืจื™ืฅ ืืช ื”ื‘ื“ื™ืงื•ืช ืคืขื ื‘ืฉื‘ื•ืข. ื—ื™ื™ื‘ ืœื”ื•ื“ื•ืช ืฉืœื ื‘ื›ืœ ื”ืคืจื•ื™ืงื˜ื™ื ื”ื™ืฉื ื™ื ืฉืœื™ ืื ื™ ืžืฆืœื™ื— ืœืฉืžืจ ืืช ื–ื”. 4. ื‘ืขื™ื” ื ื•ืกืคืช ืขื ืคืจื•ื™ืงื˜ื™ื ื™ืฉื ื™ื ื”ื™ื ืžืขืงืคื™ื ืงื˜ื ื™ื ืฉืื ื—ื ื• ืฉืžื™ื ื›ื™ ื—ื™ื™ื‘ื™ื ืœืชืงืŸ ื‘ืื’ ื“ื—ื•ืฃ ื‘ืคืจื•ื“ืงืฉืŸ ื•ืื™ืŸ ื‘ืืžืช ื–ืžืŸ ืœืขืฉื•ืช ืืช ื–ื” ื ื›ื•ืŸ. ื•ื›ื›ื” ืื ื—ื ื• ืจื•ืื™ื ืฉื™ื ื•ื™ื™ ืงื•ื“ ืขืœ ืžื›ื•ื ืช ื”ืคืจื•ื“ืงืฉืŸ ืฉืœื ืžื’ื™ืขื™ื ืœื’ื™ื˜, ื‘ืžื™ื•ื—ื“ ื‘ืžืขืจื›ื•ืช ื•ื•ื‘ ืฉื ืœื ืฆืจื™ืš ืœืงืžืคืœ ืืช ื”ืคืจื•ื™ืงื˜. ืื•ืžื ื ืœื ื”ืฆืœื—ืชื™ ืœื’ืžืจื™ ืœืžื’ืจ ืืช ื”ืชื•ืคืขื” ื”ื–ืืช, ืื‘ืœ ื›ืŸ ืืคืฉืจ ืœื ืกื•ืช ื›ืœ ืคืขื ืฉืจื•ืื™ื ื“ื‘ืจ ื›ื–ื” ืคืฉื•ื˜ ืœืขืฉื•ืช ืงื•ืžื™ื˜ ืœืฉื™ื ื•ื™ ื’ื ืื ืื™ืŸ ืœืš ื”ื•ื“ืขืช ืงื•ืžื™ื˜ ืžื“ื•ื™ืงืช ืœื›ืชื•ื‘, ืจืง ื‘ืฉื‘ื™ืœ ืฉื”ื‘ืŸ ืื“ื ื”ื‘ื ืœื ื™ื™ื‘ื”ืœ. ื™ืฉ ืœื›ื ืขื•ื“ ื˜ื™ืคื™ื ืœืชื—ื–ื•ืงืช ืคืจื•ื™ืงื˜ื™ื ืคืขื ื‘ื›ืžื” ื—ื•ื“ืฉื™ื? ืืœ ืชืชื‘ื™ื™ืฉื• ืœืฉืชืฃ ื‘ืชื’ื•ื‘ื•ืช.

ToCode
1 420
ื‘ืกืงืืœื” ื–ื” ืœื ื”ื™ื” ืงื•ืจื” (ืื•: ืžื” ื—ื“ืฉ ื‘ื˜ื™ื™ืคืกืงืจื™ืคื˜ 5.4) ื”ืฉื™ื ื•ื™ ื”ืจืืฉื•ืŸ ื‘ืจืฉื™ืžืช ื”ื—ื™ื“ื•ืฉื™ื ืฉืœ ื˜ื™ื™ืคืกืงืจื™ืคื˜ 5.4 ื”ื•ื ืฉื˜ื™ื™ืคืกืงืจื™ืคื˜ ืชืชื—ื™ืœ ืœืฉืžื•ืจ ืžืกืงื ื•ืช ืขืœ ื˜ื™ืคื•ืกื™ื ืœืชื•ืš Closures, ืื• ื‘ื“ื•ื’ืžื”, ื”ืงื•ื“ ื”ื‘ื ื›ื‘ืจ ื™ืชืงืžืคืœ ื‘ืœื™ ืฉื’ื™ืื•ืช:
function getUrls(url: string | URL, names: string[]) {
    if (typeof url === "string") {
        url = new URL(url);
    }

    return names.map(name => {
        url.searchParams.set("name", name)
        //  ~~~~~~~~~~~~
        // error!
        // Property 'searchParams' does not exist on type 'string | URL'.

        return url.toString();
    });
}
ื–ื• ืชื‘ื ื™ืช ืžื•ื›ืจืช ื‘ JavaScript ืฉืžื˜ืจืชื” "ืœืกื“ืจ" ืืช ื”ืžืฉืชื ื™ื ืœืคื ื™ ืฉืžืžืฉื™ื›ื™ื. ื‘ื“ื•ื’ืžื” ืฉืœื ื• ื”ืคื•ื ืงืฆื™ื” ื™ื›ื•ืœื” ืœืงื‘ืœ ืžื—ืจื•ื–ืช ืื• ืื•ื‘ื™ืงื˜ URL, ื›ื“ื™ ืฉื™ื”ื™ื” ื ื•ื— ืœืื ืฉื™ื ืœื”ืคืขื™ืœ ืื•ืชื”, ืื‘ืœ ื‘ืชื•ืš ืงื•ื“ ื”ืคื•ื ืงืฆื™ื” ื™ื•ืชืจ ืงืœ ืœื ื• ืœืขื‘ื•ื“ ืขื ืื•ื‘ื™ืงื˜ื™ URL ื•ืœื›ืŸ ื‘ืชื—ื™ืœืช ื”ืคื•ื ืงืฆื™ื” ื‘ื•ื“ืงื™ื ืื ื”ืชืงื‘ืœื” ืžื—ืจื•ื–ืช ื•ืื ื›ืŸ ืžืžื™ืจื™ื ืœ URL. ื’ื™ืจืกืื•ืช ืงื•ื“ืžื•ืช ืฉืœ ื˜ื™ื™ืคืกืงืจื™ืคื˜ ืœื ืงื™ืฉืจื• ืืช ื”ืžืฉืชื ื” url ืฉื‘ืชื•ืš ื”ืคื•ื ืงืฆื™ื” ื”ืคื ื™ืžื™ืช ืœืฉื™ื ื•ื™ ืฉื‘ื•ืฆืข ื‘ืชื—ื™ืœืช ื”ืคื•ื ืงืฆื™ื” ื”ื—ื™ืฆื•ื ื™ืช, ื•ืœื›ืŸ ื‘ืชื•ืš ื”ืคื•ื ืงืฆื™ื” ื”ืคื ื™ืžื™ืช ื”ื™ื” ืฆืจื™ืš ืœื‘ืฆืข ืืช ื”ื‘ื“ื™ืงื” ืคืขื ื ื•ืกืคืช ืื• ืœื‘ืฆืข ื”ืžืจื” ื™ื–ื•ืžื” (ืื• ืœื”ืชืขืœื ืžื”ืฉื’ื™ืื”). ื”ื—ืœ ืžื’ื™ืจืกื” 5.4 ื”ืงื•ื“ ื”ื–ื” ื™ืชื—ื™ืœ ืœืขื‘ื•ื“ ื‘ืœื™ ื‘ืขื™ื”, ืฉื–ื” ืื—ืœื”. ืื‘ืœ ื”ืฉืืœื” ื”ืืžื™ืชื™ืช ื”ื™ื ื”ืื ื”ื”ืžืจื” ืž String ืœ URL ื‘ื›ืœืœ ืฆืจื™ื›ื” ืœื”ื™ื•ืช ื—ืœืง ืžื”ืคื•ื ืงืฆื™ื”. ืขื›ืฉื™ื• ืื ื™ ื™ื•ื“ืข TypeScript ืœื ืžื—ืคืฉืช ืœื”ื’ื™ื“ ืœืื ืฉื™ื ืžื” ืœืขืฉื•ืช ื•ื”ืžื˜ืจื” ื”ื™ื ืœืืคืฉืจ ื‘ื“ื™ืงืช ื˜ื™ืคื•ืกื™ื ืฉืชืขื‘ื•ื“ ืขืœ ืงื•ื“ ืฉืื ืฉื™ JavaScript ื”ื™ื• ืฉืžื—ื™ื ืœื›ืชื•ื‘. ื•ื‘ื›ืœ ื–ืืช ืžืขื ื™ื™ืŸ ืœืฉื™ื ืœื‘ ืœืชื‘ื ื™ืช ืžืงื‘ื™ืœื” ื‘ืกืงืืœื” ืœื˜ื™ืคื•ืœ ื‘ืื•ืชื” ื‘ืขื™ื”. ื‘ืกืงืืœื” ื”ื’ื™ืฉื” ื”ื™ื ืฉื”ืžืจื” ืž String ืœ URL ื”ื™ื "ื™ื›ื•ืœืช" ืฉืœ ื” String ื•ืœื ืฉืœ ื”ืคื•ื ืงืฆื™ื”, ืื• ื™ื•ืชืจ ื ื›ื•ืŸ ื™ื›ื•ืœืช ืฉืœ String ื‘ืชื•ืš ืงื•ื‘ืฅ ืื• ืžื•ื“ื•ืœ ืžืกื•ื™ื. ื‘ืฉื‘ื™ืœ ืฉื–ื” ื™ืขื‘ื•ื“ ืื ื™ ืžื’ื“ื™ืจ ืฉื ืคื•ื ืงืฆื™ื™ืช ื”ืžืจื” ืฉื ืจืื™ืช ื›ืš:
  implicit def stringToURL(url: String): URL =
    new URI(url).toURL
ื•ืื ืื•ืชื” ืคื•ื ืงืฆื™ื” ื ืžืฆืืช ื‘ Scope ืื– ืื ื™ ื™ื›ื•ืœ ืœื›ืชื•ื‘ ืคื•ื ืงืฆื™ื” ืฉืžืฆืคื” ืœืงื‘ืœ URL ื•ืœื”ืคืขื™ืœ ืื•ืชื” ืขื String ื•ื”ื›ืœ ืคืฉื•ื˜ ื™ืขื‘ื•ื“:
  def printHost(url: URL): Unit =
    println(url.getHost)

  @main
  def demo(): Unit =
    val url: String = "https://www.tocode.co.il"
    printHost(url)
ื”ืงื•ืžืคื™ื™ืœืจ ืžืคืขื™ืœ ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™ ืืช ืคื•ื ืงืฆื™ื™ืช ื”ื”ืžืจื” ื•ื‘ืขืฆื ื”ืคื•ื ืงืฆื™ื” ื ืงืจืืช ืขื ืื•ื‘ื™ืงื˜ ืžืกื•ื’ URL. ื”ื™ืชืจื•ืŸ ื‘ื’ื™ืฉื” ืฉืœ ืกืงืืœื” ื”ื•ื ืฉืื ื—ื ื• ื—ื•ืกื›ื™ื ื›ืคืœ ืงื•ื“ - ื‘ืžืงื•ื ืœื›ืชื•ื‘ ืืช ืงื•ื“ ื”ื”ืžืจื” ื‘ืชื—ื™ืœืช ื›ืœ ืคื•ื ืงืฆื™ื” ืฉืžืงื‘ืœืช URL ืžืกืคื™ืง ืœื›ืชื•ื‘ ืคื•ื ืงืฆื™ื” ืื—ืช ื•ืœื”ืฉืื™ืจ ืื•ืชื” ื‘ Scope. ื’ื ืžื‘ื—ื™ื ืช ื‘ื“ื™ืงื” ืฉืœ ื”ืคื•ื ืงืฆื™ื” ื™ื•ืชืจ ืงืœ ืœื”ืคืจื™ื“ ืืช ืžื ื’ื ื•ืŸ "ื”ื›ื ืช" ื”ืคืจืžื˜ืจื™ื ืœืคื•ื ืงืฆื™ื” ื ืคืจื“ืช ื•ื›ืš ืงืœ ืœื‘ื“ื•ืง ื›ืœ ืื—ืช ืžื”ืคื•ื ืงืฆื™ื•ืช ื‘ื ืคืจื“, ื•ื‘ืžื—ื™ื ืช ืงืจื™ืื•ืช ื’ื ืื ื‘ืžื‘ื˜ ืจืืฉื•ืŸ ื”ืžื ื’ื•ืŸ ืฉืœ ืกืงืืœื” ื ืจืื” ืžื‘ืœื‘ืœ ื™ืฉ ืœื”ื ื›ืคืชื•ืจ ื‘ IDE ืฉืคื•ืชื— ืืช ื”ืกื•ื›ืจ ื”ืชื—ื‘ื™ืจื™ ื”ื–ื” ื•ื‘ืœื—ื™ืฆืช ื›ืคืชื•ืจ ืžืจืื” ืœื ื• ืืช ื”ื”ืžืจื•ืช ืฉืžื‘ื•ืฆืขื•ืช ื‘ื–ืžืŸ ื”ื”ืคืขืœื”.