2011/11/23

شیوه جذب نیرو

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




2011/11/22

سر سپردگی به مایکروسافت

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



عکسی از دفتر مایکروسافت در ردموند به عنوان background موبایل!




2011/11/21

برنامه‌نویسی تجاری

در بحث با یکی از دوستان که مدیر و گرداننده یک شرکت نرم‌افزاری است صحبت از تقابل احتمالی «برنامه‌نویسی زیبا و دقیق» و «برنامه‌نویسی تجاری و پول در آوردن» بود. ایشان معتقد بودند که ما هم برنامه‌نویسی زیبا و دقیق را دوست داریم چون در نهایت موجب افزایش کیفیت و کاهش هزینه‌های نگهداری می‌شود. اما گاهی اوقات در تنگنای زمانی یا هزینه‌ای قرار داریم و نمی‌توانیم از روش «زیبا نویسی» استفاده کنیم. بلکه مجبوریم با توجه به زمان کمی که در اختیار داریم یا با توجه به هزینه کمی که مشتری پرداخت می‌کند از روش‌های به درد نخورتری برای انجام کار استفاده کنیم. مثلاً به جای استفاده از ORM از ADO.NET استفاده کنیم یا به جای استفاده از یک switch case خوانا و منظم از چند if تو در تو استفاده کنیم.

من هم در نوشتن یک برنامه موبایلی با Java ME از این ایده استفاده کردم. من برنامه‌نویس جاوا نیستم و معلوم هم نیست که بخواهم از جاوا به طور جدی استفاده کنم یا نه. بنابراین اهمیت زیادی به منظم بودن کد ندادم. برنامه‌ای که در حال نوشتنش بودم نیاز به دیتابیس داشت اما چون فقط در حال تست اولیه یک platform جدید و بازار سنجی بودم، به جای آن که بروم و روال‌های دیتابیسی را در جاوا و Java ME یاد بگیرم، از یک روش ابتکاری خیلی ساده‌تر استفاده کردم. کد چندان تمیزی از آب در نیامد ولی اقلاً توانستم وقتم را اولویت بندی کرده و از آن استفاده بهینه‌تری نمایم. در همین راستا این کاریکاتور را ببینید.




2011/11/20

تکرار تاریخ

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

بازار نرم‌افزار حسابی بکر بود و هر کسی می‌توانست با یک نرم‌افزار ساده (اقلاً به مقیاس امروزی) کل بازار را قبضه کند. زمانی که هنوز نوجوان محسوب می‌شدم، یعنی ۱۵ سال بعد از تاریخ فوق‌الذکر، وقتی که سرگذشت آدم‌ها و شرکت‌هایی مثل آی.بی.ام، بیل گیتس و شرکت‌های گاراژی را از مجله‌هایی مثل «کامپیوتر» و «دنیای الکترونیک ؟» می‌خواندم حسابی هیجان‌زده می‌شدم و آرزو می‌کردم ای کاش من هم، هم عصر (و هم مکان) بیل گیتس، استیو جابز و دیگر پیش کسوتان می‌بودم و در آن انفجار تکنولوژیک شرکت می‌داشتم.

حدود ۱۰ سال پیش یک انفجار مشابه رخ داد: عصر دات کام. ظهور سایت‌ها و تجارت‌های اینترنتی فراوان، رشد شدید برنامه‌های تحت وب و ظهور و بلوغ شرکت‌هایی مثل گوگل و یاهو.

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




2011/11/19

‫اصطلاحات اولیه برنامه‌نویسی موبایل با Java ME

Java ME
Java Micro Edition ویرایش مخصوص جاوا برای استفاده در گوشی‌های موبایل و دیگر deviceهای مشابه است. بیش از دو میلیارد گوشی قابلیت اجرای برنامه‌های Java ME را دارند. J2ME نام قدیمی Java ME است.


Configuration/Profile/Optional API

Configuration مشخصات گوشی‌های مختلف است و مشخص می‌کند که قدرت یک گوشی در چه حدی است و چه کارهایی را می‌تواند انجام دهد. انواع Configuration شامل CLDC و CDC می‌شود.

Profile مشابه Configuration است و مشخص می‌کند که یک گوشی با یک Configuration خاص چه قدرت و امکاناتی دارد. معروف‌ترین Profile همان MIDP است.

