حتماً تا به حال با برنامه هایی سروکار داشتید که امکان نصب افزونه داشتند. در این پست قرار هست بهتون بگم چطور میشه توی پایتون برنامه‌ای بنویسیم که بشه بهش افزونه اضافه کرد.

معماری افزونه‌ای (plugin architecture) یک شیوه توسعه نرم‌افزار است که به برنامه‌نویس این امکان رو میده که بدون نیاز به ویرایش کد های اصلی برنامه‌ش (هسته/main) قابلیت ها رو با ارائه بسته‌هایی به نام پلاگین در اختیار کاربران قرار بده و کاربران هم می‌تونن به سادگی با توجه به نیازشون از بین این افزونه ها، اون هایی که می‌خوان رو به برنامه‌شون اضافه کنن.

از طرفی میشه از این معماری به عنوان یک پلن تجاری نیز استفاده کرد. مثلا شما می‌تونید برنامه خودتون رو به صورت رایگان و حتی متن‌باز عرضه کنید اما با فروش پلاگین ها (و یا ارائه خدمات) کسب درآمدکنید. اگر شما هم یک کاربر وردپرس باشید حتما با این پلن آشنا هستید! 😄

پ.ن: پروژه telegram-post-bot من در گیت‌هاب از همین ساختار پیروی می‌کنه و توش امکان اضافه کردن پلاگین هست و درواقع همین پروژه بهانه‌ای شد که من پیاده‌سازی این معماری رو توی پایتون یاد بگیرم و امتحان کنم.

خب وقتشه که دیگه مقدمه رو بذاریم کنار و بریم سراغ اصل مطلب!

بهنام سیم‌جو29-05-1401 تخصصی

بعد از درخواست یکی از دوستان در مورد مستقر کردن(deploy) یک وب اپلیکیشن پایتونی که با جنگو نوشته شده بود، تصمیم گرفتم این مطلب رو بنویسم. اینجا چند چیز را فرض کردم:

  • از سکوی (framework) فلسک استفاده می‌کنید.در مورد جنگو هم البته داستان کمابیش همین هست. در مورد چری‌پای میتونید با همچین راهنمایی پیش برید یا از کارساز(سرور) وب خود چری‌پای به اسم چروت (cheroot) استفاده کنید.
  • از دبیان (یا توزیع‌هایی که بر پایه دبیان ساخته شدن مثل اوبونتو) و systemd استفاده می‌کنید.
  • میخواهید از انجین‌ایکس(nginx) به عنوان کارساز وب یا وب‌سرور استفاده کنید.
  • تنها از HTTP می‌خواهید استفاده کنید و برای سادگی کار فعلا HTTPS را کنار میگزاریم.
  • قرار هست وب اپلیکیشن شما در ریشه قرار بگیرد. یعنی از طریق آدرسی مثل https://example.com/ قابل دسترسی باشد نه مثلا https://example.com/somewhere

فاروق کریمی‌زاده05-05-1401 تخصصی

هیچ می‌دونستین که تو پایتون می‌تونین برای لیست ها و توپل ها عبارت هایی مثل [1,2,3]>[0,2,3] نوشت؟ یعنی می‌تونی خیلی راحت لیست ها رو باهم مقایسه کنی.

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

بهنام سیم‌جو29-04-1401 تخصصی

امروز، دوشنبه ۲ اسفند ۱۴۰۰،‌ جلسه دوم گروه نرم‌افزار آزاد هرمزگان را با حضور نویسنده این مطلب داشتیم و به پیشنهاد یکی از اعضا، یک بازی جالب کردیم: «به صورت چرخشی در یک دایره هرکس میبایست نام یک ماژول پایتونی، توکار یا غیر تو‌کار،‌ بگوید. نام ماژول‌ها روی تابلو نوشته می‌شود و کسی حق تکرار اسم یک ماژول را ندارد. کسی که ظرف مدت زمان ۳۰ ثانیه نتوانست اسمی پیدا کند، از بازی خارج می‌شود و آخرین نفر باقی مانده در بازی برنده است». روشن است که در بازی حق جستجو کردن، نوشتن یا امثالهم را نداشتیم!

بنده در دانشگاه هرمزگان دستیار تدریس یا حل التمرین(TA) برنامه‌سازی پیشرفته هستم بودم. ضمن تصحیح پروژه دانشجویان به اشتباهاتی درست(!) در کد هایشان برخوردم. قسمت درست کد‌ها این می‌باشد که «کار» می‌کنند اما به روش درست پایتون نوشته نشده‌اند.

فاروق کریمی‌زاده26-11-1400 تخصصی

