Главная | Настройки | NSFW
Тема:
Доски


[Ответить в тред] Ответить в тред

[Назад] [Обновить тред] [Вниз] [Каталог] [ Автообновление ] 181 / 31 / 25

Anonymous No.185444
16232548551960.png (1062 KB, 779x1250)
А если я решу написать НОВЫЙ и СОВРЕМЕННЫЙ движок для борды, что анон хочет в нём видеть?
Anonymous No.185445
16232553722090.png (4473 KB, 2200x3072)
Хочу видел фоном разных аниме девочек. Чтобы все посты и текст были на фоне аниме.
Anonymous No.185447
>>185445
Но будет ли это читабельно?
Можно дать анону возможность ставить свой фон и цветовую палитру. Или подбирать палитру автоматически на основе кастомного фона.
Anonymous No.185448
16232576791800.jpg (106 KB, 1000x721)
У меня есть наработки (практически готовый движок MaidIB), можете кидать сюда идеи.
Не ОП
Пост отредактировал Anonymous
Anonymous No.185449
16232578464370.jpg (1533 KB, 1795x2600)
Я взял идею удаления сообщений с архивача, они скрываются модератором, но не удаляются полностью (хотя зависит от уровня полномочий). Считаю отличное решение... RSS впилено в самом начале разработки движка.
Конфиг (редактируется через веб-интерфейс, хранится в БД):
$config = array();
//Админские функции.
$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; //Возможность удалить загруженные файлы.
//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'; //Тип капчи.
//Тред.
$config['thread']['status'] = true;
//Сообщение.
$config['post']['status'] = true;
$config['post']['sage'] = true; //Возможность "сагать" треды.
$config['post']['username']['default'] = $this->translator->trans('Анонимус'); //Имя по умолчанию.
$config['post']['username']['editable'] = true; //Возможность редактировать имя.
//Защита при добавления сообщения.
$config['post']['message']['lenght']['min'] = 0; //Минимальная длина сообщения.
$config['post']['message']['lenght']['max'] = 65535; //Максимальная длина сообщения.
$config['post']['username']['lenght']['max'] = 255; //Максимальная длина имени.
$config['post']['email']['lenght']['max'] = 255; //Максимальная длина e-mail.
//Защита при создании тредов или добавлении сообщений с одного IP.
$config['ip']['interval']['status'] = false; //Не допускать сообщения и треды, которые были созданы с IP имеющие подозрительную активнность.
$config['ip']['interval']['threads']['status'] = false; //Интервалы для создания тредов с одного IP.
$config['ip']['interval']['threads']['first'] = false; //Первый интервал.
$config['ip']['interval']['threads']['minutes'] = 1; //Минуты.
$config['ip']['interval']['threads']['count'] = 5; //Количество тредов.
$config['ip']['interval']['threads']['second'] = false; //Второй интервал.
$config['ip']['interval']['threads']['minutes'] = 5; //Минуты.
$config['ip']['interval']['threads']['count'] = 20; //Количество тредов.
$config['ip']['interval']['posts']['status'] = false; //Интервалы для создания сообщений с одного IP.
$config['ip']['interval']['posts']['first'] = false; //Первый интервал.
$config['ip']['interval']['posts']['minutes'] = 1; //Минуты.
$config['ip']['interval']['posts']['count'] = 35; //Количество сообщений.
$config['ip']['interval']['posts']['second'] = false; //Второй интервал.
$config['ip']['interval']['posts']['minutes'] = 5; //Минуты.
$config['ip']['interval']['posts']['count'] = 100; //Количество сообщений.
//Загрузка файлов.
$config['upload']['status'] = true; //Статус загрузки файлов.
$config['upload']['dir']['calculate']['status'] = true; //Считать занятое место в каталоге.
$config['upload']['dir']['calculate']['type'] = 'database'; //filesystem или database.
$config['upload']['dir']['size']['max'] = '20GB'; //Максимальный размер каталога.
//Защита при загрузке файлов.
$config['files']['count']['min'] = 0; //Минимальное количество файлов за одну загрузку.
$config['files']['count']['max'] = 10; //Максимальное количество файлов за одну загрузку.
$config['files']['size']['min'] = false; //Минимальный общий размер файлов.
$config['files']['size']['max'] = false; //Максимальный общий размер файлов.
$config['file']['hidden']['archive']['status'] = false; //Защита от загрузки архивов под видом изображения.
$config['file']['hidden']['archive']['winrar'] = false;
$config['file']['hidden']['archive']['zip'] = false;
$config['file']['hidden']['archive']['7zip'] = false;
$config['file']['extensions']['wrong'] = false; //Запрещённые форматы файлов.
$config['file']['extensions']['correct'] = false; //Разрешённые форматы файлов.
$config['file']['mimetypes']['wrong'] = false; //Запрещённые mimetypes.
$config['file']['mimetypes']['correct'] = false; //Разрешённые mimetypes.
$config['file']['size']['min'] = '10B'; //Минимальный размер файла.
$config['file']['size']['max'] = '20MB'; //Максимальная размер файла.
$config['file']['only_images'] = true; //Разрешает загружать только изображения.
//Изображения.
$config['image']['manager']['driver'] = 'gd'; //Драйвер для работы с изображениями, на выбор: gd или imagick.
$config['image']['preview']['status'] = true; //Создание превьюшек для изображений.
$config['image']['preview']['width'] = 350; //Ширина превьюшки.
$config['image']['preview']['height'] = 350; //Высота превьюшки.
//Защита при загрузке изображений.
$config['image']['hash']['status'] = true; //Специальный хэш для изображений (перцептуальный).
$config['image']['hash']['source'] = 'preview'; //Источник для хэша, на выбор: preview или full.
$config['image']['hash']['flip']['status'] = true; //Создание дополнительных хэшей для изображений с перевёрнутой картинкой.
$config['image']['hash']['flip']['h'] = true; //Создание дополнительного хэша с перевёрнутой по горизонтали картинкой.
$config['image']['hash']['flip']['v'] = true; //Создание дополнительного хэша с перевёрнутой по вертикали картинкой.
$config['image']['width']['min'] = 0; //Минимальная ширина изображения.
$config['image']['width']['max'] = 7000; //Максимальная ширина изображения.
$config['image']['height']['min'] = 0; //Минимальная высота изображения.
$config['image']['height']['max'] = 7000; //Максимальная высота изображения.
//Премодерация.
$config['premoderation']['status'] = false;
//Премодерация новых тредов.
$config['premoderation']['threads'] = false;
//Премодерация текста.
$config['premoderation']['text']['status'] = false;
$config['premoderation']['text']['links']['status'] = false; //Премодерация текста с ссылками.
$config['premoderation']['text']['links']['type'] = false; //Метод определения ссылок, на выбор: simple или regexp.
$config['premoderation']['text']['regexp']['status'] = false; //Премодерация текста с помощью регулярного выражения.
$config['premoderation']['text']['regexp']['rule'] = false; //Регулярное выражение.
//Премодерация изображений.
$config['premoderation']['images']['status'] = false;
$config['premoderation']['images']['allow']['status'] = false; //Допускать изображения, которые прошли некую проверку.
$config['premoderation']['images']['allow']['hash'] = false; //Допускать изображения, хэш которых ранее был одобрен.
$config['premoderation']['images']['allow']['hash']['simple'] = false; //Тип проверки: filesize+md5+sha1.
$config['premoderation']['images']['allow']['hash']['difference'] = false. //Тип проверки: перцептуальный хэш.
$config['premoderation']['images']['allow']['iqdb'] = false; //Допускать изображения, которые получилось найти на iqdb.org.
$config['premoderation']['images']['allow']['saucenao'] = false; //Допускать изображения, которые получилось найти на saucenao.com.
$config['premoderation']['images']['disallow']['status'] = false; //Не допускать изображения, которые не прошли некую проверку.
$config['premoderation']['images']['disallow']['iqdb']['status'] = false; //Не допускать изображения, которые получилось найти на iqdb.org, но они содержали запрещённые теги.
$config['premoderation']['images']['disallow']['iqdb']['tags'] = ''; //Теги через запятую.
$config['premoderation']['images']['disallow']['saucenao']['status'] = false; //Не допускать изображения, которые получилось найти на saucenao.com, но они содержали запрещённые теги.
$config['premoderation']['images']['disallow']['saucenao']['tags'] = ''; //Теги через запятую.
//Премодерация сообщений и тредов, которые были созданы с одного IP.
$config['premoderation']['ip']['interval']['status'] = false;
$config['premoderation']['ip']['interval']['threads']['status'] = false; //Интервалы для создания тредов с одного IP.
$config['premoderation']['ip']['interval']['threads']['first'] = false; //Первый интервал.
$config['premoderation']['ip']['interval']['threads']['minutes'] = 1; //Минуты.
$config['premoderation']['ip']['interval']['threads']['count'] = 2; //Количество тредов.
$config['premoderation']['ip']['interval']['threads']['second'] = false; //Второй интервал.
$config['premoderation']['ip']['interval']['threads']['minutes'] = 5; //Минуты.
$config['premoderation']['ip']['interval']['threads']['count'] = 10; //Количество тредов.
$config['premoderation']['ip']['interval']['posts']['status'] = false; //Интервалы для создания сообщений с одного IP.
$config['premoderation']['ip']['interval']['posts']['first'] = false; //Первый интервал.
$config['premoderation']['ip']['interval']['posts']['minutes'] = 1; //Минуты.
$config['premoderation']['ip']['interval']['posts']['count'] = 5; //Количество сообщений.
$config['premoderation']['ip']['interval']['posts']['second'] = false; //Второй интервал.
$config['premoderation']['ip']['interval']['posts']['minutes'] = 5; //Минуты.
$config['premoderation']['ip']['interval']['posts']['count'] = 20; //Количество сообщений.
Пост отредактировал Anonymous
Anonymous No.185450
>>185444 (OP)
В движке? Ничего. Туда смотреть никто не будет. Хотят видеть интересные обсуждения и принимать в них участие.
А что касается движка, то нужно не быть мразотой и зарубить себе на носу то, что одновременно разрабатывать экспериментальные движки для борды и завлекать на борду с этим движком как минимум некрасиво. Ведь тебе потом надоест и ты забросишь всё и анониму будет некуда идти. Или ещё хуже. За бордой никто не будет присматривать. Или ещё хуже, чем предыдущее хуже, когда борду отдадут на растерзание кучке конфоблядей в качестве придатка к конфе.
Подумал об этом?
Anonymous No.185451
>>185450
Знакомая история какая то...
Anonymous No.185452
>>185448
На чем писал?
Anonymous No.185453
>>185452
На PHP, фреймворк Symphony.
Пост отредактировал Anonymous
Anonymous No.185454
>>185453
А как анон относится к борде на реакте?
Anonymous No.185455
>>185454
Без javascript такую получится посетить?
Anonymous No.185456
>>185455
Нет.
Anonymous No.185458
У меня есть идея перевести статический контент MaidIB в динамику (отдавать через специальную настройку веб-сервера, не с помощью всяких php-функций конечно, которые нагружают систему), а затем считать количество запросов в секунду/10 секунд/минуту/10 минут/час, тем самым попытаться контролировать потенциальный DDoS. Такое считается нормальным? Nginx не позволяет создавать сложные правила для автоматического бана IP. В таком случае получается из-за каждой картинки будет делаться запрос к БД (считаться кол-во запросов с одного IP), такое увеличит нагрузку, но насколько? И не будет ли так система лучше работать в плане безопасности? В любом случае придётся тестировать...
Пост отредактировал Anonymous
Anonymous No.185460
>>185458
А я хуй знает, я жс макака. Имеешь ввиду, что будешь хотя-бы иметь возможность логировать потенциальный дудос? Типа вести статистику количества запросов?
Anonymous No.185461
>>185460
Nginx способен контролировать простой DDoS, особенно с атакой на динамику, а вот статический контент в случае DDoS'а можно запрашивать с некоторым интервалом, который не станет улавливаться. Статический контент так устроен, что пользователь при первом посещении качает очень много разных файлов, а потом уже достаёт их из кэша, поэтому обычные правила не особо подходят, впрочем, с динамикой тоже есть некоторые проблемы, нужны более сложные правила.
Пост отредактировал Anonymous
Anonymous No.185462
>>185458
Мне кажется такие задачи как логирование лучше расспаралелить, юзать какой нибудь брокер сообщений. Запрос в бд на каждый запрос такое себе решение. Как по мне, это только создаст ещё одну уязвимость для дудоса.
Anonymous No.185468
>>185451
Очень.
Anonymous No.185469
>>185454
Там не нужен никакой реакт. По сути реакт нужен для очень-очень сложных UI, где обычно пришлось бы использовать кучу бойлерплейта для одинаковых компонентов на каждом шагу. Чтобы с этим не иметь проблем используют фреймворки. А так, на борде, можно только местами что-то подобное использовать. Там, где есть какой-то дополнительный функционал, которого может не быть в версии без JS и чтобы UX при этом не сильно страдал.
Anonymous No.185470
>>185458
Для подобных задач лучше использовать failtoban, или писать какой-то плагин для сервера (nginx, apache etc) на сях/крестах. Чтобы это происходило уровнем ниже, так будет для производительности лучше. Но это в идеале.
Anonymous No.185473
>>185470
Я пробовал связку fail2ban с настройками Nginx (limit_req_zone), но сложные правила не получается таким способом реализовать.
>писать какой-то плагин для сервера (nginx, apache etc) на сях/крестах
Не мой уровень.
Anonymous No.185496
>>185473
В nginx есть скриптота на lua. Не знаю, правда, о её возможностях и ограничениях.
Anonymous No.185497
16233150655270.jpg (115 KB, 541x768)
>>185447
Да пофиг на читабельность, читают пусть книги в библиотеке я хочу на тянок смотреть
Anonymous No.185500
>>185444 (OP)
Вообще, у меня была идея запилить свой движок для АИБ. Без JS, скриптоты прочей поебени. ИМХО, возможностей движка TinyIB вполне хватает.

