During learn and experience

استفاده از CompletableFuture برای برنامه نویسی concurrent به سبک functional در جاوا 8

اولین بار که با کلاس Future در Scala و بعدش Akka آشنا شدم که با اون میشد با یک سبک جدید و ساده تر برنامه نویسی concurrent کرد خیلی مشتاق بودم که معادلی براش تو دنیای جاوا پیدا کنم. متاسفانه اینترفیس Future که در جاوا 5 معرفی شده بود بسیار نقص داره و نمی توان کارهای زیبایی که با Future در اسکالا انجام میشه رو باهاش انجام داد. تا اینکه در Play Framework با Promise آشنا شدم که تقریبا معادل جاوایی Future در اسکالا ولی با امکانات محدودتر بود.

سبک برنامه نویسی concurrent با Future یک سبک functional که هم کدنویسی concurrent رو ساده تر می کنه و هم خواناتر. جاوا 8 با آوردن کلاس CompletableFuture و همراهی Lambda expression ها و Stream ها این سبک برنامه نویسی concurrent به سبک functional رو برای توسعه دهندگان جاوا به ارمغان آورده. در مثال زیر یک نام و یک عدد قرار است با تاخیر بدست بیایند ولی برای چاپ خروجی به وجود نتیجه هر دو محاسبه احتیاج است که با استفاده از CompletableFuture آن دو مقدار بر روی یک ThreadPool جدید محاسبه می شوند و با اینکه مقدار نام زودتر بدست می آید ولی باید منتظر بماند تا مقدار عدد نیز محاسبه شود:

    public static void main(String[] args) { 
 
        CompletableFuture<Integer> futureNumber = CompletableFuture.supplyAsync(() -> { 
            delay(2000); 
            System.out.println("getting number finish"); 
            return 12345; 
        }, executor); 
 
        CompletableFuture<String> futureName = CompletableFuture.supplyAsync(() -> { 
            delay(1000); 
            System.out.println("getting name finish"); 
            return "Saeed"; 
        }, executor); 
 
        System.out.println("do some normal work"); 
 
        futureNumber.thenCombineAsync(futureName, (number, name) -> { 
            System.out.println(name + " " + number); 
            return null; 
        }, executor).join(); 
 
    } 
 
    private static final Executor executor = Executors.newFixedThreadPool(10, 
            r -> { 
                Thread thread = new Thread(r); 
                thread.setDaemon(true); 
                return thread; 
            } 
    ); 
 
    public static void delay(long time) { 
        try { 
            Thread.sleep(time); 
        } catch (InterruptedException e) { 
            throw new RuntimeException(e); 
        } 
    } 

 

یکی دیگه از قابلیت های خوب CompletableFuture استفاده از آنها در Stream های جاوا 8 بخصوص وقتی از parallel stream ها استفاده می کنیم.

 

۰۱ اسفند ۹۴ ، ۲۲:۳۳ ۰ نظر موافقین ۱ مخالفین ۰
سعید زرین فام

سختی تصمیم گیری های بزرگ

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

 

۲۷ بهمن ۹۴ ، ۰۹:۵۱ ۱ نظر موافقین ۱ مخالفین ۰
سعید زرین فام

معرفی کتاب هنر شفاف اندیشیدن

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

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

به نظرم این کتاب رو هر ۳ یا ۴ ماه یکبار باید مرور کرد. اسم بهتری که برای این کتاب پیشنهاد می کنم راهکارهای بهتر زندگی کردن.

 

 

پ.ن.

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

 

۲۰ بهمن ۹۴ ، ۱۰:۳۳ ۰ نظر موافقین ۱ مخالفین ۰
سعید زرین فام

تغییر

همه منتظر شدن ، بیهوده است .
برای حل مشکلاتمان وابسته به زمان بودن ,
خود فریبی است .
آینده که به خود واگذار شود تکرار محض گذشته است .
تغییر , تنها هم اینک می‌تواند اتفاق بیفتد .

 

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

۱۴ بهمن ۹۴ ، ۱۰:۴۱ ۰ نظر موافقین ۲ مخالفین ۰
سعید زرین فام

بررسی Ninja Framework