در ادامه همین تقسیم بندی، یک Profile مشخص می‌تواند از یک سری APIهای خاص پشتیبانی بکند یا نکند. مثلاً ارسال MMS را پشتیبانی بکند یا نکند. به این تقسیم بندی Optional API‌ گفته می‌شود.


CLDC
Connected Limited Device Configuration
یک configuration خیلی ساده است که توسط اکثر گوشی‌های موبایل پشتیبانی می‌شود. به چیزی حدود 256 KB رم و رام نیاز دارد. امکانات جاوایی آن در حداقل قرار دارد.


CDC
Connected Device Configuration
یک مدل بالاتر از  CLDC است. میزان حافظه آن در محدوده مگابایت است نه کیلو بایت.


MIDP معروف‌ترین Profile است. اگر گفته شود که یک گوشی MIDP را پشتیبانی می‌کند یعنی این که امکانات سخت‌افزاری، قدرت CPU و میزان حافظه به مقدار خاصی است. این میزان برای MIDP 2.0 عبارت است از 256KB ROM، مقدار ۸ کیلو بایت فضای ذخیره‌سازی، 128 KB RAM، صفحه نمایش 96*54، صفحه کلید و شبکه دو طرفه.


MIDlet
اصطلاحاً به برنامه‌نویسی Java ME بر اساس MIDP گفته می‌شود. تقریباً منظور از برنامه‌نویسی موبایل با استفاده از Java ME یا J2ME همین برنامه‌نویسی به روش MIDlet است.


منبع: کتاب Beginning J2ME




2011/11/18

‫روش برنامه‌نویسی Forum Driven Development

تا حالا به فوروم‌های (انجمن‌های) برنامه‌نویسی ایرانی علی الخصوص «سایت برنامه‌نویس» مراجعه کرده‌اید؟ به سوالات آن هم دقت کرده‌اید؟ تا حالا دیده‌اید که مثلاً شخصی تا حالا یک بار هم Socket Programming کار نکرده و هیچ علاقه‌ای هم به کار کردن با آن ندارد اما چون در یک پروژه به آن نیاز دارد به دنبال یک راهنمایی فقط برای رفع نیاز فعلی‌اش بدون فهم یا استفاده درست از آن راهنمایی است؟ تازه بعد از مدتی اعلام می‌کند که کار پروژه‌اش را با آن تیکه کد یا اسمبلی راه انداخته است؟ تا حالا دقت کرده‌اید که تا یک نفر جواب یک سوال خیلی ساده را می‌دهد چقدر به او استاد استاد گفته می‌شود یا این که تا بحثی در باب بهتر بودن یک روش یا تکنولوژی باب می‌شود چقدر بحث‌های متعصبانه و گاه اشتباه در می‌گیرد؟

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



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




2011/11/17

‫اولین برنامه با Java ME

خوشحالم که به عنوان یک برنامه‌نویس دات‌نت اولین Hello World جاوایی‌ام (Java ME) را نوشتم. از Java ME برای برنامه‌نویسی با موبایل‌های سازگار با جاوا، یعنی اکثر گوشی‌های جهان، استفاده می‌شود. کدهای Java ME را می‌توان با کمک netBeans و Eclipse و pluginهای مربوطه نوشت یا این که از Java ME SDK استفاده کرد. نقطه شروع کار خیلی سخت نیست. کافی است از کلاس خاصی به اسم MIDlet ارث‌بری کرده و کار را شروع کرد. وقتی که کد نوشته شده به یک فایل jar کامپایل شد می‌توان آن را به گوشی موبایل منتقل کرده و اجرا نمود.

گفته می‌شود که برنامه‌های نوشته شده با Java ME و به طور کلی با جاوا کند هستند. حتی محیط برنامه‌نویسی جاوا هم کند است. اما اگر Cross Platform بودن بین گوشی‌ها و OSهای مختلف برایتان مهم است باید آن را تحمل کنید.




2011/11/16

‫انتخاب platform برنامه‌نویسی موبایل

