جنگولرن
3.81K subscribers
287 photos
74 videos
31 files
556 links
آموزش Django و بستگان
Download Telegram
HashMaps به بیان ساده:
قرار هست ببینیم associative array چیه، hashmap چیه، چه ارتباطی به dictionary داره، ویژگی هاشون چیه، hash collision چیه، چطور برطرف میشن، نمونه خیلی سادش رو پیاده سازی کنیم و در انتها یه نمونه کامل هم ببینیم ازش.

خب... زمانی که ما یک سری دیتا داریم که به هم مرتبط هستن میتونیم اون ها رو توی یه collection نگهداری کنیم مثلا array. اطلاعاتی مثل تمام نمرات دانش آموزان یک کلاس:
grades = [17, 19, 18, ...]
و با ایندکس های عددی بهشون دسترسی پیدا کنیم:
grades[2]
خیلی هم سریع هستن array ها تو دسترسی چون مستقیم میریم سراغ همون نمره ای که نیاز داریم.
مشکل کجاست؟
مشکل اینه که برای ما سخته حفظ کنیم کدوم ایندکس برای کدوم شخص بوده و ترجیح میدیم که اگه نمره ی شخصی رو میخوایم به جای اینکه یه عدد بی معنی بدیم، اسمش رو بدیم و نمرش رو بگیریم:
grades["ali"]
راه حل چیه؟
اینکه اسمش رو(که بهش میگیم کلید) متصل یا مربوط یا "associate" بکنیم به نمرش.
چطوری؟ مثلا:
grades = [("reza", 17), ("sara", 19), ("ali", 18)]
و بعد هم اینجوری میگیریم:
def get_grade(person_name):
for name, grade in grades:
if name == person_name:
return grade

print(get_grade("ali"))
خیلی بهتر و راحت تر شد الان...
چیزی که ما بالا ساختیم یک پیاده سازی (بد) از associative array بود. چون associate کردیم یک کلید رو به مقدارش. associative array یک abstract هست و میتونه به شکل های مختلف پیاده سازی بشه.

خب... فقط یه مشکلی هست الان:
قبلا که با ایندکس میگرفتیم صاف میرفتیم سراغ خودش، الان مجبوریم که iterate کنیم روشون و دونه دونه بگردیم تا برسیم به اونی که میخوایم. کنده!! (شما مثال های این پست رو با ۱۰۰۰ تا داده مثلا تصور کنید)

راه حل چیه؟
اینکه بیایم "یه جوری" این اسم ها رو map کنیم به ایندکس های عددی تا دوباره بتونیم صاف بریم سراغ اونی که میخوایم و سرعت بهتر بگیریم.

چطور اینکارو بکنیم؟
مثلا بیایم یک فانکشن بنویسیم که از کلیدها عدد تولید کنیم به این صورت که اعداد اسکی متناظر با هر حرف از کلیدمون رو باهم جمع کنیم. یعنی برای sara داریم:
s: 115
a: 97
r: 114
a: 97
در نتیجه:
"sara" # -> 115 + 97 + 114 + 97 -> 423
این میشه فانکشنش:
def hash_func(string):
return sum(map(ord, string))
حالا یه لیست بسازیم که ۵ تا جای خالی داره:
grades = [None, None, None, None, None]

خب حالا الان عددی که از هش کردن(پس یه هش فانکشن ساده بود اون) کلید sara به دست آوردیم و چطور map کنیم به یکی از ایندکس های لیستمون؟ ما که ۴۲۳ تا slot نداریم...
باقی ماندش رو با طول لیستمون حساب کنیم!
اینطوری مطمئن هستیم که داخل اون رنجی که میخوایم هست. پس:
423 % 5 -> 3
کافیه sara و نمرش رو توی ایندکس شماره ۳ ذخیره کنیم:
grades = [None, None, None, ("sara", 19), None]
اگه همین کار رو برای باقی هم بکنیم همچین چیزی میشه:
grades = [
("ali", 18),
None,
None,
("sara", 19),
("reza", 17),
]
(تو پرانتز حواسمون هست که ترتیبش عوض شد...)

الان خوب شد. هر کدوم از نمره هارو بخوایم بگیریم اول اون کلید رو hash میکنیم بعد باقی ماندش رو حساب میکنیم میشه ایندکس مورد نظر. دیگه iteration ای در کار نیست و به time complexity عه O(1) رسیدیم. الان get_grade عه ما اینطوری شد:

def hash_func(string):
return sum(map(ord, string))

def get_grade(person_name):
hash_value = hash_func(person_name)
idx = hash_value % 5
return grades[idx][1]