قبلا یه مطلبی درباره Ninja Framework خونده بودم و همیشه دوست داشتم یه سرکی توش بکشم ببینم چه حرفی برای گفتن داره. تا اینکه بالاخره Ninja Framework منو طلبید و دیشبو با اون گذروندم.

به نظر میرسه Ninja Framework توسط یکسری جاوا developer خفن که هیچ کدوم از فریم ورک های وب جاوا موجود مثل Spring MVC یا Play Framework کارشونو برای پروژه هاشون بخوبی راه ننداخته توسعه داده شده و به همین دلیل از کلی best practice های توی فریم ورک های قبلی در Ninja Framework هم استفاده شده.

Ninja Framework خیلی بیش از حد شبیه Play Framework ولی بر خلاف Play کاملا با جاوا نوشته شده و هیچ وابستگی در هیچ سطحی با اسکالا نداره. یجورایی Ninja Framework اومده کلی از library ها و ابزار های بالغ در دنیای جاوا مثل Maven, Freemarker, Google Guice, JPA و ... رو با استفاده از best practice های development و معماری در فریم ورک های وب جاوا مثل Spring MVC یا Play Framework ترکیب کرده و یک فریم ورک وب ایده آل برای عاشقان جاوا درست کرده.

 

مزایای Ninja Framework:

  • یادگیری سریع برای توسعه دهندگان جاوا: چون برای کار باهاش فقط باید جاوا بلد باشی حتی دانش Java EE لازم نداره و از همه مهمتر نیومده چرخ رو از اول اختراع کنه و هر جا شده از library ها و ابزار های استاندارد و بالغ دنیای جاوا استفاده کرده که خیلی از توسعه دهندگان جاوا باهاش آشنا هستند.
  • Stateless بودن: درسته که Ninja Framework بر روی servlet container jetty بالا میاد ولی از servlet container فقط بعنوان وب سرور استفاده می کنه و از استاندارد های servlet container در Java EE تبعیت نمی کنه و بر خلاف اون مثل Play Framework کاملا stateless است که کمک می کنه به راحتی scale بشه.
  • کتابخانه تست حاضر و آماده: Ninja Framework هم شبیه Play برای نوشتن تست های اتوماتیک در هر سطحی (unit، functional و integration) کلاس های و کتابخانه های حاضر و آماده داره و کلی کار آدم رو راحت میکنه.
  • سازگاری با تمام IDE های دنیای جاوا: چون Ninja Framework از Maven بعنوان build tools استفاده کرده و حتی برای ایجاد یک پروژه Ninja باید از maven archetype استفاده کرد تقریبا با تمام IDE های موجود در دنیای جاوا سازگاری داره و به راحتی میشه با هر IDE باهاش کار کرد.

معایب Ninja Framework (بیشتر در مقایسه با Play Framework):

  • اگر توی web application تون بخاین از websocket استفاده کنید، Ninja Framework هیچ امکاناتی برای این کار نداره.
  • مباحث سیستم های Reactive مثل non blocking و async بودن در Ninja Framework وجود نداره.
  • هیچکدام از API های Ninja بر پایه Java 8 طراحی نشدند.
  • community فوق العاده کوچک.
  • قابلیت SuperDevMode که قراره امکان hot code reloading رو برای ما بیاره کاملا به IDE وابستس و در اکثر موارد کار نمی کنه (حداقل تو Intellij).

به نظرم Ninja Framework تلاشی بوده برای آوردن بهترین تجربیات فریم ورک های وب مثل Play یا Ruby on Rails در کنار جاوا و استاندارد های Java EE. کاری که در Play هم اتفاق افتاده ولی در بسیاری از موارد جاوا و استاندارد های Java EE با اسکالا و استاندارد های اون جا بجا شده که این کمی به مذاق توسعه دهندگان جاوا خوش نیومده. Ninja Framework با هدف داشتن یک فریم ورک مدرن و کاملا بر پایه استاندارد های جاوا و Java EE وارد میدان شده.

