• Почему не включается nginx?

    IvanCher
    @IvanCher
    Мысли шире
    А вот в предпоследней строчке у тебя точки с запятой нет. Это ты скопировал тоже неправильно или её реально нет ?
    После вот этого
    root /var/www/html

    И читаем документацию.
    Должен быть префикс http://
    proxy_pass http://127.0.0.1:8080;
    Ответ написан
  • Каким образом можно обеспечить aCid при условии одновременного запроса нескольких пользователей?

    IvanCher
    @IvanCher
    Мысли шире
    Сделай прокладку, через которую пользователи будут стучаться.
    Т.е. примерно по такому алгоритму:
    1. Закончился раунд, все из группы А начинают стучаться в контроллер Х
    2. Контроллер Х создает блокировку для группы А и создает новый раунд только для первого достучавшегося пользователя
    3. Другие пользователи группы А получают ответ, что кто-то уже создает новый раунд
    Ответ написан
    6 комментариев
  • Где найти информацию по прикладному PHP-программированию?

    IvanCher
    @IvanCher
    Мысли шире
    Разверни демку от симфони и xdebug'ом пройдись несколько раз по пути запроса клиентского. Думаю, что сразу много интересного увидишь :) Там и события, и компиляция, и DI, и слабая связанность, и много всего другого. Самое главное, что реализовано толково, я бы даже сказал академически правильно. Ну насколько это возможно сделать на "академически странном" языке php.
    А затем попробуй на этом же фреймворке реализовать какое-нибудь простое приложение, например, которое просто принимает от клиента запросы по АПИ и что-нибудь делает простое.
    Ответ написан
    Комментировать
  • Как проресайзить картинку в зависимости от ориентации?

    IvanCher
    @IvanCher
    Мысли шире
    Не помню точно методов этой библиотеки, но логика вроде ж простая:
    1. В коде определяем ориентацию по соотношению стороны по вертикали и горизонтали.
    2. Если картинка в портретной ориентации(ширина по Х меньше, чем по У), то делаешь applyFilter(a), иначе применяешь фильтр б.
    Чем так не подходит ?
    Ответ написан
  • Как правильно огранизовать подход с реализацией ajax?

    IvanCher
    @IvanCher
    Мысли шире
    Я делал так:
    1. Делил весь шаблон на сервере по слоям(Базовый шаблон, базовый для какой-то секции, блок с информацией уникальной для каждой страницы)
    2. Если у меня приходит запрос через ajax, то сервер отдает только часть шаблона, уникальную для каждой страницы, а js уже вставляет её в нужный блок
    3. Если приходит обычный запрос, то отдается с сервера вся страница целиком, js в этом не участвует уже

    Таким образом я решал проблему с тем, чтобы урл отдавал один и тот же контент хоть через js, когда по сайту ползнаешь, так и по прямой ссылке.
    Сейчас я бы использовал reactjs вместе с его роутингом, но это опционально по желанию ))
    Ответ написан
  • Как изменить переменную в самовызывающиеся функции?

    IvanCher
    @IvanCher
    Мысли шире
    Если только через отладку стопнуть в этом блоке выполнение скрипта и поменять. А так у тебя эта переменна закрыта в scope этой функции. Как вариант, ты можешь изменить объявление этой переменной на более высокий уровень замыкания, вплоть до глобального уровня определения в объект window.
    Типа так:
    $(function() {
        window.variable = 5;
    });

    Но аккуратнее с глобальными переменными, это всегда дырка для багов.
    Ответ написан
    Комментировать
  • Быстрее ли несколько параллельных запросов одного последовательного?

    IvanCher
    @IvanCher
    Мысли шире
    В распараллеливании смысл, конечно, есть. Просто это должно делаться на всех уровнях. Апач не использовал уже несколько лет, поэтому тут ничего сказать не могу, но судя по описанным симптомам, затыком у тебя является БД.
    Конкретно с firebird не работал, но наверняка её можно распараллелить через репликации.
    Т.е. сейчас у тебя получается 3 php-скрипта делают запросы к бд. Бд обрабатывает запросы синхронно, поэтому никакого выйгрыша в скорости не получается. Можно либо в настройках бд поискать асинхронную обработку запросов, но врядли там такое есть, либо реплицировать бд по типу мастер-слейв и запрашивать с разных слев-серверов бд данные, тогда прирост в скорости будет.
    Ответ написан
    Комментировать
  • Правильно ли я понимаю паттерн модели из MVC?

    IvanCher
    @IvanCher
    Мысли шире
    Вы представляете себе, что Модель это что-то конкретное, но на деле это просто абстрактный слой и Вы сами решаете какие классы в него входят, а какие нет. На деле в модели содержится ВСЁ, что связано с данными и бизнес-логикой над ними. Далее идет уже реализация, которая может быть очень и очень разной. Например, есть шаблоны проектирования ORM DataMapper и ActiveRecord. Они чуть ли не противоположно разные в реализации, но они обе модели. При этом есть более низкоуровневые архитектуры, например Domain Driven Development и Data Driven Development. В обоих случаях уровень Модели может быть размазан на несколько слоёв приложения.
    Я сейчас работаю в проекте с Domain Driven и там модель размазывается просто на кучу слоёв приложения. Как она будет размазана завист от того, какие слои для своего приложения Вы сами определили изначально.
    И Ваше утверждение, что большинство фреймворщиков ничего не понимают в этом - полная глупость. Фреймворк Симфони - это просто эталон академичности проектирования в пхп. На его основе Ларавель - тоже достаточно грамотный фреймворк. Есть еще Yii, которые пошли другим путем, но тоже очень четко разделяют внутри модель MVC, хотя и дают много возможности наговнокодить и всё смешать в кучу.
    Тут скорее Вы не понимаете, что модель - это не что-то конкретное, а лишь один из 3х компонентов, из парадигмы mvc, ответственный за хранение и изменение состояния данных. Реализаций может быть столько сколько существует программистов и даже больше.
    Еще более неопределенное - это то, как взаимодействуют эти 3 компонента из MVC между собой. Они могут на основе событийной модели взаимодействовать, или явно вызывая друг друга, и еще огромным числом разных способов.
    Касательно Вашего примера, то Вы описали слой хранения данных, переходящий в модель. Моделью, в Вашем случае, является 3ий уровень - строка таблицы(ну может и таблица тоже). 1ый уровень у Вас - это уровень, который должен синхронизировать модель с хранилищем данных. Причем таких "синхронизаторов" может быть несколько и хранилища могут быть очень разными. Например ORM и ODM. Они будут проэцировать и синхронизировать модели с хранилищями данных, но по сути к моделям они не относятся, хотя если нам нужно их всё же определить только в рамках MVC, то это конечно же будет моделью. Но в mvc есть много вещей, которые не относятся ни к одному из этих 3х компонентов, а являются связующими звеньями этих компонентов, например те же ORM, ODM, валидаторы(иногда их в модель зашивают, хотя они могут использоваться и во вне), роутинг, событийные компоненты, логер и прочее-прочее.
    Ответ написан
    4 комментария
  • Какое самое простое и удобное решение для локального сервера на Mac?

    IvanCher
    @IvanCher
    Мысли шире
    А в чем сложность через brew установить себе nginx и всё прочее, что необходимо ?
    Ответ написан
  • Какие есть инструменты для создания таблиц в бд?

    IvanCher
    @IvanCher
    Мысли шире
    Это не в Симфони можно, а в Доктрине, если быть точным. Разница в том, что Симфони может и не использовать доктрину, а например Пропел и тогда не будет генерации.
    Подключите Доктрину к любому проекту и для своих моделей она будет генерировать схему БД.
    Доктрина реализует шаблон DataMapper, это благодаря ему есть возможность сгенерировать схему БД по модели(сущности). Если Вы используете библиотеки, реализующие шаблон АктивРекорд, то такой возможности нет и не может быть.
    Всё просто :)
    Ответ написан
    Комментировать
  • Плохое ли подключение в конструторе бд?

    IvanCher
    @IvanCher
    Мысли шире
    Тем плохо, что кол-во экземпляров этих классов будет равно кол-ву открытых соединений с БД. Плюсом экземпляры класса могут умереть неожиданно, а соединения будут висеть не закрытыми, что не очень хорошо.
    Нужно стремиться к тому, чтобы было минимальное кол-во соединений с бд.
    Denis Derepko дал правильное направление тебе.
    Ответ написан
    Комментировать
  • Когда можно назвать себя программистом(PHP)?

    IvanCher
    @IvanCher
    Мысли шире
    Если ты занимаешься написание программ для компьютеров, то можешь себя называть программистом смело :)
    А вот называть себя "супер программистом", это уже сложнее. Для каждого это что-то своё.
    Рядовые рубисты считают себя супер программистами, но по мне дк большинство просто выскочки с натянутой самооценкой.
    Вордпрессеры многие тоже себя считают супер программистами и что имеют опыт решения "сложных" задач. Главное не спрашивать каких, а то все мозги проедят какой-то мелкотнёй. Возможно это и правда, ведь в контексте вордпресса они многое знают, но в рамках программирования ...
    Я могу так бесконечно перечислять, потому что сам прошел через многие различные этапы, когда считал себя "супер программистом". НО чем я больше узнаю в этой сфере, тем больше понимаю, что очень и очень далеко мне еще до каких-то званий. Во всём мире я вижу не так уж и много "супер программистов", даже среди тех, кто сделал какие-то популярные решения. Примеры приводить не буду :) Просто кто для Вас "супер программист" ? Торвальдс ? Ван Россум ? Брин ? Если кто-то их уровня, то думаю не в этой жизни нам называться с приставкой "супер". Ну а если какой-нибудь Вася из веб-студии "супер сайты", то возможно, Вы уже намного "супернее" и сейчас :)
    Ответ написан
    2 комментария
  • Как быстро сравнить две разные ссылки на одинаковый адрес без curl?

    IvanCher
    @IvanCher
    Мысли шире
    Можешь попробовать приводить все входящие данные url к одному виду(canonical) и хранить этот вид в базе в отдельной колонке.
    Допустим, сперва определяешь сколько уровней домена.
    ecco.ru - 2 уровня (ecco и ru),
    men.ecco.ru - 3 (men, ecco, ru),
    www.men.ecco.ru - 4 (www, men, ecco, ru)
    Сделать это можно как-то так:
    $urls = "www.ecco-shoes.ru
    www.ecco-shoes.ru
    http://ecco-shoes.ru
    https://www.ecco-shoes.ru/
    www.ecco-shoes.ru/
    ecco-shoes.ru
    www.ecco-shoes.ru/?
    www.ecco-shoes.ru/#
    www.ecco-shoes.ru/index.php";
    
    $urls = explode("\n", $urls);
    
    foreach ($urls as $url) {
    	$hostname = parse_url($url, PHP_URL_HOST);
    	$domains = explode('.', $hostname);
    	
    	echo $url."<br/>";
    	echo $hostname."<br/>";
    	
    	foreach ($domains as $domain) {
    		echo $domain."<br/>";
    	}
    	
    	echo "<br/><br/>";
    }

    Затем конструируешь из этих частей урла нужный вид, например игнорируя www, и сохраняешь это в базе в доп. колонке. Желательно все эти части привести к одному регистру, допустим к нижнему.

    И всё, затем проверяешь был ли уже такой урл простым запросом в бд по колонке с каноничным урлом.
    Ответ написан
    Комментировать
  • Как динамически на JQuery прописать стили?

    IvanCher
    @IvanCher
    Мысли шире
    А не пробовали просто создать тег с подключением файла и вставить ?
    Ответ написан
  • Как сверстать адаптивный iframe с pdf-файлом внутри?

    IvanCher
    @IvanCher
    Мысли шире
    iframe похоже никак.
    Просто некоторые браузеры имеют встроенный pdf-reader, а кто-то может не иметь и файл у Вас этот просто начнет скачиваться.
    Дк вот теперь представьте что должно произойти, если браузер не умеет читать pdf, а Вы его вставляете в iframe ... Я вот не понимаю, что должно произойти :)
    Эту библиотеку смотрели https://pdfobject.com/static.html ?
    Ответ написан
    1 комментарий
  • Как направить браузер на Сайт если Сайт и Сервер имеют тот же домен - domain.com?

    IvanCher
    @IvanCher
    Мысли шире
    Не понимаю, как можно попасть на сервер что-то введя в браузер. С другой стороны не понимаю, как можно попасть на сайт, но не попасть на какой-то сервер :) Но это лирика.

    Во-первых: для обновления DNS требуется время, но если у Вас в hosts-файле прописан явно ip домена, то браузер на этом компьютере и не полезет в DNS.
    Во-вторых: домен должен быть настроен и подключен к исходникам сайта на новом сервере, как написали уже здесь.

    Но всё это странно, ибо Вас перекидывает на предыдущий хостинг, а этого не может быть, если Вы обращаетесь через браузер к домену, ip-адрес которого явно прописан в hosts-файле.

    Я думаю, что всё таки чего-то Вы недоговариваете. Давайте больше информации.
    Ответ написан
    Комментировать
  • Личные сообщения структура?

    IvanCher
    @IvanCher
    Мысли шире
    Не понял зачем здесь таблица users_messages, если все связи уже есть в messages.
    Вместо неё сделайте таблицу dialogs: id | from_user_id | to_user_id | date. А таблицу messages привести к виду: id | dialog_id | user_id | text | date
    Алгоритм такой:
    1. Ю1 начинает диалог с Ю2 - добавляем запись в таблицу dialogs. В поля from_user_id и to_user_id заносим айдишники юзеров Ю1 и Ю2 соответственно.
    2. Ю1 пишет Ю2 - добавляем запись в таблицу messages. В поле user_id ставим айдишник юзера Ю1, в dialog_id ставим айдишник текущей беседы, с остальными полями думаю понятно.
    3. Ю2 отвечает Ю1 - добавляем запись в таблицу messages. В поле user_id ставим айдишник юзера Ю2, в dialog_id ставим айдишник текущей беседы.


    Собственно всё :)

    Если диалогов как таковых нет, то из алгоритма шаг 1 вычёркиваете и таблицу соответствующую удаляете.

    Выборку затем делаете что-то типа:
    /* Выбираем все сообщения в хронологическом порядке из диалога с id = :some_dialog_id */
    SELECT m.*
    FROM messages m
    INNER JOIN dialogs d ON d.id = m.dialog_id
    WHERE d.id = :some_dialog_id
    ORDER BY m.date ASC
    Ответ написан
    1 комментарий
  • Почему эти циклы разные но работают одинаково?

    IvanCher
    @IvanCher
    Мысли шире
    Может стоит всё же сперва подучить php ? Он очень легкий, за пару вечером освоите.
    Если коротко, то скажу так - php это язык программирования, который читается интерпретатором и выполняется только та часть, что находится между "<?php" и "?>".
    Если это конец файла, то закрывающего тега "?>" может не быть. Вместо "<?php" может быть написано просто "<?".
    Всё, что не в этих тегах, то не считается интерпретатором за язык программирования и выводится на экран, как есть.
    Внутри php-кода нельзя открывать еще один блок php-кода. То есть между "<?php" и "?>" мы не можем еще раз написать "<?php", будет сразу ошибка синтаксическая.
    В современных версиях php условие if записывается ввиде
    if (true) {
    // some actions
    }

    Но допустима и запись в старом виде
    if (true):
    // some actions
    endif;

    С циклом while история аналогичная.

    Не знаю зачем я пишу тут такие основы, ведь если Вы не удосужились открыть хоть что-то и прочитать про php, то вряд ли и это прочтёте, но всё же а вдруг ... :)

    Надеюсь как-то смог помочь.
    Ответ написан
    Комментировать
  • Rails Capistrano Mac OS. В чем проблема при deploy?

    IvanCher
    @IvanCher
    Мысли шире
    Я установил highline и всё стало норм.
    sudo gem install highline
    Ответ написан
    Комментировать
  • Как лучше сделать несколько языков?

    IvanCher
    @IvanCher
    Мысли шире
    Пишу самописный движок одного сайта.

    Не буду даже объяснять насколько нелепа затея.
    Просто несколько вопросов, которые Вам лучше самому себе задать и ответить:
    • С какими цмс и фреймворками Вы уже работали и насколько глубоко их знаете ?
    • С каким кол-вом проектов в целом уже сталкивались, какие сложности возникали ?
    • На какой тип проектов рассчитана Ваша cms ?
    • Какие готовые решения будете брать за основу ?

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

    Какой htaccess ? А если "сайт взлетит" и придется nginx поставить ? :) Ладно, шучу, не взлетит ни сайт, ни cms, так что за это не беспокойтесь :)

    По сути Вашего вопроса.
    У Вас должен быть слой, который отвечает за сопоставление запроса к некоторому контроллеру/действию/методу/еще чему-то. Назовем данный слой Router.
    А у Router'a может быть такая логика: если после домена идёт /(ru|en|pl), то установить в сессию или куку соответсвующее значение текущего языка.
    В коде, где выводите какой-либо текст, то оборачиваете этот текст в метод перевода. Например, пусть это будет статический метод Translator::trans($message). Внутри статического метода берёте из сессии/куки текущий язык и смотрите есть ли данное сообщение для такого языка. Ну а дальше развивайте логику, как хотите.
    Ответ написан