Skip to content

Instantly share code, notes, and snippets.

/**
* A monad to abstract dependencies in the code, see https://coderwall.com/p/kh_z5g
*/
object Reader {
/**
* an implicit to convert a function A => B in a Reader[A, B]
*/
implicit def reader[C, R](block: C => R): Reader[C, R] = Reader(block)
// This should work with Scala 2.10.4 & scalaz 7.1, core, effect and concurrent packages
import scalaz.{ concurrent, Free, Functor, Monad, syntax }
import concurrent.Task
import Free.{freeMonad => _, _}
import syntax.monad._
// Describe the set of actions - which are functors
sealed trait RedisF[+A] {
def map[B](fn: A => B): RedisF[B]
@yujikiriki
yujikiriki / sistemasjulian.md
Created June 12, 2015 12:54
modelar sistemas Julián

Don Julián!

Me quedé sorprendido por las respuestas que le dieron a su pregunta de cómo enseñarle a nuevos devs a modelar un sistema.

Me horrorizó ver respuestas que hablaban que DDDesign es demasiado, o que FP y DDDesign no van; o peor aún, que sospechan que ágil y DDDesign no pueden ir juntas.

Hace unos años escribí sobre el concepto de la simpatía semántica, un copy/paste de la Simpatía Mecánica de Thompson. Considero que ese debería ser ppal mensaje que me hubiera gustado que me enseñaran cuando arranqué a trabajar "profesionalmente".

Si ese concepto es claro, no debería importar si ud usa UML o no, si usa cajitas y rayitas para definir mapas semánticos o lo que quiera. Parafraseando a Fowler, lo importante de UML es comunicar. En este caso, comunicar la abstracción del mundo real que luego convertirá en código fuente.

@yujikiriki
yujikiriki / akkavserlang.md
Created June 12, 2015 12:58
akkavserlang

Hola!

Hace más de dos años venimos trabajando en diferentes tipos de proyectos haciendo uso de Akka/JVM/Scala. A la fecha hemos entregado exitosamente 14 proyectos de tamaño medio a grande, pasando por webapps, automatizaciones de procesos de laga duración, sistemas de autenticación y autorización, service registries, aplicaciones core de negocio, entre otros ejemplos.

En la mayoría de ellos hemos tenido que resolver problemas a través de la construcción de patrones para sistemas distribuidos: convergencia de estado a través de CvRDT, quórum a través de RAFT (hecho en casa), jitter y exponential backoff en el consumo de servicios, implementación de sagas para soportar transacciones de larga duración o no tan simples esquemas de recuperación ante catástrofes sobre distintos IaaS.

Lo que quiero tratar de decir con esta introducción es que calcular pi, o cualquier otro problema algorítmico es lo menos común de los problemas en los que hemos elegido Akka para resolverlos. De hecho, en las pruebas que hicimos d

// A safer ADT+shapeless alternative ...
//
object ShapelessEnumDemo extends App {
// ADT as an enumeration. Barely any more boilerplate ...
sealed trait WeekDay
object WeekDay {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = new WeekDay {}
val values: Set[WeekDay] = Values
}
@yujikiriki
yujikiriki / aurora-scheduler.log
Created September 11, 2015 20:43
aurora-scheduler.log
Sep 11, 2015 3:35:37 PM com.twitter.common.args.apt.Configuration load
INFO: Loading @CmdLine config from: [jar:file:/home/yuji/git/aurora/dist/distributions/aurora-scheduler-0.9.0/lib/client-flagged-0.0.5.jar!/com/twitter/common/args/apt/cmdline.arg.info.txt.1, jar:file:/home/yuji/git/aurora/dist/distributions/aurora-scheduler-0.9.0/lib/server-set-1.0.74.jar!/com/twitter/common/args/apt/cmdline.arg.info.txt.1, jar:file:/home/yuji/git/aurora/dist/distributions/aurora-scheduler-0.9.0/lib/application-module-stats-0.0.44.jar!/com/twitter/common/args/apt/cmdline.arg.info.txt.1, jar:file:/home/yuji/git/aurora/dist/distributions/aurora-scheduler-0.9.0/lib/application-0.0.73.jar!/com/twitter/common/args/apt/cmdline.arg.info.txt.1, jar:file:/home/yuji/git/aurora/dist/distributions/aurora-scheduler-0.9.0/lib/args-0.2.9.jar!/com/twitter/common/args/apt/cmdline.arg.info.txt.1, jar:file:/home/yuji/git/aurora/dist/distributions/aurora-scheduler-0.9.0/lib/logging-0.0.61.jar!/com/twitter/common/args/apt/cmdline.arg.info.txt
@yujikiriki
yujikiriki / mesos-master.log
Created September 11, 2015 20:45
mesos-master.log
I0911 15:34:16.061110 30331 main.cpp:229] Build: 2015-09-09 15:22:34 by yuji
I0911 15:34:16.061204 30331 main.cpp:231] Version: 0.24.0
I0911 15:34:16.061213 30331 main.cpp:234] Git tag: 0.24.0
I0911 15:34:16.061219 30331 main.cpp:238] Git SHA: 8b77e68f8be5d0766a4bbfba18b397d619611f95
I0911 15:34:16.061358 30331 main.cpp:252] Using 'HierarchicalDRF' allocator
I0911 15:34:16.061925 30331 leveldb.cpp:176] Opened db in 440485ns
I0911 15:34:16.062157 30331 leveldb.cpp:183] Compacted db in 209913ns
I0911 15:34:16.062211 30331 leveldb.cpp:198] Created db iterator in 35778ns
I0911 15:34:16.062223 30331 leveldb.cpp:204] Seeked to beginning of db in 1872ns
I0911 15:34:16.062230 30331 leveldb.cpp:273] Iterated through 0 keys in the db in 186ns
@yujikiriki
yujikiriki / mesos-slave.log
Created September 11, 2015 20:46
mesos-slave.log
╰─✘ ./build/bin/mesos-slave.sh --master=127.0.0.1:5050
I0911 15:34:18.310139 30379 main.cpp:185] Build: 2015-09-09 15:22:34 by yuji
I0911 15:34:18.310219 30379 main.cpp:187] Version: 0.24.0
I0911 15:34:18.310226 30379 main.cpp:190] Git tag: 0.24.0
I0911 15:34:18.310232 30379 main.cpp:194] Git SHA: 8b77e68f8be5d0766a4bbfba18b397d619611f95
I0911 15:34:18.310508 30379 containerizer.cpp:143] Using isolation: posix/cpu,posix/mem,filesystem/posix
I0911 15:34:18.313657 30379 main.cpp:272] Starting Mesos slave
I0911 15:34:18.314357 30379 slave.cpp:190] Slave started on 1)@127.0.1.1:5051
I0911 15:34:18.314381 30379 slave.cpp:191] Flags at startup: --appc_store_dir="/tmp/mesos/store/appc" --authenticatee="crammd5" --cgroups_cpu_enable_pids_and_tids_count="false" --cgroups_enable_cfs="false" --cgroups_hierarchy="/sys/fs/cgroup" --cgroups_limit_swap="false" --cgroups_root="mesos" --container_disk_watch_interval="15secs" --containerizers="mesos" --default_role="*" --disk_watch_interval="1mins" --docker="docker" --docker_k
@yujikiriki
yujikiriki / aurorastderr.log
Created September 11, 2015 20:53
aurorastderr.log
I0911 15:50:48.986191 32028 fetcher.cpp:414] Fetcher Info: {"cache_directory":"\/tmp\/mesos\/fetch\/slaves\/20150911-154834-16777343-5050-31458-S0\/root","items":[{"action":"BYPASS_CACHE","uri":{"executable":true,"extract":true,"value":"\/dev\/null"}}],"sandbox_directory":"\/tmp\/mesos\/slaves\/20150911-154834-16777343-5050-31458-S0\/frameworks\/20150911-154834-16777343-5050-31458-0000\/executors\/thermos-1442004648901-www-data-devel-test-0-dca008b2-bd0c-46d7-9559-f6dac1c626fc\/runs\/fb5ec314-0585-4a98-a62e-3461d93a57b9","user":"root"}
I0911 15:50:48.989202 32028 fetcher.cpp:369] Fetching URI '/dev/null'
I0911 15:50:48.989217 32028 fetcher.cpp:243] Fetching directly into the sandbox directory
I0911 15:50:48.989236 32028 fetcher.cpp:180] Fetching URI '/dev/null'
I0911 15:50:48.989259 32028 fetcher.cpp:160] Copying resource with command:cp '/dev/null' '/tmp/mesos/slaves/20150911-154834-16777343-5050-31458-S0/frameworks/20150911-154834-16777343-5050-31458-0000/executors/thermos-1442004648901-www-data-devel-test-
@yujikiriki
yujikiriki / scheduler.sh
Created September 11, 2015 20:58
scheduler.sh
#!/usr/bin/env bash
# Location where aurora-scheduler.zip was unpacked.
AURORA_SCHEDULER_HOME=/home/yuji/git/aurora/dist/distributions/aurora-scheduler-0.9.0
# Flags that control the behavior of the JVM.
JAVA_OPTS=(
-server
-Xmx2g
-Xms2g
-Djava.library.path=/home/yuji/git/mesos/build/src/.libs/