During learn and experience

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

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.

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

کدنویسی به سبک اسکالا با استفاده از 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 های مختلف چه با الگو گرفتن از این لایبرری.

 

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

 

شاد باشید.

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

دوره های جدید آموزش اسکالا و برنامه نویسی Functional در Coursera

خبر خوب برای علاقه مندان به اسکالا، برنامه نویسی Functional و تکنولوژی های مرتبط با اسکالا مثل Spark اینه که سایت Coursera بهمراه دانشگاه EPFL علاوه بر دوره های قدیمی که برای آموزش در این زمینه داشتند، چند دوره جدید رو هم اضافه کردند که علاقه مندان می تونن  رایگان از آنها استفاده کنند:

این کار دانشگاه EPFL و سایت Coursera خیلی عالیه. سطح دوره ها از بالا به پایین سخت تر میشه و بهتره به ترتیب از بالا شروع کنید. نگران نباشید بعضی از دوره ها که ثبت نامشون تموم شده پس از اتمام دوره در حال برگزاری مجددا ثبت نام میکنن.

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

 

شاد باشید.

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

استفاده از 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 رشد کنه ولی در کل تجربه خوبی بود.

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

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

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

IntelliJ IDEA Community Edition بهترین IDE رایگان برای برنامه نویسی اسکالا

برای برنامه نویسی اسکالا IDE ها و Editor های زیادی وجود نداره ولی از بین Scala IDE، IntelliJ IDEA ، Atom و Emacs پیشنهاد من IntelliJ IDEA است. اگر هم اهل استفاده از نرم افزار های کرک شده نیستید IntelliJ IDEA Community Edition در زمینه برنامه نویسی اسکالا تمام قابلیت های نسخه Ultimate رو داره. تنها محدودیت IntelliJ IDEA Community Edition در پشتیبانی از Play Framework که فقط در نسخه Ultimate وجود داره.

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

استفاده از Scala و pattern matching برای پردازش آرایه ای از بایت ها

برخی از سیستم ها بدلیل حجم بالای تراکنش  بمنظور کاهش حجم اطلاعات رد و بدل شده بین کلاینت و سرور، اطلاعات را در سطح بایت برای کلاینت های خود ارسال می کنند (آرایه ای از بایت)، یکی از سیستم های بورس کالای ایران با همین روش پیاده سازی شده است و تمام اطلاعاتی که بین کلاینت ها و این سیستم رد و بدل می شود در قالب آرایه ای از بایت ها است.
حالا پردازش در سطح بایت و پردازش ساختار packet های دریافتی کار دشواری است چون چند بایت اول هر packet مشخص می کند که نوع packet دریافتی چیست و باید چگونه با آن رفتار کرد. پیاده سازی همچین پارسری با Scala و قابلیت pattern matching آن خیلی ساده و لذت بخش است:
def receive = { 
  case Array( 23 , tail @ _*) => 
    log.info("received packet type 23") 
    parseType23(tail) 
  case _ => 
    log.info("Unknown packet") 
}
البته جزئیات و پیچیدگی های بسیار زیادی برای پیاده سازی اینگونه سیستم ها وجود دارد که خوشبختانه با امکانات زبان Scala و library های قدرتمند آن مثل Akka کار کمی آسانتر می شود.
 
شاد باشید.
۱۷ شهریور ۹۴ ، ۱۰:۳۴ ۰ نظر موافقین ۰ مخالفین ۰
سعید زرین فام

تولید سرویس REST با استفاده از Play Framework 2.4، Scala و ReactiveMongo

پروژه ReactiveMongo هنوز به نسخه ۱ نرسیده ولی کاملا آماده و قابل استفاده در پروژه های عملیاتیه. قبلنا مستندات سایت ReactiveMongo کامل نبود، البته نه که فکر کنید الان کامله ولی باز خیلی بهتر از قبله و قسمت مستندات سایتشو کلی کامل کردن. اما بازم وقتی یه تازه کار وارد اون قسمت میشه ممکنه یکم گیج بشه. من در اینگونه مواقع دنبال یه sample project می گردم.
یک پروژه درست کردم و توی github گذاشتم، این پروژه توضیحات مستند مربوط به Play2-ReactiveMongo سایت ReactiveMongo رو در قالب یک مثال قابل اجرا برای تولید سرویس REST آورده.

