Monday, December 22, 2008

We need a Better Matlab!

I have used Matlab in some of my projects (mostly in university and just when I had to do that). I really don’t enjoy it. I think the worst problem with Matlab is the language itself. Poor design of the language, from function definition and typing mechanism to OO support and lack of namespaces, makes it an unpleasant choice for a computer scientist(it may seem very nice from a non-computer-scientist view). Of course it has some nice features including an exhaustive scientific library and efficient support for matrix and vector operations. Unfortunately, the Matlab library is completely based on the awful programming language. Because of the poor language constructs, matrices are overused in library design. Despite the mentioned weaknesses, Matlab is vastly used in scientific world, that’s because you cannot find any other single alternative in scientific programming.

I have found some ongoing works to make a Matlab replacement, Scilab and Octave are more or less a clone of Matlab (which means they are not a better Matlab), SciPy is a scientific python library (and just a library) which seems pretty good to me.

Based on my experience, a scientific environment at least must have the following components to be called a better Matlab:

1) A better programming language, by better I mean powerful but simple. As the language is used by non-computer scientists, simplicity is a must for the scientific programming language.

2) An excellent library, of course an excellent language is almost useless without a proper library.

3) Efficient support for matrix and vector operations. Maybe hardware accelerated operations or support for parallel processing (e.g. support for SMPs or use the power of GPU SIMD instructions) may be helpful.

4) A simple and useful distributed processing platform. As scientific programs are usually CPU intensive, a built-in Cluster Computing platform will greatly help scientists.

5) A better Development Environment

For the programming language, we must choose to use a compiled or scripting language, of course scripting languages are simpler to learn, understand and use and more appropriate for scientific experience and simulations. Moreover we have the following options:

1) Design a programming language from scratch for scientific purposes, it has the benefit that it could completely fit to the scientific computing requirements, but it has a huge cost and is very risky.

2) Use an existing language, there are many programming languages around. We can easily choose one of them; among several programming languages which I have studied, I prefer python and ruby. Although python has a more matured library, ruby design is more consistent. I will discuss later how ruby would be fitted to the needs.

3) Choose an existing platform with multiple programming languages, e.g. .Net or Java with a mixture of compiled-scripting languages; I don’t like this option for many reasons including its complexity.

So, why ruby is a good choice for our goal? There are many reasons to be considered.

1) Ruby is not designed for scientific computation but its flexible nature made it fully DSL-able. There are already some proofed examples of success of ruby in specific domains; Ruby on Rails is an excellent example. As an example of adaptation, consider the scalar expansion capability. Ruby does not support scalar expansion (e.g. 2 * [1, 2, 3, 4]), but this feature could be easily added to the language so as to become native to the language! Here is some lines of code which do that:

class Fixnum

alias_method(:old_mult, :*)

def *(a)

if(a.is_a?(Array))

a.collect { |i| self * i }

else

self.old_mult(a)

end

end

end

This is the job that needs AOP in many other languages to be done, even in many languages like java it can’t be done at all.

2) Ruby is simple, it could easily be learned by non computer scientist and students, and it has very simple OO semantics. Moreover, it is strongly and dynamically typed, its dynamic typing semantic made it simple to use and its strong typing nature prevents many programming errors.

3) Ruby has a wonderful implementation called JRuby which runs over JVM. This is an excellent option because you can easily use all of available java libraries out of the box. Using some simple wrappers, many scientific java libraries could be ported to ruby. Also some parts of new libraries may be implemented in java for efficiency. Additionally, both NetBeans and eclipse (through RadRails plug-in) support ruby. As the IDEs are extendable they could easily be modified to make a better Matlab development environment.

As many other java fans I love ruby because it is very consistence and clean (just like java). It might be some other good choices.

Wednesday, October 22, 2008

دکتر جان، تو خودت نشاط ملی هستی، طرح برای چی؟!

دکتر کردان، دیروز در حاشیه آمد و شد معاون بعدی و قبلی خودشان فرموده اند: "پيش‌نويس اوليه طرح نشاط ملي آماده شده است كه به شوراي اجتماعي كشور ارسال شده و مراحل تصويب خود را مي‌گذراند". خواستم در اینجا از ایشان به خاطر اینکه اینقدر به فکر نشاط این ملت هستند تشکر کنم و بگویم، طرح برای چی؟! خود شما به اندازه کافی در این ملت نشاط ایجاد کرده اید. راستش را بخواهید در این چند سال عمرم هیچ کس را ندیده ام که به اندازه جنابعالی در کاریکاتورها و مطالب طنز کشور مطرح شده باشد و اینچنین باعث انبساط خاطر مردم این کشور شود.