به صورت کلی، جنگو و django-admin تلاش می‌کنند با پیاده‌سازی پیش‌فرض‌هایی که مناسب هستند زندگی توسعه‌دهنده را آسان‌تر کنند. در نتیجه یک توسعه دهنده قادر خواهد بود تا یک اپلیکیشن را در زمان بسیار کمی بالا بیاورد. اما او مجبور است به اکثر پیش‌فرض‌ها بچسبد. البته سفارشی‌سازی ممکن است اما اغلب تغییر پیش‌فرض‌ها نیازمند فهمی درست از اتفاقاتی است که پشت صحنه می‌افتد که می‌تواند وقت‌گیر و نیازمند مهارت باشد.

فاروق کریمی‌زاده18-11-1400 تخصصی

یکی از ترفند های کدزنی که برنامه‌نویسان حرفه‌ای معمولا از آن استفاده می‌کنند استفاده از or و and به جای شرط است. بله درست متوجه شدید، به جای شرط. این ترفند ممکن است باعث شود تا کد شما خوانا نباشد و حتی توصیه شده نیست ولی ترفند به شدت جذابی‌ست که می‌تواند در خلاصه نویسی کد تاثیر زیادی داشته باشد. این روش در بسیاری زبان ها مانند C, JavaScript, Python و … کاربرد دارد. پس با ما همراه باشید تا این تکنیک زیبا و جذاب را یاد بگیرید.

بهنام سیم‌جو12-11-1400 تخصصی

در پایتون ۳.۸ یک عملگر جدید برای انتصاب معرفی شده است.این عملگر جهت انتصاب در عبارات بزرگتر استفاده می‌شود. مثلا:

a = 10
if (b := a) == 10:
    ...

در تکه کد بالا هم‌زمان مقدار b برابر مقدار a می‌شود و هم مقایسه انجام می‌شود.

فاروق کریمی‌زاده14-09-1400 تخصصی

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

دریافت از فضای ابری فاروق

فاروق کریمی‌زاده13-09-1400 تخصصی

در نسخه ۳.۱۰ پایتون یک ویژگی جدید و جالب به زبان اضافه شده است: pattern matching(به فارسی‌: تطبیق الگو). اگر با سوئیچ‌کیس(switch-case) در زبان‌های سی و سی‌پلاس‌پلاس کار کرده‌اید، پترن‌مچینگ یک نسخه پیشرفته‌تر از switch-case مي‌باشد. در پست «از سوییچ‌کیس تا پترن‌مچینگ» از روزبه شریف‌نسب می‌توانید در مورد این ساختار‌ها در زبان‌های مختلف و تاریخچه آن‌ها بخوانید.

فاروق کریمی‌زاده تخصصی

range(end)
range(start, end)
range(start, end, step)

یک شی range در پایتون بسیار شبیه یک لیست از اعداد مرتب است اما توجه کنید که با یک نمونه از کلاس range سروکار دارید و نه یک لیست یا توپل.

فاروق کریمی‌زاده02-09-1400 تخصصی

help(int)

کلاس int در پایتون که بعضا آن را با تابع اشتباه می‌گیرند،برای تبدیل یک متغیر با نوعی جز نوع عدد صحیح به عدد صحیح کاربرد دارد. شما می‌توانید با استفاده از int در پایتون یک رشته(string) یا یک عدد اعشاری(float) را به عدد صحیح تبدیل کنید.

تقریبا در تمام زبان‌های برنامه‌نویسی از نسل سی، چیزی به اسم آرایه وجود دارد.در زبان سی یک آرایه را می‌توان یک فهرست از متغیر‌های هم‌نوع در نظر گرفت که خانه‌های مجاور حافظه به آن تخصیص داده شده هست. به عنوان یک نمونه، در زبان سی یک آرایه از ۳ عدد صحیح تعریف کرده‌ام:

int my_cool_array[3] = {1, 2, 3};

در پایتون چیزی به اسم آرایه نداریم. خود زبان به صورت ذاتی(منظورم builtin یا توکار هست) چند نوع مخزن دارد که این‌جا من در مورد دو مورد از آن‌ها برایتان می‌نویسم.

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

فاروق کریمی‌زاده15-08-1400

بنده دیروز در اتاق ماتریکس هش‌بنگ یک پرسش مطرح کردم:‌ «عقیده شما در مورد پایتون چیست؟» یکی گفت زبان «چندش‌آور» و «احمقانه‌ای» است اما دیگری جواب بهتری داد:

آسان برای یادگیری، عالی برای درست کردن پیش‌نمونه یا prototype و یادگیری تئوری مهندسی کامپیوتر، عالی برای اسکریپت‌هایی که میخواهی قابل پیش‌بینی باشند. [اما] افتضاح برای سرعت یا مقیاس‌پذیری.