اگر بخام مقایسه نهایی رو با Play انجام بدم، از نظر فرآیند توسعه و مدرن بودن، Ninja Framework خودشو از Java EE جدا کرده و می تونه با Play در این زمینه رقابت کنه هر چند در مواردی مثل hot code reloading یا websocket عقبتره. از نظر معماری ولی Play چون بر پایه مفاهیم Reactive بنا شده و کاملا non blocking و async است در مبحث scalability بر روی یک ماشین خیلی جلوتر از Ninja Framework است که برای این موارد به servlet container اعتماد می کنه.

در کل با Ninja Framework خیلی حال کردم و یه application باهاش بالا آوردم و ازش ممنونم که باعث شد علاقم و اعتقادم به Play بیشتر از پیش بشه.

 

۱۲ بهمن ۹۴ ، ۰۹:۲۱ ۰ نظر موافقین ۳ مخالفین ۰
سعید زرین فام

گارگاه رایگان دو روزه برنامه نویسی Functional در جاوا ۸

یکی از چیزایی که از رایان خوشم میاد همین لارج بازیاشه. یه دوره رایگان دیگه در قالب کارگاه عملی رایگان دو روزه برنامه نویسی Functional در جاوا ۸. تو این دو جلسه کلی به سبک functional در جاوا ۸ کد میزنیم و البته برای جذب نیرو در رایان هم تبلیغ می کنیم.

 

اطلاعات بیشتر

 

۱۱ بهمن ۹۴ ، ۱۲:۰۹ ۲ نظر موافقین ۲ مخالفین ۰
سعید زرین فام

آلودگی هوا و انگولک کردن اینترنت توسط دلواپسان

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

چند روزی بود معلوم نبود دوستان دلواپس چه انگولکی به اینترنت کشور می کردند که سایت های کاربردی برای ما developer ها مثل github و ... لود نمی شد. خداروشکر امروز مثل اینکه دست از انگولک کشیدن.

 

۰۶ بهمن ۹۴ ، ۱۴:۲۸ ۰ نظر موافقین ۱ مخالفین ۰
سعید زرین فام

اولین پروژه جدی با Play Framework 2.4 و جاوا

حدود دو سال میشه که با Play Framework پروژه های عملیاتی و جدی انجام میدم و توی تیم های مختلف ازش استفاده می کنیم. شروع کار از Play Framework 2.2 بود ولی بیشتر پروژه ها روی Play Framework 2.3، Spring و جاوا انجام شده.

پس از مشکل در سازگار کردن Play Framework 2.4 با Spring ، پروژه های قبلی همه روی Play 2.3 موندن تا اینکه اولین پروژه جدی با Play Framework 2.4 و جاوا رو برای یک پروژه جدید و خاص شروع کردم (البته یک پروژه با Play Framework 2.4 و اسکالا هم با یکسری دوستان دیگه داریم). 

پروژه نیازمندی های خاصی داره که از پروژه های مرسوم با معماری لایه ای متفاوتش کرده. یکی از تفاوت های بارزش اینه که قرار یک سرویس REST باشه که به چیزی حدود ۲۰۰ دیتابیس مختلف وصل میشه و هر کدوم از دیتابیس ها ممکنه schema با اونیکی فرق کنه ولی سرویسی که قراره رو همشون داده بشه یکسانه!!! یکی دیگه از تفاوت هاشم اینه که از این سرویس های REST قراره third party های شرکت هایی که ما باهاشون قرارداد داریم استفاده کنند و لود بالایی روش خواهد بود که قابلیت خوب scalability در Play Framework خیالمون رو راحت کرده.

کل ساختار Play Framework 2.4 بر پایه dependency injection شده حتی پلاگین نویسی یا lifecycle برنامه و ... ولی وابستگی شدیدی به Google Guice داره. من سال ۸۷ با Google Guice آشنا شدم و با GWT و Servlet باهاش web application تولید می کردیم. کلا موجود بی آزاریه ولی بقدرت Spring نیست اما از Spring خیلی خوش دست تر و سبک تره.

سایر تغییراتی که برای من جالب بود و بهش بر خوردم تغییر در ابزار های تست بود، برای مثال جایگزینی Hamcrest یا fest assertion یا تغییر اساسی در مکانیزم ایجاد و استفاده از FakeApplucation و FakeRequest برای تست بود.