print(get_grade("reza"))

موقع insert کردن هم دقیقا برعکس همین شکل عمل میکنیم یعنی ابتدا هش میکنیم بعد باقیمانده میگیریم بعد که فهمیدیم کدوم slot برای اون کلید میشه میذاریمش اونجا. درواقع هر چیزی که برای get کردن میگیم برعکسش برای set کردن میشه.

خب ما الان تونستیم associative array رو با کمک hashmap پیاده سازی کنیم :) بریم ادامش...

حالا اگه اسم یکی دیگه از دانشجو ها aras بود چی؟
(پست بعدی)

پست ۱ از ۳
👍2
چجوری aras رو اضافه کنیم به grades ؟ چون aras از همون حروفی که sara داره تشکیل شده با هش فانکشنی که ما نوشتیم دوباره بهمون ۴۲۳ میده و اگه باقی مانده بگیریم میشه ۳ یا درواقع همون ایندکسی که برای سارا اختصاص داده شده.
مشکل بوجود اومد... به این مشکل میگن hash collision یا تداخل هش ها!

هش فانکشنی که انتخاب کردیم شاید زیاد جالب نبود چون درواقع به ازای تمام جای گشت های یک کلمه همون هش رو بهمون میده.

هش فانکشن خوب توی hashmap ها دو تا ویژگی داره:
۱- باید محاسباتش سبک باشه. چون دائما داره برای همه ی کلید ها حساب میشه.
۲- "سعی کنه" مقدار های یونیک تولید کنه تا به hash collision بر نخوریم.

بیایم کمی تغییرش بدیم: علاوه بر اینکه از عدد اسکیشون استفاده میکنیم، بیایم اون عدد رو در جایگاهی که داره(حرف چندمه) ضرب هم بکنیم به این شکل:
def hash_func(string):
hash_value = 0
for i, char in enumerate(string, start=1):
hash_value += ord(char) * i
return hash_value

الان هش collision رو بر طرف کردیم:
for name in ("ali", "sara", "reza", "aras"):
hash_value = hash_func(name)
print(f"{name}: {hash_value} : {hash_value % 5}")
خروجیش میشه:
ali:  628  : 3
sara: 1039 : 4
reza: 1070 : 0
aras: 1076 : 1
ولی همونطور که حدس میزنید باز هم با کلید های مختلف ما به hash collision بر میخوریم... مثلا جای aras بذارید nima ...
چه کنیم؟ بیایم یه هش فانکشن معقول داشته باشیم که سعی کنه با سرعت بالا hash value رو محاسبه کنه (چیزی که الان داریم) ولی اگه collision پیش اومد رفعش کنیم! چطور؟

روش اول، separate chaining :
تو این روش میگه به جای اینکه ما بیایم slot ها رو خالی بذاریم (None) ، بیایم به جاش از لیست خالی استفاده کنیم! هر موقع hash collision داشتیم میایم اضافش میکنیم به لیست.

یعنی اگه ۴ تا دانش آموزش ما باشن: ali, sara, reza, nima
با هش فانکشن جدیدی که نوشتیم slot های ما به این صورت میشن:
grades = [
[("reza", 17), ("nima", 20)],
[],
[],
[("ali", 18)],
[("sara", 19)],
]
مشکل حل شد. الان با اینکه وقتی نمره ی نیما رو بخوایم باید قبلش یه رضا رو هم چک کنیم ولی خیلی جلو افتادیم نسبت به اینکه بخوایم همه رو چک کنیم! یعنی کلی کلید رو محاسبه نمیکنیم فقط اون چندتایی که collision داشتن سرچ میشن. و خب باقی کلید ها که collision نداشتن مستقیم پیدا میشن.

اگه دقت کنیم میبینیم هرچی hash collision بیشتر داشته باشیم به رفتار خطی بیشتر نزدیک میشیم.
این روش اول بود که پیاده سازی خیلی ساده ای هم داره. یه مشکلی ریزی داریم اینجا. یه سری فضای خالی الان توی slot های ما بوجود اومده. آیا میتونیم بیایم از این فضاها استفاده کنیم؟