* حاشیه: کاش یک نفر آدم بیکار پیدا میشد و آرشیوی از مطالبی که در مورد دکتر (!؟) کردان مطرح شده جمع آوری می کرد. فکر می کنم از نظر تاریخی ایشان اتفاق منحصر به فردی در کشور ما بودند (هستند؟!).

Friday, August 29, 2008

اضافات فایرفاکس

کم کم دارم به این نتیجه می رسم که برای هر کاری یک add-on توی فایرفاکس می شود پیدا کرد. حتی برای رفع اتهام نامردی و حل مشکل قیافه! چند روز پیش هادی گیر داده بود که چرا قیافه این فایرفاکس تو با فایرفاکس من فرق می کند. گفتم به خاطر add-on هایی هست که نصب است. بعد گیر داد که لیست add-on هایی را که نصب داری به من بگو. راستش را بخواهید چون من اصلا حال و حوصله تایپ کردن بیست سی تا اسم را نداشتم، یک جورهایی مسئله را پیچاندم (در اصل پیچوندم). و او هم طبق معمول گفت "خیلی نامردی". ولی امروز به صورت اتفاقی یک add-on ی پیدا کردم که هم مشکل نامردی من را حل کرد، هم مشکل قیافه هادی را. این add-on ی که پیدا کردم می تواند یک لیست از تمام add-on هایی که روی فایرفاکس شما نصب هست درست کند. این لیست را هم با آن درست کردم:

Application: Firefox 3.0.1 (2008070208)

