Syntax | سینتکس – Telegram
مهندس نرم افزاره مدیر عامل شرکتشو سر پرداخت نکردن حقوقش کشته 🫠

#fun

@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
😍54❤‍🔥4👏3😁3
Syntax | سینتکس
مهندس نرم افزاره مدیر عامل شرکتشو سر پرداخت نکردن حقوقش کشته 🫠 #fun @Syntax_fa
اگه کارفرمایی
ری اکشنارو میبینی؟
به خودت بیا مرد/زن
وگرنه «شاید برای شما هم اتفاق بیوفتد» 🔪
Please open Telegram to view this post
VIEW IN TELEGRAM
😁19👌5
Serialization و Encoding

Serialization
سریالیزیشن فرآیندی است که طی آن یک شیء (object) در حافظه به یک فرمت قابل حمل تبدیل می‌شود تا بتوان آن را ذخیره کرد یا از طریق شبکه ارسال نمود. این فرایند شامل تبدیل وضعیت (state) یک شیء به یک رشته بایت (byte stream) است که می‌تواند بعداً deserialized شود تا شیء اصلی بازیابی شود.

موارد استفاده از Serialization:
- ذخیره‌سازی پایدار: برای ذخیره‌سازی اشیاء در فایل‌ها یا پایگاه داده‌ها به طوری که بتوان بعداً آنها را بازیابی کرد.
- انتقال داده‌ها: برای ارسال اشیاء بین سیستم‌های مختلف از طریق شبکه، مثلاً در پروتکل‌های ارتباطی یا وب سرویس‌ها.
- کپی عمیق (Deep Copy): برای ایجاد نسخه‌ای دقیق از یک شیء.

فرمت‌های متداول Serialization:
- JSON: یک فرمت متنی سبک که برای تبادل داده‌ها بین سرور و وب مناسب است.
- XML: یک فرمت متنی که برای ذخیره و انتقال داده‌ها استفاده می‌شود و بیشتر در سیستم‌های سازمانی کاربرد دارد.
- Protocol Buffers: یک فرمت باینری کارآمد و فشرده که توسط گوگل توسعه یافته است.
- Avro: یک فرمت باینری که توسط Apache برای استفاده در سیستم‌های بزرگ داده‌ای توسعه یافته است.

Encoding

فرآیندی است که طی آن داده‌ها به یک فرمت خاص تبدیل می‌شوند تا قادر به انتقال یا ذخیره‌سازی باشند. این فرایند می‌تواند شامل تبدیل داده‌های متنی به یک فرمت باینری خاص یا تبدیل داده‌های باینری به یک فرمت متنی باشد.

موارد استفاده از Encoding:
- انتقال داده‌ها: برای اطمینان از اینکه داده‌ها به درستی از طریق شبکه منتقل می‌شوند.
- ذخیره‌سازی داده‌ها: برای اطمینان از اینکه داده‌ها به درستی در فایل‌ها یا پایگاه داده‌ها ذخیره می‌شوند.
- نمایش داده‌ها: برای تبدیل داده‌ها به فرمتی که قابل نمایش یا چاپ باشد.

فرمت‌های متداول Encoding:
- UTF-8: یک فرمت متنی که برای رمزگذاری کاراکترهای یونیکد استفاده می‌شود.
- Base64: یک فرمت متنی که برای رمزگذاری داده‌های باینری استفاده می‌شود به طوری که بتوان آنها را در متن‌های ASCII ذخیره یا انتقال داد.

تفاوت بین Serialization و Encoding

1. هدف:
- Serialization: هدف اصلی serialization تبدیل یک شیء به یک فرم قابل حمل است که بتوان آن را ذخیره یا منتقل کرد و سپس دوباره به شیء اصلی تبدیل نمود.
- Encoding: هدف اصلی encoding تبدیل داده‌ها به یک فرمتی است که قابل انتقال، ذخیره یا نمایش باشد.

2. نوع داده‌ها:
- Serialization: معمولاً شامل تبدیل اشیاء پیچیده و داده‌های ساختاریافته به یک رشته بایت است.
- Encoding: معمولاً شامل تبدیل داده‌های متنی یا باینری به یک فرمت خاص برای انتقال یا ذخیره‌سازی است.

