Skip to content

Instantly share code, notes, and snippets.

View am-kantox's full-sized avatar
🎩
constantly matching the patterns

Aleksei Matiushkin am-kantox

🎩
constantly matching the patterns
View GitHub Profile
@am-kantox
am-kantox / silverfish.md
Last active April 2, 2020 13:03
Карасик

The Silverfish Programming Language

Original by @netricks

They say, each professional developer must have done at least three pet projects: a sophisticated logging utility, a smart json parser, and an amazing programming language. Once we have both logger and parser accomplished, we finally decided to reveal our desperate success in creation one of the most innovative programming languages named Silverfish.

Карасик → На самом деле плотвичка

As we all know, the universe is constantly moving around. Evolution of programming languages is not even close to complete. New languages emerge every year, to undergo the laboratory testing on human beings and die in oblivion, sooner ot later. The vast majority of innovations in any new language could barely be considered a result of new development, but as the evolution of well-known approaches or even old good wheels re-invention.

@am-kantox
am-kantox / wc-counters.ex
Created March 22, 2020 08:42
WC on counters
defmodule Wc do
@prehandle 42
@sink @prehandle + 1
@chunk 1_000_000
@type acc_counters :: 0 | 1
@spec counters(binary) :: acc()
def counters(file) do
cs = :counters.new(3, [:write_concurrency])
@am-kantox
am-kantox / Binary.hs
Created February 27, 2020 05:45 — forked from Lysxia/Binary.hs
Binary pattern-matching on bytestrings
{-# LANGUAGE
ScopedTypeVariables,
ViewPatterns,
PatternSynonyms #-}
import Data.Bits (Bits, shift)
import Data.Word
import Data.ByteString (ByteString)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Char8 as B8
@am-kantox
am-kantox / wc.ex
Created February 22, 2020 19:59
wc in elixir
defmodule Wc do
@acc %{bc: 0, wc: 1, lc: 0, ns?: 1}
@prehandle 42
@sink @prehandle + 1
@chunk 1_000_000
@type acc :: %{
bc: non_neg_integer(),
wc: non_neg_integer(),
lc: non_neg_integer(),
@am-kantox
am-kantox / strong-types-strong-hypes.md
Created January 23, 2020 05:33
Strong Types, или — все-таки — Strong Hypes?

В последние годы в интернете появилась тенденция сулить все блага мира за использование сильной типизации. Самые настойчивые ораторы даже приходят к таким выводам, как «когда у вас есть типы, вам не нужны тесты». Мне кажется, это не самый аккуратный посыл. Существуют, очевидно, ситуации, когда сильная типизация может помочь выловить человеческие ошибки на ранних стадиях, но обязательное внедрение оной буквально везде — приносит больше хлопот, чем пользы.

Все, что написано ниже — не более, чем скромное мнение автора (и так-то не самого умного человека в мире, а вдобавок — и посредственного разработчика). Но это мнение основано на более чем 30-летнем профессиональном опыте и карьере, обеспечивавшей надежные и отказоустойчивые решения для бизнеса на протяжении всего этого срока. Кроме того, я убедительно прошу каждого евангелиста сильной типизации сначала написать парсер markdown, чтобы увидеть своими глазами ситуацию, в которой типы не приносят вообще никакой пользы.

Станда

@am-kantox
am-kantox / ideological-beggar-job.md
Created January 23, 2020 05:31
Разработчики — никакая не элита, а голые короли индустрии

ЛОЛШТО?

Пожалуйста, не поймите меня неправильно. Я профессиональный разработчик с 30-летним стажем. Я могу читать и понимать почти двадцать языков, полных по Тюрингу. Я могу писать ясный и выразительный код на доброй дюжине из них. В языках, которые я действительно люблю и использую ежедневно — мое имя можно увидеть на доске почета StackOverflow (топ-20 в мире: ruby, elixir). Я по-настоящему люблю писать код, и я отклоняю все предложения «вырасти» по должностной лестнице, будь то руководство проектами, CTO, или что угодно в этом направлении, несмотря на потенциальное увеличение дохода в разы.

professional beggars were often seen as people not deserving of aid — Abraham Willemsens (Metropolitan Museum of Art)

Но я как никогда убежден, что отрасль страдает от самого страшного заболевания за всю свою историю. Дл

@am-kantox
am-kantox / map_access.ex
Created November 1, 2019 11:48
`MapAccess.filter/1` → the same as `Access.filter/1`, but works with maps.
defmodule MapAccess do
@spec filter((term -> boolean)) :: Access.access_fun(data :: map, get_value :: map)
def filter(func) when is_function(func, 1) do
fn op, data, next -> filter(op, data, func, next) end
end
defp filter(:get, %{} = data, func, next) do
data |> Enum.filter(func) |> Enum.map(next) |> Map.new()
end

The only reason is to make it easier to embed them into the pipeline built with Kernal.|>/2.

As one might easily see, String.replace/4 delegates to Regex.replace/4.

When one starts with a string, they might pipe String.replace/4 without a necessity to leave a pipeline. When one starts with a regex, the same applies to Regex.replace/4.

@am-kantox
am-kantox / smart-commit.sh
Last active February 20, 2021 12:47
Bash script that prefixes commits with a JIRA (CO-400)
#!/usr/bin/env bash
# based on https://github.com/sbimochan/smart-commit/blob/master/commit
# am@aleksei  feature/CO-400-some-branch-name$ ./smart-commit.sh "Foo bar."
# → [feature/CO-400-some-branch-name f70ebbf167] CO-400: Foo bar.
set -euo pipefail
if [ -z "${1:-}" ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
@am-kantox
am-kantox / validator.ex
Last active October 31, 2018 09:08
Updating guard module
defmodule Validator do
def instance!(rules, merge \\ true) do
mod = Module.concat(["Validator", "Instance"])
current_rules =
if Code.ensure_compiled?(mod) do
rules = if merge, do: apply(mod, :rules, []), else: %{}
:code.purge(mod)
:code.delete(mod)
rules