تصور کنید دنیایی را که در آن هیچ نرم‌افزاری متن‌باز وجود نداشته باشد، در چنین جهانی پیشرفت صنعت نرم‌افزار کاملا انحصاری بوده و کند می‌شود. همه افراد بدون اینکه بدانند در حال استفاده از نرم‌افزارهای متن باز هستند حالا چه کلاینت تلگرام باشد چه نرم‌افزاری مثل VLC، چه به عنوان سیستم‌عامل کامپیوتر شخصی، چه سیستم‌عامل سروری که توسط آن سرویس‌های روزمره را دریافت می‌کنند. دنیای بدون Open Source یا متن‌باز دنیای بدون اشتراک گذاری است. در چندین هزار سال بشر از اشتراک گذاری تکنولوژی و نحوه ساخت صنعت بهرمند شده و توانسته جوامع را بر این اساس بسازد و حالا این مفهوم به ظاهر جدید یعنی متن‌باز یا Open Source می‌خواهد مارا به آن واقعیت کهن برگرداند. به بیان ساده دنیای بدون متن‌باز دنیای بدون اشتراک گذاری است.



ادامه مطلب

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


ادامه مطلب

یک ماه گذشته بود که ونزوئلا ارز دیجیتالی با پشتوانه نفت به نام Petro را پیشفروش کرد و قصد داشت از این طریق اقتصادش را بهبود بدهد. این ارز دیجیتال در ابتدای کار خودش توانست ۷۳۵ میلیون دلار جذب سرمایه کند. حالا به تازگی رئیس جمهور آمریکا دونالد ترامپ در فرمانی این ارز دیجیتال و تمامی تراکنش‌های مرتبط با آن را غیرقانونی خوانده و تحریم کرده است. پیش از این هم هشدار داده شده بود که آمریکایی‌هایی که از Petro استفاده کنند ممکن است به نقض تحریم محکوم شوند به این دلیل که این ارز به نوعی اعتبار بخشی به دولت ونزوئلا می‌باشد. اما سوالی که مطرح می‌شود این است که آیا اصلا درست است Petro را یک ارز دیجیتال بنامیم؟ درست است که از لحاظ فنی و ساختاری Petro یک ارز دیجیتال است اما تفاوت‌های آشکار زیادی با ارزهای دیجیتال دیگر دارد.

بیت‌کوین، خبرساز و بزرگترین بازیکن عرصه ارزهای دیجیتال، به پشتوانه تنها یک مانیفست و یک پروتکل بنا شده است برخی از اشکالات ارزهای رایج جهانی مانند عدم کنترل در تولید را هدف گرفت و به نوعی راه حل فنی برای آن ارائه داد. نقاط تاریک اقتصاد، نرم‌افزارهای باج گیری، فروش آنلاین مواد مخدر، فروش آنلاین آسیب پذیری‌های Zero-Day، پول شویی، فرار مالیاتی، دور زدن تحریم همگی در تعامل با بیت‌کوین قرار گرفته و در کنار توزیع عادلانه ثروت و آرمان‌های بلند پروازانه این ارز دیجیتال، به پیشرفت آن کمک روزانه کردند. بررسی کردن بیت‌کوین به صورت تک عاملی منطقی نیست. شدت وفاداری به پروتکل بیت‌کوین به حدی است که وقتی در سال ۲۰۱۷ برخی از توسعه دهندگان خواستند به علت اینکه اندازه ۱ مگابایتی اندازه بلاک این ارز دیجیتال را به ۸ مگابایت افزایش دهند تا تراکنش‌ها در صف‌هایی طولانی مدت قرار نگیرند، برخی دیگر از توسعه‌دهنده این را مخالف با نسخه اصلی ساتوشی خواندند و رد کردند. این مساله موجب به وجود آمدن یک ارز دیگر به نام bitcoincash شد. این ارز دیجیتال مشتق شده از بیت‌کوین بوده و تا تاریخ ۱ اوت سال ۲۰۱۷ تمامی تراکنش‌های این دو یکی است بعد از آن به دو شاخه جدا از هم تقسیم شده‌اند. روزی که این مقاله نوشته می‌شود قیمت هر یک بیت‌کوین ۹۱۳۸ دلار و هر یک بیت‌کوین‌کش ۱۰۷۷ دلار است و این ارزش بیت‌کوین‌کش آن را بر اساس ظرفیت بازاری برابر با ۱۸ میلیارد دلار چهارمین ارز دیجیتال بزرگ دنیا ساخته است. بیت‌کوین بخاطر نوآوری و آرمان‌هایش مورد تقدیس است بیت‌کوین‌کش ضمن حفظ آن آرمان‌ها و استقلال‌ها از حکومت‌ها یکی از ایرادات بیت‌کوین را برطرف کرد و تا حد خوبی مورد استقبال نیز قرار گرفت. اما این مساله در مورد Petro برقرار نیست، در واقع تنها ابتکار Petro پشتوانه‌اش به نفت بود میزان اهمیت این موضوع در طولانی مدت مشخص می‌شود اما دنیای ارزهای دیجیتال تا الان فقط با پشتوانه آرمان‌ها و وفاداری سفت و سخت به پروتکل پیش آمده است، مساله‌ای که وقتی پای یک دولت در ارزدیجیتال به میان باشد وجود ندارد.

