-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
1b1fbc8
commit c2a5f71
Showing
1 changed file
with
136 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,136 @@ | ||
--- | ||
title: "چالش ۱۲" | ||
date: 2025-01-19T00:00:00+00:00 | ||
persianDate: 1403-10-30 | ||
layout: post | ||
summary: سوال پیچ | ||
type: news | ||
darft: true | ||
--- | ||
|
||
{{< rawhtml >}} | ||
<style> | ||
.highlight { | ||
background-color: #303030; | ||
} | ||
code { | ||
direction: ltr; | ||
} | ||
</style> | ||
{{< /rawhtml >}} | ||
|
||
این چالش شما رو با جنبههای مختلف یک پروژه واقعی مثل استفاده از ابزارهای بیلد و دیپلوی، کار تیمی، بهینهسازیهای IO و شبکه، استفاده از دادهساختارهای مناسب و ... آشنا میکنه. تا حد زیادی هم دستتون بازه که از چه زبان و کتابخونه و فریمورکهایی استفاده کنید. | ||
|
||
هر یک ساعت بطور خودکار یک تست Load روی پروژهتون انجام میشه و نتایج داخل اسکوربورد همین صفحه بروزرسانی میشن. پس راهحلتون: | ||
- قبل از هر چیز، باید خروجی درستی داشته باشه و مطابق توضیحات رفتار کنه. | ||
- در قدم دوم، هر چی سریعتر و بهینهتر باشه امتیاز بیشتری میگیرین. رفته رفته تعداد درخواستهایی که در یک ثانیه به سرویس شما ارسال میشه افزایش پیدا میکنه تا جذابیت چالش بیشتر بشه. | ||
|
||
همه کدها به صورت پابلیک در دسترسه، پس میتونید کد بقیه شرکتکنندهها رو هم پیدا و review کنید. | ||
|
||
### شرکت در چالش نیاز به دانش فنی خاصی داره؟ | ||
بطور کلی: | ||
- راهحل عمومی چالش به اندازه کافی ساده ست. پس اگه مبتدی هستین فرصت خوبیه تا با حلش مهارتهای جدیدی یاد بگیرین و با جنبههای مختلف یه پروژه واقعی آشنا بشین. میتونید از لینکهای این صفحه برای راهنمایی استفاده کنید یا داخل [گروه تلگرام](https://t.me/birlug) از بقیه کمک بگیرین. | ||
- اگه باتجربه هستین فرصت خوبیه تا مهارتهاتون رو به چالش بکشین و ببینیم تا چه حد میتونید برنامهای بهینه بنویسید. استفاده از زبانها و تکنولوژیهای مختلف، ساختمان دادههای مناسبتر، متغیرهای اتمیک و مکانیزمهای کانکارنسی میتونه در سریعتر بودن خروجی تاثیرگذار باشه. | ||
|
||
### چطوری جوابم رو submit کنم؟ | ||
کافیه لینک پروژهتون روی گیتهاب رو با فرمت زیر به [این فایل](https://github.com/birlug/soallpeach/blob/master/participants.yml) اضافه کنید و [پولریکوئست](https://www.youtube.com/watch?v=EJ8MpRDozmY) بفرستین: | ||
|
||
```yaml | ||
- nickname: my-nickname | ||
profile: https://github.com/birlug | ||
repository: https://github.com/birlug/soallpeach | ||
``` | ||
### چالش | ||
هدف اصلی این چالش آشنا کردن شرکتکنندهها با مفاهیم پایه http و همینطور مقایسه ویژگی زبانها و فریمورکهای مختلف برا حل کردن یه مساله به نظر پیش پا افتاده است. | ||
کاری که برای شرکت در این چالش نیازه انجام بدید پیادهسازی دو http endpoint ساده است. یکی از این endpoint ها وظیفهاش دریافت عدد و جمع اون با اعدادیه که تا به حال دریافت کرده و وظیفه endpoint دیگه برگردوندون مجموع کلی اعدادی است که تا به حال این سرویس دریافت کرده. | ||
#### اندپوینت `/` | ||
|
||
این endpoint درخواستها رو با متد POST دریافت میکنه و مسیر اون هم `/` است. مثال زیر نمایش نحوه صدا زدن این endpoint ئه: | ||
```sh | ||
$ curl -XPOST -d 6 localhost:80/ | ||
``` | ||
در این مثال عدد ۶ برای سرویس ارسال میشه و انتظار ما اینه که مقدار ۶ به مجموع اعدادی که تا به حال به سرویس ارسال شده اضافه بشه. | ||
|
||
#### اندپوینت `/count` | ||
|
||
این endpoint درخواستها رو با متد GET دریافت میکنه و مسیرش `/count` هست. مثال زیر نمایش نحوه صدا زدن این endpoint ئه: | ||
```sh | ||
$ curl localhost:80/count | ||
``` | ||
اگه فرض کنیم که مثال قبلی، یعنی ارسال عدد ۶ به `/` ۱۰ بار انجام شده باشه، مقدار خروجی مثال بالا باید 60 باشه. | ||
|
||
### ساختار پروژه | ||
پروژه شما باید داخل یه دایرکتوری با اسم `countme` باشه و حتما یک Dockerfile برای بیلد و اجراش نوشته باشید. مثلا: | ||
```sh | ||
-> countme/ | ||
| | ||
-> Dockerfile | ||
-> main.py | ||
-> requirements.txt | ||
``` | ||
از [این لینک](https://github.com/birlug/soallpeach/tree/sample) میتونید پیادهسازی ساده این برنامه، ساختار دایرکتوریهای پروژه و همینطور Dockerfileش رو ببینید. | ||
|
||
### جدول نتایج | ||
{{< rawhtml >}} | ||
<table id="reportTable"> | ||
<thead> | ||
<tr> | ||
<th>Nickname</th> | ||
<th>Duration</th> | ||
<th>State</th> | ||
</tr> | ||
</thead> | ||
<tbody> | ||
</tbody> | ||
</table> | ||
|
||
<script> | ||
const url = 'https://raw.githubusercontent.com/birlug/soallpeach/refs/heads/master/report.json'; | ||
|
||
async function fetchData() { | ||
try { | ||
const response = await fetch(url); | ||
if (!response.ok) { | ||
throw new Error(`HTTP error! Status: ${response.status}`); | ||
} | ||
const data = await response.json(); | ||
populateTable(data); | ||
} catch (error) { | ||
console.error('Error fetching data:', error); | ||
} | ||
} | ||
|
||
function populateTable(data) { | ||
const tableBody = document.querySelector('#reportTable tbody'); | ||
tableBody.innerHTML = ''; | ||
|
||
data.forEach(entry => { | ||
const { nickname, result, state } = entry; | ||
const duration = result?.metrics?.duration || 'N/A'; | ||
|
||
const row = document.createElement('tr'); | ||
|
||
const nicknameCell = document.createElement('td'); | ||
nicknameCell.textContent = nickname; | ||
row.appendChild(nicknameCell); | ||
|
||
const durationCell = document.createElement('td'); | ||
durationCell.textContent = duration; | ||
row.appendChild(durationCell); | ||
|
||
const stateCell = document.createElement('td'); | ||
stateCell.textContent = state; | ||
row.appendChild(stateCell); | ||
|
||
tableBody.appendChild(row); | ||
}); | ||
} | ||
fetchData(); | ||
</script> | ||
{{< /rawhtml >}} | ||
|