Category: литература

Category was added automatically. Read all entries about "литература".

Book

Всё что вам надо знать про io_submit

https://blog.cloudflare.com/io_submit-the-epoll-alternative-youve-never-heard-about/

Там всё прекрасно. Ну то есть если вы не знаете что такое io_submit - то можно не читать. А если знаете - это такое эссе хорошее по общей ситуации с ним.
Book

Cубботний Unicode WTF

Я тут переехал локально, старый хозяин изъявил желание, чтобы я пиздовал нахуй.

Ну и на новом месте почему-то нету покрытия GPON, так что старый провайдер предлагает подключить 4 мбит по АДСЛ вместо старых 20. Ну и даже это никак не едут подключать, а я забался на LTE сидеть по разного рода дебильным логистическим причинам и тому что анлим они режут, после превышения какого-то минимального потолка трафика, до 256кбит. Не то чтобы мне было именно _нужно_ больше - мне важны потери и пинг, ну и в этом плане LTE уже охуенен, "как вайфай". Учитывая что я считаю вайфай нерабочей технологией, LTE в этом плане даже круче вайфая местами, я думаю, из-за того, что сеть хотя бы в какой-то степени инжинирится, а не просто понатыкал каждый АП-шек на автовыборе канала и повыкручивал уровень сигнала. Ну то есть да, стопицотгигабитный вайфай выдаёт таки реально ~300 мбит по виндовой самбе, но ССШ превращается в тыкву, т.к. качество плавает постоянно, и начинаешь напрягаться, это такая задержка из-за вайфая или что-то упало реально где-то посреди, или сервер подвис? То же самое с вебом.

В результате нашелся какой-то мелкий пров, который даёт 6 мбит за какие-то смешные деньги. Приехали, залепили, судя по всему Wi-Fi парабола с дальнобойной PoE AP, а в доме какой-то SOHO говнороутер абсолютно неизвестной марки.

Но это так сказать, присказка. Сказка заключается в том, что они не дали доступ к роутерам (не то чтобы я просил), а точку доступа запилили, барабанная дробь, I.G televisión.F06

Над буковкой о видите что-то странное? Так вот, это срёт в dd-wrt - мой второй роутер не умеет подключаться к AP c нерусскими юникод-именами. Тикету 4 года, пост на форуме тоже:

https://forum.dd-wrt.com/phpBB2/viewtopic.php?t=304091
https://svn.dd-wrt.com/ticket/5535

Потратил пол-утра. В какой-то степени это даже хорошо, так как может придётся подключиться по-белому кабелем. И никто не будет протестовать что это декоративно нехорошо.
Book

Прогресс по починке опенсорсного гнилья-7

Вчера пиcал большой пост, но он пропал™, так что реконструирую по памяти

Все матрицы пока зелёные. По официально выпущенному Danga::Socket 1.62 багов не посыпалось. Товарищ наконец передал мне репу на гитхабе, так что я больше не его форк:

https://github.com/nponeccop/libdanga-socket-perl

Так что репу можно будет переименовать и/или добавить в метаданные в следующей версии 1.63. Я уверен что на 1.63 точно сил хватит, а там хоть трава не расти видно будет.

Нашёл способ слать зелёные репорты (встроенный в cpanp репортер шлёт только неудачные попытки установки) - через отдельную тулзу CPANPLUS::YACSmoke, которая умеет не только мониторить свежие пекеджи и тестировать всё подряд, но и просто тестировать что указано в коммандлайне. Но репорты внезапно почему-то не доходят до цели, хотя пишет что успешно отправлено, надо разбираться.

Gearman-Server, тестовая зависимость моего AnyEvent-Gearman, использует модуль Test::Tester, который есть в двух библиотеках. Ну и cpanp ставит не ту библиотеку, которая нужна. Ебался полчаса пока разобрался.

Кроме того в процессе разбирательств нашёл чувака, который собрал уязвимости пакетов на CPAN, и написал тулзу аналогичную npm audit, дабы смотреть не стоит ли чего уязвимого. Но попытка запустить это на винде привела к подвисанию гостя и менеджмент-сервиса Hyper-V, хотя хост и другие гости продолжали работать нормально. В-общем опять надо разбираться. А как заработает - пускать это на проде. Со Strawberry Perl идёт в комплекте куча всякого говна, которое я не обновляю, так как либо и так работаю, либо не использую. Но уязвимости хорошо бы пропатчить, хоть они все и "липовые" (низкий импакт).