>>185445
>>185447
Не нужно. Можно плагин в бравзер поставить и запилить кастомный CSS.

И вопрос местным знатокам: как сделать несколько разделов в TinyIB?
Anonymous No.185502
16233497118890.gif (2501 KB, 544x306)
А у меня была идея создать доску для бордостроителей. Собрать там мудрости всяческие, разные подхды к решению проблем, философствования и так далее. Всё что относится к теме.
Различного добра для наполнения где-то десятка небольших тредов с четко определенной темой уже собрал. Охота показать другим и для себя что-то новое узнать.
Не очень нравится смотреть как новенькие в этой теме предлагают что-то новое, а потом их труды исчезают вместе с ними. Потом приходит кто-то и не знает какие интересные вещи уже были предложены ранее, увенчались ли они успехом.

Кое-кто уже пробовал создать что-то подобное, но ничего не получилось. Ти ли из-за отсутствия интереса к этому всему, то ли из-за неподходящей политики модерации (а точнее её полного отсутствия).
Anonymous No.185503
>>185500
> И вопрос местным знатокам: как сделать несколько разделов в TinyIB?
Точно не скажу, не прикасался конкретно к этому движку. Посмотри документацию какую-нить.

Я только что поскал на эту тему и первые ссылки ведут на реквесты этой фичи. Вероятно, там это работает так же как и в вакабе. Один инстанс движка — одна доска. Если хочешь ещё одну, то создавай её отдельно копируя все скрипты. Но опять же, утверждать не могу.
Пост отредактировал Anonymous
Anonymous No.185505
>>185502
Почему бы и не в /it/?
Anonymous No.185515
>>185500
> как сделать несколько разделов в TinyIB?
Как и в вакабе, путём запиливания отдельных инстансов борды, >>185503 всё правильно написал.
Anonymous No.185522
>>185502
Так запили в /it. Думаю, многим будет интересно.
Anonymous No.185572
>>185522
>>185505
> Почему бы и не в /it/?
Не знаю. Я раньше пробовал начинать... И каждый раз борда умирала как только я создавал там больше чем 2 треда с таким сабжем. Страшно.
Кстати, да. Нужно больше чем один тред. Иначе всё как-то слишком в кучу будет свалено.
Пост отредактировал Anonymous
Anonymous No.185574
>>185500
>Без JS, скриптоты прочей поебени.
Уже написан. Движок picochan, на языке lua.
Anonymous No.185577
>>185574
А в чём проблема движка без javascript? У вас обычные борды без javascript не работают? В том же MaidIB рассматриваю ситуацию, что пользователь способен javascript отключить, не будет некоторых функций, но чтение/отправка должны функционировать. Стиль меняется с помощью специальной страницы, которая записывает cookie. Я уверен (хотя не проверял), почти любая борда функционирует без javascript.
Пост отредактировал Anonymous
Anonymous No.185578
ну вот отправляю сообщение на эту борду с выключенным javascript.
Anonymous No.185583
16234352088260.jpg (145 KB, 1280x720)
>>185572
>больше чем один тред
Естественно. Го в /it/, а-то простаивает без толку.
Anonymous No.185787
16237261554400.jpg (200 KB, 1920x1080)
Когда пост не полностью удаляется (мягкое удаление = скрытие модератором), тогда стоит ли считать такой пост при доведении до бамплимита?
Пост отредактировал Anonymous
Anonymous No.185792
>>185787
Думаю нет
Anonymous No.185796
16237402989320.jpg (64 KB, 736x736)
16237402990791.png (216 KB, 1202x767)
Немного запутался, есть такое понятие "сервис", у меня с этим нормально в MVC, но не могу разобраться, какие имена лучше давать сервисам? Считал, что нужно по шаблону nameService, но в документации к Symfony присутствует MessageGenerator (без всякого Service в названии), находил класс с названием CurrencyConverter. На скриншоте сейчас запутанная структура, не обращайте внимание на неправильный namespace, проект находится в производственном Аду из-за рефакторинга. Собираюсь делать что-то на уровне Post/PostCreaterService.php, Post/PostService.php, код был рабочий, но требуется улучшить читабельность.
Пост отредактировал Anonymous
Anonymous No.185797
>>185792
У меня были случаи, когда браузер зависал из-за слишком больших тредов на бордах (больше 500 сообщений), а это мягкое удаление скрывает пост чисто визуально (в самом html должно присутствовать). Есть идея таки их считать, а в крайнем случае удалять посты полностью, если кто-то совсем завайпал тред.
Пост отредактировал Anonymous
Anonymous No.185799
>>185797
А зачем его вообще добавлять в дом дерево? Можно просто не рендерить по статусу в бд. А рендерить только для модеров например и подгружать все посты по страницам.
Anonymous No.185800
>>185799
Идея состоит в том, чтобы любой мог такой пост прочитать (раскрыть просто).
Anonymous No.185870
16239507017880.webm (17832 KB, 1280x720, 00:00:56)
>>185451
Anonymous No.185876
>>185800
Эту идею я мусолил у себя в голове лет 5 назад. Примерно тогда же её реализовал (наверняка не впервые) админ нультиреча. Сходи туда и посмотри есть ли у тебя желание читать скрытые посты.
Anonymous No.185881
>>185876
Ты дай хотя бы один пример скрытого поста, лол, а то там невозможно найти. И эта система очень удобна для верификации модераторов, которые могут творить беспредел, получается смогу дать модерку скрывающую сообщения, а потом уже дать доступ к полному удалению (хотя оно не совсем полное, но это уже другая история). Я таки решил остановиться на том, чтобы не считать скрытые посты при доведении до бамплимита, но дать пользователю возможность в настройках полностью отключить их отображение (вырезать из HTML, у меня пока страницы генерируются динамически, пусть и данные берутся из кэша). Система со скрытыми сообщениями даёт возможность жаловаться на модераторов, а иначе придётся запоминать номер своего сообщения, делать скриншоты, могу поступить так, что любой скрытый пост удалится через тот промежуток времени, когда жаловаться уже неактуально.
Ах да, что зашёл то, решил сделать такую структуру проекта, за место PostService теперь PostUpdater+PostCreater+PostRemover+PostSearcher. Может так лучше... хотя теперь файлов много.
Оперу турбу заблочил Роскомнадзор... с тора не постит... эх... нужно искать прокси.
Пост отредактировал Anonymous
Anonymous No.185882
аахахаха, получилось запостить без пички из под тора. напишите хоть где-нибудь об этом!!! пикча, которую хотел запостить (там просто скрин проекта с именами некоторых файлов): https://ibb.co/zQCVDBt
Я, кстати, заметил, если полностью кэшировать HTML, тогда возникнут проблемы с csrf-защитой (хотя может быть есть вариант извратиться с javascript)
https://ru.wikipedia.org/wiki/Межсайтовая_подделка_запроса
В любом случае хочется сделать что-то современное, а производительным (с кэшированием HTML) уже является какой-нибудь TinyIB, мне легче TinyIB проапрейгредить (добавить RSS, ещё какие-нибудь функции) и получится такой фронкенштейн TinyIB (MaidIB Edition). Так будет проще и многим лучше... не нужно будет заморачиваться со статикой, кому нужно, те TinyIB скачают. Я читал код TinyIB, он простой до невозможности, легко добавлять функции. Премодерация изображения отдельно от сообщения? Пожалуйста, небольшое изменение в базе данных (одно дополнительное поле) и пост будет без картинки до одобрения. Впрочем, есть же движок доброчана, он разве не является свободным? Не знаю... ладно.
Пост отредактировал Anonymous
Anonymous No.185883
>>185882
Почему сурсы вакабы это 3 файла, а у тебя овер9999?
Anonymous No.185884
>>185883
Так легче потом проект апрегрейдить, много разных файлов (ООП), разбираться проще, Symfony сама по себе требует создавать так много файлов, ещё vendor (туда загружаются сторонние библиотеки) не видел.
https://ibb.co/ssrz6s3
https://ibb.co/dBX1fzY
https://ru.wikipedia.org/wiki/Объектно-ориентированное_программирование
Пост отредактировал Anonymous
Anonymous No.185885
16239623960960.jpg (3713 KB, 2608x3640)
До вас до сих пор не дошло что важней гуманитарная часть борды чем техническая. Вся эта ваша красота кода для задротов. Намного важней маркетинг, продвижение, атмосфера и люди которые сидят на определенном сайте.
Anonymous No.185886
>>185885
Ты лучше расскажи, откуда возможность постить с картинкой нашёл?
Пост отредактировал Anonymous
Anonymous No.185887
Есть ещё приколюха, что для капчи нужно обязательно сохранять сессию в куках, которая однозначно идентифицирует пользователя (на сервере хранится файл, который содержит заранее разгаданное значение капчи, а у пользователя в куках некий ID, который указывает на этот файл), такое происходит на любом сайте, где есть капча, но может лучше как-нибудь извратиться и в html засунуть этот SESSION_ID прямо в поле формы? А точнее некий идентификатор капчи... Тогда получится с выключенными cookie ввести капчу, подобное можно реализовать в том случае, если HTML не кэшируется, а генерируется динамически.
Пост отредактировал Anonymous
Anonymous No.185888
На этой борде присутствует какой-то captchakey в поле формы, но это значение запрашивается через javascript явно. В случае динамической генерации HTML получится и без javascript...
Anonymous No.185890
>>185449
ну и зачем нужен еще один нультиреч?
Anonymous No.185892
>>185890
Ты дай ссылку хотя бы на один скрытый модератором там пост, а то невозможно найти, рыскаю, ничего нету...
>ну и зачем нужен еще один нультиреч?
У меня расширяемость, поэтому рефакторить/переписывать приходится.
Капча выдаёт ERROR...ааа... постинг временно ограничен... попробую зеркало в торе. Хотя бы один способ запостить существует???
Anonymous No.185895
>>185890
Претензии:
1) Слишком много разделов
2) Упоротый дизайн (почему нельзя просто сделать перенос строки, чтобы пространство было какое-то между постами?)
3) Лайки/дизлайки
4) Бесконечные разделы (в /b/ получилось 29 страниц, слишком много)
5) Какой-то ебанутый олень
(И уже нашёл скрытое сообщение на той борде, больше не надо)