۳۰ دی ۹۴ ، ۲۰:۱۵ ۰ نظر موافقین ۱ مخالفین ۰
سعید زرین فام

مشکل گوگل کروم با gnome-keyring در اوبونتو و بازگشت به اپرا و استفاده از LastPass

مدتی بود گوگل کروم روی سیستمم (اوبونتو 14.04) بازی در می آورد و مشکلات زیر رو داشتم:

  • درگیر شدن CPU توسط پروسس gnome-keyring پس از اجرای گوگل کروم.
  • لود شدن با تاخیر زیاد پسوردهای ذخیره شده در گوگل کروم .
  • بسته نشدن کامل گوگل کروم پس از بستن پنجره اصلی با اینکه تیک Continue running background apps when Google Chrome is closed را برداشته بودم.

مورد سوم باعث می شد که برای باز کردن مجدد گوگل کروم به خطای Your profile could not be opened correctly بر بخورم!

پس ار بررسی فراوان و گشت و گذار در issue های پروژه chromium و صفحه support گوگل برای گوگل کروم، متوجه شدم برای هر کدام از سه مورد فوق، thread ها و issue های بازی در این سایت ها وجود داره که فعلا مثل اینکه کسی بهشون توجه نمی کنه!

 

دلایل استفاده اصلی من از گوگل کروم:

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

بخاطر این مشکلا بدنبال جایگزینی برای نیازمندی هام گشتم. قبلا وقتی مک بوک داشتم یک بار برای اینکه کروم توی OSX مصرف باتری زیادی داشت از Opera استفاده کرده بودم و راضی هم بودم. Opera گزینه خوبی بود چون هم بر پایه پروژه chromium هستش و سرعت گوگل کروم رو داره. با استفاده از پلاگین Download Chrome Extension، تمام extension های کروم روی اپرا نصب میشه.

فقط می موند قابلیت سینک و ذخیره سازی پسورد ها که اونم رفتم سراغ سرویس cross browser با نام LastPass که برای تمام مرورگرها پلاگین داره و برای سیستم عامل های موبایل هم app داره.

الان از این تصمیمم راضیم و مشکلاتم حل شده و تازه یکسری مزیت ها هم داره:

  • دانلود منیجر Opera قویتر از کروم
  • امکان لود شدن تب ها وقتی روی آنها کلیک شد در Opera منو یاد فایرفاکس میندازه (کروم این قابلیت رو نداره)
  • سرعت Opera کمی بیشتره و مصرف کمتر حافظه رم کمتری داره

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

۲۸ دی ۹۴ ، ۰۹:۰۰ ۲ نظر موافقین ۰ مخالفین ۰
سعید زرین فام

رابطه بین بهانه تراشیدن و بی هدفی!

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

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

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

 

 

پ.ن.۱. بگم که من خودم خیلی دوست دارم انسان بهانه تراشی نباشم ولی... wink

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

۱۹ دی ۹۴ ، ۱۴:۲۰ ۲ نظر موافقین ۰ مخالفین ۰
سعید زرین فام

کپی فایل های موجود در یک Playlist در Rhythmbox با استفاده از Java 8

من برای گوش دادن موسیقی در اوبونتو از Rhythmbox استفاده می کنم و خیلی ازش راضیم بخصوص از این قابلیتش که تعداد دفعات گوش دادن به یک آهنگ رو نشون میده و بمرور زمان می تونی بفهمی از چه آهنگ هایی بیشتر خوشت میاد و به راحتی هم میزاره بر اساس همین تعداد دفعات گوش دادن Playlist درست کنی. حالا مشکل من از اینجا شروع شد که میخواستم آهنگ های موجود در Playlist مربوط به آهنگ هایی که بیشتر گوش دادم رو بریزم تو USB که بتونم تو ماشین و تلویزیون گوششون کنم ولی Rhythmbox فقط این امکان رو داره که Playlist هارو روی CD یا DVD رایت بزنه! حالا تو این همه فولدر باید چطوری این فایل هارو پیدا می کردم و کپیشون می کردم رو USB. به سرم زد که این کارو با Stream های Java 8 انجام بدم. با یه رفیق پایه دو نفری حدود ۴۵ دقیقه ای کد جاوا نوشتیم که این کارو انجام میده. ابتدا Playlist مورد نظرمو در قالب فایل با پسوند pls ذخیره کردم و بعد با Stream های Java 8 خط به خط پردازشش کردم:

import java.io.*; 
import java.net.URLDecoder; 
import java.nio.channels.FileChannel; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.util.stream.Stream; 
 
public class Main { 
 
    public static void main(String args[]) { 
 
        String playlistName = "my top.pls"; 
 
        try (Stream<String> stream = Files.lines(Paths.get(playlistName))) { 
 
            stream.filter(line -> line.startsWith("File")) 
                    .map(fileLine -> getFileName(fileLine.split("file://")[1])) 
                    .forEach(fileName -> copyFile(fileName)); 
 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
 
    } 
 
    private static String getFileName(String s) { 
        try { 
            return URLDecoder.decode(s, "UTF-8"); 
        } catch (UnsupportedEncodingException e) { 
            e.printStackTrace(); 
        } 
 
        return ""; 
    } 
 
    private static void copyFile(String fileName) { 
        String[] parts = fileName.split("/"); 
 
        File fileToCopy = new File(fileName); 
        File newFile = new File("/home/saeed/Desktop/rhythmbox-playlist/saeed-playlist/" + parts[parts.length - 1]); 
 
        try { 
            try (FileInputStream inputStream = new FileInputStream(fileToCopy); 
                 FileOutputStream outputStream = new FileOutputStream(newFile) 
            ) { 
                FileChannel inChannel = inputStream.getChannel(); 
                FileChannel outChannel = outputStream.getChannel(); 
                inChannel.transferTo(0, fileToCopy.length(), outChannel); 
            } 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
 
    } 
 
 
}

 

۱۳ دی ۹۴ ، ۲۲:۲۷ ۰ نظر موافقین ۲ مخالفین ۰
سعید زرین فام

استفاده از AspectJ annotation and Spring AOP در Play Framework 2.3

از وقتی Play Framework رو با Spring ستاپ کردیم و در پروژه ها استفاده می کنیم انگار قدرت Play Framework چند برابر شده. یکی از مزایای Spring Framework، کتابخانه Spring AOP هستش که با استفاده از مفاهیم Aspect Oriented و بکارگیری AspectJ می تونه قدرت Play و Spring رو چند برابر کنه و یکی از مهمترین مزیت هاش اینه که Cross-cutting concern ها را براحتی از لایه های معماری حذف کنه. به همین منظور در این پروژه github نحوه ستاپ AspectJ annotation and Spring AOP با Play Framework و Spring رو قرار دادم که اگه بقیه هم خواستند بتونن استفاده کنن.

 

پ.ن. پروژه و تنظیماتش مربوط به Play Framework 2.3 هستش.

 

شاد باشید.

۰۷ دی ۹۴ ، ۱۰:۲۶ ۰ نظر موافقین ۱ مخالفین ۰
سعید زرین فام

زندگی در جریان است

اتفاق های خوب و بد میان و میرن و مهمترین نکته اینه که ما بدونیم زندگی در جریانه.

همین...

۰۷ دی ۹۴ ، ۰۸:۳۹ ۰ نظر موافقین ۱ مخالفین ۰
سعید زرین فام

برنامه نویسی Functional در Java 8 در ابتدای راه

من برنامه نویسی Functional رو با Scala یاد گرفتم، Java 8 امکانات Functional خوبی اضافه کرده ولی در برابر Scala واقعا حرفی برای گفتن نداره همونطور که Scala در زمینه community و library در برابر جاوا حرفی برای گفتن نداره (هر چی باشه من بالاخره جاوا کارم wink).

فکر کنم برای community بزرگ توسعه دهندگان جاوا، عرضه Java 8 اولین قدم کوچک برای رفتن به سمت برنامه نویسی Functional باشه. علاوه بر یکسری امکانات مهم در برنامه نویسی Functional مثل pattern matching و ... که در جاوا وجود نداره، حجم عظیم library های دنیای جاوا هم هنوز Functional نیستند و از Lambda Expression، انواع داده Optional یا CompletableFuture و ... استفاده نمی کنند. library های مهمی مثل JUnit یا JPA و ... باید در نسخه های بعدی تغییرات بزرگی داشته باشند و با مفاهیم Functional در Java 8 بازنویسی شوند.

Java 8 در سال ۲۰۱۴ عرضه شده و در حال حاضر با گذشت حدود ۲ سال، هنوز community بزرگ توسعه دهندگان جاوا حرکت چشمگیری برای رفتن به سمت Functional شدن انجام نداده. هنوز هم ما از انواع داده mutable استفاده می کنیم، متد های ما نوع Optional بر نمی گردانند و استفاده از sream  ها و Lambda Expression در کدنویسی ما مرسوم نشده و کماکان از if else استفاده بیشتری می کنیم تا map و flatMap.

من خیلی خوشحالم که تجربه برنامه نویسی Functional رو با Scala شروع کردم و همچنین تو همون دنیا با reactive بودن سیستم آشنا شدم. همین باعث شده الان که برنامه نویسی Functional در Java 8 رو می بینم هم خوب درکش کنم و هم بسادگی بفهمم که دنیای جاوا چقدر راه داره تا از این نظر به دنیای Scala برسه (از ابعاد دیگه جاوا خیلی قویتر و جلوتره laugh).

۲۹ آذر ۹۴ ، ۱۱:۴۱ ۳ نظر موافقین ۱ مخالفین ۰
سعید زرین فام

چرا کماکان از inoreader استفاده می کنم و از feedly استفاده نمی کنم

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

مزایای inoreader که feedly کماکان ندارد:

  • امکان مشاهده متن کامل یک فید هم در نسخه موبایل هم وب و هم برای فید سایت های فیلتر شده و تحریمی (این قابلیت در feedly موبایل وجود نداره).
  • sync بودن کامل نسخه موبایل و وب (feedly نسخه موبایل یکسری فید های خونده شدرو mark as read نمی کنه).
  • رابط کاربری شبیه گوگل ریدر! (رابط کاربری feedly وب خیلی درهم برهمه)

مزایای feedly

  • جامعه کاربری بزرگتر (برای فهمیدن اینکه یک فید چقدر طرفدار داره)
۲۷ آذر ۹۴ ، ۱۱:۴۳ ۰ نظر موافقین ۱ مخالفین ۰
سعید زرین فام

تحمل این روزهای سخت

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

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

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

این روزا آهنگ پیش درآمد علی عظیمی رو زیاد گوش میدم:

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

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

۲۱ آذر ۹۴ ، ۲۱:۴۹ ۲ نظر موافقین ۲ مخالفین ۰
سعید زرین فام

دوره های جاوا و Java EE آموزشگاه برنامه نویس

بروزرسانی: بنده دیگر هیچگونه همکاری با آموزشگاه برنامه نویس ندارم.

 

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

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

 

طبق توافقات انجام شده، آموزشگاه برنامه نویس از این پس دوره های مرتبط با جاوا و Java EE برگزار خواهد کرد و بنده نیز مدرس دوره ها خواهم بود. برای شروع، دوره آموزشی Java SE 8 (برنامه نویسی Core Java) برنامه ریزی شده است و در آینده سایر دروه ها نیز زمانبندی و برنامه ریزی می شود.

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

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

۲۰ آذر ۹۴ ، ۱۱:۲۷ ۴ نظر موافقین ۱ مخالفین ۰
سعید زرین فام

کتاب گوگل چگونه کار می کند

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

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

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

در طول کتاب با واژه ای با نام "خلاق باهوش" آشنا می شوید، درباره نحوه صحیح جذب نیرو، مدیریت جلسات، مذاکره با افراد و ...

 

نکات:

  • من خلاق باهوش نیستم.
  • این کتاب رو هم از دیجی کالا خریدم.
۱۳ آذر ۹۴ ، ۱۲:۴۲ ۱ نظر موافقین ۱ مخالفین ۰
سعید زرین فام

سکوت

ﺳﮑﻮﺕ ﮐﻦ !..
ﻫﻨﮕﺎﻣﯿﮑﻪ ﻧﻤﯿﺪﺍﻧﯽ ﭼﻪ ﺑﮕﻮﯾﯽ ، 
ﭼﻪ ﭘﺎﺳﺦ ﺩﻫﯽ ﻭ ﯾﺎ ﭼﻄﻮﺭ ﺑﮕﻮﯾﯽ ، 
ﻓﻘﻂ ﺳﮑﻮﺕ ﮐﻦ!

ﮔﺎﻫﯽ ﻧﮕﻔﺘﻦ 
ﺷﯿﺮﯾﻦ ﺗﺮ ﺍﺯ ﮔﻔﺘﻦِ ﺳﺨﻨﺎﻥِ ﺁﺷﻔﺘﻪ ﺍﺳﺖ 
ﮐﻪ ﺩﺭ ﻟﺤﻈﻪ ﺗﻮ ﺭﺍ ﺳﺒﮏ ﻣﯿﮑﻨﺪ ... ﺩﺭ ﺁﻥ ﻟﺤﻈﻪ ﺳﮑﻮﺕ ﮐﻦ .

ﯾﮏ ﻭﻗﺘﻬﺎﯾﯽ ﺳﻌﯽ ﮐﻦ ﭼﺸﻤﺎﻧﺖ ﺭﺍ ﺑﺒﻨﺪﯼ ﺑﺮ ﺣﺮﻓﻬﺎﯼ ﻧﯿﺶ ﺩﺍﺭ ،
و ﺳﮑﻮﺕ ﮐﻨﯽ ، 
ﻭ ﺑﻪ ﺯﺑﺎﻧﺖ ﺍﺟﺎﺯﻩ ﺩﻫﯽ ﺳﮑﻮﺕ ﺭﺍ ﺗﻤﺮﯾﻦ ﮐﻨﺪ ...
ﺁﻥ ﺭﻭﺯﻫﺎ ﮐﻪ ﻧﻔﻬﻤﯿﺪﯼ ﭼﻪ ﺷﺪ 
ﻭ ﺍﺯ ﮐﺠﺎ ﺑﺮ ﺳﺮﺕ ﺁﻭﺍﺭِ ﻣﺼﯿﺒﺖ ﺁﻣﺪ ، 
ﮐﺴﯽ ﺭﺍ ﻣﻘﺼﺮ ﻧﮑﻦ ، 
ﺳﮑﻮﺕ ﮐﻦ ﺗﺎ ﺩﻟﯿﻞِ ﺍﺻﻠﯽ ﺭﺍ، ﺩﺭ ﺁﺭﺍﻣﺶ ﺑﯿﺎﺑﯽ !
ﺩﻗﯿﻘﻪ ﻫﺎﯾﯽ ﮐﻪ ﺣﺲِ ﺍﻧﻔﺠﺎﺭ ﺩﺭ ﺳﻠﻮﻟﻬﺎﯾﺖ ﺗﻮ ﺭﺍ ﺍﺯ ﺩﺭﻭﻥ ﻣﯿﺨﻮﺭﺩ ،
ﺳﮑﻮﺕ ﺭﺍ ﺗﺠﺮﺑﻪ ﮐﻦ ،
ﮐﻪ ﺫﻫﻨﺖ ﺑﺎ ﺁﺭﺍﻣﺶ ﺑﺎ ﻗﻠﺒﺖ ﻣﺸﻮﺭﺕ ﮐﻨﺪ 
ﻭ ﺗﺼﻤﯿﻤﯽ ﺩﺭﺳﺖ ﺑﮕﯿﺮﺩ .

ﯾﮏ ﻭﻗﺖ ﻫﺎﯾﯽ " ﺳﮑﻮﺕ " ﭘﺎﺳﺦِ ﻫﻤﻪ ﯼ ﺩﺭﺩﻫﺎﺳﺖ .......

-----------------------------------------------------------------------------

 

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

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

۱۱ آذر ۹۴ ، ۰۸:۱۸ ۰ نظر موافقین ۱ مخالفین ۰
سعید زرین فام

جواب یاب برای من یک عشق است تا بیزینس!

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

  1. چالش های فنی
  2. چالش های بیزینسی
  3. چالش های محتوایی

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

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

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

۰۹ آذر ۹۴ ، ۰۹:۰۷ ۰ نظر موافقین ۲ مخالفین ۰
سعید زرین فام