Total number of items: 29

  • /Find Bar/ 1.0.1
    Firefox 2.0b1 - 3.1a2pre
    A souped up findbar with regular expression capabilities
  • Adblock Plus 0.7.5.5
    Firefox 1.5 - 3.1a2pre
    Ads were yesterday!
  • Aging Tabs 0.7.1
    Firefox 3.0 - 3.1a2pre
    Makes unused tabs fade with age and highlights the selected tab.
  • BugMeNot 2.0
    Firefox 2.0 - 3.0.*
    Bypass compulsory web registration with the context menu via www.bugmenot.com.
  • CacheViewer 0.4.7.1
    Firefox 2.0 - 3.0.*
    Allows searching and sorting cache files
  • Clipmarks 3.5.0
    Firefox 1.5 - 3.0.*
    Clip and save just the stuff you want from any web page.
  • Copy Link Text 1.3
    Firefox 1.5 - 3.0.*
    Right-click a link to copy its text
  • CustomizeGoogle 0.75
    Firefox 1.0 - 3.1a2pre
    Enhance Google search results and remove ads and spam.
  • DownThemAll! 1.0.3
    Firefox 2.0.0.8 - 3.0.*
    The mass downloader for Firefox.
  • ErrorZilla Mod 0.34
    Firefox 2.0 - 3.0.*
    Implements a useful error page when a website cannot be reached.
  • Extended Statusbar 1.5.1
    Firefox 1.5 - 3.0.*
    A Statusbar with speed, percentage, time and loaded size (similar to Opera's one)
  • Extension List Dumper 1.14.1
    Firefox 1.5 - 3.0.*
    Dumps a list of the installed extensions.
  • FireFTP 1.0.2
    Firefox 3.0 - 3.0.*
    FTP Client for Mozilla Firefox.
  • Fission 1.0
    Firefox 2.0 - 3.0.*
    Progress bar in the address bar (Safari style).
  • Flagfox 3.2.8
    Firefox 1.5 - 3.0.*
    Displays a flag depicting the location of the current server
  • GoogleEnhancer 1.63
    Firefox 1.5 - 3.0.*
    Adds numbers, highlighting and favicons to Google searches
  • Grab and Drag 2.7.4
    Firefox 2.0 - 3.0.*
    Enables Adobe Acrobat-style grab and drag scrolling in Mozilla applications.
  • Link Alert 0.8.2.1
    Firefox 1.5 - 3.0.*
    Changes the cursor to indicate the target of a link.
  • New Tab Button on Tab Right 0.5.3
    Firefox 3.0 - 3.0.*
    Adds a new tab button like IE7.
  • OPIE 1.2.1
    Firefox 2.0 - 3.0.*
    Import/Export extension preferences
  • PicLens 1.8.0.4280
    Firefox 2.0 - 3.0.*
    Discover More
  • Quick Preference Button 0.1.8.1
    Firefox 1.5 - 3.0.*
    Adds menu button for quickly accessing common preferences.
  • QuickProxy 2008.08.24
    Firefox 1.0 - 3.0.*
    Quickproxy creates a statusbar button to quickly turn the proxy on and off.
  • Save Link in Folder 1.4.2
    Firefox 1.0 - 3.0.*
    Easily save links in personally customized folders.
  • ScrapBook 1.3.3.7
    Firefox 2.0 - 3.0.*
    Helps you to save Web pages and organize the collection.
  • Tab Scope 0.2.2.8
    Firefox 1.5 - 3.0.*
    Preview and navigate tab contents through popup.
  • Taboo 0.5.5
    Firefox 2.0b1 - 3.0.*
    The cure for tabitis
  • Yahoo! Mail Notifier 1.0.0.12
    Firefox 0.9 - 3.1a2pre
    This extension notifies you when new messages arrive in your Yahoo mailbox.
  • YouPlayer 0.9.8
    Firefox 2.0 - 3.0.*
    Advanced video-site player and download tool

اگر با فایرفاکس کار می کنید، توصیه می کنم حتما این add-on ها را امتحان کنید ولی اگر با فایرفاکس کار نمی کنید، توصیه می کنم با فایرفاکس کار کنید و این add-on ها را هم امتحان کنید. از بین اینها من خودم به Grab and Drag علاقه خاصی دارم.

Friday, August 22, 2008

فونت

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

اول: فونت های پیش فرض معمولا خیلی بد قیافه هستند، مخصوصا وقتی برای زبان فارسی به کار می رود. برای همین توصیه می کنم همین جوری یک نرم افزار را باز نکنید و شروع کنید به تایپ کردن. توی خیلی از نرم افزارها فونت پیش فرض Times New Roman هست که وقتی فارسی بنویسید خیلی زشت به نظر می رسد.

دوم: فونت های Arial و Times New Roman فونت های رسمی لاتین به حساب می آیند. به نظر من Arial خیلی قشنگ تر از Times New Roman هست. سعی کنید توی متون ساده انگلیسی از Arial استفاده کنید.

سوم: متون رسمی فارسی غالبا با فونت لوتوس یا نازنین نوشته می شوند. اگر در وسط متن فارسی شما کلمات لاتین استفاده شده، از Arial برای آن کلمات استفاده کنید. این نکته را هم فراموش نکنید که اندازه فونت لاتین در این موارد معمولا 3 یا 4 شماره کوچکتر هست. مثلا اگر فارسی را با اندازه 14 نوشته اید باید لاتین را با شماره 10 یا 11 بنویسید (این را سر کلاس شیوه ارائه دکتر ملکیان یاد گرفتم).

چهارم: حواستان به این مسئله باشد که خیلی از فونت ها روی همه سیستم ها وجود ندارد. برای همین ممکن است یک فایل ورد یک جایی خیلی قشنگ به نظر برسد و یک جای دیگر خیلی بد قیافه. توی پی دی اف این امکان وجود دارد که فونت های به کار رفته توی یک فایل را داخل همان فایل بچپانید (یا به قول خارجی ها embed کنید). ولی فکر می کنم توی ورد و پاور پوینت این امکان وجود ندارد (بخوانید بلد نیستم).

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

ششم: "زشت ترین موجود دنیا تاهومای بولد هست!"، این جمله آقا مصطفی هیچ وقت از یادم نمی رود (این آقا مصطفی را اگر نمی شناسید، من توصیه می کنم بروید بشناسید). این را هم به یاد داشته باشید که Tahoma کوچکش قشنگ هست. وقتی اندازه اش از 10-11 بزرگتر بشود خیلی خوب به نظر نمی رسد.

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

هشتم: نستعلیق خطی هست که بیش از هفتصد سال قدمت دارد. تعداد آدم هایی که تمام عمرشان را بر روی این خط گذاشته اند شاید کمتر از تعداد آدم هایی که تمام عمرشان را بر روی شعر و شاعری گذاشته اند نباشد. قواعد این خط خیلی پیچیده تر از آن است که بشود با استفاده از یک فونت خشک و خالی یا یک برنامه کامپیوتری نستعلیق نوشت (این ها را از برنامه "دو قدم مانده به صبح" محمد صالح علا یاد گرفتم).

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

لینک های مرتبط

پارس فونت

فارسی وب

فونت فارسی آزاد

دانلود فونت نستعلیق

دافونت

Sunday, August 17, 2008

پلت فرم های توسعه وب

تا به حال چندین نفر از من در مورد تکنولوژی های توسعه وب (Web Development Technologies) سوال کرده اند. بیشتر هم توقع داشته اند که به آن ها بگویم مثلا J2EE بهتر از PHP هست، بروید آن را یاد بگیرید. می دانید که تکنولوژی های زیادی برای این کار وجود دارد. اسم PHP، J2EE یا همان JavaEE و .NET را همه شنیده اند. به هر حال بخث خیلی مفصل هست. اینجا و اینجا را ببینید.

راستش را بخواهید دو سه سالی هست که به طور جدی روی توسعه برنامه های وبی کاری انجام نداده ام. ولی به عنوان کسی که سه چهار سالی با J2EE کار می کرده و با PHP، .NET و برخی تکنولوژی های دیگر آشنایی مختصری دارد، گفتم شاید چیزی بنویسم که به درد کسی بخورد. ولی به هر حال مطالب این پست را به قول خارجی ها as is در نظر بگیرید.

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

این را هم بگویم که بحث خیلی مفصل هست. در مورد هر کدام از تکنولوژی ها و راه کار آن ها برای حل مسئله می شود به اندازه چند کتاب صحبت کرد. ولی نه من آن قدر بلد هستم و نه اینجا جای نوشتن کتاب هست. فاکتور های خیلی زیادی در تصمیم گیری برای انتخاب تکنولوژی دخالت دارند. اینکه زمان یادگیری آن چقدر هست. اینکه هزینه و زمان توسعه آن چقدر هست و بعدا چقدر هزینه برای نگه داری صرف می شود. اینها همه بستگی به نوع پروژه دارد. مثلا توی یک پروژه ای که زیاد با پایگاه داده کار می کند ممکن است تکنولوژی A بهتر از B باشد. به علاوه خیلی وقت ها عوامل غیر فنی شما را مجبور می کند تصمیم خود را تغییر دهید. مثلا مشتری دلش می خواهد شما پروژه را با .NET انجام بدهید که کلاس بالاتری داشته باشد! شما هم هیچ طوری نمی توانید به او بفهمانید که در مورد این مسئله شما باید تصمیم بگیرید. ولی عموما این طور نیست که این پروژه را با این تکنولوژی انجام دهید و آن یکی را با آن. منطقی است که توی هر شرکت یا تیم، پروژه ها را با تکنولوژی ای که بر آن تسلط دارند توسعه بدهند.

توی دنیای دات نت معمولا کار اینطور شروع می شود. شما یک کتاب ASP.NET می خرید و یک سی دی ویژوال استدیو دو هزار و چند از رفیقتان قرض می گیرید یا یکی از این چیچی اکسپرس ها را از سایت مایکروسافت دانلود می کنید. بعد از اینکه سی دی را نصب کردید از صفحه اول کتاب شروع می کنید و توی فصل اول کتاب هم نوشته که چطور بروید توی منوی فایل و یک پروژه جدید بسازید. در ادامه کتاب هم نوشته چطور از کجا کدام چیز را روی صفحه drag کنید و بعد از جدول Properties کدام ویژگی را تغییر بدهید و اف چند را با کدام انگشتتان بزنید که پروژه اجرا شود. این خیلی خوب هست؛ از این جهت که شما بعد از خواندن یک کتاب چیزهای خوبی یاد می گیرید و می توانید پروژه های نسبتا خوبی را انجام دهید.

دنیای PHP شاید در شروع کار از این هم ساده تر باشد. اگر شما از HTML، JavaScript و CSS سر در بیاورید و قبلا با یک زبان برنامه نویسی هم کار کرده باشید، خیلی ساده و در عرض چند روز می توانید کار کردن با PHP را شروع کنید و در زمان کوتاهی تا حد قابل قبولی بر آن مسلط شوید. البته بلد بودن HTML، JavaScript و CSS که مهارت های پایه ای توی وب به حساب می آید، یادگیری هر تکنولوژی وبی را آسان تر می کند ولی نیاز به دانستن آن ها وقتی PHP کار می کنید بیشتر حس می شود.

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

این را هم بگویم که دنیای PHP و دات نت خیلی با هم تفاوت دارد. تفاوت اول یک جورهایی سیاسی یا فرهنگی است. دات نت یک تکنولوژی در انحصار (proprietary) مایکروسافت هست ولی پی اچ پی تفکرات و فرهنگ اپن سورس را با خودش دارد. استفاده از دات نت یعنی این که شما باید از ویژوال استدیو و ویندوز استفاده کنید (من تا به حال شرکتی را ندیده ام که از mono تحت سیتم عاملی غیر از ویندوز به جای اس دی کی مایکروسافت استفاده کند، دوستان دات نتی نظر بدهند). پی اچ پی یک جور هایی با My SQL و Apache و تا حد زیادی با Linux گره خورده. این مسئله موقعی اهمیت پیدا می کند که می بینیم این فرهنگ توی پروژه ها و کتابخانه های موجود برای این پلت فرم ها هم نفوذ کرده. تعداد پروژه های اپن سورسی که با PHP انجام شده خیلی بیشتر از پروژه های اپن سورسی است که با دات نت انجام شده و تقریبا برای هر کاری که تصور بکنید یک کتابخانه اپن سورس که با PHP نوشته شده باشد پیدا می کنید.

تفاوت دوم یک تفاوت فنی هست. پی اچ پی زبانی هست اسکریپتی که اصولا برای کار وب طراحی شده. در حالی که توی پلت فرم دات نت معمولا از C# و یا VB.NET که زبان هایی همه منظوره و کامپایلری (Compiled) هستند، برای نوشتن کدها استفاده می شود. من شخصا اینجا PHP را بیشتر می پسندم و فکر می کنم برای کار وب یک زبان اسکریپتی خیلی بهتر از یک زبان کامپایلری و Statically Typed مثل سی شارپ یا جاوا هست. در این رابطه اگر فرصت شد بعدا بیشتر توضیح می دهم.

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

Friday, August 01, 2008

آدم ها موجودات جالبی هستند. بعضی هایشان عجیب. بعضی هایشان فوق العاده. اصلا نمی توانم تصور کنم رندی پاوشی(Randy Pausch) که محرم سه چهار ماه پیش به من معرفی کرد، حالا مرده باشد. فیلم Last Lecture او توی دانشگاه Carnegie Malone خیلی مرا تحت تاثیر قرار داد. آدمی که می داند چند ماه دیگر در این دنیا نیست، اینقدر امیدوار و خوشحال است. محرم توی وبلاگش صحبت حکیمانه ای کرده: "به هر حال باقیمانده زندگی همه ما محدود است چه چند روز باشد چه چندین دهه! مهم نحوه استفاده مطلوب از این فرصت محدود است.". توصیه می کنم فیلم Last Lecture رندی پاوش را حتما ببینید. می تواند تاثیر خوبی توی زندگی شما داشته باشد.

Sunday, May 18, 2008

فوتبال

دوست دارم با یک نگاه اجتماعی این پست را بخوانید، نه ورزشی!

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

Tuesday, April 29, 2008

نمای 320 درجه از آزمایشگاه پردازش موازی، جایی که هفته ای 50 ساعت از عمرم در آن می گذرد. با گوشی جدیدم عکس گرفتم :)