Lance R. Vick

بله! پایتون واقعا برای یادگیری آسان است و می‌توانید با آن سریع و طی مثلا چند ساعت(یا بیشتر یا کمتر که البته به اندازه و نوع پروژه بستگی دارد) یک پیش‌نمونه بسازید. علاوه بر این‌ها شما را با چیزی مثل مدیریت دستی حافظه درگیر نمی‌کند. در نتیجه کاندیدای خوبی برای یادگیری مهندسی کامپیوتر و شروع برنامه‌نویسی هست. اما خب همه خوبی‌ها در این زبان برنامه‌نویسی جمع نشده‌اند. پایتون با پیاده‌سازی پیش‌فرضش،که تقریبا همه‌جا استفاده می‌شود، «کند» است(می‌توانید مطلب پیاده‌سازی الگوریتم وارشال در پایتون و راست را ببینید)

لنس ادامه داد:

اگر نیاز داری چیزی را یک بار در ثانیه روی یک پردازنده تک هسته‌ای اجرا کنی، پایتون برای هک کردن(در اینجا نه به معنی نفوذ و خرابکاری –فاروق) چیزی که کار را انجام دهد،‌ آسان خواهد بود. اگر به سرعت و امنیت نیاز داری، بهتر است به سراغ راست(Rust) یا گو(Go) بروی. اما آن دو سرمایه‌گذاری اولیه بیش‌تری را برای برنامه‌نویسی طلب می‌کنند. من ترجیح می‌دهم برای چیزی که تنها یک‌بار قرار است انجام شود و سرعت مهم نیست به سراغ پایتون بروم تا طی مدت زمان کوتاهی، مثلا چند ساعت آینده، شروع به کار کند. اما اگر مقیاس‌پذیری می‌خواهم یا قرار است با بار‌های سنگین شبکه دست و پنجه نرم کنم و غیره، در آن صورت به سراغ گو می‌روم.

Lance R. Vick

لنس در اینجا به ضعف امنیتی پایتون در برنامه‌های چند ریسمانی(multi thread) اشاره می‌کند(به نظر من). البته خود در مورد آن چیزی نمی‌دانم و لیکن در موردش شنیده‌ام. سپس می‌گوید به سرمایه‌گذاری اولیه بیشتری نیاز داریم تا گو یا راست یا یاد بگیریم که جز این نیست مخصوصا که راست(و احتمالا گو) مقداری تفکر جدید می‌طلبد. و این تفکر جدید باید ساخته شود که زمان و انرژی می‌برد.

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

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

هشدار! کد راست با اینکه به درستی کار می‌کند اما ممکن است به روش خود راست نوشته نشده باشد و در آن عادت‌های خوب برنامه‌نویسی رعایت نشده باشد!

// Code by Rust beginner, Farooq Karimi Zadeh
// Under CC0 1.0
// Warning! Code might not be idiomatic

fn main() {
    let mut bin_matrix = [
        [0, 1, 0, 0],
        [1, 0, 1, 0],
        [0, 0, 0, 1],
        [0, 0, 0, 0]
    ];
    const N:u32 = 300_000;
    for _dummy in 0..N { 
        for k in 0..bin_matrix.len() {
            let the_clone = bin_matrix;
            for (i, row) in bin_matrix.iter_mut().enumerate() {
                for (j, value) in row.iter_mut().enumerate() {
                    if *value == 0 {
                        *value = the_clone[i][k] & the_clone[k][j];
                    }
                }
            }
        }
    }
    println!("{:?}", bin_matrix);
}

پیوند کد راست در گیت‌هاب گیست(به همراه زمان اجرا روی لپ‌تاپ بنده)

"""
Warshall algorithm
This calculates transitive closure for a given binary matrix
Author: Farooq Karimi Zadeh
Code is under CC0 1.0
"""

from pprint import pprint

def pretty_print_matrix(matrix):
    pprint(matrix, width=len(matrix[0]) * 3 + 2)


n = int(3e5)  # calculate n times
bin_matrix = [[0, 1, 0, 0], [1, 0, 1, 0], [0, 0, 0, 1], [0, 0, 0, 0]]
for dummy in range(n):
    for k, _ in enumerate(bin_matrix):
        for i, row in enumerate(bin_matrix):
            for j, value in enumerate(row):
                if not value:
                    bin_matrix[i][j] = bin_matrix[i][k] and bin_matrix[k][j]

if n == 1:
    pretty_print_matrix(bin_matrix)
else:
    pass  # then we are benchmarking

پیوند کد پایتون در گیت‌هاب گیست(به همراه زمان اجرا روی لپ‌تاپ بنده)