بازار برنامه‌نویسی موبایل در آمریکا و اروپا به شدت داغ است. این بازار در ایران هم به شدت رو رشد است. کافی است نگاهی به آگهی‌های کارویس بیندازید + + + +. این روزها به هر برنامه‌نویسی واجب است که اطلاعاتی راجع به برنامه‌نویسی موبایل داشته و یکی از platformهای موجود را برای شروع انتخاب کند. پلتفورم‌های موجود عبارتند از آندروید (گوگل - جاوا)، iOS (اپل - Objective C)، ویندوز فون (مایکروسافت - دات‌نت)، بادا (سامسونگ - C++‎)، جاوا (cross-platform - جاوا) و چند سیستم عامل متفرقه دیگر.

دیروز در ارتباط با همین موضوع بحث داغی داشتیم با چند تا از دوستان. هدف این بود که با یک سری از پیش فرض‌ها یک platform مناسب برای برنامه‌نویسی موبایل انتخاب شود. پیش‌فرض‌های مورد نظر عبارتند از:

* ما برنامه‌نویس دات‌نت هستیم.
* ما چند برنامه‌نویس هستیم که عمری در کار توسعه برنامه‌های داده محور مثل برنامه‌های دیتابیسی بوده‌ایم و قاعدتاً مهارت‌ها و ایده‌هایمان هم در همین حول و حوش چرخ خواهند زد.
* ما ایرانی هستیم و محدودیت‌های زیادی در رابطه با موضوع تحریم داریم.
* هدف اولیه بازار داخل است ولی بازار خارج و storeهای مختلف applicationها به هیچ وجه منتفی نیستند.
* مهم است که برنامه‌های ما در بیشتر گوشی‌ها اجرا شود. باید سعی کنیم محدودیت platform و محدودیت سخت‌افزار را به نوعی دور بزنیم.

خلاصه‌ای از بحث:
iOS و Windows Phone محدودیت‌های زیادی برای ما ایرانی‌ها دارند. اما جاوا و اندروید کمتر. جواب قطعی به cross platform بودن جاوا است. اما مشکل کندی آن و عدم دسترسی مستقیم به سخت‌افزار گوشی هست. نرم‌افزارهای معتبر به ازای هر platform یک بار بازنویسی می‌شوند. مثلاً یک بار برای اندروید، یک بار برای iOS و یک بار برای Windows Phone. بادا کمترین ساپورت، کوچکترین جامعه developer و کمترین طرفدار را در ایران دارد اما گوشی‌های به نسبت ارزان قیمت‌تری دارد. گوشی‌های Windows Phone و iOS گوشی‌های گرانقیمتی هستند. گوشی‌های اندروید بیشترین آمار را در ایران دارد. البته تقریباً همه گوشی‌های موجود جاوا را پشتیبانی می‌کنند. قیمت گوشی‌های اندروید در حال حاضر (اواخر آبان ۱۳۹۰) از حدود ۲۰۰ هزار تومان شروع می‌شود. بازار کلی دنیا هم درباره انتخاب platform خیلی شک دارد. رقابت خیلی داغ است و ممکن است در چند سال آینده شاهد تغییرات زیادی باشیم.

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




2011/11/15

ترس از دست دادن اطلاعات

هر کسی در زندگی‌اش ترس‌هایی دارد. یکی از ترس‌هایی که گریبانگر ما شده است ترس از دست دادن اطلاعات است. اطلاعات hostingهای مختلف، applicationهای مختلف نصب شده در IISها، user name و passwordهای شخصی و کاربران، دیتابیس سایت‌های مختلف، مطالب و عکس‌های وبلاگ‌ها، حفظ مالکیت domainها، حفظ page rank به دست آمده از گوگل، از دست ندادن قدرت SEO، تنظیمات موبایل، تنظیمات مودم، divert تلفن‌های مختلف و ده‌ها چیز دیگر.

در کنار این ترس‌ها اضافه کنید مشکلات اعتیاد به کار، اعتیاد به اینترنت، اعتیاد به gmail و سرویس‌های اجتماعی، اعتیاد به ORM و…




خدا به ما رحم کند با این ترس‌ها و عادت‌ها.




2011/11/13

‫انتقال دیتابیس bugnet به MS SQL 2008

