This post, is the first in a series of post that I will be writing about Modules in TypeScript. It is a continuation of the process of jotting down the various things I learnt while building ip-num. The previous post like this one, was Declaration Files in TypeScript: An Introduction. In which I shared how I came to wrap my head around declaration files in TypeScript.
Since the topic of Modules is quite an expansive one, instead of jamming everything I need to write into one blogpost, I will be spreading it out, across various posts, that would be published in the coming weeks/months.
This post is to get the ball rolling on that, and It would focus mainly on introducing the concepts of modules as we have them within the JavaScript ecosystem.
Since TypeScript is but a superset of JavaScript and JavaScript is still its only transpiler target, one really cannot get away from having to understand how things work in the JavaScript land in other to be able to deeply understand how various aspects of TypeScript fits together.
Modules are just one example of this.
Saturday, December 08, 2018
Monday, October 01, 2018
Saturday, September 22, 2018
Easing Into Cats, And The Case For Category Theory Inspired Abstractions
Cats is a lightweight, modular, and extensible library for functional programming in Scala. On its website, it is stated that the name “cats” is a playful shortening of the word, category - so it has nothing to do with the animal: cat (if you ever wondering), but with category theory :)
It is a library that I have personally found to be helpful in making functional programming in Scala less confusing. It does this by being more concrete and more obvious with regards the various patterns and abstractions that arises from a valid logical conclusion of programming with functions in a statically typed language that has higher-kinded types.
Unfortunately, due to the relative unfamiliarity with functional programming and the various abstraction that comes with it, the Cats library is usually approached with hesitation amongst a sizable amount of software developers.
The sentiments I have seen expressed directly or indirectly is that introducing Cats would inadvertently fling developers into the deep ends of various unknown, academic and good for nothing, category theory inspired abstractions, that only confuses and add complexity. Since nobody wants this, the decision usually gets made not to bother with a library like Cats.
Nothing can be farther from the truth.
It is a library that I have personally found to be helpful in making functional programming in Scala less confusing. It does this by being more concrete and more obvious with regards the various patterns and abstractions that arises from a valid logical conclusion of programming with functions in a statically typed language that has higher-kinded types.
Unfortunately, due to the relative unfamiliarity with functional programming and the various abstraction that comes with it, the Cats library is usually approached with hesitation amongst a sizable amount of software developers.
The sentiments I have seen expressed directly or indirectly is that introducing Cats would inadvertently fling developers into the deep ends of various unknown, academic and good for nothing, category theory inspired abstractions, that only confuses and add complexity. Since nobody wants this, the decision usually gets made not to bother with a library like Cats.
Nothing can be farther from the truth.
Saturday, July 28, 2018
Saturday, July 21, 2018
How to Make Aggregates Directly Handle Commands In Axon
In 2015, I created the exploringCQRSwithAxon example project while learning about CQRS and the Axon Framework.
When I did, I set up the example project in such a way that it uses command handler classes. The setup was as follows:
When I did, I set up the example project in such a way that it uses command handler classes. The setup was as follows:
- A controller receives a request via an endpoint
- Controller turns the request into a command and put it on the command gateway
- The command handler classes listens to specific commands. When a particular command it listens to is published via the command gateway, it loads the aggregate from the repository.
- The command handler class calls method on the loaded aggregate with the command that was published.
Saturday, July 14, 2018
ip-num 1.1.1 is Released
ip-num, version 1.1.1 is now available.
I will quickly highlight some of the new features, improvement and some bug fixes contained in this release.
| 80 bits | 16 | 32 bits |
+--------------------------------------+--------------------------+
|0000..............................0000|FFFF| IPv4 address |
+--------------------------------------+----+---------------------+
ip-num now supports creating these kinds of IPv6 addresses. This can be achieved in various ways:
Converting from an existing IPv4
From an existing IPv4 using convenience method on IPv6
From dot-decimal notation using convenience method on IPv6
For a complete view of the changes included in the v1.1.1 release, please check the change log.
As usual, you can download the source here. Or just run:
to add ip-num as a dependency to your next project.
Feel free to open an issue to discuss a feature or to report a bug.
ps: v1.1.0 was unpublished due to inadvertently publishing some dev dependencies as normal dependencies
I will quickly highlight some of the new features, improvement and some bug fixes contained in this release.
Support for IPv4-Mapped IPv6 Address
It is possible to embed an IPv4 address within an IPv6 address. Doing this involves using the least significant 32 bits to encode the IPv4 address, the next least 16 significant bits is turned On, and the remaining 80 bits turned Off. The format of the "IPv4-mapped IPv6 address" Looks like this:| 80 bits | 16 | 32 bits |
+--------------------------------------+--------------------------+
|0000..............................0000|FFFF| IPv4 address |
+--------------------------------------+----+---------------------+
ip-num now supports creating these kinds of IPv6 addresses. This can be achieved in various ways:
Converting from an existing IPv4
import { IPv4 } from "ip-num/IPv4"; let ipv4 = new IPv4("74.125.43.99") ipv4.toIPv4MappedIPv6().toString() // produces ::ffff:4a7d:2b63
From an existing IPv4 using convenience method on IPv6
import { IPv6 } from "ip-num/IPv6"; let ipv6 = IPv6.fromIPv4(new IPv4("74.125.43.99")) ipv6.toString() // produces ::ffff:4a7d:2b63
From dot-decimal notation using convenience method on IPv6
import { IPv6 } from "ip-num/IPv6"; let ipv6 = IPv6.fromIPv4DotDecimalString("74.125.43.99") ipv6.toString() // produces ::ffff:4a7d:2b63
Convenience methods for creating IPv4, IPv6 and ASN from Binary string
ip-num now has method that allows the creation of IPv4, IPv6, and ASN instances from binary string.
import { Asn } from "ip-num/Asn"; import { IPv4 } from "ip-num/IPv4"; import { IPv6 } from "ip-num/IPv6"; let anAsn = Asn.fromBinaryString('1111'); let anIPv4 = IPv4.fromBinaryString("01001010011111010010101101100011"); let anIPv6 = IPv6.fromBinaryString("01001010011111010010101101100011");
Improvement to various Validators
Big fixes, increased test coverage and improvements were made to Validators. This mainly touches the Validator.isValidIPv4String() and Validator.isValidIPv6String() validators.For a complete view of the changes included in the v1.1.1 release, please check the change log.
As usual, you can download the source here. Or just run:
npm install ip-num //or npm install ip-num@1.1.1
to add ip-num as a dependency to your next project.
Feel free to open an issue to discuss a feature or to report a bug.
ps: v1.1.0 was unpublished due to inadvertently publishing some dev dependencies as normal dependencies
Saturday, July 07, 2018
Rolling Your Own Monad To Deal With Nested Monads In Scala
In Thoughts On Working With Nested Monad Within The Future Monad In Scala, I wrote about how nested contexts (or technically accurate: nested monads) usually end up creeping into any Scala codebase. And how these nested contexts end up leading to unwieldy code base, that is hard to read and hard to work with.
In that same post, I then mentioned two techniques that can be used to regain readability when dealing with such nested monads. Since the post used the Future Monad as its focus, the first suggested technique was to encode the failure in the Future. The second technique was to use monad transformers.
The blogpost inspired a talk that I gave at the Amsterdam Scala Meet-up group. (You can find the slides from that talk here by the way). In the discussions that ensued after the talk, Devlaam suggested an alternative technique for dealing with the situation: which is to basically create a monadic structure that wraps around the value in the nested context. Doing this would allow us to regain readability by being able to use for comprehensions with the created monadic structure.
In this post I explore how the idea of rolling your own monad can be applied as a third approach to dealing with the clunkiness of working with nested monad in Scala. Just as with the previous post, Future[Either[E, A] would be the nested monads that would be used for illustrations.
In that same post, I then mentioned two techniques that can be used to regain readability when dealing with such nested monads. Since the post used the Future Monad as its focus, the first suggested technique was to encode the failure in the Future. The second technique was to use monad transformers.
The blogpost inspired a talk that I gave at the Amsterdam Scala Meet-up group. (You can find the slides from that talk here by the way). In the discussions that ensued after the talk, Devlaam suggested an alternative technique for dealing with the situation: which is to basically create a monadic structure that wraps around the value in the nested context. Doing this would allow us to regain readability by being able to use for comprehensions with the created monadic structure.
In this post I explore how the idea of rolling your own monad can be applied as a third approach to dealing with the clunkiness of working with nested monad in Scala. Just as with the previous post, Future[Either[E, A] would be the nested monads that would be used for illustrations.
Sunday, May 13, 2018
Thoughts On Working With Nested Monad Within The Future Monad In Scala
This post is about nested contexts, specifically with Future, or more accurately, nested monad within the Future monad. eg: Future[Either[E, A]], Future[Option[A]] etc. And how such nested context could easily lead to hard to read and hence hard to maintain codebase.
These sort of context nesting and its impact is not limited to Future, but I would be using Future as the reference in this post, strictly because they seem to be the form that appears the most in a particular Scala codebase I work on at my day job.
Also in this post, I would use Monad and Context interchangeable to mean the same thing. I would also mention terms like Monads, Monad Stack, Monad Transformers, or For Comprehension without providing any explanation of these terms. This is because the thrust of this post is not to expound on these concepts but to share some recent thoughts I have been having regarding nested context within Future.
A reader not familiar with these concepts should still be able to follow along though.
These sort of context nesting and its impact is not limited to Future, but I would be using Future as the reference in this post, strictly because they seem to be the form that appears the most in a particular Scala codebase I work on at my day job.
Also in this post, I would use Monad and Context interchangeable to mean the same thing. I would also mention terms like Monads, Monad Stack, Monad Transformers, or For Comprehension without providing any explanation of these terms. This is because the thrust of this post is not to expound on these concepts but to share some recent thoughts I have been having regarding nested context within Future.
A reader not familiar with these concepts should still be able to follow along though.
Thursday, April 19, 2018
ip-num 1.0.1 is Released
ip-num, version 1.0.1 is now available. It is mainly a bug fix release.
The release contains the following changes/fixes:
The release contains the following changes/fixes:
- Fixed the throwing of the invalid integer: NaN when invalid IPv4 and IPv6 strings are passed to Validator.isValidIPv4String and Validator.isValidIPv6String validators. Fixed by saiyeek Issue #5
- Fixed Validator.isValidIPv4CidrNotation improper validation of IPv4 CIDR Issue #6
- Renamed Subnet to SubnetMask Issue #1
You can download the source here. Or just run:
npm install ip-num //or npm install ip-num@1.0.1
to add ip-num as a dependency to your next project.
Wednesday, March 14, 2018
An easier way to interpret code blocks and curly braces in Scala
I recently realized a nifty way for reading a particular piece of Scala syntax that has always confused me.
Basically how to interpret code that makes use of curly braces when calling functions with multiple parameter lists or code that makes use of {} in place of () when acceptable.
Basically, code that looks like this:
or
Or a snippet of code defining a controller method using the play framework:
Or some slightly modified code from a code base at work:
Or another slightly modified code from work:
Basically how to interpret code that makes use of curly braces when calling functions with multiple parameter lists or code that makes use of {} in place of () when acceptable.
Basically, code that looks like this:
foo() { val a = "Hello" val b = "world" s"$a $b" }
or
foo() { (x:Int) => val y = x * 2 println(s"output is: $y") }
Or a snippet of code defining a controller method using the play framework:
Action.async(action.parser) { request => Logger.info("Calling action") action(request) }
Or some slightly modified code from a code base at work:
extractActiveMembershipFromRequest(membershipKey) { requesterId => ...some code here... }
Or another slightly modified code from work:
secure.hasRequiredRole(user, role) { submitRequest(user) }
Subscribe to:
Posts (Atom)