Happy new year, What matters now

1394 / 1 / 27

Posted by omidp under General
0 Comments

The progressive world is necessarily divided into two classes — those who take the best of what there is and enjoy it — those who wish for something better and try to create it.
Florence Nightingale

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

سال جدید برنامه های زیادی برای انجام دادن هست اما ...

ترس

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

نقات قوت

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

خودمختاری

مدیریت ، مفهومی است که اختراع شده مثل چرخ ، رادیو و غیره و در اثر گذشت زمان کاربرد خود را از دست داده است البته مدیریت وقتی که شما بخواهید برخی افراد ، برخی کارها را از روش خاصی انجام دهند خوب است اما وقتی که بخواهید افراد از خود مایه بگذارند ، بزرگ فکر کنند یا چیزی را به این دنیا اضافه کنند که جای خالیش احساس شود دیگر بدرد نمی خورد چیزی که لازم دارم حودمختاری در ۴ مورد زیر است

  • کارهایی که انجام میدهم
  • زمانی که آن کارها را انجام میدهم
  • چطوری اون کارها را انجام می دهم
  • با چه کسی انجام می دهم

در واقع چیزی که لازم است مدیریت کمتر و آزادی بیشتر است

سال خوبی پر از سلامتی و موفقیت برای همه آرزو می کنم
Were there none who were discontented with what they have, the world would never reach anything better.

through the Dip

1393 / 12 / 22

Posted by omidp under General
2 Comments

the dip

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

برای شروع باید بگویم که افراد معمولا مدیرشان را عوض می کنند نه کارشان

حس رها کردن

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

Winners never quit and quitters never win

درسته ؟ نه اشتباهه یک نصیحت خیلی بد، برندگان دائم در حال رهاکردن هستند فقط می دانند چه چیزی را چه موقع رها کنند .

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

حتما الان از خودتون می پرسید یعنی چی ؟ به خواندن ادامه دهید

جادوی رها کردن

اغلب افراد با استغاثه از شما می خواهند که پشتکار داشته باشید و سخت تر کار کنید ، زمان های بیشتری صرف کنید و تمرین بیشتری داشته باشید اما هیچ وقت به شما نمی گویند که اگر تنها کاری که برای برنده شدن لازم است انجام دهید همین است پس چرا افراد احمق تر و کم استعداد تر از شما هستند که از شما موفق ترند ؟ چرا افرادی با انگیزه کمتر از شما هستند که از شما موفق ترند ؟

شما باید معماری رها کردن را یاد بگیرید و باور کنید راز موفقیت ، در یادگیری استراتژی رها کردن است .

شیب

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

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

البته این که فقط بدانید شما در شیب قرار دارید دلیل بر موفقیت شما نمی شود شما باید در شیب یاد بگیرید که چگونه می توانید از آن عبور کنید و آیا واقعا می توانید ؟

بن بست

خیلی توضیح خاصی در این جا لازم نیست . بن بست شرایطی است که شما مکرر در آن کار می کنید ، سخت تر کار می کنید اما هیچ چیز تغییر نمی کند و شما باید سریعا آن را رها کنید.

لبه پرتگاه

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

موفقیت هر جا باشد شیب هم آن جاست

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

استراتژی برای رها کردن

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

یک راه این است که وارد اولین صف شوید و آنقدر آنجا بمانید تا از فروشگاه خارج شوید

راه دیگر این است که بدون هیچ سرنخی مرتب جای خود را از این صف به آن صف تغییر دهید که با این روش فکر نکنم هیچ وقت از فروشگاه خارج شوید

بهترین راه این است که خلوت ترین صف را انتخاب کنید و همینطور که منتظر هستید، صف های دیگر را هم رصد کنید که کدام خلوت تر است و به محض اینکه صف خلوت تری پیدا شد جای خود را تغییر دهید و انقدر اینکار را انجام دهید تا از فروشگاه خارج شوید . مشکل این روش این است که هر بار که شما جای خود را عوض می کنید باید از صفر شروع کنید ولی خوب من CEO رو نمی شناسم که ۱۰ سال سرش رو پایین ننداخته باشه و سخت کار نکرده باشه تا به جایی که الان هست برسه .