bugnet (نرم‌افزار issue tracking دات‌نتی) را در جایی نصب کرده بوده و دیتابیسش را در SQL Server 2005 Express قرار داده بودم. به دلایلی تصمیم گرفتم دیتابیس را به نسخه‌ای از MS SQL 2008 منتقل کنم. یک دیتابیس خام با استفاده از installer باگ‌نت درست کردم و سعی کردم دیتا را از SQL 2005 Express به آن export کنم اما به خطاهایی برخورد کردم و موفق نشدم. به همین دلایل از روال دیگری برای انتقال دیتا استفاده کردم:

۱- یک دیتابیس خالی ساختم و دیتای قبلی را با استفاده از امکان Export به آن کپی کردم.
۲- روال Export قدرت تشخیص viewها را نداشت. در صفحه انتخاب جداول باید تیک viewها برداشته شود.
۳- باگ‌نت را به دیتابیس جدید وصل کردم. اولین خطایی که دیده می‌شد خطای Could not find stored procedure 'BugNet_HostSetting_GetHostSettings'. بود.
۴- یک دیتابیس خام و خالی را با کمک installer باگ‌نت ساختم.
۵- با استفاده از گزینه Tasks - Generate Scripts دیتابیس مرحله قبلی را انتخاب کرده و گزینه‌های Stored Procedures و Views را انتخاب کنید.
۶- اسکریپت حاصله را در دیتابیس مرحله اول که همان دیتابیس اصلی است اجرا کردم. اصلاح use database نباید فراموش شود.
۷- یک بار خطای Item has already been added. Key in dictionary: 'AdminNotificationUsername' Key being added: 'AdminNotificationUsername' را دیدم. علت آن installer بود. که رکوردهای جدول HostSettings را duplicate کرده بود. رکوردهای تکراری این جدول باید پاک می‌شدند.
۸- اگر مقدار InstallationDate در AppSettings وجود نداشته باشد رکوردهای تکراری مجدداً اضافه می‌شود.
۹- همه مراحل اینجا را می‌شد یک جور دیگر هم انجام داد. ایجاد دیتابیس آماده توسط باگ‌نت، پاک کردن فقط جداول آن، export داده از دیتابیس حاوی داده‌ها.
۱۰- از اینجا به بعد مشکل login کردن وجود دارد. bugnet از ASP.NET Membership استفاده می‌کند. پس با کمی شناخت از مدل ASP.NET به راحتی می‌توان مشکلات login و کاربری را حل کرد.




2011/11/12

‫‫login به سایت ASP.NET

در بیشتر پروژه‌های Web Scraping (استخراج اطلاعات از لابلای صفحات وب) نیاز به login به وب‌سایت حاوی اطلاعات هست. برای آن که  کسی بتواند به یک وب سایت لاگین کند باید با روش‌های Authentication و حفظ State در تکنولوژی‌های مختلف مثل ASP.NET و PHP آشنا باشد.

روش Login در ASP.NET مبتنی بر ارسال اطلاعات login به یک صفحه خاص مثل Login.aspx و دریافت cookie از آن است. cookie دریافت شده باید به تمامی Requestهای بعدی الصاق شود تا سرور مطمئن باشد شما همانی هستید که چند لحظه پیش به سایت login کرده است (حفظ state).

برای انجام این کارها در دات‌نت می‌توان از آبجکت‌های Request/Response استفاده کرد. گام‌های تقریبی انجام کار عبارتند از:

۱- درخواست دریافت محتوای صفحه Login.aspx با استفاده از آبجکت Request.
۲- استخراج ViewState از محتوای دریافتی که با کمک آبجکت Response دریافت شده است.
۳- از اینجا به بعد اگر با صفحه‌ای بیش از یک بار کار داشتیم باید ViewState مرحله قبلی را با آن ارسال کنیم.
۴- دریافت Cookie با استفاده از امکانات آبجکت Response و ارسال آن در تمامی مراحل بعد.
۵- ارسال user name و password با استفاده از فرمت WebForm به صفحه Login.
۶- دریافت پاسخ از سرور و پروسس آن برای تعیین این که آیا login موفقیت آمیز بوده یا نه.




2011/11/04

‫بررسی چند git server ویندوزی

git-dot-aspx