روش دوم، open addressing:
شرایطی و در نظر بگیرید که الان reza و ali و sara ذخیره شدن و ما میخوایم nima رو اضافه کنیم:
grades = [
("reza", 17),
None,
None,
("ali", 18),
("sara", 19),
]
میایم nima رو هش میکنیم ایندکس و پیدا میکنیم میبینیم میشه صفر. و نگاه میکنیم میبینیم پر هست! میایم یه sequence ای تولید میکنیم به اسم probing sequence. به طوری که از همون اون ایندکسی که محاسبه کردیم شروع میشه(اینجا شد صفر برای نیما) و یه دور میزنه:
0 -> 1 -> 2 -> 3 -> 4
اگه برای ali میخواستیم probing sequence چی میشد؟
3 -> 4 -> 0 -> 1 -> 2
و به همین ترتیب میریم جلو تا به جای خالی برسیم. الان برای نیما ایندکس بعدی میشه ۱. خالی هست؟ بله. پس میذاریمش اونجا و تبدیل میشه به:
grades = [
("reza", 17),
("nima", 20),
None,
("ali", 18),
("sara", 19),
]
ما ۳ شکل probe sequence داریم:
1- linear probing
2- quadratic probing
3- double hashing

کاری که بالا کردیم linear probing بود. چون نمیخوام بیشتر از این طولانی بشه دوتای دیگه رو اینجا نمیگم(پیاده سازیش رو در انتها گذاشتم) ولی حدس زدنش سادس. مثلا تو دومی به جای اینکه دونه دونه بره بالا ، با توان های ۲ میره بالا (کمک میکنه که توده ای از کلید ها رو یک جای hash table مون نداشته باشیم پخش بشن) و آخری میگه یه هش دیگه(هش دوم) انجام بدیم برای پیدا کردن ایندکس بعدی!

اینا هر کدوم مزایا و معایبی دارن که میشه کلی دربارشون بحث کرد که کدوم کجا چرا بهتره.

پست تموم شد ولی یه سری نکته های تکمیلی باقی موند:
(پست بعدی و آخر)

پست ۲ از ۳
نکته ۱:
دیکشنری توی پایتون نمونه از associative array هست که با hashtable یا hashmap پیاده سازی شده.

نکته ۲:
این پیاده سازی از hashmap چیزی هست که همین الان تو خیلی از زبان ها برای دیکشنری، set ها توی پایتون و برای دیکشنری ها تا قبل از ورژن ۳.۶ توی پایتون استفاده میشده.
به طور کلی hashmap ها ترتیب رو حفظ نمیکنن، همونطور که دیدید ولی از پایتون ۳.۶ به بعد آقای Raymond Hettinger یه پیاده سازی جدیدی برای دیکشنری ها انجام داد به اسم raymond dict. کلیت همینه ولی یه مقدار فرق داره با چیزی که دیدیم که هم کم حجم تره هم باعث میشه ترتیب رو حفظ کنن. اگه علاقه داشتید میتونم بعدا پیاده سازی دیکشنری های جدید پایتون رو هم بگم.

نکته ۳: توی separate chaining میشه به جای لیست از linked list یا binary search tree هم استفاده کرد که باز هم هر کدوم معایب و مزایای خودشون رو دارن.

نکته ۴:
خیلی از نکات گفته نشد به دلیل اینکه نمیخواستم بیشتر از این طولانی بشه. از جمله:
- پایتون علاوه بر key و value خود هش‌ها رو هم نگه داره میکنه. چرا اینکارو میکنه؟
- این hash table عه ما به یه حدی که برسه نیاز داره تا resize بشه تا پرفورمنسش رو حفظ کنه. اگه از یه حدی بیشتر پر باشه تعداد دفعاتی که collision میگیریم بیشتر میشه و دیکشنری یا ست ما کند تر میشه.
- اگه یه کلیدی و delete کردیم تکلیف hashtable چی میشه؟ چطور باید هندل بشه؟

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

* Open Addressing:
- Linear Probing
- Quadratic Probing
- Double Hashing Probing
* Separate Chaining
- With Dynamic Array
- With Linked List
- With Binary Search Tree

https://github.com/amirsoroush/Python_Hashmaps

پست ۳ از ۳

🖊 @AmirSoroushh
1
Forwarded from ProgrammingSchool (Python)
قسمت چهارم: ساختارهای چندخطی

پرانتز، براکت یا آکولادهای پایانی در ساختارهای چندخطی مانند لیست‌ها، دیکشنری ها و ...

The closing parantese, brace or brucet in multiline structures such as lists, dictionaries, etc:

۱- می‌تواند همتراز با اولین کاراکتر غیرسفید از آخرین خط این ساختارها نوشته می‌شود.

1- It can be written in line with the first non-white character from the last line of these structures

۲- در ابتدای آخرین خط نوشته شود.
2- It should be written at the beginning of the last line.

مثال های بالا این دو حالت را نشان می‌دهد:
The above examples show these two states:

#آموزش_پایتون
#قراردادهای_پایتون