در انگلیسی کامپیوتر به معنای محاسبه‌گر است، و این معنی خواه و ناخواه به آن ماهیتی از جنس اعداد و ارقام و محاسبه سود و زیان و کشیدن نمودار می‌بخشد. هرچند که با رشد کامپیوترهای شخصی شاهد استفاده از آن در بخش سرگرمی مانند بازی‌های کامپیوتری و دیدن فیلم و گوش سپردن به موسیقی نیز بوده‌ایم و برایمان جای تعجبی ندارد. اما استفاده جدیدتری از کامپیوتر در حال گسترش است که باری دیگر می‌تواند نگاه ما را به این وسیله تغییر دهد. دسته‌ای از هنرمندان مانند آقای Mario Klingemann هستند که در حال ارائه تعریفی جدید از هنر توسط کامپیوترها هستند. این‌ها از الگوریتم‌ها و فریم‌ورک‌های کامپیوتری که اکثرا مبتنی بر شبکه عصبی و Deep Learning بوده کمک گرفته و در برخی موارد از ایده‌ Generative Adversarial Networkها استفاده می‌کنند تا یک تصویر هنری تولید نمایند. در بخش عظیمی از این فرآیند تولید هنر، کامپیوتر و گیت‌های منطقی اثر گذاشته‌اند. روزی فکر می‌شد که کامپیوتر یک ماشین حساب پیشرفته است، روزی دیگر وسیله سرگرمی شد و حالا به نوعی می‌توانیم آنرا یک مبتکر و هنرمند بدانیم. دلیل پیشرفت‌های هوش مصنوعی به این سمت در سالهای اخیر متاثر از ارائه تکنیک‌هایی نظری برای افزایش کیفیت، گسترش فریمورک‌های سطح بالا و افزایش قدرت محاسباتی در شبکه‌های عصبی بخصوص به کمک کارت‌های گرافیکی و GPUها بوده است.

