نوشته هایی که درمورد ’ برنامه نویسی ’ هستند

Writing C Functions in MATLAB: MEX-Files

این پست در مورد استفاده از کد C  در یک برنامه ی Matlab است. اینکه چرا چنین چیزی در ابن وبلاگ سروکله اش پیدا می شود اما حداقل سه دلیل دارد:

۱- برداشت من این است که تعداد کسانی که به این وبلاگ سر می زنند و گوشه ای از زندگی شان با Matlab سروکار دارد کم نیست.

۲- زیاد دیده ام که برنامه نویسان Matlab کار از امکان MEX نویسی استفاده نمی کنند. این بند تا چند هفته ی پیش شامل من ِ نویسنده ی این پست هم می شد.

۳- Matlab محیطی است که آدم را به بد کد نوشتن ترغیب می کند. MEX یکی از امکاناتی است که به بهتر شدن کدهای Matlab کمک می کند.

فرض کنید به دلیلی می خواهید این تابع را روی دو ماتریس اعمال کنید،

mex_formula_s.jpg

در کد ضمیمه mex_test.m این عملیات به دو صورت توسط Matlab انجام شده است: روش بد (که از حلقه ی for استفاده می کند) و روش خوب (که از عملیات ماتریسی استفاده می کند). در همین کد تابع fancy_fun هم صدا می شود. این تابع در فایل ضمیمه fancy_func.c تعریف شده است که یک MEX-file است.

در ساده ترین کاربرد، یک تابع MEX تعدادی ماتریس بعنوان ورودی می گیرد و تعدادی ماتریس بعنوان خروجی  بیرون می دهد. با دستکاری fancy_func.c می شود خانواده ی بزرگی از MEX-file ها را پوشش داد.

فایلها را از پایین همین پست دانلود کنید و برای کاربردی که می خواهید تغییرشان بدهید. اگر قضیه راه نیافتاد ایمیل بزنید حرف می زنیم.

منبع

تصویرتان را سبز کنید – نسخه ی یک

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

green_php.png

اگر دوست دارید این کد را روی سرورتان کپی کنید از اینجا دانلودش کنید (۲۸ کیلوبایت).

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

بازی با سال نو، داستان چه بود

این پست فقط اشاره ی کوچکی است به دو پست قبلی:

هدف این دو پست این بود که با حداکثر یکبار استفاده از ارقام سال (اینجا ۲۰۰۹) و استفاده از هر تعداد از عملگرهای +-*/^ و البته پرانتز، اعداد ۰ تا ۱۰۰ را بسازیم. در دو پست قبلی در مورد دو روش نگاه کردن به این مساله حرف زدیم (روش ِ جایگشت ِ کور و روش درختهای تصادفی ِ بازگشتی).

2009_2.png

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

حالا سوال این است (اگر اهل ریاضی بازی هستید مساله های بدی نیستند):

۱- با توجه به وجود دو صفر، شاید تعداد کل اعداد ِ قابل ساخت به این روش خیلی زیاد نباشند. آزمایش ها می گوید شاید این عدد کمتر از ۵۰ باشد. می توانید این را اثبات کنید؟

۲- کدی بنویسید که این اعداد را بسازد.

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

از دیگران:

بازی با سال نو -۲

در پست قبلی گفتیم که هدف ساختن اعداد ۰ تا ۲۰۰۹ به کمک ارقام عدد ۲۰۰۹ است (ببینید: بازی با سال نو). کدقبلی، که با Matlab نوشته شده بود، صرفا جایگشت های ۲۰۰۹+-*/^ را آزمایش می کرد و در ۷۸۶۸۷۸ آزمون ۱۰۰۰۰۰ ترکیب درست و ۴۰ عدد متفاوت تولید کرد (بازده ۱۳%).

حالا یک کد C++ ِ کمی سرحال تر نوشته ام که چنین ساختارهایی را بصورت تصادفی و بازگشتی می سازد:

yearly_s.png

در ۷۸۶۸۷۸  آزمایش، این کد ۳۵۱۰۷۸ ترکیب درست ساخت که منتهی به ۳۷ عدد متفاوت شدند (بازده ۴۵%، حدود ۳٫۵ برابر حالت قبل).