3. فرایند معکوس:
- Serialization: فرایند معکوس serialization، deserialization نامیده می‌شود که طی آن رشته بایت به شیء اصلی تبدیل می‌شود.
- Encoding: فرایند معکوس encoding به decoding معروف است که طی آن داده‌های رمزگذاری شده به فرم اولیه خود بازگردانده می‌شوند.

4. سطح کاربرد:
- Serialization: بیشتر در سطح برنامه‌نویسی و برای انتقال اشیاء بین سیستم‌ها و ذخیره‌سازی پایدار استفاده می‌شود.
- Encoding: بیشتر در سطح شبکه و انتقال داده‌ها و برای اطمینان از اینکه داده‌ها به درستی منتقل یا ذخیره می‌شوند استفاده می‌شود.

#encoding #serialization

@Syntax_fa
👍91👎1
Syntax | سینتکس
Serialization و Encoding Serialization سریالیزیشن فرآیندی است که طی آن یک شیء (object) در حافظه به یک فرمت قابل حمل تبدیل می‌شود تا بتوان آن را ذخیره کرد یا از طریق شبکه ارسال نمود. این فرایند شامل تبدیل وضعیت (state) یک شیء به یک رشته بایت (byte stream)…
توضیحات ساده تر

مفهوم serialization و encoding گاهی ممکن است کمی گیج‌کننده باشد، خصوصاً زمانی که صحبت از تبدیل داده‌ها به فرمت‌های مختلف می‌شود. بیاید یک مثال بزنیم:

تبدیل دیکشنری به JSON

زمانی که یک دیکشنری (یا هر ساختار داده‌ای دیگر) را به JSON تبدیل می‌کنیم، این عملیات serialization نام دارد. در این فرآیند، داده‌های ساختاریافته به یک رشته متنی تبدیل می‌شوند. این رشته متنی، نمایشی از داده‌های اصلی است که در حافظه برنامه وجود دارد.

JSON به عنوان Byte Array


درست است که هر رشته متنی (مانند JSON) در نهایت به صورت بایت‌ها (byte array) در حافظه ذخیره می‌شود، اما این تبدیل به طور ضمنی توسط سیستم انجام می‌شود. یعنی، وقتی ما یک دیکشنری را به JSON تبدیل می‌کنیم، نتیجه یک رشته متنی (string) است که در حافظه به صورت بایت‌ها ذخیره می‌شود. این رشته متنی را می‌توانیم به یک فایل ذخیره کنیم یا از طریق شبکه ارسال کنیم.

تفاوت بین Serialization و Encoding


- Serialization: فرایندی است که داده‌های ساختاریافته را به یک فرمت قابل انتقال یا ذخیره‌سازی (مانند JSON یا XML) تبدیل می‌کند. این عملیات معمولاً شامل تبدیل داده‌های پیچیده به رشته‌های متنی یا باینری است. هدف از serialization این است که داده‌ها را به شکلی تبدیل کنیم که بتوان آنها را ذخیره کرد یا از طریق شبکه انتقال داد.

- Encoding: فرایندی است که داده‌ها را به یک فرمت خاص برای انتقال یا ذخیره‌سازی تبدیل می‌کند. این ممکن است شامل تبدیل داده‌های متنی یا باینری به یک فرمت دیگر باشد. برای مثال، تبدیل یک رشته JSON به Base64 یک عملیات encoding است.

پس

زمانی که دیکشنری را به JSON تبدیل می‌کنیم، نتیجه یک رشته متنی است. این رشته متنی به طور ضمنی به بایت‌ها تبدیل می‌شود زیرا رشته‌ها در حافظه به صورت بایت‌ها ذخیره می‌شوند. اما این تبدیل به بایت‌ها به معنای encoding نیست.

چرا این تبدیل encoding نیست؟

- Serialization: زمانی که دیکشنری را به JSON تبدیل می‌کنیم، این عملیات serialization است زیرا ما داده‌های ساختاریافته را به یک فرمت متنی (JSON) تبدیل کرده‌ایم.
- Encoding: اگر بخواهیم این JSON را به فرمت دیگری (مانند Base64) تبدیل کنیم تا برای انتقال مناسب‌تر باشد، این عملیات encoding است.