* مشکلی با فایل‌های حجیم ندارد. فقط کافی است http.postBuffer و maxRequestLength تنظیم شود.
* لازم نیست که حتماً repoها توسط خودش ایجاد شده باشد. اگر یک repo را در مسیر repoهایش قرار دهید می‌توانید از آن استفاده کنید.
* اینترفیس وبی آن فقط فهرست repoها و comment آخرین تغییر را نشان می‌دهد نه هیچ اطلاعات دیگری.
* همه repoهای آن باید پسوند ‎.git داشته باشند.
* به صورت پیش فرض anonymous است یعنی هر کسی می‌تواند clone بگیرد یا push کند.
* برای بالا بردن امنیت باید نوع Authentication را در IIS برابر Basic قرار دهید و با urlهایی شبیه به http://user:password@hostname با آن کار کنید. البته می‌توانید با هر با push/pull نام کاربری و password را هم ارسال کنید. امنیت در سطح کل repoها قابل تعریف است نه به ازای تک تک repoها. اگر در password از کاراکترهای ویژه استفاده کرده‌اید باید url را به صورت http://"user:password"@hostname استفاده کنید.


bonobo git server

* urlهای ارسالی به آن case sensitive است
* مشکل commitهای با حجم بالا دارد. با این که دستور git config http.postBuffer 524288000 یا git config --global http.postBuffer 524288000 را در client اجرا کرده و در web.config مقدار maxRequestLength را افزایش دادم باز هم نتوانستم فایل‌های بیش از مثلاً ۱۰۰ کیلوبایت را به سرور push کنم.
* به صورت پیش فرض از user/pass استفاده می‌کند. در نتیجه می‌توان از repoها حفاظت کرد.
* اینترفیس وب آن اطلاعات خیلی خوبی را ارائه می‌دهد، از جمله فهرست commitها.
* امکان تعریف کاربر و تعیین دسترسی به ازای تک تک repoها وجود دارد.


Git-Web-Access

* به هیچ وجه نتوانستم با آن کار کنم. یا من خیلی اشتباه عمل کردم یا این برنامه خیلی ناقص است.






2011/11/03

‫git server با استفاده از ویندوز و دات‌نت

تا همین چند وقت پیش برای ایجاد یک git server در ویندوز مجبور بودید از راه حل‌های لینوکسی مثل OpenSSH و cygwin استفاده کنید. استفاده از این طور راه حل‌ها واقعاً سخت و عذاب آور بود و گاهی اوقات باعث می‌شد شخص قید git server ویندوزی را بزند و به سراغ گزینه‌های دیگری مثل مرکوری برود. خوشبختانه جامعه کاربری git در ویندوز بیکار ننشسته و طی این مدت روش‌ها و ابزارهای جدیدی ارائه شده است:


git-dot-aspx
تعداد دانلود خوبی داشته و با چهار رقمی شدن فاصله‌ای ندارد.

bonobo git server
با استفاده از ASP.NET MVC نوشته شده است. downloadهای زیادی ندارد و حتی نقد منفی هم دارد. آن را تست کردم و فعلاً در push کردن فایل‌های حجیم (بیش از یک مگابایت) مشکل دارد.

grack
یک راه حل مبتنی بر ruby

git_http_backend.py
یک راه حل مبتنی بر پایتون

استفاده از Apache و امکانات مخصوص msysgit
به جای IIS از Apache استفاده می‌کند ولی راه حل مطمئن و امتحان شده‌ای است.

Git-Web-Access
الهام گرفته از grak و git_http_backend.py ولی نوشته شده با ASP.NET و WCF






عدم تسلط به مفاهیم پایه

فکر می‌کنید سخت‌ترین قسمت Data Scrapping چیست؟


ایجاد آبجکت request و ارسال آن به سرور؟
حفظ ViewState؟
login کردن به سایت راه دور؟
دریافت و نگهداری cookie؟
مسائل DNS؟
ور رفتن با استرینگ‌ها، استخراج دیتا، Regex و XPath؟
مسائل Encoding؟



نه اشتباه می‌کنید! برای من سخت‌ترین قسمت کار، بحث Stream بود. چند جا کار متوقف شد. ابتدا فکر کردم مشکل از نحوه کار با Request/Response یا Cookie است. کلی هم وقت تلف کردم ولی دست آخر فهمیدم مشکل از عدم استفاده صحیح از Stream بوده. مثلاً نبستن یک stream. این قضیه برای چند صدمین بار به من ثابت کرد که عدم تسلط به بعضی مفاهیم پایه چقدر می‌تواند مشکل ساز باشد.