رها کردن با شکست خوردن متفاوت است

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

نتیجه گیری

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

افرادی هستند که این کار را کردند ، مایکل کرای تن ، شخصی که به جای پزشک ، نویسنده شد

این سوالات را از خود بپرسید

کاری که انجام می دهم کدام است ؟ شیب ، بن بست یا پرتگاه

تلاش من در بلند مدت جواب خواهد داد ؟

چه موقع باید رها کنم ؟

اگر رها کنم می توانم کار بهتر و مهتری انجام دهم ؟

شانس این کار یا پروژه برای بهترین شدن چقدر است ؟

کارم رو دوست دارم ؟

پست های مرتبط

برنامه نویس بهتری باشیم

Peopleware The High-Tech Illusion

1393 / 9 / 15

Posted by omidp under General
3 Comments

در پست قبلی به برخی دلایل شکست پروژه ها اشاره کردم . برخی افراد تصور می کنند که اگر در یک پروژه از تکنولوژی های جدید تری استفاده کنند پروژه شکست نخواهد خورد این افراد به بیماری High-Tech illusion دچار هستند . در این پست کمی در مورد این افراد می نویسم .

اعتقاد راسخه بعضی از افراد که با تکنولوژی های جدید سر و کار دارند ( کدوم یکی از ما نداریم ) از اینجا نشآت میگیرد که آن ها خود را جزیی از دنیای high-tech می دانند . اما بین خودمون باشد آن ها معمولا جزیی از این دنیا نیستند . کسانی که این تکنولوژی ها و فریم ورک ها را می سازند متعلق به دنیای high-tech هستند بقیه ما فقط از کار آن ها استفاده می کنیم . ما از تکنولوژی های جدید استفاده می کنیم تا محصولاتمان را بسازیم .

علت اصلی این مسئله که ما بر روی موارد تکنیکال بیشتر از موارد انسانی کار تمرکز می کنیم این نیست که آن ها حیاتی تر هستند بلکه این است که این مسائل راحتت تر هستند .

ایجاد یک پروژه با richfaces 4.5 به مراتب راحت تر از بررسی این است که چرا فلان شخص امروز ناراحت سر کار آمده . ارتباطات انسانی کار بسیار پیچیده ای است و در یک پروژه ، مهم تر از این که شما از چه تکنولوژی استفاده می کنید این است که شما به روابط بین افراد توجه کنید .

Peopleware - Part I

1393 / 7 / 25

Posted by omidp under General
4 Comments

تا مدت های طولانی ،‌ همیشه فکر می کردم که دلیل شکست یک پروژه به مسایل فنی مربوط می شود اما در چند سال اخیر تجربه ای کاملا متفاوت داشتم .

مدیریت منابع انسانی

الان سال هاست که پروژه های مختلف تولید می شن و یک جایی الان که شما دارید این متن رو می خونید یکی از آن ها در حال fail شدن است . فرض کنید که شما فرصت کالبد شکافی پیدا کنید تا دلایل شکست آن را بررسی کنید و چیزی که متوجه خواهید شد این است که پروژه بدون نیاز به هیچ فناوری و تکنولوژی جدید درحال نابود شدن است بدون حتی یک مشکل فنی .

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

وقت برای فکر کردن نیست ، فقط انجام بده

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

پیغامی از خط مقدم

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

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

آن ها می دانند که کارهای مهمتری به جز انجام کار احمقانه شما هم هست و زمانیکه به این نقطه برسند همه چیز تمام می شود

چیزی بنام اضافه کار وجود ندارد

بهره وری در اضافه کار زاده ذهن ساده ی مدیر است که همیشه با کسر کار همراه است وقتی که شما یک نفر را تا دیر وقت نگه می دارید شخص برای رسیدن به زندگی شخصی خود مجبور می شود تا فردا دیر به محل کار بیاید که اختلاف این هزینه ممکن است در کوتاه مدت به نفع شما باشد اما در بلند مدت یقینا نخواهد بود . هیچکس هفته ای ۴۰ ساعت بیشتر نمی تواند کار کند یا بهتر است بگوییم خلاقانه نمی تواند کار کند به کار گیری افراد بیشتر از این فقط باعث می شود افراد سریع تر کار کنند نه بهتر و در راستای سریع تر کار کردن آن ها باید کیفیت محصول را قربانی کنند . هر کسی هم که غیر از این باشد معتاد به کار است workaholics