Как я понял, базу он заполнял почти единолично, но читил - мониторит адвисорисы крупных дистров, и если там что-то промелькивает перловое, добавляет энтри. Также нашёл его же код с промисами на перле, который хотел показать для устрашения. Но ссылка тоже пропала.

Upd: внезапно "зависшая" гостевая винда оказалось что нормально захибернейтилась. То есть после перезагрузки хоста гость восстановился на том месте, на котором зависло, но "развис". Оказалось что говнотулза аудита ищет перловые файлы где попало, ну и у меня стоит пакет Alien::MSYS который внутри себя держит маленький MSYS ака цигвин c "вложенным" перлом 5.8 очень древним, где понятно одни дыры ака 7 адвисорисов. В-общем дебильный алгоритм тулзы, с поиском по всей ФС, оказался даже полезным. Решение теперь попробовать переставить этот модуль (нахуй снести не представляется возможным) в надежде что он поставит вложенный перл посвежее, где всё пропатчено. Но это конечно уже театр абсурда.
Book

Выебудни

Обнаружился гейзенбаг в коде. MPI_Waitany failed :( Причем вылетает примерно на третьем часу работы :) Код тот последний раз работал на таких больших датасетах лет 8 назад. С тем же числом ядер, но в другой нума-топологии. То есть может баг был всегда. А может разница в процессорах вызвала к жизни рейс. А может это повреждение памяти в фиксированном месте которое потом приводит к крешу в рандомном месте. А может это 10-тка срёт. Неизвестно.

Код собирается в 2015 студии то ли 2008 то ли 2010 компилятором (лень запускать сборочную машину чтобы проверить). Пропатченный буст и не-исключено-что-пропатченные pcre, и mpich2.
Всё каких-то дремучих версий. Тьфу!

Теперь надо пересобрать в 2019-й и портировать патчи на новый буст. В надежде что это поможет. А не поможет так хоть вспомню, чем как и что собирать.

Это на фоне того, что обнаружилось, что код переподключения в перловой библиотеке на винде работает, только если на сервере стоит родной редхетовский фаерволл. А если пустые iptables - то вешается в странных местах в которых вешаться не должон. Какое-то хитрое взаимодействие таймаутов неактивности в nat в роутере и state ESTABLISHED в фаерволле (на другом хосте).

Тьфу!
Book

NAT benchmark

Часто (в моей практике - всегда) обычных TCP-соединений не хватает, и нужны "дубовые" различной степени дубовости. Частично эта проблема решается мессаджингом, но только для тепличных условий датацентров. В-общем, мне не хватает.

Одной из проблем является отпадание idle-соединений. Мне нужно виртуальное соединение, которое можно открыть и год ничего по нему не передавать (нуу, хотя бы месячишко). При этом библиотека может конечно что-то передавать, просто клиентский код эта проблема не должна волновать.

Стандартным решением является слать кипэлайвы и/или хартбиты (в моей терминологии кипэлайвы -это чтобы соединение не отпадало, а хартбиты - чтобы знать, что нет партишена и эндпоинт жив).

Можно начать с самого простого варианта, когда ничего не срёт, и постепенно переходить к более и более мрачным сценариям типа партишена, отпадания NAT-таблиц, переполучения адресов, перехода от TCP к веб-сокетам и т п.

Мне интересно получить картинки с данными по риал-ворлд отпаданиям.
Book

Всё, что вам надо знать об npm

var goldenGate = require('golden-gate')
 
goldenGate()
  .pipe(fs.createWriteStream('ggb.jpg'))
Либа для сохранения фотографий с одной специфической вебкамеры :)