У меня есть идея отправлять удалённые сообщения в какой-нибудь /dev/null (с картинкой, текстом)... в любом случае нужно дать возможность иметь полный доступ к удалённому сообщению для оформления жалобы на модерацию.
Пощу из под прокси...
Пост отредактировал Anonymous
Anonymous No.185902
16239713268260.png (67 KB, 703x740)
Отдаю на растерзание список из мертвого проекта.
Anonymous No.185903
>>185902
>Теги на тредах
Ебанутая штука, которую надо явно в уже готовый проект добавлять. Ну, я имею ввиду, что в самом начале разработки такое себе заморачиваться... Хотя зависит от реализации, когда делал давно АИБ с тегами (потом удалил полностью), приходилось создавать поиск где используется +тег -тег -тег. По моему опыту нужно делать базис, который на 100% функционирует, а потом уже пилить всякие фичи, когда готов базис на 100%, тогда вполне реально запустить борду способную удовлетворить стандартного пользователя.
Пост отредактировал Anonymous
Anonymous No.185907
>>185903
Так это просто обоготворённые фичи были, когда их реализовывать было не принципиально.
Anonymous No.185910
>>185907
Лучше составить список способов реализации базового функционала.
Anonymous No.185911
У меня такая система обновления информации о треде (код не запускал, у меня рефакторинг, пишу чисто интуитивно, какие поля выбирать потом сделаю)
//Обновляет информацию о треде.
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 при добавлении нового сообщении.
Пост отредактировал Anonymous
Anonymous No.185912
Занимаюсь вот этим:
class DefaultConfigInfo {

//Переводчик.
protected $translator;
//Конфигурация.
protected $config;

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 {

//Переводчик.
protected $translator;
//Конфигурация.
protected $config;

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).
Пост отредактировал Anonymous
Anonymous No.185914
16239936170360.png (319 KB, 1462x884)
16239936173741.png (334 KB, 1431x843)
Регулярками в редакторе пытаюсь упростить задачу, но учитывая сколько в конфигурации опций... получается довольно мутарно.
Anonymous No.185915
16239950883220.png (401 KB, 1331x828)
Таки сделал это... регулярным выражением потом убрал дублирующие комментарии.
https://ru.wikipedia.org/wiki/Регулярные_выражения
Пост отредактировал Anonymous
Anonymous No.185939
>>185884
Борде не нужен ООП на самом деле. Дело во фреймворке. Он просто работать не будет по-другому. А нужен ли тебе фреймворк?
Anonymous No.185940
>>185885
Ты почти прав. На самом деле самое главное
> люди которые сидят на определенном сайте
А маркетинг-шмаркетинг — это такая же техническая херня, как и ковыряние в движках.

Но без этой технической херни сидеть вообще никто не будет и ничего никуда не взлетит.
Anonymous No.185943
>>185939
>Борде не нужен ООП на самом деле.
Процедурно программировать в 2021 году?
> А нужен ли тебе фреймворк?
Ты лучше задумайся о том, чем любой другой движок тогда хуже, они выполняют свою функцию на 100%, могу обычный TinyIB расширить. Нужно понимать, что такое хобби, не искать везде личной выгоды, иначе любое программное обеспечение, которое пишется за бесплатно, не имеет никакого смысла. Я когда напишу АИБ в один файл процедурно программируя получу много критики в свой адрес на разных форумах... Никто в этом процедурном коде разбираться не будет, а ещё даже в ООП иногда сложно разобраться, проект разрушится, когда автор в нём потеряется.
Пост отредактировал Anonymous
Anonymous No.185944
16240551545320.png (134 KB, 1025x725)
16240551547141.png (189 KB, 1449x871)
В MaidIB пытаюсь комментировать строчку за строчкой... мне нужен код, в котором легко разобраться, а потом расширять.
Anonymous No.185945
>>185943
> Процедурно программировать в 2021 году?
Да. Если такая парадигма подходит для решения задачи.
> Нужно понимать, что такое хобби
Тогда вопросов нет. Хотя... Лень искать пасту.
Anonymous No.185946
>>185945
>Да. Если такая парадигма подходит для решения задачи.
Если рассуждать на уровне? "не нужно ООП, если никто не платит, лучше процедурно, так проще", тогда получается: "не нужно программировать, если никто не платит". Уровень сложно возрастает в зависимости от количества вложенных средств, но если вложено ноль,тогда не нужно решать никакие задачи.
Пост отредактировал Anonymous
Anonymous No.185947
>>185944
> Комментарии вида
// Проверка что a меньше b
if (a < b) {
}

Зачем?
Это лишний мусор, который уменьшает читаемость кода - впустую отвлекает внимание и меньше актуального кода умещается на экран.
Хорошо написанный код сам себя документирует.
Anonymous No.185948
16240597173390.png (4 KB, 216x42)
Вот это вообще убило.
Ты завязывай с такой хуйней.
Если ты хочешь документировать код, то пиши phpdoc и описывай параметры и выход а не то что масло масляное.
Anonymous No.185949
>>185947
Не каждый понимает английский язык на должном уровне. У меня начинается kernel panic, когда читаю свой код, потому что нужно английский в русский переводить, объёма становится много, а английский не читается автоматически. Я могу прочитать 10 строчек кода, которые составил, но когда их 100, тогда нужно вникать и вспоминать английские словечки.
Вот здесь >>185911 тоже тогда комментарии не нужны, просто привыкни, что getSoftDeleted() определяет удалённое сообщение, каждый раз интерпретируй, когда код читаешь, что делает.
Комментарии ещё отлично разделяют код на блоки, в случае того же процедурного программирования с их помощью вполне читабельно можно сделать.
Пост отредактировал Anonymous
Anonymous No.185950
16240601206400.png (10 KB, 497x117)
16240601206671.png (5 KB, 618x45)
Комментарии нужны там, где без них не очевидно что происходит.
Держи пример того когда действительно нужно комментировать.
Anonymous No.185951
>>185950
Когда комментарии слишком сложные, уже пора создавать отдельную функцию/метод/класс. getCSSItemSelector. И когда метод возвращает строку, так и указать можно прямо getCSSItemSelector(string $item_name): string {
...
}
В PHP 8 ещё сделали именованные аргументы, должно лучше код документировать.
setcookie(
name: 'week',
expires: time() + 60 60 24 *14,
);
Пост отредактировал Anonymous
Anonymous No.185952
>>185949
>Не каждый понимает английский язык на должном уровне.
Если программист не понимает английский на уровне достаточном для понимая кода, то ему или в 5й класс, или в 1С.
>нужно английский в русский переводить
Не нужно.
>английский не читается автоматически
Это не английский а его сильно урезанная версия. У тебя нет ни одного целого предложения даже, в основном глаголы и существительные.
>процедурного программирования
Оно мертво и подходит только для школьных задач для информатике. В реальном мире есть объекты и их взаимодействия.
>getSoftDeleted
Название говно, поэтому и не понятно. Используй
isDeleted(bool $soft = true) {
>Комментарии ещё отлично разделяют код на блоки
Они не должны разделять, разделять должны функции и методы, а комментарии должны пояснять работу кода, если она не очевидна из написанного.
>getCSSItemSelector
Слишком длинно и громоздко.
Про fn : string знаю, это старый довольно код.
Пост отредактировал Anonymous
Anonymous No.185954
>>185952
>Если программист не понимает английский на уровне достаточном для понимая кода, то ему или в 5й класс, или в 1С.
Его нужно интерпретировать... Мне на русском языке в любом случае проще читать литературу.
>Не нужно.
Код состоит из нескольких конструкций, нужно понять каждую.
>Название говно, поэтому и не понятно. Используй
Так это название поля в таблице из базы данных....
>Они не должны разделять, разделять должны функции и методы, а комментарии должны пояснять работу кода, если она не очевидна из написанного.
Вот, а теперь прикинь, что каждый раз нужно думать, какую часть кода сделать новой функцией или методом. Не проще ли разбить код на блоки, а потом разобраться нужно ли перенести куда-то в другое место?
>Слишком длинно и громоздко.
Почему громоздко? В любом случае оно должно быть в каком-то классе содержаться указывающим на CSS... хоть где-то должно быть упоминание о том с чем работает функция.
Пост отредактировал Anonymous
Anonymous No.185955
>>185952
Попробуй вот в это вчитаться:

public function findLastPostBySectionIdAndThreadIdInSection($section, $thread) {
$posts = $this->findBy(array('verified' => 1, 'section_id' => $section, 'thread_id_in_section' => $thread), array('id' => 'DESC'), 1);
if($posts == false) {
return false;
} else {
return $posts[0];
}
}

public function findLastPostBySectionIdAndThreadPostIdInSection($section, $thread) {
$posts = $this->findBy(array('verified' => 1, 'section_id' => $section, 'thread_post_id_in_section' => $thread), array('id' => 'DESC'), 1);
if($posts == false) {
return false;
} else {
return $posts[0];
}
}

public function findAfterPostInSectionIdsBySectionIdAndThreadIdInSection($after, $section, $thread) {
$posts = $this->findBySelect(
array('id_in_section'),
array(
array('id_in_section', '>', $after),
array('verified', '=', 1),
array('section_id', '=', $section),
array('thread_id_in_section', '=', $thread)
),
array('id' => 'ASC')
);
if($posts == false) {
return [];
} else {
return $posts;
}
}
Anonymous No.185956
16240617386110.png (13 KB, 677x73)
>>185954
>Так это название поля в таблице из базы данных....
И что с того, он от этого должен стать лучше?
>Вот, а теперь прикинь, что каждый раз нужно думать, какую часть кода сделать новой функцией или методом. Не проще ли разбить код на блоки, а потом разобраться нужно ли перенести куда-то в другое место?
Нет не нужно думать, это все интуитивно понятно.
Если у тебя идет огромный кусок кода. Ты смотришь на него и понимаешь, что вот эту кучку надо вынести в метод, ей здесь не место.
>Почему громоздко? В любом случае оно должно быть в каком-то классе содержаться указывающим на CSS... хоть где-то должно быть упоминание о том с чем работает функция.
Потому что это масло масляное. То что оно работает с css написано в описании к функции, при наведении.
Anonymous No.185957
>>185955
>findLastPostBySectionIdAndThreadIdInSection
Что за...
Ты совсем из ума выжил?
/**
* Get last post in section and thread
* @param $section
* @param $thread
*/
getLastPost

Ты псих. Так писать код нельзя. Отнимите у него компьютер, кто-нибудь.
Ты просто кашу пишешь, поэтому и трудно вчитываться.
Дам тебе совет - 1 строка кода должны укладываться в 80 символов, максимум 120, включая табуляцию.
Anonymous No.185958
>>185956
>И что с того, он от этого должен стать лучше?
Поле называется soft_deleted, а метод getSoftDeleted(), с этим ничего нельзя сделать (Symfony генерирует название для методов по именам полей), но можно извратиться и тронуть модель/entity.
>Потому что это масло масляное. То что оно работает с css написано в описании к функции, при наведении.
Ой, я отрубаю все эти фичи редакторов програмнного кода, они пестрят красным, пишут ошибки, когда просто код дополняешь, всплывающие эти шутки раздражают...
>>185957
"Найти последний пост по идентификатору раздела и идентификатору треда внутри раздела."
Это репозиторий, они так устроены...
Пост отредактировал Anonymous
Anonymous No.185959
>>185958
>Ой, я отрубаю все эти фичи редакторов програмнного кода, они пестрят красным, пишут ошибки, когда просто код дополняешь, всплывающие эти шутки раздражают...
Ну тогда продолжай писать говно вместо кода которое потом невозможно будет кому то еще понять.
Ты реально псих.
Anonymous No.185960
>>185959
Этот getLastPost вообще не подходит, не понятно какие параметры принимает. У треда есть уникальный ID, а ещё уникальный ID внутри раздела, предположим, что существует сообщение №3 внутри раздела, но уникальный ID для борды равен №5.
>Ну тогда продолжай писать говно вместо кода которое потом невозможно будет кому то еще понять.
Но оно реально упорото и при попытке дополнить код выдаёт ошибки и красные маркеры, пока код не закончишь составлять... Пока пишешь fun оно ебашит красненьким, дополняешь functio и оно продолжает... вот закончил наконец-то function... теперь нужно {, а пока этого не сделаешь оно ебашит красненьким. Ещё эти всплывающие подсказки и автодополнения сбивают с толку.
getLastPost на деле должен быть где-то в сервисе, а не репозитории, репозиторий тупо запросы делает, типа переводит SQL в свой формат через название функций этих упоротых.
Пост отредактировал Anonymous
Anonymous No.185961
>>185960
Используй человеческий редактор, например vscode. В нормальных редакторах, пока ты печатаешь они не анализируют код, а только когда закончил печатать. Или ты по 1му символу в час печатаешь?
>Этот getLastPost вообще не подходит, не понятно какие параметры принимает.
Наводишь мышкой и видишь сигнатуру. Все понятно. Просто это ты гений умнее других, что придумали все эти инструменты для упрощения кода и его написания и говоришь нинужоно, нужоно писать эссе вместо названий функций.
Anonymous No.185962
>>185961
>В нормальных редакторах, пока ты печатаешь они не анализируют код, а только когда закончил печатать. Или ты по 1му символу в час печатаешь?
Я когда enter нажму после
public function twoPlusTwo() {
Что произойдёт? Оно начнёт ебашить, что скобочку не закрыл... Бывает редактор самостоятельно закрывает скобочки, такое особенно раздражает.
>Просто это ты гений умнее других, что придумали все эти инструменты для упрощения кода и его написания и говоришь нинужоно, нужоно писать эссе вместо названий функций.
На деле в репозитории нельзя иначе давать названия функциям, базарю, упрощается на уровне сервиса.
Anonymous No.185963
>>185962
>Оно начнёт ебашить, что скобочку не закрыл
Нормальный редактор поставит индент за ним твой курсор, и закрывающую скобку.
>Бывает редактор самостоятельно закрывает скобочки, такое особенно раздражает.
Говорю же - псих.
>репозитории
В каком, покажи хоть один репо на github где такое говно есть кроме https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition
Найдешь такое в кодбазе любого проекта большой компании?
Пост отредактировал Anonymous
Anonymous No.185964
>>185963
>Нормальный редактор поставит индент за ним твой курсор, и закрывающую скобку.
Сейчас запустил phpStorm (у меня пробный период), оно эти восклицательные знаки даёт, что код неправильный, когда пишу код $thi тогда даёт вариант $this, а зачем оно мне нужно, если и так знаю? И потом ещё после $this-> название всех методов на выбор, а оно не надо и так отлично названия помню.
>В каком, покажи хоть один репо на github где такое говно есть кроме https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition
https://symfony.com/doc/3.3/doctrine/repository.html
>findAllOrderedByName
Тут советуют ещё тип сортировки указывать... потому что оно типа SQL, но в названии функции.
Пост отредактировал Anonymous
Anonymous No.185965
оно потом в сервис перейдёт какой-нибудь, типа 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-ый пост по счёту.
Пост отредактировал Anonymous
Anonymous No.185966
>>185964
Там функция без параметров дурень.
>>185964
>когда пишу код $thi тогда даёт вариант $this, а зачем оно мне нужно, если и так знаю? И потом ещё после $this-> название всех методов на выбор, а оно не надо и так отлично названия помню.
Ты нахуй реально псих. Это нужно в особенности для тех кто фиксит чужой код, ну или уйдешь ты, через месяц откроешь проект, и что, будешь учить все методы?
И ты методы которые называются как эссе тоже вводишь полностью вручную, да?
Ты реально псих, прости за агрессию.
Я не знаю, как тебе объяснить как не заниматься хуйней.
Найди что ли гайд как правильно программировать или что?
Я не знаю, ты реально занимаешься какой-то дуростью и принципиально не хочешь идти простым путем, аля нинужоно.

А и еще добавлю, ты если нажмешь таб то он введет за тебя выбранный метод, ты наверное не знал об этом, раз ты названия помнишь.
Anonymous No.185967
>>185965
Thread->getPost(int $localId = 0): Post
или
static Post::getByParent(Thread $thread, $localId = 0): Post
Пост отредактировал Anonymous
Anonymous No.185968
>>185966
>Там функция без параметров дурень.
Ага, а название уже длинное: findAllOrderedByName
>И ты методы которые называются как эссе тоже вводишь полностью вручную, да?
У меня такие названия методов конкретно в репозитории, такой пример, когда английский нужно интерпретировать, но комментарий упростит задачу.
Anonymous No.185969
>>185967
азаза, getPost(int $localId = 0):, а когда нужно по глобальному айди достать, что тогда делать? getPostByUID(int $uid)?
ты конечно можешь сейчас какие-то новые сущности придумать, но есть тупо Thread (модель) и ThreadRepository (сборник SQL запросов).
Пост отредактировал Anonymous
Anonymous No.185970
>>185968
>Ага, а название уже длинное: findAllOrderedByName
И что? Если бы были параметры, то было бы короче, потому что название параметров уже есть.
>У меня такие названия методов конкретно в репозитории, такой пример, когда английский нужно интерпретировать, но комментарий упростит задачу.
Перефразируй, я не понимаю что ты имеешь ввиду?
>>185969
>азаза, getPost(int $localId = 0):, а когда нужно по глобальному айди достать, что тогда делать? getPostByUID(int $uid)?
Дурак?
У тебя есть метод класса Thread который возвращает пост по локальному id.
А есть класс Post, можешь в него добавить просто static Post::get($global_id): Post и все.
Anonymous No.185971
>>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;
}
Anonymous No.185972
>>185970
>И что? Если бы были параметры, то было бы короче, потому что название параметров уже есть.
Не-не, обрати внимание, что если не сделаешь сложное название, тогда непонятно какие последствия будут, когда получится нечто схожее, но с немного другими параметрами, возникнет коллизия названий методов или какое-то извращение.
findLastPostBySectionIdAndThreadIdInSection
findLastPostBySectionIdAndThreadPostIdInSection
два разных метода, которые дают один результат, но принимают разные параметры.
>Перефразируй, я не понимаю что ты имеешь ввиду?
Если вчитываться в findLastPostBySectionIdAndThreadIdInSection, тогда комментарии не нужны, достаточно знать английский.
Anonymous No.185973
>>185971
И все, если хочешь получить по глобальному id любую сущьность, используешь статический метод класса <ClassName>::getById, если нужно получить дочернюю сущность, то используешь методы инстанса класса, например $therad->getPost.
Anonymous No.185974
>>185973
Я тебя не понимаю, у меня Thread (сущность) и ThreadRepository (коллекция). Я не могу поступить иначе, так устроена система фреймворка... потом уже из ThreadRepository можно сделать какой-то сервис.
Пост отредактировал Anonymous
Anonymous No.185975
>>185972
>findLastPostBySectionIdAndThreadIdInSection
>findLastPostBySectionIdAndThreadPostIdInSection
Говно какое-то. Если ты нормально пишешь и у тебя нормально спроектировано все, у тебя никаких коллизий не будет.
Ты когда по математике задачки решал, ты больше 2х раз писал например единицы измерения, кроме как в дано и в ответе?
Anonymous No.185976
>>185974
>Я не могу поступить иначе, так устроена система фреймворка
Значит либо:
а) Фреймворк говно
б) Ты не правильно им пользуешься, что у тебя получается говно
Anonymous No.185977
Тебе правильно аноны говорили, что фрейворк то тебе не особо нужен, ты просто не умеешь им правильно орудовать. Это как пытаться срубить дерево тупой стороной топора - топор сделан хорошо, но вот пользуешься ты им не так как надо.
Anonymous No.185978
По тому что я вижу у тебя получается что-то невнятное и непонятное, лучше возьми ORM какую-ниубдь, а еще лучше просто sql напрямую используй и сделай сам классы, по типу того как я выше показал, и будет все нормально, легко управляемое и не будут методы на пол экрана, это не джава в конце концов, где названия классов длиннее сурскода.
Anonymous No.185979
>>185977
Извини, а вот это: >>185971
разве не является попыткой создать свой фреймворк?
>>185978
>ORM
В Symfony используется Doctrine.
> и сделай сам классы, по типу того как я выше показал
Так это велосипед.
Пост отредактировал Anonymous
Anonymous No.185980
>>185978
Ты прикинь, есть прослойки: Контроллер, Сервис, Репозиторий, Модель... До какой степени удобно и код получается весёлый.
Anonymous No.185981
>>185979
>разве не является попыткой создать свой фреймворк?
Это называется модель данных.
>Так это велосипед.
А хуйня что ты делаешь нет, лол?
Anonymous No.185982
>>185980
Но такому проекту как борда >50% всего этого не нужно.
Это сделано для энтерпрайза, где так принято и это действительно помогает.
А у тебя получается пока-что велосипед, только с квадратными колесами.
Anonymous No.185983
>>185981
У меня была такая ситуация, что немного заебался с формами (ну потому что там сложно разобраться в некоторых вещах связанных с условиями, если нужно свои определить, тот же лимит на общий размер файлов), тогда начал что-то типа велосипеда делать, а потом понял, что никто даже вчитываться не будет, есть стандартная библиотека, в ней разбираются, а в чужом коде никто рыскать не будет, что там за кастомные формы или свой фреймворк новый. Вряд ли кто-то захочет переучитываться и разбираться в ещё одном минифреймворке.
>>185982
Нужна расширяемость.
Пост отредактировал Anonymous
Anonymous No.185984
>>185983
>расширяемость
До пикабу или форума?
Расширяемость есть и в том что я выше кидал, а расширяемость которую дает тебе такой фрейм это только возможность прикрутить второй сайт к первому, с одной кодбазой, от чего выигрывают только большие проекты, какой-нибудь сайт microsoft например, где туча разделов абсолютно разных, но между ними много связанных сущностей (пользователей, статей, цен и т.д).
Anonymous No.185985
>>185982
Почему не нужно? Анонимный форум чем контролировать будешь? Его же быстро сломают... Ты не можешь заебенить регистрацию обязательную и сделать аналог phpBB, но при этом нужны настройки, надёжная защита, много разных функций, которые не должны отвалиться.
>>185984
Кто будет разбираться в чужом коде? У фреймворка есть документация, для расширяемости придётся свою составлять, некоторым придётся ещё что-то новое изучать.
Пост отредактировал Anonymous
Anonymous No.185986
>>185985
Да, а навешенное говно твое не требует разбирательств чтобы что-то расширить?
Те кто хотят расширить будут разбираться в чужом коде.
Тем более чем проще и понятнее схема, тем проще другим ее редактировать и расширять.
Ты хочешь сделать не борду, а сразу клон реддита со всем что уже есть.
Проекты делаются итерационно, ты не можешь сразу написать весь проект который будет идеален. Для этого есть рефакторинг.
Расширяемость должна ограничиваться к тому же, есть граница между одним продуктом и другим, иначе это будет так, сегодня это двач, а завтра это двач + одноклассники + тикток, а после завтра это вконтакте + weibo без двача.
Anonymous No.185987
>>185986
> Те кто хотят расширить будут разбираться в чужом коде.
Мне не захотелось разбираться в чужом коде.
>Ты хочешь сделать не борду, а сразу клон реддита со всем что уже есть.
Почему бы и нет?
>Расширяемость должна ограничиваться к тому же, есть граница между одним продуктом и другим, иначе это будет так, сегодня это двач, а завтра это двач + одноклассники + тикток, а после завтра это вконтакте + weibo без двача.
Почему бы и нет? АИБ отличается отсутствием обязательной регистрации...
Anonymous No.185988
>>185987
Я даже не знаю что сказать.
Это ответ уровня "И чо?", который просто ломает любую аргументацию.
Потому что нет, потому что есть продукт А и есть продукт Б и это разные продукты.
Anonymous No.185989
>>185988
Ты лучше объясни, почему нужно работающий проект переписывать? У меня наличествует функционирующая борда на фреймворке Symfony, почему нужно отказаться от фреймворка и заново пилить борду? Я занимаюсь обычным рефакторингом с целью улучшения читабильности кода, но на деле там вполне себе в работающим состоянии была борда.
Информация о Symfony /info/about.html

Все доступные пути /info/router.html

Содержимое файла composer.json /info/composer.html

Содержимое файла config/bundles.php /info/bundles.html

Страница "о себе" /user/info.json

Разлогиниться /user/logout.json

Выдаёт 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

Тред /{название_раздела}/res/{идентификатор_треда}.json

Все сообщения /all/posts/{номер_страницы}.json

Все сообщения внутри раздела /{название_раздела}/posts/{номер_страницы}.json

Сообщение по уникальному ID /all/post/{идентификатор_сообщения}.{_format}

Сообщение по ID внутри раздела /{название_раздела}/post/{идентификатор_сообщения_внутри_раздела}.json

Вы так же можете запросить любую HTML с содержимым без всякой лишней информации, для этого достаточно добавить в параметре GET значение onlycontent=1, пример: /api.html?onlycontent=1.
Пост отредактировал Anonymous
Anonymous No.185990
>>185989
Работает и пускай. Если у тебя уже рабочий проект, то лучше допили его до человеческого состояния.
Хотя бы сигнатуры функций используй адекватные и комментарии излишние выпили, а в остальном ок, я думал ты делаешь с нуля и такие костыли городишь, ну а раз уже есть гора костылей, то попробуй мейнтейнить это, пока не свихнешься.
Anonymous No.185991
>>185990
Репозиторий считай прослойка для SQL, поэтому там такие называния у функций... считай SQL запрос делаешь, но по названию функции.
Anonymous No.185992
>>185991
Тогда это просто говно лол.
Anonymous No.185993
>>185992
А ничего так, что вот сюда >>185971 заебенишь SQL запрос? Почему бы не создать отдельный класс, который будет содержать чисто SQL-запросы без всякой привязки в чему-то существенному? За место того, чтобы делать запрос, будешь использовать длинное название функции... и засунешь таки в эти методы >>185971
Anonymous No.185994
>>185992
Держи приколюху:
public function findBySection($section, array $orderBy = array(), $limit = null, $offset = null)
{
return $this->findBy(array('section_id' => $section, 'verified' => true), $orderBy, $limit, $offset);
}

public function findOneBySection($section, array $orderBy = array())
{
return $this->findBySection($section, $orderBy, 1)[0];
}

public function findThreadsBySection($section, array $orderBy = array(), $limit = null, $offset = null)
{
return $this->findBy(array('section_id' => $section, 'thread_id' => 0, 'verified' => true), $orderBy, $limit, $offset);
}

public function findOneThreadsBySection($section, array $orderBy = array())
{
return $this->findThreadsBySection($section, $orderBy, 1)[0];
}

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 findOneNoThreadsBySection($section, array $orderBy = null)
{
return $this->findNoThreadsBySection($section, $orderBy, 1)[0];
}

public function findByThreadId($threadId, array $orderBy = array(), $limit = null, $offset = null)
{
return $this->findBy(array('thread_id' => $threadId), $orderBy, $limit, $offset);
}

public function findByThreadAndSection($thread, $section, array $orderBy = array(), $limit = null, $offset = null)
{
return $this->findBy(array('thread_id_in_section' => $thread, 'section_id' => $section), $orderBy, $limit, $offset);
}

public function findVerifiedByThreadAndSection($thread, $section, array $orderBy = array(), $limit = null, $offset = null)
{
return $this->findBy(array('thread_id_in_section' => $thread, 'section_id' => $section, 'verified' => true), $orderBy, $limit, $offset);
}

public function findNoVerifiedByThreadAndSection($thread, $section, array $orderBy = array(), $limit = null, $offset = null)
{
return $this->findBy(array('thread_id_in_section' => $thread, 'section_id' => $section, 'verified' => false), $orderBy, $limit, $offset);
}

public function findOneByThreadAndSection($thread, $section, array $orderBy = array())
{
return $this->findByThread($thread, $section, $orderBy, 1)[0];
}

public function paginatorFindBySection($section, $orderBy, $limit, $page)
{
return $this->paginatorFindBy(array('section_id' => $section, 'verified' => true), $orderBy, $limit, $page);
}

public function paginatorFindBySections($sections, $orderBy, $limit, $page)
{
return $this->paginatorFindBySection($sections, $orderBy, $limit, $page);
}

public function paginatorFindNoVerifiedBySection($section, $orderBy, $limit, $page)
{
return $this->paginatorFindBy(array('section_id' => $section, 'verified' => 0), $orderBy, $limit, $page);
}

public function paginatorFindNoVerifiedFilesBySection($section, $orderBy, $limit, $page)
{
return $this->paginatorFindBy(array('section_id' => $section, 'verified_files' => 0), $orderBy, $limit, $page);
}

public function paginatorFindThreadsBySection($section, $orderBy, $limit, $page)
{
return $this->paginatorFindBy(array('section_id' => $section, 'thread_id' => 0, 'verified' => true), $orderBy, $limit, $page);
}

public function paginatorFindNoThreadsBySection($section, $orderBy, $limit, $page)
{
return $this->paginatorFindBy(array(array('section_id', '=', $section), array('thread_id', '!=', 0), array('varified', '=', true)), $orderBy, $limit, $page);
}

public function paginatorFindByThreadAndSection($thread, $section, $orderBy, $limit, $page)
{
return $this->paginatorFindBy(array('thread_id_in_section' => $thread, 'section_id' => $section, 'verified' => true), $orderBy, $limit, $page);
}

public function countBeforeByDate($date, $criteria = array(), $orderBy = array('section_id' => 'ASC')) {
$query = $this->createQueryBuilder('t');
$query
->select('COUNT(t.id) as count');
$query = $this->orderBy($query, $orderBy);
$query = $this->criteria($query, array_merge(array(array("date", "<", $date)), $criteria), 't');
$query = $query->getQuery();
$result = $query->getResult();
if(!isset($result[0]) or !isset($result[0]['count'])) {
return 0;
} else {
if($result[0]['count'] == false) {
return 0;
} else {
return $result[0]['count'];
}
}
}

public function countAfterByDate($date, $criteria = array(), $orderBy = array('section_id' => 'ASC')) {
$query = $this->createQueryBuilder('t');
$query
->select('COUNT(t.id) as count');
$query = $this->orderBy($query, $orderBy);
$query = $this->criteria($query, array_merge(array(array("date", ">", $date)), $criteria), 't');
$query = $query->getQuery();
$result = $query->getResult();
if(!isset($result[0]) or !isset($result[0]['count'])) {
return 0;
} else {
if($result[0]['count'] == false) {
return 0;
} else {
return $result[0]['count'];
}
}
}

public function countBySections($criteria = array(), $orderBy = array('section_id' => 'ASC')) {
$query = $this->createQueryBuilder('t');
$query
->select('COUNT(t.id) as count, t.section_id')
->where('t.verified = :verified')
->groupBy('t.section_id');
$query = $this->orderBy($query, $orderBy);
$query = $this->criteria($query, array_merge(array(array("verified", "=", true)), $criteria), 't');
$query = $query->getQuery();
return $query->getResult();
}

public function countByThreads($criteria = array(), $orderBy = array('thread_id' => 'ASC')) {
$query = $this->createQueryBuilder('t');
$query
->select('COUNT(t.id) as count, t.thread_id')
->where('t.verified = :verified')
->groupBy('t.thread_id');
$query = $this->orderBy($query, $orderBy);
$query = $this->criteria($query, array_merge(array(array("verified", "=", true)), $criteria), 't');
$query = $query->getQuery();
return $query->getResult();
}
Anonymous No.185995
>>185993
Это называется orm держу в курсе.
И нет не проще, ты слишком сильно абстрагируешься от реализации.
Имплементации запросов можно и там писать, потому что это модель данных.
Если ты хочешь абстрагироваться от sql, то используй orm напрямую в методах получения данных.
А вместо говна в виде огромных и бесполезных названий функций давно придумали деструктуризацию. Она даже в php есть: https://stackoverflow.com/a/8379034/8035872
>>185994
Блять ты псих.
Anonymous No.185996
>>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);
}

