During learn and experience

۱۲ مطلب با موضوع «Java 8» ثبت شده است

How Java 8 killed the Strategy Pattern

I have read a nice article about "How Scala killed the Strategy Pattern". In this article there is a sample Java implementation of Strategy Pattern from wikipedia but this implementation use old Java syntax (prior Java 8). I implement Scala sample using Java 8 syntax and show that how Java 8 killed the Strategy Pattern:

public class Main { 
 
    @FunctionalInterface 
    interface Function3 <A, B, C, R> { 
        public R apply (A a, B b, C c); 
    } 
 
    public static void main(String[] args) { 
        BiFunction<Integer, Integer, Integer> add = Math::addExact; 
        BiFunction<Integer, Integer, Integer> subtract = Math::subtractExact; 
        BiFunction<Integer, Integer, Integer> multiply = Math::multiplyExact; 
 
        Function3<BiFunction<Integer, Integer, Integer>, Integer, Integer, Integer> execute = (callback, x, y) -> callback.apply(x, y); 
 
        System.out.println("Add:      " + execute.apply(add, 3, 4)); 
        System.out.println("Subtract: " + execute.apply(subtract, 3, 4)); 
        System.out.println("Multiply: " + execute.apply(multiply, 3, 4)); 
    } 
} 

This implementation is more verbose than the Scala one but it is much better than the old one.

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

کارگاه دو روزه رایگان برنامه نویسی Functional در جاوا ۸ (دوره چهارم)

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

خیلی دوست داشتم یجوری توی این دوره Javaslang رو هم جا بدم ولی هم زمان کارگاه کمه و هم یکم سبک فانکشنال Javaslang متفاوت از چیزیه که توی Java 8 وجود دارد و خیلی هم با هم همپوشانی دارن ولی حتما اشاره ای به Javaslang هم می کنم.

 

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

کدنویسی به سبک اسکالا با استفاده از Javaslang در جاوا 8

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

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

 

pattern matching:

Number plusOne = Match(obj).of(
    Case(instanceOf(Integer.class), i -> i + 1),
    Case(instanceOf(Double.class), d -> d + 1),
    Case($(), o -> { throw new NumberFormatException(); })
);

functional For:

Iterator<String> iterator =
    For(persons.filter(Person::hasAddress), p ->
        For(p.addresses).yield(a ->
             p.name + "," + a.street
        )
    );

 

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

 

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

 

شاد باشید.

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

معرفی کتاب Java 8 in Action: Lambdas, Streams, and functional-style programming

پس از سال ها و بعد از Java 5 یک نسخه انقلابی دیگر از جاوا عرضه شده است و کم کم پس از گذشت بیشتر از دو سال، جامعه توسعه دهندگان جاوا در حال وفق دادن خود با امکانات و سیسنتکس های جدید آن هستند. اصلی ترین قابلیت های Java 8 حول و حوش افزودن امکانات لازم برای کمی functional کردن جاوا بوده است تا کم کم جاوا از یک زبان برنامه نویسی imperative به یک زبان hybrid تبدیل شود ولی به نظر من امکانات اضافه شده در Java 8 برای پشتیبانی از سبک برنامه نویسی Functional بیشتر در حد syntactic sugar بوده و بدلیل backward compatible نگه داشتن جاوا در نسخه ۸ جاوا فقط کمی Functional شده است و اگر کسی با مفاهیم برنامه نویسی Functional آشنایی داشته باشد متوجه می شود که جاوا کماکان خیلی بیشتر imperative است تا Functional.

 

اگر برای یادگیری جاوا ۸ بدنبال یک منبع مطمئن و کامل هستید به شما کتاب Java 8 in Action  را پیشنهاد می کنم. مزیت اصلی این کتاب این است که علاوه بر اینکه با جزئیات فراوان و دقیق قابلیت های جدید جاوا ۸ را معرفی کرده، تمرکز زیادی بر معرفی سبک برنامه نویسی Functional داشته است و بصورت کامل خواننده را با دنیای برنامه نویسی Functional آشنا می کند که این کار بخصوص برای توسعه دهندگان جاوا که آشنایی کمتری با این سبک دارند عالی می باشد.

 

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

 

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