سرویس و پروژه ostagram
پروژه‌ای جالب و قابل توجه در این راستا به نام ostagram توسط آقای Sergey Morugin ایجاد و تکمیل شده است. که از یک شبکه عصبی کانولوشنی، یا convolutional neural network و همچنین الگوریتم استایل هنری که توسط Leon A. Gatys و Alexander S. Ecker و Matthias Bethge استفاده کرده و بر اساس یک عکس الگو و یک عکس ورودی، یک عکس خروجی متشکل از اعمال آن الگو در عکس ورودی را خروجی می‌دهد. شاید بپرسید چه تفاوتی با آن همه Effectهایی که در برنامه‌های مختلف ویرایش عکس داشتیم ایجاد کرده است؟ آن Effectها همگی برنامه‌نویسی شده و به صورت کاملا قطعی به کامپیوتر دستور داده شده بودند و شاید حاصل هفته‌ها تلاش یک برنامه‌نویس برای بهبود بوده باشند و به هیچ‌وجه اینگونه نبود که برنامه‌نویس از خروجی کار و ابتکاری که شبکه عصبی به آن داده شگفت زده شود. اما اینجا تصاویری تولید می‌شوند که برای همگان هرچند که متخصص همین حوزه نیز باشند شگفت‌آور است. شما نیز می‌توانید با ثبت نام در سایت ostagram.ru پس از ثبت‌نام با ارائه عکس ورودی و الگوی مدنظر خودتان، خروجی مطلوب را دریافت نمایید. در ادامه برخی از تصاویر صفحه اینستاگرامی ostagram.ru را با هم مرور می‌کنیم. برای دیدن تصاویر بیشتر می‌توانید از صفحه اینستاگرام ostagram.ru دیدن فرمایید.
ادامه مطلب

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

ادامه مطلب

مقدمه

برخی مسائل در کامپیوتر هستند که تاکنون الگوریتم دقیق چندجمله‌ای برای حل آنان معرفی نشده است. برخلاف مسائلی که راه حل چندجمله‌ای دارند و همگی در کلاس P یا Polynomial قرار می‌گیرند، این مسائل در کلاس NP یا Nondeterministic Polynomial time قرار می‌گیرند. بحث پیرامون این مسائل زیاد هست شاید بپرسید اصلا چه اهمیتی دارند؟ خیلی از مسائل مهم مثل پیشبینی ساختار پروتئین الگوریتم از جنس NP هستند[منبع]. مساله پیشبینی ساختار پروتئین الگوریتم در ساخت دارو و بیوانفورماتیک اهمیت فراوانی دارد. برای دیدن مثال‌ها و توضیحات بیشتر می‌تونید این ویدیو از Youtube رو ببینید. اثباتهای زیادی در زمینه اینکه کلاس P همان کلاس NP هست و نیست از طرف محققین برجسته دنیا انجام شده. تا زمان نوشتن این مطلب ۱۱۶ عدد اثبات در زمینه برابر بودن یا نبودن در این صفحه ثبت شده که قابل توجه است.

در کلاس NP، یک زیرمجموعه به نام NP-Complete که به آن NPC نیز می‌گویند وجود دارد و وقتی می‌گوییم یک مساله مطعلق به کلاس NPC است یعنی تمامی مسائل NP به آن قابل کاهش هستند. یا به عبارت دیگر بین مسائل NP سخت‌ترین مسائل هستند. بقول مولوی که می‌گوید «چونک صد آمد نود هم پیش ماست» این مسائل اگر حل شوند بقیه مسائل هم با توجه به اینکه به این مسائل قابل تبدیل هستند و ساده‌تر هستند، توسط حل شدن اینها حل می‌شوند. دقت کنید که این یک رابطه یک طرفه است.

برای اثبات NPC بودن یک مساله باید دو مرحله را اثبات کنیم. ابتدا اینکه با داشتن جواب می‌توان در زمان چند جمله‌ای درست بودن جواب را بررسی کرد و همچنین باید ثابت کنیم که این مساله حداقل به اندازه یک مساله NPC دیگر سخت است. در نتیجه می‌توان آن مساله NPC دیگر را به مساله مورد نظر ما کاهش داد یا reduce کزد. شاید بپرسید پس اولین مساله NPC چطور ثابت شده است که NPC هست، وقتی که هیچ مساله NPC دیگری وجود ندارد؟ اثبات اولین مساله NPC که Circuit satisfiability problem است به شکلی دیگری انجام می‌شود که توصیه می‌کنم اثباتش رو حتما چک کنید به نوعی اثبات ترکیبی از سخت‌افزار و نرم‌افزار را باهم دارد. بعد از این اثبات می‌کنند مساله 3SAT نیز به اندازه این مساله سخت است و در ادامه بقیه الگوریتم‌ها از طریق یکدیگر و یا از طریق 3SAT اثبات می‌شوند.