امیدوارم بدرد تازه کارها بخوره.

شاد باشید.

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

بالا رفتن محبوبیت زبان برنامه نویسی اسکالا بخاطر Apache Spark

در بین ده ها زبان های برنامه نویسی که برای JVM وجود دارند، تا به حال فقط جاوا (بعنوان زبان برنامه نویسی پیشفرض بر روی JVM) محبوبیت فراوانی بین توسعه دهندگان نرم افزار بدست آورده است و طبق آمار های موجود محبوبترین زبان برنامه نویسی بین توسعه دهندگان است.
با وجود فریمورک هایی مثل Akka یا Play یا  Scalatra که با زبان برنامه نویسی اسکالا توسعه داده شده اند باز هم محبوبیت این زبان در سطح  بالایی نبود.

با حضو پروژه Apache Spark و در ادامه آن Apache Kafka که با زبان برنامه نویسی اسکالا پیاده سازی شده اند و محبوبیت شدید آنها در مباحث big data و cluster computing، محبوبیت زبان اسکالا نیز در حال بالا رفتن است. 

به نظر من Apache Spark باعث شده جنبه های برنامه نویسی functional اسکالا بیشتر مورد توجه قرار گیرد و اسکالا که به زبان بعدی بر روی JVM مشهور بود تبدیل به یک زبان برنامه نویسی مناسب functional برای مباحث big data, cluster computing و distributed system شود و یجورایی کم کم از زیر سایه JVM و زبان جاوا خارج بشود.
۲۳ تیر ۹۴ ، ۱۰:۰۲ ۰ نظر موافقین ۱ مخالفین ۰
سعید زرین فام

استفاده از Scala در مسابقه برنامه نوسی بیان

فکر کنم ماه پیش بود که به سرم زد توی مسابقه برنامه نویسی بیان شرکت کنم و جواب سوال هارو هم با Scala بدم!
دور اول مسابقه که تمرینی بود که مسافرت بودیم و نشد شرکت کنم ولی خلاصه امروز یه سوالشو حل کردم اونم با Scala و سبک functional خیلی حال داد، اگه می خواستم با جاوا بنویسم باید کلی if و حلقه for میزاشتم ولی با Scala خیلی تمیز نوشته شد.
حالا با حل همین یه سوال هم رفتم مرحله بعد.

میگن سر پیری معرکه گیری. یاد ۱۰ سال پیش افتادمو مسابقات ACM. 
۱۸ مهر ۹۳ ، ۱۲:۴۰ ۰ نظر موافقین ۰ مخالفین ۰
سعید زرین فام

امروز هفته اول کورس Functional Programming Principles in Scala در coursera

امروز هفته اول کورس Functional Programming Principles in Scala در coursera شروع شد. خیلی عالیه. خود Martin Odersky مطالبو تنظیم کرده.
۲۴ شهریور ۹۳ ، ۲۲:۰۲ ۰ نظر موافقین ۰ مخالفین ۰
سعید زرین فام

Scala : a mixed programming language

Scala’s design has been influenced by many programming languages and ideas in programming language research. In fact, only a few features of Scala are genuinely new; most have been already applied in some form in other languages. Scala’s innovations come primarily from how its constructs are put together. In the following list you can see main influences programming language to scala:

  1. Java : Large part of the syntax , basic type , class libraries and execution model.
  2. C# : Large part of the syntax.
  3. Smalltalk : uniform object model and treating.
  4. Ruby : uniform object model.
  5. Eiffel : uniform access principle for method invocation and field selection.
  6. Haskell : functional programming approach and implicit parameters.
  7. F# : functional programming approach.
  8. Erlang : actor-based concurrency library.
  9. C++ : operator overloading and template system.
  10. Lisp : flexible syntax for building internal domain-specific languages.
Scala has also contributed some innovations to the field of programming languages. For example:
  1. abstract types (alternative to generic types)
  2. traits for flexible component assembly.
  3. extractors a representation-independent way to do pattern matching.
source : Programming in Scala: A Comprehensive Step-by-step Guide by Martin Odersky, Lex Spoon, and Bill Venners

have a nice time.
۲۹ مرداد ۸۹ ، ۱۴:۳۳ ۰ نظر موافقین ۰ مخالفین ۰
سعید زرین فام