استفاده از Akka در Kotlin

زبان برنامه نویسی Kotlin به تازگی نسخه یکش عرضه شده و بنظر میرسه داره کم کم جای خودشو بین توسعه دهندگان بخصوص توسعه دهندگان روی JVM باز میکنه. اگه بخام Kotlin رو با اسکالا مقایسه کنم که بنظرم حرفی برای گفتن نداره ولی خب به نسبت جاوا امکانات خیلی بیشتری داره. مرور زمان و بزرگ شدن code base پروژه هایی که از Kotlin استفاده می کنند مشخص میکنه Kotlin تا کجاها میتونه جلو بره و محدودیت هاش چیه.

یکی از قابلیت های Kotlin تعامل (interoperability) خوب اون با کدهای جاوا است. برای همین سعی کردم یک پروژه درست کنم و از Akka java API در اون پروژه Kotlin استفاده کنم و ببینم میشه برنامه Akka با Kotlin نوشت.

پروژه کامل رو در github قرار دادم که در حد یک hello work در akka، البته کد معادل جاوا هم در پروژه وجود داره:

package hello

import akka.actor.*
import akka.dispatch.OnComplete
import akka.pattern.Patterns.ask;
import scala.concurrent.Await
import scala.concurrent.Future;
import scala.concurrent.duration.Duration
import java.util.concurrent.TimeUnit

fun main(args: Array<String>) {
    val system = ActorSystem.create("MySystem")
    val myActor = system.actorOf(Props.create(MyActor::class.java), "myActor")
    val testActor = system.actorOf(Props.create(TestActor::class.java), "testActor")

    myActor.tell("test", testActor);
    testActor.tell("ask", myActor);

}

class MyActor : UntypedActor() {

    data class Greeting(val from: String)

    object Goodbye

    override fun onReceive(message: Any?) = when (message) {
        "test" -> println("received test")
        is Greeting -> {
            println("I was greeted by " + message.from)
            sender.tell("hello " + message.from, self)
        }
        is Goodbye -> println("Someone said goodbye to me.")
        else -> println("received unknown message")
    }
}

class TestActor : UntypedActor() {
    override fun onReceive(message: Any?) {
        when (message) {
            "ask" -> {
                println("received ask")
                val future: Future<Any> = ask(sender, MyActor.Greeting("Saeed"), 5000)

                future.onComplete(object : OnComplete<Any?>() {
                    override fun onComplete(failure: Throwable?, result: Any?) {
                        if (failure != null) {
                            println("We got a failure, handle it here")
                        } else {
                            println("result = " + result as String)
                        }
                    }
                }, context.dispatcher())
            }
            else -> println("received unknown message")
        }
    }
}

همونطور که توی کد میبینید دستور when یجورایی یه switch case پیشرفته جاوا و اصلا با pattern matching اسکالا قابل مقایسه نیست. data کلاس های Kotlin کاربرد خوبی برای تعریف پیغام ها در Akka داره (از استاتیک اینر کلاس در جاوا بهتره). از monad و این چیزا هم در Kotlin خبری نیست که نشون میده اسکالا چه زبان قدرتمندیه.

استفاده از Akka Scala API در Kotlin تقریبا غیر ممکنه چون بسیاری از توابع و کلاس های اسکالا no name provided هستند.

نکته عجیب دیگه ای هم که مشاهده کردم این بود که Intellij Idea که IDE رسمی Kotlin چند تا از سینتکس های Kotlin رو نمی تونست پارس کنه و error الکی میده!

بمنظور پرسیدن سوال و تبادل نظر یک نسخه از discourse بالا آوردن که خیلی جالبه.

در نهایت فکر می کنم Kotlin هنوز جای کار داره و بنظرم در خوشبینانه ترین حالت بتونه در حد groovy رشد کنه ولی در کل تجربه خوبی بود.

