Category: дизайн

Category was added automatically. Read all entries about "дизайн".

Book

Пилю тут генератор

Этот ваш Yeoman -- какой-то херовый дизайн имхо. Плюнул и решил налепить на коленках. Тем более, что у еомана тоже довольно наколенно и тоже на ejs.
<% 
const addIf = (cond, deps) => cond
	? Object.fromEntries(deps.map(dep => [ dep, "*"]))
	: {} 

const devDependencies = {
	...(addIf(CONFIG_TESTS, ["jest"])),
	...(addIf(CONFIG_TS, ["typescript"])), 
	...(addIf(CONFIG_TESTS && CONFIG_TS, ["ts-jest"]))
}
%><%- JSON.stringify({ devDependencies }, null, 2) %>
Звёздочки и нехватка всяких @types/node -- это так, чтобы понять, что подход работает, и комбинаторный взрыв удаётся контролировать.

Yeoman, кстати, проблему звёздочек решил, собирая командную строку npm i/yarn add. Xез на самом деле, как лучше. По-хорошему, надо фиксировать мажорный-минорный семвер.
Book

Your Computer is Not A Fast PDP-11

https://queue.acm.org/detail.cfm?id=3212479

C Is Not a Low-level Language
Your computer is not a fast PDP-11.

Наконец-то кто-то это озвучил.

Собственно 2 очевидных пункта:
- сишная вм - это таргет для оптимизации дизайна проца в 2019 - в процессоры влито бабло, чтобы они быстро исполняли сишный код
- сишная вм плохо покрывает архитектуру и instruction set

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

Первый пункт, я думаю, нефальсифицируем. А вот второй можно атаковать с обоих сторон - пытаясь как подтвердить, так и разоблачить.

Вопрос, какие можно для этого было бы поставить эксперименты - мысленные, для начала.

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

Ну и надо знакомиться с VTune и https://software.intel.com/en-us/articles/intel-sdm :)
Book

Гирмана изобрёл Фитцпатрик

Тут выяснилось, что гирмана изобрёл Фитцпатрик для нужд ЖЖ. В результате как я понимаю действует правило второго релиза. То есть Фитцпатрик изобрёл полную хуйню, которая со временем эволюционировала во всё уменьшающуюся хуйню в виде:

- cpan i Gearman - Gearman с fork и NIH-эвентлупом Фитцпатрика. Всем плох :)
- сишный gearmand с NIH-эвентлупом и форком - хорош тем что более рабочий чем другие task queues на си, например чем фейсбучный beanstalkd, в силу нормального дизайна протокола. Также есть в виде пакета на центосе (даже 6) и идёт с тулзами траблшутинга (gearman, gearadmin).
- cpan i AnyEvent::Gearman - гирман с pluggable эвентлупом и без форка, соответственно лучшее из перлового, что работает на винде. Но тесты не запускаются, поскольку тестируются против другой реализации, а именно первой фитцпатриковской. Также в клиенте есть мешающий мне баг (нерабочие реконнекты, теряющие джобы). И кроме того, имеет 100500 зависимостей ввиду использования перловой вариации CLOS (Moose и т п)
- npm i abraxas - самое приличное из списка. Форков, CLOS и NIH-эвентлупов нет просто в силу того что в ноде это не принято/не поддерживается. Более нормальный код по сравнению с вышеперечисленными. Нужные мне баги с WAN-перформансом были пофикшены, то есть единственное из списка, что поддерживается. Нормальные реконнекты с exponential backoff, не теряющие джобы по дороге.
Book

Всё что вам нужно знать о позиксо- и юниксвэй-дрочерах

The Linux kernel is designed around familiar and well accepted standards, such as UNIX and POSIX

Собственно вот он корень всех зол. POSIX - это

1. стандарт
2. знакомый стандарт
3. хорошо воспринятый стандарт

То есть, заведомо идут лесом:

1. нестандарты. Я помню, как все смеялись над ранней ECMA-стандартизацией JS, пока оно не превратилось в более-менее whatwg living standard, ну и над более поздней стандартизацией C# и CLR. Вообще идея сделать карманный not invented here ISO и им всё стандартизировать это отличный трюк в духе MS.

2. всё незнакомое - привет, хаскель. Тут есть хороший пример ARINC 653 APEX services. Это 1 и 3, но не 2.

3. Плохо воспринятые стандарты. Это такой запасной вариант для no true scotsman. 1 и 2 тоже конечно, но не в такой мере. То есть, ну вообще всё можно объявить "плохо воспринятым".

Например, С++ - это плохо воспринятый стандарт, знакомый только в тех местах, которые существовали до 1998 года (20 лет назад!).

Можно и в обратную сторону рассуждать. Ну вот почему нода хреновая? Начнём с того, что стандарт на жс знаком, но "плохо воспринят". А также потому, что часть POSIX-стандарта, отвечающая за эвентлупы, "незнакома и плохо воспринята", а кроме того он реально её не использует а использует epoll, который хорошо воспринят, но незнаком и не стандарт! Не говоря уже о дисковом IO. Ну и в линуксе реализация асинхронного дискового IO достаточно херова для того чтобы быть юзабельной. Наконец, народ не пишет приложения, требующие эвентлупов так как пишет на похапе, и ему неведомы те преимущества, которые сулят эвентлупописателю нода и v8, если сравнивать с сями и libev.

В связи с этим интересно, у каких ещё технологий в ближайшие 20 лет есть шансы выйти на уровень "designed around familiar and well accepted standards". Ну то есть они должны быть:
- знакомыми и хорошо воспринятыми, осталось только стандартизировать
- хорошо воспринятыми стандартами, да и массы в значительной части с ними знакомы, осталось только познакомить самых упоротых