(некоторые названия функций могут быть запутанными, но это потом исправлю)
Пост отредактировал Anonymous
Anonymous No.185997
>>185996
>Не замечаешь, что оно таки сокращает количество кода?
Можешь считать, что я так скозал, но это говно. Прозе было бы напрямую find использовать.
А по хорошему, так вообще это был бы статик метод класса как я выше кидал.
Anonymous No.185998
>>185997
В чём прикол использовать напрямую, если так длиннее получается?
findByThreadId(5)
короче чем
findBy(array('thread_id' => 5));
ну можно так конечно
findBy(['thread_id' => 5]);
но всё равно чуток больше получилось.
Пост отредактировал Anonymous
Anonymous No.185999
>>185998
>findBy(['thread_id' => 5]);
by не нужен.
find(['thread_id' => 5]);
Anonymous No.186000
>>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);

return $persister->loadAll($criteria, $orderBy, $limit, $offset);
}

/**
* 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->load($criteria, null, null, [], null, 1, $orderBy);
}
Пост отредактировал Anonymous
Anonymous No.186001
>>186000
Ну в твоем фрейме нужен ок. В любом случае это более гибко и удобнее чем сигнатура в пол экрана.
Anonymous No.186002
16240725278860.png (532 KB, 1280x1140)
>>186001
Я специально сделаю findBy защищённым (protected)... Длинные сигнатуры не нравится, ошибку выдаст, что к protected методу обратился.
Пост отредактировал Anonymous
Anonymous No.186003
16240728671510.png (369 KB, 634x357)
>>186002
С кем я только на одной борде сижу...
Anonymous No.186004
16240731629810.jpg (98 KB, 500x631)
>>186003
Скопирую файл vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php, сделаю такую замену:
protected function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
{
$persister = $this->_em->getUnitOfWork()->getEntityPersister($this->_entityName);

return $persister->loadAll($criteria, $orderBy, $limit, $offset);
}

потом унаследую (сделаю подмену)... тогда не будет выбора, нужно расширять репозиторий, если хочется кастомный запрос составить!
Пост отредактировал Anonymous
Anonymous No.186005
16240734207370.jpg (262 KB, 800x800)
>>186004
Будь я чуть менее добрым я бы тебе рака яичек пожелал, но я знаю, что ты просто потом заметишь, что твой говнокод никому нахуй не сдался и все.
Anonymous No.186006
16240735116610.jpg (12 KB, 210x240)
>>186005
Я не понимаю почему findBy в доктрине сделали публичным... Нужно попросить авторов сделать protected, тогда каждый поймёт философию, которой надо следовать.
Пост отредактировал Anonymous
Anonymous No.186007
>>186006
Тогда им перестанут пользоваться или сделают патч который это откатит.
Ты ебнутый рил. Это не философия, это ты шиз.
И вообще я хочу сначала по номеру в треде, а потом номер треда.
Anonymous No.186008
>>186007
>И вообще я хочу сначала по номеру в треде, а потом номер треда.
Согласованности не будет... нужна функция, которая определит заранее.
Anonymous No.186009
Запросы не хочет складировать, что поделать, не каждый на такое способен. В репозиторий нужно добавлять каждый новый запрос (даже, если один раз сделал), а потом уже вызывать эту новую функцию...
Пост отредактировал Anonymous
Anonymous No.186010
>>186009
Вывод: симфония хуйня.
Anonymous No.186014
>>186010
Думаешь кому-то интересны выводы рукожопых говнокодеров?
Anonymous No.186015
>>185946
Лол. При чём тут деньги вообще? Если тебе не нужно копать гору чтобы построить дом, то лучше просто не копай всю гору. Не потому что за это не платят, а потому что в этом нет смысла. Ты видишь смысл в постройке дома, или в копании горы? В создании движка, или юзании фреймворка? Определись.
Anonymous No.186016
>>185952
> >процедурного программирования
> Оно мертво и подходит только для школьных задач для информатике. В реальном мире есть объекты и их взаимодействия.
Ещё один адепт. Где вас таких штампуют?
Anonymous No.186023
>>186015
Я не понимаю идеи пилить ещё одну АИБ не с помощью фреймворка, чем будет отличаться от любого другого движка? Предположим, что запилю, но кому оно будет нужно? В каждом новом проекте на github требуется разбираться, какой новый минифреймворк создал автор, где и какие файлы, что они делают... И зачем оно было создано, если достаточно обычной вакабы/кусабы/TinyIB/модификации? Чем АИБ отличается от любых других продуктов? Там нету обязательной регистрации, в остальном хоть социальную сеть получится встроить. И то, что нету обязательной регистрации требует пилить какие-то фичи для контроля контента: нужно иметь возможность подключить любую новую капчу (не разбираясь особо в исходном коде самой АИБ), банить сами посты с помощью https://www.php.net/manual/ru/function.similar-text.php , запрещать/разрешать картинки по перцептивному хэшу https://habr.com/ru/post/120562/, оценивать активность каждого IP.
Пост отредактировал Anonymous
Anonymous No.186028
>>186016
Смотри, у нас есть тот же TinyIB, на деле ничего нового не надо, достаточно TinyIB расширить... просто добавить новые функции... внести изменения в базу данных... Чем плох этот https://gitlab.com/tslocum/tinyib/-/blob/master/imgboard.php процедурный код? Зачем пилить что-то новое? https://gitlab.com/tslocum/tinyib/-/blob/master/inc/html.php https://gitlab.com/tslocum/tinyib/-/blob/master/inc/functions.php
Anonymous No.186030
>>186028
Ну и? Берите и допиливайте. Добавляйте функции, оптимизируйте то что уже есть.
Только когда сама архитектура перестанет подходить вам для реализации того что вы там задумали, тогда уже можно начинать что-то более сложное делать. Или изначально продумать всё от и до. А сейчас я вижу как человек не шибко опытный пытается что-то соорудить на фреймворке и не может объяснить зачем это нужно. Нраится прост, как я понял. Я не против, просто пытаюсь дать дельный совет. Так, на всякий случай.
Пост отредактировал Anonymous
Anonymous No.186033
>>186023
> Я не понимаю идеи пилить ещё одну АИБ не с помощью фреймворка, чем будет отличаться от любого другого движка?
А какая разница какой фреймворк, если движок не отличается от любого другого движка кроме фреймворка?
> В каждом новом проекте на github требуется разбираться, какой новый минифреймворк создал автор, где и какие файлы, что они делают
Действительно интересные движки такими мелочами всех интересующихся от себя не отгоняют.
Anonymous No.186035
>>186030
>Нраится прост, как я понял. Я не против, просто пытаюсь дать дельный совет. Так, на всякий случай.
Ты будешь свой велосипед пилить, понимаешь? Для того, чтобы проверить данные формы, нужно будет составлять свою библиотеку (хотя во фреймворке есть такое), потом реализовывать csrf-токен, заниматься тем, что уже давно сделано. Сколько раз будет производиться рефакторинг с целью определить структуру проекта? Во фреймворке есть контроллеры, придётся собственную реализацию пилить?
>>186033
>А какая разница какой фреймворк, если движок не отличается от любого другого движка кроме фреймворка?
Хотя бы тем, что есть те, кто разбираются в том или ином фреймворке, не нужно читать документацию к велосипеду. Возьмём Laravel https://laravel.ru , сможешь такую подробную документацию сделать? Придётся пилить документацию к своему программному коду, который реализует тоже самое, что наличествует в уже готовом продукте.
>Действительно интересные движки такими мелочами всех интересующихся от себя не отгоняют.
Меня отгоняет, нахуя изучал Symfony, Zend Framework, Laravel, когда кто-то запилил ещё один фреймворк? Нахуя трачу время на чтение документации, изучение, когда кто-то ещё что-то новое придумал???
Пост отредактировал Anonymous
Anonymous No.186036
>symfony
Напоминаю, лучший ORM для php это onPHP
Anonymous No.186037
Тупо форма.
class PostType extends AbstractType
{

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
//Имя.
->add('name',
TextType::class,
array(
'empty_data' => 'Анонимус',
'data' => 'Анонимус',
'label' => 'Имя',
'required' => true,
'trim' => true
)
)
//Сажа.
->add('sage',
CheckboxType::class,
array(
'label' => 'Сажа',
'required' => false,
'data' => false
)
)
//Электронная почта.
->add('email',
EmailType::class,
array(
'label' => 'E-mail',
'required' => false,
'trim' => true
)
)
//Заголовок.
->add('title',
TextType::class,
array(
'label' => 'Заголовок',
'required' => false,
'trim' => true
)
)
//Сообщение.
->add('message',
TextareaType::class,
array(
'label' => 'Сообщение',
'required' => false,
'trim' => true
)
)
//Файлы.
/**
->add('files',
FileType::class,
array(
'label' => 'Файлы',
'multiple' => true,

'constraints' => [
new All([
'constraints' => [
new File([
'maxSize' => '1024k',
'mimeTypesMessage' => 'Please upload a valid PDF document',
//'mimeTypes' => [
//'application/pdf',
//'application/x-pdf'
//]
])
]
])
]
)
)
*/
//Кнопка отправки.
->add('sumbit',
SubmitType::class,
array(
'label' => 'Отправить'
)
)
;
}

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => PostData::class,
'csrf_protection' => true,
));
}

