اگر شماهم توی مخازن دبیانتون احساس کندی میکنید یا با ارور های متعدد 403 و 404 روبرو میشید ، این پست رو تا انتها بخونید D:
حالا این netselect چی هستش؟
از خیلی مدت پیش، کاربرای توزیع هایی مثل آرچ از ابزاری به اسم reflector استفاده می کردن. این ابزار توی ویکی آرچ هم اسمش اومده و یکی از پر استفاده ترین ها برای انتخاب سریع ترین مخزن ممکن توی آرچه.
من خودم تا مدت ها نمیدونستم که برای دبیان هم همچین چیزی وجود داره، (توی اوبونتو میشه از برنامه گرافیکی که برای مدیریت مخازن هست ، سریعترین مخزن ممکن رو انتخاب کرد. همچین برنامه ای در دبیان به صورت پیشفرض و با همون پشتیبانی وجود نداره) تا اینکه به واسطه یکم دبیان گردی با این ابزار آشنا شدم. کارش این هستش که مثل reflector سریعترین مخزن apt رو برای شما انتخاب میکنه.
نصب و راهاندازی
برای نصب netselect کافیه که دستور زیر رو داخل ترمینال اجرا کنید:
sudo apt install netselect-apt
بعد از اینکه نصبش کردین بریم تا کار رو باهاش یادبگیریم 🙂
طریقه استفاده
برای استفاده از این دستور کافیه توی ترمینال
sudo netselect-apt
رو اجرا کنیم.
حالا چه امکاناتی داره؟
تعیین نسخه / کدنیم دبیان
به عنوان مثال برای اینکه تعیین کنیم مخازنی که برای ما پیدا میکنه برای کدوم نسخه از دبیان باشه (مثلاً دبیان sid یا testing) باید جلوی دستور کدنیم دبیان روهم بنویسیم:
sudo netselect-apt stable
دستور بالا میاد و مخازن سریع رو برای دبیان پایدار پیدا میکنه.
تعیین کشور
همینطور شما میتونید توی این دستور تعریف کنید تا مخازن مخصوص یک کشور رو برای شما لیست کنه:
sudo netselect-apt -c country
برای مثال من میخوام سریعترین مخزن ممکن که داخل ایران هستش رو برای خودم تنظیم کنم:
sudo netselect-apt -c iran
یک معماری دیگه؟
بله درست خوندید D: شما میتونید با netselect حتی مخازن مخصوص یک معماری دیگه روهم دریافت کنید:
مثلا من اگه بخوام سریعترین مخزن برای معماری ۳۲ بیتی رو پیدا کنم ، باید از فلگ a- و یا arch– استفاده کنم:
sudo netselect-apt -a i386
و یا
sudo netselect-apt --arch i386
بعد از اجرای این دستور سریعترین مخزن ۳۲ بیتی برای ما انتخاب میشه.
دیگه چه فلگ هایی داره؟
یک فلگ برای تنظیم مخازن غیررایگان (non-free) و یا فعال کردن مخازن سورس (deb-src) وجود داره.
برای مثال اگه من بخوام یک مخزنی رو پیدا کنم در ایران، برای معماری ۳۲ بیتی به همراه مخازن غیررایگان و سورس باید دستور رو با فلگ های زیر اجرا کنم:
sudo netselect-apt -a i386 -c iran -n -s stable
فلگ n- برای فعال کردن مخازن non-free و فلگ s- برای فعال کردن مخازن سورس به کار میرن 🙂
همینطور اگر مایل بودید man-page این دستور رو به صورت آنلاین و یا از طریق خود ترمینال با وارد کردن دستور زیر میتونید بخونید:
man netselect-apt
حدود ۴ سال پیش با پروژهٔ آواهای مشترک موزیلا آشنا شدم. آن زمان مجموعه دادهٔ (Dataset) فارسی پروژه تنها حدود ۲ گیگابایت بود. الآن زبان فارسی تقریبا ۱۰ گیگابایت مجموعه داده دارد. در این مطلب راجع به پروژه و اهمیت آن برای پروژههای یادگیری ماشینی و هوش مصنوعی توضیح میدهم. البته موضوع دورهمی نهم کرمهای کامپیوتر هم در همین مورد بود.
الگوریتم کولهپشتی، یک الگوریتم از نوع حریصانه هست. در این مطلب در مورد الگوریتم کولهپشتی یک و صفر (0/1 knapsack algorithm) مینویسم. برای مثال فرض کنید یک کوله پشتی با حجم ۹۰ لیتر دارید؛ و وسایلی که دارید علاوه بر حجم برای شما یک ارزش یا اهمیت دارند و احتمالا همه آنها جا نمیشوند. حال به چه صورت وسایل را انتخاب میکنید تا بیشترین ارزش را در کوله پشتی خود داشته باشید؟ در الگوریتم کولهپشتی یک و صفر یا یک شی انتخاب میشود و یا خیر! امکان برش و تکه کردن نیست.
سلام! به مسئلهای برخوردم که نیاز داشت یه آرایه با طول نامعلوم رو از کاربر بگیریم. اینطوری که کاربر شروع میکنه به وارد کردن ورودیها تا زمانی که کلمه end رو بزنه و تموم کنه. مسئله سادهای هست و در کل زیاد چیز شاخی نیست!!
چالشش اینه که ما تعداد اعضا رو نمیدونیم و طول آرایه هم ثابته کنه، پس در حالت عادی مجبوریم ورودیها رو بریزیم تو یه لیست تا آخرش که کار کاربر تموم شد همه رو مثلا منتقل کنیم به یه آرایه با طول لیسته، یعنی داریم دو بار هر عضو رو بررسی میکنیم که هزینه زمانی اینجا میشه 2n(معادل O(n)) از طرفی توی زبانی مثل C که اصلا لیست نیست و باید مثلا از SLL(به انگلیسی: Singly Linked List و به فارسی: فهرست پیوندی یکطرفه) استفاده کرد.
#include <stdio.h>
#include <stdlib.h>
double* rec(int i) {
char input[100]; // Adjust the input string size as needed
fgets(input, sizeof(input), stdin);
if (strcmp(input, "end\n") == 0) {
double* result = (double*)malloc(i * sizeof(double));
return result;
}
double* arr = rec(i + 1);
sscanf(input, "%lf", &arr[i]);
return arr;
}
int main() {
double* result = rec(0);
// Printing the result
for (int i = 0; result[i] != 0.0; ++i) {
printf("%lf ", result[i]);
}
free(result); // Free the allocated memory
return 0;
}
مشابه این کد در پایتون به این شکل نوشته میشود(برای آرایه از numpy استفاده شده).
from numpy import np
def rec(i=0):
inp = input()
if inp == "end":
return np.zeros(i)
arr = rec(i + 1)
arr[i] = int(inp)
return arr
در واقع این شیوه به شکلی هوشمندانه از پشته(به انگلیسی: stack) خود سیستم برای ذخیره موقتی اعضا و شمارش آن ها استفاده میکنه. اما باید دقت کنید که این روش نامحدود هم نیست چون به اندازه پشته محدود میشه.
روبوکد یک بازی برنامهنویسی است که در آن با زبان جاوا، اقدام به برنامهنویسی کردن روباتهای کوچکی میکنید که با بقیهٔ روباتها باید بجنگند. مبارزه میتواند به صورت تکبهتک با یک روبات دیگر یا به صورت گروهی با مثلاً ۹ روبات دیگر باشد. هرچند که باید روباتهای خود را به زبان جاوا بنویسید، اما دانش عمیقی از این زبان مورد نیاز نیست و در صورتی برنامهنویس یکی از زبانها از همین خانواده باشید، میتوانید بهراحتی یک روبات بسازید.
تعریف کلی کاراکتر یا نویسه در کامپیوتر یعنی کوچکترین واحد نمایش اطلاعات که میتونه یک حرف یا علامت باشه. نویسهها شامل فاصله، عددها و علامتها هم هستند!
نویسه در دنیای دیجیتال
در دنیای دیجیتال برای انتقال اطلاعات چیزی جز خاموش و روشن نداریم! جریانهای الکتریکی که قطع و وصل میشن، نوری که چشمک میزنه یا حتی تغییر جهت قطبهای مغناطیسی توی هاردها دنیای دیجیتالما رو میسازن!
به این خاموشها و روشنها میتونیم غلط و صحیح یا صفر و یک رو نسبت بدیم. این صفرها و یکها به کمک قوانین مبنای عددی در ریاضیات معنا پیدا میکنن. یعنی مثلاً عدد ۲ توی کامپیوتر میشه ۰۰۱۰، عدد ۱۱ توی کامپیوتر میشه ۱۰۱۱ و عدد ۵ میشه ۰۱۰۱. در واقع هر عدد، کد مخصوص به خودش رو داره که قابل محاسبه هست. این محاسبه بین مبنای ده (اعداد خودمون) و مبنای دو (اعداد کامپیوتر) به سادگیِ انجام چند تقسیم هست.
برای انتقال اعداد مشکلی نداریم اما اگر بخوایم نویسهها رو منتقل کنیم مشکل خواهیم داشت. برای این کار مجبوریم جدولی بسازیم و برای هر نویسه یک کد تعیین کنیم.
امروز میخوام براتون از رمزنگاری دوسویه یا دو کلیده بگم، این رمزنگاری دنیای اطلاعات رو زیر و رو کرده! تو جهان امروز هر جا رو که نگاه میکنی ردپای این رمزنگاری هست! HTTPS ،SSH، ارز های دیجیتال، شبکههای مجازی و … همه و همه دارن از این روش برای حفظ امنیت استفاده میکنن.
آنچه خواهید خواند!
- در ابتدا خواهم گفت در صورت نبود رمزنگاری اطلاعات چطور لو میروند
- بعد یه دید کلی از رمزنگاری میدم و میگم چرا نمیشه از روش های رایج استفاده کرد
- سپس روش رمزنگاری دوسویه رو به زبون ساده توضیح میدهم
- در ادامه از چگونگی استفاده آن در وب میگم
- چند خط کد مینویسیم و در پایتون از این روش استفاده میکنیم
در این مطلب میگیم که چطور میشه در پایتون یک پروسه دیگر را اجرا کرد و خروجی استاندارد و ورودی استاندارد رو بگیریم و ازش استفاده بکنیم. خروجی و ورودی استاندارد همون چیزایی هستن که تو محیط متنی چاپ میشن یا کاربر توی ورودی برنامه وارد میکنه. در واقع توی این مطلب یاد میگیرید که چطور میتونید در پایتون با برنامه های کنسولی دیگه تعامل کنید.
پایپ (pipe) چیست؟
به طور پیشفرض سیستمعامل ورودیها رو از موس و کیبورد میگیره و خروجیها رو روی صفحهنمایش مینویسه. اما در بعضی مواقع نیاز هست که یک برنامه از خروجیهای یک برنامه (یا دستور) دیگه استفاده کنه یا به ورودی استاندارد یک برنامه داده ارسال کنه. در چنین شرایطی pipe استفاده میشه. pipe یک فضای موقتی در حافظه برای جابهجایی اطلاعات بین دو برنامه هست که البته یک طرفه هم هست؛ یعنی مثلا برای گرفتن خروجی باید از یک pipe و برای نوشتن ورودی هم از یک pipe دیگر باید استفاده کرد.
زبانها معمولاً یا تعیین نوع پویا دارند؛ مانند کامن لیسپ، پایتون، جاوا اسکریپت یا دارای تعیین نوع ایستا هستند؛ مانند سی و سیپلاسپلاس، راست و دوباره کامن لیسپ (معمولاً پیادهسازیهای مدرن کامن لیسپ، مانند SBCL، اجازه میدهند بنا به خواست برنامهنویس، قسمتی از کد، دارای تعیین نوع ایستا و قسمتی دارای تعیین نوع پویا باشد).
در پایتون، تعیین نوع متغیرها، مقدار یا مقادیر بازگشتی توابع و متدها و آرگومانهای توابع اجباری نیست. اما میتوانیم با تعیین نوع و استفاده از یک نرمافزار Linter به کاهش خطاهای خود پیش از اجرا کمک کنیم.
def f(x: int) - > int:
return x * 2 + 1
با این که تعیین نوع آرگومان یا ورودی تابع f که x باشد و مقدار بازگشت آن یعنی x*2 + 1
در اجرا تأثیری ندارد، اما زمانی که بخواهم مقدار بازگشت تابع f را با یک رشته نویسه (کاراکتر) جمع کنم به من اخطار داده میشود:
بدیهی است که اجرای این برنامه به وسیلهٔ پایتون نیز باعث خطا میشود. در مقابل زمانی که نوع ورودی و خروجی تابع را مشخص نمیکنم اخطاری داده نمیشود:
در ادامه با تعیین نوع ورودیها و خروجی توابع و متدها و ویژگیهای یک کلاس آشنا میشویم.
مسئلهٔ ۸ وزیر میپرسد که در یک صفحهٔ شطرنج چهطور میتوانیم ۸ مهرهٔ وزیر را چنان قرار دهیم که هیچکدام در معرض تهدید دیگری نباشد. در ریاضیات و علوم کامپیوتر، مسئلهٔ n وزیر یک نسخهٔ تعمیمیافته از ۸ وزیر میباشد که برای اکثر nهای صحیح مثبت (یا طبیعی) بیشتر از یک چینش وجود دارد.
قبلاً یک روش برای پیدا کردن راه حل برای مسئلهٔ ۸ وزیر با استفاده از الگوریتم ژنتیک ارائه دادم. حال میخواهم یک روش دیگر برای همین هدف اما به صورت یک الگوریتم قطعی و تصادفی به همراه کد پایتون ارائه دهم.
زمانی که از یک برنامهنویس پایتونی بخواهید یک تابع ساده بنویسد تا ارقام یک عدد را جمع کند و برگرداند، احتمالاً ابتدا عدد را به یک رشته تبدیل میکند و سپس رشته را به لیست (فهرست) و نهایتاً تکتک اعضای لیست را که ارقام عدد به صورت رشتههای تکنویسهای هستند به عدد تبدیل میکند و سپس آنها را با هم جمع میکند. ولی الزاماً اولین روشی که برای حل مسئله به ذهنمان میرسد، بهترین روش نیست. در این مطلب دو الگوریتم برای جمع ارقام یک عدد صحیح به صورت بازگشتی و تکرارشونده به همراه کد های پایتون آن ها ارائه میدهم.
صدای بوق ممتد از لحاظ فنی همان موج سینوسی با فرکانسی (بسامد) ثابت است. در این مطلب یک کد ساده و کوتاه پایتون ارائه میدهم که بدون استفاده از کتابخانههای اضافی، میتواند یک بوق را با هر فرکانسی تولید کند و در یک فایل صوتی wave ذخیره کند.
مسئلهٔ ۸ وزیر یک تمرین معروف در علوم کامپیوتر و ریاضیات میباشد. این مسئله در مورد یک صفحهٔ شطرنج رایج و مهرهٔ وزیر در این بازی فکری میباشد. در ریاضیات ثابت میشود که میتوان ۸ وزیر را در یک صفحهٔ شطرنج چنان قرار داد که هیچکدام از وزیرها، دیگری را تهدید نکنند. با تعمیم این مسئله در ریاضیات، ثابت میشود که در یک صفحهٔ شطرنج به ضلع n، میتوان تعداد n وزیر قرار داد؛ چنانچه هیچکدام دیگری را تهدید نکنند. در علوم کامپیوتر میتوان با روشهای مختلفی این مسئله را حل کرد و به یک چینش از مهرههای وزیر رسید که هیچکدام دیگری را تهدید نکنند. یکی از این روشها «الگوریتم ژنتیک» است.
طی دهههای گذشته بحثهای زیادی راجع به اینکه مشخصات زبانهای برنامهنویسی، به عنوان مثال تعیین نوعشان و مثلا ایستا(static) یا پویا(dynamic) بودن چه تاثیری روی روند توسعه نرمافزارها دارد. یک مقاله علمی(paper) با مطالعه ۶۰۰ پروژه در گیتهاب شامل تقریبا ۷۰ میلیون خط کد و ۳ میلیون کامیت به نتایجی در این مورد رسیدهاست.