Workaholics

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

اعتیاد به کار یه نوع مریضی است اما نه مثل اعتیاد به الکل مانند سرماخوردگی که همه افراد با درجه متفاوت به آن مبتلا هستند با این تفاوت که درمان ندارد اما راه حل ساده تر آن ، مدیریت است . اگر شما به این افراد فشار بیارید مهم نیست چقدر به آن ها نیاز دارید ، بالاخره از دستشان خواهید داد.

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

Productivity : wining battle , losing war

دفعه بعد که کسی در مورد بهبود توسعه صحبت می کنه خوب گوش کنید که آیا در مورد جذب/رفتن نیروها در شرکت هم صحبتی می شود یا خیر . معمولا شرکت ها برای افزایش کارایی کارهایی مانند :

  • فشار به افراد برای کار در ساعات بیشتر
  • قربانی کردن کیفیت محصول

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

قربانی کردن کیفیت محصول

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

پرواز از تعالی

البته مدیران اینگونه فکر نمی کنند آن ها تصور می کنند که challenge جدیدی در تیم می آورند تا باعث رشد افراد شوند . اما افراد باتجربه می دانند که اینگونه نیست و منابع کافی برای انجام این کار را ندارند . اعضای تیم هیچ حق انتخابی برای اضافه کردن یک فرد جدید یا تغییر عملکرد سیستم functionality ندارند . تنها چیزی که می توانند قربانی کنند ، کیفیت است . برخی از مدیران در جواب ممکن است بگویند که بازار به انقدر کیفیت اهمیت نمی دهد

ادامه مطالب را در بخش دوم خواهید خواند .

پست های مرتبط

Toxic Paradox

Effective Team

Mind The GAP

Fun with Postgresql

1393 / 7 / 21

Posted by omidp under Code Snippet
0 Comments

در این چند سالی که از postgresql استفاده کردم با کوئری های جالبی روبرو شدم شامل recursive ، With و... که یکی از خفن ترین کوئری هایی که دیدم ، کوئری زیر برای پیدا کردنه رکورد قبلی و بعدیه . در واقع متعجب شدم که این کوئری با چه سرعت بالایی در تعداد رکوردهای زیاد داره اجرا میشه . واقعا از این دیتا بیس خیلی راضیم . لایک داره .

SELECT  
i.spv_prj_progress_id,i.proj_id,
  COALESCE(LEAD(i.spv_prj_progress_id)  OVER (ORDER BY i.data_date DESC)
          ,FIRST_VALUE(i.spv_prj_progress_id)
           OVER (ORDER BY i.data_date DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)) AS nextitemid,
  COALESCE(LAG(i.spv_prj_progress_id)       
    OVER (ORDER BY i.data_date DESC)
          ,LAST_VALUE(i.spv_prj_progress_id)  
          OVER (ORDER BY i.data_date DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)) AS previtemid,  
  i.data_date AS data_date
FROM spv_prj_progress i  
where proj_id = ? 
ORDER BY i.data_date DESC;

Run seam 2.2 with jdk 7 and jboss eap 6.2 (as 7.3)

1393 / 6 / 26

Posted by omidp under Tech Stuff
0 Comments

جی باس یا شاید دیگه وایلد فلای در حال حاضر یکی از پر استفاده ترین اپ سرورهای متن باز جاوا است که تغییرات زیادی از نسخه ۷ به بعد در بر داشته و اگه شما جزو اون دسته از کاربران فریم ورک سیم ۲.۲ هستید که می خواهید نرم افزار خود را ارتقا دهید تا امکانات بیشتری به آن مثل وب ساکت ، استفاده از ان آی او برای کار با فایل سیستم و غیره ، راحتر اضافه کنید وقت آن رسیده که از جاوا ۷ و جی باس ۷.۳ استفاده کنید . برای اجرای پروژه سیم ۲.۲ بر روی جی باس ۷.۳ مراحل زیر را دنبال کنید