آدرس کانال:
@Programmingschool2
سایت آموزشی:
http://programmingschool.ir
گروه پرسش و پاسخ:
https://t.me/programmingschool_group
👍1
📣 تبلیغ رایگان - کانال زرنگ هاس

کانال توسعه دهندگان باهوش

سعی میکنیم چیزایی که بنظر کاربردی هستن رو باهاتون به اشتراک بزاریم

موضوعات چنل اکثر حول این موضوعاته

🔥لینوکس
🔥برنامه نویسی فرانت‌اند
🔥برنامه نویسی بک‌اند
🔥اخبار تکنولوژی و...

👇👇👇👇👇👇👇👇👇
https://t.me/CleverDevs
Forwarded from ProgrammingSchool (Python)
قسمت پنجم: نمایش بلوک‌ها در پایتون

در زبان پایتون بلوک‌ها با استفاده از تورفتگی ها تفسیر می‌شوند. برای تورفتگی‌ها می‌توان از تب (Tab) یا فاصله (Space) استفاده کرد. در اصول PEP توصیه می‌شود از Space استفاده شود مگر آنکه در یک کد آماده از Tab، برای تورفتگی‌ها استفاده شده باشد. در اینصورت چنانچه لازم باشد خطوطی به کد آماده اضافه شود که دارای تورفتگی باشد باید از Tab استفاده شود.

In Python, blocks are interpreted using indentations. Tab or space can be used for indents. In PEP principles, it is recommended to use Space, unless Tab is used for indentation in a ready code. In this case, if it is necessary to add indented lines to the ready code, Tab should be used.

توجه شود که نمی‌توان از ترکیب Tab و Space برای ساختاردهی بلوک‌ها استفاده کرد.

Note that you cannot use Tab and Space to structure blocks.

#آموزش_پایتون
#قراردادهای_پایتون

آدرس کانال:
@Programmingschool2
سایت آموزشی:
http://programmingschool.ir
گروه پرسش و پاسخ:
https://t.me/programmingschool_group
یک ویدئوی خیلی مفید از @BenDevelop
✔️ توی این ویدئو امیربهادر سه تا نکته در مورد مرتبه زمانی (پیچیدگی زمانی) میگه که من خودم تا امروز برداشتم اشتباه بود.
✔️ یه مثال پادشاه و شطرنج هم اشاره کرد، که بهراد قبلا توی لینک های زیر توضیح داده:
رشد نمایی:
https://t.me/TadavomnisT_channel/92
داستان تا کردن کاغذ:
https://t.me/TadavomnisT_channel/93
داستان شطرنج:
https://t.me/TadavomnisT_channel/95


پست امیربهادر:
مرتبه زمانی فضایی و هش مپ
این ویدیو احتمالا مهم ترین ویدیو کل این مجموعست
چون از مفاهیم این قسمت تو تمام ویدیو های بعد استفاده خواهیم کرد
پس حتما حتما ویدیو رو کامل و با دقت تماشا کنین و اگر هر جایش ابهام داشتین حتما بپرسین

https://www.youtube.com/watch?v=2L-9QV0Nqgo&t=1295s

@BenDevelop
🔥3
📣 تبلیغ رایگان - کانال دنیای سیاه و صورتی

