ToCode
Kanalga Telegramโda oโtish
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Ko'proq ko'rsatish1 418
Obunachilar
-224 soatlar
-37 kunlar
-630 kunlar
Postlar arxiv
1 418
ืืคื ื ืฉื ืชืืื
ืืขืืื ืฉื ืืืื ืืจื ื ืฉื ืชืืื ืื ืืืื ืืื. ืงืื ืฉื ืืชื ืืคื ื ืฉื ืชืืื ืืื ืืฉื, ืืจืืข, ืื ืืชืืืืง, ืืืืขืจ. ืืื ืืขืืื ืืืืืชื? ืืขืืื ืืืืืชื ืืฉ ืืขืจืืืช ืฉื ืืชืื ืื ืืคื ื ืขืฉืจ ืฉื ืื ืืื ืขืืืื ืืชืืืืงืืช. ืืขืืื ืืืืืชื ืืขืจืืืช ืืื ืืืฉืืืืช ืืงืื ืชืืงืื ืื, ืขืืืื ืื ืืคืืฆ'ืจืื ืืืฉืื. ืืขืืื ืืืืืชื ืื ืื ื ืื ืืืจืงืื ืืคื ืงืื ืจืง ืืืื ืฉืืืฉืื ืืืืื ืฉืฆืจืื ืืืคืกืืง ืืืชืื ืจืืืงื ืขื class ืืฆืจืื ืืืฉืชืืฉ ื use.
ืืืืื ืืจืืืง ืืฉ ืืืจืื ืืืจืื ืฉืืคืจืืขืื ืื ืืงืื:
1. ืงืืืคืื ื ืื ืฉื ืืขื 100 ืฉืืจืืช.
2. ืืืืืงื ืืชืื JSX.
3. ืงืืืคืื ื ืื ืฉืืงืืืช ืืืชืจ ื-4 ืคืจืืคืก.
4. ืคืจืืค ืืจืืืื ื - ืงืืืคืื ื ืื ืฉืืืงืืช ืคืจืืคืก ืจืง ืืฉืืื ืืืขืืืจ ืืืชื ืืืืืื.
5. ืืืืืงื (ืคืื ืงืฆืืืช) ืืชืื ืงืืืคืื ื ืื, ืืืงืื ื Custom Hook ืื ืงืืืฅ ื ืคืจื.
ืื ืืืืจืื ืืืื ื ืืฉืื ืืขืืืชืืื ืื ืืคื ื ืฉื ืชืืื ืืื ืืคื ื ืขืฉืจ ืฉื ืื. ืืืฉืืื ืงืืืื ืืื ืฉืืืืฉืื ืฉืื ื ืืืืืง ืืืืจื ืืื ืื ืงืจืืื ืืืฉืชืืฉ ื API ืืื ืืืืจื ื (ืืื ืืืืื ืืจืื ืืฉื ืขืื ืฉื ืชืืื). ืื ืืฉืื ืืืฉืชืืฉ ื Best Practices ืฉื ืคืืชืื ืชืืื ื - ืืื ืขืงืจืื ืืช ืฉืืืฉืืจื ืืืชื ื ืื ืฆื.
1 418
1. ืงืื ืฆื ืฉืจืช ืืืืจ ืืช ืงืืฆื ื JSX ืื TSX ืฉื ืืคืจืืืงื ืืืจืืฅ ืืืชื ืืชืืืื ืืืงืฉื ืืืคืืคื ืืื ืืืืืืจ ืืืคืืคื ืืฃ HTML ืืืื ืืืฆืื.
2. ืงืื JavaScript ืืฆืืจืฃ ืืขืืื ื HTML ืฉื ืฉืื ืืื ืืืืกืืฃ ืืื ืืจืงืืืืืืช ืืขืืื (ืงืืืคืื ื ืืืช ืฆื ืืงืื). ืงืื ื JavaScript ืืชืืื ืชืืื ื State ืจืืฉืื ื ืฉื ืืขื ืืืฉืจืช.
3. ืคืขืืืืช ืืฆื ืืืงืื ืืืืืืช ืืืฉืคืืข ืขื ืืฉืจืช, ืืื ื ืฉืชืืฉ ืืื ืื ืื ืื ืฉื ืจืืืงื (Server Actions) ืืื ืืฉืืื ืืืืขื ืืืืงืื ืืฉืจืช, ืืืืขื ืฉืืืืื ืช ืืงืื ื ืจืืืช ืืื ืงืจืืื ืจืืืื ืืคืื ืงืฆืื. ืืคืจืืืืืืจืง ืืืจืื ืขื ืืชืืืช ืงืื ื fetch ืืคืืขื ืื ืืชืฉืืื ืืฉืืืื ื.
4. ืืื ืืืขื ืืฆืืงื ืืืฉืชืืฉ ื Redux ืื ืกืคืจืืืช ื ืืืื ืกืืืื ืฆื ืืงืื ืืชืืืืืืช ืืืคืืืงืฆืืืช ืืืื, ืื ืืื ืืืขื ืกืืืื. ืื ืฉืื ืื ืืฆื ืืงืื ืืื ืืืืื ืืฉืจืช ืื ืื ืืื ืืจืืช ืืงืืืคืื ื ืื.
ืืืชืจืื ืืืจืืื ืืืคืืืงืฆืืืช Full Stack ืืื ืืคืฉืืืช. ืืคืืืงืฆืื ืืืืช ืืืจืฉืช ืืจืื ืคืืืช ืืืืืจืื ืืฉืืื ืืขืืื ืืืืืืช ืืจืื ืคืืืช ืงืื ืืืฉืืืื ืืืคืืืงืฆืื ืืงืื ื Front End ืืืคืจื ืืงืื ื Back End. ืืืืกืจืื ืืื ืื ืขืืื ืืชืื ืืคืจืืืืืืจืง ืืืงืืฉื ืืฉืื ืืช ืืงืื ืขื Clients ืืืจืื ืืื ืืคืืืงืฆืืืช ืืืืืื.
1 418
ืืจืืืืงืืืจื ืืืืฉืืื ืจืืืงื
ืืื ืขื ืืืขืืจืืืช ืฉื Vercel ืืืืื ืฉื ืจืืืงื ืื ืื ื ืจืืืื ืื ืฉืื ืื ืืจืืืืงืืืจื ืืคืืชืื ืืืฉืืื ืจืืืงื - ืืขืืจ ืืกืคืจืื ืืคืืชืื ืงืื ืฆื ืืงืื ืืคืจืืืืืืจืง ืืคืืชืื Full Stack. ืืืื ื ืจืื ืื ืืืคืฉืจืืืืช ืฉืื ื ืืืื ืืืชื ืืืื ืืืืืจ ืื ืืคืฉืจืืช.
ืคืืชืื Front End ืืจืืืงื ืืงืื ืฆื ืฉืจืช ืืชืืจ REST API
ืจืืืงื ืืกืืืืช ืืขืืื ืืชืืจ ืกืคืจืืืช ืฆื-ืืงืื ืืืืฉืชืื ืืื ืคืจืืืงื ืฆื ืฉืจืช ืฉื ืื ื. ืืืื ืืืจืฆืื ืืื ืงืื ืฆื ืืฉืจืช ืืงืื ืฆื ืืืงืื ืืชืืฆืขืช ืืืกืคืจ ืฉืืืื:
1. ืืฉืื ืืื ืืื ืืืื ืื ื ืื ืื ืื ืฉืืื ื ืืช ืงืืฆื ืืืงืืจ (JSX ืื TSX) ืืืืืจ ืืืชื ืืงืืฆื JavaScript ืฉืืคืืคื ืืืื ืืงืื. ืืจืื ืืืจื ืืื ืื ืืืชื ืื ืื ืื ืื ืืขืชืืง ืืช ืื ืืงืืฆืื ืฉื ืืฆืจื ืืชืืงืืื ืืืคืฆื ืืื dist ืื public.
2. ืืฉืื ืืคืจืืืงืฉื ืืงืื ืืงืื ืืคืืืงืฆืืืช ืจืืืงื ืกืืืืช, ืืืคืืืงืฆืื ืชืคื ื ืืฉืจืช ืืื ืืืฉืื ืืืืข ืืืจื ืืื ื REST API ืืชืฉืชืืฉ ืืืืืข ืื ืืื ืืืฆืื ืืืจืื ืขื ืืืกื. ืฉืื ืืืื ืฉืงืืจืื ืืืคืืืงืฆืื ืื ืืืื ืขื ืกืคืจืืืช ื ืืืื State ืืฆื ืืงืื ืืื ืจืืืืงืก.
3. ืืืคืืืืืืฆืื ืืงืืืืช ืืฉืื ืื ืืื ืืฉืื ืืช ืืืืืข ืืจืืฉืื ื ืฉืืืคืืืงืฆืื ืฆืจืืื ืืชืื ื JavaScript ืืืืฆืขืืช ืืืืจืช ืืฉืชื ื ืขื window ืืชืื ืงืืืฅ ื HTML, ืื ืฉืืืืจ ืฉืงืืืฅ ื HTML ืืืืฉ ืืืฉืจืช ืืื ืืงืืืฅ ืกืืื. ืื ื ืืืืื ื PHP ืืฉืชืื ืืืืข ืืชืื ื JavaScript
<?php
// Example PHP data - you can modify this according to your needs
$data = [
'user' => [
'id' => 1,
'name' => 'John Doe',
'email' => 'john@example.com',
'preferences' => [
'theme' => 'dark',
'notifications' => true
]
],
'settings' => [
'language' => 'en',
'timezone' => 'UTC'
],
'meta' => [
'lastUpdated' => date('Y-m-d H:i:s'),
'version' => '1.0.0'
]
];
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>State Management Example</title>
</head>
<body>
<!-- Your HTML content here -->
<script>
// Initialize window.__state__ object
window.__state__ = window.__state__ || {};
// Safely encode PHP data as JSON and inject it into window.__state__
window.__state__.data = <?php echo json_encode($data, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_PRETTY_PRINT); ?>;
// Example of accessing the data
console.log('User name:', window.__state__.data.user.name);
console.log('Current theme:', window.__state__.data.user.preferences.theme);
</script>
</body>
</html>
ืืฆื ืฉื ืจืืืงื ืื ืจืืืืงืก, ืื ืื ื ืืืงืืื ืืช ืืืฉืชืชื ื window.__state__ ืืชืืจ ืืขืจื ืืจืืฉืื ื ืฉืืื ื ืืื ืื ืืช ื Store ืืืืฉืืืื ืื ืื ืืช ืืฉืื ืืืื ืืจืืื ืืคื ืคืขืืืืช ืืฉืชืืฉ ืืืคืืืงืฆืื.
ืืืชืจืื ืืช ืืืืฉื ืื:
1. ืืคืฉืจ ืืคืชื ืืืืืืง ืงืื ืฆื ืืงืื ืืงืื ืฆื ืฉืจืช ืื ืคืจื.
2. ืืคืฉืจ ืืืฉืชืืฉ ืืืืชื API ืืฆื ืฉืจืช ืื ืืืคืืืงืฆืืืช ืืืืืื, ืืคืืื ืฉืืื ืืชืืื ืืฉืคื ืืืจืช ืืืืจื.
ืคืืชืื ืืขืจืืช Full Stack ืืจืืืงื ืขื Next
ืืืชืจืื ืืช ืืืืฉืช ื API ืืจืืจืื ืืื ืืื ืื ืืจืืจ ืื ื ืื ืืืกืจืื ืืช: ืืืขืจืืช ืฉืื ื ืฆืจืืื ืืืืื ืงืื ืฉืืืฉืื ืืืืข ืืืฉืจืช ืืืคืขื ื ืืืชื, ื ืืจืฉ ืชืืืื ืืื ืงืื ืฆื ืืงืื ืืงืื ืฆื ืฉืจืช ืืืืฉืงืื (ืื ืฉืืฉืคืืข ืขื ืงืฆื ืืคืืชืื ืืขื ืงืฆื ืืขืืืื ื Refactoring).
ืื ืืกืฃ ืืคืืคื ืฉืืืืข ืืืชืจ ืืงืื ืงืืฆื JavaScript ืืจืง ืืืจื ืคืืขื ืื ืืืจืฆืช ื JavaScript ืืคืฉืจ ืืจืืืช ืืช ืืืชืจ. ืงืื ื JavaScript ืขืฉืื ืืืืืช ืืจืื ืืืจืื ืื HTML ืฉืืื ืืืฆืจ ืืื ืื ืื ื ืืขืืืจืื ืขืืืฃ ืืืืข ืืจืฉืช.
ืืชืืขืื ืฉื ืจืืืงื ืืืฃ ืฉืืกืคืจ ืขื ืืฆืืจืช ืคืจืืืงื ืืืืืฅ ืขื ืฉืืืืฉ ืืคืจืืืืืืจืง - ืืืืืจ ืืืืืฅ ืืืฆืืจ ืคืจืืืงื ืขื next, remix ืื expo. ืืืืืง ืืืืจืื ืืขืืื ืืืืืจ ืืช Tanstack Start ื Redwood, ืฉื ื ืคืจืืืืืืจืงืื ื ืืกืคืื ืืคืืชืื Full Stack. ืืืชืืืก ื vite, ืฉืื ืืืืคืฆืื ืืงืืืกืืช ืืคืืชืื ืงืื ืฆื ืืงืื ืืืื, ืืกืคืจืื ืื ื ืฉื ืฉืื ืืืืืฆืื ืขื vite ืจืง ืืฉืืืกืืคืื ืืช ืจืืืงื ืืคืจืืืงื ืงืืื ืื ืื ืืื ืื ืคืจืืืืืืจืง, ืื ืฉืืจืื ืื ื ืืฆืืจื ืืจืืจื ืืช ืืืืืื ืฉื ืฆืืืช ืจืืืงื.
ืืื ืืืืคืฆืื ืืฉื ืื ืืืืื ืืคืืืช ืืคื ืืชืืขืื ืฉื React ืืื ืื ืืืืืืฆืช ืืื ืคืืชืื ืืืฆืจ Full Stack ืขื ืจืืืงื ืืืืง ืืคืจืืืืืืจืง ืืืื ืืืชืจ. ืคืจืืืืืืจืงืื ืืฆืืขืื ืื ื ืืช ืืืืคืฆืื ืืื ืืช ืืช ืืคืจืืืงื ืืชืืจ ืงืื ืฆื ืืงืื ืืืื, ืืื ืืจืื ืื ืืขืืืื ืืืชื ื ืืืืืจ ืืืจืืืืงืืืจื ืืงืืคื ืืืืืืช ืงืื ืฉืจืช ืืงืื ืืงืื, ืืื ืืืืจ:1 418
ืืงืื ืืืงื ืืช ืืขืจื ืืืฉืชื ื
temp_dir, ืืื ืืืืง ืืช ื / ืืชืืืืช ืื ืชืื ืืืืืจ ืืช ืื ืืชืืงืืื ืื ื ืืฆืืช ืกืคืจืืืช podcastfy ืขืฆืื. ืื ื ืื ืืืื ืืื ืื ืขืฉื ืืช ืื ืืื ืืคืืขื ืื ืืืืจ ืฉืงืืฆืื ืืื ืืื ืืืฉืืจื ืืชืช ืชืืงืืื ืืชืื ืชืืงืืืช ืืืืฉืื, ืื ืฉืื ืขืืื ื Lambda. ืืฉืืื ืืืจืื ืืื ืืืช ืืชืืงืืืช /tmp ืืื ืืืชืื ืืช ืกืืื / ืืชืืืืช ืฉืืจืช ืื ืชืื ืืฉืชืืฉืชื ืืกืืื .. ืฉืขืืืจ ืชืืงืืื ืืืช ืืืขืื, ืืื ื ืงืื ื ืชืื ืฉื ืจืื ืืขืจื ืื:
/var/task/app/podcastfy/../../../../../../../tmp/podcastfy-demo/tmp
ืืืงืืฆืื ืืืฉืืจื ืืชืืงืืืช /tmp ืืจื ืื ืชืื ืืืืกื.
ืื ื ืฉืืจ
ืืคืื ืงืฆืื ืขืืืืช ืืืคืชืืจ Test ืืืืฉืง ืฉื Lambda ืืื ืืื, ืขืืืื ื ืฉืืจื ืฉื ื ืืืจืื ืืื ืฉื ืืื ืืืฉืชืืฉ ืื ืืฆืืจื ื ืืื ื:
1. ืืฉ ืืืืจ ืืช ืืคืื ืงืฆืื ืืืืจืืข ืืืฆืื ื ืฉืืืจืื ืืืชื. ืืงืื ืืืืืื ืืื ืืืคืขืืช ืืจื API Gateway ืืื ืืืชื ืืืงืฆืื, ืื ืฉืื ืืื ืืื ืืืื ืืจื ื ืืืื ืืืคืขืื ืืช ืืคืื ืงืฆืื. ืฆืจืื ืืขืืื ืืช ืื ืืื ืฉืืื ืชืืคืขื ืื ืืชืื ืืืจืืข ืฉืืืืข ืืชืืจ ืื ืืคืืืช ืืฆืืจื ืืืื ืช ืืจื API Gateway ืื ืฉืจืง ืืฉืจืช ืฉืื ืืืื ืืืืจืื ืืช ืืืคืขืื.
2. ืืคืื ืงืฆืื ืืฉืชืืฉืช ืืงืืืฅ .env ืืชืืงืืื ืืืงืืืืช ืืื ืืืืืืจ ืขืจืืื ื API Keys ืฉืืื ืฆืจืืื. ื AWS ืืฉ ืื ืื ืื ืืืชืจ ืืืืืื ืืฉื Secrets Manager. ืืขืืื ืืืืืชื ื ืจืฆื ืืืฉืชืืฉ ืื ืืื ืฉืื ืืื ืื ืื ื ืืช ืืคืชืืืช ื API.1 418
"iam:PutRolePolicy",
"iam:DeleteRolePolicy",
"iam:PassRole",
"iam:TagRole",
"iam:UntagRole",
"iam:AttachRolePolicy",
"iam:DetachRolePolicy"
],
"Resource": [
"*"
]
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cloudformation:CreateChangeSet",
"cloudformation:CreateStack",
"cloudformation:UpdateStack",
"cloudformation:DeleteStack",
"cloudformation:DescribeStacks",
"cloudformation:ListStacks",
"cloudformation:GetTemplateSummary",
"cloudformation:ValidateTemplate",
"s3:CreateBucket",
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject",
"lambda:CreateFunction",
"lambda:UpdateFunctionCode",
"lambda:UpdateFunctionConfiguration",
"lambda:DeleteFunction",
"lambda:GetFunction",
"lambda:ListFunctions",
"lambda:PublishVersion",
"lambda:CreateAlias",
"lambda:DeleteAlias",
"lambda:UpdateAlias",
"iam:CreateRole",
"iam:DeleteRole",
"iam:GetRole",
"iam:PutRolePolicy",
"iam:DeleteRolePolicy",
"iam:PassRole"
],
"Resource": "*"
}
]
}
ืืืจื ืฉืืฉ ืืฉืชืืฉ ื ืื ืกืื ืืืื Security Credentials ืืืืฆืจืื ืขืืืจื Access Key. ืืฉืืจืช ืืคืงืืื ื ืคืขืื:
aws configure
ืื ืื ืืก ืืช ื Access Key ืืืช ื Secret ืืฉืืื ืฉืืื ืืืชื ื.
ืืขืืื ื AWS ืืืจืฆืช ืืืืงื ืืืืืฉืง ืฉืืื
ืืืจื ืืืืืจ AWS ืืคืฉืจ ืืืคืขืื:
sam deploy --guided
ืืืขื ืืช ืขื ืืฉืืืืช ืืื ืืืขืืืช ืืช ืืคืื ืงืฆืื ื AWS. ืืืจื ืกืืื ืืขืืื ืชืืืื ืืืฆืื ืืช ืืคืื ืงืฆืื ืืืฃ ืืคืื ืงืฆืืืช ืืกืจืืืก Lambda ืืืืฉืง ืฉื AWS, ืืฉื ืื ืชืืฆืื ืืคืชืืจ Test ืฉืืคืขืื ืืช ืคืื ืงืฆืืืช ื Lambda ืืืืฉื ืฉืื ื.
ืชืืงืื ืืงืื ืืืขืืื ืืืืฉ
ื Lambda ืืฉ ืืกืคืจ ืืืืืืช ืืืฉืืช ืฉืื ืงืืืืืช ืืืคืขืื ืืงืืืืช ืขื SAM. ืืจืืฉืื ื ืืื ืืืืืช ืืืืืจืื ืืืงืกืืืื (ืกืื ืืงืืื ืืืื ืืขืืื ืขื ืขื 10 ื'ืืื ืืืืจืื, ืืื ืืขื ื ืื ื ืชื ื ืื ืจืง 3). ืืฉื ืื, ืืืชืจ ืืฉืืื, ืืื ืฉืื ืืคืฉืจ ืืืฆืืจ ืงืืฆืื ืืืคื ืฉืจืืฆืื ืืื ืจืง ืืชืืงืืืช /tmp. ืืขืืืื ืขื podcastfy ืฆืจืื ืืืืื ืื ืืืฆืืจ ืืช ืื ืืงืืฆืื ืฉืื ืจืง ืฉื ืืืช ืื ืขืืฉืื ืืฉืืจื ืฉืืืฆืจืช ืืช ืืคืืืงืกื ืขื ืคืจืืืจ ื ืืกืฃ ืฉื ืืืืจืืช ืฉืืื. ืื ื ืจืื ืื:
audio_file = generate_podcast(
urls=["https://en.wikipedia.org/wiki/Podcast"],
conversation_config={
"text_to_speech": {
"temp_audio_dir": "../../../../../../../../../../../../tmp/podcastify-demo/tmp",
"output_directories": {
"transcripts": "/tmp/podcastify-demo/transcripts",
"audio": "/tmp/podcastify-demo/audio"
}
}
}
)
ืืช ืฉื ื ืืขืจืืื ืืชืื output_directories ืงื ืืืืื, ืืื ืื ืืกืืคืืจ ืขื ืื ืื ืงืืืืช ื temp_audio_dir ? ื ื, ืื ืืขื ืืื. ืืงืื ืืกืคืจืื podcastfy ืืฉืืจืืช ืืืืืช ืืืคืืืช ืืขืจื ืฉืื ื ืืขืืืจ ืืื:
def _setup_directories(self) -> None:
"""Setup required directories for audio processing."""
self.output_directories = self.tts_config.get("output_directories", {})
temp_dir = self.tts_config.get("temp_audio_dir", "data/audio/tmp/").rstrip("/").split("/")
self.temp_audio_dir = os.path.join(*temp_dir)
base_dir = os.path.abspath(os.path.dirname(__file__))
self.temp_audio_dir = os.path.join(base_dir, self.temp_audio_dir)1 418
API Gateway Lambda Proxy Input Format
Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format
context: object, required
Lambda Context runtime methods and attributes
Context doc: https://docs.aws.amazon.com/lambda/latest/dg/python-context-object.html
Returns
------
API Gateway Lambda Proxy Output Format: dict
Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html
"""
audio_file = generate_podcast(urls=["https://en.wikipedia.org/wiki/Podcast"])
print(audio_file)
return {
"statusCode": 200,
"body": json.dumps(
{
"message": "Audio File Created",
}
),
}
ืืืขืฆื ืืื ืืืืฆืจ ืคืืืงืกื ืืืฃ ื wikipedia ืฉืืืจ ืืืชื ืืชืืงืืื ืืืงืืืืช ืืืืฆื. ืื ื ืืืืข ืื ืืืืื ืืืืืื ืืื ืืกืคืืง ืืื ืืฉืืื ืืืืืื ืฉืื ื.
ืืืจื ืฉืื ืืชื ืืช ืืืืื' ืื ื ืืืื ืืืจืืฅ ืืช ืืคืื ืงืฆืื ืขื:
sam local invoke HelloWorldFunction --debug
ื --debug ืืื ืืืคืฆืืื ืืื ืืื ืืืืืฅ ืืืื ืื ืืฉืืืจืื ื ืฉืืจืื ืืชื ืจืืฆืื ืืืขืช ืืื. ืื ืืงืืชื ืืช ืคืจืืืงื ืืืืืื ืฉืื ืื ืื ืจืื ืืขืืื ืืืืืช ืฉืชื ืืืืจืืช ืืงืืืฅ ื template.yaml:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
PackageType: Image
Timeout: 600
MemorySize: 3008
ืืืืจืช ื Timeout ืืฉืืื ืื ืืืฆืืจ ืคืืืงืกืืื ืืืงื ืืื ืืืจืืจืช ืืืืื 10 ืฉื ืืืช ืงืฆืจื ืืื. ืืืื ืืืืืจืื ืืืจืืจืช ืืืืื ืืื 128 ืืื ืฉืื ืื ืงืื ืืื, ืืคื ืืชืืขืื ืืคืฉืจ ืืืงืฆืืช ืขื 10 ื'ืืื ืืื ืื ืืกืืืื ืฉืื 3 ื'ืืื ืืื ืืืงืกืืืื ืฉืืฆืืืชื ืืงืื ืืืื ืื ืืืืื ืฉืืฉืืจืชื.
ืื ืืคืื ืงืฆืื ืจืฆื ืืงืืืืช ืืืื ืขืืื ืืคืฉืจ ืืืืฉืื ืืฉืื ืืื.
ืืฆืืจืช ืืฉืชืืฉ AWS
ืืฉืืื ืืืขืืืช ืืช ืืงืื ื Lambda ืขื AWS ืืฉ ืืืฆืืจ ืืฉืชืืฉ ืืกืจืืืก IAM ืฉืืื ืืืชืช ืื ืืกืคืืง ืืจืฉืืืช ืืื ืืืขืืืช ืืช ืืงืื. ืืืื ืืืืืช ืฉืืคืฉืจ ืืืฉืชืืฉ ืคื ืืืฉืชืืฉ ืืจืืฉื ืฉืืื (ืื ื ืืกืืชื), ืืืื ืืงืจื ืื ืืชื ืืืฆืจืื ืืฉืชืืฉ ืืืื ืื ืืกืคืืง ืืจืฉืืืช ืชืงืืื ืืืืขืช ืฉืืืื ื deploy ืืื ืืคืฉืจ ืืืืกืืฃ ืืจืฉืืืช ืืคื ืื ืฉืืื ืืืงืฉ ืืืฉ ืื ืืคืชืืจ ืืืืฉืง ืฉืขืืฉื ืืช ืื ืืืืืืืืช. ืืืจืฉืืืช ืฉืื ื ื ืชืชื ืืกืืคื ืฉื ืืืจ ืืื:
1. AmazonAPIGatewayAdministrator
2. AmazonS3FullAccess
3. AWSCloudFormationFullAccess
4. AWSLambda_FullAccess
ืืื ืืกืฃ ืื:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:CreateServiceLinkedRole"
],
"Resource": "arn:aws:iam::*:role/aws-service-role/apigateway.amazonaws.com/AWSServiceRoleForAPIGateway",
"Condition": {
"StringLike": {
"iam:AWSServiceName": "apigateway.amazonaws.com"
}
}
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:CreateRepository",
"ecr:GetAuthorizationToken",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload",
"ecr:PutImage",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:TagResource",
"ecr:DescribeRepositories",
"ecr:DeleteRepository",
"ecr:SetRepositoryPolicy",
"ecr:GetRepositoryPolicy"
],
"Resource": [
"arn:aws:ecr:us-east-1:124355662604:repository/*"
]
},
{
"Effect": "Allow",
"Action": "ecr:GetAuthorizationToken",
"Resource": "*"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:CreateServiceLinkedRole",
"iam:CreateRole",
"iam:DeleteRole",
"iam:GetRole",1 418
ืืืจืื: ืืื ืช ืกืืืื ืืืจืฆืช ืงืื ืคืืืชืื ื AWS Lambda
ืื ืืฉ ืืฉืื ืฉืืืคืืื ืืช AWS ืื ืืคืขืจ ืืื ืืชืืืืจืื ืืคืจืงืืืงื. ืงื ืืืื ืืชืืจ ืื ืื ื ืจืืฆื ืืขืฉืืช ืืื ืืืจื ืืืคืื ืืช ืื ืืงืื ืืจืื ืืืจืื ืืกืชืืืื. ืืืืจืื ืืืื ื ืจืื ืืื ืืืคืขืื ืชืืื ืืช ืคืืืชืื ืขื Lambda, ืื ืืืื ืืืฉืชืืฉ ืืืจื ืืืื ืืชืงื.
ืืชืงื ืช ืืืืื
ืืฆืืจื ืืืืจืื ืื ื ืื ืื ืฉืืฉ ืืื ืขื ืืืืื ื ืืช ืืืืื ืืืืื ืืืชืงื ืื:
1. ืืื ืฉืืจืช ืืคืงืืื ืฉื AWS. ืืชืงื ื ืืืื: https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html.
2. ืืื ืฉืืจืช ืืคืงืืื SAM. ืืชืงื ื ืืืื: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html
3. ืืืงืจ. ืืชืงื ื ืืืื: https://docs.docker.com/
4. ืืืื ืืืืืฅ ืืืจืืฅ ืืช ืืืืจืื ืืืืื ืช ืืื ืืงืก ืืืจืืืืงืืืจื
x86_64 ืื ืื ืืืจืืืืงืืืจื ืขืืื ืจืฅ ื Lambda. ืืขืืืื ืขื ืืืง ื ืชืงืืชื ืืืืื ืชืงืืืช ืืืืจืืช ืชืื ืืื ืฉื ืขืืื ืืืืจื ืืฉืขืืจืชื ืืืื ืืงืก.
ืืืืืื ืื ื ืื ืื ืฉืืฉ ืืื ืืฉืชืืฉ ืขื AWS.
ืืคืืกื ื ืฉืชืืฉ ื SAM ืฉืืื ืืจืืื ืฉื CloudFormation, ืืืืืจ ืืื ืืชืืืืจ ืืจืืืืงืืืจื ืืืืฆืขืืช ืงืืืฅ yml ืืืจืฆืชื ืืงืืืืช ืืืืฅ ื AWS ืืื ืืืืืง ืฉืคืื ืงืฆืืืช ื Lambda ืฉืืฆืจื ื ืขืืืืืช. ืืืฉืืืื ื localstack ืขืืื ืืชืืชื ืืคืืกืืื ืงืืืืื, ืกืื ืืจืืฅ ืจืง ืคืื ืงืฆืืืช Lambda ืืื ืืืื ืืช ืฉืืจืืชื AWS ืืืืจืื.
ืชืื ืืช ืืคืจืืืงื
ืืฉืืื ืืืืืื ืื ื ืืื ื ืคืจืืืงื ืฉืืืฆืจ ืคืืืงืกื ืขื ืกืคืจืืืช podcastfy. ืืฆืจืชื ืืช ืชืื ืืช ืืคืจืืืงื ืืจื ืืื ืฉืืจืช ืืคืงืืื SAM ืขื ืืคืงืืื:
$ sam init
ืืชื ืืืืืื ืืขืฉืืช ืืช ืื ืืืืืืจ ืืืชืคืจืื ืืืฆืืจ ืคืจืืืงื ืคืืืชืื ืขื ืืกืืก Image, ืื ืืงืืช ืืช ืืงืืฆืื ืืชืื ืืช ืืคืจืืืงื ืฉื ืืคืืกื ืืืืืืื ืืื:
https://github.com/ynonp/lambda-podcastfy/tree/main
ืืฆืืจื ืืืืืื ืื ื ืืจืืฅ ืชืืื ืืช ืคืืืชืื ืฉืืฉืชืืฉืช ืืกืคืจืืืช podcastfy ืืืฆืืจืช ืคืืืงืกืืื. ืืกืคืจืื ืชืชื ืื ื ืืืืื ืืช ืืืขืช ืืืกืคืจ ื ืงืืืืช ืจืืืฉืืช ืฉื Lambda. ืื ืืชื ืืืงืืื ืืช ืืงืื ืฉืื ืืืืืืื ืชืฆืืจืื ืืืฆืืจ ืืชืื ืชืืงืืื hello_world ืงืืืฅ .env ืืืื ื ืืื:
GEMINI_API_KEY=
OPENAI_API_KEY=
ืืื ืืฉ ืืืื ืืช ืืืคืชืืืช ืืคื ืื ืืฉืืื ืฉืื ืืขืืื.
ืื ืืื ืืืจืฆื ืืงืืืืช
ืืฉืืื ืืื ืืช ืืช ืืคืจืืืงื ืืงืืืืช ื ืืื ืืืจืืฅ:
$ sam build --use-container
ืืชืืกืคืช --use-container ืืืจืืช ื SAM ืืืจืืฅ ืืช ืืื ืืื. ืื ืืื ืืืงืฉืจ ืืื ืื ืื ืืื ืฉื ืืืื' ืฉืืชืืื ืชืจืืฅ ื Lambda ืฉืื ื. ืืคืฉืจ ืืจืืืช ืืืขืืื ืืช ื Dockerfile ืืงืืืฅ hello_world/Dockerfile ืืืชืืื ืฉืื ืืคืจืืืงื ืืืืืื ืืื:
FROM public.ecr.aws/lambda/python:3.12
WORKDIR /var/task
RUN mkdir -p /var/task/ffmpeg && \
cd /var/task/ffmpeg && \
curl -O https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz && \
python -c "import tarfile; tarfile.open('ffmpeg-release-amd64-static.tar.xz').extractall()" && \
mv ffmpeg-*-amd64-static/* . && \
rm -rf ffmpeg-*-amd64-static && \
rm ffmpeg-release-amd64-static.tar.xz
ENV PATH="/var/task/ffmpeg:${PATH}"
RUN chmod -R +x /var/task/ffmpeg
COPY app.py requirements.txt ./
COPY .env ./
RUN python3.12 -m pip install -r requirements.txt -t .
* Command can be overwritten by providing a different command in the template directly. *
CMD ["app.lambda_handler"]
ืืคืจืืืงื ืืืืืื ืื ื ืจืืฆื ืืืชืงืื ืืช ืกืคืจืืืช podcastfy ืืืื ืืืจืฉืช ืืชืงื ื ืฉื ffmpeg ืขื ืืืืื ื. ืื ืื ื ืืชืืืืื ืขื ืืืื' ืฉื ืคืืืชืื ืืืืืื ืืืชืืื ืืื ืืืขื ืืืื, ืื ืื ืฉืื curl ืืื ืืคืืื tar ืื ืืืชืงื ืขื ืืืืื' ืืืื ืืฉืืื ืืืชืงืื ืืช ffmpeg ืื ื ืืืจืื ืืช ืืืื ืืจื ืฉืื ืืืฉืชืืฉ ื python -c ืืื ืืคืชืื ืืช ืืืจืืืื. ืืืกืืคืื ืืช ffmpeg ืืจืฉืืืช ืื ืชืืืื ืืืจืฆื ืืืชืงื ืื ืืจืฉืืืช ืืื ืืืฉืืืื ืืืขืชืงืช ืงืืฆื ืืชืืื ืืช (ืืคืจืืืงื ืฉืื ืื ืจืง app.py) ืืงืืืฅ ืืฉืชื ื ืืกืืืื. ืืืจื ืื ืืชืงื ืช ืืชืืืืืช ืืืคืขืืช ืืคืื ืงืฆืื ืืืจืืืืช ืืชืื app.
ืืงืื ื app.py ืืืื ืืื ืื ืืืงืืืืช ืืื:
import json
from podcastfy.client import generate_podcast
import os
def lambda_handler(event, context):
"""Sample pure Lambda function
Parameters
----------
event: dict, required1 418
ืืื ื ืืืจืฉืช ืฉืื ืื
ืืจืื ืืชืืืืืช ืืจืฉืช ืกืืื ื AI ืืืืื ืืชืืืฉื ืฉืื ืื ื ืืชืงืจืืื ืืขืืื ืื ืืืื ืงื ืืืชืจ ืืืชืื ืงืื (ืืฉ ืืื ืืฉืื) ืืืืื ืืคืืื ืฉื ืืื ืืืชืื ืงืื ืืื ืืืชืขืกืง ืืคืจืืื ืืงืื ืื ืฉื ืืขืืืื. ืื ืื ื ื ืชืืจ ืืืืื ืืช ืืืจืืืืงืืืจื ืืื ืื ืืืจ ืฆืจืื ืืขืฉืืช ืื AI ืืืคืื ืืช ืื ืืืืจืืืช ืืกืืืจืืช. ืงืฆืช ืืื ืฉืื ืื ื ืื ืฆืจืืืื ืืืืืจ ืืกืืืื ืืฉืืื ืืืชืื C, ืืื ืฆืจืืืื ืืืืืจ C ืืฉืืื ืืืชืื Java. ืืืกืืจืงืฆืืืช ื ืื ืืช ืขื ืจืขืืื ืืช ืืกืืกืืื ืืืชืจ ืืืืจื ืฉืื ืื ื ืืช ืืืืกืืจืงืฆืื ืืคืฉืจ ืืืืฉืื ืืืื.
ืืืืื ืื ืื ืฉืื ืื ื ืืืืขืื ืขื ืงืื ืืืื ืืืฉืชื ืืช ืื ืืื ืืืืฉืื ืืืื ืืืชืื ืืื ืืืืืจ ืืช ืืคืจืืื? ืืืื ื ืืื ืืืชืื ืจืง ืขื "ืืื ื"?
ืืืขืื ืขื ืืชืืืืจืื ืืืืช ืืื ืฉืืืืื "ืืื ื" ืืขืฆื ืืกืชืืจื "ืื ืืื ื". ืืืื ื ืืงื ืืช ืื ืืืืืื ืกืคืฆืืคืืช: ื ื ืื ืฉืื ื ืืชืื ืช ืจืืืงื ืืื ื ืจืืฆื ืืืืื Vue. ืื ื ืืืื ืื ืื ืคืจืืืืืืจืง ืืืืกืก ืงืืืคืื ื ืืืช ืืื ืื Virtual DOM, ืืืืื ืื ื ืืคืืื ืืขืืฃ ืืื ืืจืื ืืชืืขืื ืฉื Vue ืืจืืื ืฉืืื ืฉื ืืคืชืขืืช ืืืืืืช. ืืื ืขืืฉืื ืื ื "ืืืื" ืืช Vue? ืืจืืจ ืฉืื, ืืขืืื ืื ืขืืืชื ืืืชื.
ืื ื ืื ืืืื ืืืืช ื AI ืืืืชืื ืชืืื ืืืช ื Vue ืขื ืืกืืก ืืืืข ืืืืื ื ืฉืืฉ ืื ืขื ืจืืืงื. ืื ื ืืืื ืืืืขืืจ ื AI ืืื ืืืื ืงืื Vue ืฉืืืฉืื ืืืจ ืืชื ืขืืืจื, ืืื ืืืชืื ืืืืงืืช ืืืืืืืืืช. ืืื ืืฃ ืืืช ืืืืฉืืืืช ืืืื ืื ืชืขืืืจ ืื ืืืืื ืืื ืืืชืจ ืืช Vue.
ืขืืฉืื ืืืื ื ื ืกื ืืฉืืง ืืืจ, ื ื ืื ืฉืืืงืื ืืชืช ื AI ืืืชืื ืืช ืืงืื ืื ื ืืืงืฉ ืืื ื ืฉืืฆืืข ืื 10 ืชืืื ืืืช ืืืชืืจืืช ืืืชืื ื Vue. ืื ื ืืืื ืืืชืื ืืช ืืืื ืืืืจื ืฆืืื ืืชืื ืืชืืขืื ืืื ืืืืื ืืช ืืคืจืืื, ืืืืฉืื ืืืชืื ืขืื 20-30 ืชืืื ืืืช ืืชืื ืจืขืืื ืืช ืฉืขืื ืื ืืืื ืฉืืชืืชื ืืช ื 10 ืืจืืฉืื ืืช. ืืืจื ืื ืชืืื ืืช ืื ื ืคืื ื ื AI ืืืืงืฉ ืฉืืืชืืจ ืืืชื - ืฉืืกืืืจ ืื ืืืขืชื ืขืื ืืคืฉืจ ืืฉืคืจ ืืงืื. ืืืจื ืื ืืืคืฉ ืืจืฉืช ืื ืืฆืขื ืฉืื ืืื ืกื ืืืืฉ ืืืชื ืืขืฆืื. ืืืจื ืืื ืฉืืืขืืช ืื ืืืืฉืื ืืืื ืืจืืจ ืฉืื ื ืืืื ืืช Vue ืื ืืื, ืืื ืื ืืจืืจ ืฉืขืืืชื ืงืฉื ืืฉืืื ืืืื ื ืืืืช. ืืื ืื ืืืงืจื.
ืื ืืจืืจ ืฉืื ืืฉ ืืื ืืื ื ืืืื ืฉื ื ืืฉื, ืืืืช ืฉืืชืืืฆืชื ืืื ืืช ืืืืจื ืืืืฉืื ืื ืฉื ืื ืืฉืขืืชื ืืื ืืื, ืืืข ืืืืขืืช ืื AI ืืืื ืืขืืืจ ืืื ืืืชืื ืงืื ืืืชืจ ืืืจ, ืืืืืื ืชืืืื ืืืืื ืืืชื ืืืืืง ืืื ืืขืืื ืืื ืื ืืขืฉืืช ืฉืืืืืช. ืืืจืืจ ืฉืขื AI ืืคืฉืจ ืืืชืื ืืืจืื ืื ืืฉืื ืืืื ืื ืืืื ืืืคืขืืื ืื ืขืืื, ืืื ืฉืคืขื ืืื ืืคืฉืจ ืืืขืชืืง ืงืืขื ืงืื ื Stack Overflow ืืืคืขืืื ืื ืขืื. ืฉื ื ืืืงืจืื ืื ืืืคืื ืืชืื ืืืชืื ืชืื ืืืจืืงืื.
ืืื ื ืื ืืืื. ืชืฉืงืืขื ืืืืืื. ืื ื"ืืืืื ืืืืื ืืื ืื ืขืืื ืืืืคืขืื AI". ืืืืื ืืืืช. ืืืช ืืืจื ืืืืื ืืืืชืจ ืืงืื ืขืจื ื AI
1 418
ืืืค ืืื: ืืื ื ืขืืื ืืืืคืืืื
ืืงืื ืืื ื Vue ืืจืื ืขื ืืืกื ืืช ืืืงืกื Hello Vue:
<template>
<template v-if="true">
<p>Hello Vue</p>
</template>
</template>
ืืื ืื ืืืจ ืื ืืจืื ืืืื:
<template>
<template>
<p>Hello Vue</p>
</template>
</template>
ืืืื ื ืจืื ืืื.
ืืืื ื template ื HTML
ื HTML ืืฉ ืืืื ื ืืฉื template ืฉืืืคืฉืจ ืื ืื ืฉื Web Components. ืืงืื ืฉื ืืฆื ืืชืื ืืืคืืืื ื HTML ืืืืจ ืืืืืขื ืืชืื ืงืื JavaScript ืืื ืืืฆืืจ ืืืื ื ื DOM ืืฉืื ืืืืืจ ืืืชืจ. ืืงืื ืืื ืืื ืืื HTML ืชืงื ื ืืืืจื, ืฉืืื JavaScript ืื ืืจืื ืืืื ืขื ืืืกื:
<my-counter></my-counter>
<my-counter></my-counter>
<my-counter></my-counter>
<template id="counter">
<p>I'm a counter. value = <span class="value">0</span>
<button class="inc">+1</button>
<button class="dec">-1</button>
</p>
</template>
ืืืื ื template ื Vue
ื Vue ืืืืื ื template ืืฉ ืืกืคืจ ืชืคืงืืืื, ืืฉื ืืื ืฉืจืืืื ืืืื ืืืืืื ืฉืื ื ืื:
1. ืืืื ื template ืืืคืฉืจ ืืืืจ ืืื ืืื ืืืื ืืื ืขืืืจ Directive ืืื, ืืืืืื ืืืฆืื ืื ืืืกืชืืจ ืืกืคืจ ืืืื ืืื ืืคื ืชื ืื ื v-if ืื ืืืืืจ ืขื ืืกืคืจ ืืืื ืืื ืืืืืื ื v-for.
2. ืืืื ื template ืืืคืฉืจ ืื ืืื ืฉื ืชืืืช template ื HTML.
ืืืื ืืื ืืืื ืืืืื ืืฉื ื ืืชืคืงืืืื ืืชืืืื ื? ืืคื ื Directives: ืื ืืฉ ื template ืคืงืืืืช ืืื v-if ืื v-for ืืื ื ืืฉื ืืืืคืืืื ืฉืืืืจ ืืื ืืืจืื ืืื, ืื ืืื ืื ืืื ืืืคืืข ืืชืืจ ืืืื ื template ื HTML.
ื ESLint ืืฉ ืืื ืืฉื vue/no-lone-template ืฉืืืื ืฉืืืืฉ ื template ืืื directives ืืืขืืจ ืขืืื. ืืคืฉืจ ืืงืจืื ืขืืื ืืื:
https://eslint.vuejs.org/rules/no-lone-template1 418
subject: "[ืคืืกื ืืืฉ] #{@post.title}",
template_data: recipients_with_tokens.map { |email, token| { "email" => email, "token" => token } }.to_json
)
ื token ืืื ืงืืขื ืืงืื ืืืื ืืื ืคืจืืืจ ืฉืืืฉืชื ืืื ืืืืืื ืืืขืืจืชื ื ืืขื ืื ืืืืืื ืืืกืืจ ืืช ืขืฆืื ืืืจืฉืืื, ืืืฉืจ ืืื ื ืืขื ืืฉ token ืฉืื ื. ืืคืฉืจ ืืืืกืืฃ ืืืื ืคืจืืืจืื ืฉืจืืฆืื ืฉื ืืืฉืืื ืืฉืชืื ืืืชื ืืืืฃ ืืืืื ืื ืื ื ืฆืจืืืื ืจืง ืืฆืืื ืืช ืฉืื ืืชืื ืกืืืจืืื ืืกืืืกืืื ืืคืืืื ืืืืืื:
<%= subscriptions_edit_url %>?token={{token}}&remove=all
ืชืืื ืืืช ืืขืชืื
ืขื ืืืจื ืืขื ืื ืืืชืขืกืงืืช ืขื ืงืื ืืืืืืื ืืืกืคืชื ืื ืื ืื ืื ืฉื ืืืืืช ืืคืื ืืื ืฉืจืืฆื ืืงืื ืืช ืืคืืกืืื ืืืืื, ืื ืฉืขืืฉืื ืื ืชืจืฉืื ืืช ืืืืื ืฉืืื ืืชืืืช ืืจืืฉืื ืชืงืืื ืืืืขื ืฉืืชื ืฆืจืืืื ืืืืช ืืช ืืชืืืช ืืืืื, ืืืขืจืืช ืชืฉืื ืืื ืืืืืื ืืจืง ืืืจื ืืืืฆื ืขื ืืืคืชืืจ ืฉืืืืื ืืืืช ืืืกืืฃ ืืชืื ืืจืฉืืืช ืืชืคืืฆื. ืืฆืืจื ืืืืช ืื ื ืืงืืื ืืฉืืื ืืช ืืืืืืื ืืืืชืจ ืื ืฉืื ืจืืืื ืืื ืืืคืืืช ืืืืื.
ืื ืืกืฃ ืื ืจืื ืฉืืืขืืจ ื AWS ืฉืื ื ืืืง ืืืืืจืืช ืืฉืืื ืฉืื ืืืื ืืืง ืืื ืืืื ืจืืืื ืืช ืืืืืืื ืืืื ืืืชืืืช ืืืจืช ืื ืืคืืื ืืชืืืช ืืกืคืื. ืื ืื ืืืฆื ืืืงืฉื ืชืกืื ื ืืืืื ืื ืืื ืฉืฆืจืื ืฉืืืืื ืืื ื ืกืคืื ืืชืืจืจื ืืืชื ืืชืืืช ืืืืืจ ืื ืื ืก.
ืืกืืื ืื ืืืืืืฉืื ืกืืื ืืชืืฆืื ืืื ืืฉืื ืืืื ืืืืจืื ืื ืืืืื ืืื ื ืืคืกืืง ืืืืืข ืื ืชืืื ืืืืืืื, ืืื ืืืชืจ ืืงืจืื ืืช ืืคืืกื ืืืชืื ืื (ืืคืฉืจ ืืืืื ืืื ืืื ืืืืืืืื ืืืฉื ืื ืฉืื ืืฉ ืืื ืืชืืื) ืืื ืฉืืืืืง ืื ืงืจื ืืื ืฆืจืื ืืืกืืฃ ืืชืื ืืืืฉ ืืจืฉืืื.1 418
ืฉืืืืช ืืืื ื Rails ืืจื AWS SES
ืืืืื ืืืืจืื ืื ืื ื ืขืืื ืขื ืฉืื ืื ืื ืื ืื ืฉืืืืช ืืืืืืื ืฉื ืืืชืจ ืืืฉืืื ืืจื AWS ืืืงืื ืืจื Mailgun. ืื ืงืืจื ืงืฆืช ืืืื ืืขืืืืช ืืืืจ ืฉื ืืืืืืื ืืืจืื ืืืื ืฉืจืฆืืชื ืืฉืืง ืขื ืขืื ืกืจืืืก ืฉื AWS. ืืื ืชืืื ืืฆืื ืืืจืื ืืกืชืืืื ืืืคืืกื ืืื ืืกืื ืืช ืืืกืชืืืืืืช ืืืจืืืืืช ืืื ืชืืื ืืืช ืืขืชืื ืืืื ืืืืืืื.
ืฉืืืืช ืืืื ืืืื ืืืืฆืขืืช SMTP
ื ืชืืื ืขื ืื ืฉืคืฉืื: ืื Mailgun ืืื SES (ืฉืืจืืช ืืืืืืื ืฉื AWS) ืชืืืืื ืืคืจืืืืงืื SMTP ืืืจื ืืคืชืืจืื ืืืืฉืง ืืื ืืคืฉืจ ืืงืื ืฉื ืืฉืชืืฉ ืืกืืกืื ืืฉืจืช SMTP ืฉืืฉืื ืืช ืืืืืืื ืืฉืืืืื. ืื ืืืืจ ืฉืืจืืืืก ืื ืื ืฉืื ื ืฆืจืื ืืฉืืื ืืฉืืื ืืืื ืืืื ืืื ืืฉื ืืช ืฉืชื ืคืงืืืืช ืืงืืืฅ ืืงืื ืคืืืืจืฆืื ืฉื ืืกืืืื ืืืืชืื ืืฉืื ืืื:
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: "email-smtp.eu-north-1.amazonaws.com",
port: 587,
user_name: Rails.application.credentials.dig(:aws, :ses, :user_name),
password: Rails.application.credentials.dig(:aws, :ses, :password),
authentication: "plain",
enable_starttls: true,
open_timeout: 5,
read_timeout: 5
}
ืืืื ืื ืฉืืืืช ืืืื ืืจื ืชืฉืชืืช ืืืืืืื ืืืืื ืืช ื Rails ืชืฉืชืืฉ ืืคืจืื ืืืฉืชืืฉ ืืืกืืกืื ืฉืืืืจืชื ืืงืืืฅ ืืกืืกืืืืช ืืชืขืืืจ ืืจื ืืฉืจืช ืฉื ืืืืื.
ืฉืืืืช ืืืื ืืืจืื ืื ืฉืื ืขื ืคืจืืืจืื
ืืกืืคืืจ ืืืืชืจ ืืกืืื ืืื ืืฉืืื ืื ืฉืื ืงืืจืืื Bulk Email. ืื ืืื ืื ืื ืืืชื ืื ื ืฉืืื ืืื ืืช ืืคืืกื ืืื ืืืืืืื. ืืืืืืืื ืืฉ ืื ืื ืื ืืืื ื ืฉืืืคืฉืจ ืืงืจืืืช API ืืืช ืืืืฆืื ืืืืืื ืืืืืช ืื ืฉืื. ื SES ืื ืงืฆืช ืืืชืจ ืืืจืื ืื ืงืจืืืช ื API ืืืืืื ืฉืืื ืืืืืืช ื 50 ื ืืขื ืื (ืืคื ืืชืืขืื, ืื ื ืืกืืชื ืืืชืจ). ืืขืืืื ืืื ืื ืฉืืืคืฉืชื ืืจืฉืช ืฉืืืืช ืืืื ืืืืืช ืืืืื ืฉื ื ืืขื ืื ืชืืื ืืจืื ืืืชืจ ืืืืจื ืืืขืืื ืืจื ื API ืฉืืื.
ืืฉืืื ืืฉืื ืืช ื SDK ืฉื SES ืืชืื ืจืืืืก ืืื ืฆืจืื ืืืฆืืจ ืืฉืื ืฉื ืงืจื Delivery Method, ืฉืื ืืืืืงื ืฉืืืืจืช ืืจืืืืก ืืื ืืฉืืื ืืืืืื. ืื ืืชื ืืืืจืื ืืืคืืกืงื ืืงืืืืช ืืฉืืื ืืฉืืื ืืืื ืืืืฆืขืืช SMTP ืืชืืชื:
config.action_mailer.delivery_method = :smtp
ืื ืืืืจ ืฉืืฉืืื ืืฉืืื ืืืื ืืฉืืื ืืืฉื ืฉืื ืืฆืืจื ืืื ืืช ืืฉืื ืฉืขืืฉื ืืช ืื ืฉืืืืงืช ื SMTP ืฉื ืจืืืืก ืขืืฉื. ืืขืืจืช ืชืืขืื ื AI ืืชืืชื ืืช ืืงืื ืืื ืืชืื ืงืืืฅ ืืฉื ses_delivery_method ืืชืืงืืืช lib:
class SesDeliveryMethod
attr_accessor :settings
def initialize(options = {})
@settings = options.merge(
access_key_id: Rails.application.credentials.dig(:aws, :ses, :access_key_id),
secret_access_key: Rails.application.credentials.dig(:aws, :ses, :access_key_secret),
region: 'eu-north-1'
)
@client = Aws::SESV2::Client.new(region: @settings[:region], credentials: aws_credentials)
end
def deliver!(mail)
template_data = JSON.parse(mail['template-data'].value)
options = {
from_email_address: mail.from.first,
# default_email_tags: tags,
default_content: {
template: {
template_data: {"token" => ""}.to_json,
template_content: {
subject: mail.subject,
text: mail.text_part.body.decoded,
html: mail.html_part.body.decoded
}
}
},
bulk_email_entries: template_data.map do |recipient|
{
destination: { to_addresses: Array.wrap(recipient["email"]) },
replacement_email_content: {
replacement_template: {
replacement_template_data: {"token" => recipient["token"]}.to_json
}
}
}
end
}
response = @client.send_bulk_email(options)
rescue => err
Rails.logger.info("SES Error")
Rails.logger.error(err)
raise err
end
private
def aws_credentials
Aws::Credentials.new(@settings[:access_key_id], @settings[:secret_access_key])
end
def template_data(mail)
{ "subject" => mail.subject, "body" => mail.body.raw_source }.to_json
end
end
* Register with ActionMailer *
ActionMailer::Base.add_delivery_method :ses, SesDeliveryMethod
ืืื ืืฉืืื ืืฉืืื ืืืื ืืจื SES ืื ืื ืฉืฆืจืื ืืขืฉืืช ืืงืื ืืืืฉืื ืืื ืงืจืืืช ืคืื ืงืฆืื ืฉื ืจืืืช ืืขืจื ืื:
mail(
to:,
from: 'Ynon Perek <ynon@tocode.co.il>',
delivery_method: :ses,1 418
ืืืืื ืืืคืงืืช ืืื ืื ืืคืืชืจืื (ืขืืืื)
ืืฉืื ืืืืฉืื ืืชืืื ืืืืืช ืืื ืืืืืช ืืจืืืช ืืืืจืื ืืืืจืืืืืืืฆืื ืืืืื ื ืฉืืืืกืืฃ ืขืื ืืืื ื ืืืื ืืืืืช ืืจืื ืืืชืจ ืืื ืืืฉืจ ืืืืง ืืช ืืฉืจืช ืืงืืื. ืืืจืืช ืขื ื ืืืคืฉืจื ืื ื ืืืจืืฅ ืงืื ืขื ืขืฉืจืืช ืื ืืืืช ืืืื ืืช ืืืงืืื, ืืื ืฉื ืฆืืจื ืืืขืช ืืื ืืืื ืืช ืืฉ ืื ื ืื ืื ืื ืืืื ื ืขืืฉื. ืื ืืขืื ืฉื ืืืืฉืื ืืืืืืื ื ืจืื ืงืจืื ืืชืืื.
ืจืง ืฉื ื ืืืจืื ืืคืจืืขื ืืืืืื:
1. ื Scale ืืืื ืฉืจืชื ืขื ื ืืืฆืืื ืืืื ืืงืจืื ืืืฉืืืื ืืขืืืื ืขื ืฉืจืชืื ืคืืืืื.
2. ืคืืชืื ืืขืจืืืช ืืืืืจืืช ืืื ืืืชืจ ืืืจืื ืืคืืชืื ืืขืจืืืช ืขื ืฉืจืช ืืืื.
ืืืขืืจ ืืืจืืืืงืืืจืช ืฉืจืช ืืืื ืืืจืืืืงืืืจืช ืขื ื ืืกืืื ืืจืื ืืืชืจ ื"ืืืื ื ืืกืืฃ ืฉืจืชืื". ืขืืื ื ืืืืฆืจ ืืขืจืืืช ื ืืืื, ืืขืจืืืช ืืขืงื, ืืืคื ืืืขืืืช ืกืื ืืจืื ืืืืืฉืืื ืืช, ืื ืื ืืจื ืืืงืฆืืืช ืื ืืืื ืืืชื. ืืืจ ืืืื ืชืืกืคืช ืฉืจืชืื ืืืจืฉืช ืชืืกืคืช ืฉื ืขืื ืืขืื ืฉืืจืืชื ื ืืืื ืืืืฉืงืื ืขื ืืืชื ืฉืจืชืื.
ืงืื ืืจืืข ืื ืืฉืชืคืจ ืจืง ืื ืื ืื ื ืืจืืฆืื ืืืชื ืขื ืืืชืจ ืืืื ืืช ืื ืขื ืืืื ืืช ืืืชืจ ืืืงืืช. ืจืื ืืืื ืืคืืื ืงืืจื ืืืืคื. ืืคื ื ืฉืขืืืจืื ืืขื ื ืืืื ื ืืืื ืฉืขืฉืื ื ืื ืื ืฉืืคืฉืจ ืืื ืืฉืคืจ ืืช ืืืืฆืืขืื ืฉื ืืืขืจืืช ืฉืื ื ืืจืืช ืืงืื ืืื ืื ื ืื ืฆืืื ืืช ืืืฉืืืื ืฉืืฉ ืื ื ืืืืคื ืืืื ืืืืชืจ. ืืืื ืืืจื ืืืคืืืืืืฆืื ืืงืื ืืื ืืืื ืืฉืืืื ื ืืื ืฉืื ืื ื ืืขืฆื ืืืืจืื ืืกืคืืง ืืื ืฆืจืืืื ืืช ืืขื ื.
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