جی باس ۷ به بعد از سیستم classloading ای بی نظیر و جالب استفاده می کند که شما می توانید ماژول های مختلف از یک فریم ورک را با اسلات های مختلف در یک پروژه تنظیم کنید که جلوتر با هم خواهیم دید

ابتدا نیاز به تغییر چند فایل کانفیگ در پروژه است

خط زیر را به فایل persistence.xml اضافه کنید

<property name="jboss.as.jpa.providerModule" value="org.hibernate:3" />

در ear فایل شما داخل فولدر META-INF فایل jboss-deployment-structure.xml را بسازید

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
		  <exclusions>
              <module name="org.hibernate" slot="main"/>
            </exclusions>  
            <dependencies>  
              <module name="org.apache.log4j" export="true"/>  
              <module name="org.hibernate" slot="3" export="true"/>  
              <module name="org.dom4j" export="true"/>  
              <module name="org.apache.commons.logging" export="true"/>  
              <module name="org.apache.commons.collections" export="true"/>  
              <module name="javax.faces.api" slot="1.2" export="true"/>  
              <module name="com.sun.jsf-impl" slot="1.2" export="true"/>  
            </dependencies>  
      </deployment>  
      <sub-deployment name="omidbiz.war">   
          <exclusions>  
              <module name="javax.faces.api" slot="main"/>  
              <module name="com.sun.jsf-impl" slot="main"/>  
            </exclusions>  
            <dependencies>  
              <module name="javax.faces.api" slot="1.2"/>  
              <module name="com.sun.jsf-impl" slot="1.2"/>  
            </dependencies>  
      </sub-deployment>   
     </jboss-deployment-structure>  

این فایل داستان زیادی در دل دارد اول به جی باس میگه که از jsf ۱.۲ استفاده کند چراکه پیش فرض جی باس ۷ به بالا جی اس اف ۲ است و سیم ۲.۲ از جی ای اف ۱.۲ استفاده می کند دوم اسلات هایبرنیت ۴ که باز هم پیش فرض جی باس است را از کار میندازد و هایبرنیت اسلات ۳ را فعال می کند که باید به جی باس معرفی شود و بقیه dependency ها هم مشخص است .

مرحله بعد تنظیمات EJB

فایل component.xml

تعریف JNDI برای EJB در هر اپ سروری متفاوت convention در جی باس های قدیمی به این صورت بود

 earName/#{ejbName}/local

در نسخه جدید تغییر کرد و باید آن را به صورت زیر عوض کنید

<core:init jndi-pattern="java:app/earName/#{ejbName}" debug="true"/>
<component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/>
    <component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/>
<persistence:managed-persistence-context
		auto-create="true" name="entityManager" persistence-unit-jndi-name="java:/omidbizEntityManagerFactory" />

تنظیمات دیتا سورس

در این پست توضیح داده شده

معرفی اسلات ۳ هایبرنیت

همانطور که گفتم کلاس لودینگ استثنایی جی باس ۷ به شما این امکان را می دهد تا نسخه های مختلف از یک فریم ورک را بصورت ایزوله برای پروژه های خود استفاده کنید یعنی در یک جی باس دو پروژه داشته باشید که یکی از هایبرنیت ۴ استفاده می کند و دیگری از هایبرنیت ۳ . برای اضافه کردن هایبرنیت ۳

در پوشه ماژوال فولدر org/hibernate فولدری با نام 3 بسازید

در این فولدر فایلی به نام module.xml ساخته و جر فایل های هایبرنیت را به آن اضافه کنید

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="org.hibernate" slot="3">
    <resources>
        <resource-root path="hibernate-core.jar"/>
        <resource-root path="hibernate-commons-annotations.jar"/>
        <resource-root path="hibernate-entitymanager.jar"/>        
        <resource-root path="hibernate-annotations.jar"/>
        <resource-root path="antlr.jar"/>  
        <resource-root path="commons-collections.jar"/>  
        <resource-root path="dom4j.jar"/>  
        <resource-root path="javassist.jar"/>  
        <!-- Insert other Hibernate 3 jars to be used here -->
    </resources>
 
    <dependencies>
        <module name="org.jboss.as.jpa.hibernate" slot="3" optional="true" services="import"/>
        <module name="asm.asm"/>
        <module name="javax.api"/>
        <module name="javax.persistence.api"/>
        <module name="javax.transaction.api"/>
        <module name="javax.validation.api"/>
        <module name="org.infinispan"/>
        <module name="org.javassist"/>
        <module name="org.slf4j"/>
    </dependencies>