مساله رنگ آمیزی

کمترین تعداد رنگی که با آن بتوان تمامی راس‌های گراف را رنگ‌آمیزی کرد، طوری که دو راس مجاور همرنگ نباشند چیست؟ مساله رنگ آمیزی در واقع همین سوال است. این مساله به ازای دو رنگ در زمان چند جمله‌ای قابل حل کردن می‌باشد. در ادامه ثابت می‌کنیم به ازای سه رنگ و بالاتر از آن NPC می‌باشد. این مساله یک نوع مساله بهینه‌سازی یا optimization problem است اما برای اثبات نیاز داریم به نوعی این مساله را به یک مساله تصمیم‌گیری یا decision problem تبدیل کنیم که جواب بله یا خیر داشته باشد. نسخه تصمیم‌گیری مساله رنگ آمیزی به این صورت است: با داشتن یک گراف و یک K آیا می‌توان این گراق را با K رنگ رنگ آمیزی کرد؟ در ادامه ما ابتدا به ازای K=3 این مساله را اثبات می‌کنیم و سپس به ازای Kهای بالاتر اثبات می‌کنیم.

ادامه مطلب

مقدمه
سوال «چگونه کار کنیم تا در مسابقات برنامه نویسی موفق شویم؟» به تعداد افراد شرکت کننده در این مسابقات جواب مختلف دارد ولی تعدادی ضدالگو وجود دارد که همه با مشکل ساز بودن این ضدالگو ها موافق هستند. یک مثال ساده این است که مثلا تشخیص روشهای افزایش ده سال طول عمر، سخت تر از تشخیص روشهای کاهش ده سال طول عمر هست و اگر شما از این ضد الگوها یا کارهای اشتباه دوری کنید میتوان امیدوار بود که در کل نتیجه بهتری بگیرید. بد نیست از کتاب «چگونه در C++ برنامه ننویسیم؟» نام ببرم که در انتخاب عنوان از این کتاب الگو گرفتم.
ادامه مطلب

مقدمه
یکی از الگوریتم های ساده که معمولا در درس ساختمان گسسته، طراحی الگوریتم و ساختمان داده به صورت پایه مطرح می شود الگوریتم فلوید وارشال می باشد. این الگوریتم با مرتبه O(N3) شاید یکی از بدترین انتخاب ها برای حل مسئله به علت کندی بیش از حد باشد. اما وقتی تعداد نود به اندازه کوچکتر از 200 باشد تفاوت قابل توجه ای با الگوریتم های خوب جایگزین ندارد و به علت پیاده سازی ساده و سریع این الگوریتم همیشه اگر در محدودیت های مساله قابل استفاده باشد جایگزین بقیه کاندید ها می شود.
رابرت فلوید و استفان وارشال همزمان باهم در مقالات مختلف در سال 1962 این الگوریتم را منتشر کردند، و به افتخارشان الگوریتم فلوید-وارشال نام گرفت که به اختصار به آن فلوید نیز گفته می شود، رابرت فلوید دارای یک الگوریتم خوب دیگر برای پیدا کردن دور در لیست پیوندی یا روابط بازگشتی بر اساس مقدار قبلی می باشد که باز با اسم الگوریتم فلوید مشهور است اما به اندازه این الگوریتم اعمال تعدی معروف نیست.
دلیل من برای انتخاب این الگوریتم برای بخش درسنامه الگوریتم ها، روزمره و ساده بودن الگوریتم فلوید بود که با توجه به بازدید های وبلاگ بنظر می رسد دانشجو های زیادی در طول ترم نیاز به مطالعه و استفاده از این الگوریتم دارند.

