Skip to content

Instantly share code, notes, and snippets.

View arinal's full-sized avatar

Dicky Arinal arinal

  • Disney+
  • Greater Manchester Area
View GitHub Profile
@arinal
arinal / KinesisDecoder.scala
Created February 15, 2021 07:05
Decode Kinesis Protobuff
import scala.util.Try
import scala.annotation.tailrec
import java.nio.charset.StandardCharsets
object KinesisDecoder {
/**
* A kinesis record is sometimes aggregated with multiple smaller records, a feature
* from KPL to increase throughput. Aggregated message are encoded in protobuf format
/**
* Try to uncomment the commented codes segment by segment. Some of them are errors and see whether
* the errors match with your expected errors :)
*
* Three forms of Receiver-Provider pairs:
* {{{
* // assignment form, left side is receiver, right is provider.
* val receiver: Receiver = provider: Provider
*
* // function type (receiver) and return statement (provider)
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
@arinal
arinal / MonadHell.scala
Last active September 10, 2019 14:42
Monad Hell
package example
import cats.data.ReaderT
import cats.data.StateT
import cats.mtl.MonadState
import cats.Monad
import cats.mtl.ApplicativeAsk
import cats.MonadError
import cats.mtl.FunctorRaise
@arinal
arinal / KinesisSource.scala
Last active August 14, 2019 14:24
Kinesis related
import java.net.URI
import cats.effect.{Async, Timer}
import monix.tail.Iterant
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider
import software.amazon.awssdk.core.SdkSystemSetting
import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient
import software.amazon.awssdk.http.{Protocol, SdkHttpConfigurationOption}
import software.amazon.awssdk.regions.Region
import software.amazon.awssdk.services.kinesis.model._
override def run(args: List[String]): IO[ExitCode] = {
recurr[IO](5, List.empty)
.flatMap { ns =>
Iterant.fromList(ns)
}
.take(2)
.map(println)
.toListL
.map(_ => ExitCode.Success)
}
@arinal
arinal / lift.scala
Last active July 23, 2019 01:04
Lifting monad transformer
import scala.concurrent.ExecutionContext.Implicits.global
def lift [A](n: A) : OptionT[Future, A] = lift(n.some)
def lift [A](optA: Option[A]) : OptionT[Future, A] = OptionT(Future.successful(optA))
def lift [A](f: Future[Option[A]]): OptionT[Future, A] = OptionT(f)
def lift1[A](f: Future[A]) : OptionT[Future, A] = f.liftM[OptionT]
@arinal
arinal / git-new.sh
Created October 9, 2018 14:47
Get all log messages in current tag
git-new() {
current_tag="$(git tag -l | tail -1)"
git log --pretty=oneline --pretty=format:%s "$current_tag"..."master" | grep -E '#'
}

Penjelasan sederhana tentang emulator

Unicorn.js adalah emulator untuk berbagai arsitektur CPU seperti ARM, x86, MIPS, etc. Uniknya, unicorn.js jalan 100% di javascript. Pertanyaan yang sering timbul adalah bukannya emulator itu harus 'low-level' dan harus dibikin pake C? Jawabannya tidak. Poin-poin penting tentang cara kerja CPU:

  • Komputer terdiri dari CPU dan memori.
  • Memori itu ada nomornya (alamat), kemudian isinya adalah angka 8-bit, alias integer dengan interval 0 sampai 255.
  • Memori itu isinya bisa instruksi, bisa data.
  • Di dalam CPU ada register, yaitu sebuah memori juga namun memiliki fungsi khusus.

Emulator

Unicorn.js adalah emulator untuk berbagai arsitektur CPU seperti ARM, x86, MIPS, etc. Uniknya, ini jalan 100% di javascript. Pertanyaan yang sering timbul adalah bukannya emulator itu harus 'low-level' dan harus dibikin pake C? Jawabannya tidak.

Ingat-ingat pelajaran organisasi komputer tentang cara kerja CPU:

  • Komputer terdiri dari CPU dan memori.
  • Memori itu ada nomornya (alamat), kemudian isinya adalah angka 8-bit, alias integer dengan interval 0 sampai 255.
  • Memori itu isinya bisa instruksi, bisa data.