Saturday, February 23, 2008

Using Aspectj and Java Annotations to Try Again

We are working on a program that interacts with a hardware device using a com port for some months. After implementing many parts of software, we found that the communication channel is not as reliable as we expected, so we decided to add some "Try Again" functionality to our code. You have seen the "Try Again" dialog many times, but have you ever taught of how to implement one?

All you need is to invoke a method, if an exception occurs ask the user "Try Again?" and if the answer is "Yes" reinvoke the method. At first it seems so simple to me but after playing with some of OO design patterns I realized that many lines of code should be modified to implement the functionality in OO, so I decided to play a little AOP.

Here is the solution I found:

The first thing we need is to specify what methods must be tried again, Thanks to Java 5 annotations, this is very easy to tag some methods, so the first thing we need is a TryAgain Java annotation:

 
 

package com.blogspot.zoftware.aspects;

 
 

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

 
 

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface TryAgain {

int count() default 2;

boolean interactive() default true;

}

 
 

The count parameter specifies how many times the method should be reinvoked and the interactive parameter specifies if the user should be asked to try again or not. The second thing we need is an aspect which reinvokes the annotated methods, there are many AOP implementations in the java world but I like the annotation based aspectj the most, as it is very simple and supports standard java syntax, here is the code for the aspect:

 
 