ادامه مطلب

مقدمه مترجم

مطالب زیر از نسخه اصلی کتاب Refactoring: Improving the Design of Existing Code  نوشته Martin Fowler دستچین شده و با ترجمه همراه با تالیف برای درک بهتر مطلب آمده است. Code Refactoring به شما یک سری عادت مفید در برنامه نویسی می آموزد که بسیار میتواند باعث کیفیت بخشیدن به نرم افزارتان شود. مطالب در این رابطه به مرور روی وبلاگ قرار می گیرند و به امید خدا این مطالب را در ویکی پدیا فارسی هم در بخش Code Refactoring اضافه خواهم کرد.

Refactoring یا بازآرایی چیست؟

بازآرایی فرایند تغییر یک سیستم نرم افزاری به گونه ای است که رفتار خارجی تغییر نکند و ساختار داخلی بهبود یابد. این یک روش منظم برای پاکسازی کد به گونه ای هست که شانس رخدادن خطا کاهش یابد. درواقع بازآرایی کردن معادل بهبود طراحی کد بعد از نوشته شدن می باشد.
"بهبود طراحی پس از نوشته شدن کد" عبارت عجیبی است زیرا با درک حال حاضر ما از توسعه نرم افزار ما بر این باور داریم که اول طراحی میکنیم و بعد برنامه نویسی را انجام میدهیم. یک طراحی خوب داریم و بعد از آن سراغ برنامه نویسی می رویم. پس از گذشت زمان کد و درستی سیستم تغییر پیدا میکند و ساختار طراحی بمرور محو میشود. کد به آرامی از فرآیندی مهندسی به فرآینی شبیه خنثی سازی بمب شبیه میشود.

ادامه مطلب

مقدمه مترجم

الگوریتم Maximoum Flow Minimoum Cut یکی از الگوریتم های کاربردی است که معمولا در چالش های متوسط و سطح بالا برنامه نویسی ظاهر میشود از کاربرد های این الگوریتم میتوان به برنامه ریزی خطوط هوایی برای عدم تداخل اشاره کرد و همچنین مسائلی که میتوان با چند مدل سازی از ورودی مسئله را با یک مسئله بیشینه جریان تبدیل کرد در سوالات  مسابقات داخلی از جمله مسابقات منطقه ای غرب‌ آسیا (‌صنعتی شریف)‌ و مسابقه داخلی دانشگاه امیرکبیر دیده شده است. این مقاله از بخش الگوریتم های TopCoder ترجمه شده  و اولین مقاله غیر تالیفی منتشر شده در این وبلاگ محسوب میشود. قسمت پیشرفته تر این الگوریتم نیز در اسرع وقت ترجمه شده و منتشر میشود.  لینک مقاله انگلیسی


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


مسئله استاندارد بیشینه جریان Maximum Flow Problem
وقتی به یک مسئله بیشینه جریان بر میخوریم ساده ترین حالت صورت مسئله میتواند به این شکل باشد: " با داشتن لیستی از لوله ها با شدت جریان متفاوت که از انتها به هم وصل شده اند. مقدار بیشینه ای از آب که میتوان از یک نقطه شروع به یک نقطه پایان منتقل کرد چقدر است؟" یا به صورت "شرکتی دارای خط تولیدی در شهر X میباشد که نیاز است محصولاتش به شهر Y منتقل شود. به شما راه های یک طرفه ای داده شده است که هر یک دو شهر از کشور را با یک بیشینه تعداد کامیون عبوری به هم متصل میکند. بیشترین تعداد کامیونی که شرکت میتواند از آنها برای انتقال محصولات استفاده کند چقدر است؟"

ادامه مطلب