</module>

همه چیز آماده است پروژه سیم خود را اجرا کنید . توجه کنید که اگر از لایبرری جاوایی استفاده کردید فراموش نکید که آن را در پروژه قرار دهید یا به جی باس معرفی کنید برای راحتی کار بهتر است از maven استفاده کنید نسخه جدید سیم با می ون است اما اگر از نسخه قدیمی سیم می خواهید استفاده کنید می توانید از Jboss Seam 2.3 ALPHA استفاده کنید این همان نسخه سیم ۲.۲ مبتنی بر می ون است

dogfooding

1393 / 6 / 22

Posted by omidp under General
2 Comments

practice what you preach

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

eating your own dog food

در دنیای تکنولوژی اصطلاحی وجود داره که در این پست راجع بهش توضیح می دم . قبلش یک مقدمه کوچکی مطرح کنم که

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

برای روشن تر شدن موضوع اجازه دهید مثالی بزنم ممکن است در یک جامعه از چاقو برای بریدن طناب استفاده شود و در جامعه دیگر برای باز کردن طناب.

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

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

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

خیلی نمی خوام مطلب رو کش بدم در آخر می خوام نتیجه گیری کنم که زامبی باشید

Pro NonPro Solar Solr

1393 / 6 / 9

Posted by omidp under General
4 Comments

تقدیم به تمام کسانی که سولر را سولار تلفظ می کنند

حرفه ای می داند به خاطر چه چیزی بجنگد و بر سر چه چیزی سازش کند، غیر حرفه ای به خاطر چیزی که ارزش ندارد مبارزه میکند و آنجا که نباید سازش میکند

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

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

در جاوا صرف نظر از اینکه چه تکنولوژی هایی بلد هستید ، چک کردن رفرنس ایمپیلیمنتیشن و دیزاین پترن کاری ضروری است.

روش درست : شما می توانید یک لحظه شک کنید و بعد از اینکه مطمين شدید اینطور برخورد کنید تلفظ صحیح آن سولر است اما در فارسی سولار مصطلح است مثل خیلی از کلمات دیگر مانند سوکت و.. تا اینکه کینه به دل بگیرید و به خاطر رفتار یک نفر اعتبار شرکتی را زیر سوال ببرید

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

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

در نهایت هم  همونطور که گفتم با چک کردن فونتیک در دیکشنری متوجه می شید که تلفظ صحیح Solar(Solr) همان سولر است که در فارسی سولار می گویند مانند lunar

http://www.oxfordlearnersdictionaries.com/definition/english/solar

Java Websocket Swing Client

1393 / 4 / 24

Posted by omidp under Code Snippet
0 Comments

میشه گفت نسل بعدی اپلیکیشن های وب بعد از Ajax ، نرم افزارهای real-time است یکی از راه های پیاده سازی این نرم افزارها استفاده از وب سوکت است که در یکی از پست های قبلی به آن اشاره کردم.

در حال حاضر، در حال توسعه یک اپلیکیش جاوایی دسکتاپ swing هستم که نیاز دارد تا به عنوان کلاینت از طریق وب سوکت به سرور متصل شود برای اینکار پروژه ای بنام تایروس وجود دارد که در واقع Reference implementation وب سوکت است و با کد زیر به راحتی می توانید اینکار را انجام دهید.

ابتدا dependency تایروس را به پروژه خود اضافه کنید


			org.glassfish.tyrus.bundles
			tyrus-standalone-client
			1.7
		

package com.omidbiz.ws;