package com.blogspot.zoftware.aspects;

 
 

import java.lang.reflect.Method;

 
 

import javax.swing.JOptionPane;

 
 

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.reflect.MethodSignature;

 
 

@Aspect

public class TryAgainAspect {

 
 

@Around("call(@TryAgain * *..*(..))")

public Object retry(ProceedingJoinPoint jp) throws Throwable{

Method method = ((MethodSignature)jp.getSignature()).getMethod();

TryAgain annotation = method.getAnnotation(TryAgain.class);

Throwable err = null;

 
 

for (int i = 0; i < annotation.count(); i++) {

try {

return jp.proceed();

} catch (Throwable e) {

err = e;

if(annotation.interactive() && !askRetry(e)) {

break;

}

}

}

 
 

throw err;

}

 
 

private boolean askRetry(Throwable e) {

String msg = "The following error occured:\n" + e + "\nRetry?";

return JOptionPane.showConfirmDialog(null, msg) == JOptionPane.YES_OPTION;

}

}


 

 
 

The retry advice, reinvokes every method which is tagged with @TryAgain annotation if an exception occurs (at most count times), so all you need to use this mechanism is to tag the methods that should be reinvoked on failures. Here is a sample usage:

 
 

package com.blogspot.zoftware.demo;

 
 

import com.blogspot.zoftware.aspects.TryAgain;

 
 

