ToCode
Kanalga Telegramโda oโtish
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Ko'proq ko'rsatish1 420
Obunachilar
+124 soatlar
+17 kunlar
-430 kunlar
Postlar arxiv
1 420
ืืืจืื ืงืื ืื
ืืฉืื ืืืื ืื, ืื ืืืจืื ืงืื ืื ื ืจืืื ืืืืืฆืื. ืื ืืืจืืื ืืื ืฉืื ืืืืื ืืืืืื ืืืืคืฉ ืคืืชืจืื ืืช ืืืืจืื, ืจืง ืืฉืืื ืืืืืื ืืขืฆืื ื ืฉืืืขืื ืื ืืืืื ืืื ืฉืื ื ืจืื-
ืดืืื ืืงืื ืืืื ืจ ืฉืื ืื ื ืืืง?!ืด
ืดืืื ืืื ืขืืืื ืจืืืืื ืืืืขืจืืช?!ืด
ืดืืื ืืืฃ ื ืืขื ืื ืื ืืื?!ืด
ืืคืขืืื ืืคืืชืจืื ืืืืช ืืืงื ืืงื. ืืคืขืืื ืืืชืจ. ืืืืจ ืืืฉืื ืืื ืืฉืื ืื ืฉืืื ืฉืืืื ืื ืืืชืจ ืื ื ืืืฆืื ืคืืืช, ืืืืืขืื ืืืชืจ ืืื ืื ืืขืฉืืช. ืืืชืืืืืืช ืขื ืืชืืจ ืื ืืืืจ ืฉืืื ืืืืืจ ืืืืช ืืฉืชื ืืจืืื:
1. ืืืืื ืืช ืขืืื ืืชืืื ืืจืื ืืกืคืืง ืืืื ืืื ืืืชืืืื ืขื ืืืชืืจ ืืื.
2. - ืื - ืืฉืื ืืืืฉืื ืฉืืื ืืืจ ืืช ืขืืื ืืชืืื ืืื ืฉืืขืืืจ ืื ื ืืคืชืืจ ืืช ืืืชืืจ.
ืืืขืืช ืฉืืืื ืืืืืืจ ืืื ื ืืื ืืืืื ืจืง ืงืฆืช ืืชืื ืขืืื ืืชืืื "ืืกืคืืง ืืฉืืื ืืคืชืืจ ืืช ืืืขืื" ืืื ืืคืชืืจ ืืืจืื ืขืงืื. ืืชืืฆืื ืืืจื ืืื ืชืืื ืฉืืืขืื ืชืืฉืืจ ืืจืง ืชืืจืื ืขืื ืืืชืจ ืืกืืืืช.
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 })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 ื ืืกืฃ ืื ืื ื ืืืื ืขืื ืืขืืืช. "ืืื ืืืืืชื" ืืื ืืืืืื ืืืืช ืฉืื ื ืืฉืคืจ ืืช ืืื ื ืืงืื ืืื ืืืชืืืื ืืื ืืืชืจ ืขื ืฉืื ืืืื ืืขืชืื.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
}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
}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 ืืืืืื. ืืืกืคืจืื ืงืื ืื ืืืชืจ (ืืคืืื ืืืืืื) ืืืขื ืื ืืื ืืืื ืืื ืชืืืืืื ืืื ืืืกืคืจ ืชืืืืืื ืื. ืืฉืื ืืืืื ืืื ืืช ืืืฉืืื ืืคื ื ืฉืืื ืื ืคืืชืจืื ืืืืกืก ืชืืืืืื ืื ืืื ืื ืืขืฉืืช "ืืืคืืืืืืฆืืืช" ืืืืชืจืืช.1 420
ืืืืื ืืื ืฉื AI ืืงืื
ืืฆื ืืื AI ืืืคืฉืจ ืืืชืื ืงืื ืืืจ ืืืชืจ, ืืืฆื ืฉื ื AI (ืืืื) ืื ืืืืข ืืืฆืืข ืืืกืืจืงืฆืืืช ืฉืืืืืื ืืืชืืืช ืคืืืช ืงืื.
ืจืง ืืฉื ืืื ืืช ืื ื ืืื ืืจืืืช ืืื ืืชืื ืชืื ืืกืืืืื ืืฉืืืืช ืืืจ ืืืชืจ ืขื ืงืืคืืืืื. ืืืจ ืืชืจืืื ื ืืืกืชืื ืขื ืงืื ืงืืื ืืชืืจ ื ืื, ืืืืืื ืขื ืคืจืืืงืื Green Fields, ืืื ื ืืืืข ื AI ืืืชืืื ืชืืื ืืืคืก, ืืืจืื ืื ื ืฉืืื ืฉืื ืืขืื ืืืจืื ืืืคืก ืืฃ ื ืืืชื ืืื ืืงืืช ืืช ื CSS-ืื ืฉื ืืคืจืืืงื (ืื ืืื ืืืจ ืืขืฆื ืืืืชืื CSS), ืื ืืืืกืืฃ ืขืื ืฉืืืคื ืืืกืืก ืื ืชืื ืื ืืื ืืืฉืชืืฉ ืืืืกืืจืงืฆืืืช ืฉืืืจ ืงืืืืืช ืืงืื, ืื ืื ืื ืืืืืง ืืชืืืืืช ื Use Case ืื ืืืื.
ืืืขืื ืฉืจืง ืืืืกืืฃ ืงืื ืื ืื ืืกืืจืืืื ืืืื ืขืืืจ Senior Developers. ืื ืืขืื ืฉืื ื ืฉืืืจื ืืงืื ืืืืืช ืืืชืจ ืงืฉื ืืชืืืืงื ืืืืจื ืืื, ืืืงืืคืืืืื ืืชืืจื ืืชืขืื ืืืงืืฉื ืืืืฉืื ืืกืื ืืช ืืืขืจืืช ืขื ืฉืืืจ ืื ืืคืฉืจ ืืืื ืืืชืจ ืืืืขืืจ ืื.
ืืืื ื ืืืืช ืืื ืืืคืชื ืืืขืืจ ืื'ืื ืืืจืื ืืกื ืืืจืื.
ื'ืื ืืืจืื ืืืคืฉืื ืืคืชืืจ ืืขืืืช, ืกื ืืืจืื ืืืคืฉืื ืืื ืืช ืืืกืืจืงืฆืืืช ืืื ืฉืืืื ืงื ืืืชืจ ืืคืชืืจ ืืขืืืช ืืขืชืื.
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 == 11 420
ืฉืืืฉื ืกืืคืืจืื ืงืจืืืืื ืืงืจืืืจื ืฉืื ื
ืืกืืคืืจ ืขื ืืกืฃ - ืืื ืื ื ืืจืืืื? ืืื ืืชื? ืืื ืืืืข ืื? ืืฉืืื ืื ืืฉืืืื ืื? ืื ืืืืชื ืขืืฉื ืขื ืืืชืจ ืืกืฃ? ืืื ืืืืชื ืืกืชืืจ ืขื ืคืืืช? ืื ืืงืฉืจ ืืื ืืกืฃ ืืืขืื? ืืื ืืกืฃ ืืขืจื? ืื ืืืืก ืฉืื ืืืฉืคืืื ืืื "ืื ื ืฆืจืื ืืกืฃ ืืื ืืงื ืืช ืืืชืจ ืืืจืื", "ืืฃ ืคืขื ืืื ืื ืืกืคืืง ืืกืฃ", "ืื ืฉืืจืืืื ืืืชืจ ืืฉืื ืืืชืจ", "ืืกืฃ ืจืง ืืืฆืจ ืขืื ืืขืืืช", "ืืกืฃ ืืื ืืืคืชื ืฉืืขืืืจ ืืคืชืืจ ืืขืืืช". ืฉืืืื ืื ืืชืฉืืืืช ืืื ื ืกืืคืืจ ืืืกืืคืืจ ืืื ืงืืืข ืืืง ืืฉืืขืืชื ืืืืชื ืืืืช ืฉืื ื ืืขืืื.
ืืกืืคืืจ ืขื ืืื - ืืืื ืจืง ืคืขื ืืืช, ืืืืื ืงืฆืจืื ืื ืฆืจืื ืืืกืคืืง ืืื ืฉืืืชืจ, ืืฉืืื ืืืฆืืื ืฆืจืื ืืขืืื ืืกืืื ืืฉืขืื, ืื ืืืืืื ืืืืืืื ืืฉื ื ืืืฉืจื, ืื ืฉืืืืื ืืคืืื ืฉืขื ืืืช ืื ืืืืข ืืืขืจืื ืืช ืืืืื, ืขืืืื ืืืื ืื ืืื ืืืคืชื ืืืฆืืื, ืืืจื ืืืจืืื ืืื ืืขืฆื ืืงืฆืจื ืืืืชืจ, ืืขืืื ืื ืชืืื ืืืืจ ืื ืฉืชืืื ืืขืฉืืช ืืืื, ืชืืื ืืฉ ืืื ืืืืจืื ืืืืจืืืื. ืืืืจืื "ืฉืืืข ืขืืืื ืื 4 ืฉืขืืช" ืฉื ืืื ืคืจืืก ืืื ืืืื ืืืจืื ืืกืืคืืจ ืืกืืื ืขื ืืื.
ืืืกืืคืืจ ืขื ืืืข - ืืื ืื ื ืืื? ืืื ืืขืืื ืื ืืืื ืืื? ืืื ืื ื ืืืื ืืืจืื ืืืฉืื? ืืชื ืื ื ืืืื ืืืจืื ืืืฉืื? ืื ืื ืืืื ืืืืื? ืืชื ืื ื ืฉืืื ืืืืื ืืืืช ืืฉื ืืช? ืืืื ืืืืื ืืืืช ืืืื ืื ืืฉืืื? ืืฉ ืืืจืื ืฉืขืืืฃ ืืืืื ืืื? ืืฉ ืืืจืื ืฉืืคืฉืจ ืืืืื ืจืง ืืื?
ืืืชืืจ ืืจืืฉืื ืืื ืืฉืื ืื ืืื ืืกืืคืืจืื ืืืื ืืฉืคืืขืื ืขื ืืืืื ืฉืื ื. ืืชืืจ ืืืชืจ ืืืื ืืื ืืฉื ืืช ืืืชื ืืฉืื ืืืจ ืื ืขืืืจืื ืื ื.
1 420
ืืื ืืชืืืง ืคืจืืืงื ืฉืืืขื ืื ืฆืจืื ืฉืื ืืืื
ืืื ืกืคืง ืฉืคืืชืื ืืขืจืืช ืืื ืืชืืจ ืืืื, ืืื ืืฉืืคืชืืื ืืขืจืืช ืืื ืืื ืืฉืขื ืฉืขื ืืฉ ืื ืืืชืจืื - ืืคืฉืจ ืืืืืืง ืืช ืืื (ืื ืืจืื) ืืจืืฉ ืืืืืื ืืืื ืื. ืฉืจืช ืืคืืชืื ืืืจ ืืืืืืจ, ืฉืจืช ืืืืืงืืช ืจืฅ, ืืืฆืขืช ืืืจ ืืชืืืจืืช ืืืกื ื admin ืืื ืืกืคืจืืืช ืืืืจืกืืืช ืืืืฉืืช ืืืืชืจ.
ืืคืจืืืงื Legacy, ืื ืืกืฃ ืืืชืืจ ืฉื ืคืืชืจืื ืืขืื ืกืคืฆืืคืืช ืืฉ ืขืื ืืืื ืืชืืจืื ืฉืงืฉืืจืื ืืขืืืื ืฉืืฃ ืืื ืื ื ืืข ืืงืื ืืื ืืืืฉืื ืื ืฉื ืื:
1. ืืงืื ืื ืจืฅ. ืื ืื ืืชืงืืคื.
2. ืืื ืื ืืืฉื ืื ืืกืืกืื ืืืกื ืื ืืืื ืขื ืฉืจืช ืืืืืงืืช. ืืื ืืืชื ืฉืืืจื ืื ืืืคืฉืื ืืื ืืืจ ืืืื ืฉืืืชื ืืืคื.
3. ืืชืืขืื ืืจืฉืช ืื ืจืืืื ืื ืื ืืคืจืืืงื ืืฉืชืืฉ ืืกืคืจืืืช ืืฉื ืืช.
4. ืืื ืื ืืืฉื ืื ืืชืคืงืื ืฉื ืื ืืืง ืืงืื ืื ืืืคื ืืืฆืื ืืช ืืืืงืื ืฉืื ื ืฆืจืื ืืขืืื.
ืืคืฉืจ ืื ืกืืช ืืคืชืืจ ืืช ืจืื ืืืขืืืช ืืื ืขื ืืชืืืช ืงืืฆื ืชืืขืื ืืืืื ืืชื ืืืชืจ ืืืืื ืืื ื ืืืชืืืช ืงืืฆืื ืืืื, ืืื ืืคืืืช ืืืงืจื ืฉืื ืื ื ืืฆืืื ืืืชืื ืงืืฆื ืชืืขืื ืืื ืืฃ ืคืขื ืื ืืืืจ ืืคืชืื ืืืชื ืืฉืฆืจืื ืืฉืื ืืืื ืืฆืืืจืื ืื ืืืื ืงืืฆื ืชืืขืื ืื ืจืืืื ืืืื.
ืื ืื ืขืืื ืื-
1. ืืฆืืจืช ืื ืื ืื ืืจืฆื ืกืื ืืจืื, ืื ืืคืจืืืงืืื ืืฉื ืื - ืืืืืจ ืฆืจืื ืืืืื ืฉ
npm start ืื docker compose up ืขืืืืื ืืืขืืื ืืช ืืกืืืื. ืื ืชืืื ืฉืืื ืืช ืืืฉืงืขื.
2. ืื ืคืขื ืฉืื ื ืืืืข ืืฉื ืืช ืงืื ืืื ืืืื ืืฉืื ืืงืื ืืฉื ืื ื ืืืกืืฃ ืชืืขืื ืขื ืืืชื ืคืื ืงืฆืื ืฉืืกืืืจ ืื ืืื ืขืืฉื ืืืื. ืืื ืืื ืชืืขืื ื ืืชื ืืืืืจื ืฉื ืื ืืืชืจ ืงื ืื ืืชืงื ืืขืืืช.
3. ืืืื ืืืืงืืช - ืืืชืจืื ืฉื ืืืืงื ืขื ืชืืขืื ืืื ืฉืืคืฉืจ ืืืจืืฅ ืืืืงื. ืืืืกืจืื ืฉืื ืื ืืจืฆืช ืืืืงื ืืฆื ืฉื ื ืืฉ ืื ืกืืืื ืืื ืืืืืฉื. ืื ืืชื ืืฆืืืืื ืื ืืืื ืขืืืจ ืฉืืฉ ืืืืืื ืืงืฉื ืฉืืจืืฅ ืืช ืืืืืงืืช ืคืขื ืืฉืืืข. ืืืื ืืืืืืช ืฉืื ืืื ืืคืจืืืงืืื ืืืฉื ืื ืฉืื ืื ื ืืฆืืื ืืฉืืจ ืืช ืื.
4. ืืขืื ื ืืกืคืช ืขื ืคืจืืืงืืื ืืฉื ืื ืืื ืืขืงืคืื ืงืื ืื ืฉืื ืื ื ืฉืืื ืื ืืืืืื ืืชืงื ืืื ืืืืฃ ืืคืจืืืงืฉื ืืืื ืืืืช ืืื ืืขืฉืืช ืืช ืื ื ืืื. ืืืื ืื ืื ื ืจืืืื ืฉืื ืืื ืงืื ืขื ืืืื ืช ืืคืจืืืงืฉื ืฉืื ืืืืขืื ืืืื, ืืืืืื ืืืขืจืืืช ืืื ืฉื ืื ืฆืจืื ืืงืืคื ืืช ืืคืจืืืงื. ืืืื ื ืื ืืฆืืืชื ืืืืจื ืืืืจ ืืช ืืชืืคืขื ืืืืช, ืืื ืื ืืคืฉืจ ืื ืกืืช ืื ืคืขื ืฉืจืืืื ืืืจ ืืื ืคืฉืื ืืขืฉืืช ืงืืืื ืืฉืื ืื ืื ืื ืืื ืื ืืืืขืช ืงืืืื ืืืืืงืช ืืืชืื, ืจืง ืืฉืืื ืฉืืื ืืื ืืื ืื ืืืืื.
ืืฉ ืืื ืขืื ืืืคืื ืืชืืืืงืช ืคืจืืืงืืื ืคืขื ืืืื ืืืืฉืื? ืื ืชืชืืืืฉื ืืฉืชืฃ ืืชืืืืืช.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 ืฉืคืืชื ืืช ืืกืืืจ ืืชืืืืจื ืืื ืืืืืืฆืช ืืคืชืืจ ืืจืื ืื ื ืืช ืืืืจืืช ืฉืืืืฆืขืืช ืืืื ืืืคืขืื.
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