Нужно проверить форму, что делать, пилить аналог такого? Кстати, если захотел добавить новое поле в форму, тогда где найти эту форму? Я хочу добавить в форму новое поле...
Список встроенных валидаторов: https://symfony.com/doc/current/reference/constraints.html
Пост отредактировал Anonymous
Anonymous No.186038
>>186033
Предположим, что кому-то платят денег за программный код, дали задачу, нужно ли иметь уважение к другим людям? Заказчик доволен, команда потом разберётся, ей всё равно за это платят. И кто английский не понимает должен идти нахуй, такой всё равно не заработает много. Проприетарный код не нужен, никто не расширит... Пилят код на какие-то компании, похуй на читабельность, потому что этот код будет внутри компании. Ты никогда не узнаешь, что там в этом скомпилированном коде, а потом заявишь до какой степени охуенный продукт, в таком случае не нужны исходные коды, которые впечатление портят, пользователю нужна программа.
Пост отредактировал Anonymous
Anonymous No.186039
>>186035
Ты сам только что перечислил не один фреймворк. Не все знают их все. Более того, не все хотят связываться с пхп и пыхофреймворками, которые светят своими дырами на пол Интернета с незавидной регулярностью. Временами массовый скан на наличие уязвимости происходит ещё до того как уязвимость зарегали и выпустили патч.
Просто пхп знают больше народу, чем каждый отдельный фреймворк, или все вместе взятые. Они вполне могут осилить самописную штуковину. А если не могут, то нечего туда лазить.
Кстати, на том же ларавел и видел движок.