public class Foo {

 
 

@TryAgain(count = 3)

public void oftenFails() {

if(Math.random() < 0.6) {

throw new RuntimeException("Sorry, Failed!");

}

}

 
 

public static void main(String[] args) {

new Foo().oftenFails();

System.out.println("Passed");

}

}


 

 
 

The oftenFails method is the method that should be reinvoked, so I annotated it using @TryAgain. To run the code you need aspectj libraries (download here); you can use either dynamic (load time) or static weaving. To use load time weaving, place the following piece of XML into aop.xml under META-INF folder, then run the Foo class with -javaagent:aspectjweaver.jar command line argument.

 
 

<aspects>

<aspect name="com.blogspot.zoftware.aspects.TryAgainAspect" />

</aspects>


 

The mixture of Annotations and AspectJ is a powerful tool to solve many common software engineering problems.

Thursday, January 17, 2008

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

interface NaturalNum {

boolean isZero();

NaturalNum next();

NaturalNum prev();

NaturalNum add(NaturalNum n);

NaturalNum sub(NaturalNum n);

}

class Zero implements NaturalNum {

public static final Zero INSTANCE = new Zero();

private Zero() {}

public NaturalNum add(NaturalNum n) { return n; }

public boolean isZero() { return true; }

public NaturalNum next() { return new Successor(this); }

public NaturalNum prev() { throw new RuntimeException(); }

public NaturalNum sub(NaturalNum n) {

if(n.isZero()) return this;

else throw new RuntimeException();

}

public String toString() { return ""; }

}

class Successor implements NaturalNum {

private final NaturalNum p;

public Successor(NaturalNum n) { this.p = n; }

public NaturalNum add(NaturalNum n) { return this.prev().add(n.next()); }

public boolean isZero() { return false; }

public NaturalNum next() { return new Successor(this); }

public NaturalNum prev() { return p; }

public NaturalNum sub(NaturalNum n) {

return n.isZero() ? this : this.prev().sub(n.prev());

}

public String toString() { return prev() + "1"; }

}

public class NaturalNumberTest {

public static void main(String[] args) {

NaturalNum three = Zero.INSTANCE.next().next().next();

NaturalNum four = Zero.INSTANCE.next().next().next().next();

System.out.println(three);

System.out.println(four);

System.out.println(three.add(four));

System.out.println(four.sub(three));

}

}