ShadoWalkeR
Мне в руби нравится что есть итераторы помоему почти на все случаи жизни у каждого типа Array, Hash и тд
Snusmumriken
Ну я тут типа тоже написал итераторы под сеты, списки, хеши, сортированные списки и ещё что-то. Можешь глянуть ))
Но количество строк тебя может слегка угнетать. Это всё потому что тут нет никакой кодогенерации, всё ручками.
Намеренно отказался от кодогенерации, по хитрым причинам.
ShadoWalkeR
Я бы итераторы вынес в отдельную подтаблицу и подгружал через что нибудь из dofile/loadfile/requre - тогда портянка станет читабельней)
ShadoWalkeR
С командами, думаю также поступил бы)
Snusmumriken
Не, структура тут как раз конкретная.
а) один файл который подгружается - если это либа - это выгодно
б) структура делится на ядро, набор команд, набор вспомогательных классов.
Можно обрезать команды и вспомогательные классы - и тогда оно влезет в полторы-две сотни строк.
ShadoWalkeR
А в самом скрипте на соответствующие команды вешал итераторы
ShadoWalkeR
Но это нечитабельно. Я это уже проходил дважды
Snusmumriken
Во, 101 строка с тест-кейсом ))
https://pastebin.com/QJy7Evuy
Правда, всё надо строчками пихать.
Зато возвращает нормальные типы.
ShadoWalkeR
Я с OpenSIPS ушел на Kamailio в первую очередь потому что файл на 1,5 к строк можно разбить на мелкие - навигация и понимание в разы улучшились
ShadoWalkeR
А когда в каком либо редакторе работаешь еще и не нужно в голове держать - открыл в нужных местах и переключаешься между файлами
ShadoWalkeR
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
У меня аллергия на питон) Поэтому заменяю на руби)
Revertron
Yuriy
Змей не любит
ShadoWalkeR
Индивидуальная непереносимость питона 😃
Yuriy
У меня мама тоже боится
ShadoWalkeR
Очень не нравится его подход к организации кода программы. Отступы просто бесят когда в консоли работаешь со скриптами на питоне.
ShadoWalkeR
Ну и отстутствие switch-case
ShadoWalkeR
Но это мои личные заморочки)
Yuriy
Yuriy
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))))
ShadoWalkeR
Свитч-кейсы эмулируются в луях чем-то типа:
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
В питоне - схожим образом, хоть и приходится городить "класс" под это.
Но есть же метатаблицы 😃
Yuriy
Yuriy
Масса вариантов
Snusmumriken
Но есть же метатаблицы 😃
Слишком сложно для некоторых ))
Кстати, удивительный мир запрета коннекта - если у тебя require дёргает скрипты с других машин в локалке - вполне можно писать на своей машине, авось сервак подцепит ))
Как вариант, переопредели require на забор скриптов с веб-сервера (с фолбеком на обычный require) и разверни у себя веб-сервак, отдающий скрипты ))
Yuriy
Свитч-кейсы эмулируются в луях чем-то типа:
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
В питоне - схожим образом, хоть и приходится городить "класс" под это.
что в js что в lua switch-case гораздо удобнее эмулировать через
object[key]()
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);
Snusmumriken
ShadoWalkeR
ShadoWalkeR
Ну хотя бы то что сервак надо раскатать по всем правилам паппета для этого и тот же запрет рута и sudo получится
Snusmumriken
ShadoWalkeR
Мне моего хватает - все равно сравнение будет по полной строке в виде ключей)
Yuriy
Yuriy
без sudo
Snusmumriken
Но в целом, "нормальные люди" делают так:
1. У каждого на компе своя локальная копия гита, и вероятно, полное окружение, цепляющее скрипты из персональной рабочей копии.
2. Есть тестовый стенд, который цепляет скрипты из рабочей копии пользователя "release" или "master".
3. Есть боевой сервер, у которого свои серипты, отдельно от гита (чтобы не сломать неловким движением в гите), и это - просто копия master'а.
ShadoWalkeR
Мне кажется вы пытаетесь решить несуществующую проблему - вам неудобно работать в консоли и поэтому пытаетесь меня убедить что мне это неудобно делать)
ShadoWalkeR
Но в целом, "нормальные люди" делают так:
1. У каждого на компе своя локальная копия гита, и вероятно, полное окружение, цепляющее скрипты из персональной рабочей копии.
2. Есть тестовый стенд, который цепляет скрипты из рабочей копии пользователя "release" или "master".
3. Есть боевой сервер, у которого свои серипты, отдельно от гита (чтобы не сломать неловким движением в гите), и это - просто копия master'а.
Оно почти так - залил в гит, слил на тестовом сервере. По быстрому в консоли отловил баги и опечатки, залил обратно в гит
ShadoWalkeR
И оттуда уже раскатывается на боевые
Snusmumriken
Ну, работа в консоли - это не дело, пардон.
Ты такой: "Вы пытаетесь решить несуществующую проблему: вам невкусно есть кактус с толстыми иголками, и вы поэтому пытаетесь меня убедить что это больно и невкусно".
Ну, кушай кактус, но тогда не трынди на питоны и всякое такое, мол, "они неидеально совместимы с моим кактусом" ))
Yuriy
Snusmumriken
А ведь есть терминалы, которые далеко не сразу отправляют запрос. Это как натуральный текстовый редактор, который по шорткату отправляет отформатированный код на сервак. Как nano с его ctrl + o, но только не сохраняющий а отправляющий команду.
ShadoWalkeR
Вы сейчас похожи на ту картинку - "В интернете ктото неправ!" 😃