Короче минусы найти не сложно в твоем подходе. Я не пытаюсь тебя отговорить. Делай. Просто имей в виду, что не всё так гладко, как ты мог себе вообразить.
Anonymous No.186040
>>186039
>Ты сам только что перечислил не один фреймворк. Не все знают их все.
Зато у них хорошая документация.
>Они вполне могут осилить самописную штуковину.
Давай документацию к самописной штуковине.
Anonymous No.186041
>>186040
> Давай документацию к самописной штуковине
А она не всегда и нужна, если код читабельный и проект сам по себе не громоздкий. Сорсы посмотрел и всё. А ларавелы нужно именно изучать на протяжении какого-то времени, а потом ещё изучать то как его разработчик задействовал, ведь место для маневров всё-таки есть.
Anonymous No.186042
16241199155170.png (16590 KB, 5016x7082)
>>185940
Твои движки валяются на гитхабе никому не нужные. Важнее не давать рекламы в паблике ДВАЧ, потом не отмоешься.
И главное. Полно борд технически совершенных и пустых внутри как и достаточно кривых и на костылях убогих но процветающих.
Anonymous No.186043
16241199430590.png (16590 KB, 5016x7082)
>>185940
Твои движки валяются на гитхабе никому не нужные. Важнее не давать рекламы в паблике ДВАЧ, потом не отмоешься.
И главное. Полно борд технически совершенных и пустых внутри как и достаточно кривых и на костылях убогих но процветающих.
Anonymous No.186045
>>186041
Какой код читабельный? Если серьёзно обсуждать тему, тогда нужны шаблоны проектирования.
https://ru.wikipedia.org/wiki/Шаблон_проектирования
http://design-pattern.ru/index.html
https://devacademy.ru/article/shablony-proiektirovaniia-v-php
https://refactoring.guru/ru/design-patterns/php
Пост отредактировал Anonymous
Anonymous No.186048
>>186043
>Полно борд технически совершенных и пустых внутри
Бан IP адресов хорошенько так превращает борду в пустыню. Ещё это, зачем скрывать, что IP забанен? Сразу бы выдавать красным в поле отправки сообщения, что IP в бане, а то вводишь капчу, потом оказывается запрещён постинг.
Пост отредактировал Anonymous
Anonymous No.186050
>>186048
> Бан IP адресов хорошенько так превращает борду в пустыню.
Расскажи об этом на сосаче.