~> اینجا (https://t.me/PinkOrca) دنیای سیاه و صورتی منه :)💕

💉 پینک اورکا هستم. یک کامپیوتر باز، وب دولوپر، برنامه نویس، علاقه‌مند به لینوکس و نرم‌افزار آزاد، تولیدکننده محتوا و عاشق یادگیری و به اشتراک گذاشتن چیز‌ها...

🥴😂 نویسنده نیستم، ولی گاهی اوقات در مورد یک سری موضوعات می‌نویسم و می‌تونید به پست‌های این چنل جدیدم از طریق دسته‌بندی‌ (https://t.me/PinkOrca/5) به سادگی دسترسی داشتی باشید...

💎 امیدوارم مطالبم برات مفید باشن
~> @PinkOrca
~> @PinkOrca
~> @PinkOrca
☝️💀
Forwarded from DevOps Expert (Mohammad Babazadeh)
Media is too big
VIEW IN TELEGRAM
✔️ چرا نباید به بنچ مارک ها اعتماد کنیم؟

🔶 این ویدئو فوق العاده از امیررضا قادری عزیز رو حتما ببینید تا به بنچ مارک هایی که توی اینترنت راجع به فریمورک یا تکنولوزی های مختلف میبینید اعتماد نکنید. به قول امیررضا بنچ مارک میگیرید، همه چیز خوبه، محصول رو میبرید روی پروداکشن و در اون لحظه آب قطع هست.
🔷 از امیررضا قادری عزیز بابت تولید این ویدئو عالی، بی‌نهایت سپاسگزاریم.

وبلاگ امیررضا:‌
👉 https://amirrezaghaderi.com/fa/blog/

#بنچ_مارک #benchmark

〰️〰️〰️〰️〰️〰️
©️ @DevOpsEx
👍4
جنگولرن
از Linkedin آقای arash hosseini #مهندسی_سیستم لینک در نظرات پست مهندسی سیستم بخش ششم: پذیرش سیستم : میزان موفقیت هر سیستم دست ساخته بشر و ماموریتش در شاخص های پذیرش ذیل نهفته است : · آیا بازار برای پذیرش سیستم جدید آمادگی دارد ؟ یک نیاز عملیاتی…
از Linkedin آقای arash hosseini #مهندسی_سیستم
لینک در نظرات پست
مهندسی سیستم بخش هفتم :
ادامه پذیرش سیستم : امکان پذیری و مقرون به صرفه بودن سیستم : اگر برآورد زمانی توسعه یک سیستم، محصول یا خدمت درست باشد، چالش بعدی امکان پذیری توسعه بر اساس مشخصه های تعیین شده و تکنولوژی های موجود در برنامه زمانی تعیین شده و بودجه چرخه حیات در یک سطح ریسک معقول برای کاربر یا برای مالک خواهد بود. امکان پذیری نهایتا بر روی چهار سوال متمرکز می گردد : · کاربر چه چیزی می خواهد ؟ · نیاز کاربر چیست ؟ · کاربر از عهده چه چیزی بر می آید ؟ · برای چه چیزی کاربر حاضر است هزینه پرداخت نماید ؟ به عنوان یک مهندس سیستم، شانس با شما همراه خواهد بود اگر به شما برای پشتیبانی فنی از تیم توسعه کسب وکار جهت توسعه یک سیستم جدید یا بکارگیری یک محصول جدید نیاز داشته باشند در غیر اینصورت شما از یک مهندس سیستم دیگر پشتیبانی خواهید نمود. از نقطه نگاه فنی، تیم مهندسی سیستم چندکاره برای تصور، غنی سازی و ارائه راه کار فنی برای اقناع سوالات بیان شده مورد نیاز است. مقرون به صرفه بودن : معیار عینی موفقیت سیستم در نهایت به مقرون به صرفه بودن آن است. از نقطه نظر سازمان، آیا سیستم کارایی و نتیجه ای که با بازگشت سرمایه تنظیم شده باشد را تولید می نماید ؟ مهندسین، با بکارگیری تمامی توان فنی خود، غالبا در ارتباط با مفهوم مقرون به صرفه بودن مشکل دارند. سعی و تمرکز آنها بشتر بر روی امکان پذیری سیستم می باشد. واقعیت این است که هزینه عملیاتی چرخه حیات سیستم و سود حاصل از انجام فعالیت توسط سیستم موتور محرک تصمیم گیری سازمان می باشد. شما می توانید بهترین سیستم، محصول یا خدمت را با کارایی برجسته، ابداع نمائید. اما اگر هزینه های عملیاتی و پشتیبانی سیستم، برای کاربر مقرون به صرفه نباشد سیستم بخصوص درمحیط های تجاری در بدو ورود کنار گذاشته خواهد شد. مقرون به صرفه بودن به عنوان یک پارامتر اندازه گیری به کمک دو موئلفه اندازه گیری می گردد : · هزینه گردش کار · هزینه کارائی کارایی سیستم : به عنوان یک فاکتور عینی ، کارایی سیستم نمایان گر واقعیت های فیزیکی خروجی و نتیجه عملکرد سیستم خواهد بود. این کارایی در دو فرم کارایی برنامه ریزی شده و واقعی خواهد بود . هنگامی که توسعه سیستم کلید می خورد. توسعه دهندگان آن وابسته به آنالیز، مدل سازی و نمونه سازی برای رسیدن به دید فنی جهت آشکارسازی چگونگی انطباق عملکرد سیستم خواهند بود . این داده های در موار ذیل استفاده می گردد : · مشخص کردن و محدود کردن دید به سیستم یا یکی از اجزای آن · مقایسه کارایی برنامه ریزی شده یا نتایج مورد نظر و واقعیت تکنیک های متفاوتی مانند نمونه سازی سریع و ارائه تکنولوژی جهت ارزیابی مدل ها و نمونه ها برای رسیدن به حدس ها و کاهش ریسک استفده می گردد. قصد بر جمع آوری مدارک عینی و تجربی "زود هنگام" برای رسیدن به سطح اطمینان مورد نظر می باشد. نتیجه دقیق ارزیابی و صحت سنجی حدسیات می باشد. کارایی سیستم نیازمند فهم مشارکت فاکتورهایی همچون قابلیت اطمینان، نگهداری و کارایی است . (این کلمات نام آشنا در معماری نرم افزار است در این مجموعه از نوشته ها شما می توانید خطوطی که به معمار جهت توسعه سیستم کمک نمایند را پیدا کنید)
Forwarded from ProgrammingSchool (Python)
قسمت ششم: محدودیت کاراکترها در یک خط

در کتابخانه‌های استاندارد پایتون تعداد کاراکترهای یک خط، 79  کاراکتر است. برای خطوطی که در آن‌ها ساختاری وجود ندارد(مانند کامنتها و ...) این محدودیت باید به 72 کاراکتر برسد.

In standard Python libraries, the number of characters in one line is 79 characters. For lines in which there is no structure (such as comments, etc.), this limit should be 72 characters.

در ویرایشگرهایی که در محیط ویندوز وجود دارند این امکان وجود دارد که چندین پنجره در کنار هم بازشوند. در این حالت اگر از عرض پیش‌فرض هر پنجره استفاده شود مشاهده و درک کد با مشکل روبه‌رو می‌شود. برای حل این مشکل بهتر است عرض پنجره، بر روی 80 تنظیم شود.

In the editors that exist in the Windows operating system, it is possible to open windows together. In this case, if the default of each window is used, it will be difficult to see and understand the codes. To solve this problem, it is better to set the width of the window to 80.

چنانچه در تیمی فعالیت می‌کنید که ترجیح می‌دهند از خطوط طولانی‌تر استفاده کنند مجاز هستید خطوط را به 99 کاراکتر افزایش بدهید مشروط به آنکه خطوط بدون ساختار از قبیل کامنتها 72 کاراکتر باشند.

If you work in a team that prefers to use longer lines, you are allowed to increase the lines to 99 characters, provided that unstructured lines such as comments are 72 characters.

برای خطوطی که طولانی هستند پیشنهاد می‌شود از اسلش، بک اسلش (ورژن‌های 3.10 به قبل) ، پرانتز، براکت و ... استفاده شود تا به چند خط شکسته شود.

For lines that are long, it is suggested to use slash, backslash (versions 3.10 and earlier), parentheses, brackets, etc. to break it into several lines.

#آموزش_پایتون
#قراردادهای_پایتون

آدرس کانال:
@Programmingschool2
سایت آموزشی:
http://programmingschool.ir
گروه پرسش و پاسخ:
https://t.me/programmingschool_group
👍5👎1
Forwarded from Fara Code | برنامه نویسی (saman)
توابع مفید پایتونی 😇
این قسمت: تابع map 💎

✖️ توضیحات:
با استفاده از تابع map شما میتونید یه تابع خاص رو، روی عناصر یک لیست (یا هر چیز قابل شمارشی) اعمال کنید. مثلا یه تابع داشته باشید که عدد رو میگیره و به توان 2 میرسونه حالا میتونید تمام اعضای یه لیست رو توان 2 کنید. ترکیب تابع map با تابع لامبدا خیلی حرفه ای میشه...


✖️ نحوه استفاده:
nums = [1,2,3,4]

res = map(lambda x:x*2,nums)
print(list(res))

اگر این کد رو بنویسید و اجرا کنید میبینید که لیست جدیدی که به وجود میاد و توی خط آخر پرینتش کردیم، توان 2 اعداد لیست nums هستش...

#نکته #آموزش

▪️🐍 @Learrning_Python 🐍▪️
👍3
جنگولرن
اگه دقت کرده باشید توی فایل settings.py در جنگو خیلی تاکید شده که مراقب SECRET_KEY باشید. به جای اینکه دلایل رو توضیح بدم، لینک کدهای جنگو که صراحتا SECRET_KEY رو استفاده کردن اینجا میگذارم. بد نمیشه یه نگاه بندازید. (لینک ها همه مربوط به ریپازیتوری اصلی…
در جنگو اگه SECRET_KEY لو بره بد میشه؟

تصویر 1.1 مقدار secret_key رو داریم (لو رفته مثلا)

تصویر 1.2 فرض که برنامه نویس مقدار SESSION_ENGINE رو روی signed_cookies گذاشته باشه.

تصویر 2 فرض می کنیم برنامه نویس دیتایی رو توی سشن ذخیره میکنه. جنگو با توجه به تنظیم 1.2 مقدار (value) ع sessionid رو تغییر میده. با signed_cookies تغییرش میده لینکش:
https://docs.djangoproject.com/en/4.2/topics/http/sessions/#using-cookie-based-sessions

تصویر 3 با کدی که نوشتم و داشتن SECRET_KEY میشه به دیتای کوکی دسترسی پیدا کرد و... (تصویر4)

به قول یکی از دوستان. لو رفتن سکرت کی خیلی خطرناکتر از این حرفاس
👍5
جنگولرن
در جنگو اگه SECRET_KEY لو بره بد میشه؟ تصویر 1.1 مقدار secret_key رو داریم (لو رفته مثلا) تصویر 1.2 فرض که برنامه نویس مقدار SESSION_ENGINE رو روی signed_cookies گذاشته باشه. تصویر 2 فرض می کنیم برنامه نویس دیتایی رو توی سشن ذخیره میکنه. جنگو با توجه…
⚠️ نکته مهم:
توی مستندات جنگو صراحتا گفته:
The session data is signed but not encrypted
پس در واقع جنگو با signed cookie از تغییر غیرمجاز محتوا مطلع میشه. محتوای کوکی ساخته شده base64 شده. و اگه decode کنید محتوا رو میبینید. (توی تصویر مشخصه)

یه جورایی مثل JWT که هر تغییری توی محتوا یا امضای JWT باعث تغییر امضا و یا اعتبارسنجی ناموفق توکن می‌شه. و سرور متوجه می‌شه که توکن تغییر کرده، پس نامعتبرش میکنه.

پس چطور سوء استفاده میکنن؟
خب وقتی secrect_key رو دارن میتونن هر تغییری خواستن اعمال کنن و کوکی signed و معتبر بسازن و... 😨
👍5
از Linkedin آقای arash hosseini #مهندسی_سیستم
لینک در نظرات پست

مهندسی سیستم بخش هشتم : ادامه پذیرش سیستم : کنترل واقعیت : تمامی موارد بیان شده خوب بنظر می رسند ، اما چگونه این موارد را در دنیای واقعی اجرا کنیم ؟ " به طور معمول سازمان ها بسته‌های تدارکات و مدل های هزینه منابع انسانی را برای رسیدن به تقریبی از اندازه هزینه سیستم، توسعه داده اند. در نتیجه خریداران سیستم درخواست یک نقطه راه حل برای یک ظرفیت مشخص را دارند. اگر چه برآورد حاصل از مدل هزینه معمولا دقیق است، همواره اتفاقات غیر منتظره در پیش رو می باشد. اگر هزینه پیشنهادی، برآورد اولیه را که بودجه بندی شده است افزایش دهد، خریدار و کاربر در مقابل یک رقابت مجدد قرار می گیرند. معمولا مذاکرات به یک قرارداد قیمت که مقرون به صرفه با کمی امکانات کمتر باشد، می رسد. چیزی که خریدار و کاربر سیستم بدنبال شنیده شدن آن هستند این جمله هست : " پیشنهادی به ما بدهید که طیف و ترکیبی از توانمندی و سطح کاربرد – کارایی سیستم/هزینه را تشریح کرده که قابل استفاده برای تدارک تعداد مشخصی از اهداف یا نیازمندی ها باشد " . در مفهوم، تمرکز این رویکرد بر مقرون به صرفه بودن است- که گفته می شود به چه میزان کارایی سیستم بر اساس یک واحد هزینه افزایش می یابد. رسمی تر اینکه هزینه به عنوان یک پارامتر مستقل به این مفهوم اضافه گردد. در نتیجه پیشنهادهای توسعه دهندگان سیستم ممکن است نیاز به گرافهای آنالیزی باشد که گزینه های کارکردی سیستم بر روی یک خط نمودار و هزینه بر روی محور دیگر ترسیم شده باشد. آیا مقرون به صرفه بودن و کارا بودن به راحتی بدست می آید ؟ خیر، در حقیقت اندازه گیری و تعیین کمیت هر دو در بسیاری از موارد بسیار دشوار است. پیاده سازی این جزئیات بسته به سازمان و برنامه آن می تواند بسیار متفاوت باشد. سازمان های نظامی متخصصینی در این زمینه برای پیروزی در عملیات های نظامی استخدام می کنند.اگر شما در برنامه ریزی برای کارایی سیستم و تمامی فاکتورهای موفقیت آن، پیروز نگردید، سازمان و اهداف ماموریت آن را در معرض ریسک قرارداده اید. ارزیابی و صحت سنجی سیستم : مفهوم پذیرش سیستم غالبا یک مفهوم انتزاعی است. و قابل ترجمه بر اساس نیاز هر فرد می باشد. مواردی که از سمت یک نفر پذیرش می شود برای کاربری دیگر غیر قابل پذیرش می باشد. بحث بر سر ابزارها، سازگاری و کارایی عملیاتی در نهایت تصمیم یک کاربر به اینکه سیستم قادر به نیازهای عملیاتی وی است را مشخص می نماید. درجه جذابیت کارکرد یک سیستم میزان درک کاربر را از اینکه سیستم درستی را تدارک دیده منتشر می کند. . ارزیابی سیستم سوال دیگری را مطرح می کند . اگر کاربران افق دیدی از آنچه را که می خواهند دارند، چگونه : · افق دید خود را چگونه به مشخصه هایی جهت تولید سیستم رویایی خود ترجمه می کنند ؟ · چگونه به این اطمینان خاطر می رسند که سیستم، محصول یا خدمت ارائه شده همان سیستم درست است ؟ · توانایی این مورد را داشته باشند تا در آینده نسخه های کپی جدیدی از سیستم خود داشته باشند ؟ اولین سوال نیاز به " مهندسی سیستم" دارد. سوال دوم نیاز به یکپارچگی در تحول "مهندسی سیستم" برای اطمینان از اینکه منبع نیازمندی ها خود را در طراحی سیستم، محصول یا خدمت ارائه شده آشکار نموده و سیستم ارائه شده بتواند جذابیت داشته باشد. سوال سوم نیاز به "مهندسی سیستم " برای تولید مستندات با کیفیت و فرآیندهای استاندارد جهت ایجاد کارگران دانش برای اطمینان از بازتولید بر اساس کارایی مشخص و ثابت دارد.
👍1
👏نذری دانشجویار به مناسب محرم
رایگان شدن بیش از 160 ساعت آموزش
لینک:
https://www.daneshjooyar.com/landing/moharram1402/
19🤮6👏2
مطلب قابل تاملی از کانال @lnxpylnxpy
اگه هنوز واسه خوندن دیتای json و تبدیلش به dict گوگل می‌کنید، ساختار دکوریتور wraps یا inner-function رو حفظ نیستید و گوگل می‌کنید، اگه می‌خواید واسه کلاستون setter و getter بنویسید ولی سرچ می‌کنید، اگه ساختار switch-case رو فراموش می‌کنید و سرچ می‌کنید، شما برنامه‌نویس هستید. :)

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

Google: exclude repr in python dataclass

اول از همه می‌دونی dataclass چیه. بعد میدونی این کانپست، یه سری از متدها اعم از init و repr رو خودش بصورت دیفالت پیاده‌سازی می‌کنه و سعی داری repr رو از پیاده‌سازی شدن exclude کنی. پس خیلی چیزا می‌دونی راجع بهش.. نه؟! قطعا تو خیلی سرتری نسبت به اون کسی که چهارتا متد حفظ کرده.

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

اگه رفتید جایی اینترویو و حس کردید چنین تفکری اون پشت رواج داره، و سئوال‌های طرف یه حالت طعنه‌آمیزی داره، بنظرم محل رو ترک کنید. این افراد اول اینکه اصلا در زمینه Tech کار نکردن دوم اینکه مازوخیسمی‌ان. حس می‌کنن اگه کابل LAN پشت سیستمشون رو بکشن و آفلاین کد بزنن، قوی‌تر میشن.
👍12🤔1
Forwarded from ProgrammingSchool (Python)
قسمت هفتم: درست نویسی عملگرهای باینری

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

Binary operators are operators that have two operands. The addition operator is a binary operator. Some long lines may contain binary operators. In these cases, Donald Knuth suggests that breaking a long line into several short lines should be done before the operator.

در گذشته فرم نوشتاری به اینصورت بود که شکستن یک خط طولانی بعد از عملگر انجام می‌شد. اما مشکل این سبک آن است که عملگرها در ستون های مختلف پراکنده می‌شوند و یافتن عملوندهای آن‌ها توسط چشم، زمان بر می‌شود.

In the past, the style form was such that a long line break was done after the operator. But the problem with this style is that the operators are scattered in different columns and it takes time to find their operands by eyes.

#آموزش_پایتون
#قراردادهای_پایتون

آدرس کانال:
@Programmingschool2
سایت آموزشی:
http://programmingschool.ir
گروه پرسش و پاسخ:
https://t.me/programmingschool_group