try_2.png

پیشنهادی؟ ایده ای؟ هنوز تا ساختن همه ی اعداد ۰ تا ۲۰۰۹ خیلی فاصله داریم.

بازی با سال نو

سالها پیش مجله ی دانستنیها* در آخرین شماره ی یک سال*، مثلا فرض کنید ۱۳۶۸، اعداد یک تا ۱۳۶۸* را با ترکیب ۱ و ۳ و ۶ و ۸ ساخته بود. حالا در شروع سال ۲۰۰۹ می توانیم این کار را بکنیم، البته به کمک برنامه نویسی.

یک کد Matlab نوشتم که نوشتنش از اجرا کردنش خیلی کمتر طول کشید. این کد، بطرز شرم آوری، صرفا جایگشت های ۲۰۰۹+-*/^ را به طول های مختلف آزمایش می کند و نتایج را ذخیره می کند. بعد از چند دقیقه کار و آزمایش ۷۸۶۸۷۸ ترکیب، ۱۰۰۰۰۰ ترکیب صحیح پیدا شد که البته فقط منتهی به این ۴۰ عدد می شوند.

try_1.png

کد را از اینجا بگیرید. بوضوح باید روی ساختن درختهای تصادفی کار کرد و از این دست. کسی حوصله دارد این کد را بنویسد؟ یا دیده است این کد را جایی؟

*مطمئن نیستم

آیا شما هم از دزدی لذت می برید؟ – یک کد php

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

مدتی بود بدنبال یک راه حل بودم. اسمش را گذاشتم “دزدی“. از اینجا بگیریدش.

دزدی یک فایل php است که دیدن محتویات ِ یک دایرکتوری را منوط به واردکردن اسم رمزی می کند که شما به بازدیدکنندگانتان می دهید. گمان می کنم این “کلک مرغابی” بتواند ما را از گناه کبیره ی “نقض کپی رایت” نجات بدهد، حداقل به این دلیل که ظاهر داستان فارسی است و فرض می کنیم اینکه فایلها مستقیما در ملاعام قرار ندارند می تواند که راه نجاتی باشد.

برای نصب، فایلهای index.php و style.css را به همراه فولدر i در دایرکتوری کپی کنید و در این قسمت پسورد را بنویسد و همینطور تنظیمات دیگر را انجام بدهید:

حالا چیزی دارید نظیر دایرکتوری موسیقی جات کمانگیرانه. اسم رمز این دایرکتوری mandozdam است. البته دور از جون!

هرنوع استفاده از این کد به هر طریقی بشدت آزاد است. اگر نسخه ی جدیدتری ساختید خبر بدهید.

از زمانی که داستانهای مقایسه ی خوراک ها راه افتاد (ببینید:بازی با خوراک ِ مردم: امکان جدیدی در خوراک شمار) و با توجه به ابزارهایی که داشتیم (ببینید:چرا گوگل همیشه بهترین نیست: سلام بر اپن سورس و اسباب بازیهای سالم ِ تحت ِ وب – یک) و با توجه به اینکه وبلاگ نویس جماعت دوست دارد ببینید خوراکش چطور رشد می کند (عجب جمله ی درازی!) بدیهی بود که باید ابزاری داشته باشیم که رشد خوراک ِ یک وبلاگ را نشان بدهد.

حالا داریمش. اسمش هم هست “خوراک در خوراک” یا Feed of Feed یا Feed 2.0.

به این صفحه بروید. خوراک ِ برنری تان را در (۱) وارد کنید، روی (۲) بزنید، حالا روی (۳) بزنید و این خوراک را در گوگل ریدرتان اضافه کنید. می توانید تعداد مشترکین (۴) را انتخاب کنید یا تعداد هیت (۵) را، و البته یا هر دو را (که دو خوراک بگیرید برای سنجش هر دو پارامتر).

حالا، روزی یکبار در گوگل ریدرتان چنین منحنیی می بینید که رشد خوراک شما در هفت روز گذشته را نشان می دهد.

چه می کند php! 🙂

خوابنما گردیدگی ِ فیلترمندانه: فیلتر نداریم – یک ایده!