> зачем скрывать, что IP забанен?
Для защиты от прокси-чекеров, например.
Anonymous No.186051
>>186050
>Для защиты от прокси-чекеров, например.
Так форум анонимный, какие ещё прокси-чекеры? Может тогда запретить любые иностранные IP адреса? Почему нужно их перебирать каждый раз вводя капчу?
Пост отредактировал Anonymous
Anonymous No.186054
>>186051
Ебать ты кувыркаешься.

> там довольно медленный постинг для популярной АИБ
По сравнению с чем? С японскими бордами, которые рекламируют в масс-медиа? С форчаном, потенциальной аудиторией которого является весь англоговорящий мир?

> Так форум анонимный, какие ещё прокси-чекеры?
Один такой разрабатывали прямо в этом /b/.
Анонимность не означает вседозволенность. А раз так, то нужны средства ограничения постинга, позволяющие каким-то образом различать пользователей. Да, в свете распространённости динамических IP банить по ним неэффективно, но это хоть какой-то метод.
Anonymous No.186055
>>186054
>По сравнению с чем? С японскими бордами, которые рекламируют в масс-медиа? С форчаном, потенциальной аудиторией которого является весь англоговорящий мир?
Не будем обсуждать эту тему.
>Анонимность не означает вседозволенность.
ORLY?
>А раз так, то нужны средства ограничения постинга, позволяющие каким-то образом различать пользователей.
Регистрация.
> Да, в свете распространённости динамических IP банить по ним неэффективно, но это хоть какой-то метод.
Слушай, потом кто-то пишет, что
" Полно борд технически совершенных и пустых внутри"
? Ты понимаешь, что тогда требуется перебирать IP-адреса вводя капчу, искать свободные? Зачем оно нужно? Какая-нибудь кривая борда с костылями и древним движком будет лучше, если там не нужно так извращаться для отправки сообщения. Ты не пользователей в таком случае различаешь, а кого-то конкретного пытаешься лишить возможности высказаться... Вайп тот же вполне реально контролировать технически, а сам контент уже сложнее.
Пост отредактировал Anonymous
Anonymous No.186056
>>186054
У вайпера есть паттерн поведения (слишком частый постинг с одного IP), а у какого-нибудь флудера паттерна нету.
Anonymous No.186059
>>186042
>Важнее не давать рекламы в паблике ДВАЧ, потом не отмоешься.
А где её давать? Вот этот сайт, сделан качественно, но народа ноль, из за того что не рекламируется нигде. Вот если я соберусь борду делать, где мне народ брать?
Вообще дурацкая ситуация получается, интернет есть у каждого первого жителя страны, а привлечь народ на новый проект стоит каких-то неимоверных усилий.
Anonymous No.186060
>>186048
>Бан IP адресов хорошенько так превращает борду в пустыню.
А небан, усилиями одного шизофреника превращает её в сральник, который засирается до состояния, когда все постеры просто уходят.
Anonymous !!IOSL5ZSnfw No.186062
>>186059
> народа ноль, из за того что не рекламируется нигде.
Ну да, все дело в этом. Открою небольшой секрет, здесь когда-то было достаточно много народа, как по меркам мелкоборд, а на харкаче были постоянно работающие порталы, через которые аноны оттуда попадали сюда. В одном из разделе - при прямом содействии модератора... Здесь обитал бунд - конфа вайперов, которая регулярно поджигала харкач, рекламы этой борде они дали много за счет своего самого активного филиала. Куда все это пропало, кто виноват, что с этим делать и делать ли вообще - тема для отдельного треда. Стабильно болтающиеся на счетчике <50 уников в /b - ни разу не норма, это новые веяния, после РКНовского бана, скажем так. Если кратко, то реклама не поможет, нужно сбивать астрономический антирейтинг борды, желательно что-то здесь меняя.
> где мне народ брать?
Найти на харкаче недовольных сосакой анонов, и слить их на свою борду. Все из известных мне успешных мелкоборд начинали так, эта не исключение.
> привлечь народ на новый проект стоит каких-то неимоверных усилий.
Потому что оно нахуй никому не нужно. Ресурсов в интернете более чем достаточно, а если на новом нет вообще ничего такого, ради чего на нем стоит оставаться, то на нем никого и не будет. Для большего понимания происходящего, стоит погуглить термин "экономика внимания".
Anonymous No.186063
>>186060
Ахаха, ты ищешь, кого обвинить:
1) Если банить, то виноват шизик, который заставил заблочить столько адресов.
2) Если отказаться банить, но удалять посты, то виноват шизик, который постит.

Ты не считаешь, что вина состоит в:
1) Нищете
2) Неспособности грамотно решать проблему
3) Неспособности грамотно составить правила
4) Неспособности создать грамотную структуру форума
5) Неспособности сделать регистрацию