۲۲ ارديبهشت ۹۵ ، ۰۰:۰۳ ۰ نظر موافقین ۲ مخالفین ۰
سعید زرین فام

Play Framework 2.5 عرضه شد، سازگاری بیشتر با جاوا 8 و Java EE کماکان عقب مانده

Play Framework در هر نسخه بالغتر و کاملتر میشه و من خیلی خوشحالم که از نسخه 2.1 شاهد این فرایند بودم.

بر خلاف گفته های توسعه دهندگان Play Framework که استفاده از Akka streams بجای iteratee مهمترین تغییر در Play Framework 2.5 بوده است ولی به نظر من تغییرات Java API در Play Framework 2.5 خیلی مهمتر بوده، در Play Framework 2.5 تمام کلاس هایی که توسعه دهندگان Play Framework برای پشتیبانی از asynchronous functional programming به Play اضافه کرده بودند (مانند F.Option یا F.Promise و ...) با معادل های جاوا 8 آن جایگزین شده اند:

  • استفاده از functional interface های جاوا 8: استفاده از Runnable, Consumer, Predicate, و ... بجای Function0، Function ، Callback و ...
  • استفاده از Optional بجای F.Option
  • استفاده از CompletionStage بجای F.Promise

این تغییرات باعث میشه که کدنویسی در Play با استاندارد های برنامه نویسان جاوا سازگاری کامل داشته باشه. این درحالیه که Java EE بعنوان مرجع اصلی برنامه نویسی وب و Enterprise در دنیای جاوا همیشه کمترین و دیرترین سازگاری رو با نسخه های جدید جاوا دارد!

یکی دیگر از تغییرات مهم Play Framework 2.5 برای توسعه دهندگان جاوا، فراهم شدن API های جدیدی در Play Framework 2.5 است که تا قبل از این نسخه فقط برای زبان اسکالا وجود داشت:

  • HttpRequestHandler: اجازه دستگاری درخواست رسیده به سرور با زبان جاوا  قبل از رسیدن آن به router را می دهد.
  • EssentialAction: پیاده سازی Action های سطح پایین با زبان جاوا.
  • EssentialFilter و Filter: نوشتن فیلتر با استفاده از زبان جاواو
  • BodyParser: نوشتن Body Parser سفارشی با زبان جاوا.

در هر نسخه جدید Play Framework همیشه بهبود performance هم وجود داره که در این نسخه به نسبت نسخه 2.4 حدود ۲۰ درصد بهبود performance داشتیم.

یک قابلیت جدید Play Framework 2.5 که زیاد بهش پرداخته نشده پشتیبانی وب سرور Play یعنی Netty از native socket transport در لینوکس است که باعث میشه Play Framework بر روی لینوکس performance بهتری داشته باشه.

 

لیست کامل تغییرات در Play Framework 2.5

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

استفاده از 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 ها استفاده می کنیم.

 

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

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

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

 

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

 

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

کپی فایل های موجود در یک 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(); 
        } 
 
    } 
 
 
}

 

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

برنامه نویسی 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).

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

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

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

 

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

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

 

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

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

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

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

دوره رایگان توسعه REST API با Play Framework (جاوا)

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

 

دوره رایگان توسعه REST API با Play Framework (جاوا)

مدرس: سعید زرین فام

مدت دوره:۱۲ ساعت

محتوای دوره: در این دوره بصورت عملی مفاهیم Java 8 - Play Framework - Spring - JPA - Automatic Test در قالب پروژه توسط دانشجویان پیاده سازی می شود، ابزار های محیط توسعه عبارتند از Ubuntu 14.04 - Intellij Idea - Git

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

نحوه ثبت نام: ارسال رزومه به ایمیل javajobs@rayanhamafza.com .

زمان شروع دوره: پس از ثبت نام و قبولی در آزمون تعیین سطح به دانشجویان اعلام می شود.

محل برگزاری : مطهری - لارستان

 

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

 

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