• Small mind on software engineering
  • Recently an old trend brought up in our country - Social network for Vietnamese. The trend is initialised by our Minister of Information and Communications. It’s funny after years trying to do the same thing again and again, we must admit building a local social network is a wrong way, and we’re still going to do it again. It’s not only funny but also a waste of time and resource, follow a wrong trend, many local company will restart old project and put software engineers in to that project, on a dream to build thing users never expect to use....
  • Tổng quan fold, foldLeft & foldRight
  • foldLeft được implement như sau: override /*TraversableLike*/ def foldLeft[B](z: B)(@deprecatedName('f) op: (B, A) => B): B = { var acc = z var these = this while (!these.isEmpty) { acc = op(acc, these.head) these = these.tail } acc } Như vậy foldLeft là một curried function với tham số đầu vào (giá trị bắt đầu) là z có kiểu là B, và một function op. op có tham số đầu vào là 2 biến có kiểu B và A, và giá trị trả về có kiểu là B. Hàm foldLeft dùng while loop (không dùng đệ quy), và thực hiện...
  • 10 minutes, less than 100 lines of scala, implement your own blog engine
  • This post inspired by Li Haoyi’s post, where he explains how to create a blog engine in Scala Script in 15 minutes. In that blog post, Li Haoyi also showed that Scala used to be a tool to build serious enterprise, big data, machine learning business. With all of buzz words and projects that make up Scala ecosystem, new comer is less likely to feel comfortable, or willing to learn scala, because they think it’s difficult, but it’s really not (in some case). Developers often express their works and life by writing blog, we’ve seen many blog engine written in...
  • Ứng dụng currying trong scala
  • Currying Theo như wikimedia In mathematics and computer science, currying is the technique of translating the evaluation of a function that takes multiple arguments (or a tuple of arguments) into evaluating a sequence of functions, each with a single argument. Currying is related to, but not the same as, partial application. Như vậy, nếu như chúng ta có một function: f(x, y) = x+y thì ta có thể thực thi hàm tuần tự: f(x, y) = h(x) + g(y) trong đó h(x) = x và g(y) = y Nếu trong một thời điểm nào đó, ta có được giá trị...
  • Scala basic - tổng quan về hàm trong scala
  • Scala cho chúng ta nhiều cách để khai báo function, trong đó có: Local function (ví dụ bên dưới có vẻ ngu ngốc, vì ta hoàn toàn có thể dùng filter với anonymous function x.filter(_ > 1) , nhưng nó nói lên được ý nghĩa của local function và phần nào làm rõ nghĩa được filter method của List def filterInt(x: List[Int]): List[Int] = { def f(y: Int, z: Int) = { y > z } x.filter(f(_, 1)) } First-class Function: Không như cách chúng ta khai báo một hàm và gọi hàm đó bằng tên, như ví dụ bên...
  • Scala Basic - Extractor
  • package extractor object RegexExtractor { def main(args: Array[String]): Unit = { val video = ".*\\/(.*)-([0-9]+).*".r def process(path: String) = path match { case video(name, id) => println(name, id) case _ => () } val videoUrl = "/phim/night-light-i2-4538/" process(videoUrl) } } Representation independence Chúng ta đã nói về Scala pattern matching, và phần nào thấy được sự tiện dụng cũng như việc dùng case class kết hợp với sealed class giúp người lập trình làm việc nhanh hơn, hạn chế số dòng code và các lỗi tiềm ẩn có thể xảy ra với những logic phức tạp. Mặc dù case class...
  • On writing php 7 extension, or How do I write a php extension
  • Our company has a long history of moving technical stack from here to there. At first everything was built on PHP, with Memcached, MySQL. Now we’re moving to Java, use diferent technologies for backend, and frontend application: new webserver, new database system, some is inhouse, some is opensource database (redis, for example). The hard thing about maitaining both old and new architecture is we have to keep both well functional, at its best performance, with updated features, everything cannot be migrated at once, and the result is we have to strike to solved many performance issues of the old php...