Вот интересно, есть ли прецеденты того что плохо воспринятые стандарты со временем воспринимаются хорошо? Ну вон, джава была относительно плохо воспринята.

Табличку с рейтингами надо, с количеством звёздочек в 3 категориях!
Book

Регулярки в х-е дизайнили дебилы

Короче, в регулярке "()foo|()bar" нельзя понять, вторая группа заматчилась или первая. В перле можно ('' vs undef), а в х-е нельзя, т.к. "" vs "".

https://stackoverflow.com/q/46308779/805266

Upd: таки один из 100500 оверлоадов это позволяет делать, но через жопу. Т.е. надо враппер писать
Book

Разобрался с унификацией

Есть либа unification-fd, она же Control.Unification. В кои-то веки выпилил из HNC отдельно
стоящий унификатор:

https://github.com/nponeccop/HNC/blob/master/Unifier/Unifier.hs

Это в принципе всё, весь клиентский код для того чтобы либа лепила структурную унификацию для моих термов, представленных типом T, а точнее UTerm T IntVar.

Либа предоставляет функцию unify и её несиметричный вариант subsumes (проверяющий, можно ли второй терм получить из первого подстановкой). К сожалению, out of the box ими пользоваться затруднительно т.к. всё настолько генерическое, что компилятор не знает, какой инстанс нам нужен. Дизайн не ахти, буду писать письмо автору и думать что можно сделать.

В связи с чем пришлось написать бойлерплейт:

https://github.com/nponeccop/HNC/blob/master/Unifier/Restricted.hs

Я там просто импортирую unify с обобщённым типом и экспортирую её же, но уже с нашим конкретным.

Вот примерчик унификации:

https://gist.github.com/nponeccop/739a720582c961ab05991d61fb5cb598

Можно скопировать эти три файлика - они больше ни от чего не зависят - и поэкспериментировать с унификацией в репле. Типа runStack uni1 и runStack uni2
Book

Зачем нужна человекочитаемость и дизайн

Это способ бороться с неграмотностью разработчиков и несовершенством компиляторов. Эти требования не нужны объективно, но нужны индустрии, чтобы бороться с языковым консерватизмом. Поэтому MS занимается подобной ерундой с TypeScript - потому что иначе все будет правильно, но не будет применяться говнокодерами.

Мне это вообще изначально для сей нужно было, но в принципе для чего угодно сгодится, где в мейнстриме закоренелые предрассудки.

По части обоснования у меня есть список литературы, я не сам это придумал

# Motivation and Terminology

Harsu, 2000. Re-engineering Legacy Software through Language Conversion.
Van De Vanter, 2002. The Documentary Structure of Source Code.
Bianchi, Caivano, Marengo, 2003. Iterative Reengineering of Legacy Systems.
Jones, 1995. Translating C to Ada.

# Design

Tolmach, Oliva, 1993. From ML to Ada: Strongly Typed Language Interoperability via Source Translation.
Walker, Crary, Morrisett, 2000. Typed Memory Management in a Calculus of Capabilities.

Пункт 2 нужен для обеспечения incremental reengineering, т.е. помодульного переписывания с JS на новый язык, ну и для лучшей интероперабельности с лигаси.

https://github.com/kayuri/HNC/wiki/PaperDraft
https://code.google.com/p/inv/wiki/Manifesto

Это в общих словах, что делается и зачем.

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

В случае Javascript производительность зачастую критична - для работы с канвасом-вебжл-сокетами-продвинутым UI, и возможность завсегда влезть в код и подправить руками дырку в производительности, пропущенную компилятором, будет если не востребована, то по-крайней мере оценена разработчиками.

И текникал лидами, у которых всегда будут ответы на вопросы руководства о технических рисках

А что если предлагаемый никому не известный говнокомпилятор окажется багливым? - Ну, он маленький и можно самим поправить в нем баг, а если обнаружится фатальный недостаток - завсегда можно съехать с него и писать по старинке

А что если у нас всё будет тормозить, а нам для того чтобы исправить тормоза, придется переписать пол-проекта? - Не придется, так как дизайн тот же самый, максимум пару функций руками подправим в тех местах, где обнаружится жопа с производительностью.

А что если завтра два программиста, которые хорошо овладели говноязыком, завтра умрут, а остальные участники проекта не смогут его поддерживать, т.к. не владеют технологией настолько хорошо? Ничего не произойдет, толпа идиотов возьмет себе выходные файлы с простыми циклами и не будет у неё нужды вникать в функциональщину
Book

Помогите с дизайном

Мне нужно сконструировать функцию rewrite :: Term -> Maybe Term, переписывающую терм и возвращающую флаг, поменялся он или нет. Если не поменялся, возвращается Nothing.

Если делать в лоб, получаются Авгиевы конюшни

Какие есть варианты делать это более композиционно?

Можно в качестве промежуточного представления использовать что-то другое, а в Term -> Maybe Term конвертировать на выходе.
Book

Хочу медальку!

Блин, почему на SO нет медальки "убедил спрашивающего удалить вопрос"? Там один товарищ написал, что хочет сделать message bus на протоколе круче, чем TCP, поверх голого UDP. Я ему ответил, что прежде чем писать код, нужно основательно подготовиться и иметь как минимум бенчмарк, иллюстрирующий проблемы с TCP, и peer-reviewed дизайн нового протокола.

Интересно, считается это "украинским форумом"?

Американский форум-вы задаёте вопрос,Вам дают ответ.
Еврейский форум-вы задаёте вопрос,вас спрашивают зачем вам это знать?
Украинский форум-вы задаёте вопрос,вам долго втирают какой ты мудак!