ShadoWalkeR
Мне в руби нравится что есть итераторы помоему почти на все случаи жизни у каждого типа Array, Hash и тд
Snusmumriken
Ну я тут типа тоже написал итераторы под сеты, списки, хеши, сортированные списки и ещё что-то. Можешь глянуть )) Но количество строк тебя может слегка угнетать. Это всё потому что тут нет никакой кодогенерации, всё ручками. Намеренно отказался от кодогенерации, по хитрым причинам.
ShadoWalkeR
Я бы итераторы вынес в отдельную подтаблицу и подгружал через что нибудь из dofile/loadfile/requre - тогда портянка станет читабельней)
ShadoWalkeR
С командами, думаю также поступил бы)
Snusmumriken
Не, структура тут как раз конкретная. а) один файл который подгружается - если это либа - это выгодно б) структура делится на ядро, набор команд, набор вспомогательных классов. Можно обрезать команды и вспомогательные классы - и тогда оно влезет в полторы-две сотни строк.
ShadoWalkeR
А в самом скрипте на соответствующие команды вешал итераторы
ShadoWalkeR
Но это нечитабельно. Я это уже проходил дважды
Snusmumriken
Во, 101 строка с тест-кейсом )) https://pastebin.com/QJy7Evuy Правда, всё надо строчками пихать. Зато возвращает нормальные типы.
ShadoWalkeR
Я с OpenSIPS ушел на Kamailio в первую очередь потому что файл на 1,5 к строк можно разбить на мелкие - навигация и понимание в разы улучшились
ShadoWalkeR
А когда в каком либо редакторе работаешь еще и не нужно в голове держать - открыл в нужных местах и переключаешься между файлами
Snusmumriken
Я с OpenSIPS ушел на Kamailio в первую очередь потому что файл на 1,5 к строк можно разбить на мелкие - навигация и понимание в разы улучшились
У библиотек - не нужна навигация. Один раз написал и всё. Потом только ИНОГДА ходишь по "разделам" для справки, а если написал доку - то и это не нужно. А вот подгребать библиотеку как папку, с файлами "init.lua", "core.lua", "module_foo.lua" - кошмар. Я проверял, беготни в миллиард раз больше, когда у тебя много проектов ))
ShadoWalkeR
ShadoWalkeR
Он вот это порождает)
ShadoWalkeR
Кроме того DRY)
Snusmumriken
Меня до сих пор сильно напрягает подход luasocket. Могли же объединить в один балшой-балшой файлик, который спокойно цепляется параллельно с dll-кой.
Snusmumriken
Но нет, обязательно надо дробить. И мне нужно создавать/цеплять папку, вместо переноса пары файликов.
ShadoWalkeR
На Go, кстати, не пишешь?
ShadoWalkeR
А то там такие же подходы 😃
Snusmumriken
Кроме того DRY)
У JS есть один забавный подход, когда один огромный фреймворк на 10 мегабайт кода - склеивается в один файл, минифицируется и превращается тремя копейками того же кода, в одном файлике. Мне нравится этот подход в библиотеках. Когда у тебя есть две версии: клеёная/минифицированная "для переноса", и нормальная-читабельная "для дебага". Потому что меньше мышиной возни. А то прикинь, мне надо кому-то скинуть либу, и вместо того чтобы скинуть txt/lua-файлик, мне надо мутить архивы и снова возиться ))
Snusmumriken
А вот в коде конкретного проекта - да, активно поддерживаем чистоту, бьём на отдельные логически завершённые файлы-модули, мутим древовидную структуру подмодулей (по реквайрному признаку) и т.д. Потому что ты (и не только ты) читаешь код твоего проекта гораздо чаще, чем код очередной "активно поддерживаемой либы, в которой давно пофикшены основные баги".
ShadoWalkeR
Я, кажется починил свой require 😃
Snusmumriken
Читами?
ShadoWalkeR
Еще бы ему не быть nil, если я пытаюсь присвоить переменной результат выполнения init() которого нет
ShadoWalkeR
Пришлось делать REDIS = require 'redis_wrapper' REDIS.init()
Snusmumriken
Слушай, ты так часто используешь init. Это, в целом, "стандартная функция" классов-объектов. Подцепи middleclass, используй нормальное ООП, всяко чище-конкретнее будет.
ShadoWalkeR
Я просто не очень люблю луа)
ShadoWalkeR
И не хочу в него погружаться)))
Snusmumriken
ShadoWalkeR
ShadoWalkeR
У меня луа просто постоянно оставляет ощущение поделки сделаной безусловно талантливым, но но без реального опыта, студентом
Ihor
А какой язык тогда вообще радует-то?
ShadoWalkeR
Никакой) Но отторжения не вызывает руби и С++, когда еще думал что буду в геймдеве работать)
Revertron
PHP 😃 😉
ShadoWalkeR
В качестве скриптов вместо баша он неплох. Сложное чтото на нем я не стал бы писать
ShadoWalkeR
)
Revertron
Он для скриптов, дергаемых с веба, а вместо баша (например из крона) лучше питон :)
ShadoWalkeR
У меня аллергия на питон) Поэтому заменяю на руби)
Yuriy
Змей не любит
ShadoWalkeR
Индивидуальная непереносимость питона 😃
Yuriy
У меня мама тоже боится
Yuriy
Индивидуальная непереносимость питона 😃
Вообще питона сложно перенести. Он тяжелый
ShadoWalkeR
Очень не нравится его подход к организации кода программы. Отступы просто бесят когда в консоли работаешь со скриптами на питоне.
ShadoWalkeR
Ну и отстутствие switch-case
ShadoWalkeR
Но это мои личные заморочки)
ShadoWalkeR
В консоли со скриптами... бр... Что то мне подсказвает что не в оступах тут дело)
Святая уверенность что vim лучшая ide на свете?) Или что даже новые тестовые вещи на тестовый стенд надо раскатываться только CIем?) Или это такая попытка опять меня завуалированно оскорбить?))))
ShadoWalkeR
Ну звиняйте - у меня на сервера гуи не завезли
Yuriy
Зачем gui? можно же открыть файл чере sftp scp и тд Куча вариантав чтобы не трахаться с консолью
Yuriy
modaxterm откройте для себя наконец
Snusmumriken
Ну и отстутствие switch-case
Свитч-кейсы эмулируются в луях чем-то типа: handler = { state1 = function(data, ip, port) return bla-bla1 end, state2 = function(data, ip, port) return bla-bla2 end, default = function(data, ip, port) return bla-bla3 end } function foo() local data, ip, port = receivefrom(bla-bla) local switch = data:match('%w+') local func = handler[switch] or handler.default func(data, ip, port) end В питоне - схожим образом, хоть и приходится городить "класс" под это.
ShadoWalkeR
Откройте для себя удивительный мир запрета коннекта под рутом и работу из под sudo))))
Yuriy
Откройте для себя удивительный мир запрета коннекта под рутом и работу из под sudo))))
Блин. Сделайте копию, открывайте редактируйте потом копируйте
Yuriy
Масса вариантов
ShadoWalkeR
Блин. Сделайте копию, открывайте редактируйте потом копируйте
Пробовал - много лишних телодвижений которые начинают раздражать
Snusmumriken
Но есть же метатаблицы 😃
Слишком сложно для некоторых )) Кстати, удивительный мир запрета коннекта - если у тебя require дёргает скрипты с других машин в локалке - вполне можно писать на своей машине, авось сервак подцепит )) Как вариант, переопредели require на забор скриптов с веб-сервера (с фолбеком на обычный require) и разверни у себя веб-сервак, отдающий скрипты ))
Yuriy
Пробовал - много лишних телодвижений которые начинают раздражать
Ну кому как. Меня больше бесит консоль и ее неудобства нежжели копирование
Yuriy
А вообще лучше всего сделать себе нормальный стенд на локальной машине и готовое уже закидвать на сервер
ShadoWalkeR
local M = {}; local M_mt = { __index = function(self, key) -- Типа defalt end; } function M.case1() end; function M.case2() end; function M.case3() end; return setmetatable(M, M_mt);
Yuriy
окружение максимально приближенное к продакшену.
А что мешает построить на локальном стенде такое окружение?
ShadoWalkeR
Ну хотя бы то что сервак надо раскатать по всем правилам паппета для этого и тот же запрет рута и sudo получится
Snusmumriken
local M = {}; local M_mt = { __index = function(self, key) -- Типа defalt end; } function M.case1() end; function M.case2() end; function M.case3() end; return setmetatable(M, M_mt);
Кстати, в моей редиске как раз аналогичный свитч-кейс )) Жутко быстрый и рекурсивно принимающий множественные типы.
ShadoWalkeR
Мне моего хватает - все равно сравнение будет по полной строке в виде ключей)
Yuriy
Ну хотя бы то что сервак надо раскатать по всем правилам паппета для этого и тот же запрет рута и sudo получится
А почему нельзя на локальной машине запретить sudo? все равно же изначально работаешь под пользователем
Yuriy
без sudo
Snusmumriken
Но в целом, "нормальные люди" делают так: 1. У каждого на компе своя локальная копия гита, и вероятно, полное окружение, цепляющее скрипты из персональной рабочей копии. 2. Есть тестовый стенд, который цепляет скрипты из рабочей копии пользователя "release" или "master". 3. Есть боевой сервер, у которого свои серипты, отдельно от гита (чтобы не сломать неловким движением в гите), и это - просто копия master'а.
ShadoWalkeR
Мне кажется вы пытаетесь решить несуществующую проблему - вам неудобно работать в консоли и поэтому пытаетесь меня убедить что мне это неудобно делать)
ShadoWalkeR
И оттуда уже раскатывается на боевые
Snusmumriken
Ну, работа в консоли - это не дело, пардон. Ты такой: "Вы пытаетесь решить несуществующую проблему: вам невкусно есть кактус с толстыми иголками, и вы поэтому пытаетесь меня убедить что это больно и невкусно". Ну, кушай кактус, но тогда не трынди на питоны и всякое такое, мол, "они неидеально совместимы с моим кактусом" ))
Yuriy
Snusmumriken
А ведь есть терминалы, которые далеко не сразу отправляют запрос. Это как натуральный текстовый редактор, который по шорткату отправляет отформатированный код на сервак. Как nano с его ctrl + o, но только не сохраняющий а отправляющий команду.
Snusmumriken
Оно почти так - залил в гит, слил на тестовом сервере. По быстрому в консоли отловил баги и опечатки, залил обратно в гит
Когда ты можешь гонять скрипты "в реалтайме" из своей рабочей копии на тестовом сервере - работа оказывается быстрее и эффективнее. На моей практике. В том числе из-за того что у тебя в редакторе открыты нужные скрипты, их можно фиксить, ставить заметки, откатывать изменения до посинения и так далее.
ShadoWalkeR
Вы сейчас похожи на ту картинку - "В интернете ктото неправ!" 😃