مثال

1. Serialization:
- دیکشنری را به JSON تبدیل می‌کنیم.
- نتیجه: یک رشته متنی (مثلاً {"key": "value"}).

2. Encoding:
- JSON را به Base64 تبدیل می‌کنیم.
- نتیجه: یک رشته متنی دیگر که نمایشی از داده‌های اصلی است (مثلاً eyJrZXkiOiAidmFsdWUifQ==).

#serialization #encoding

@Syntax_fa
👍62
Syntax | سینتکس
توضیحات ساده تر مفهوم serialization و encoding گاهی ممکن است کمی گیج‌کننده باشد، خصوصاً زمانی که صحبت از تبدیل داده‌ها به فرمت‌های مختلف می‌شود. بیاید یک مثال بزنیم: تبدیل دیکشنری به JSON زمانی که یک دیکشنری (یا هر ساختار داده‌ای دیگر) را به JSON تبدیل…
من هنوز فکر میکنم توضیح بیشتر نیازه ولی این دیگه آخریشه 😂

پس میشه گفت encoding زمانی اتفاق می افتد که یک byte array را به یک فرمت دیگه از byte array تبدیل کنیم ؟

دقیقاً. Encoding فرایندی است که طی آن یک byte array (آرایه ای از بایت ها) به یک فرمت دیگر از byte array تبدیل می‌شود. هدف از encoding معمولاً این است که داده‌ها به شکلی تبدیل شوند که برای انتقال، ذخیره‌سازی یا نمایش آسان‌تر یا امن‌تر باشند.

توضیح بیشتر با مثال


مثال 1:
Base64 Encoding
یک روش encoding است که داده‌های باینری را به یک رشته متنی تبدیل می‌کند که شامل تنها کاراکترهای قابل چاپ (A-Z، a-z، 0-9، +، /) است. این روش معمولاً برای انتقال داده‌های باینری به صورت متنی در پروتکل‌هایی مانند HTTP یا ایمیل استفاده می‌شود.

import base64

data = b'This is some binary data.'
encoded_data = base64.b64encode(data)
print(encoded_data) # Output: b'VGhpcyBpcyBzb21lIGJpbmFyeSBkYXRhLg=='

# Decoding
decoded_data = base64.b64decode(encoded_data)
print(decoded_data) # Output: b'This is some binary data.'


#### مثال 2: URL Encoding

URL encoding (یا percent encoding)
فرایندی است که طی آن کاراکترهای خاص در یک URL به یک فرمت خاص تبدیل می‌شوند که برای انتقال از طریق URL مناسب باشد.

import urllib.parse

data = 'This is a string with spaces and symbols: !@#'
encoded_data = urllib.parse.quote(data)
print(encoded_data) # Output: 'This%20is%20a%20string%20with%20spaces%20and%20symbols%3A%20%21%40%23'

# Decoding
decoded_data = urllib.parse.unquote(encoded_data)
print(decoded_data) # Output: 'This is a string with spaces and symbols: !@#'


#encoding

@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥62
یه روش آوردم صد درصد جوابه💅

میگه:
هربار که یه سوال برنامه نویسی دارم که بدجور به کمک نیاز دارم. میرم تو ردیت پستش میکنم بعد با یه اکانت دیگه یه جواب خیلی پرت میدم.
ملت براشون مهم نیست کمک کنن ولی خیلی دوست دارن جواب اشتباهو تصحیح کنن

#fun

