Skip to content

Commit

Permalink
add challenge 12
Browse files Browse the repository at this point in the history
  • Loading branch information
amiremohamadi committed Jan 19, 2025
1 parent 1b1fbc8 commit c2a5f71
Showing 1 changed file with 136 additions and 0 deletions.
136 changes: 136 additions & 0 deletions content/~challenge/12.md
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 >}}

0 comments on commit c2a5f71

Please sign in to comment.