During learn and experience

۶ مطلب در دی ۱۳۹۴ ثبت شده است

اولین پروژه جدی با 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 هستش.

 

شاد باشید.

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

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

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

همین...

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