@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣30👍7
خب من بعد مدتها تصمیم گرفتم یه پست بذارم و اونم نتیجه یه تجربه که شاید خیلیا مث من دوس دارن چیزای جدید و بروز رو استفاده کنن.
من روی سیستم شرکت از اوبونتو ۲۳.۰۴ فردای روزی که نسخه lts جدید اومد اپگرید کردم به ۲۴.۰۴ و باگای عجیبی رو دیدم که کافر نبینه و مسلمون نشنوه.
از مصرف زیادی منابع تا پر شدن خیلی سریع حافظه تا اخرین بایت ممکن بخاطر لاگ سیستمی.
ریپورت باگ زدم و بهم توصیه کردن از مطالب فوروم اوبونتو کمک بگیرم :(
باگ عجیبترش این بود که وقتی یه برنامه ای رو مکسیمایز میکردی، حدود یک سوم از صفحه که میشد سمت راست صفحه رو نمیشد با موس انتخاب و کلیک کرد :|
با اپدیت های متوالی هم درست نشد و مجبور شدم حدود یه ماه باهاش سر کنم یه جوری و بیشتر کارامو به سیستم ویندوزی کنم تا سر فرصت داونگرید کنم.
دیروز هم اپدیت ۳۰۰ مگابایتی اومد براش، نصب کردم و دیدم اوکی شده مشکلاتش (بجز حجم زیاد لاگ تولیدی که با روشایی که قبلا لاگ رو لیمیت میکردم جواب نداد)

و کلام اخر اینکه اگه میخواید حدودا بدونید چه زمانی مناسبه که به اوبونتو جدید اپگرید کنید، به نظرم زمانی که مینت میخواد نسخه جدید بده زمان مناسبیه (چون مینت بر پایه اوبونتو هستش).
و من الله توفیق...


@Syntax_fa
👍92
Lili (U Turn)
AaRON
❤‍🔥5🔥2
توضیح کامیت مناسب:
یه سری تغییرات کوچیک 😒

#fun

@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣24😁2
الگوریتم Luhn

تاحالا شده که از کاربر شماره کارت و ... رو بگیرید اما نمیدونید چطور میشه در سطح برنامتون اعتبارسنجیش کنید!؟ این پست قراره درباره الگوریتم luhn صحبت کنیم و آخر کار تو کد یه مثال از نحوه اعتبار سنجی شماره حساب بانکی با الگوریتم luhn رو براتون میزنم.

خب قسمت توضیح چت جی بی تی عزیز زحمتو کشیده🤌😘:
الگوریتم Luhn که به عنوان "فرمول Luhn" نیز شناخته می‌شود، یک الگوریتم ساده برای اعتبارسنجی شماره‌های شناسایی است. این الگوریتم توسط Hans Peter Luhn، محقق IBM، در سال 1954 اختراع شده است. الگوریتم Luhn به طور گسترده در اعتبارسنجی شماره‌های کارت اعتباری، شماره‌های شناسایی ملی، و شماره‌های شناسایی دیگر استفاده می‌شود.

نحوه عملکرد الگوریتم Luhn

1. ورودی:
- یک رشته از ارقام که باید اعتبارسنجی شود. این رشته معمولاً شامل شماره کارت اعتباری یا شماره شناسایی است.

2. مراحل:
- از سمت راست به چپ شروع کنید و هر عدد دوم را دو برابر کنید. اگر دو برابر کردن یک عدد منجر به یک عدد دو رقمی شد (یعنی بزرگتر یا مساوی 10)، جمع ارقام آن عدد را به دست آورید (برای مثال، 18 تبدیل به 1 + 8 = 9 می‌شود).
خراب کردی هوش مصنوعی جان😒😒
بذار با یه روش ساده توضیح بدم:
از عدد سمت چپ شروع میکنیم. یکیو ضربدر دو میکنیم. بعدی رو ضربدر یک و حاصل رو جمع میکنیم. اگه موقعی که داریم ضربدر دو میکنیم، عدد بزرگ تر از 9 شد، 9 تا ازش کم میکنیم.
مثلا عدد ما 7 هستش ضربدر دو میشه 14 چون از 9 بزرگ تر شده منهای 9 میکنیم پس میشه 5.
در نهایت حاصل جمعی که بدست آوردیم باید باقی موندش به پیمانه که 10 هستش صفر بشه.

مثال

فرض کنید شماره‌ کارت این شخص عزیز که نمیدونیم کی هستش رو میخوایم اعتبارسنجی کنیم. "6037697646845005" است:

1. از چپ به راست شروع می کنیم اولی ضربدر دو، دومی ضربدر یک، سومی ضربدر دو و ... اگه هم بزرگ تر از 9 شده منهای 9 میکنیم:

result =  3 + 0 + 6 + 7 + 3 + 9 + 5 + 6 + 8 + 6 + 7 + 4 + 1 + 0 + 0 + 5

حاصل جمعشون مساوی میشه با 70 پس شماره کارت معتبر هستش 🍸

خب هوش مصنوعی ادامه توضیحاتو بده:
کاربردهای الگوریتم Luhn

1. اعتبارسنجی شماره‌های کارت اعتباری:
- تمامی کارت‌های اعتباری صادر شده توسط شرکت‌های مالی معتبر از الگوریتم Luhn برای اعتبارسنجی شماره کارت‌ها استفاده می‌کنند.

2. شماره‌های شناسایی ملی:
- برخی کشورها از الگوریتم Luhn برای اعتبارسنجی شماره‌های شناسایی ملی استفاده می‌کنند.

3. شماره‌های شناسایی محصول:
- برخی از کدهای محصول و شماره‌های سریال از این الگوریتم برای اطمینان از صحت داده‌های ورودی استفاده می‌کنند.

4. سیستم‌های مالی و بانکی:
- در بسیاری از فرآیندهای پرداخت و انتقال وجه، الگوریتم Luhn برای بررسی صحت شماره‌های حساب و کارت‌ها استفاده می‌شود.

مزایا و محدودیت‌ها

مزایا:
- سادگی و کارایی: الگوریتم بسیار ساده است و به راحتی پیاده‌سازی می‌شود.
- جلوگیری از خطاهای تایپی: بیشتر خطاهای تایپی در وارد کردن شماره‌های شناسایی را تشخیص می‌دهد.

محدودیت‌ها:
- امنیت: الگوریتم Luhn برای امنیت طراحی نشده است و نمی‌تواند از جعل شماره‌ها جلوگیری کند.
- تشخیص محدود: تنها قادر به تشخیص خطاهای ساده است و نمی‌تواند همه انواع خطاها را شناسایی کند.

الگوریتم Luhn به دلیل سادگی و کارایی بالا، به طور گسترده در سیستم‌های مختلف برای اعتبارسنجی شماره‌های شناسایی مورد استفاده قرار می‌گیرد.

بریم سراغ پیاده سازیش تو گولنگ:

package main

import (
"fmt"
"strconv"
)

func main() {
fmt.Println(Valid("6037697646845005"))
}

func Valid(cardNumber string) bool {
var sum int

for i := 0; i < len(cardNumber); i++ {
intNum, _ := strconv.Atoi(string(cardNumber[i]))

if (i+1)%2 != 0 {
if intNum*2 > 9 {
sum += (intNum * 2) - 9
} else {
sum += intNum * 2
}
} else {
sum += intNum
}
}

return sum%10 == 0
}


#luhn

@Syntax_Fa boost
Please open Telegram to view this post
VIEW IN TELEGRAM
👍103🔥3
Syntax | سینتکس
bytes buffer and string builder یکی از انواع داده ای که در اکثر زبان‌های برنامه نویسی وجود دارد و در استفاده از آن باید دقت داشته باشیم نوع string است. قطعه کد زیر را در نظر بگیرید: var query string = "select " query += "name, family " query…
سوال:
تو پایتون چطور از string builder استفاده کنیم؟

جواب:
تو سایت real python یه مقاله خوب راجب اینکه چطور بصورت بهینه با رشته ها کار کنیم هست یکی از مثال هایی که زده اینه:
from io import StringIO

sentence = StringIO()
while True:
word = input("Enter a word (or './!/?' to end the sentence): ")
if word in ".!?":
sentence.write(word)
break
if sentence.tell() == 0:
sentence.write(word)
else:
sentence.write(" " + word)

print("The concatenated sentence is:", sentence.getvalue())


لینک:
https://realpython.com/python-string-concatenation/

#python #string_builder

@Syntax_fa
🔥7👍1🙏1
EOF
ارور EOF یا "End of File" به معنی پایان فایل است و یکی از ارورهایی است که هنگام خواندن فایل‌ها در برنامه‌نویسی ممکن است با آن مواجه شوید. این ارور نشان‌دهنده این است که عملیات خواندن به انتهای فایل رسیده و دیگر داده‌ای برای خواندن وجود ندارد. کاربردها و اهمیت EOF در برنامه‌نویسی به چندین مورد مختلف برمی‌گردد:

کاربردهای EOF

1. پایان‌دادن به خواندن فایل:
    - EOF به برنامه‌نویس اطلاع می‌دهد که دیگر داده‌ای برای خواندن در فایل موجود نیست. این به ویژه زمانی مفید است که شما نمی‌دانید طول فایل چقدر است و می‌خواهید کل محتوا را پردازش کنید.

2. کنترل حلقه‌های خواندن:
    - هنگام خواندن داده‌ها از فایل با استفاده از حلقه‌ها، EOF به شما کمک می‌کند تا بدانید چه زمانی باید از حلقه خارج شوید. این امر باعث جلوگیری از تلاش برای خواندن داده‌های غیرموجود و در نتیجه جلوگیری از خطاهای برنامه می‌شود.

3. ارتباط با منابع خارجی:
    - در ارتباط با منابع خارجی مانند شبکه‌ها یا پایگاه‌های داده، EOF می‌تواند نشان‌دهنده پایان جریان داده باشد. به عنوان مثال، وقتی اطلاعات از یک API دریافت می‌کنید، EOF می‌تواند نشان دهد که تمام داده‌ها دریافت شده‌اند.

4. مدیریت داده‌های ورودی و خروجی:
    - در برنامه‌های تعاملی که ورودی از کاربر دریافت می‌کنند، EOF می‌تواند نشان‌دهنده پایان ورودی باشد. این امر به ویژه در برنامه‌های خط فرمان و اسکریپت‌های پایپ‌لاین مفید است.

مثال‌هایی از کاربرد EOF در زبان‌های مختلف

مثال در زبان Go

در زبان گو، EOF هنگام خواندن فایل‌ها استفاده می‌شود تا بدانیم چه زمانی به انتهای فایل رسیده‌ایم.

package main

import (
    "bufio"
    "fmt"
    "os"
    "io"
)

func main() {
    file, err := os.Open("filename.txt")
    if err != nil {
        fmt.Println("Error opening file:", err)
        return
    }
    defer func() {
if err := file.Close(); err != nil
{
fmt.Errorf(...)
}()
}


    reader := bufio.NewReader(file)

    for {
        line, err := reader.ReadString('\n')
        if err != nil {
            if err == io.EOF {
                // اگر به انتهای فایل رسیدیم، از حلقه خارج شویم
                break
            }
            fmt.Println("Error reading file:", err)
            return
        }

        fmt.Print(line)
    }
}

مثال در زبان Python

در زبان Python، هنگامی که به انتهای فایل می‌رسیم، تابع read() یا readline() یک رشته خالی برمی‌گرداند که نشان‌دهنده EOF است.

with open('filename.txt', 'r') as file:
    while True:
        line = file.readline()
        if not line:
            break
        print(line, end='')



#EOF

@Syntax_fa
4👍2🔥1🥰1👌1💋1
پیشگیری بهتر از درمان است

#fun

@Syntax_fa
🤣19👎8😁2👌2👍1😍1🤨1
یک تمرین کاربردی برای کار با فایل و اپلیکیشن های تحت خط فرمان 🍸

سیستم مدیریت کتابخانه شخصی

امکانات پروژه:

افزودن کتاب جدید:
کاربران می‌توانند کتاب‌های جدیدی با عنوان، نویسنده، سال انتشار و ژانر اضافه کنند.
اطلاعات کتاب‌ها فقط در فایل متنی (txt یا csv و ..) ذخیره می‌شود.

مشاهده لیست کتاب‌ها:
کاربران می‌توانند لیستی از همه کتاب‌های موجود را مشاهده کنند.
نمایش اطلاعات کتاب‌ها شامل عنوان، نویسنده، سال انتشار و ژانر.

ویرایش اطلاعات کتاب‌ها:
کاربران می‌توانند اطلاعات کتاب‌های موجود را ویرایش کنند.
انتخاب کتاب بر اساس شناسه یا عنوان و ویرایش جزئیات مانند عنوان، نویسنده، سال انتشار و ژانر.

حذف کتاب‌ها:
کاربران می‌توانند کتاب‌ها را از سیستم حذف کنند.
انتخاب کتاب بر اساس شناسه یا عنوان و حذف آن از فایل ذخیره‌سازی.

جستجوی کتاب‌ها:
امکان جستجوی کتاب‌ها بر اساس عنوان، نویسنده، سال انتشار یا ژانر.
نمایش نتایج جستجو به کاربر.

علامت‌گذاری کتاب‌ها به عنوان خوانده شده/نشده:
کاربران می‌توانند وضعیت کتاب‌ها را به عنوان خوانده شده یا نشده علامت‌گذاری کنند.
امکان فیلتر کردن کتاب‌ها بر اساس وضعیت خوانده شده یا نشده.

نیازمندی‌های پروژه:

ساختار فایل:
استفاده فقط از فایل txt و csv و ... برای ذخیره اطلاعات کتاب‌ها.
هر کتاب شامل فیلدهای عنوان، نویسنده، سال انتشار، ژانر و وضعیت خوانده شده.

رابط کاربری CLI:
پیاده‌سازی دستورات مختلف برای افزودن، مشاهده، ویرایش، حذف و جستجوی کتاب‌ها.
ارائه منوی انتخاب به کاربر برای اجرای دستورات.

مدیریت ورودی و خروجی فایل:
خواندن و نوشتن اطلاعات کتاب‌ها از فایل.
اطمینان از حفظ اطلاعات موجود در فایل و جلوگیری از از دست رفتن داده‌ها.
این پروژه به کاربران اجازه می‌دهد تا کتاب‌های خود را به راحتی مدیریت کنند و یک سیستم کامل برای مدیریت کتابخانه شخصی خود داشته باشند.

امکان رجیستر پ لاگین کردن کاربر آپشنال هستش و اگه بخواید میتونید اضافه کنید

(اگه نوشتید به اشتراک بذارید تا با هم بررسیش کنیم و اشکالاتش رو رفع کنیم)

#exercise

@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1👀1
تستر اول:
من توی دو ساعت پنج تا باگ پیدا کردم 😃

برنامه نویسا:
چی؟ به چه جراتی باگ پیدا کردی؟😠
میزنیم دهنشو سرویس میکنیم 🙁😟

تستر دوم و QA لید:
منو تو نفر بعدی هستیم
تو پونزده تا باگ پیدا کردی و من بیستو پنج تااا 😥😥😔

#fun

@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
😁14🤣8👍1
تفاوتهای Go و Rust در مدیریت Race Condition

فرض کنید برنامه‌ای می نویسید که چندین ترد یا پروسس به طور همزمان در حال اجرا هستند. این ترد ها ممکن است به داده های مشترکی دسترسی داشته باشند و آنها را بروزرسانی کنند. حال اگر این دسترسی و به‌روزرسانی بدون کنترل و نظم انجام شود، به طوری که ترتیب دقیق دسترسی و به‌روزرسانی داده ها توسط ترد ها مشخص نباشد، شرایط رقابتی (Race Condition) رخ می دهد. در این مثال، متغیر counter به عنوان یک شمارنده استفاده می شود. 10 تابع به طور همزمان مقدار counter را با استفاده از تابع increment افزایش می دهند.

در Rust با وجود اینکه ما با چندین ترد به شمارنده دسترسی داریم، سیستم مالکیت Rust تضمین میکند که فقط یک ترد میتواند همزمان شمارنده را به‌صورت تغییرپذیر یا میوتیبل در اختیار بگیرد و با قطعیت میتوان گفت که عدد ۱۰ چاپ خواهد شد. در Go با استفاده از یک اشاره گر مستقیماً به متغیر شمارنده دسترسی داریم. این یک Race Condition بالقوه ایجاد می کند زیرا چندین گوروتین می توانند همزمان آن را تغییر دهند. مقدار نهایی شمارنده بسته به اینکه کدام گوروتین در مسابقه برای دسترسی به آن "برنده" شود، می تواند غیرقابل پیش بینی باشد. ** البته که در Go هم با مکانیزمهای میشه جلوش رو گرفت ولی بهرحال نبود race condition در زبان راست چیز باحالیه

Source:
Link

#race_condition

@Syntax_fa
👍5🔥4😱1
Syntax | سینتکس
تفاوتهای Go و Rust در مدیریت Race Condition فرض کنید برنامه‌ای می نویسید که چندین ترد یا پروسس به طور همزمان در حال اجرا هستند. این ترد ها ممکن است به داده های مشترکی دسترسی داشته باشند و آنها را بروزرسانی کنند. حال اگر این دسترسی و به‌روزرسانی بدون کنترل…
البته یه نکته رو اضافه کنم:

ما میتونیم از atomic operation استفاده کنیم.
یک متغیر integer بسازیم که تو سطح پایین(سی پی یو) تضمین میکنه که race condition رخ نمیده

پست مرتبط با atomic operation که قبلا گذاشتم:
https://news.1rj.ru/str/Syntax_fa/1995
🔥5👍21
پسر بچه:
وقتی حالم خوب شد، میخوام یه برنامه نویس PHP بشم

#fun

@Syntax_fa
🤣36😁3👍2
بحث اینروزا بین لینوکسیا و ویندوزیا

#fun

@Syntax_fa
🤣23👍3😁1
تحلیل BSOD پتچ امنیتی CrowdStrike

مشکل اصلی که در نرم‌افزار CrowdStrike رخ داد، به دلیل دسترسی نادرست به حافظه از طریق یک اشاره‌گر تهی (NULL pointer) در زبان برنامه‌نویسی C++ بود. حافظه در کامپیوتر به صورت یک آرایه بزرگ از اعداد سازماندهی شده است. اگر برنامه‌ای تلاش کند به یک آدرس حافظه نامعتبر دسترسی پیدا کند، سیستم‌عامل بلافاصله برنامه را متوقف می‌کند و این موضوع منجر به خرابی سیستم می‌شود.

در این حالت خاص، برنامه سعی کرد به آدرس حافظه 0x9c (که معادل 156 در مبنای 10 است) دسترسی پیدا کند. این آدرس حافظه نامعتبر است و دسترسی به آن باعث می‌شود که سیستم‌عامل برنامه را متوقف کند. این مسئله به دلیل عدم بررسی اشاره‌گر تهی توسط برنامه‌نویس اتفاق افتاد.

برای مثال:

struct Obj {
    int a;
    int b;
};

Obj* obj = NULL;

print(obj->a);


در این مثال، اشاره‌گر obj تهی (NULL) است. هنگامی که برنامه سعی می‌کند به عضو a از شیء obj دسترسی پیدا کند، به دلیل تهی بودن اشاره‌گر، به یک آدرس نامعتبر دسترسی پیدا می‌کند و باعث خرابی برنامه می‌شود.

این مشکل به‌خصوص خطرناک بود زیرا در یک درایور سیستمی رخ داد. درایورهای سیستمی دسترسی‌های سطح بالایی به منابع سیستم دارند و خرابی در این درایورها می‌تواند منجر به توقف کل سیستم‌عامل و نمایش صفحه آبی مرگ (BSOD) شود.

برای جلوگیری از چنین مشکلاتی، برنامه‌نویسان باید همیشه قبل از دسترسی به اشاره‌گرها، آن‌ها را بررسی کنند. استفاده از زبان‌های برنامه‌نویسی مدرن مانند Rust که از دسترسی‌های نادرست به حافظه جلوگیری می‌کنند، می‌تواند به کاهش این خطرات کمک کند.

کلام آخر: شاید تاحدی شرکت CrowdStrike بدلیل بی دقتی باعث این اتفاق شده است ولی مقصر اصلی شرکت مایکروسافت هست که هنوز کرنل را درست آب بندی نکرده که بواسطه یک درایور اینطوی کرش نکند.

Source:
@GoInsights

#note

@Syntax_fa | boost
👍11😱2