وسط خواب و بیداری، همین یک ساعت پیش، جزییات یک داستانی رو طرح ریختم به نام “فیلتر نداریم”. ایده، بزرگتر کردن ِ همین چیزی ه که در arash.kamangir.net راه افتاده و محمود هم با تغییراتی استفاده اش کرده.

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

باید بشینم کد بنویسم. حرف می زنیم! فکر می کنم بد چیزی از آب درنیاد.

کمی هم جدی حرف بزنیم

کدنویسی برای کاربردهای پردازش تصویری از آن دسته کارهایی است که می خواهیم خیلی زود به نقطه ی ابزار شدن برسد. این یعنی در بسیاری از کاربردها احتیاج داریم چهارچوبی داشته باشیم که دغدغه ی ارتباط با فرمت های تصویری و نمایش ِ اطلاعات را بسرعت رفع کند و به ما دسترسی به “اصل ِ داستان” (یک آرایه دوبعدی/سه بعدی از اعداد) را بدهد.

اگر MATLAB کار باشید می دانید که این همه یعنی imread و imwrite و imshow و کمی هنر تبدیل بعد و نوع ماتریس ها، که MATLAB اساسا برای آن ساخته شده است. اما MATLAB دو مشکل دارد. یک، حتی با وجود امکان تعریف کلاس، کد بی شکلی ارایه می دهد (بقول استادی که به همین دلیل A+ ام را A کرد، کد MATLAB “شبه کد” است). دو، MATLAB به این راحتی ها به شما فایل اجرایی نمی دهد و سرآخر می مانید با یک اسکریپت. مشکل دوم را می شود با Octave تا حدی حل کرد (ببینید: و اینک Octave – جایگزین کدبازی برای MATLAB) اما سرآخر کد ِ “کثیف”ِ MATLAB می ماند روی دست شما.

دیروز نشستم که بعد از مدتها بستری مناسبی در Delphi برای نوشتن کدهای پرداش تصویری پیدا کنم. جستجویم منجر به یافتن ابزارهایی شد که در نسخه ی مجانی Turbo Delphi ِ من (ببینید:خبر خوب برای برنامه نویسان دلفی کار) کار نمی کردند. گذشته از آن، نمی خواستم درگیر یک جعبه ابراز حجیم شوم. می خواستم یک کد ِ سبک پیدا کنم. و این را پیدا کردم، بر مبنای ایده ی خوبی نوشته شده اما کثیف و درهم برهم. پس نشستم به زدن حواشی اش و بازنویسی اش در قالب یک کلاس. حاصل شد MImage که اینجا با کد کاملش می توانید بگیریدش.

راستی، حضرت علیه Lena را به جا آوردید؟ (آیکن ِ این پست). در مورد این بانوی رشته ی پردازش تصویر، که زمانی در Playboy کار می کرد، بیشتر حرف می زنیم.

مرتبط: به خانه برمی گردم

بازی با خوراک ِ مردم: امکان جدیدی در خوراک شمار

درمورد گزارش ِ جدید خوراک شمار حرف زدیم (ببینید:دود ِ کنده ی وبلاگستان – گزارش جدید خوراک شمار). API  ِ فیدبرنر هم هم دم دست ه و ابزار ِ کد باز ِ کشیدن انواع نمودار هم (ببینید:چرا گوگل همیشه بهترین نیست: سلام بر اپن سورس– با تشکر از سید یوسف منیری عزیز). اینها رو بگذارید کنار هم، می شه امکان مقایسه رشد خوراک ها.

بازه ی بررسی روی یک ماه ثابت ه حالا، برای اینکه ساده تر بود اینطور. تعداد خوراک ها هم حداکثر ۵ تاست، که سرور شاکی نشه. حرفش رو هم گوش نکنید، با آدرس ِ کامل خوراک هم کار می کنه. روی Normalized by Mean اگر بگذارید میانگین ِ اعداد ِ ناصفر رو می گیره و همه رو بر اون تقسیم می کنه. ببینید چی درمیاد ازش.

ایده ای دارید بفرمایید ببینیم سوادمون می رسه اجراش کنیم یا نه. انصافا فقط یک چاکریم ته این پست کم داره. پس، چاکریم!