import java.io.IOException;
import java.net.URI;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import javax.websocket.ClientEndpointConfig;
import javax.websocket.ClientEndpointConfig.Configurator;
import javax.websocket.Endpoint;
import javax.websocket.EndpointConfig;
import javax.websocket.HandshakeResponse;
import javax.websocket.MessageHandler;
import javax.websocket.RemoteEndpoint.Basic;
import javax.websocket.Session;

import org.glassfish.tyrus.client.ClientManager;

/**
 * @author : Omid Pourhadi omidpourhadi [AT] gmail [DOT] com
 */
public class WebSocketClient
{

    Basic basicRemoteEndPoint;

    public void connect()
    {
        try
        {
            final ClientEndpointConfig configuration = ClientEndpointConfig.Builder.create().configurator(new RemoteConfigurator()).build();
            ClientManager client = ClientManager.createClient();
            SocketEndPoint endPoint = new SocketEndPoint();
            client.connectToServer(endPoint, configuration, new URI("ws://127.0.0.1:8080/websocket"));
            basicRemoteEndPoint = endPoint.getRemoteEndPoint();

        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public void sendMessage(String message) throws IOException, InterruptedException
    {
        basicRemoteEndPoint.sendText(message);
    }

    // Endpoint definition
    private class SocketEndPoint extends Endpoint
    {
        private Session sess;

        @Override
        public void onOpen(Session sess, EndpointConfig ec)
        {
            this.sess = sess;
            this.sess.addMessageHandler(new MessageHandler.Whole()
            {

                @Override
                public void onMessage(String message)
                {
                    System.out.println("message broadcast from server : " + message);
                }

            });
        }

        public Basic getRemoteEndPoint()
        {
            return sess.getBasicRemote();
        }

    }

    // Websocket Configuration
    private class RemoteConfigurator extends Configurator
    {

        @Override
        public void beforeRequest(Map> headers)
        {
            //everything you need to send as request header
        }

        @Override
        public void afterResponse(HandshakeResponse hr)
        {

        }

    }

}

Recursively throgh Java nio

1393 / 4 / 19

Posted by omidp under Code Snippet
0 Comments

public static void main(String[] args) throws IOException
    {
        Path start = Paths.get("/home/omidp/persiangig/");
        Files.walkFileTree(start, new SimpleFileVisitor()
        {
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException
            {
                System.out.println(dir);
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException
            {
                System.out.println(file);
                return FileVisitResult.CONTINUE;
            }
            
            
        });
    }
    
 

Persian Language Detection in Tika

1393 / 4 / 1

Posted by omidp under Tech Stuff
1 Comments

آپاچی تیکا یکی از جذاب ترین پروژه هایی است که تا به حال کار کرده ام . این پروژه امکانات زیادی دارد که یکی از آن ها امکان شناسایی زبان بر اساس محتوای فایل است . در این پست نحوه اضافه کردن زبان فارسی به تیکا را توضیح می دهم .

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

سوال اولی که باید به آن پاسخ داد این است که چگونه یک توسعه دهنده شناسایی زبان یا ابزارهای Natural Language Processing می تواند منبع خوبی از corpus پیدا کند ؟

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

دانلود فایل Persian corpus

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

حالا که شما ، هم مجموعه کلمات فارسی دارید هم سورس های تیکا ، برای اضافه کردن زبان فارسی مراحل زیر را طی کنید

ایجاد فایل فارسی n-gram

java -jar tika-app-1.4.jar --create-profile=fa -eUTF-8 persian-words.txt

خروجی دستور بالا فایل fa.ngp است . این فایل را داخل ماژول tika-core در آدرس زیر قرار دهید

/src/main/resources/org/apache/tika/language

سپس زبان فارسی را به فایل tika.language.properties اضافه کنید و به همین سادگی یک زبان جدید به تیکا اضافه شد برای اینکه مطمئن شوید می توانید از فرمان زیر استفاده کنید

java -jar tika-app-1.4.jar --language http://www.ohchr.org/EN/UDHR/Documents/UDHR_Translations/eng.pdf
java -jar tika-app-1.4.jar --language http://www.ohchr.org/EN/UDHR/Documents/UDHR_Translations/prs.pdf

اگر از نسخه تیکا ۱.۶ به بالا استفاده می کنید نیازی به انجام این کارها نیست و زبان فارسی بطور پیش فرض در تیکا وجود دارد

Genymotion 2.2 VirtualBox 4.3.6 Fedora 20 For Android

1393 / 2 / 3

Posted by omidp under Tech Stuff
0 Comments

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

البته دلیل دیگر این است که genymotion بر روی توزیع لینوکس فدورا و ردهت در حال حاضر کار نمی کند

ابتدا genymotion را از سایت آن دانلود کنید

http://www.genymotion.com/

برای نصب ۲.۲ genymotion نیاز به Virtual Box دارید در اینجا از Vbox 4.3.6 استفاده شده . بنابراین قبل از آن vbox را نصب کنید . نصب vbox بر روی ویندوز بسیار ساده است . سپس توزیع لینوکس مورد نظر خود را به همراه ابزارهای توسعه اندروید بر روی vbox نصب کنید که من از فدورا ۲۰ استفاده کرده ام .

فایل نصب genymotion را اجرا ، دیوایس مورد نظر را اضافه کنید و آن را اجرا کنید با کلیک بر روی آیکون در صفحه اصلی IP آدرس آن را خواهید دید

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

cd $ANDROID_HOME/sdk/platform-tools ///home/omidbiz/adt/sdk/platform-tools
adb connect 192.168.56.101

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

new year

1393 / 1 / 3

Posted by omidp under General
0 Comments

You can't live your life for other people. You've got to do what's right for you, even if it hurts some people you love.

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

cld.persiangig.com

بعلاوه بعد از مدت ها کمی وقت کردم اندروید کار کنم .

در سال جدید سعی می کنم برنامه ریزی نکنم چون هر وقت برنامه ریزی می کنی زندگی برنامه های دیگری برای شما دارد

Life is what happens to you while you're busy making other plans.

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

طبق معمول چند پروژه متن باز درست کردم که مهمترین آن ها می توان به آکسون اشاره کرد با تشکر از دوست و همکار خوبم

https://github.com/omidp/axon

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

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

در آخر هم امیدوارم امسال سالی پر از شادی ، سلامتی و پول برای همه باشد مخصوصا برای خودم .

بانک سامان بانک هوشمند یا گوسفند

1392 / 12 / 2

Posted by omidp under Fun Stuff
0 Comments

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

همانطور که مستحضر هستید بانک سامان چند وقتی است که فریم ورک UI اینترنت بانک را از JSF به ExtJS تغییر داده که در ابتدا مشکلات کاربری داشت برای نمونه اینجا را کلیک کنید جادی .

از آنجاییکه من با بانک سامان بیشتر از بقیه بانک ها کار می کنم از دوستان تقاضا دارم اقدامات مقتضی را مبذول بفرمایید

نرم افزارهای بانکی ایرانی تولید شده برای استفاده دوستان در ایران است و آیا شما از سرعت اینترنت ایران با خبر هستید ؟؟؟؟

بعد از ورود ، صفحه اول ۱.۲ مگ است با ۵۲ request . حداقل جاوااسکریپت ها و css هایی که استفاده کردید را minified کنید خو ، حجم صفحه کم بشه . ولی باز هم جا داره از آپاچی و cache browser تشکر کنم که تا حدی به ما در این مهم کمک کرده است .

ExtJs فریم ورک خوبی است معمولا برای تولید SPA یا Single Page Application در بانک سامان لینک های زیادی وجود داره که بر روی هر کدام کلیک می کنید حداقل ۵۰ K فایل لود می کند . (‌با کمی اغراق البته )

از همه موارد بالا که بگذریم سخن دوست نکوست

نکته دیگر که شاید چندان هم مهم نباشد ، اگر امکان داره session timeout صفحه را بیشتر کنید .

با احترام

سیتم پرداخت شاپرک یا خرمگس ، پاسارگاد یا پاسارگاو

1392 / 11 / 28

Posted by omidp under Online Biz
2 Comments

I never admire another's fortune so much that I became dissatisfied with my own.

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

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

با این سیستم های شخمی که بانک های ما دارن فقط با دات نت و php میشه بهشون درست وصل شد اونم با نمونه کدهایی که خودشون خریدن .

Main | Next page »