Вспомним заветы дидов об обширных библиотеках готовых повторно используемых компонентов. Обширные библиотеки у нас теперь таки есть! Осталось долепить discoverability (вот мне понадобился парсер, обрабатывающий эскейпы в литералах Си (даже пусть без энтузиазма, чисто кавычку), и как его искать? Ну и "широких" либ не так много и их не видно. В основном мусор из "узких" либ.

Ответ, наверное, curated collections и moar metadata. А может и ИИ спасёт аца русской демократии.
Book

Возвращаем значения через "глобальную" переменную

https://github.com/damnboy/dns-packet/blob/040b76d1772c7498ab281816b063e754529eee89/index.js#L12-L33

Это шыдевр! Суть токова. Вместо того, чтобы вернуть из функции 2 значения, второе возвращается в переменной в том же скоупе, что и функция:

var name = {}

name.encode = function (n, buf, offset) {
  ...
  name.encode.bytes = ...
  return buf
}

name.encode.bytes = 0
Вызывать так:
  name.encode(data, buf, offset + 2)
  buf.writeUInt16BE(name.encode.bytes, offset)
Дабл фейспалм.

Ирония заключается в том, что это лучшая из библиотек для работы с dns в ноде. В частности, она не содержит собственного NIH-евентлупа (отличного от нодовского. cares например содержит в сях свой). и не прячет от нас "нинужные" части пакетов.
Book

S-Scalability

К вопросу об IO-стеке. Обнаружился прекрасный вопрос для собеседования.

У меня есть 60-метровый GPX-файл (из-за того что там много идиотических ненужных данных, вроде HTML-таблиц в элементе <description/>) с широтой-долготой и таймстемпом, 170к точек. И есть на SSD ~10k фоток всякой хуйни.

Задача вычитать из фоток Exif, и сопоставить по Date Taken с GPS-треком.

Считая, что сопоставлять можно в памяти (т.е. никаких дисковых индексов не требуется), за сколько времени это можно выполнить (wall time работы программы)?

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

Например, допустим у нас нет готового Exif-парсера, и нам надо его написать. А фотографий не 10к а миллион. И надо пускать smoke test, который покажет, что парсер на этом миллионе риал ворлд фотографий и нефотографий не падает. И есть лишняя хардварь и лишний писатель тестраннеров за 2 доллара в час. Мы можем как-то исхитриться и положить фотки в scalable store, чтобы прогон тестов был максимально быстрым и ультрадорогое время писателя парсера за 200 долларов в час не тратилось на ожидание? Как это будет выглядеть, какой вообще план действий по ускорению? И т.п.
Book

Декларативная геометрия

люди, я тут решил стать алгебраическим композабельным геометром, отцом бескоординатных 2д-фронтэндов для векторного WebGL фидонета.

не подскажете какие-нибудь пейперы или книжки для школьников по мат. основам diagrams c hackage? У них референсов я не нашёл, но должно же быть

ну и вообще по теме отвязывания графики от координат и перехода к высокоуровневым представлениям, не обязательно в разрезе diagrams

Нашел тут пейпер.

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.220.4802

В-общем, от линейных пространств переходим к аффинным, а от них к геометрической алгебре (не путать с алгебраической геометрией).
Book

Когда в руках профунктор

Профункторы - это штуки, похожие на функции вида M a -> N b, к которым можно прикомпозить слева или справа другие функции:
class Profunctor p where
  lmap :: (c -> a) -> p a b -> p с b
  rmap :: (b -> d) -> p a b -> p a d

Метафорически, это "(c -> a) . (a -> b) . (b -> d)". Т.е. если к (a -> b) прилепить слева (с -> a) - то получим (c -> b). А если слева ничего не прилепливать, а справа прилепить b -> d - то получим a -> d. Есть ещё dimap, прилепливающий сразу с двух сторон, и получающий с -> d из a -> b.

В-общем, лонг стори шот, Data.Map похож на функцию из ключа в значение, и я решил я спрятать констрейнт в экзистеншиал и залепить инстанс:
{-# LANGUAGE GADTs, TypeFamilies #-}
import qualified Data.Map as M
import Data.Profunctor
import Prelude hiding (lookup)

data MapPK k v where
        MapPK :: Ord i => (k -> i) -> (M.Map i v) -> MapPK k v

instance Profunctor MapPK where
        dimap f g (MapPK ff mm) = MapPK (f `lmap` ff) (g `fmap` mm)

lookupPK k (MapPK f m) = M.lookup (f k) m
Тут для симметрии вместо lmap для (->) должен был идти совпадающий с ним Data.Functor.Contravariant.contramap, но я поленился.

В-общем, интересно, можно ли эту конструкцию кметтизировать - обобщить и встроить в библиотеку типа keys или lens. А может, кто-то уже.