Ты полностью отринул потребность в деньгах и технической грамотности, с этого момента доход и уровень образованности ни на что не влияют, нашёлся тот, кто совершает плохие поступки. И вопрос на засыпку: почему никто не хочет стать модератором и удалять посты, которые нарушают правила? Не нужно столько драмы, если раздел с 2.5. анонимусов контролирует 5 модеров. Основная проблема состоит в малом количестве модераторов, никто не тянется сделать ресурс чище, но даже в такой ситуации никто не ищет ошибку в себе.
Пост отредактировал Anonymous
Anonymous No.186064
...
Пост отредактировал Anonymous (Причина: слишком много философии)
Anonymous No.186066
...
Пост отредактировал Anonymous
Anonymous No.186067
>>186060
Ты просто этот диагноз не трогай, смотри:
1) Если не общаешься ни с кем, тогда больной, лечить надо.
2) Если неправильно общаешься, тогда больной, лечить надо.
Если отказаться от общения, тогда сразу же посчитают каким-то аутистом, а потом ещё станут назначать лечение. Ты должен признать, что изоляция от социума является свободным выбором, исчезнут диагнозы типа шизоидности/шизотипичности/шизофрении. Это же негативная симптоматика шизофрении, когда ни с кем не общаешься, не выходишь из дома и т.п. Потом ищешь позитивную симптоматику, кто-то общается неправильно значит с людьми. Кстати, насчёт лечения, неужели специалисты настолько грамотные, а наука достаточно развита? Шаблоны, ярлычки, получается наука манипулирования населением, если на каждый шаблон или ярлычок найди свой метод подхода. Зачем гуманитарии вешают столько ярлыков? Работать надо с шаблонами, а значит на них воздействовать. Возьмём любой шаблон из психологии, ищется некий подход к одному типу пациентов, нужно признать, что бывает индивидуальность и личность, а значит нету общего метода контроля. Если реакция будет паттерном, тогда нашёлся способ контроля, но когда кто-то реагирует иначе, тогда новый шаблон нужен, иначе решать проблему, но иногда проблема не решается вовсе. Программист не является врачом, но разве игры никого не лечат? Программист никогда не делает жизнь других лучше? Попробуй найти разницу между шизофреником, который ушёл в свой мирок, а затем программистом, который создаёт виртуальные миры. И пока психиатры кого-то лечат, программисты дальше пилят игры и разный софт, неизвестно, от кого больше пользы.
Пост отредактировал Anonymous
Anonymous No.186072
16241841924470.jpg (271 KB, 1150x1280)
>>186060
Эта не я виноват что все отсюда свалили. Пусть бегут прячутся от проблем окружающего мира под юбку
Anonymous No.186076
>>186045
А кто тебе запрещает их использовать? Используй их, используй отдельные библиотеки с хорошей документацией чтобы не изобретать велосипеды. А к использованию громоздких фреймворков, которые в значительной степени определяют изначальную структуру проекта и ограничивают твою свободу, к ним подходи с осторожностью как минимум.

Вообще, раньше считалось, что чем меньше зависимостей тянет за собой движок, тем лучше.
Anonymous No.186077
>>186076
>А кто тебе запрещает их использовать? Используй их, используй отдельные библиотеки с хорошей документацией чтобы не изобретать велосипеды.
И в чём идея? Скачаешь множество библиотек от Symfony, станешь использовать в своём проекте, но не будешь чисто принципиально использовать сам фреймворк?
>А к использованию громоздких фреймворков, которые в значительной степени определяют изначальную структуру проекта и ограничивают твою свободу, к ним подходи с осторожностью как минимум.
Чем плоха изначальная структура проекта в виде MVC? Твоя лучше? Чем? Какая структура проекта?
>Вообще, раньше считалось, что чем меньше зависимостей тянет за собой движок, тем лучше.
Ещё раньше считалось, что не нужно изобретать велосипед.
Пост отредактировал Anonymous
Anonymous No.186078
>>186077
> Чем плоха изначальная структура проекта в виде MVC?
Так ты почитай критику MVC.
> Ещё раньше считалось, что не нужно изобретать велосипед
В бордостроении принято использовать только самые надежные и проверенные велосипеды, а не просто самые популярные (как фреймворк симфони). Всё остальное нужно изобрести и показать как ты это сделал чтобы получить хоть крупицу доверия.
> Отредактированная часть
Вот именно. Ты один пока что и тебе не нужны инструменты разработки рассчитанные на большую команду, коим является этот популярный фреймворк.
Anonymous No.186079
>>186078
>Всё остальное нужно изобрести и показать как ты это сделал чтобы получить хоть крупицу доверия.
Давай команду, будем изобретать.
>Вот именно. Ты один пока что и тебе не нужны инструменты разработки рассчитанные на большую команду, коим является этот популярный фреймворк.
Я там указал, что из-за отсутствия команды нету ресурсов на создание велосепидов. В чём не прав? Сколько уйдёт времени на проектирование структуры? Сколько уйдёт времени на создание обычного аналога сервисов?
Anonymous No.186080
>>186078
И, кстати, приводил в пример проприетарный софт, в этом случае не имеешь доступа к исходному коду, никому не нужно доверие, достаточно сдать продукт, который удовлетворит пользователя, можно взять самые отсталые технологии, никто не заметит, если программа работает, так же вряд ли кто-то станет подсчитывать занимаемую оперативную память и нагрузку на процессор. С этой позиции разрешено творить любую дичь в своём продукте, к которому никто не получит доступа, сразу же, когда код становится свободным, рассуждают о качестве кода, возникая некая философия. Многим уже давно известно, что никому не важно качество кода (а ещё сколько вирусов встроено), нужна работающая программа, которую кто-нибудь себе установит.
И такое получится применить к реальному миру, никому не важно неправильное/правильное мнение, а оценивается уровень авторитета. Можно сколько угодно оценивать чужую адекватность, высказанное мнение, но когда у кого-то авторитет больше, тогда ставится под сомнение любая оценка, невозможно в таких условиях определить правого. Разве бомж поспорит с богатым? Разве безработный поспорит с профессионалом? И становится не важно, кто бредит, достаточно, что у кого-то есть право.
Пост отредактировал Anonymous
Anonymous No.186084
16242099677690.png (160 KB, 1826x854)
До сих пор разбираюсь со структурой проекта... На скриншоте то, на сколько файлов разбил сервис с конфигурацией.
Есть ещё модели и репозитории:
src/Entity/ConfigOption.php
src/Entity/ConfigVariation.php
src/Repository/ConfigOptionRepository.php
src/Repository/ConfigVariationRepository.php
Пост отредактировал Anonymous
Anonymous No.186103
Предположим кто-то добавил файлы с бордой на сервер, какие должны быть дальнейшние действия и выглядеть установка?
Нюансы:
1) Автоматическое создание базы данных при посещении любой страницы требует кода, который станет запускаться на любой странице и проверять существование таблиц (проблем с этим нету, но выглядит не особо качественно)
2) Автоматические создание базы данных при посещении главной страницы требует встроить проверку туда на наличие таблиц, в этом случае тоже особых проблем нет.
3) В текущем варианте требуется сгенерировать хэш пароля администратора, а затем добавить в специальный файл на сервере (чрезмерная мера безопасности, требуется упрозднить)
4) Какие действия нужно совершить с случае утери пароля администратора? (В текущем варианте достаточно установить новый хэш пароля в специальный файл)
Пост отредактировал Anonymous
Anonymous No.186104
>>186103
> Предположим кто-то добавил файлы с бордой на сервер, какие должны быть дальнейшние действия и выглядеть установка?
Вакаба проверяла наличие БД и всего остального и создавала при необходимости. Там ничего сложного. Не удалось подключится к БД — значит её ещё не создали. Как-то так.
Потом начиная с кусабы начали использовать отдельный скрипт (install.php и install.sql обычно), который следовало один раз запустить (это делалось через браузер с интерфейсом, отображались все этапы, все ошибки и т.д.).

Посмотри их код, там всё есть.

> Какие действия нужно совершить с случае утери пароля администратора?
Пиздовать на сам сервер через ssh и менять пароль. Если пароль кто-то подобрал, то следует сносить борду и прыгнуть нахуй с моста.
Anonymous No.186105
>>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 имея доступ к серверу.
Пост отредактировал Anonymous
Anonymous No.186106
>>186105
> У меня сейчас так и есть, но выглядит упорото, из-за одной установки форума нужно каждый раз проверять наличие таблиц в БД.
Видимо, ты чего-то не понял. Посмотри код вакабы. Почитай что-то о типах подключения к БД.
Anonymous No.186108
>>186106
Так не пойдёт, если получилось подключиться в БД, тогда не обязательно присутствуют сами таблицы (и ещё аккаунт администратора).
Anonymous No.186113
>>186108
> если получилось подключиться в БД, тогда не обязательно присутствуют сами таблицы
Тогда следует выдать ошибку. В любом случае каждый запрос к БД должен быть завернут в try, или что-то в этом роде.
Anonymous No.186114
>>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();
}
Пост отредактировал Anonymous
Anonymous No.186115
Вопрос состоит в том, какой вариант удобнее? Потому что с позиции программиста удобен любой вариант... Я могу реально редактировать файл на сервере, добавлять туда хэш пароля администратора, но такое может не понравиться какому-нибудь обычному пользователю, который хочет создать аккаунт без лишних проблем. И так же установка... нету проблем сделать /setup.html, но обычный пользователь может не прочитать инструкцию к форуму, главная страница выдаст ошибку, пытаюсь определить самый удобный способ установки.
Пост отредактировал Anonymous
Anonymous No.186118
mysql -u root -h localhost -p
ALTER USER 'userName'@'localhost' IDENTIFIED BY 'New-Password-Here';
FLUSH PRIVILEGES;
Anonymous No.186120
>>186118
Зачем тебе пароли на локалхосте?
ALTER USER 'userName'@'localhost' IDENTIFIED USING unix_socket;
Anonymous No.186123
>>186120
А если кто-то пролезет на сервер и без всяких привелегий рута полезет в бд?
Anonymous No.186124
>>186123
И че у тебя в бд пароль соленый
Anonymous No.186126
>>186118
К чему это? Создание пароля для доступа к базе данных вне юрисдикции php-скрипта. Пароль администратора другое совершенно... На странице установки потребовать создать аккаунт администратора? В таком случае при первом запуске никто не должен знать адрес сервера. Есть такая идейка... в инструкции к установки форума будет напоминание о переменной в файле .env
ADMIN_ID=1
получится первый зарегестрированный аккаунт будет админский, но если сделать (режим паранойи)
ADMIN_ID=0
тогда система станет требовать указать ID администратора.
Пост отредактировал Anonymous
Anonymous No.186128
>>186084
Вернул обратно структуру.
/home/***/project/maid/src/Service:
Config File.php Section.php Post.php Captcha WebClient Cache.php Cookie.php Upload.php EntityAdditional.php
Board.php Image.php Thread.php ImageDetector.php Validator Auth.php Console.php Database.php Log.php

/home/***/project/maid/src/Service/Config:
ConfigInfo.php ConfigVariation.php ConfigCache.php ConfigDefault.php Config.php

/home/***/project/maid/src/Service/Captcha:
Captcha.php SessionCaptcha.php

/home/***/project/maid/src/Service/Validator:
FileValidator.php FilesValidator.php

/home/***/project/maid/src/Service/WebClient:
saucenaoDotCom.php iqdbDotOrg.php
Anonymous No.186129
>>186123
Он туда попадёт только если получит права пользователя userName, у которого бы в ином случае пароль всё равно бы лежал где-то в конфигах сайта плэйнтекстом.

Не нужен он, пароль этот, он только создаёт неудобства. Достаточно идентификации по UID'у ломящегося в сокет бд пользователя. В postgresql так по дефолту, а в mysql принято всегда пользовать пароли, наверно, потому что иначе вылезают соснули спермоблядей.

[Назад] [Обновить тред] [Вверх] [Каталог] [ Автообновление ]
181 / 31 / 25

[Ответить в тред] Ответить в тред

15000

Ответ в тред No.185444
Настройки
Избранное
Топ тредов