>>185445 Но будет ли это читабельно? Можно дать анону возможность ставить свой фон и цветовую палитру. Или подбирать палитру автоматически на основе кастомного фона.
>>185444 (OP) В движке? Ничего. Туда смотреть никто не будет. Хотят видеть интересные обсуждения и принимать в них участие. А что касается движка, то нужно не быть мразотой и зарубить себе на носу то, что одновременно разрабатывать экспериментальные движки для борды и завлекать на борду с этим движком как минимум некрасиво. Ведь тебе потом надоест и ты забросишь всё и анониму будет некуда идти. Или ещё хуже. За бордой никто не будет присматривать. Или ещё хуже, чем предыдущее хуже, когда борду отдадут на растерзание кучке конфоблядей в качестве придатка к конфе. Подумал об этом?
У меня есть идея перевести статический контент MaidIB в динамику (отдавать через специальную настройку веб-сервера, не с помощью всяких php-функций конечно, которые нагружают систему), а затем считать количество запросов в секунду/10 секунд/минуту/10 минут/час, тем самым попытаться контролировать потенциальный DDoS. Такое считается нормальным? Nginx не позволяет создавать сложные правила для автоматического бана IP. В таком случае получается из-за каждой картинки будет делаться запрос к БД (считаться кол-во запросов с одного IP), такое увеличит нагрузку, но насколько? И не будет ли так система лучше работать в плане безопасности? В любом случае придётся тестировать...
>>185458 А я хуй знает, я жс макака. Имеешь ввиду, что будешь хотя-бы иметь возможность логировать потенциальный дудос? Типа вести статистику количества запросов?
>>185460 Nginx способен контролировать простой DDoS, особенно с атакой на динамику, а вот статический контент в случае DDoS'а можно запрашивать с некоторым интервалом, который не станет улавливаться. Статический контент так устроен, что пользователь при первом посещении качает очень много разных файлов, а потом уже достаёт их из кэша, поэтому обычные правила не особо подходят, впрочем, с динамикой тоже есть некоторые проблемы, нужны более сложные правила.
>>185458 Мне кажется такие задачи как логирование лучше расспаралелить, юзать какой нибудь брокер сообщений. Запрос в бд на каждый запрос такое себе решение. Как по мне, это только создаст ещё одну уязвимость для дудоса.
>>185454 Там не нужен никакой реакт. По сути реакт нужен для очень-очень сложных UI, где обычно пришлось бы использовать кучу бойлерплейта для одинаковых компонентов на каждом шагу. Чтобы с этим не иметь проблем используют фреймворки. А так, на борде, можно только местами что-то подобное использовать. Там, где есть какой-то дополнительный функционал, которого может не быть в версии без JS и чтобы UX при этом не сильно страдал.
>>185458 Для подобных задач лучше использовать failtoban, или писать какой-то плагин для сервера (nginx, apache etc) на сях/крестах. Чтобы это происходило уровнем ниже, так будет для производительности лучше. Но это в идеале.
>>185470 Я пробовал связку fail2ban с настройками Nginx (limit_req_zone), но сложные правила не получается таким способом реализовать. >писать какой-то плагин для сервера (nginx, apache etc) на сях/крестах Не мой уровень.
>>185444 (OP) Вообще, у меня была идея запилить свой движок для АИБ. Без JS, скриптоты прочей поебени. ИМХО, возможностей движка TinyIB вполне хватает.
>>185445 >>185447 Не нужно. Можно плагин в бравзер поставить и запилить кастомный CSS.
И вопрос местным знатокам: как сделать несколько разделов в TinyIB?
А у меня была идея создать доску для бордостроителей. Собрать там мудрости всяческие, разные подхды к решению проблем, философствования и так далее. Всё что относится к теме. Различного добра для наполнения где-то десятка небольших тредов с четко определенной темой уже собрал. Охота показать другим и для себя что-то новое узнать. Не очень нравится смотреть как новенькие в этой теме предлагают что-то новое, а потом их труды исчезают вместе с ними. Потом приходит кто-то и не знает какие интересные вещи уже были предложены ранее, увенчались ли они успехом.
Кое-кто уже пробовал создать что-то подобное, но ничего не получилось. Ти ли из-за отсутствия интереса к этому всему, то ли из-за неподходящей политики модерации (а точнее её полного отсутствия).
>>185500 > И вопрос местным знатокам: как сделать несколько разделов в TinyIB? Точно не скажу, не прикасался конкретно к этому движку. Посмотри документацию какую-нить.
Я только что поскал на эту тему и первые ссылки ведут на реквесты этой фичи. Вероятно, там это работает так же как и в вакабе. Один инстанс движка — одна доска. Если хочешь ещё одну, то создавай её отдельно копируя все скрипты. Но опять же, утверждать не могу.
>>185522 >>185505 > Почему бы и не в /it/? Не знаю. Я раньше пробовал начинать... И каждый раз борда умирала как только я создавал там больше чем 2 треда с таким сабжем. Страшно. Кстати, да. Нужно больше чем один тред. Иначе всё как-то слишком в кучу будет свалено.
>>185574 А в чём проблема движка без javascript? У вас обычные борды без javascript не работают? В том же MaidIB рассматриваю ситуацию, что пользователь способен javascript отключить, не будет некоторых функций, но чтение/отправка должны функционировать. Стиль меняется с помощью специальной страницы, которая записывает cookie. Я уверен (хотя не проверял), почти любая борда функционирует без javascript.
Немного запутался, есть такое понятие "сервис", у меня с этим нормально в MVC, но не могу разобраться, какие имена лучше давать сервисам? Считал, что нужно по шаблону nameService, но в документации к Symfony присутствует MessageGenerator (без всякого Service в названии), находил класс с названием CurrencyConverter. На скриншоте сейчас запутанная структура, не обращайте внимание на неправильный namespace, проект находится в производственном Аду из-за рефакторинга. Собираюсь делать что-то на уровне Post/PostCreaterService.php, Post/PostService.php, код был рабочий, но требуется улучшить читабельность.
>>185792 У меня были случаи, когда браузер зависал из-за слишком больших тредов на бордах (больше 500 сообщений), а это мягкое удаление скрывает пост чисто визуально (в самом html должно присутствовать). Есть идея таки их считать, а в крайнем случае удалять посты полностью, если кто-то совсем завайпал тред.
>>185797 А зачем его вообще добавлять в дом дерево? Можно просто не рендерить по статусу в бд. А рендерить только для модеров например и подгружать все посты по страницам.
>>185800 Эту идею я мусолил у себя в голове лет 5 назад. Примерно тогда же её реализовал (наверняка не впервые) админ нультиреча. Сходи туда и посмотри есть ли у тебя желание читать скрытые посты.
>>185876 Ты дай хотя бы один пример скрытого поста, лол, а то там невозможно найти. И эта система очень удобна для верификации модераторов, которые могут творить беспредел, получается смогу дать модерку скрывающую сообщения, а потом уже дать доступ к полному удалению (хотя оно не совсем полное, но это уже другая история). Я таки решил остановиться на том, чтобы не считать скрытые посты при доведении до бамплимита, но дать пользователю возможность в настройках полностью отключить их отображение (вырезать из HTML, у меня пока страницы генерируются динамически, пусть и данные берутся из кэша). Система со скрытыми сообщениями даёт возможность жаловаться на модераторов, а иначе придётся запоминать номер своего сообщения, делать скриншоты, могу поступить так, что любой скрытый пост удалится через тот промежуток времени, когда жаловаться уже неактуально. Ах да, что зашёл то, решил сделать такую структуру проекта, за место PostService теперь PostUpdater+PostCreater+PostRemover+PostSearcher. Может так лучше... хотя теперь файлов много. Оперу турбу заблочил Роскомнадзор... с тора не постит... эх... нужно искать прокси.
аахахаха, получилось запостить без пички из под тора. напишите хоть где-нибудь об этом!!! пикча, которую хотел запостить (там просто скрин проекта с именами некоторых файлов): https://ibb.co/zQCVDBt Я, кстати, заметил, если полностью кэшировать HTML, тогда возникнут проблемы с csrf-защитой (хотя может быть есть вариант извратиться с javascript) https://ru.wikipedia.org/wiki/Межсайтовая_подделка_запроса В любом случае хочется сделать что-то современное, а производительным (с кэшированием HTML) уже является какой-нибудь TinyIB, мне легче TinyIB проапрейгредить (добавить RSS, ещё какие-нибудь функции) и получится такой фронкенштейн TinyIB (MaidIB Edition). Так будет проще и многим лучше... не нужно будет заморачиваться со статикой, кому нужно, те TinyIB скачают. Я читал код TinyIB, он простой до невозможности, легко добавлять функции. Премодерация изображения отдельно от сообщения? Пожалуйста, небольшое изменение в базе данных (одно дополнительное поле) и пост будет без картинки до одобрения. Впрочем, есть же движок доброчана, он разве не является свободным? Не знаю... ладно.
До вас до сих пор не дошло что важней гуманитарная часть борды чем техническая. Вся эта ваша красота кода для задротов. Намного важней маркетинг, продвижение, атмосфера и люди которые сидят на определенном сайте.
Есть ещё приколюха, что для капчи нужно обязательно сохранять сессию в куках, которая однозначно идентифицирует пользователя (на сервере хранится файл, который содержит заранее разгаданное значение капчи, а у пользователя в куках некий ID, который указывает на этот файл), такое происходит на любом сайте, где есть капча, но может лучше как-нибудь извратиться и в html засунуть этот SESSION_ID прямо в поле формы? А точнее некий идентификатор капчи... Тогда получится с выключенными cookie ввести капчу, подобное можно реализовать в том случае, если HTML не кэшируется, а генерируется динамически.
На этой борде присутствует какой-то captchakey в поле формы, но это значение запрашивается через javascript явно. В случае динамической генерации HTML получится и без javascript...
>>185890 Ты дай ссылку хотя бы на один скрытый модератором там пост, а то невозможно найти, рыскаю, ничего нету... >ну и зачем нужен еще один нультиреч? У меня расширяемость, поэтому рефакторить/переписывать приходится. Капча выдаёт ERROR...ааа... постинг временно ограничен... попробую зеркало в торе. Хотя бы один способ запостить существует???
>>185890 Претензии: 1) Слишком много разделов 2) Упоротый дизайн (почему нельзя просто сделать перенос строки, чтобы пространство было какое-то между постами?) 3) Лайки/дизлайки 4) Бесконечные разделы (в /b/ получилось 29 страниц, слишком много) 5) Какой-то ебанутый олень (И уже нашёл скрытое сообщение на той борде, больше не надо)
У меня есть идея отправлять удалённые сообщения в какой-нибудь /dev/null (с картинкой, текстом)... в любом случае нужно дать возможность иметь полный доступ к удалённому сообщению для оформления жалобы на модерацию. Пощу из под прокси...
>>185902 >Теги на тредах Ебанутая штука, которую надо явно в уже готовый проект добавлять. Ну, я имею ввиду, что в самом начале разработки такое себе заморачиваться... Хотя зависит от реализации, когда делал давно АИБ с тегами (потом удалил полностью), приходилось создавать поиск где используется +тег -тег -тег. По моему опыту нужно делать базис, который на 100% функционирует, а потом уже пилить всякие фичи, когда готов базис на 100%, тогда вполне реально запустить борду способную удовлетворить стандартного пользователя.
У меня такая система обновления информации о треде (код не запускал, у меня рефакторинг, пишу чисто интуитивно, какие поля выбирать потом сделаю) //Обновляет информацию о треде. public function refresh(Thread $thread) { //Получение всех постов. $posts = $this->postRepository->findByThreadId($thread->getId(), array('Id' => 'ASC')); //Количество и размер файлов, количество сообщений, последний пост. $data['filesCount'] = 0; $data['filesSize'] = 0; $data['softDeletedCount'] = 0; $data['deletedCount'] = 0; $data['bumpsCount'] = 0; $data['sagesCount'] = 0; $data['postsCount'] = 0; foreach($posts as $post) { //Существующее сообщение. if($post->getSoftDeleted() == false and $post->getDeleted() == false) { $data['filesCount'] += $post->getFilesCount(); $data['filesSize'] += $post->getFilesSize(); if($post->getSage() == false) { $data['lastBumpPostId'] = $post->getId(); $data['lastBumpPostIdInSection'] = $post->getIdInSection(); $data['bumpsCount']++; } else { $data['sagesCount']++; } $data['postsCount']++; $data['lastPostId'] = $post->getId(); } else { //Удалённое сообщение. if($post->getSoftDeleted() == true) { $data['softDeletedCount']++; } if($post->getDeleted() == true) { $data['deletedCount']++; } } } //Бамплимит. if($postsCount >= 500) { $data['bumplimitStatus'] = 1; } else { $data['bumplimitStatus'] = 0; } //Удаление. if($data['postsCount'] == 0) { $data['deleted'] = 1; } //Обновление информации. $thread = $this->threadRepository->refresh($thread, $data); //Возвращение значения. return $thread; } До этого делал обычные UPDATE при добавлении/удалении каждого сообщения, так обновлял счётчики, но посчитал такой ресурсоёмкий (который сейчас) способ зато самым стабильным, легко реализуемым и интуитивно понятным. Статистика собирается для треда/раздела/борды. В любом случае у меня всё оформлено в правильные функции, поэтому легко изменить реализацию (на вызов тех же COUNT'ов много раз), эту пока ещё не проверял. Такое just for fun. Статистика для разделов складывается из статистики для тредов... статистика для борды из статистики для разделов... Жду помидоры. У меня ещё идейка таки запросить все поля из базы данных для треда, но зато тем самым заранее создать кэш результата. Я так получаю свободу в плане сбора статистики, могу посчитать даже количество занимаемой информации одним тредом (посчитать размер каждого сообщения), эту статистику допустимо и отдельными запросами собрать, но пока так код составил, получилось зато очень быстро в плане реализации, да и в любом случае, если статистика окажется очень подробной, получается тред целиком запросил. UPDATE при добавлении/удалении каждого сообщения конечно топчик, но и за реализацией следить нужно в каждом месте, где оперирую данными, стоит удалить файл (не трогая сообщения), тогда нужно выполнить UPDATE статистики количества и размера файлов, а уж в случае отруба сервера в момент добавления/удаления сообщения неизвестно не наебнётся ли статистика... в треде 300 сообщений, а напишет, что 299, тогда эта ошибка будет тянуться уже и в раздел, потом в общую статистику борду, никогда не исправится, скрипт не будет знать сколько на самом деле сообщений в треде, а делать +1 при добавлении нового сообщении.
public function __construct(TranslatorInterface $translator) { //Переводчик. $this->translator = $translator; //Конфигурация. $config = array(); $config['php']['_description'] = $this->translator->trans('PHP опции.'); $config['php']['memory_limit']['_description'] = $this->translator->trans('Лимит памяти.'); $config['php']['max_execution_time']['_description'] = $this->translator->trans('Максимальное время исполнения.'); $config['html']['_description'] = $this->translator->trans('HTML.'); $config['html']['compress']['_description'] = $this->translator->trans('Сжатие html.'); $config['csrf']['_description'] = $this->translator->trans('Сsrf-токен.'); $config['captcha']['_description'] = $this->translator->trans('Капча.'); $config['captcha']['status']['_description'] = $this->translator->trans('Статус капчи.'); ... //Сохранение. $this->config = $config; } ... } Перевожу каждый комментарий отсюда >>185449 в специальный параметр _description, который должен объяснять, что делает та или иная опция. Тупой копипаст... DefaultConfigInfo даёт инфу о каждой опции, а DefaultConfigSearcher содержит саму стандартную конфигурацию (но может потом переведу в какой-нибудь DefaultConfig или DefaultConfigData, а DefaultConfigSearcher будет содержать тупо методы get, getSection, getAll). class DefaultConfigSearcher {
public function __construct(TranslatorInterface $translator) { //Переводчик. $this->translator = $translator; //Конфигурация. $config = array(); //PHP опции. $config['php']['memory_limit'] = '120M'; //Лимит памяти. $config['php']['max_execution_time'] = '10'; //Максимальное время исполнения. //HTML. $config['html']['compress'] = false; //Сжатие html. //СSRF. $config['csrf'] = false; //Сsrf-токен. //Капча. $config['captcha']['status'] = false; //Статус капчи. $config['captcha']['type'] = 'gregwar'; //Тип капчи. ... //Сохранение. $this->config = $config; } ... } Этот стандартный конфиг должен при первом запуске подгрузиться в базу данных. У меня уже готов шаблон ConfigVariation, таблицы в базе данных, которая станет содержать разные варианты конфига (можно переключаться в любой момент), собираюсь записывать json сохранённой конфигурации в специальном поле. Таблица Config содержит поля: ID, Name (ключ), Value (строка/значение), а ConfigVariation содержит поля: ID, Name (название варианта конфига), Value (json).
>>185885 Ты почти прав. На самом деле самое главное > люди которые сидят на определенном сайте А маркетинг-шмаркетинг — это такая же техническая херня, как и ковыряние в движках.
Но без этой технической херни сидеть вообще никто не будет и ничего никуда не взлетит.
>>185939 >Борде не нужен ООП на самом деле. Процедурно программировать в 2021 году? > А нужен ли тебе фреймворк? Ты лучше задумайся о том, чем любой другой движок тогда хуже, они выполняют свою функцию на 100%, могу обычный TinyIB расширить. Нужно понимать, что такое хобби, не искать везде личной выгоды, иначе любое программное обеспечение, которое пишется за бесплатно, не имеет никакого смысла. Я когда напишу АИБ в один файл процедурно программируя получу много критики в свой адрес на разных форумах... Никто в этом процедурном коде разбираться не будет, а ещё даже в ООП иногда сложно разобраться, проект разрушится, когда автор в нём потеряется.
>>185943 > Процедурно программировать в 2021 году? Да. Если такая парадигма подходит для решения задачи. > Нужно понимать, что такое хобби Тогда вопросов нет. Хотя... Лень искать пасту.
>>185945 >Да. Если такая парадигма подходит для решения задачи. Если рассуждать на уровне? "не нужно ООП, если никто не платит, лучше процедурно, так проще", тогда получается: "не нужно программировать, если никто не платит". Уровень сложно возрастает в зависимости от количества вложенных средств, но если вложено ноль,тогда не нужно решать никакие задачи.
>>185944 > Комментарии вида // Проверка что a меньше b if (a < b) { } Зачем? Это лишний мусор, который уменьшает читаемость кода - впустую отвлекает внимание и меньше актуального кода умещается на экран. Хорошо написанный код сам себя документирует.
Вот это вообще убило. Ты завязывай с такой хуйней. Если ты хочешь документировать код, то пиши phpdoc и описывай параметры и выход а не то что масло масляное.
>>185947 Не каждый понимает английский язык на должном уровне. У меня начинается kernel panic, когда читаю свой код, потому что нужно английский в русский переводить, объёма становится много, а английский не читается автоматически. Я могу прочитать 10 строчек кода, которые составил, но когда их 100, тогда нужно вникать и вспоминать английские словечки. Вот здесь >>185911 тоже тогда комментарии не нужны, просто привыкни, что getSoftDeleted() определяет удалённое сообщение, каждый раз интерпретируй, когда код читаешь, что делает. Комментарии ещё отлично разделяют код на блоки, в случае того же процедурного программирования с их помощью вполне читабельно можно сделать.
>>185950 Когда комментарии слишком сложные, уже пора создавать отдельную функцию/метод/класс. getCSSItemSelector. И когда метод возвращает строку, так и указать можно прямо getCSSItemSelector(string $item_name): string { ... } В PHP 8 ещё сделали именованные аргументы, должно лучше код документировать. setcookie( name: 'week', expires: time() + 60 60 24 *14, );
>>185949 >Не каждый понимает английский язык на должном уровне. Если программист не понимает английский на уровне достаточном для понимая кода, то ему или в 5й класс, или в 1С. >нужно английский в русский переводить Не нужно. >английский не читается автоматически Это не английский а его сильно урезанная версия. У тебя нет ни одного целого предложения даже, в основном глаголы и существительные. >процедурного программирования Оно мертво и подходит только для школьных задач для информатике. В реальном мире есть объекты и их взаимодействия. >getSoftDeleted Название говно, поэтому и не понятно. Используй isDeleted(bool $soft = true) { >Комментарии ещё отлично разделяют код на блоки Они не должны разделять, разделять должны функции и методы, а комментарии должны пояснять работу кода, если она не очевидна из написанного. >getCSSItemSelector Слишком длинно и громоздко. Про fn : string знаю, это старый довольно код.
>>185952 >Если программист не понимает английский на уровне достаточном для понимая кода, то ему или в 5й класс, или в 1С. Его нужно интерпретировать... Мне на русском языке в любом случае проще читать литературу. >Не нужно. Код состоит из нескольких конструкций, нужно понять каждую. >Название говно, поэтому и не понятно. Используй Так это название поля в таблице из базы данных.... >Они не должны разделять, разделять должны функции и методы, а комментарии должны пояснять работу кода, если она не очевидна из написанного. Вот, а теперь прикинь, что каждый раз нужно думать, какую часть кода сделать новой функцией или методом. Не проще ли разбить код на блоки, а потом разобраться нужно ли перенести куда-то в другое место? >Слишком длинно и громоздко. Почему громоздко? В любом случае оно должно быть в каком-то классе содержаться указывающим на CSS... хоть где-то должно быть упоминание о том с чем работает функция.
>>185954 >Так это название поля в таблице из базы данных.... И что с того, он от этого должен стать лучше? >Вот, а теперь прикинь, что каждый раз нужно думать, какую часть кода сделать новой функцией или методом. Не проще ли разбить код на блоки, а потом разобраться нужно ли перенести куда-то в другое место? Нет не нужно думать, это все интуитивно понятно. Если у тебя идет огромный кусок кода. Ты смотришь на него и понимаешь, что вот эту кучку надо вынести в метод, ей здесь не место. >Почему громоздко? В любом случае оно должно быть в каком-то классе содержаться указывающим на CSS... хоть где-то должно быть упоминание о том с чем работает функция. Потому что это масло масляное. То что оно работает с css написано в описании к функции, при наведении.
>>185955 >findLastPostBySectionIdAndThreadIdInSection Что за... Ты совсем из ума выжил? /** * Get last post in section and thread * @param $section * @param $thread */ getLastPost Ты псих. Так писать код нельзя. Отнимите у него компьютер, кто-нибудь. Ты просто кашу пишешь, поэтому и трудно вчитываться. Дам тебе совет - 1 строка кода должны укладываться в 80 символов, максимум 120, включая табуляцию.
>>185956 >И что с того, он от этого должен стать лучше? Поле называется soft_deleted, а метод getSoftDeleted(), с этим ничего нельзя сделать (Symfony генерирует название для методов по именам полей), но можно извратиться и тронуть модель/entity. >Потому что это масло масляное. То что оно работает с css написано в описании к функции, при наведении. Ой, я отрубаю все эти фичи редакторов програмнного кода, они пестрят красным, пишут ошибки, когда просто код дополняешь, всплывающие эти шутки раздражают... >>185957 "Найти последний пост по идентификатору раздела и идентификатору треда внутри раздела." Это репозиторий, они так устроены...
>>185958 >Ой, я отрубаю все эти фичи редакторов програмнного кода, они пестрят красным, пишут ошибки, когда просто код дополняешь, всплывающие эти шутки раздражают... Ну тогда продолжай писать говно вместо кода которое потом невозможно будет кому то еще понять. Ты реально псих.
>>185959 Этот getLastPost вообще не подходит, не понятно какие параметры принимает. У треда есть уникальный ID, а ещё уникальный ID внутри раздела, предположим, что существует сообщение №3 внутри раздела, но уникальный ID для борды равен №5. >Ну тогда продолжай писать говно вместо кода которое потом невозможно будет кому то еще понять. Но оно реально упорото и при попытке дополнить код выдаёт ошибки и красные маркеры, пока код не закончишь составлять... Пока пишешь fun оно ебашит красненьким, дополняешь functio и оно продолжает... вот закончил наконец-то function... теперь нужно {, а пока этого не сделаешь оно ебашит красненьким. Ещё эти всплывающие подсказки и автодополнения сбивают с толку. getLastPost на деле должен быть где-то в сервисе, а не репозитории, репозиторий тупо запросы делает, типа переводит SQL в свой формат через название функций этих упоротых.
>>185960 Используй человеческий редактор, например vscode. В нормальных редакторах, пока ты печатаешь они не анализируют код, а только когда закончил печатать. Или ты по 1му символу в час печатаешь? >Этот getLastPost вообще не подходит, не понятно какие параметры принимает. Наводишь мышкой и видишь сигнатуру. Все понятно. Просто это ты гений умнее других, что придумали все эти инструменты для упрощения кода и его написания и говоришь нинужоно, нужоно писать эссе вместо названий функций.
>>185961 >В нормальных редакторах, пока ты печатаешь они не анализируют код, а только когда закончил печатать. Или ты по 1му символу в час печатаешь? Я когда enter нажму после public function twoPlusTwo() { Что произойдёт? Оно начнёт ебашить, что скобочку не закрыл... Бывает редактор самостоятельно закрывает скобочки, такое особенно раздражает. >Просто это ты гений умнее других, что придумали все эти инструменты для упрощения кода и его написания и говоришь нинужоно, нужоно писать эссе вместо названий функций. На деле в репозитории нельзя иначе давать названия функциям, базарю, упрощается на уровне сервиса.
>>185962 >Оно начнёт ебашить, что скобочку не закрыл Нормальный редактор поставит индент за ним твой курсор, и закрывающую скобку. >Бывает редактор самостоятельно закрывает скобочки, такое особенно раздражает. Говорю же - псих. >репозитории В каком, покажи хоть один репо на github где такое говно есть кроме https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition Найдешь такое в кодбазе любого проекта большой компании?
>>185963 >Нормальный редактор поставит индент за ним твой курсор, и закрывающую скобку. Сейчас запустил phpStorm (у меня пробный период), оно эти восклицательные знаки даёт, что код неправильный, когда пишу код $thi тогда даёт вариант $this, а зачем оно мне нужно, если и так знаю? И потом ещё после $this-> название всех методов на выбор, а оно не надо и так отлично названия помню. >В каком, покажи хоть один репо на github где такое говно есть кроме https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition https://symfony.com/doc/3.3/doctrine/repository.html >findAllOrderedByName Тут советуют ещё тип сортировки указывать... потому что оно типа SQL, но в названии функции.
оно потом в сервис перейдёт какой-нибудь, типа PostSearcher, там будет метод getLastPost() (инфа не 100%), который обращается к репозиторую. Кстати, стоит заметить: findLastPostBySectionIdAndThreadIdInSection отличается от findLastPostBySectionIdAndThreadPostIdInSection
в первом случае требуется уникальный ID треда внутри раздела: $this->findBy(array('verified' => 1, 'section_id' => $section, 'thread_id_in_section' => $thread), array('id' => 'DESC'), 1); а во втором случае уникальный ID поста для треда: $this->findBy(array('verified' => 1, 'section_id' => $section, 'thread_post_id_in_section' => $thread), array('id' => 'DESC'), 1);
предположим тред имеет номер 3, но сам пост с номером 45. 3-ий тред в разделе, но 45-ый пост по счёту.
>>185964 Там функция без параметров дурень. >>185964 >когда пишу код $thi тогда даёт вариант $this, а зачем оно мне нужно, если и так знаю? И потом ещё после $this-> название всех методов на выбор, а оно не надо и так отлично названия помню. Ты нахуй реально псих. Это нужно в особенности для тех кто фиксит чужой код, ну или уйдешь ты, через месяц откроешь проект, и что, будешь учить все методы? И ты методы которые называются как эссе тоже вводишь полностью вручную, да? Ты реально псих, прости за агрессию. Я не знаю, как тебе объяснить как не заниматься хуйней. Найди что ли гайд как правильно программировать или что? Я не знаю, ты реально занимаешься какой-то дуростью и принципиально не хочешь идти простым путем, аля нинужоно.
А и еще добавлю, ты если нажмешь таб то он введет за тебя выбранный метод, ты наверное не знал об этом, раз ты названия помнишь.
>>185966 >Там функция без параметров дурень. Ага, а название уже длинное: findAllOrderedByName >И ты методы которые называются как эссе тоже вводишь полностью вручную, да? У меня такие названия методов конкретно в репозитории, такой пример, когда английский нужно интерпретировать, но комментарий упростит задачу.
>>185967 азаза, getPost(int $localId = 0):, а когда нужно по глобальному айди достать, что тогда делать? getPostByUID(int $uid)? ты конечно можешь сейчас какие-то новые сущности придумать, но есть тупо Thread (модель) и ThreadRepository (сборник SQL запросов).
>>185968 >Ага, а название уже длинное: findAllOrderedByName И что? Если бы были параметры, то было бы короче, потому что название параметров уже есть. >У меня такие названия методов конкретно в репозитории, такой пример, когда английский нужно интерпретировать, но комментарий упростит задачу. Перефразируй, я не понимаю что ты имеешь ввиду? >>185969 >азаза, getPost(int $localId = 0):, а когда нужно по глобальному айди достать, что тогда делать? getPostByUID(int $uid)? Дурак? У тебя есть метод класса Thread который возвращает пост по локальному id. А есть класс Post, можешь в него добавить просто static Post::get($global_id): Post и все.
>>185969 По твоему описанию какое-то говно. Делай так, и будет тебе радость в жизни: class Board { static getById($globalId): Board; getThread($threadId): Thread; getPost($globalPostId): Post; } class Thread { static getById($globalId): Thread; getPost($localPostId): Post; } class Post { static getById($globalId): Post; }
>>185970 >И что? Если бы были параметры, то было бы короче, потому что название параметров уже есть. Не-не, обрати внимание, что если не сделаешь сложное название, тогда непонятно какие последствия будут, когда получится нечто схожее, но с немного другими параметрами, возникнет коллизия названий методов или какое-то извращение. findLastPostBySectionIdAndThreadIdInSection findLastPostBySectionIdAndThreadPostIdInSection два разных метода, которые дают один результат, но принимают разные параметры. >Перефразируй, я не понимаю что ты имеешь ввиду? Если вчитываться в findLastPostBySectionIdAndThreadIdInSection, тогда комментарии не нужны, достаточно знать английский.
>>185971 И все, если хочешь получить по глобальному id любую сущьность, используешь статический метод класса <ClassName>::getById, если нужно получить дочернюю сущность, то используешь методы инстанса класса, например $therad->getPost.
>>185973 Я тебя не понимаю, у меня Thread (сущность) и ThreadRepository (коллекция). Я не могу поступить иначе, так устроена система фреймворка... потом уже из ThreadRepository можно сделать какой-то сервис.
>>185972 >findLastPostBySectionIdAndThreadIdInSection >findLastPostBySectionIdAndThreadPostIdInSection Говно какое-то. Если ты нормально пишешь и у тебя нормально спроектировано все, у тебя никаких коллизий не будет. Ты когда по математике задачки решал, ты больше 2х раз писал например единицы измерения, кроме как в дано и в ответе?
>>185974 >Я не могу поступить иначе, так устроена система фреймворка Значит либо: а) Фреймворк говно б) Ты не правильно им пользуешься, что у тебя получается говно
Тебе правильно аноны говорили, что фрейворк то тебе не особо нужен, ты просто не умеешь им правильно орудовать. Это как пытаться срубить дерево тупой стороной топора - топор сделан хорошо, но вот пользуешься ты им не так как надо.
По тому что я вижу у тебя получается что-то невнятное и непонятное, лучше возьми ORM какую-ниубдь, а еще лучше просто sql напрямую используй и сделай сам классы, по типу того как я выше показал, и будет все нормально, легко управляемое и не будут методы на пол экрана, это не джава в конце концов, где названия классов длиннее сурскода.
>>185977 Извини, а вот это: >>185971 разве не является попыткой создать свой фреймворк? >>185978 >ORM В Symfony используется Doctrine. > и сделай сам классы, по типу того как я выше показал Так это велосипед.
>>185980 Но такому проекту как борда >50% всего этого не нужно. Это сделано для энтерпрайза, где так принято и это действительно помогает. А у тебя получается пока-что велосипед, только с квадратными колесами.
>>185981 У меня была такая ситуация, что немного заебался с формами (ну потому что там сложно разобраться в некоторых вещах связанных с условиями, если нужно свои определить, тот же лимит на общий размер файлов), тогда начал что-то типа велосипеда делать, а потом понял, что никто даже вчитываться не будет, есть стандартная библиотека, в ней разбираются, а в чужом коде никто рыскать не будет, что там за кастомные формы или свой фреймворк новый. Вряд ли кто-то захочет переучитываться и разбираться в ещё одном минифреймворке. >>185982 Нужна расширяемость.
>>185983 >расширяемость До пикабу или форума? Расширяемость есть и в том что я выше кидал, а расширяемость которую дает тебе такой фрейм это только возможность прикрутить второй сайт к первому, с одной кодбазой, от чего выигрывают только большие проекты, какой-нибудь сайт microsoft например, где туча разделов абсолютно разных, но между ними много связанных сущностей (пользователей, статей, цен и т.д).
>>185982 Почему не нужно? Анонимный форум чем контролировать будешь? Его же быстро сломают... Ты не можешь заебенить регистрацию обязательную и сделать аналог phpBB, но при этом нужны настройки, надёжная защита, много разных функций, которые не должны отвалиться. >>185984 Кто будет разбираться в чужом коде? У фреймворка есть документация, для расширяемости придётся свою составлять, некоторым придётся ещё что-то новое изучать.
>>185985 Да, а навешенное говно твое не требует разбирательств чтобы что-то расширить? Те кто хотят расширить будут разбираться в чужом коде. Тем более чем проще и понятнее схема, тем проще другим ее редактировать и расширять. Ты хочешь сделать не борду, а сразу клон реддита со всем что уже есть. Проекты делаются итерационно, ты не можешь сразу написать весь проект который будет идеален. Для этого есть рефакторинг. Расширяемость должна ограничиваться к тому же, есть граница между одним продуктом и другим, иначе это будет так, сегодня это двач, а завтра это двач + одноклассники + тикток, а после завтра это вконтакте + weibo без двача.
>>185986 > Те кто хотят расширить будут разбираться в чужом коде. Мне не захотелось разбираться в чужом коде. >Ты хочешь сделать не борду, а сразу клон реддита со всем что уже есть. Почему бы и нет? >Расширяемость должна ограничиваться к тому же, есть граница между одним продуктом и другим, иначе это будет так, сегодня это двач, а завтра это двач + одноклассники + тикток, а после завтра это вконтакте + weibo без двача. Почему бы и нет? АИБ отличается отсутствием обязательной регистрации...
>>185987 Я даже не знаю что сказать. Это ответ уровня "И чо?", который просто ломает любую аргументацию. Потому что нет, потому что есть продукт А и есть продукт Б и это разные продукты.
>>185988 Ты лучше объясни, почему нужно работающий проект переписывать? У меня наличествует функционирующая борда на фреймворке Symfony, почему нужно отказаться от фреймворка и заново пилить борду? Я занимаюсь обычным рефакторингом с целью улучшения читабильности кода, но на деле там вполне себе в работающим состоянии была борда. Информация о Symfony /info/about.html
Выдаёт ID треда по названию раздела и идентификатору в нём сообщения /redirect/{название_раздела}/{идентификатор_сообщения_внутри_раздела}.json
Последний уникальный ID сообщения /all/last_post_id.json
Последний ID сообщения в разделе /{название_раздела}/last_post_id.json
Последний ID сообщения в треде /{название_раздела}/last_post_id/{идентификатор_треда}.json
Номера сообщений, которые следуют после уникального ID /all/posts_id_after_{идентификатор_сообщения}.json
Номера сообщений, которые следуют после ID внутри раздела /{название_раздела}/posts_id_after_{идентификатор_сообщения_внутри_раздела}.json
Номера сообщений, которые следуют после ID внутри треда /{название_раздела}/posts_id_after_{идентификатор_сообщения_внутри_раздела}/{идентификатор_треда}.json
Каталог тредов /catalog/all/{номер_страницы}.json
Каталог тредов внутри раздела /catalog/{название_раздела}/{номер_страницы}.json
Страница с тредами и последними пятью к ним сообщениям /all/{номер_страницы}.json
Страница с тредами и последними пятью к ним сообщениям внутри раздела /{название_раздела}/{номер_страницы}.json
Все сообщения внутри раздела /{название_раздела}/posts/{номер_страницы}.json
Сообщение по уникальному ID /all/post/{идентификатор_сообщения}.{_format}
Сообщение по ID внутри раздела /{название_раздела}/post/{идентификатор_сообщения_внутри_раздела}.json
Вы так же можете запросить любую HTML с содержимым без всякой лишней информации, для этого достаточно добавить в параметре GET значение onlycontent=1, пример: /api.html?onlycontent=1.
>>185989 Работает и пускай. Если у тебя уже рабочий проект, то лучше допили его до человеческого состояния. Хотя бы сигнатуры функций используй адекватные и комментарии излишние выпили, а в остальном ок, я думал ты делаешь с нуля и такие костыли городишь, ну а раз уже есть гора костылей, то попробуй мейнтейнить это, пока не свихнешься.
>>185992 А ничего так, что вот сюда >>185971 заебенишь SQL запрос? Почему бы не создать отдельный класс, который будет содержать чисто SQL-запросы без всякой привязки в чему-то существенному? За место того, чтобы делать запрос, будешь использовать длинное название функции... и засунешь таки в эти методы >>185971
>>185993 Это называется orm держу в курсе. И нет не проще, ты слишком сильно абстрагируешься от реализации. Имплементации запросов можно и там писать, потому что это модель данных. Если ты хочешь абстрагироваться от sql, то используй orm напрямую в методах получения данных. А вместо говна в виде огромных и бесполезных названий функций давно придумали деструктуризацию. Она даже в php есть: https://stackoverflow.com/a/8379034/8035872 >>185994 Блять ты псих.
>>185995 Не замечаешь, что оно таки сокращает количество кода? public function findNoThreadsBySection($section, array $orderBy = null, $limit = null, $offset = null) { return $this->findBy(array(array('section_id', '=', $section), array('thread_id', '!=', 0), array('varified', '=', true)), $orderBy, $limit, $offset); }
public function findByThreadId($threadId, array $orderBy = array(), $limit = null, $offset = null) { return $this->findBy(array('thread_id' => $threadId), $orderBy, $limit, $offset); } (некоторые названия функций могут быть запутанными, но это потом исправлю)
>>185996 >Не замечаешь, что оно таки сокращает количество кода? Можешь считать, что я так скозал, но это говно. Прозе было бы напрямую find использовать. А по хорошему, так вообще это был бы статик метод класса как я выше кидал.
>>185997 В чём прикол использовать напрямую, если так длиннее получается? findByThreadId(5) короче чем findBy(array('thread_id' => 5)); ну можно так конечно findBy(['thread_id' => 5]); но всё равно чуток больше получилось.
>>185999 нужен, там наследование, переопределить find не получится. find по id запрашивает. vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php /** * Finds an entity by its primary key / identifier. * * @param mixed $id The identifier. * @param int|null $lockMode One of the \Doctrine\DBAL\LockMode::* constants * or NULL if no specific lock mode should be used * during the search. * @param int|null $lockVersion The lock version. * * @return object|null The entity instance or NULL if the entity can not be found. */ public function find($id, $lockMode = null, $lockVersion = null) { return $this->_em->find($this->_entityName, $id, $lockMode, $lockVersion); }
/** * Finds all entities in the repository. * * @return array The entities. */ public function findAll() { return $this->findBy([]); }
/** * Finds entities by a set of criteria. * * @param array $criteria * @param array|null $orderBy * @param int|null $limit * @param int|null $offset * * @return array The objects. */ public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) { $persister = $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName);
/** * Finds a single entity by a set of criteria. * * @param array $criteria * @param array|null $orderBy * * @return object|null The entity instance or NULL if the entity can not be found. */ public function findOneBy(array $criteria, array $orderBy = null) { $persister = $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName);
return $persister->loadAll($criteria, $orderBy, $limit, $offset); } потом унаследую (сделаю подмену)... тогда не будет выбора, нужно расширять репозиторий, если хочется кастомный запрос составить!
>>186004 Будь я чуть менее добрым я бы тебе рака яичек пожелал, но я знаю, что ты просто потом заметишь, что твой говнокод никому нахуй не сдался и все.
>>186005 Я не понимаю почему findBy в доктрине сделали публичным... Нужно попросить авторов сделать protected, тогда каждый поймёт философию, которой надо следовать.
>>186006 Тогда им перестанут пользоваться или сделают патч который это откатит. Ты ебнутый рил. Это не философия, это ты шиз. И вообще я хочу сначала по номеру в треде, а потом номер треда.
Запросы не хочет складировать, что поделать, не каждый на такое способен. В репозиторий нужно добавлять каждый новый запрос (даже, если один раз сделал), а потом уже вызывать эту новую функцию...
>>185946 Лол. При чём тут деньги вообще? Если тебе не нужно копать гору чтобы построить дом, то лучше просто не копай всю гору. Не потому что за это не платят, а потому что в этом нет смысла. Ты видишь смысл в постройке дома, или в копании горы? В создании движка, или юзании фреймворка? Определись.
>>185952 > >процедурного программирования > Оно мертво и подходит только для школьных задач для информатике. В реальном мире есть объекты и их взаимодействия. Ещё один адепт. Где вас таких штампуют?
>>186015 Я не понимаю идеи пилить ещё одну АИБ не с помощью фреймворка, чем будет отличаться от любого другого движка? Предположим, что запилю, но кому оно будет нужно? В каждом новом проекте на github требуется разбираться, какой новый минифреймворк создал автор, где и какие файлы, что они делают... И зачем оно было создано, если достаточно обычной вакабы/кусабы/TinyIB/модификации? Чем АИБ отличается от любых других продуктов? Там нету обязательной регистрации, в остальном хоть социальную сеть получится встроить. И то, что нету обязательной регистрации требует пилить какие-то фичи для контроля контента: нужно иметь возможность подключить любую новую капчу (не разбираясь особо в исходном коде самой АИБ), банить сами посты с помощью https://www.php.net/manual/ru/function.similar-text.php , запрещать/разрешать картинки по перцептивному хэшу https://habr.com/ru/post/120562/, оценивать активность каждого IP.
>>186028 Ну и? Берите и допиливайте. Добавляйте функции, оптимизируйте то что уже есть. Только когда сама архитектура перестанет подходить вам для реализации того что вы там задумали, тогда уже можно начинать что-то более сложное делать. Или изначально продумать всё от и до. А сейчас я вижу как человек не шибко опытный пытается что-то соорудить на фреймворке и не может объяснить зачем это нужно. Нраится прост, как я понял. Я не против, просто пытаюсь дать дельный совет. Так, на всякий случай.
>>186023 > Я не понимаю идеи пилить ещё одну АИБ не с помощью фреймворка, чем будет отличаться от любого другого движка? А какая разница какой фреймворк, если движок не отличается от любого другого движка кроме фреймворка? > В каждом новом проекте на github требуется разбираться, какой новый минифреймворк создал автор, где и какие файлы, что они делают Действительно интересные движки такими мелочами всех интересующихся от себя не отгоняют.
>>186030 >Нраится прост, как я понял. Я не против, просто пытаюсь дать дельный совет. Так, на всякий случай. Ты будешь свой велосипед пилить, понимаешь? Для того, чтобы проверить данные формы, нужно будет составлять свою библиотеку (хотя во фреймворке есть такое), потом реализовывать csrf-токен, заниматься тем, что уже давно сделано. Сколько раз будет производиться рефакторинг с целью определить структуру проекта? Во фреймворке есть контроллеры, придётся собственную реализацию пилить? >>186033 >А какая разница какой фреймворк, если движок не отличается от любого другого движка кроме фреймворка? Хотя бы тем, что есть те, кто разбираются в том или ином фреймворке, не нужно читать документацию к велосипеду. Возьмём Laravel https://laravel.ru , сможешь такую подробную документацию сделать? Придётся пилить документацию к своему программному коду, который реализует тоже самое, что наличествует в уже готовом продукте. >Действительно интересные движки такими мелочами всех интересующихся от себя не отгоняют. Меня отгоняет, нахуя изучал Symfony, Zend Framework, Laravel, когда кто-то запилил ещё один фреймворк? Нахуя трачу время на чтение документации, изучение, когда кто-то ещё что-то новое придумал???
public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'data_class' => PostData::class, 'csrf_protection' => true, )); } Нужно проверить форму, что делать, пилить аналог такого? Кстати, если захотел добавить новое поле в форму, тогда где найти эту форму? Я хочу добавить в форму новое поле... Список встроенных валидаторов: https://symfony.com/doc/current/reference/constraints.html
>>186033 Предположим, что кому-то платят денег за программный код, дали задачу, нужно ли иметь уважение к другим людям? Заказчик доволен, команда потом разберётся, ей всё равно за это платят. И кто английский не понимает должен идти нахуй, такой всё равно не заработает много. Проприетарный код не нужен, никто не расширит... Пилят код на какие-то компании, похуй на читабельность, потому что этот код будет внутри компании. Ты никогда не узнаешь, что там в этом скомпилированном коде, а потом заявишь до какой степени охуенный продукт, в таком случае не нужны исходные коды, которые впечатление портят, пользователю нужна программа.
>>186035 Ты сам только что перечислил не один фреймворк. Не все знают их все. Более того, не все хотят связываться с пхп и пыхофреймворками, которые светят своими дырами на пол Интернета с незавидной регулярностью. Временами массовый скан на наличие уязвимости происходит ещё до того как уязвимость зарегали и выпустили патч. Просто пхп знают больше народу, чем каждый отдельный фреймворк, или все вместе взятые. Они вполне могут осилить самописную штуковину. А если не могут, то нечего туда лазить. Кстати, на том же ларавел и видел движок.
Короче минусы найти не сложно в твоем подходе. Я не пытаюсь тебя отговорить. Делай. Просто имей в виду, что не всё так гладко, как ты мог себе вообразить.
>>186039 >Ты сам только что перечислил не один фреймворк. Не все знают их все. Зато у них хорошая документация. >Они вполне могут осилить самописную штуковину. Давай документацию к самописной штуковине.
>>186040 > Давай документацию к самописной штуковине А она не всегда и нужна, если код читабельный и проект сам по себе не громоздкий. Сорсы посмотрел и всё. А ларавелы нужно именно изучать на протяжении какого-то времени, а потом ещё изучать то как его разработчик задействовал, ведь место для маневров всё-таки есть.
>>185940 Твои движки валяются на гитхабе никому не нужные. Важнее не давать рекламы в паблике ДВАЧ, потом не отмоешься. И главное. Полно борд технически совершенных и пустых внутри как и достаточно кривых и на костылях убогих но процветающих.
>>185940 Твои движки валяются на гитхабе никому не нужные. Важнее не давать рекламы в паблике ДВАЧ, потом не отмоешься. И главное. Полно борд технически совершенных и пустых внутри как и достаточно кривых и на костылях убогих но процветающих.
>>186043 >Полно борд технически совершенных и пустых внутри Бан IP адресов хорошенько так превращает борду в пустыню. Ещё это, зачем скрывать, что IP забанен? Сразу бы выдавать красным в поле отправки сообщения, что IP в бане, а то вводишь капчу, потом оказывается запрещён постинг.
>>186050 >Для защиты от прокси-чекеров, например. Так форум анонимный, какие ещё прокси-чекеры? Может тогда запретить любые иностранные IP адреса? Почему нужно их перебирать каждый раз вводя капчу?
> там довольно медленный постинг для популярной АИБ По сравнению с чем? С японскими бордами, которые рекламируют в масс-медиа? С форчаном, потенциальной аудиторией которого является весь англоговорящий мир?
> Так форум анонимный, какие ещё прокси-чекеры? Один такой разрабатывали прямо в этом /b/. Анонимность не означает вседозволенность. А раз так, то нужны средства ограничения постинга, позволяющие каким-то образом различать пользователей. Да, в свете распространённости динамических IP банить по ним неэффективно, но это хоть какой-то метод.
>>186054 >По сравнению с чем? С японскими бордами, которые рекламируют в масс-медиа? С форчаном, потенциальной аудиторией которого является весь англоговорящий мир? Не будем обсуждать эту тему. >Анонимность не означает вседозволенность. ORLY? >А раз так, то нужны средства ограничения постинга, позволяющие каким-то образом различать пользователей. Регистрация. > Да, в свете распространённости динамических IP банить по ним неэффективно, но это хоть какой-то метод. Слушай, потом кто-то пишет, что " Полно борд технически совершенных и пустых внутри" ? Ты понимаешь, что тогда требуется перебирать IP-адреса вводя капчу, искать свободные? Зачем оно нужно? Какая-нибудь кривая борда с костылями и древним движком будет лучше, если там не нужно так извращаться для отправки сообщения. Ты не пользователей в таком случае различаешь, а кого-то конкретного пытаешься лишить возможности высказаться... Вайп тот же вполне реально контролировать технически, а сам контент уже сложнее.
>>186042 >Важнее не давать рекламы в паблике ДВАЧ, потом не отмоешься. А где её давать? Вот этот сайт, сделан качественно, но народа ноль, из за того что не рекламируется нигде. Вот если я соберусь борду делать, где мне народ брать? Вообще дурацкая ситуация получается, интернет есть у каждого первого жителя страны, а привлечь народ на новый проект стоит каких-то неимоверных усилий.
>>186048 >Бан IP адресов хорошенько так превращает борду в пустыню. А небан, усилиями одного шизофреника превращает её в сральник, который засирается до состояния, когда все постеры просто уходят.
>>186059 > народа ноль, из за того что не рекламируется нигде. Ну да, все дело в этом. Открою небольшой секрет, здесь когда-то было достаточно много народа, как по меркам мелкоборд, а на харкаче были постоянно работающие порталы, через которые аноны оттуда попадали сюда. В одном из разделе - при прямом содействии модератора... Здесь обитал бунд - конфа вайперов, которая регулярно поджигала харкач, рекламы этой борде они дали много за счет своего самого активного филиала. Куда все это пропало, кто виноват, что с этим делать и делать ли вообще - тема для отдельного треда. Стабильно болтающиеся на счетчике <50 уников в /b - ни разу не норма, это новые веяния, после РКНовского бана, скажем так. Если кратко, то реклама не поможет, нужно сбивать астрономический антирейтинг борды, желательно что-то здесь меняя. > где мне народ брать? Найти на харкаче недовольных сосакой анонов, и слить их на свою борду. Все из известных мне успешных мелкоборд начинали так, эта не исключение. > привлечь народ на новый проект стоит каких-то неимоверных усилий. Потому что оно нахуй никому не нужно. Ресурсов в интернете более чем достаточно, а если на новом нет вообще ничего такого, ради чего на нем стоит оставаться, то на нем никого и не будет. Для большего понимания происходящего, стоит погуглить термин "экономика внимания".
>>186060 Ахаха, ты ищешь, кого обвинить: 1) Если банить, то виноват шизик, который заставил заблочить столько адресов. 2) Если отказаться банить, но удалять посты, то виноват шизик, который постит.
Ты не считаешь, что вина состоит в: 1) Нищете 2) Неспособности грамотно решать проблему 3) Неспособности грамотно составить правила 4) Неспособности создать грамотную структуру форума 5) Неспособности сделать регистрацию
Ты полностью отринул потребность в деньгах и технической грамотности, с этого момента доход и уровень образованности ни на что не влияют, нашёлся тот, кто совершает плохие поступки. И вопрос на засыпку: почему никто не хочет стать модератором и удалять посты, которые нарушают правила? Не нужно столько драмы, если раздел с 2.5. анонимусов контролирует 5 модеров. Основная проблема состоит в малом количестве модераторов, никто не тянется сделать ресурс чище, но даже в такой ситуации никто не ищет ошибку в себе.
>>186060 Ты просто этот диагноз не трогай, смотри: 1) Если не общаешься ни с кем, тогда больной, лечить надо. 2) Если неправильно общаешься, тогда больной, лечить надо. Если отказаться от общения, тогда сразу же посчитают каким-то аутистом, а потом ещё станут назначать лечение. Ты должен признать, что изоляция от социума является свободным выбором, исчезнут диагнозы типа шизоидности/шизотипичности/шизофрении. Это же негативная симптоматика шизофрении, когда ни с кем не общаешься, не выходишь из дома и т.п. Потом ищешь позитивную симптоматику, кто-то общается неправильно значит с людьми. Кстати, насчёт лечения, неужели специалисты настолько грамотные, а наука достаточно развита? Шаблоны, ярлычки, получается наука манипулирования населением, если на каждый шаблон или ярлычок найди свой метод подхода. Зачем гуманитарии вешают столько ярлыков? Работать надо с шаблонами, а значит на них воздействовать. Возьмём любой шаблон из психологии, ищется некий подход к одному типу пациентов, нужно признать, что бывает индивидуальность и личность, а значит нету общего метода контроля. Если реакция будет паттерном, тогда нашёлся способ контроля, но когда кто-то реагирует иначе, тогда новый шаблон нужен, иначе решать проблему, но иногда проблема не решается вовсе. Программист не является врачом, но разве игры никого не лечат? Программист никогда не делает жизнь других лучше? Попробуй найти разницу между шизофреником, который ушёл в свой мирок, а затем программистом, который создаёт виртуальные миры. И пока психиатры кого-то лечат, программисты дальше пилят игры и разный софт, неизвестно, от кого больше пользы.
>>186045 А кто тебе запрещает их использовать? Используй их, используй отдельные библиотеки с хорошей документацией чтобы не изобретать велосипеды. А к использованию громоздких фреймворков, которые в значительной степени определяют изначальную структуру проекта и ограничивают твою свободу, к ним подходи с осторожностью как минимум.
Вообще, раньше считалось, что чем меньше зависимостей тянет за собой движок, тем лучше.
>>186076 >А кто тебе запрещает их использовать? Используй их, используй отдельные библиотеки с хорошей документацией чтобы не изобретать велосипеды. И в чём идея? Скачаешь множество библиотек от Symfony, станешь использовать в своём проекте, но не будешь чисто принципиально использовать сам фреймворк? >А к использованию громоздких фреймворков, которые в значительной степени определяют изначальную структуру проекта и ограничивают твою свободу, к ним подходи с осторожностью как минимум. Чем плоха изначальная структура проекта в виде MVC? Твоя лучше? Чем? Какая структура проекта? >Вообще, раньше считалось, что чем меньше зависимостей тянет за собой движок, тем лучше. Ещё раньше считалось, что не нужно изобретать велосипед.
>>186077 > Чем плоха изначальная структура проекта в виде MVC? Так ты почитай критику MVC. > Ещё раньше считалось, что не нужно изобретать велосипед В бордостроении принято использовать только самые надежные и проверенные велосипеды, а не просто самые популярные (как фреймворк симфони). Всё остальное нужно изобрести и показать как ты это сделал чтобы получить хоть крупицу доверия. > Отредактированная часть Вот именно. Ты один пока что и тебе не нужны инструменты разработки рассчитанные на большую команду, коим является этот популярный фреймворк.
>>186078 >Всё остальное нужно изобрести и показать как ты это сделал чтобы получить хоть крупицу доверия. Давай команду, будем изобретать. >Вот именно. Ты один пока что и тебе не нужны инструменты разработки рассчитанные на большую команду, коим является этот популярный фреймворк. Я там указал, что из-за отсутствия команды нету ресурсов на создание велосепидов. В чём не прав? Сколько уйдёт времени на проектирование структуры? Сколько уйдёт времени на создание обычного аналога сервисов?
>>186078 И, кстати, приводил в пример проприетарный софт, в этом случае не имеешь доступа к исходному коду, никому не нужно доверие, достаточно сдать продукт, который удовлетворит пользователя, можно взять самые отсталые технологии, никто не заметит, если программа работает, так же вряд ли кто-то станет подсчитывать занимаемую оперативную память и нагрузку на процессор. С этой позиции разрешено творить любую дичь в своём продукте, к которому никто не получит доступа, сразу же, когда код становится свободным, рассуждают о качестве кода, возникая некая философия. Многим уже давно известно, что никому не важно качество кода (а ещё сколько вирусов встроено), нужна работающая программа, которую кто-нибудь себе установит. И такое получится применить к реальному миру, никому не важно неправильное/правильное мнение, а оценивается уровень авторитета. Можно сколько угодно оценивать чужую адекватность, высказанное мнение, но когда у кого-то авторитет больше, тогда ставится под сомнение любая оценка, невозможно в таких условиях определить правого. Разве бомж поспорит с богатым? Разве безработный поспорит с профессионалом? И становится не важно, кто бредит, достаточно, что у кого-то есть право.
До сих пор разбираюсь со структурой проекта... На скриншоте то, на сколько файлов разбил сервис с конфигурацией. Есть ещё модели и репозитории: src/Entity/ConfigOption.php src/Entity/ConfigVariation.php src/Repository/ConfigOptionRepository.php src/Repository/ConfigVariationRepository.php
Предположим кто-то добавил файлы с бордой на сервер, какие должны быть дальнейшние действия и выглядеть установка? Нюансы: 1) Автоматическое создание базы данных при посещении любой страницы требует кода, который станет запускаться на любой странице и проверять существование таблиц (проблем с этим нету, но выглядит не особо качественно) 2) Автоматические создание базы данных при посещении главной страницы требует встроить проверку туда на наличие таблиц, в этом случае тоже особых проблем нет. 3) В текущем варианте требуется сгенерировать хэш пароля администратора, а затем добавить в специальный файл на сервере (чрезмерная мера безопасности, требуется упрозднить) 4) Какие действия нужно совершить с случае утери пароля администратора? (В текущем варианте достаточно установить новый хэш пароля в специальный файл)
>>186103 > Предположим кто-то добавил файлы с бордой на сервер, какие должны быть дальнейшние действия и выглядеть установка? Вакаба проверяла наличие БД и всего остального и создавала при необходимости. Там ничего сложного. Не удалось подключится к БД — значит её ещё не создали. Как-то так. Потом начиная с кусабы начали использовать отдельный скрипт (install.php и install.sql обычно), который следовало один раз запустить (это делалось через браузер с интерфейсом, отображались все этапы, все ошибки и т.д.).
Посмотри их код, там всё есть.
> Какие действия нужно совершить с случае утери пароля администратора? Пиздовать на сам сервер через ssh и менять пароль. Если пароль кто-то подобрал, то следует сносить борду и прыгнуть нахуй с моста.
>>186104 >Вакаба проверяла наличие БД и всего остального и создавала при необходимости. Там ничего сложного. Не удалось подключится к БД — значит её ещё не создали. У меня сейчас так и есть, но выглядит упорото, из-за одной установки форума нужно каждый раз проверять наличие таблиц в БД. >Потом начиная с кусабы начали использовать отдельный скрипт (install.php и install.sql обычно), который следовало один раз запустить (это делалось через браузер с интерфейсом, отображались все этапы, все ошибки и т.д.). Получается два варианта: 1) проверять наличие таблиц при посещении главной страницы, делать редирект на страницу установки, если их нету 2) установка на специальной странице без редиректа в случае посещения главной >Пиздовать на сам сервер через ssh и менять пароль Так это не работает, даже имея доступ к базе данных нужно ещё создать хэш пароля, получается нужна специальная страница для генерации такого хэша. >Если пароль кто-то подобрал, то следует сносить борду и прыгнуть нахуй с моста. Ну, не обязательно, у меня были идеи с мерами безопасности... Тут можно посмотреть (в данном случае используется конфигурация из БД, которая защищает от "выстрела в ногу", но есть такая же настройка в специальном файле, которая вообще отключает подобный функционал): >>185449 $config['admin']['database']['drop'] = false; //Возможность удалить базу данных. $config['admin']['database']['execute'] = false; //Возможность выполнить произвольный запрос к базе данных. $config['admin']['cache']['clear'] = false; //Возможность очистить кэш. $config['admin']['logs']['delete'] = false; //Возможность удалить логи приложения. $config['admin']['upload']['drop'] = false; //Возможность удалить загруженные файлы. Можно ограничивать полномочия администиратора через файл, предположим залочить настройки форума, скрыть IP адреса. И у меня таки появилась идея восстанавливать пароль администратора с помощью логина и пароля к БД, чем плоха идея? Есть ещё вариант хранить USER_ID администратора в специальном файле, тогда достаточно создать новый аккаунт и сменить USER_ID имея доступ к серверу.
>>186105 > У меня сейчас так и есть, но выглядит упорото, из-за одной установки форума нужно каждый раз проверять наличие таблиц в БД. Видимо, ты чего-то не понял. Посмотри код вакабы. Почитай что-то о типах подключения к БД.
>>186108 > если получилось подключиться в БД, тогда не обязательно присутствуют сами таблицы Тогда следует выдать ошибку. В любом случае каждый запрос к БД должен быть завернут в try, или что-то в этом роде.
>>186113 Ошибка... нужна установка. Понятно дел, что когда не получится сделать sql-запрос, тогда скрипт выдаст ошибку. Я могу тупо проверять наличие таблиц при запросе каждой страницы, если нету, тогда создавать автоматически, но получается не очень. Пример (такое проверяет при каждом запросе). //Проверка на ошибки. //Соединение. $database = array(); $database['name'] = $this->database->name(); $database['connect'] = $this->database->connect(); $database['isConnected'] = $this->database->isConnected(); if($database['isConnected'] == true) { $database['name'] = $this->database->name(); $databases = $this->database->listDatabases(); if(in_array($database['name'], $databases)) { $database['exist'] = true; } else { $database['exist'] = false; } } //В том случае, если попытка соединения не удалась. if($database['isConnected'] == false or $database['exist'] == false) { $this->database->create(); $database['connect'] = $this->database->connect(); $database['isConnected'] = $this->database->isConnected(); if($database['isConnected'] == true) { $database['create'] = true; $databases = $this->database->listDatabases(); if(in_array($database['name'], $databases)) { $database['exist'] = true; } else { $database['exist'] = false; } } else { $database['error'] = $database['connect']; } } //Вывод ошибки соединения с базой данных. if(isset($database['error'])) { throw $this->httpException->databaseError($database['error']->getMessage()); } //Вывод ошибки из-за отсутсвия нужной базы данных (не получилось создать). if($database['exist'] == false) { throw $this->httpException->databaseNotExist($database['name']); } //Создание таблиц базы данных, если не существуют. $this->database->createEntityTables(); //Создание конфигурации по умолчанию, если нужно. if($this->config->isCreated() == false) { $this->config->new(); }
Вопрос состоит в том, какой вариант удобнее? Потому что с позиции программиста удобен любой вариант... Я могу реально редактировать файл на сервере, добавлять туда хэш пароля администратора, но такое может не понравиться какому-нибудь обычному пользователю, который хочет создать аккаунт без лишних проблем. И так же установка... нету проблем сделать /setup.html, но обычный пользователь может не прочитать инструкцию к форуму, главная страница выдаст ошибку, пытаюсь определить самый удобный способ установки.
>>186118 К чему это? Создание пароля для доступа к базе данных вне юрисдикции php-скрипта. Пароль администратора другое совершенно... На странице установки потребовать создать аккаунт администратора? В таком случае при первом запуске никто не должен знать адрес сервера. Есть такая идейка... в инструкции к установки форума будет напоминание о переменной в файле .env ADMIN_ID=1 получится первый зарегестрированный аккаунт будет админский, но если сделать (режим паранойи) ADMIN_ID=0 тогда система станет требовать указать ID администратора.
>>186123 Он туда попадёт только если получит права пользователя userName, у которого бы в ином случае пароль всё равно бы лежал где-то в конфигах сайта плэйнтекстом.
Не нужен он, пароль этот, он только создаёт неудобства. Достаточно идентификации по UID'у ломящегося в сокет бд пользователя. В postgresql так по дефолту, а в mysql принято всегда пользовать пароли, наверно, потому что иначе вылезают соснули спермоблядей.
>>185444 (OP) Новую архитектуру, требовательную к своим пользователям! Про-утвердительно требовательную. Требующую больше, чем люди обычно готовы давать, но в чем они способны обрести себя.
Классические движки работали в конце нулевых, времени из стародавних преданий. Забытых и призрачных словно сновидение по истечению дня.
Новый движок должен "rocks". Бросать вызов и самому быть вызовом! "Под капотом" должна быть живая мысль. Горящее слово среди вязкой дремоты и постыдной немоты сознания, сдавшегося бессилию.
Дерзновение - условие свободы, кони ветра которой устилают дороги новым возможностям! Найди то, над чем готов смеяться, как над презренным пережитком, добровольной ничтожностью, вульгарной тупостью. Чем более грандиозен зафокусурованный изъян, тем более непоколебима земля-основа под строящимся зданием.