Это копия, сохраненная 26 декабря 2014 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.
Требуемые знания: умение читать. Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (необязательно).
Предыдущий тред был тут: >>405044
У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru Если ты ньюфаг, просто решай задачки оттуда, они там реально простые, и пости сюда ссылки на решения, мы посмотрим и скажем, правильно или нет и дадим совет, если можно что-то улучшить. Если не совсем ньюфаг, напиши, что ты знаешь, что нет, что хочешь изучить, я дам тебе какую-нибудь задачку посложнее. После прохождения учебника напиши, ОП даст тебе более сложные задания.
Есть еще у нас задачки на HTML, JS, MySQL.
Правила: ведем себя воспитанно, помогаем новичкам, постим ссылки на решения задачек, ОП их проверяет и дает советы и замечания.
ОП, как всегда, помогает и дает советы, отвечает на самые нубские и простые вопросы. У ОПа есть почта, так что даже если он не появляется в треде уже неделю, вы всегда можете написать ему что-то хорошее. ОП обычно занят, но где-то раз в сутки в треде появляется.
Оформляй код аккуратно!!! например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
Что почитать?
Мануал по PHP — http://www.php.net/manual/ru/langref.php
Сайт phptherightway
По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
JS: learn.javascript.ru
HTML/CSS: Путь верстальщика: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
MySQL: https://gist.github.com/codedokode/10539213
Слишком простые задачи? Напиши что знаешь, что хочешь изучить и придумаем тебе задачку посложнее.
Сайт опять упал!!!!! Не паникуй, а открой http://rghost.net/45000175
Не поздно ли в мои 40 становиться программистом? Ох, это будет сложно, но если ты покажешь лучшие знания, чем моложежь, то шансы есть.
Где архивы предыдущих тредов? Известно, где, на mediafire: http://www.mediafire.com/download/gza5360wdzqd743/threads-archive-pr-1..17.zip (189Мб, треды 1-17 из pr), http://www.mediafire.com/download/kgzl1f9366gc6ed/threads-archive-11..20.zip (72 Мб, треды 11-20 из b). Также один анон выложил все на дропбокс: https://www.dropbox.com/sh/4sb69jrx9qwrpcw/-nY5ia__VC (ок, он иногда не работает)
Как начать пользоваться командной строкой — gist.github.com/anonymous/9378956452c8e4a72ac8
ОП, сделай за меня мою работу или домашнее задание? — Это конечно, хорошая идея, но нет.
Расскажи про поиск работы, фриланс etc Информация о фрилансе есть в /wrk . Также, походи по сайтам вроде hh.ru, hantim.ru, geekjob, fl.ru, посмотри, поизучай ситуацию. Имей в виду, кроме фриланса, где ты 2 дня ищешь заказ, полдня обсуждаешь за бесплатно суть работы, день делаешь и еще 2 дня слушаешь от заказчика что он о тебе думает, есть удаленная работа — продаешься в рабство, и занимаешься только программированием, задачи тебе будут подкидывать наготово. Ищется по слову «удаленно» на перечисленных сайтах. Зарплата на удаленной работе может быть меньше чем в офисе в столице, но больше чем в твоей деревне. На одеске зарабатывают больше, чем на русском фрилансе.
В общем, давайте начинать уже!
Прочти сначала этот пост.
Как и чем отформатировать код
Важно писать код не как попало, а аккуратно, как принято. Почему? Ну потому, что другой человек, который будет смотреть твой код, вряд ли обрадуется, когда ему придется разбирать слипшиеся строчки, разбросанные в беспорядке скобки и написанные русскими словами названия переменных. Особенно плохо будет если это, например, код тестового задания, которое ты сделал, чтобы устроиться на работу. Ты же не хочешь, чтобы тебя называли быдлокодером?
Не бойся, сделать код аккуратным совсем не сложно. Самый универсальный способ — вставить его на сайт http://phpformatter.com и нажать кнопку Format. Робот сам выровняет твой код в лучших традициях.
Если ты используешь для редактирования кода IDE, то все еще проще (а если не используешь, то почему бы не начать?):
- Eclipse PDT — жми Ctrl + Shift + F для автоматического форматирования кода.
- Netbeans for PHP — жми Alt+Shift+F
- Zend Studio — жми Ctrl + A (выделить все), затем Ctrl + Shift + F
- PhpStorm — жми Ctrl+Alt+L
- PHPDesigner — поищи нужную опцию в меню, она там есть. Или жми Ctrl + Shift + F1
- Komodo IDE — правая кнопка -> Format Using...
Вот так, нажатием одной кнопки ты можешь сделать жизнь гораздо проще.
Как видишь, c IDE жизнь может быть намного проще (еще в них есть автодополнение, автоматическая проверка кода и подсветка ошибок, навигация по файлам и функциям и много чего еще).
Подробнее: https://gist.github.com/codedokode/8759492
в classe foo {
...
function foo1(){
...
else{
throw new Expection
}}}
Где мне в таком случае писать try{} catch{} каждый раз, когда я вызываю функцию foo1 что ли?
Ты не обязан писать try/catch. Если ты хочешь чтобы исключение завершало программу. ничего делать не надо, это произойдет автоматически.
Тут вроде написано https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
В смысле не переставать учиться? А как иначе? Если с моими знаниями прост ходить на работу, ты через две недели выпнут, инфа 100
Год тут трусь примерно. Учу медленно очень, с перерывами до нескольких месяцев, как когда например работал эникеем. Сначала учился только по учебнику ОПа, потом добавил книжку Никсона. Знаниями никакими почти не обладаю, ну вот вчера скидывал решение задачи про числа http://ideone.com/sSOFaM - это мой пхпшный максимум пока. Месяц как поставил себе Убунту - неспеша изучаю её. Так же начал гуглить и читать про MySQL и HTML параллельно с этим неделю-две назад. Такие дела. Надеюсь что сейчас начну расти куда быстрее, ведь придется учиться 8 часов в день вместо 1-2х.
Ты блять шутишь? То есть задачи на ооп, банкоматы, расчет пути ты не делал?
Что у тебя контора спрашивала если это твой максимум епт?
Пришел, сказал тоже что и тебе. Что нихуя не умею кроме самых основ. Чел который меня собеседова спросил только, смогу ли с MySQL базой работать напрямую или средствами php, я ответил что пока не могу. В итоге он попросил оставить ему контакты и сказал что перезвонит. Через несколько дней пришла смс, что мол им нужен кто поопытнее и мол извини. На что я перезвонил и сказал, что пусть хотя бы вышлет мне какое-нибудь задание для теста / прокачки скилла. В итоге вместо задания он сегодня утром мне позвонил и сказал что в понедельник я могу приходить на работу. Видимо не нашли вообще никого толкового и решили взять нубаса на вырост.
Нск. Ну и кстати первую задачу на ооп таки делал, просто у меня системы нет годной в обучении. Читаю теорию, как по тому же ООП, но не закрепляю практикой. Далее например html позадротил 2 дня, потом забросил на неделю, так что все забыл почти, и придется освежать. Но все равно я почти год читаю что-то и гуглю постоянно. Думаю я отличаюсь все же от твоего вот этого представления.
>Ты блять шутишь? То есть задачи на ооп, банкоматы, расчет пути ты не делал?
>Что у тебя контора спрашивала если это твой максимум епт?
Это не мой пост был, хотя я тоже крайне удивлен. У меня почти такой же опыт, кстати, только я с точностью до наоборот делал: начинал с Никсона, после него взялся за учебник Опа, сейчас на задаче про кошек с мышками.
Ну и значит время начать тоже ходить по собеседованиям? Вчера в веб-макако треде в /b был анон, который в ДС пол года назад утроился таким же днищем за 18к и проработал 2 месяца пока его не выгнали, в итоге работает уже за 45к в другой конторке и вроде справляется. Так это же вообще круто как по мне. Получаешь экспу да еще и платят, никакие универы не нужны и голова работает на всю катушку.
Я для себя решил что как минимум задачу на файлообменник запилю, дабы не стыдно было показать на собеседовании, так как остальные задачки это имхо дет сад.
>>408613
Ну я тоже не хотел идти совсем раньше времени. Думал что если прити совсем нубом, то мало того что профейлишь стопроцентно, так еще и с тобой никто не будет повторно разговаривать раньше чем через пол года. "Поэтому уж лучше подучу еще два месяца" - думал я. Но в итоге прошел очередной месяц и я почти нихуя не сделал за него. А жизненная ситуация сильно поджимает, что нужны деньги и какое-то движение. Создал резюмешку и начал очень неспешно рассылать, буквально по 1 вакансии в неделю. И вот через месяц уже так подфартило. И вот кстати вы скилловее меня, но так как сидите дома как сычи, о вас никто и не знает. И вакансии в итоге занимаются такими как я. И вот если сейчас у меня все взлетит, в итоге через два месяца я с вероятностью в 95% обойду вас по скиллам + буду уже иметь два месяца реального рабочего опыта впридачу. Это не бахвальство, это просто так в жизни бывает. Надеюсь вас это смотивирует больше учиться или тоже пойти попробовать пройти пару собеседований. Учить сидя дома это кстати зона комфорта, а собеседования это стресс. Меня как минимум фейлы мотивируют к изучению, ну или банально пришел домой и загуглил что провалил - уже польза.
Ты резюме сам составлял? Ненавижу эту хуйню. Его ведь можно заказать у кого-нибудь.
Сам составлял. Это супер легко же. На современных "вебДваНольных" сайтах с работой тебе нужно только заполнить все поля и нажать одну кнопочку. Хотя одно дело просто составить резюме, а другое дело составить действительно хорошее. Ну я посмотрел на резюме других пхп-макак и старался не совсем мудацкое сделать. Что бы хоть видно было, что я вообще представление имею о том, чем собираюсь заниматься.
В чем проблема? Если у тебя нет опыта работы, то у тебя все должно на 1 страницу уместиться, информация о себе, образование, скиллы (курсы и то что ты сам изучал), желаемая должность. Алсо, не забудь файл назвать «Имя Фамилия — резюме.doc». Алсо, не выпендривайся и не делай никакого нестандартного оформления.
Скрипт перезапустить нельзя. Но можно повторно вызвать функцию.
Тогда try/catch должен стоять в самом верху внутри цикла do ... while
try {
fn( );
} catch (..) {
echo "Error...";
}
Интуиция подсказывает мне также, что скорее всего ты что-то делаешь неприавльно. Исключения говорят обычно о серьезной ошибке в программе и надо исправлять эту программу, а не пытаться запустить ее еще раз.
Нет. Мне посоветовали выбить исключения, когда введен неправильное число. Не 1,2,3, а любое другое. До этого я просто убивал скрипт.
http://ideone.com/CzWUK3
Кстати, вот код. Может мне объяснить почему я не могу вызвать функцию getPaid()?
Тогда тебе нужен свой класс исключений. Ты читал мой урок про исключения? Не надо ловить все подряд.
Ну и лучше вообще проверять число до того, как пытаться что-то сделать, и если оно неправильно, просить ввести заново.
> почему я не могу вызвать функцию
Посмотри внизу под программой сообщения об ошибке, начиная с самого первого. Так указано в какой строке проблема, посмотри на нее и соседние очень-очень внимателньо. Там где-то лишний $ стоит
Хм, попробую. Спасибо.
запилю тоже кулстори. короче где-то пол года назад начал читать учебник опа. потом прочел никсона.
работаю уже второй месяц, я 4й курс, поэтому написал заявление на вольное посещение, на пары не хожу. работаю фул дей. зарплата норм. с недели на неделю съедусь со своей тяночкой в съемной квартирке, брат жив, зависимость есть. спасибо опу за мануал и ответы в тредах, я подозреваю, что он убийца, отмывающий тут свою карму. если бы он так охуенно и доступно не описал основы - я бы вряд ли этим занимался. так что спасибо, оп, ты отличный человек
да, это библиотека для js. которая очень упрощает взаимодействие с элементами веб-страниц. и не только.
Я думаю, анон намекает что неплохо бы сначала тщательно изучить сам JS и DOM, а потом уже библиотеку для работы с ними.
У Никсона там совсем уж основы, как создавать переменные, массивы например, вообщем как самый первый урок опа. Ну и Аякс еще.
там больше ста страниц. там подают достаточно, чтобы его понимать, я потом ещё игру на js небольшую делал, арканоид))0.
в любом случае jquery дается мне легко и без проблем.
к слову, этой библиотекой можно начинать пользоваться с практически нулевыми знаниями js. С помощью неё все равно большинство действий выполняются иначе. Проще, быстрее.
Совсем не схож же!
А подробнее не распишешь? Что было между тем как начал учить и когда уже нашел работу?
Что за тестовое задание было в плане ПХП когда устраивался? сравнимо по сложности с заданием ОПа про компанию Вектор или ещё с каким-нибудь?
Между букв типа? Ну разбей строку на массив, и если элемент равено пробелу то unset его например.
str_replace или strtr, заменяющая пробел на пустую строку. Не надо ничего разбивать, надо использовать готовые функции.
Решаю, сейчас всё по ООП пробую, до этого много решал по процедурном, когда ещё не начинал учить ООП и даже боялся к нему прикасаться, даже написал гостевую книгу, примитивный блог с выводом из базы данных, и даже примитивную игру где надо покупать или продавать акции, и попытаться набрать необходимую сумму денег, ну и конечно многие задачи решил, как с учебника ОП так и других. Но сейчас такое ощущение что всё то немного забываться начинает из-за того что весь мозг заняло ООП, я наверное глуповат, часто за собой подобное замечал. Насколько я знаю что-то запоминается когда наращивается нейронная связь на синапсах, то есть когда трещины между нейронами становятся меньше и электроны свободно проходят, когда что то учишь она наращивается, но со временем может ослабевать, я подозреваю что у меня всё очень быстро ослабевает в этом плане.
Объекты теперь клонируются.
Все условия разбиты нормально.
Проверяю на правильность $level на входе. (С исключениями почти разобрался, думаю пойму на практике.)
Значения страницы, кофе, зарплату теперь храню и не изменяю, а считает функция и даже если разжаловать сотрудника, или наоборот, то возвращает правильное значения.
Вместо корявого str_pad использую str_repeat.
>>> $total += $this->workers[$key]->paid;
Вместо $this->workers[$key] можно и нужно писать $value
Не ясно вот с этим. При замене на $value или value ничего не работает.
Добавлена колонка итого.
http://ideone.com/efQJOW
Думал над этим, но это работает только при условии, что я буду знать значения, а если значения ключей меняются? я же не могу обращаться к ним как здесь http://ideone.com/Edyg6P
, ведь если поменяется значение то и ключ второго массива окажется неверным
Спасибо огромное
А можно как нибудь переименовывать ключи в новом массиве, чтобы стали как в самом первом? Чтобы не [0], [1], [2] а [10], [15]... ?
>>408725
ну между тем, как начал и между тем как устроился - я обмазывался никсоном и задачками опа.
тестового задания не было, меня спрашивали, дохуя спрашивали. но поскольку я читал никсона - теорию я кое как знал. Спрашивали за разное, в принципе ничего сложного. Разные вопросы по sql,html,css ещё. Там были вопросы на бумажке, типа, правильно ли написан тот, или иной код. Или что выведет эта то там хуйня(задания с подъебами).
Интересно, что собеседование проводил программист, который оттуда уходил. И он писал начальнику на резюме потом, что может сказать про человека, в основном было написано "слабый, неприятный", "средний, адекватный" и т.д. Поэтому поведение и коммуникативные качества тоже явно важны. Я нашел просто резюме других людей у себя на столе. Жаль, моего не было.
\t\t$dbh - > beginTrаnsaсtion ( );
//exеcute
\t\t$dbh - >cоmmit( );
Не могу найти в манулах ничего по этой версии. Только для sqlite3+
Я короче почитал в мануале за ссылки, ничего не понял. Проспался и тут пришел в голову эксперимент. Провел его и теперь все понял! Но вот вопрос, есть ли еще какие подводные грабли, которые здесь не учитываются?
http://ideone.com/sNOxgE
Ретёрнит 4. А почему стала = 3, когда была 1? Потому что объявляя $a глобальной и изменяя ее значение, мы меняем значение аргумента $var, потому что он сам прилинкован. Пушка, да?
Ни ссы. Читай мануал и практикуйся. Потом будет такое что нихуя сам придумать не можешь и это правильно - ооп же. Потом качай книгу "Мэтт Зандстра - PHP. Объекты, шаблоны и методики программирования" и работай с ней. Только не почитывай, а повторяй выдумывая аналогичные примеры. Это кстати единственная книга по ооп на php.
if($this->x <= $this->cats[0]->getCoordinateX() && $this->x != 0){
\t$this->x = $this->x - 1;
}
>>408687
> этой библиотекой можно начинать пользоваться с практически нулевыми знаниями js
Можно, но не нужно, так как получится быдлокодер, который сам толком не понимает, что пишет.
>>408735
Хорошо, действительно, исправлены замечания. Вот тогда еще порция.
По оформлению: у классов и функций, методов скобка ставится на новой строке (а у if/for — на той же самой):
class X
{
...
if (...) {
...
Если ты зальешь свой код на phpformatter.com, он исправит это автоматически.
> if ($this->chief){
> return 0;
> } else {
> return $this->pages;
Тут напрашивается тернарный оператор:
return $this->chief ? 0 : $this->pages;
Заметь что он годится только для простых выражений, если получается сложное выражение на несколько строк, лучше писать if.
Длинные комментарии, которые ты пишешь справа от функции, лучше писать перед ней, на предыдущей строке.
> else {
> echo "The object with $level =! (1,2,3) can't exists. Please create a new object with these levels.\n";
> return False;
Это бессмысленная конструкция. Даже если ты вернешь false из конструктора, объект все равно создастся (так как фактически он создается еще до вызова конструктора). Надо выкидывать исключение.
throw new Exception("The object with $level =! (1,2,3) can't exists. Please create a new object with these levels.");
Ловить его не требуется.
У тебя одинаковый конструктор скопипастен 4 раза. Не надо копипастить, просто перенеси его в класс Worker.
> $array_count
Переменные и функции принято называть камелкейсом, то есть разделяя слова заглавными буквами: $workerCount
Насчет клонирования, лучше бы конечно создавать через new, но можно и клонировать. Клонирование не должно быть в классе Департамент. Департамент не занимается клонированием рабочих, он должен получать на вход массив, а клонировать их должны где-то в другом месте.
> for ($i = $array_count; $i <= ($array_count + $count);
Тут не нужен array_count. Можно считать от 0 до count.
> foreach ($this->workers as $key => $value) {
> $total += $this->workers[$key]->getPaid( );
Не называй переменные бессмысленными именами типа value. Тут вместо $value лучше использовать $worker. также, не надо обращаться к массиву через key. Вот, как это лучше написать:
foreach ($this->workers as $worker) {
$worker->sayHello( );
}
Сравни, насколько короче получается и насколько там меньше скобок и стрелок и насколько это читабельнее. Перепиши все циклы на более короткие варианты.
Колонки в таблице можно было делать разной ширины, было бы красивее. Но можешь и так оставить, как есть.
> ?>
Не ставь этот маркер в конце файла. За ним могут случайно оказаться пробелы, или пустые строки, которые выведутся. В веб-приложениях (которые ты будешь писать в будущем) это создаст тебе проблемы, так как php после вывода любого символа, пусть даже это пробел, не может отправлять заголовки, ставить куки и открывать сессию.
В остальном, задача почти решена, думаю, когда ты это исправишь, особо замечаний уже не останется.
>>408687
> этой библиотекой можно начинать пользоваться с практически нулевыми знаниями js
Можно, но не нужно, так как получится быдлокодер, который сам толком не понимает, что пишет.
>>408735
Хорошо, действительно, исправлены замечания. Вот тогда еще порция.
По оформлению: у классов и функций, методов скобка ставится на новой строке (а у if/for — на той же самой):
class X
{
...
if (...) {
...
Если ты зальешь свой код на phpformatter.com, он исправит это автоматически.
> if ($this->chief){
> return 0;
> } else {
> return $this->pages;
Тут напрашивается тернарный оператор:
return $this->chief ? 0 : $this->pages;
Заметь что он годится только для простых выражений, если получается сложное выражение на несколько строк, лучше писать if.
Длинные комментарии, которые ты пишешь справа от функции, лучше писать перед ней, на предыдущей строке.
> else {
> echo "The object with $level =! (1,2,3) can't exists. Please create a new object with these levels.\n";
> return False;
Это бессмысленная конструкция. Даже если ты вернешь false из конструктора, объект все равно создастся (так как фактически он создается еще до вызова конструктора). Надо выкидывать исключение.
throw new Exception("The object with $level =! (1,2,3) can't exists. Please create a new object with these levels.");
Ловить его не требуется.
У тебя одинаковый конструктор скопипастен 4 раза. Не надо копипастить, просто перенеси его в класс Worker.
> $array_count
Переменные и функции принято называть камелкейсом, то есть разделяя слова заглавными буквами: $workerCount
Насчет клонирования, лучше бы конечно создавать через new, но можно и клонировать. Клонирование не должно быть в классе Департамент. Департамент не занимается клонированием рабочих, он должен получать на вход массив, а клонировать их должны где-то в другом месте.
> for ($i = $array_count; $i <= ($array_count + $count);
Тут не нужен array_count. Можно считать от 0 до count.
> foreach ($this->workers as $key => $value) {
> $total += $this->workers[$key]->getPaid( );
Не называй переменные бессмысленными именами типа value. Тут вместо $value лучше использовать $worker. также, не надо обращаться к массиву через key. Вот, как это лучше написать:
foreach ($this->workers as $worker) {
$worker->sayHello( );
}
Сравни, насколько короче получается и насколько там меньше скобок и стрелок и насколько это читабельнее. Перепиши все циклы на более короткие варианты.
Колонки в таблице можно было делать разной ширины, было бы красивее. Но можешь и так оставить, как есть.
> ?>
Не ставь этот маркер в конце файла. За ним могут случайно оказаться пробелы, или пустые строки, которые выведутся. В веб-приложениях (которые ты будешь писать в будущем) это создаст тебе проблемы, так как php после вывода любого символа, пусть даже это пробел, не может отправлять заголовки, ставить куки и открывать сессию.
В остальном, задача почти решена, думаю, когда ты это исправишь, особо замечаний уже не останется.
Когда скрипт на js подключается из файла, понятно что клиент этот подключаемый файл видит и сможет открыть и прочитать, иначе как бы он... в общем я сам понимаю, что нельзя, но может как-то, лел, можно его скрыть от прямого доступа пользователем-человеком? Может какие-то разрешения на открытие/запуск напрямую? Какие-то варианты вообще моугт быть?
>>408766
Я только прокомментирую, что часто дают задачки на знание всяких особенностей PHP, и чтобы их решить, стоит прочесть весь мануал по PHP (раздел «справочник языка»). Это потребует дня 2-3, но зато вы будете себя чувствовать с такими вопросами увереннее.
>>408791
А просто запросы BEGIN/COMMIT не работают? Вот доки: https://www.sqlite.org/lang_transaction.html
Также, не понимаю, какая выгода сидеть на старой sqlite.
>>408798
Граблей много, они описаны в мануале. Лучше всего вообще не использовать ссылки в коде. global естественно, тоже. Хорошая функция получает аргументы на вход и возвращает результат на выходе, никак не трогая остальные переменные.
>>408802
Не сокращай так переменные: function postMe, 'tug' => 500. Это очень тяжело читать. Надо писать addManager, 'tugricks'. Если ты пишешь код на ideone, а там неудобно писать большие тексты, то переходи на IDE или редактор (Sublime Text, Notepad++, PhpStorm, Eclipse, NetBeans) — там есть автодополнение и тебе не придется руками печатать длинное имя второй раз.
Ты хранишь данные неправильно. Вместо того, чтобы хранить данные в исходном виде (например число сотрудников как число), ты хранишь их в закодированном виде внутри строки и вынужден писать длинный код разбора этой строки, вместо того чтобы просто написать что-то вроде
$count = $this->count;
Мало того, что тебе тяжело писать этот код, его еще и читать тяжело. Более того, ты еще и скопипастил его 3 раза, а копипаста — зло. Это, разумеется, абсолютно не годится. Сделай нормально хранение данных.
Дальше, у тебя сейчас код очень трудно менять. Допустим, мы хотим добавить пятую профессию. Или хотим сделать расчет зарплаты для менеджера по другой формуле, не как у других. Сколько мест в коде придется изменить?
В правильно написанном ООП коде для этого было бы достаточно дописать один класс, не меняя остальной код.
В общем, пока решение неверное и не соответствует принципам ООП. Давай исправлять. Вот какие вопросы ты должен
задать себе прежде чем писать ООП код:
— какие сущности можно выделить в задаче, для которых мы создадим классы? Очевидно, это Департамент и Сотрудник
— какие свойства есть у сущностей? У Сотрудника очевидно есть свойства вроде «ранг», «является ли боссом», и т.д.
— что мы хотим получить от сущностей, то есть какие у них должны быть методы? От Сотрудника напрмер, мы хотели бы узнать его зарплату с учетом всех надбавок, сколько он кофе выпивает, от Департамента — суммарную зарплату всех Сотрудников.
— как сущности связаны? Тут все просто: каждый Департамент содержит несколько Сотрудников
Дальше, если подумать, то логично сделать не один класс Сотрудник, а 4 класса: Менеджер, Инженер, ит.д. Конечно, у них будет много общего, потому, чтобы не копипастить код, стоит применить наследование. Наследовние позволяет нам создать класс не с нуля, а на основе существующего класса: http://php.net/manual/ru/language.oop5.inheritance.php Например, мы можем сделать базовый класс Сотруждник, а на его основе сделать Менеджер, Инженер, и т.д.
Не забудь пометить базовый класс абстрактным, чтобы было ясно что его напрямую использовать нельзя.
Ну и еще. Раз уж ты переделываешь код, то давай используем инкапсуляцию. Прочитай в мануале про public/protected/private и сделай все свойства всех классов не-публичными. Инкапсуляция, то есть когда ты не можешь залезть снаружи в свойства объекта, а только можешь вызывать методы, делает код гораздо более качественным и надежным.
Если что-то непонятно, или есть вопросы, задавай. Если все понятно, пиши код.
>>408766
Я только прокомментирую, что часто дают задачки на знание всяких особенностей PHP, и чтобы их решить, стоит прочесть весь мануал по PHP (раздел «справочник языка»). Это потребует дня 2-3, но зато вы будете себя чувствовать с такими вопросами увереннее.
>>408791
А просто запросы BEGIN/COMMIT не работают? Вот доки: https://www.sqlite.org/lang_transaction.html
Также, не понимаю, какая выгода сидеть на старой sqlite.
>>408798
Граблей много, они описаны в мануале. Лучше всего вообще не использовать ссылки в коде. global естественно, тоже. Хорошая функция получает аргументы на вход и возвращает результат на выходе, никак не трогая остальные переменные.
>>408802
Не сокращай так переменные: function postMe, 'tug' => 500. Это очень тяжело читать. Надо писать addManager, 'tugricks'. Если ты пишешь код на ideone, а там неудобно писать большие тексты, то переходи на IDE или редактор (Sublime Text, Notepad++, PhpStorm, Eclipse, NetBeans) — там есть автодополнение и тебе не придется руками печатать длинное имя второй раз.
Ты хранишь данные неправильно. Вместо того, чтобы хранить данные в исходном виде (например число сотрудников как число), ты хранишь их в закодированном виде внутри строки и вынужден писать длинный код разбора этой строки, вместо того чтобы просто написать что-то вроде
$count = $this->count;
Мало того, что тебе тяжело писать этот код, его еще и читать тяжело. Более того, ты еще и скопипастил его 3 раза, а копипаста — зло. Это, разумеется, абсолютно не годится. Сделай нормально хранение данных.
Дальше, у тебя сейчас код очень трудно менять. Допустим, мы хотим добавить пятую профессию. Или хотим сделать расчет зарплаты для менеджера по другой формуле, не как у других. Сколько мест в коде придется изменить?
В правильно написанном ООП коде для этого было бы достаточно дописать один класс, не меняя остальной код.
В общем, пока решение неверное и не соответствует принципам ООП. Давай исправлять. Вот какие вопросы ты должен
задать себе прежде чем писать ООП код:
— какие сущности можно выделить в задаче, для которых мы создадим классы? Очевидно, это Департамент и Сотрудник
— какие свойства есть у сущностей? У Сотрудника очевидно есть свойства вроде «ранг», «является ли боссом», и т.д.
— что мы хотим получить от сущностей, то есть какие у них должны быть методы? От Сотрудника напрмер, мы хотели бы узнать его зарплату с учетом всех надбавок, сколько он кофе выпивает, от Департамента — суммарную зарплату всех Сотрудников.
— как сущности связаны? Тут все просто: каждый Департамент содержит несколько Сотрудников
Дальше, если подумать, то логично сделать не один класс Сотрудник, а 4 класса: Менеджер, Инженер, ит.д. Конечно, у них будет много общего, потому, чтобы не копипастить код, стоит применить наследование. Наследовние позволяет нам создать класс не с нуля, а на основе существующего класса: http://php.net/manual/ru/language.oop5.inheritance.php Например, мы можем сделать базовый класс Сотруждник, а на его основе сделать Менеджер, Инженер, и т.д.
Не забудь пометить базовый класс абстрактным, чтобы было ясно что его напрямую использовать нельзя.
Ну и еще. Раз уж ты переделываешь код, то давай используем инкапсуляцию. Прочитай в мануале про public/protected/private и сделай все свойства всех классов не-публичными. Инкапсуляция, то есть когда ты не можешь залезть снаружи в свойства объекта, а только можешь вызывать методы, делает код гораздо более качественным и надежным.
Если что-то непонятно, или есть вопросы, задавай. Если все понятно, пиши код.
Ты имеешь в виду этот тред? >>374025 Ты не путаешь что-то? По моему персонаж из оп-поста у меня нигде не встречается.
>>408827
Сразу же совет: переходи на utf-8, 1251 использовать нет никакой выгоды, она старая и убогая (в ней всего 255 символов доступны, а в utf-8 десятки тысяч).
И зачем ты ставишь столько пустых строк? Не ставь больше 2 пустых строк подряд.
> if($_POST['submit1'])
> {
> function bankomat()
Функции не должны определяться внутри if.
Дальше, в самой функции у тебя слишком длинные строки. Я вижу там есть 7 уровней отступов — такого быть не должно. В такой простой задаче хватит максимум 3 уровней вложенности.
Настрой свой редактор, чтобы он вставлял вместо таба 4 пробела, а то код тяжело читать, отступы конские. Этот код можешь пропустить через phpformatter.com, он исправит.
> if ($rem >= $bills[500])
У тебя жестко закодирован номинал банкнот. Так не пойдет. Надо чтобы номинал брался их массива и можно было его менять, не переделывая код.
> echo "<br>$rem купюр номиналом 5
Хорошая функция ничего не выводит, а только возвращает. Вынеси echo наружу из функции.
Имя функции должно начинаться с глагола, в стиле сделайЧтоТо, например рассчитайСдачу: calculateChange.
Код слишком длинный для такой простой задачи. Сократи его.
Ты имеешь в виду этот тред? >>374025 Ты не путаешь что-то? По моему персонаж из оп-поста у меня нигде не встречается.
>>408827
Сразу же совет: переходи на utf-8, 1251 использовать нет никакой выгоды, она старая и убогая (в ней всего 255 символов доступны, а в utf-8 десятки тысяч).
И зачем ты ставишь столько пустых строк? Не ставь больше 2 пустых строк подряд.
> if($_POST['submit1'])
> {
> function bankomat()
Функции не должны определяться внутри if.
Дальше, в самой функции у тебя слишком длинные строки. Я вижу там есть 7 уровней отступов — такого быть не должно. В такой простой задаче хватит максимум 3 уровней вложенности.
Настрой свой редактор, чтобы он вставлял вместо таба 4 пробела, а то код тяжело читать, отступы конские. Этот код можешь пропустить через phpformatter.com, он исправит.
> if ($rem >= $bills[500])
У тебя жестко закодирован номинал банкнот. Так не пойдет. Надо чтобы номинал брался их массива и можно было его менять, не переделывая код.
> echo "<br>$rem купюр номиналом 5
Хорошая функция ничего не выводит, а только возвращает. Вынеси echo наружу из функции.
Имя функции должно начинаться с глагола, в стиле сделайЧтоТо, например рассчитайСдачу: calculateChange.
Код слишком длинный для такой простой задачи. Сократи его.
http://ideone.com/GkIGX6
Да, я видел что на скрине задачи там решение в пару строчек, но решал в силу имеющихся знаний, видимо их недостаток и привел к такому огромному решению. У меня почему то с кодировкой проблемы на utf-8, уже и в хеддере кодировку указывал, и при сохранении документа, всё равно выводит кракозябры. Это мне после phpformatter'a такой код достался уже. Наверное начну теперь устранять пробелы в знаниях по работе с массивами и функциями и потом уже попытаюсь снова решить задачу более коротким путем.
А что на маленьком поле все с него убегают? http://ideone.com/deqqKK
> public function setSleepIcon()
> {
> $this->previousIcon = $this->icon;
> $this->icon = "@";
> }
Гораздо удобнее не менять значение поля icon и мучаться с его сохранением, а написать в функции getIcon примерно так:
return $this->isSleeping ? '@' : $this->icon;
Хм, точно, нужно будет поменять в условиях цифры на длинну поля.
Не понял вопрос. Ты имеешь в виду, что если открыть новую вкладку и вставить текст, он не подсвечивается? Надо просто сохранить файл с правильным расширением, либо клинкуть на нижний правый угол и выбрать язык.
> уже и в хеддере кодировку указывал, и при сохранении документа
Ты наверно неприавльно что-то указал. У других-то работает.
> Наверное начну теперь устранять пробелы в знаниях по работе с массивами и функциями и потом уже попытаюсь снова решить задачу более коротким путем
Хорошо. Советую сюда постить решения для проверки.
Так и было задумано в задании, что я сам должен был гуглить функции в мануале или спрашивать здесь? или же я что-то упустил т.к в "теории" перед заданием не было упоминания strtr или str_replace, да и вообще не было упоминания этих функций.
Хм, вообещ в учебнике, про str_replace есть, хотя я не помню где.
Гуглить - да. Тебе в любом случае прийдется гуглить, начинай привыкать.
http://ideone.com/Xq2yIL
Прошу критики.
<?php
$to = "email@adress.com";
$subject = "Посылка с контактной формы";
if(isset($_POST["submit"]))
{
if(!preg_match("/^(?:[a-z0-9]+(?:[-_.]?[a-z0-9]+)?@[a-z0-9_.-]
+(?:.?[a-z0-9]+)?.[a-z]{2,5})$/i",trim($_POST["email"])))
{
$message = "<div id="message" class="error">
Указанный email не соответствует формату!</div>";
}
else
{
$message = "<div id="message" class="success">
Форма успешно отправленна!</div>";
}
}
?>
Вот html:
<form class="contact" method="post" action="">
<div>
<span class="label">Ваше имя:</span>
<input class="input" name="name" type="text" required>
</div>
<div>
<span class="label">Тема:</span>
<input class="input" name="theme" type="text" required>
</div>
<div>
<span class="label">Ваш email:</span>
<input class="input" name="email" type="text" required>
</div>
<div>
<span class="label">Сообщение:</span>
<textarea class="input" name="comment" required></textarea>
</div>
<div>
<span class="label"></span>
<input class="btn" name="submit" type="submit" value="Отправить">
<?=$message?>
</div>
</form>
И еще немного css, но это здесь не нужно.
Сначала он в любом случае выдавал ошибку, я изменил preg_match на /^([\w-]+(?:\.[\w-]+))@((?:[\w-]+\.)\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i, также там нужно поправить кавычки (везде используются двойные, нужно кое-где заменить одинарными, это максимум очевидно).
После этого он выдает сообщение об успешной отправке, но никакого письма на нужный адрес не приходит.
<?php
$to = "email@adress.com";
$subject = "Посылка с контактной формы";
if(isset($_POST["submit"]))
{
if(!preg_match("/^(?:[a-z0-9]+(?:[-_.]?[a-z0-9]+)?@[a-z0-9_.-]
+(?:.?[a-z0-9]+)?.[a-z]{2,5})$/i",trim($_POST["email"])))
{
$message = "<div id="message" class="error">
Указанный email не соответствует формату!</div>";
}
else
{
$message = "<div id="message" class="success">
Форма успешно отправленна!</div>";
}
}
?>
Вот html:
<form class="contact" method="post" action="">
<div>
<span class="label">Ваше имя:</span>
<input class="input" name="name" type="text" required>
</div>
<div>
<span class="label">Тема:</span>
<input class="input" name="theme" type="text" required>
</div>
<div>
<span class="label">Ваш email:</span>
<input class="input" name="email" type="text" required>
</div>
<div>
<span class="label">Сообщение:</span>
<textarea class="input" name="comment" required></textarea>
</div>
<div>
<span class="label"></span>
<input class="btn" name="submit" type="submit" value="Отправить">
<?=$message?>
</div>
</form>
И еще немного css, но это здесь не нужно.
Сначала он в любом случае выдавал ошибку, я изменил preg_match на /^([\w-]+(?:\.[\w-]+))@((?:[\w-]+\.)\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i, также там нужно поправить кавычки (везде используются двойные, нужно кое-где заменить одинарными, это максимум очевидно).
После этого он выдает сообщение об успешной отправке, но никакого письма на нужный адрес не приходит.
Мда, чем дальше я иду по учебнику тем будто бы тону в зыбучем песке и всё чаще и чаще просто впадаю в состояние ступора и не знаю что делать. Вот в чём здесь проблема? вот допустим я погуглил функцию strtr и я не могу банально понять, где здесь хотябы пример, как она пишеться
http://php.net/manual/ru/function.strtr.php
т.е нужно ли так
$anal = strtr($anal);
или так
strtr($anal);
У меня у одного такая проблема во время обучения по учебнику опа? т.к я реально чувствую себя дауном.
В документации действительно некоторые вещи сухо написаны и трудны для понимания (по крайней мере для меня).
narod.ru
У меня на винде стоит сборка с easyphp
А на VB Убунта + Apache + Php + MySQL
Если что могу подсказать.
Я апач ставил. На phpmyadmin.ru есть гайд для нубов.
Тоже было тяжко по мануалу, но потом помню перестал читать простыню а начал искать именно нужную инфу, и стало значительно проще и понятнее. Например порядок просмотра substr. Сверлишь взглядом какие типы данных принимаются как аргументы и что возвращается.
string substr ( string $string , int $start [, int $length ] )
Здесь 2 обязательных параметра: строковый $string и целочисленный $start. Еще есть необязательный, потому что в квадратных скобках - целочисленный $length. Возвращается строка.
Дальше скролишь в "Возвращаемым значениям" и смотришь что написано там. Теперь есть представление что нужно скормить и что получишь на выходе. Например результат/false (в нашем случае строка или логическое false), true/false.
Если и в этом плаваешь, то посмотри типы данных: string, int, double, boolean, array, null - это все типы данных, которые нужно различать.
Если какой-то параметр не знаком идешь в "список параметров". Там описывается поведение. Прежде чем кидаться к примерам постарайся представить умозрительно, что может получится из того что ты прочитал. Подходит ли функция к поставленной задаче. Если нет - скроль вниз, там обязательно будут максимально похожие функции.
Если поведение функции не понятно, то попробуй поставить несколько экспериментов с ней в песочнице. То есть не лепи ее прямо в код который пишешь - ты же еще не понимаешь как она работает и запутаешься еще больше.
Примерчики с мануале кстати кажутся не столько сухими сколько непонятными, так как они рассчитаны на то, что хорошо знаешь конструкцию языка, а ты ее не знаешь, так как мануал опа, не в обиду будет сказано, этому почти не учит.
Вот примерно так я и дрочил, пока не нарисовались закономерности в поведении, порядке аргументов и возвращаемых значениях. Ну удачи.
Вот ты пишешь ему гайды полотном, а он давно забил и ушел. Ибо я ему через 30 секунд после его поста ответил, а он даже самую нубскую банальщину не исправил.
В общем, алгоритм такой: ботнет стучится на бэкенд, получает два айди, собирает информацию, следуя этим айди, и пушит её обратно на бэкенд. Информации немало, json с 1500 обджектами. Пока не знаю что там с нагрузкой будет при разборе json на сервере.
Но вопрос сейчас в другом. Как сделать так, чтобы полученные ботом айди ставились в очередь на сервере, и не отдавались другим ботам, а потом, если данные получены, помечались пропарсенными. Потому что бывают всякие обрывы, отключения, и часть информации может остаться не пропарсенной, если просто удалять айди, без проверки на парсинг. Ну и если информация не была пропарсена, отдавать эти айди другому боту.
Может спать человек пошел или решил отдохнуть и завтра с ясным мышлением все решить.
<?php надо ставить в начале, а так у тебя это не код а просто ничего не значащий текст который PHP не интерпретирует, а выведет как есть.
>>408993
> что я сам должен был гуглить функции в мануале или спрашивать здесь?
Как хочешь, можешь справшивать, можешь гуглить. Вообще, если ты откроешь начало урока, то на первой картинке есть str_replace и strtr.
>>409005
Ну если непонятно, пиши в тред и продолжай решать задачу. рано или поздно кто-нибудь подскажет.
Насчет strtr, открой начало урока, там она есть в примере «можно сделать продвинутую замену...»
>>409010
Там не проходит скобки + точка с запятой
( );
Чтобы написать их, ставь внутри скобок звездочка — пробел — звездочка или что-нибудь еще, например, слово.
<?php надо ставить в начале, а так у тебя это не код а просто ничего не значащий текст который PHP не интерпретирует, а выведет как есть.
>>408993
> что я сам должен был гуглить функции в мануале или спрашивать здесь?
Как хочешь, можешь справшивать, можешь гуглить. Вообще, если ты откроешь начало урока, то на первой картинке есть str_replace и strtr.
>>409005
Ну если непонятно, пиши в тред и продолжай решать задачу. рано или поздно кто-нибудь подскажет.
Насчет strtr, открой начало урока, там она есть в примере «можно сделать продвинутую замену...»
>>409010
Там не проходит скобки + точка с запятой
( );
Чтобы написать их, ставь внутри скобок звездочка — пробел — звездочка или что-нибудь еще, например, слово.
Ты не написал этот код сам, а скопировал, не понимая что он делает (или я не прав?). Попробуй почитать его построчно и найти команду отправки письма.
>>409005
Привыкай. В этот мануал тебе придется заглядывать не раз, и мануал PHP один из лучших и подробных в сравнении с другими языками. Я уж молчу что для других языков все обычно только на английском доступно.
Примеры в мануале есть: http://php.net/manual/ru/function.strtr.php#refsect1-function.strtr-examples
Хотя согласен, что они запутанные какие-то.
Пиши в тред тогда, здесь простыми словами обяъснят.
Функции strtr ты передаешь строку и массив с заменами (ключ хранит что заменить, а значение — на что). Она возвращает измененную строку, которую надо куда-то сохранить:
$s = strtr($string, $replace);
mb_encoding -> mb_internal_encoding
>>409021
Вообще, можно себе поставить Апач + БД под Windows если скрипт работает под этой ОС.
А почему не смог дебиан настроить? У меня все работает.
>>409045
> так как мануал опа, не в обиду будет сказано, этому почти не учит.
Да, верно, я не рассказываю даже про тип boolean, так как хочу побыстрее научить что-то делать, а если я буду слишком много давать теории, то меньше будет желающих изучать.
>>409055
> Ботнет (англ. botnet, МФА: [ˈbɒtnɛt]; произошло от слов robot и network) — это компьютерная сеть, состоящая из некоторого количества хостов, с запущенными ботами — автономным программным обеспечением. Чаще всего бот в составе ботнета является программой, скрытно устанавливаемой на устройство жертвы и позволяющей злоумышленнику выполнять некие действия с использованием ресурсов заражённого компьютера. Обычно используются для нелегальной или неодобряемой деятельности — рассылки спама, перебора паролей на удалённой системе, атак на отказ в обслуживании.
В этом треде не обсуждаются способы разработки вредоносных программ.
Пока никто не реагирует я начал заготовку калькулятора с действиями, завтра точно добавлю степень, и может быть смогу впилить скобки в это дело.
А пока у меня почему-то затуп с последним действием когда остается 2-3 элемента сложить \ вычесть.
http://ideone.com/ZH1SNk
Всем спокойной ночи.
> if (!preg_match($tester, mb_substr($input, $i, 1))) {
Вместо того, чтобы проверять посимвольно, можно проверить регулркой всю строку сразу (либо проверить что строка содержит только разрешенные символы либо проверить что не содержит запрещенные, в этом случае можно даже вывести какой именно символ не годится).
Ну и твой калькулятор, по моему, не проверяет ошибки вроде случаев когда идет несколько знаков подряд: http://ideone.com/REK7a8
Хорошо бы обнаруживать такое.
То же самое, когда идет 2 числа подряд, разделенных пробелом вроде 2 2 + 2
А так, в остальном, хорошо.
Какой твой уровень знания ПХП? Какие задачи решал? Что спрашивали на собеседовании?
Уровень - средний, тестовое задание дали простенькое - написать сервис с аутентификацией через fb и постингом сообщений в общую ленту. На собеседовании в основном по тестовому заданию вопросы задавали, ну спросили еще про dependency injection.
> Надо как минимум две таблицы создавать в базе данных, одна со всеми сообщением (именем, эмейлом, и другими параметрами) а вторая с именем и ай-ди каждого пользователя?
Наверно. Для каждой сущности должна быть своя таблица.
> И как в этом случае передать по ссылке через GET id конкретного пользователя?
Не понял вопрос. Чем не годится вариант вроде index.php?id=123456 ?
>>409074
Почитай про правильные способы решения. Есть 2 варианта:
— преобразуем выражение в пользскую нотацию с помощью алгоритма Дейкстры и затем вычисление результата.
https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D1%8C%D1%81%D0%BA%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C
http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D1%81%D1%82%D0%B0%D0%BD%D1%86%D0%B8%D0%B8
http://habrahabr.ru/post/100869/
— более сложный, но более мощный парсим выражение, создаем дерево и вычисляем. такой алгоритм позволит потом добавить например функции вроде sin, cos.
Эта тема называется синтаксический анализ и может быть непроста для начинающего. Может потребоваться знание ООП.
https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7
http://habrahabr.ru/post/122397/
http://lord-n.narod.ru/download/books/walla/programming/Spr_po_C/24/24.htm
> Надо как минимум две таблицы создавать в базе данных, одна со всеми сообщением (именем, эмейлом, и другими параметрами) а вторая с именем и ай-ди каждого пользователя?
Наверно. Для каждой сущности должна быть своя таблица.
> И как в этом случае передать по ссылке через GET id конкретного пользователя?
Не понял вопрос. Чем не годится вариант вроде index.php?id=123456 ?
>>409074
Почитай про правильные способы решения. Есть 2 варианта:
— преобразуем выражение в пользскую нотацию с помощью алгоритма Дейкстры и затем вычисление результата.
https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D1%8C%D1%81%D0%BA%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C
http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D1%81%D1%82%D0%B0%D0%BD%D1%86%D0%B8%D0%B8
http://habrahabr.ru/post/100869/
— более сложный, но более мощный парсим выражение, создаем дерево и вычисляем. такой алгоритм позволит потом добавить например функции вроде sin, cos.
Эта тема называется синтаксический анализ и может быть непроста для начинающего. Может потребоваться знание ООП.
https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7
http://habrahabr.ru/post/122397/
http://lord-n.narod.ru/download/books/walla/programming/Spr_po_C/24/24.htm
>Не понял вопрос. Чем не годится вариант вроде index.php?id=123456
Да, спасибо, я уже вспомнил, пересмотрел код по блогу который пробовал писать, постоянно забываю сам механизм как это делать с выводом из базы данных потом.
попробовал добавить поиск по sphinx (как работает который, видимо, еще читать и читать). +попробовал там же исключения.
Я по коду посмотрел, вроде получше того же битрикса, но не симфони конечно
Хочу просто сайт себе заделать именно для дела, а не для пердоликов, поэтому решил может лучше cms взять, а не пердолить все с нуля на симфони
Сайт контентный в основном
Так, а чтобы работали rt индексы я должен помимо вставки информации о файле в базу данных вставлять их еще и в этот самый индекс?
Заметь, кстати, что в конфиге сфинкса надо указывать абсолютные пути и это неудобно, так как на разных ОС и у разных людей они будут разные. Сам автор сфинкса в ответ на это советует генерировать конфиг как-то с подстановкой данных.
https://github.com/sqghub/uppu.ru/tree/master/model/api
Сторонние библиотеки лучше ставить в отдельную папку, а не перемешивать с кодом. Вот например тут если поискать
https://packagist.org/search/?q=sphinx%20api
есть вариант с установкой через composer (раз ты его используешь то это удобно).
Ну или второй вариант, сделать папку 3rdParty и положить туда.
Еще мне кажется, неправильно наследоваться от SphinxApi. Ты ведь делаешь не расширенную версию АПИ, а просто его используешь. Твой класс находится уровнем выше чем АПИ. Раз так, то надо применить делегирование, то есть передачу объекта API через конструктор (либо создание в конструкторе).
> if (file_exists("config.local.php")) {
> include ("config.local.php");
Это должно быть в index.php. Пройдись по всему коду и вынеси это из моделей.
> date_default_timezone_set('Europe/Moscow');
Это не должно быть в шаблоне. По идее, ты должен это в php.ini настроить.
Ну и думаю, надо настроить еще обновление индексов при загрузке нового файла.
> https://github.com/sqghub/uppu.ru/blob/master/model/FileMapper.php#L35
Тут слишком много ловишь. Сделай свой класс исключений (или используй return что наверно проще). Ну и пользователю незачем видеть технические подробности ошибки.
Более того, ты перехватываешь исключение и оно не пишется в логи. Ты никогда не узнаешь, что у тебя например были проблемы с загрузкой файлов. Ошибки надо писать в стандартный лог ошибок с помощью error_log( )
То есть это явно неправильный код.
Если что-то непонятно по сфинксу, можешь задвать вопросы.
Заметь, кстати, что в конфиге сфинкса надо указывать абсолютные пути и это неудобно, так как на разных ОС и у разных людей они будут разные. Сам автор сфинкса в ответ на это советует генерировать конфиг как-то с подстановкой данных.
https://github.com/sqghub/uppu.ru/tree/master/model/api
Сторонние библиотеки лучше ставить в отдельную папку, а не перемешивать с кодом. Вот например тут если поискать
https://packagist.org/search/?q=sphinx%20api
есть вариант с установкой через composer (раз ты его используешь то это удобно).
Ну или второй вариант, сделать папку 3rdParty и положить туда.
Еще мне кажется, неправильно наследоваться от SphinxApi. Ты ведь делаешь не расширенную версию АПИ, а просто его используешь. Твой класс находится уровнем выше чем АПИ. Раз так, то надо применить делегирование, то есть передачу объекта API через конструктор (либо создание в конструкторе).
> if (file_exists("config.local.php")) {
> include ("config.local.php");
Это должно быть в index.php. Пройдись по всему коду и вынеси это из моделей.
> date_default_timezone_set('Europe/Moscow');
Это не должно быть в шаблоне. По идее, ты должен это в php.ini настроить.
Ну и думаю, надо настроить еще обновление индексов при загрузке нового файла.
> https://github.com/sqghub/uppu.ru/blob/master/model/FileMapper.php#L35
Тут слишком много ловишь. Сделай свой класс исключений (или используй return что наверно проще). Ну и пользователю незачем видеть технические подробности ошибки.
Более того, ты перехватываешь исключение и оно не пишется в логи. Ты никогда не узнаешь, что у тебя например были проблемы с загрузкой файлов. Ошибки надо писать в стандартный лог ошибок с помощью error_log( )
То есть это явно неправильный код.
Если что-то непонятно по сфинксу, можешь задвать вопросы.
>Тут слишком много ловишь.
Я там пытаюсь ловить ошибки и транзакции, и сохранения файла. Если правильно помню.
>Если что-то непонятно по сфинксу, можешь задвать вопросы.
Рт индексы. Совсем непонятно.
>есть вариант с установкой через composer (раз ты его используешь то это удобно).
Я не думал, что на композере еще и api выкладывают. Так то да, конечно им поставлю.
Сфинкс не умеет с помощью магии автоматически видеть изменения в базе. Ему надо их передать.
У сфинкса есть 2 типа индексов: обычные и реалтаймовые.
Обычные индексы нельзя обновлять вообще. Их можно только уничтожить и заново воссоздать на основе содержимого базы (сфинкс умеет делать это не прерывая работу). То есть ты запускаешь руками (или если речь о сайте. добавляешь в крон) команду обновления индекса и она его таким образом пересозадет целиком (после чего шлет сигнал поисковому демону начать использовать новые файлы). Например, это можно делать ночью раз в сутки или раз в час. Чаще нельзя так как там может быть дофига данных.
Но зато они хорошо хранят огромные массивы информации.
Реалтайм индексы не умеют сами себя обновлять вообще никак. Это что-то вроде таблицы, в которую надо руками добавлять, обновлять или удалять записи.
Соответственно для актуального поиска используют такую схему: обычный индекс хранит большую часть данных, а та часть, которая еще не успела в него попасть, хранится в rt индексах.
Поиск ведется по обоим индексам сразу.
> Before you read further, you should at least have a basic knowledge of the Symfony Framework
Выучи симфони и не парься. Симфони это реально крутая вещь.
да. Причем по моему, обновлять данные в rt индексах можно только через SQL. А он в сфинксе с причудами.
rt индекс это что-то вроде обычной SQL таблицы, в котрую можно вставлять/обновлять/удалять данные SQL-запросами INSERT/UPDATE/DELETE
(я напомню что у сфинкса кроме обычного АПИ, есть совместимый с MySQL АПИ к которому можно подключиться через PDO и отправлять запросы. Правда, он может глючить).
Вроде бы в моем уроке есть пример запроса для вставки в rt-индекс: https://gist.github.com/codedokode/10539366
Список колонок этой таблицы задается в конфиге. Вот пример:
index some_rt_index
{
type = rt # тип индекса = realtime
path = /usr/local/sphinx/data/rt # файл для хранения данных
rt_field = title # дополнительное строчное поле
rt_field = content # дополнительное строчное поле
rt_attr_uint = gid # дополнительное числовое поле
}
В данном индексе получается 4 колонки: id (он есть всегда), title, content, gid. При этом поиск идет очевидно только по текстовым полям.
К такому инедксу можно отправлять запросы:
INSERT INTO some_rt_index (id, title, content, gid) VALUES (....)
UPDATE some_rt_index SET ... WHERE ...
DELETE FROM some_rt_index WHERE ...
Поиск в rt индексе работает точно так же как и в обычном.
Мануал, увы, на английском: http://sphinxsearch.com/docs/current.html#rt-indexes
rt индекс это что-то вроде обычной SQL таблицы, в котрую можно вставлять/обновлять/удалять данные SQL-запросами INSERT/UPDATE/DELETE
(я напомню что у сфинкса кроме обычного АПИ, есть совместимый с MySQL АПИ к которому можно подключиться через PDO и отправлять запросы. Правда, он может глючить).
Вроде бы в моем уроке есть пример запроса для вставки в rt-индекс: https://gist.github.com/codedokode/10539366
Список колонок этой таблицы задается в конфиге. Вот пример:
index some_rt_index
{
type = rt # тип индекса = realtime
path = /usr/local/sphinx/data/rt # файл для хранения данных
rt_field = title # дополнительное строчное поле
rt_field = content # дополнительное строчное поле
rt_attr_uint = gid # дополнительное числовое поле
}
В данном индексе получается 4 колонки: id (он есть всегда), title, content, gid. При этом поиск идет очевидно только по текстовым полям.
К такому инедксу можно отправлять запросы:
INSERT INTO some_rt_index (id, title, content, gid) VALUES (....)
UPDATE some_rt_index SET ... WHERE ...
DELETE FROM some_rt_index WHERE ...
Поиск в rt индексе работает точно так же как и в обычном.
Мануал, увы, на английском: http://sphinxsearch.com/docs/current.html#rt-indexes
Ну и естественно, лучше всего сделать для rt индекса такой же набор полей как и для основного. Тогда можно делать поиск сразу по 2 индексам и не мучаться с разобром результатов.
>Вроде бы в моем уроке есть пример запроса для вставки в rt-индекс
А апи такой возможности не предоставляет?
Можно сделать 2 блока catch для 2 разных классов. А зачем ловить оибки выполнения транзакции? Это же значит что код неправильный и пользователь ничего сделать не может.
>>409102
Обычный АПИ только для поиска. SphinxQL позволяет и искать, и обновлять данные, но может быть глючным при работе с PDO.
>Ну и думаю, надо настроить еще обновление индексов при загрузке нового файла.
Сделал. https://github.com/sqghub/uppu.ru
Наверное из за битых образов. Где-то на установке mysql у меня циклиться какая-то хрень.
Попробую еще. На win я попробовал на скорую руку wamp поставить. Не работает.
https://github.com/sqghub/uppu.ru/blob/master/model/Searcher.php#L37
> date('Y-m-d H:i:s')
Это нехорошо. В одну таблицу дата вставляется на сервере MySQL, в другую генерируется на стороне PHP. Мы получим расхождения. Я думаю, надо дату генерировать, записывать в File и брать оттуда. Внутри File конечно дату удобнее хранить числом иил объектом DateTime, а не строкой.
>В одну таблицу дата вставляется на сервере MySQL, в другую генерируется на стороне PHP.
Да, я заметил. Просто брать дату с последней вставленной записи так же как id не вышло и я сразу сделал это. Так-то да, я переделаю на генерирование даты на стороне php и filemapper тоже.
Охуительный курс. Мозги хорошо размял. Лампово поебался с консолечкой. Реальная история, не тролль.
Пытаюсь её делать, как удалить пробелы вроде разобрался и теперь мой спасательный круг для пробела выглядит так
$text = str_replace(" ","", $text); - это верно?
+
Я пытаюсь сделать, чтобы "сравнивать по букве с двух-концов" я не додумался до этого, поэтом придумал сравнить сразу все буквы с конца и с начала. Но как обычно потерпел сокрушительное поражение в виде нихуя не происходящего. С какой-то непонятной ошибкой.
http://ideone.com/pbG7Ja
Ошибка появилась, когда дописал else, хотя до это всё равно нихуя ничего не работало.
> В этом треде не обсуждаются способы разработки вредоносных программ.
Ну представь, что это не ботнет. Я тут упомянул ботнет, чтобы было понятно зачем мне это нужно. Я же не спрашиваю тут как шеллы заливать.
Если абстрагироваться, то мне нужно что-то вроде менеджера задач на php, что-то вроде очереди задач. Подскажешь что-нибудь?
>выкаживание бабла
Бисплатна. Вот пост на хабре: http://habrahabr.ru/company/spbau/blog/243473/
>спам итт
Я на радостях написал. Видел, сколько я сделал :-)
>Сайт контентный в основном
Я бы порекомендовал использовать: https://wordpress.org/plugins/staticpress/
тем что у него код пиздецовый и расширения/допиливания потребуют разбирательства как он работает, а мне это не надо
идеально было бы найти cms на основе mvc фреймворка
>mvc фреймворка
Ты это я, только пару лет назад. ОП помнит, как ему грил, что буду осиливать modx. Я осилил и разорвался.
Твой пример какой-то демотивирующий, лол.
С три месяца изучаю(не только пхп, конечно, всю петушиную веб-обойму), но что такое депенденси инжекшон узнал только сейчас, загуглив(((
Ты раньше кодил на других языках?
Ты прав. Но теперь я и разбираюсь что он делает. Из принципа.
Сейчас погуглю команду отправки письма.
Есть чистая форма на html
и скрипт http://ideone.com/b4ahyi, который должен брать данные и херачить их в таблицу. Проблема одна, форма бросает к скрипту, а он же ничего не делает.
<?php
error_reporting(-1);
$sum = 10000;
$percent = 10;
$year = 0
for ($sum; $sum <= 1000000; $sum = $sum (1 + $percent 0.01)) {
\t
\t$year++;
echo "Лет прошло:$year\n
Накоплено:$sum\n";
}
?>
Так точнее:
<?php
error_reporting(-1);
$sum = 10000;
$percent = 10;
$year = 0
for ($sum; $sum <= 1000000; $sum = $sum (1 + $percent 0.01)) {
$year++;
echo "Лет прошло:$year\n
Накоплено:$sum\n";
}
?>
>>409172
; после $year, выкладывать на ideone нужно.
for ($sum = 10000; ... лучше писать)
Что значит $sum = $sum (1 + $percent 0.01))?
[code]
<?php
error_reporting(-1);
$sum = 10000;
$percent = 10;
$year = 0;
for ($sum; $sum <= 1000000; $sum = $sum (1 + $percent 0.01)) {
$year++;
echo "Лет прошло:$year\n
Накоплено:$sum\n";
}
?>
[/code]
>PHP Parse error: syntax error, unexpected 'else'
Ну вот смотри бро, у тебя там есть описание ошибки. Что тут написано? Написано что неожиданный else, то есть его не ждали пока, а что значит ждали?
Есть правильный способ описать условие
if (условия) {
действия если условие верно...
} else {
действия если неверно...
}
Если у тебя else раньше времени говорят залез, то чего может нехватать там?
Глупый парсер всё съел. Вот ссылка на ideone:
http://ideone.com/5tC3Tm
Ты проебался с ";" после "$year = 0"
И вот в этом выражении "$sum = $sum (1 + $percent 0.01))" нельзя опускать знаки умножения, пхп без них не понимает. Тут парсер звездочки режет, на ideone я исправил
> $STH = $DHB->prepare("INSERT into students (firstName, lastName, sex, section, email, year, exams, isLocal) values (?, ?, ?, ?, ?, ?, ?, ?)");
> values (?, ?, ?, ?, ?, ?, ?, ?)
Сюда надо данные подставлять. Почитай про INSERT:
https://ru.wikipedia.org/wiki/Insert_%28SQL%29
Я пытаюсь с безимянным placeholder-ами работать. Если подставлять $name и т.п., то это прямой путь к sql-inj
Не понял тебя. Как ты собираешься передавать данные, не передавая данные?
Пока единственная ошибка, которую я вижу, может быть связана с массивом $students
В него точно попадают данные?
Установилось, с базой всё хорошо.
Попробуй такой код выполнить, занесется что-то в базу, или нет:
http://ideone.com/B40RGE
мы сегодня проходили в школе умножение и я смог решить задачку про айпад
https://ideone.com/ElZv2N
Я еще думаю, пришла пора привести в порядок работу с медиаданными: https://github.com/sqghub/uppu.ru/blob/master/model/MediaDataMapper.php и их вывод на страничке download.
Мне кажется, один из вариантов — это сделать объект, который хранит информацию о файле и засунуть внутрь File, чтобы можно было например сделать
$file->getMediaData()->isImage()
Соответственно, этот объект можно создать как на основе сохраненных ранее данных, так и путем анализа файла.
Ну и конечно, можно это как-то по-другому реализовать, если у тебя есть идеи.
А что насчет установки, если ты например под Windows или Mac? Какие варианты там предлагаются?
Так, Линукс конечно стоит изучить.
>>409150
> теперь мой спасательный круг для пробела выглядит так
Верно
Насчет ошибки, возьми листочек и посчитай число открывающих и закрывающих скобок разных видов. Оно должно быть одинаковым. То есть каждой открывающей скобке должна соответствовать закрывающая.
Кстати, если правильно выравнивать код, ошибка будет сразу видна.
>>409151
Нет. Мне неприятны люди, которые замусоривают интернет и распространяют всякую дрянь.
Более, того, ты или твой заказчик занимается нищебродством, если вместо того, чтобы купить или арендовать нужное оборудование пытается выполнять свои задачи на зараженных компьютерах. Из этого все равно ничего не получится.
Код там не идеальный, но он простой. Разбираться придется в любом случае. Хотя конечно с фреймворками работать приятнее, это да.
>>409168
У него вполне возможно был уже опыт программирования на других языках.
>>409177
> catch (PDOExpenition $e) {
>
>}
Этот код говорит о том, что любые ошибки при работе с базой надо ловить и молча игнорировать не выводя никаких сообщений (кстати ты неприавльно написал PDOException). Я подозреваю, ты сделал это по незнанию, так как я не представляю, как можно такое написать и какая выгода от того что ты не знаешь причину ошибки.
Удали try/catch, и больше так не пиши, и прочитай мой урок про исключения (он может быть не очень понятно написан, если что вопросы задавай): https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
Далее, режим вывода ошибок может быть отключен в самом PDO. Добавь строчку
$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
сразу после соединения, чтобы все ошибки от базы выбрасывались в виде исключений и мы могли их видеть.
Чтобы проверить, что это работает, попробуй выполнить заведомо неправильный запрос вроде SELELELELECT 1; и посмотреть, выведется что-нибудь или нет.
Если ты все это сделал, но ошибки не отображаются, может быть у тебя отключен их вывод.
В PHP по умолчанию выключено отображение ошибок в браузере, так как обычному пользователю сайта эта информация ни к чему. Но тебе, как программисту, надо видеть эти ошибки. Вот, как можно их просмотреть:
- ошибки сохраняются в лог ошибок. Можно открыть его и почитать. Если ты запускаешь код на локалхосте, у себя, то лог хранится в папке Апача (обычно она называется logs) и имеет название вроде error.log (в линуксе в папку /var/log/apache2 ). Если на хостинге — там либо есть файл error.log либо раздел в панели управления, где лог можно посмотреть
- также, ты можешь включить отображение ошибок. Открой файл php.ini, поставь там display_errors = On и error_reporting = E_ALL и перезапусти сервер. Теперь ошибки должны выводиться на экран.
Проверить, работает ли вывод ошибок, можно запустив скрипт содержающий обращение к несуществующей переменной вроде echo $sdgasdad; и проверив, выведется ошибка или нет. Если все верно, то должна вывестись.
Код там не идеальный, но он простой. Разбираться придется в любом случае. Хотя конечно с фреймворками работать приятнее, это да.
>>409168
У него вполне возможно был уже опыт программирования на других языках.
>>409177
> catch (PDOExpenition $e) {
>
>}
Этот код говорит о том, что любые ошибки при работе с базой надо ловить и молча игнорировать не выводя никаких сообщений (кстати ты неприавльно написал PDOException). Я подозреваю, ты сделал это по незнанию, так как я не представляю, как можно такое написать и какая выгода от того что ты не знаешь причину ошибки.
Удали try/catch, и больше так не пиши, и прочитай мой урок про исключения (он может быть не очень понятно написан, если что вопросы задавай): https://gist.github.com/codedokode/65d43ca5ac95c762bc1a
Далее, режим вывода ошибок может быть отключен в самом PDO. Добавь строчку
$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
сразу после соединения, чтобы все ошибки от базы выбрасывались в виде исключений и мы могли их видеть.
Чтобы проверить, что это работает, попробуй выполнить заведомо неправильный запрос вроде SELELELELECT 1; и посмотреть, выведется что-нибудь или нет.
Если ты все это сделал, но ошибки не отображаются, может быть у тебя отключен их вывод.
В PHP по умолчанию выключено отображение ошибок в браузере, так как обычному пользователю сайта эта информация ни к чему. Но тебе, как программисту, надо видеть эти ошибки. Вот, как можно их просмотреть:
- ошибки сохраняются в лог ошибок. Можно открыть его и почитать. Если ты запускаешь код на локалхосте, у себя, то лог хранится в папке Апача (обычно она называется logs) и имеет название вроде error.log (в линуксе в папку /var/log/apache2 ). Если на хостинге — там либо есть файл error.log либо раздел в панели управления, где лог можно посмотреть
- также, ты можешь включить отображение ошибок. Открой файл php.ini, поставь там display_errors = On и error_reporting = E_ALL и перезапусти сервер. Теперь ошибки должны выводиться на экран.
Проверить, работает ли вывод ошибок, можно запустив скрипт содержающий обращение к несуществующей переменной вроде echo $sdgasdad; и проверив, выведется ошибка или нет. Если все верно, то должна вывестись.
При исплоьзовании ERRMODE_EXCEPTION проверять, удался ли запрос, через if:
\tif ($STH->execute()) {...
не требуется. Надо просто писать
$STH->execute( );
и если произойдет ошибка, то он просто выбросит исключение и завершится. Это гораздо удобнее.
Чтобы проверить что соединение с БД работает, можно сделать запрос типа
SELECT 2 + 2
или
SELECT CURTIME()
и посмотреть, вернет ли он данные.
> Нет. Мне неприятны люди, которые замусоривают интернет и распространяют всякую дрянь.
>Более, того, ты или твой заказчик занимается нищебродством, если вместо того, чтобы купить или арендовать нужное оборудование пытается выполнять свои задачи на зараженных компьютерах. Из этого все равно ничего не получится.
Я не делаю ничего злостного, не спамлю, не распространяю вирусы. Единственное, что я делаю плохого - использую компьютеры пользователей без их ведома, но это я делаю от безысходности.
Мне просто нужны вычислительные мощности и разные ip для сбора данных, и у меня нет никакого заказчика. Купить/арендовать столько оборудования просто невозможно, и нецелесообразно для моих целей. Я ведь всего лишь аматер-статистик.
Сега прилипла
Нет, я просто еще не добавлял ничего в catch. Я хочу потом дописать и выводить юзеру информацию по поводу ошибки.
А по поводу почему совсем не работает запись в БД не знаешь?
По поводу этого. Это не совсем ошибка. Мне надо чекать email на уникалость и если $STH->execute() вовзращает True, то выдаем ошибку об неуникальности email-а. Тогда ведь нужны if ($STH->execute())
1) Переменные: http://ideone.com/l77Sqf
2) Бросок кубиков: http://ideone.com/Ztrzss
3) Айфон в кредит: http://ideone.com/DZiCBU
4) В каком возрасте будет миллион: http://ideone.com/qM2EnS
5) Задача про средний бал: http://ideone.com/sTFBQX
6) Задача на рост: http://ideone.com/Ag5TLJ
7) Задача про ответ на любой вопрос: не понял, где там задание?
8) Задача про имена кошек: опять не понял, ты же уже написал готовое решение?
9)Задания на шифровку/расшифровку: http://ideone.com/yXAEUn
10)Задание на набор слов: http://ideone.com/rOlpRL
Ты можешь сделать проект с добровольным участием. Если это можно сделать на веб-технологиях, чтобы достаточно было зайти браузером на страницу чтобы поучаствовать, и была бы полезная цель я думаю, желающие найдутся. Если нет то значит это не нужно.
Это нужно мне, и только мне. Ты бы перешел по какой-то ссылке, если бы тебе это было не нужно?
Вообще, особого смысла изучать CMS не на фреймворках, мне кажется, нет. Перспективнее изучать большие фреймворки типа Симфони 2. Так как если ты например захочешь потом перейти на Питон/Руби/Ява, там тоже фреймворки и ты увидишь много знакомых вещей. Ну и люди все же потихоньку перекатываются на использование ООП/паттернов и уходят от адского процедурного кода и странных велосипедов, на которых пишутся CMS.
>>409336
Покажи текст ошибки, если она есть. Команда либо успешно выполнится либо выведет ошибку. Третьего не дано. Для этого я и написал тебе большую инструкцию, как включить отображение ошибок.
>>409184
Код лучше постить на ideone, а сюда только ссылку.
>>409198
У тебя при достижении миллиона цикл завершается и последнее сообщение не выводится. Нехорошо.
>>409205
Нет, лучше ты почитай про плейсхолдеры и PDO: http://habrahabr.ru/post/137664/
Плейсхолдеры — это правильный способ вставки данных в запросы. В других языках используют именно их, и только в PHP раньше в старых учебниках были неправильные примеры с вставкой переменных прямо в запрос, так как их авторы были не очень грамотные. Это привело к большому числу ошибок и уязвимостей в php-проектах.
Про плейсхолдеры так же написано на phptherightway: http://getjump.github.io/ru-php-the-right-way/#Базы_данных
(всем рекомедую этот сайт)
Посмотри код, данные передаются через массив.
>>409216
Нет, ты пишешь ерунду. Так делали только на PHP лет 10 назад, и все нормальные фреймворки вроде Сифмони ии Зенд содержат поддержку плейсхолдеров.
>>409219
Все он вставляет.
>>409239
Если объект создался то установилось. Иначе бы вылетело исключение при попытке сделать new PDO.
>>409288
Молодец, теперь еще выучи английский и исправь слова типа
> vicheslit
Нет, не так. execute возвращает false (или выкинет исключение, что удобнее) если ты например написал неправильный запрос и база отказывается его выполнять. Если запрос правильный, он вернет true независимо есть email в базе или нет.
Соответственно, тут лучше использовать исключения так как если ты написал неправильный запрос то надо останавливать программму и исправлять его, а не продолжать выплнение.
Также, execute предназначен для выполнения запросов, результаты которых тебе не нужны. Если тебе нужен результат, надо использовать query + fetch/fetchColumn/fetchAll.
Разберись с этими функциями.
Для проверки на уникальность используется запрос
SELECT COUNT() FROM t WHEre email = ?
или
SELECT id FROM t WHERE email = ? LIMIT 1
И проверяется что он вернет.
Изучи все эти упомянутые функции как следует. Также, советую сделать то, что я написал выше, убрать try\catch (ты прочел урок про исключения? зря).
Спасибо. Понятно теперь с этим, но вот в БД все равно не добавляется запись. Что делать?
>Я еще думаю, пришла пора привести в порядок работу с медиаданными:
Я подумывал создать пачку классов, один базовый и по одному на видео/аудио/изображения. Но тогда вся куча обращений к элементам массива в шаблоне заменится на вызов методов получения свойства.
Либо запилить интерфейс для медиадаты, в котором будет метод getData(), который будет генератором, раскручивающимся foreach, а возвращающим массив 'свойство' => 'значение' и просто выводить их в шаблоне. Тогда все эти isSomething() будут ненужны, а в шаблоне будет одно if (file->isMedia()) {вывод всей дряни в foreach}.
Но мне оба варианта кажутся какими-то... громоздкими и неверными. Хотя сейчас склоняюсь ко второму.
Не совсем.
Чтобы получить данные надо использовать execute + одну из функций fetch.
$statement = $pdo->prepare(....); // создаем объект PDOStatement, то есть объект-запрос
$statement->execute(...); // выполняем запрос
$result = $query->fetchAll( ); // получаем данные из базы массивом массивов
var_dump($result);
Альтернатива, по выполненному запросу можно делать foreach:
$statement = $pdo->prepare(....); // создаем объект PDOStatement, то есть объект-запрос
$statement->execute(...); // выполняем запрос
foreach ($statement as $row) {
var_dump($row);
}
Я там выше написал про PDO::query - я ошибся, PDO::query используется если у тебя запрос без плейсхолдеров и ты хочешь одной командой выполнить его и получить результат.
Мануалы:
http://php.net/manual/ru/class.pdo.php
http://php.net/manual/ru/class.pdostatement.php
Не совсем.
Чтобы получить данные надо использовать execute + одну из функций fetch.
$statement = $pdo->prepare(....); // создаем объект PDOStatement, то есть объект-запрос
$statement->execute(...); // выполняем запрос
$result = $query->fetchAll( ); // получаем данные из базы массивом массивов
var_dump($result);
Альтернатива, по выполненному запросу можно делать foreach:
$statement = $pdo->prepare(....); // создаем объект PDOStatement, то есть объект-запрос
$statement->execute(...); // выполняем запрос
foreach ($statement as $row) {
var_dump($row);
}
Я там выше написал про PDO::query - я ошибся, PDO::query используется если у тебя запрос без плейсхолдеров и ты хочешь одной командой выполнить его и получить результат.
Мануалы:
http://php.net/manual/ru/class.pdo.php
http://php.net/manual/ru/class.pdostatement.php
>fb - Facebook
Да, я уже понял. Мне гугл рассказал по запросу php fb.
Так там все просто, вроде. Сколько времени на такое тестовое задание дали?
Интерфейс используется когда есть классы, не наследующиеся от общего предка, но имеющие похожие методы. Если у тебя все медиадаты унаследованы, то тебе не нужен интерфейс.
> Но тогда вся куча обращений к элементам массива в шаблоне заменится на вызов методов получения свойства.
Ты можешь сделать какие-то самые важные свойства типа «является картинкой» методом, а остальное сделать через getData и массив.
Также, в этом классе можно хранить человеческие названия для полей, вроде width => Ширина.
> в котором будет метод getData(), который будет генератором,
Это излишне, мне кажется тут хватит массива который так же раскручивается. Генераторы используются чтобы не тратить память когда данных очень много, и массив получится огромный (а также чтобы не ждать когда он соберется). Ради 10-1000 значений задействовать генератор излишне.
>>409355
fb = facebook. Описание аутентификации: https://developers.facebook.com/docs/reference/dialogs/oauth/ + можно поискать готовую библиоеку для этого.
Насчет шансов, зависит от компании.
ДС2. Да, я ебашил 12/24, зато за недельку сделал 2 тестовых задания для двух компаний, в итоге обе же пригласили на собеседование. Сходил на первое, второй отписался с отказом.
Неделю дали
> который будет генератором, раскручивающимся foreach, а возвращающим массив 'свойство' => 'значение'
Генератор может вернуть пару ключ - значение сразу, массив не нужен.
Если не заработает, покажи код и натыкай туда echo чтобы было видно какие строки выполняются, а какие нет.
>Генератор может вернуть пару ключ - значение сразу, массив не нужен.
Всмысле?
Я предполагал yeld array('key' => 'value'), как иначе? не в этом случае, так как тут, видимо, генератор не нужен, а вообще?
Ну давай посмотрим.
> 1) Переменные:
Праивльно
> 2) Бросок кубиков
exit там не нужен, выполниться может только один блок.
скобки вкоруг else/elseif пишутся на той же строке:
} elseif () {
....
} else {
Так, решено верно.
> 3) Айфон в кредит:
> выплачено всего 56124.145161972 руб.
Должно быть около 61270.
Попробуй подставить меньшую сумму долга и проверить ответ. Для долг = 1000 должно получаться всего выплачено 2030, для долг = 4000 всего выплачено 6123.
> 4) В каком возрасте будет миллион:
Ок, только число 1.1 надо было вынести в переменную и поставить в начало программы, чтобы его было легко поменять. Так, решено верно.
Ну давай посмотрим.
> 1) Переменные:
Праивльно
> 2) Бросок кубиков
exit там не нужен, выполниться может только один блок.
скобки вкоруг else/elseif пишутся на той же строке:
} elseif () {
....
} else {
Так, решено верно.
> 3) Айфон в кредит:
> выплачено всего 56124.145161972 руб.
Должно быть около 61270.
Попробуй подставить меньшую сумму долга и проверить ответ. Для долг = 1000 должно получаться всего выплачено 2030, для долг = 4000 всего выплачено 6123.
> 4) В каком возрасте будет миллион:
Ок, только число 1.1 надо было вынести в переменную и поставить в начало программы, чтобы его было легко поменять. Так, решено верно.
Посмотри https://www.youtube.com/watch?v=hYvLsC_d1no&index=1&list=PL58DF3D2816E9CF16 мне помогло понять основы.
> 5) Задача про средний бал:
Верно
> 6) Задача на рост:
Правильно.
> 7) Задача про ответ на любой вопрос: не понял, где там задание?
Ну задание посмотреть на код и самому что-то аналогичное написать, я думаю.
> 8) Задача про имена кошек: опять не понял, ты же уже написал готовое решение?
Можно что-то поменять, если хочется.
> 9)Задания на шифровку/расшифровку:
> 'ж'\t=>\t'8',
> 'з'\t=>\t'9',
> 'и'\t=>\t'0',
> 'й'\t=>\t'#',
> 'ж'\t=>\t'48786',
> 'з'\t=>\t'#565656',
> 'и'\t=>\t'#апапа',
Тут у тебя ключи повторяются. В массиве не может быть 2 элемента с одинаковым ключом.
> 10)Задание на набор слов
> $rand2 = rand(0,6)
Это не очень удобно, так как если мы добавим/убавим слова в массиве, надо менять цифры. Сделай, чтобы цифры считались сами.
> 5) Задача про средний бал:
Верно
> 6) Задача на рост:
Правильно.
> 7) Задача про ответ на любой вопрос: не понял, где там задание?
Ну задание посмотреть на код и самому что-то аналогичное написать, я думаю.
> 8) Задача про имена кошек: опять не понял, ты же уже написал готовое решение?
Можно что-то поменять, если хочется.
> 9)Задания на шифровку/расшифровку:
> 'ж'\t=>\t'8',
> 'з'\t=>\t'9',
> 'и'\t=>\t'0',
> 'й'\t=>\t'#',
> 'ж'\t=>\t'48786',
> 'з'\t=>\t'#565656',
> 'и'\t=>\t'#апапа',
Тут у тебя ключи повторяются. В массиве не может быть 2 элемента с одинаковым ключом.
> 10)Задание на набор слов
> $rand2 = rand(0,6)
Это не очень удобно, так как если мы добавим/убавим слова в массиве, надо менять цифры. Сделай, чтобы цифры считались сами.
http://php.net/manual/ru/language.generators.syntax.php#control-structures.yield.associative
Если надо вернуть больше 2 значений, удобнее наверно использовать простой массив:
yield array(1, 2, 3, 4);
который легко раскладывается list:
foreach (list($x, $y, $z, $t) = generate( )) {
...
}
Ой, неверно написал пример
foreach (generate( ) as list($x, $y, $z, $t)) {
...
}
list внутри foreach использовать возможно начиная с php 5.5 вроде бы.
Мануал http://php.net/manual/ru/control-structures.foreach.php#control-structures.foreach.list
>скобки вкоруг else/elseif пишутся на той же строке:
Изменил: http://ideone.com/Ztrzss
>exit там не нужен, выполниться может только один блок.
Почему тогда у тебя вот тут указан exit():
?
>Попробуй подставить меньшую сумму долга и проверить ответ. Для долг = 1000 должно получаться всего выплачено 2030, для долг = 4000 всего выплачено 6123.
Поправлю, ок.
>Ок, только число 1.1 надо было вынести в переменную и поставить в начало программы, чтобы его было легко поменять. Так, решено верно.
Вынес: http://ideone.com/qM2EnS
>>409374
>Тут у тебя ключи повторяются. В массиве не может быть 2 элемента с одинаковым ключом.
Поправил: http://ideone.com/yXAEUn
>Это не очень удобно, так как если мы добавим/убавим слова в массиве, надо менять цифры. Сделай, чтобы цифры считались сами.
Готово: http://ideone.com/rOlpRL
Спасибо, ОП.
сосательный круг axaax
> Почему тогда у тебя вот тут указан exit():
У меня там идет один блок if и дальше многоточие, то есть может быть еще какой-то код.
А у тебя один блок if|else|elseif за которым ничего нет, и в этом блоке может выполниться только один из вариантов.
> Изменил
Теперь верно. Также, в конце скрипта ставить ?> не надо, так как после него легко забыть пробел (когда ты будешь писать веб-приложения, это помешает тебе).
> Вынес: http://ideone.com/qM2EnS
Все правильно.
> Поправил: http://ideone.com/yXAEUn
> $unCipher = strtr($text, $unCode);
Ты расшифровываешь не закодированный текст, а исходный. Исправь и снова покажи код.
> Готово: http://ideone.com/rOlpRL
там ошибки идут: PHP Notice: Undefined offset: 7 in /home/8MGMmJ/prog.php on line 24 посмотри внизу страницы. Ты обращаешься к несуществующим элементам массива.
У тебя там классическая XSS по моему: https://github.com/sqghub/uppu.ru/blob/febd2f075f910d0e5b1a0f8d8a71f064a8023627/templates/search.php#L6
Ну-ка прочитай урок про XSS https://gist.github.com/anonymous/52adda0113428b274c64
Можно но так как execute возвращает bool то ты не сможешь сохранить PDOStatement в переменную. Если ты делаешь INSERT/DELETE это ок, но если ты хочешь сделать fetch то ты обломишься.
>У тебя там классическая XSS по моему
И по-моему!
>Ну-ка прочитай урок про XSS
В сотый раз. Мне в армии говорил комбат, что человеку надо 500 раз повторить действие, чтобы укрепить его. Видимо, мне нужно пять сотен уязвимостей обернуть в функцию htmlspecialchars, чтобы запомнить это.
Ну, 500 раз не так и много, я думаю за месяц активного написания кода ты функцию html больше раз напишешь.
Кстати.
TimeDate как в бд хранить? Просто как строку? Как привести TimeDate к виду Date в mySQL я нашел, а вот обратно - нет.
У меня есть 20 неплохих задачек, правда не на php, а на яваскрипт + есть путь HTML, так что найдем что тебе решать. В крайнем случае отправим симфони 2 изучать, а эта тема бездонная.
>В крайнем случае отправим симфони 2 изучать, а эта тема бездонная.
Мне тут птичка нашептала, что нормальные поцаны учат Yii2. Меня обманули?
Есть типа DATETIME
Преобразровать обратно можно парсингом даты из стрки:
$str = '2014-10-02 12:00:00';
$date = new DateTime($str);
или с явным указанием формата, более надежно:
$date = DateTime::createFromFormat('j-M-Y', '15-Feb-2009');
echo $date->format('Y-m-d');
http://php.net/manual/ru/datetime.construct.php
http://php.net/manual/ru/datetime.createfromformat.php
Кстати, есть мой немного устаревший, увы, урок по датам/времени: https://gist.github.com/codedokode/10539805 — там описываются функции, так что если ты используешь DateTime, лучше наверно его использовать, он ООП-ориентированный и удобный.
Кстати, учти что в MySQL может иногда быть странная дата типа '0000-00-00', например если ты в поле DATeTIME вставиim пустую строку или 0.
Yii2 проще чем Симфони 2, я его не упомянул поэтому. Естественно, после Slim можно будет за него взяться.
Ну это может быть интересно, там можно всякие штуки, работающие в браузере писать. У нас есть задачка написать игру-арканоид например, или если тебе нравятся более серьезные вещи, написат какой-нибудь мини-ексель.
Да. Но Сифмони 2 очень правльный с точки зрения ООП и паттернов, и очень мощный, там есть ORM доктрина, нормальный роутин, куча расширений, включая например генератор админки, потому его надо рано или поздно изучать.
>или с явным указанием формата, более надежно:
>$date = DateTime::createFromFormat('j-M-Y', '15-Feb-2009');
Вот это я и искал. Только из бд берется другой формат, вроде бы. Там Y-m-j h:m:s или что-то около того.
>Ты расшифровываешь не закодированный текст, а исходный. Исправь и снова покажи код.
Готово: http://ideone.com/yXAEUn
>там ошибки идут: PHP Notice: Undefined offset: 7 in /home/8MGMmJ/prog.php on line 24 посмотри внизу страницы. Ты обращаешься к несуществующим элементам массива.
Поправил: http://ideone.com/G39ZTt
Потому что mt_rand($a,$b) это выражение, оно вычислилось, но ты ничему не присвоил результат этого выражения. А то что ты выводишь - $mt_rand, эта переменная ничего не содержит, ведь ты ничего в нее не положил. $mt_rand и mt_rand($a,$b) никак не связаны. Присвой mt_rand($a,$b) переменной и выведи ее через echo.
Надо писать
$x = mt_rand($a, $b);
Эта команда вызовет функцию mt_rand, которая сгенерирует число, и положит его в переменную $x, c которой ты можешь делать что хочешь. А $mt_rand это вообще несуществующая переменная.
Когда ты пишеь просто
mt_rand(1, 2);
То число генерируется и после этого выбрасывается, так как ты его никуда не сохранил.
Ну может этот случай клинический.
Не вижу смысла в подобной деятельности. Какой-то совковый стереотип, мол если пишешь, то запоминается лучше, хотя ты итак пишешь код в айдеоне, незачем дублировать его еще и в тетрадку. Ну дело твое.
Если пишешь, то запоминается лучше. Правда в контексте языков программирования это касается не конспектов, а кода. Вот и вся разница. А для описания функций есть документация.
Не, это дело бесполезное. Сколько учу кодинг, никогда ничего не конспектировал. Решаешь задачку, гуглишь,гуглишь, читаешь доки,гуглишь,читаешь книжки,гуглишь,
Я в печале. Даже такой простой код не работает. Соедениния с БД есть 2+2 выводит. Анон, подскажи путь истинный!
Записывать смысл есть, но лучше писать кратко, так вопринимать информацию будет проще. Например, вместо описания функции выписать только название (а что она делает, запомнить так). Ну и код писать особо смысла нет целиком, только какие-то важные моменты.
Ну и правильно тебе советуют, пиши код (на компьютере) каждый день и ты постепенно все это запомнишь, руками сами будут нужные команды печатать.
Этот код должен выдавать сообщение об ошибке, в котором информация, что именно ты сделал непраивльно. По сообщению я смогу сказать в чем проблема и что надо исправить.
Если он ничего не выдает, значит у тебя отключен вывод сообщений об ошибках. Вернись к длинному посту >>409313 и проверь, все ли правильно.
Например, я не вижу строчки с ATTRMODE_EXCEPTION.
Делал так когда серьезные курсы смотрел. Просто полистать тетрадку порой быстрее чем рыться в доках.
>Задание на набор слов
>(0,count($word1)-1)
>-1
В чем суть использования -1? Зачем это вставлять?
Только дошедший до этой задачки
Последний индекс в массиве всегда меньше колличества элементов в нем, потому что нумерация начинается с нуля. Допустим у нас есть массив с тремя элементами:
0 => "первый элемент"
1 => "Второй элемент"
2=> "третий элемент"
Как видишь в массиве их трех элементов, индекс последнего будет двойкой.
Может быть когда ты пишешь DSN, не надо ставить пробелы?
> "mysql:host = localhost;dbname = test",
Вот тут вот, рядом со знаком =?
есть массив например айдишников, по этому айдишнику делаю запрос в БД, получаю данные, агрегирую, группирую, хуе-мое, складываю во временную таблицу, затем по этому же айди обращаюсь во временную таблицу и получаю нужные данные. По сути действия выполняемые для разных айди никак между собой не связаны, разве только что использую одинаковые ресурсы. Временные таблицы сделаны для того чтобы на каждой итерации не смотреть в главную, ооочень большую таблицу. Агрегация и выборка из временных таблиц реально работает быстрее чем тупо запросы в большую БД.
Дак вот, хочется для всего этого хозяйства многопоточность все дела. Что вообще для этих целей использую валютные пхп-погромисты?
и появилась проблема и я не понимаю в чём она заключается. Помогите.
http://ideone.com/NRpCet
На будущее, где можно посмотреть в чём ошибка в коде? т.е ideone (и страница в локалхосте) пишет мне, что ошибка в 15 строке, типо "НЕ ПРЕДПОЛОГАЛИ "" В 15-ОЙ строке". Есть ли какой-нибудь сервис, который укажит и выделит эту самую ошибку?
Мда, а в чём смысл? ведь идёт же текст сплошной с переводом строки через \n нахуй там эти точка с запятой? при этом мне пришлось поставить их в 14-ую и 15-ую
Там не идет текст, там идет оператор echo который выводит текст после которого нужна точка с запятой. Пхп-интерпретатор воспринял 14 и 15 строку одной строкой и не знает, что делать с обилием операторов в одной строке.
А почему он не жалуется на остальные строки? которые дальше идут и выглядят также
А, я одним глазом только взглянул на 14 и 15 строчку тогда,
у тебя было вот так: echo "Xxxx $var" "yyyyy $var2 " . "zzzzz $var3". "jjjjjjjjjjj $var4";
То-есть у тебя между остальными частями стоит конкатинация с помощью точки, а между первой и второй частью не было, там вместо точки с запятой точку тоже поставь
http://www.mirsite.ru/strf/1/2.htm
ОПчик, взгляни пожалуйста. >>409609
Ты молодец, что написал код, но вот сам код страшный. Надо его пропускать через phpformatter.com перед тем как вкидывать в тред, потому что читать код со сбитыми отступами невозможно. Надо всматриваться где там какая скобка стоит, и мне это не нравится.
> \tif ($arg > $value){
> $arg = $value;
Тут if можно заменить на функцию min или max
> $bills as $key => &$value
Это бессмысленные названия. Надо переименовать $key например в $value (номинал банкноты), а $value в $amount (запас).
> $cash = $cash - $sum;
Удобно ислоьзовать -=
> if ($arg != 0)\techo "
Действия внутри if надо заключать в блок из фигурных скобок.
В общем, я советую исправить замечания, офомить код нормально и сдать на проверку снова, я посмотрю еще более внимательно.
Ну и еще совет: не надо мучаться с тегами br и pre. Есть способ проще.
Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
header("Content-Type: text/plain; charset=utf-8");
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
Ты молодец, что написал код, но вот сам код страшный. Надо его пропускать через phpformatter.com перед тем как вкидывать в тред, потому что читать код со сбитыми отступами невозможно. Надо всматриваться где там какая скобка стоит, и мне это не нравится.
> \tif ($arg > $value){
> $arg = $value;
Тут if можно заменить на функцию min или max
> $bills as $key => &$value
Это бессмысленные названия. Надо переименовать $key например в $value (номинал банкноты), а $value в $amount (запас).
> $cash = $cash - $sum;
Удобно ислоьзовать -=
> if ($arg != 0)\techo "
Действия внутри if надо заключать в блок из фигурных скобок.
В общем, я советую исправить замечания, офомить код нормально и сдать на проверку снова, я посмотрю еще более внимательно.
Ну и еще совет: не надо мучаться с тегами br и pre. Есть способ проще.
Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
header("Content-Type: text/plain; charset=utf-8");
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
PHP-программисты просто запусткают N копий скриптов, указывая каждому диапазон id для обработки. Так как скрипты могут падать, запускать их желательно не руками, а программой-супервизором вроде http://supervisord.org/introduction.html
Также иногда используеются очередь задач вроде Gearman: ты кладешь задачи в очередь, а пул скриптов-рабочих их разбирает и выполняет.
Советую не изобретать велосипеды.
Много процессов имеет преимущетва перед многопоточностью в отстутсвии проблем с блокироваками внутренних данных и структур.
> что думаете за эту тему https://github.com/reactphp/react
Что ты с ним намучаешься. Нет волшебной палочки, которая превратит синхронную программу в асинхронную, подключив одну библиотеку.
Алсо это не совсем настоящая многопоточность. Это так называемые зеленые треды или кооперативная многозадачность, у нее есть свои особенности, которые надо знать перед тем как использовть.
Алсо, по идеям напоминает ноду. Если тебе нужен небольшой асинхронный демон, лучше наверно сразу писать на ноде. Хоят конечно в каких-то слчаях php удобнее, например ты можешь использовать существующий код.
Алсо, я когда-то давно писал свой велосипедный однопоточный сервер на php, чтобы проверить много ли можно выиграть за счет отказа от схемы «умирать после каждого запроса». Выигрыш был в 2 раза, 5 мс вместо 10. Правда, он был не такой продвинутый как этот react, и не совсем асинхронный, конечно.
Ну и чтобы реализовать многопоточную работу с MySQL в зеленых тредах, нужен неблокирующий асинхронный драйвер MySQL. Кто его напишет? Пока самый реалистичный вариант портировать с ноды/питона или попробовать использовать асинхронные возможности mysqli: http://php.net/manual/ru/mysqli.poll.php (я когда-то хотел с этим поиграться, но так и не поигрался).
>Я еще думаю, пришла пора привести в порядок работу с медиаданными
Что-то попробовал.
И с датами вроде бы разобрался.
http://ideone.com/iHcG9E , а сколь велика разница в функциональности и удобстве \n ? Я просто на локалхосте у себя запускаю и мне достаточно удобно сейчас через <br> и <pre>.
У тебя ошибка в том, что ты не поставил команду echo или перепутал точка с запятой с точкой:
> $msg = " $name был похищен $when_it_happened и отсутствовал в течение $how_long. \n";
> "Количество космических пришельцев $how_many\n" ;
Точка с запятой разделяет команды. Потому в msg присвоится только первая строчка. А вторая строчка выполнится, ничего не сделав.
Также, если ты запускаешь код у себя на компьютере, то без правильной настройки почта не будет посылаться никуда. Вот статья на хабре:
http://habrahabr.ru/post/26518/
Имей в виду, там идет отправка через аккаунт на сервере вроде mail.ru, я советую не использовать Гугл так как он скорее всего примет тебя за спамера и забанит аккаунт (если им пользуется скрипт, а не человек). Ну или использовать аккаунт, которым ты до этого сам пользовался.
Как альтернатива, можно вместо отправки почты установить программу, складывающую письма в папку в виде eml-файлов (просматриваются любым почтовым клиентом, например Цундеребердом): http://toster.ru/q/545 Денвер, написано, уже умеет это делать сам.
Я про такой сервис, который растолковывает ошибки. не знаю. Тут надо просто знать правила языка php и видеть где они нарущены.
>>409791
PHP позволяет написать просто выражение как отдельную команду, например:
2 + 2;
3 + 3;
4 + 4;
PHP посчитает эти выражения, но так как ты их никуда не выводишь, и не сохраняешь результат, то он просто считает выражение и выкидывает результат. Довольно-таки бессмысленный код.
ТО же самое со строкой. Ты можешь написать
"a" . "b" ;
"c";
PHP просто посчитает значения этих строчных выражений и выкинет их. Чтобы их сохранить, надо либо присвоить их переменной, либо поставить команду echo
echo "a" . "b";
$d = "c";
Это кстати (точка с запятой и что надо сохранять результат) описывается у меня в самом первом уроке.
В твоем случае php посчитал значения выраженйи и выкинул их.
Я про такой сервис, который растолковывает ошибки. не знаю. Тут надо просто знать правила языка php и видеть где они нарущены.
>>409791
PHP позволяет написать просто выражение как отдельную команду, например:
2 + 2;
3 + 3;
4 + 4;
PHP посчитает эти выражения, но так как ты их никуда не выводишь, и не сохраняешь результат, то он просто считает выражение и выкидывает результат. Довольно-таки бессмысленный код.
ТО же самое со строкой. Ты можешь написать
"a" . "b" ;
"c";
PHP просто посчитает значения этих строчных выражений и выкинет их. Чтобы их сохранить, надо либо присвоить их переменной, либо поставить команду echo
echo "a" . "b";
$d = "c";
Это кстати (точка с запятой и что надо сохранять результат) описывается у меня в самом первом уроке.
В твоем случае php посчитал значения выраженйи и выкинул их.
Устриваться на работу.
Ну она первая в том разделе идет, я помню этот раздел как раздел задачек с банкоматом и тд.
Алсо, после head first почитай нормальную книгу и сайт phptherighway. По началу там еще терпимо, но в самом конце (скрипт соцсети) адский быдлокод с кучей ошибок и уязвимостей.
Я как-то давно разбирал эту книгу и нашел там кучу ошибок и неточностей.
>>409789
Точка с запятой завершает команду (и начинает новую).
>>409803
Да не такие уж и бешеные. Программист — обычный наемный работник, если ты хочешь получать «бешеные» доллары, надо делать свой бизнес или лезть в стартап за долю (напомню, 95% стартапов по моему даже год не живут, также напомню что есть способы «отжима» доли, смотри историю Дурова).
Но с другой стороны, кто знает, у каждого программиста есть шанс что именно он напишет следующий вконтакт/гугл/airbnb. Да и сама профессия, да, хорошая, и в ней при желании можно многого добиться.
А вот насчет свободы перемещения — это по моему довольно сложно, так как оказавшись на берегу океана или в новом незнакомом городе, у тебя вряд ли будет желание сидеть весь день уткнувшись в экран. Я знаю, что некоторые люди по теплым странам мотаются и работают оттуда, но не всем это комфортно.
Я лично пользуюсь возможностью спать подольше и отстутствием необходимости вставать спозаранку и куда-то ехать независимо от настроения. Это да, в каком-то плане комфортно и в офис возвращаться не особо хочется. Ну и я предпочитаю меньше работать, а не больше зарабатывать (это плохо? не знаю пока).
Так что аноны, учите php и веб-технологии в нашем уютном тредике и идите к успеху.
>Алсо, после head first почитай нормальную книгу и сайт phptherighway
Какую именно книгу? т.к с выбором обучающего материала у меня чудовищные проблемы, ибо даже head first читаю на русском.
Попробуй Б.Макфарлин "PHP и MySQL. Исчерпывающее руководство."
Может анон не из России. Не придирайся к мелочам.
>>409813
\n тупо писать короче. И работает везде одинаково. И код не выглядит как каша из смеси html и php.
Дальше, у тебя в коде сейчас огромные ифы на полпрграммы:
if () {
100500 строк
} else {
100500 строк
}
Нехорошо. Это затрудняет понимание программы. Внутри if не должно быть много команд, тем более полпрограммы.
Засунь-ка расчtт сдачи в функцию и избавься от таких огромных блоков if с помощью return.
Сам алгоритм верный.
Ну и там еще есть усложненная версия, с 200 и 2000, интересует? Это разновидность хитрой задачи о ранце получается, и по-простому там не решить.
Да, я завтра уже начну голову ломать над второй частью и над оптимизацией первой, для меня и это решение было выстрадано 9ью часами размышлений над самим алгоритмом, я уже даже хотел саму вводимую сумму делить по длине но вовремя остановился.
ОП-чик, я тут поправил. Ты смотрел и все норм или пропустил?
Молодец! Это значит что ты освоил основы php (хотя если ты не показывал решения, то это плохо так как я обычно замечаю непонимание какой-то темы и помогаю это исправить).
Но основы php, согласись, маловато. Способный веб-программист пишет не маленькие задачки на ideone на 30 строк, а веб-приложения и сайты, использует фремйворки и библиотеки. Давай изучать их!
Для тебя у нас есть дополнительные задачи на написание прилоежний и MVC:
чуть попроще: https://gist.github.com/codedokode/d7e7f11449fc3bcb24b4
чуть посложнее но интереснее и полезнее: https://gist.github.com/codedokode/9424217
Заметь, что для решения этих задач надо знать основы (не весь) HTML/CSS и для второй задачи. основы MySQL. Эти вещи все равно тебе придется изучить рано или позжно, так что не откладывай.
Вот большой набор задач и ссылок на мануалы по HTML/CSS: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
Вот то же по MySQL: https://gist.github.com/codedokode/10539213
Я советую тебе почитать описания задач, выбрать какую хочешь делать (не можешь выбрать? бери файлообменник). После чего приступать к ее выплнению.
Если что-то непонятно, задавай вопросы. Их у тебя, наверною будет много. Если понятно, пиши код и вкидывай в тред свой гитхаб, чтобы я этот код проверял.
А да, чтобы пользоваться гитхабом, придется освоить гит. Есть прекрасная официальная книга на русском (и других языках), почитай: http://git-scm.com/book/ru/v1
На тебя сейчас наверно вывалится гора информации и новых непонятных слов, привыкай: тяжела и неказиста жизнь простого программиста. Другие аноны успешно все это изучают и уже несколько человек сделало файлообменник.
Насчет работы, если не горит, то я советую изучить веб технлогии чуть получше и найти работу получше, а не первую попавшуюся.
>Насчет работы, если не горит, то я советую изучить веб технлогии чуть получше и найти работу получше, а не первую попавшуюся.
А чем же они отличаются?
У нее есть хардкорная версия с купюрами в 200 и 2000, может анон ее решал и надолго это запомнил. Ну не беда, зато чуть умнее стал.
>>409844
В Оп-посте упомянуты неплохие, хотя и чуть старые, книги Мэтта Зандстры и Шлосснейгла. Чтобы их читать, надо уже знать основы php, они тебя поднимут дальше. Также, сайт phptherightway надо прочесть обязательно.
>>409471
Пропустил. Исправляюсь.
> шифровка
Не работает надежно расшифровка: http://ideone.com/2CV4fH
> стихи
Хорошо, все верно.
Уровнем задач, которые ты будешь выполнять.
Есть веб-студии, самых разных уровней, от слабых до крутых и известных. В «слабых» студиях ты будешь выполнять примитивную рутинную работу, типа сделать сайт по шаблону, забить в него тексты, попроавить кривую верстку, причем работать ты будешь с плохим, наспех слепленных, некачественным кодом. Это вариант, если тебя больше никуда не берут, но через полгода такой работы ты взвоешь. Ну и плюс в мелких студяих могут быть черная не всегда выплачиваемая зарплата, штрафы, эффективные менеджеры и прочие радости жизни.
В студиях более высокого уровня работать будет интереснее: проекты с известными компаниями, хороший качественный дизайн, больше времени и возможность делать не дешевле, а качественней, больше профессионализма. Но для программиста это все равно тупик в развитии.
Кроме студий, есть еще 2 вида компаний: аутсорсеры и продуктовые компании. Аутсорсеры делают задачи на заказ: например, разработать такую-то систему, они работают за деньги заказчика. Продуктовые компании — это те, кто разрабатывает свой продукт, для себя. и сам на нем зарабатывает. Например, компания Яндекс делает поиск для себя и зарабатывает на рекламе. Тут много споров, кто круче, но по моему продуктовые компании все же уровнем повыше. Там могут работать очень профессиональные программисты, у которых многому можно научится, там горзадо лучше организация работы. Да и денег у них обычно больше, и офис просторнее.
В таких компаниях уровень гораздо выше (соответственно испытания при приеме на работу хардкорнее и собеседованием ты можешь не ограничиться, будут тесты или тестовые задания), но и работать интереснее, и научиться можно большему.
Потому чем больше у тебя знаний, тем больше выбор мест работы.
>Не работает надежно расшифровка: http://ideone.com/2CV4fH
Не совсем понял в чем дело, длинные значения в массиве это видимо не самый удачный вариант. Вот так сработало как надо:
http://ideone.com/xF9Wo9
Ну и если ты хочешь продаться в рабоство на одеске, то со слабыми знаниями там делать нечего, индусы и пакистанцы так демпинугют на простых задачах что ты даже на доширак не заработаешь (кстати, никогда не пробовал этот продукт, он правда такой невкусный?).
Оп-кун, вот когда я закончу с чуть попроще задачей, что делать дальше? Делать задачу чуть по-сложнее?
И вопрос, а где в первой задаче использывать ООП? К примеру, я паттерны не хочу использывать из за того, что они работают во первых медленей, а во вторых у меня полного понимания, что это и зачем оно не понятно. Из за этого я обойдусь PDO.
По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
Кстати, как эта книга? Ничего, что там код немного устарел?
А во вторых, как ты думаешь, после второй задачки можно идти искать работу Junuior-ом?
другой-анон
Мне нравится доширак, недавно вот довелось отведать. Лучше в стократ ролтоновских бич пакетов.
Проблема была в том, что цифры 098 могли обозначать как букву Н так и послеовательность ИЗЖ и догадаться что именно, было невозможно.
Ты должен грамотно придумать замену, чтобы неоднозначностей не было.
Теперь решено верно.
Доширак? Ролтон иногда кушаю(студент жи). Хм, просто однообразный и не очень полезный + приправленый всякими не няшными вещами.
> а где в первой задаче использывать ООП?
Ну, например, работа с таблицей в БД должна быть изолирована в отдельном классе. Если таблиц N — должно быть N классов, для каждой свой.
Дальше я тебе скажу когда ты покажешь код, если где-то можно сделать лучше.
> К примеру, я паттерны не хочу использывать из за того, что они работают во первых медленей
Чушь.
Паттерны просто описывают варианты решения задачи. Даже если ты не знаешь паттернов, ты вполне возможно, пишешь код в соотсетствии с одним из них. (но чаще начинающие пишут какой-нибудь жуткий перемешанный велосипед из разных подходов. Я знаю, так как я видел кучу таких велосипедов от анонов).
Соответственно, паттерны удобны тем, что ты можешь например сказать коллеге: «я думаю тут использовать TableDataGateway», или «этот паттерн тут не подойдет, так как ....» и он сразу поймет о чем речь, без долгих объяснений. Паттерны позволяют думать на боле высоком уровне. Но начинающему они будут малопонятны, за них надо браться когда написано определенное число строк кода.
> По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
> Кстати, как эта книга? Ничего, что там код немного устарел?
Вроде неплохая, хотя может чуть-чуть устарела. Но это не беда.
> после второй задачки можно идти искать работу Junuior-ом?
Можно и после первой, но вторая даст тебе больше знаний и шансов. А если ты после нее еще фреймворки поизучаешь, порешаешь задачи на JS и Путь HTML, то будет еще лучше.
И да. Не прячь код. Показывай сразу, как только что-то напишешь чем раньше мы увидим ошибку. тем меньше тебе придется переделывать.
Лапша она и есть лапша, как тебе объяснить? Ничего общего с обычными макаронами.
Вот, примерно так я и думал. Спасибо.
Учитывая место проживания, у меня может быть нет такой уж большой выбор.
Бтв, повторюсь: https://github.com/sqghub/uppu.ru
Я чуть-чуть поработал с медиаданными.
Ну у меня только одна таблица. Соотвественно - зачем писать класс для одной таблицы? Ведь, скрипт просто подключается и пишет данные, а потом убивается.
Кстати, а в php нельзя делать, как в питоне import xa.py и использывать классы и функции определенные в xa.py?
Спасибо. Чуть более понятно, но обычные статьи слишком перегруженны терминами их сложно понять очень.
>>409872
У меня еще где-то месяц на все это, а первую задачу хочу закончить сегодня/завтра. Спасибо.
У меня только работающее подключения к БД есть.
>>409873
Да, такая дешевая-дешевая лапша.
>Соотвественно - зачем писать класс для одной таблицы? Ведь, скрипт просто подключается и пишет данные, а потом убивается.
Чтобы научиться писать классы, видимо. Задача же ставит цель научиться, а не запилить сайтик на продажу.
Я помню, ты справшивал, а что делать дальше. Там в задании есть такое:
> Алсо, если ты не умрешь в процессе изготовления uppu.ru, вот что планируется сделать:
....
Ты пока хорошо справляешься, так что тебе стоит сделать все пункты.
А потом после этой задачи придумаем тебе что-нибудь на Yii2, ну или может ты захочешь отвлечься на прохождение 3 задач по SQL (хорошо бы), JS или HTML/CSS.
>>409881
Ну это да, но есть еще удаленная работа, если у тебя скиллы и опыт есть, то она может оказаться выгоднее чем местная работа. Ну и одеск еще есть, если ты в инглише силен и если скиллы программирования высокие.
>может ты захочешь отвлечься на прохождение 3 задач по SQL
Задачу про лайки только делал.
>JS или HTML/CSS.
Это, видимо, все равно придется учить.
>Ну это да, но есть еще удаленная работа, если у тебя скиллы и опыт есть, то она может оказаться выгоднее чем местная работа.
Я, конечно, не эксперт с мировым именем вы вопросах выбора работы, но мне кажется, что начинать удаленно - плохая затея.
код гляну завтра, уже спать пора.
>>409882
> зачем писать класс для одной таблицы?
У нас код будет состоять из классов и методов. Лапша, когда все свалено в перемешку в скрипт, не годится. Почему?
Лапша работает только пока автор пишет код в одиночку и код маленький. В реальных приложениях разработчиков обычно несколько, и кода много. То есть подход с лапшой не работает. Потому мы будем учиться делать праивльно.
Также, лапше код неудобно поддерживать, нельзя тестировать юнит-тестами, нельзя повторно использовать. Зачем вообще тратить время на его написание? Лучше сразу писать верно.
ООП, MVC и ООП-фреймвоки сейчас используются везде, потому надо знать их. Тестовое задание, написанное в стиле лапшекод, вряд ли произведет хорошее впечатление.
Учить лапшекод — это тоже самое, что учиться кататься на велосипеде с квадратными колесами вместо нормального. Зачем? Лапшекод всегда был неправильной идеей, просто раньше было много непрофессионалов и никто не оращал на это внимание.
> , а в php нельзя делать, как в питоне import xa.py и использывать классы и функции определенные в xa.py?
Есть require_once, деталии в мануале. Также, в php есть атозагрузка классов, это позволяет вообще без импорта обойтись.
> Чуть более понятно, но обычные статьи слишком перегруженны терминами их сложно понять очень.
Пиши вопросы, в тред. что тебе непонятно, я попробую пояснить. Наша цель чтобы ты понимал каждую строчку, которую ты пишешь.
> а первую задачу хочу закончить сегодня/завтра
Боюсь слишком оптимичстично. Разве что написать первый вариант решения.
>>409883
Верно. Все большие приложения и фреймворки пишутся на MVC и классах. То есть в любой нормальной компании ты с ними столкнешься и это у тебя будут спрашивать, так что да, потому мы этому и учим. То, что где-то есть люди которые до сих пор пишут по устаревшим 10 лет назад учебникам, нас не волнует.
код гляну завтра, уже спать пора.
>>409882
> зачем писать класс для одной таблицы?
У нас код будет состоять из классов и методов. Лапша, когда все свалено в перемешку в скрипт, не годится. Почему?
Лапша работает только пока автор пишет код в одиночку и код маленький. В реальных приложениях разработчиков обычно несколько, и кода много. То есть подход с лапшой не работает. Потому мы будем учиться делать праивльно.
Также, лапше код неудобно поддерживать, нельзя тестировать юнит-тестами, нельзя повторно использовать. Зачем вообще тратить время на его написание? Лучше сразу писать верно.
ООП, MVC и ООП-фреймвоки сейчас используются везде, потому надо знать их. Тестовое задание, написанное в стиле лапшекод, вряд ли произведет хорошее впечатление.
Учить лапшекод — это тоже самое, что учиться кататься на велосипеде с квадратными колесами вместо нормального. Зачем? Лапшекод всегда был неправильной идеей, просто раньше было много непрофессионалов и никто не оращал на это внимание.
> , а в php нельзя делать, как в питоне import xa.py и использывать классы и функции определенные в xa.py?
Есть require_once, деталии в мануале. Также, в php есть атозагрузка классов, это позволяет вообще без импорта обойтись.
> Чуть более понятно, но обычные статьи слишком перегруженны терминами их сложно понять очень.
Пиши вопросы, в тред. что тебе непонятно, я попробую пояснить. Наша цель чтобы ты понимал каждую строчку, которую ты пишешь.
> а первую задачу хочу закончить сегодня/завтра
Боюсь слишком оптимичстично. Разве что написать первый вариант решения.
>>409883
Верно. Все большие приложения и фреймворки пишутся на MVC и классах. То есть в любой нормальной компании ты с ними столкнешься и это у тебя будут спрашивать, так что да, потому мы этому и учим. То, что где-то есть люди которые до сих пор пишут по устаревшим 10 лет назад учебникам, нас не волнует.
> Задачу про лайки только делал.
Ну я там еще 2 добавил в тот же урок недавно. Но задача на лайки уже неплохо, она учит джойнам, группировке, внешним ключам.
> Это, видимо, все равно придется учить.
Ну может тебе понравится. CSS это боль когда ты наугад переставляешь свойства, а когда ты знаешь что делать, это выглядит как стройная система правил (ну или должно в идеале так выглядеть).
> но мне кажется, что начинать удаленно - плохая затея.
Скорее всего, да. Но ты можешь начать неудаленно, а потом перейти. Ну и есть наверно места, где альтернатив нету.
здрастье, а вы не могли бы дать ссылку, где готовый пакет денвер скачать можно. на денвер ру не работает.
Скачай xampp, раз уж такой рукожоп.
>PHP-программисты просто запусткают N копий скриптов, указывая каждому диапазон id для обработки
Это очень печально.
>Ну и чтобы реализовать многопоточную работу с MySQL в зеленых тредах, нужен неблокирующий асинхронный драйвер MySQL
У меня psql и монго, но не суть.
Спасибо за развернутый коммент. Если не взлетит, то напишу на пистоне проблема в том что его не знаю
OpenServer юзай. Денвер все, морально устарел.
>тебе стоит сделать все пункты.
Так там осталось только перетаскивание файла. А раз уж лезть в js, то с головой, а не на один скрипт.
Денвер не нужен
добавлял в текст кода mb_internal_encoding('utf-8'); и всё равно либо знаки вопроса на черном фоне, либо вот эти каракули,
> Это очень печально.
Это не печально, а нормально. Ты не прочел то я написал. Например, использование нескольких процессов позволяет задействовать несколько ядер процессора, в то время как системы на зеленых тредах (Node.JS, nginx) исплоьзуют только одно ядро. Кстати, по этой причине однопоточнй nginx тоже запускает несколько процессов. И в случае с нодой то же самое, запускают несколько копий. И подозреваю, в случае с Питоном тоже.
Ты по моему не разбираешься в этих вещах, не знаешь преимущества и недостатки разных подходов, а просто судишь по принципу «php это плохо, нода это хорошо». Зря.
Если ты хочешь писать асинхронно, пиши на Node или каком-нибудь Twisted.
>>409904
Ставь руками, у меня кое-что на эту тему есть: https://gist.github.com/codedokode/10774100
У меня задачки есть на яваскрипт:
https://gist.github.com/codedokode/ce30e7a036f18f416ae0
https://gist.github.com/codedokode/9933897
Насчет задачек на DOM, я думаю, начиная с 6-й можно jQuery использовать.
В браузере ты кодировку явно не укзаывал? Если так то поставь «определять автоматически».
Также залей файл на файлообменник как есть и вкинь ссылку, я проверю кодировки.
https://github.com/sqghub/uppu.ru/blob/00a2fb1827d4c80da25f080001ccaa4f23c03f2e/model/File.php#L72
> $this->date = new \DateTime("$date");
ты недаешь неправильно. Лучше сразу в функцию передавать DateTime, а не заниматься лишними преобразованиями.
Насчет MediaDataMapper.php, мне кажется слово Mapper тут не очень подходит, так как под Mapper обычно имеется в виду DataMapper , код которые сохраняет/загружает сущности из БД.
> if (!is_null($mediaData)) {
> foreach ($mediaData->getData() as $key => $value) :?>
Для if надо исплоьзовать тут тоже версию с двоеточием
> <img alt="Изображение" style="width:98%" src="/<?=$file->getFilePath()?>
Это плохо. Для превьюшки надо иметь картинку нужного разиера, а не выкачивать картинку 2000×2000 чтобы отобразить уменьшенной. Также, эти 98% надо убрать.
Картинку-превьюшку можно создавать в момет загрузки, можно в момент первого запроса к ней.
> $previewHeight = (int)(200 $previewHeight / $previewWidth);
Для округдения надо использовать ceil/floor/round
https://github.com/sqghub/uppu.ru/blob/master/templates/download.php#L38 — эту и другие длинные строчки, сделай более короткими, чтобы на гитхабе все отобрадалось без прокрутки. Обычно ограничивают строку 80-120 символами.
Насчет плееров, надо бы проверять как-то, поддерживает ли браузер нужный формат прежде чем выводить плеер. Иначе ты получишь неработающий плеер и удивленного пользователя.
У тебя все равно есть информация о кодеках, так что это наверно не должно быть проблемой? Плюс, яваскриптом (когда ты в нем разберешься на нужном уровне) можно проверить, поддерживает браузер тот или иной формат или нет с помощью метода canPlayType которые есть у audio/video. Если ты пока не знаешь, как это сделать, можно на потом оставить.
Вот полезная информация на эту тему:
https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats (англ)
https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Using_HTML5_audio_and_video (англ)
https://developer.mozilla.org/en-US/Apps/Build/Audio_and_video_delivery/Cross-browser_audio_basics (англ)
Ты используешь HTML5 audio/video, значит пользователи старых браузеров и старых ИЕ не смогут его увидеть. Ну да ладно, можно так и оставить, можно сделать фоллбек на использование флеша (старые браузеры проигнорируют теги audio и video и внутрь них можно поместить контент для них).
> https://github.com/sqghub/uppu.ru/blob/master/model/FileMapper.php#L40
Пользователю незачем знать технические подробности ошибки. Да и не очень понятно, зачем ловить там исключения, как я понимаю они могут произойти только при неправильном настроенном сервере (нет нужно папки или прав на запись в нее, или отвалилась база данных), то есть пользователь все равно ничего исправить не сможет.
https://github.com/sqghub/uppu.ru/blob/master/model/media/MediaDataMapper.php#L8
Вот так хранить данные не очень удобно. Представь, что тебе понадобится где-то иноформация о годе выхода, как ты будешь писать код?
$audioData->getData()['Год'] — так?
Представь что завтра тебе понадобится перевести сайт на несколько языков. Опять же, та же проблема.
Луше хранить в массиве идентификаторы вида
'releaseYear' => 2014
А отдельно иметь массив заголовоков, вроде
'releaseYear' => 'Год выхода'
Соответственно, нетрудно будет написать функцию, объединяющую их.
> https://github.com/sqghub/uppu.ru/blob/master/model/media/MediaDataMapper.php#L79
Если у тебя mediaData может быть null то ты, разумеется, везде, перед тем как что-то вызвать, проверяешь, что она не пустая? Альтернативой было бы создавать пустой объект MediaData, без информации о файле.
Ну и насчет формата хранения в БД, я совeтовал json из-за того, что он человекочитаем и что с ним можно работать из разных языков, то есть он поуниверсальнее чем serialize, который теоретически может меняться даже между версиями php (вроде такого не было, но кто их знает). Также, если ты отрефакторишь классы AudioData или поменяешь неймспейс, старые данные перестанут распаковываться так как там записано имя класса и полей в нем. Мне кажется, JSON понадежнее и удобнее для целей долговременного хранения.
https://github.com/sqghub/uppu.ru/blob/00a2fb1827d4c80da25f080001ccaa4f23c03f2e/model/File.php#L72
> $this->date = new \DateTime("$date");
ты недаешь неправильно. Лучше сразу в функцию передавать DateTime, а не заниматься лишними преобразованиями.
Насчет MediaDataMapper.php, мне кажется слово Mapper тут не очень подходит, так как под Mapper обычно имеется в виду DataMapper , код которые сохраняет/загружает сущности из БД.
> if (!is_null($mediaData)) {
> foreach ($mediaData->getData() as $key => $value) :?>
Для if надо исплоьзовать тут тоже версию с двоеточием
> <img alt="Изображение" style="width:98%" src="/<?=$file->getFilePath()?>
Это плохо. Для превьюшки надо иметь картинку нужного разиера, а не выкачивать картинку 2000×2000 чтобы отобразить уменьшенной. Также, эти 98% надо убрать.
Картинку-превьюшку можно создавать в момет загрузки, можно в момент первого запроса к ней.
> $previewHeight = (int)(200 $previewHeight / $previewWidth);
Для округдения надо использовать ceil/floor/round
https://github.com/sqghub/uppu.ru/blob/master/templates/download.php#L38 — эту и другие длинные строчки, сделай более короткими, чтобы на гитхабе все отобрадалось без прокрутки. Обычно ограничивают строку 80-120 символами.
Насчет плееров, надо бы проверять как-то, поддерживает ли браузер нужный формат прежде чем выводить плеер. Иначе ты получишь неработающий плеер и удивленного пользователя.
У тебя все равно есть информация о кодеках, так что это наверно не должно быть проблемой? Плюс, яваскриптом (когда ты в нем разберешься на нужном уровне) можно проверить, поддерживает браузер тот или иной формат или нет с помощью метода canPlayType которые есть у audio/video. Если ты пока не знаешь, как это сделать, можно на потом оставить.
Вот полезная информация на эту тему:
https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats (англ)
https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Using_HTML5_audio_and_video (англ)
https://developer.mozilla.org/en-US/Apps/Build/Audio_and_video_delivery/Cross-browser_audio_basics (англ)
Ты используешь HTML5 audio/video, значит пользователи старых браузеров и старых ИЕ не смогут его увидеть. Ну да ладно, можно так и оставить, можно сделать фоллбек на использование флеша (старые браузеры проигнорируют теги audio и video и внутрь них можно поместить контент для них).
> https://github.com/sqghub/uppu.ru/blob/master/model/FileMapper.php#L40
Пользователю незачем знать технические подробности ошибки. Да и не очень понятно, зачем ловить там исключения, как я понимаю они могут произойти только при неправильном настроенном сервере (нет нужно папки или прав на запись в нее, или отвалилась база данных), то есть пользователь все равно ничего исправить не сможет.
https://github.com/sqghub/uppu.ru/blob/master/model/media/MediaDataMapper.php#L8
Вот так хранить данные не очень удобно. Представь, что тебе понадобится где-то иноформация о годе выхода, как ты будешь писать код?
$audioData->getData()['Год'] — так?
Представь что завтра тебе понадобится перевести сайт на несколько языков. Опять же, та же проблема.
Луше хранить в массиве идентификаторы вида
'releaseYear' => 2014
А отдельно иметь массив заголовоков, вроде
'releaseYear' => 'Год выхода'
Соответственно, нетрудно будет написать функцию, объединяющую их.
> https://github.com/sqghub/uppu.ru/blob/master/model/media/MediaDataMapper.php#L79
Если у тебя mediaData может быть null то ты, разумеется, везде, перед тем как что-то вызвать, проверяешь, что она не пустая? Альтернативой было бы создавать пустой объект MediaData, без информации о файле.
Ну и насчет формата хранения в БД, я совeтовал json из-за того, что он человекочитаем и что с ним можно работать из разных языков, то есть он поуниверсальнее чем serialize, который теоретически может меняться даже между версиями php (вроде такого не было, но кто их знает). Также, если ты отрефакторишь классы AudioData или поменяешь неймспейс, старые данные перестанут распаковываться так как там записано имя класса и полей в нем. Мне кажется, JSON понадежнее и удобнее для целей долговременного хранения.
Файл в utf-8, а где тег meta? Его нет.
> mb_internal_encoding('utf-8');
Это влияет только на работу mb_ функций. Браузер нужен либо meta либо заголовок Content-Type.
Я советую ставить в начало Content-Type, как ниже написано.
Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
header("Content-Type: text/plain; charset=utf-8");
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
поставил в начало <?php header('Content-type: text/plain; charset=utf-8'); ?>
в итоге первый массив построчный отображает нормально, а побуквенный со знаками вопросов
https://github.com/sqghub/uppu.ru/blob/master/create.sql#L13
Для Анонима лучше писать туда NULL, тогда например можно будет при переводе сайта писать на английской версии Anonymous.
Ок, понял. str_split не рабоатет с utf-8. Читай: https://gist.github.com/codedokode/ff99e357e9860ea169b8
Для разбиения на буквы можно использовать
$letters = preg_split("//u", $text, null, PREG_SPLIT_NO_EMPTY);
Это работает за счет того, что пустая регулярка соответствует промежуткам между буквами и разбивает по ним строку на буквы. Флаг в конце нужен чтобы удалить 2 пустых элемента в начале и конце массива.
> перед тем, как платить, надо проверять, сколько осталось долга, и если он меньше 5000, то платить только остаток и завершать цикл через break
Т.е. без учета комисси и процента? Типа, льгота от банка?
Нет! Ты сначала добавляешь процент и комиссию к долгую а только потом смотришь сколько осталось.
> 10 месяц спустя: долг = 7901.137927882 руб, выплачено всего 50000 руб.
> 11 месяц спустя: долг = 4138.1720657184 руб, выплачено всего 55000 руб.
> 12 месяц спустя: долг = 262.31722768997 руб, выплачено всего 60000 руб.
Лучше тогда уж задавать на условие не 5 кусков, а итоговую сумму с учетом всех налогов.
Перепиливаю для знакомых сайт на Joomla 2.5 .Что не могу понять.
Человек хочет страницу на своем сайте оформить как пикрелейтед 1
http://idealnajasvadba.ua/weddings .
То есть элементарно кликабельная картинка перенаправляющая на их свадьбу , но при наведении срабатывает hover анимация . Скопировав верстку и стили (пикрелейтед 2) и вставив их соответственно в модуль и css файл , я получаю нихуя.
Ткните меня носом в косяк пожалуйста.
Это какая то стандартная анимация джумлы?
Вообще как можно распознать что сайт работает на джумле или например, вордпрессе?
Ну попробуй
>>409997
Это ты неправильно скопировал код или там есть яваскрипт, которые реагирует на наведение.
>>410000
По идее можно указать
git config --global core.editor "d:/programs/sublime.exe"
(прямые слеши чтобы не было проблем при вводе). Но я не уверен что это сработает, так как git ждет завершения редактора, а sublime просто откроет новую вкладку и не завершится при ее закрытии.
Если бы в sublime была опция для запуска отдельной копии редактора, было бы хорошо.
Тема на userecho: http://sublimetext.userecho.com/topic/109164-add-new-instance-and-no-remembered-files-command-line-options/
Пока я могу посоветовать либо указать там notepad или лучше akelpad (его надо сначала установить, это сильно улучшенный Блокнот) либо указывать сообщение для коммита в командной строке:
git commit -m "Новый коммит"
Тогда редактор не запускается.
Почему в некоторых случаях мы пишем полный путь, а для notepad только название програмым? Потому что он ледит в PATH, прочитать про это можно в моем мини-гайде по командной строке: https://gist.github.com/codedokode/10539568
Ну попробуй
>>409997
Это ты неправильно скопировал код или там есть яваскрипт, которые реагирует на наведение.
>>410000
По идее можно указать
git config --global core.editor "d:/programs/sublime.exe"
(прямые слеши чтобы не было проблем при вводе). Но я не уверен что это сработает, так как git ждет завершения редактора, а sublime просто откроет новую вкладку и не завершится при ее закрытии.
Если бы в sublime была опция для запуска отдельной копии редактора, было бы хорошо.
Тема на userecho: http://sublimetext.userecho.com/topic/109164-add-new-instance-and-no-remembered-files-command-line-options/
Пока я могу посоветовать либо указать там notepad или лучше akelpad (его надо сначала установить, это сильно улучшенный Блокнот) либо указывать сообщение для коммита в командной строке:
git commit -m "Новый коммит"
Тогда редактор не запускается.
Почему в некоторых случаях мы пишем полный путь, а для notepad только название програмым? Потому что он ледит в PATH, прочитать про это можно в моем мини-гайде по командной строке: https://gist.github.com/codedokode/10539568
Попробую так в финальной версии уже сделать, счас пока на 1251 допилю. Мне плохо дается foreach со встроенным циклом/ами , есть где-либо подробное пояснение с примерами по многомерным массивам и множествам встроенных циклов? Я вот себе на листке схему рисую, вроде всё нормально, как начинаю это воплощать в код, сразу начинаю теряться.
Во-первых, надо помнить, как php выполняет программу. Он по умолчанию выполняет команды по очереди друг за другом, сверху вниз:
команда1;
команда2;
команда3;
Но когда у нас встречается ветвление (if/else) или цикл, этот порядок немного меняется, так как цикл может выполнять команды в своем теле по несклоько раз, или ни разу. То есть тут:
команда1;
for ($i = от одного до пяти) {
команда 2;
команда3;
}
команда4;
Команды 2 и 3 будут выполнены 5 раз.
Также надо понимать как работает цикл. Цикл foreach работает так:
....
foreach ($a as $i) { тело цикла; }
....
— сделать копию массива $a (на случай если ты попытаешься его менять в ходе выполнения цикла)
— взять из копии очередной элемент
— если элементов не осталось — цикл завершен, выходим из него и выполняем то, что идет после
— иначе, копируем значение этого элемента в переменную $i. Заметь что переменная $i содержит не элемент массива, а лишь копию значения. Меняя ее, ты в исходном массиве ничего не меняешь.
— выполняем тело цикла
— переходим к пункту «взять очередной элемент»
А что будет, если цикл вложен внутрь цикла? да ничего особенного, просто внутренний цикл будет выполнен несколько раз (так как он является частью тела внешнего цикла).
Могу мини-задачки дать на встроенные циклы:
1) (на for) дан массив чисел. Найди 2 самых близких друг к другу. Например, дан массив [10, 20, 100, 30, 40, 101] — самые близкие тут 100 и 101. Если таких пар несколько, то берем ту которая идет раньше. Для массива [100, 200, 101, 201] ответом будет 100, 101 так как 100 идет раньше чем 200.
Искать удобно как раз 2 циклами: берем все числа в массиве по очереди и сравниваем с каждым по очереди.
2) (на foreach) есть классные журналы по нескольким предметам, в нем записано в какой день кто получил какую оценку. Представь все оценки в виде многомерного массива и посчитай средний балл для каждого ученика и по кто отвечал в какой день. То есть:
Иванов: физика 4, математика 5
Петрова: физика 2, матеаматика 2
Сидорова: физика 5, математика 5
день 1: Иванов, Петрова
день 2: Иванов, Сидорова
день 3: Сидорова
Если что-то непонятно, задавай вопросы.
Во-первых, надо помнить, как php выполняет программу. Он по умолчанию выполняет команды по очереди друг за другом, сверху вниз:
команда1;
команда2;
команда3;
Но когда у нас встречается ветвление (if/else) или цикл, этот порядок немного меняется, так как цикл может выполнять команды в своем теле по несклоько раз, или ни разу. То есть тут:
команда1;
for ($i = от одного до пяти) {
команда 2;
команда3;
}
команда4;
Команды 2 и 3 будут выполнены 5 раз.
Также надо понимать как работает цикл. Цикл foreach работает так:
....
foreach ($a as $i) { тело цикла; }
....
— сделать копию массива $a (на случай если ты попытаешься его менять в ходе выполнения цикла)
— взять из копии очередной элемент
— если элементов не осталось — цикл завершен, выходим из него и выполняем то, что идет после
— иначе, копируем значение этого элемента в переменную $i. Заметь что переменная $i содержит не элемент массива, а лишь копию значения. Меняя ее, ты в исходном массиве ничего не меняешь.
— выполняем тело цикла
— переходим к пункту «взять очередной элемент»
А что будет, если цикл вложен внутрь цикла? да ничего особенного, просто внутренний цикл будет выполнен несколько раз (так как он является частью тела внешнего цикла).
Могу мини-задачки дать на встроенные циклы:
1) (на for) дан массив чисел. Найди 2 самых близких друг к другу. Например, дан массив [10, 20, 100, 30, 40, 101] — самые близкие тут 100 и 101. Если таких пар несколько, то берем ту которая идет раньше. Для массива [100, 200, 101, 201] ответом будет 100, 101 так как 100 идет раньше чем 200.
Искать удобно как раз 2 циклами: берем все числа в массиве по очереди и сравниваем с каждым по очереди.
2) (на foreach) есть классные журналы по нескольким предметам, в нем записано в какой день кто получил какую оценку. Представь все оценки в виде многомерного массива и посчитай средний балл для каждого ученика и по кто отвечал в какой день. То есть:
Иванов: физика 4, математика 5
Петрова: физика 2, матеаматика 2
Сидорова: физика 5, математика 5
день 1: Иванов, Петрова
день 2: Иванов, Сидорова
день 3: Сидорова
Если что-то непонятно, задавай вопросы.
Кстати, насчет поиска чисел, можно представить все возможные пары из чисел в виде таблицы, где по горизонтали и по вертикали записаны эти числа, а в клеточках - расстояние между ними:
http://ideone.com/Jbd5NK (медскиллз)
Соответственно, нам остается лишь обойти эти клеточки и найти там наименьшую цифру. Ну и при этом пропустить диагональ, так как число не может образовать пару с самим собой.
Заметь также, что таблица симметрична относительно диагонали. Достаточно обойти половину ее.
Строить саму таблицу как массив не надо.
>Лучше сразу в функцию передавать DateTime, а не заниматься лишними преобразованиями.
Да я как-то тоже об этом подумал уже.
>Насчет MediaDataMapper.php, мне кажется слово Mapper тут не очень подходит, так как под Mapper обычно имеется в виду DataMapper , код которые сохраняет/загружает сущности из БД.
Да, ты уже трижды это говорил. Но у меня нет идей как назвать.
>Картинку-превьюшку можно создавать в момет загрузки, можно в момент первого запроса к ней.
Первый запрос, в общем-то, происходит прямо после загрузки, так что можно сразу. Узнаю, как работать с изображениями - переделаю. И вывод будет проще, да.
>У тебя все равно есть информация о кодеках, так что это наверно не должно быть проблемой?
Хм, нет информации о кодеках.
>Плюс, яваскриптом (когда ты в нем разберешься на нужном уровне) можно проверить, поддерживает браузер тот или иной формат или нет с помощью метода canPlayType которые есть у audio/video.
Как-то именно этот вариант я и предполагал на будущее, так что сейчас не буду браться.
>можно сделать фоллбек на использование флеша
Флеш - грязь.
>Пользователю незачем знать технические подробности ошибки.
А пользователь ничего и не получает, только сообщение, что файл не сохранен. Должен же он хоть об этом узнать?
>Вот так хранить данные не очень удобно.
Да, об этом я тоже подумал и переделаю сегодня.
>А отдельно иметь массив заголовоков, вроде
И массив прямо константой класса сделать, наверное.
>Альтернативой было бы создавать пустой объект MediaData, без информации о файле.
Я просто когда начинал делать это, сделал MediaData - абстрактным классом, и как-то подзабыл, что могу использовать его со всеми is-audio/video/image=false и пустым массивом $data. Ну, это не долго убрать.
>Ну и насчет формата хранения в БД, я совeтовал json из-за того, что он человекочитаем и что с ним можно работать из разных языков
Но json восстанавливает из строки объект базового класса. Нужно в MediaDataMapper'е (или как там мы его обзовем) пилить функцию, которая из ассоциативного массива делает мне MediaData. К тому же json_encode не принимает private свойства (http://ideone.com/QIOiq7). Хотя и есть интерфейс JsonSerializable, реализация которого может исправить, я посчитал на тот момент, что проще схватить serialize. Но переделать обратно на json можно будет, да.
p.s. У меня переодически подтормаживает апач, отдает страницу секунд по 15. Даже пустую, mysql/php не при чем. В чем может быть проблема?
>Лучше сразу в функцию передавать DateTime, а не заниматься лишними преобразованиями.
Да я как-то тоже об этом подумал уже.
>Насчет MediaDataMapper.php, мне кажется слово Mapper тут не очень подходит, так как под Mapper обычно имеется в виду DataMapper , код которые сохраняет/загружает сущности из БД.
Да, ты уже трижды это говорил. Но у меня нет идей как назвать.
>Картинку-превьюшку можно создавать в момет загрузки, можно в момент первого запроса к ней.
Первый запрос, в общем-то, происходит прямо после загрузки, так что можно сразу. Узнаю, как работать с изображениями - переделаю. И вывод будет проще, да.
>У тебя все равно есть информация о кодеках, так что это наверно не должно быть проблемой?
Хм, нет информации о кодеках.
>Плюс, яваскриптом (когда ты в нем разберешься на нужном уровне) можно проверить, поддерживает браузер тот или иной формат или нет с помощью метода canPlayType которые есть у audio/video.
Как-то именно этот вариант я и предполагал на будущее, так что сейчас не буду браться.
>можно сделать фоллбек на использование флеша
Флеш - грязь.
>Пользователю незачем знать технические подробности ошибки.
А пользователь ничего и не получает, только сообщение, что файл не сохранен. Должен же он хоть об этом узнать?
>Вот так хранить данные не очень удобно.
Да, об этом я тоже подумал и переделаю сегодня.
>А отдельно иметь массив заголовоков, вроде
И массив прямо константой класса сделать, наверное.
>Альтернативой было бы создавать пустой объект MediaData, без информации о файле.
Я просто когда начинал делать это, сделал MediaData - абстрактным классом, и как-то подзабыл, что могу использовать его со всеми is-audio/video/image=false и пустым массивом $data. Ну, это не долго убрать.
>Ну и насчет формата хранения в БД, я совeтовал json из-за того, что он человекочитаем и что с ним можно работать из разных языков
Но json восстанавливает из строки объект базового класса. Нужно в MediaDataMapper'е (или как там мы его обзовем) пилить функцию, которая из ассоциативного массива делает мне MediaData. К тому же json_encode не принимает private свойства (http://ideone.com/QIOiq7). Хотя и есть интерфейс JsonSerializable, реализация которого может исправить, я посчитал на тот момент, что проще схватить serialize. Но переделать обратно на json можно будет, да.
p.s. У меня переодически подтормаживает апач, отдает страницу секунд по 15. Даже пустую, mysql/php не при чем. В чем может быть проблема?
Неудается подключить ключ.
Гуглил - советуют запустить перед этим, но я запускаю.
Всё ясно было аж до задач, когда попытался сделать саму задачу, у меня не выходит даже алгоритм в голове до конца сложить, чтобы по нему сделать задачу, я понимаю, что 2 числа будут самыми близки если их разница будет минимальной по модулю, через foreach взять первый элемент и сравнить их с 0,1,2... ключами, создать перед этим переменную которой изначально присвоить ноль, потом после сравнения первого элемента со вторым записать в эту переменную значение, и когда сравнивается дальше первый элемент с третьим в случае если эта разница будет меньше чем предыдущая - перезаписать переменную и перезаписать номер ключей, но как это выразить через foreach и встренный цикл я не понимаю
>создать перед этим переменную которой изначально присвоить ноль, потом после сравнения первого элемента со вторым записать в эту переменную значение
Запиши сразу разницу между первым и вторым.
>но как это выразить через foreach и встренный цикл я не понимаю
Ну так и гоняй. Взять каждый элемент, сравнить в цикле со всеми элементами, которые идут после него.
Похоже, но давай разберем очевидные недостатки.
Ты не только сравниваешь каждый раз число само с собой
>if ($def == 0)
> \t{
>\t\tcontinue;
>\t}
ты еще и сравниваешь числа по два раза. Сначала первое с пятым, а затем пятое с первым.
Подумай как решить эту проблему. Ну и я, честно говоря, не трогал здесь foreach, но я не знаю, что там за задача.
1) (на for) дан массив чисел. Найди 2 самых близких друг к другу. Например, дан массив [10, 20, 100, 30, 40, 101] — самые близкие тут 100 и 101. Если таких пар несколько, то берем ту которая идет раньше. Для массива [100, 200, 101, 201] ответом будет 100, 101 так как 100 идет раньше чем 200.
Вот такая строчка, если мы пишем
function foo (array Students) значит ли что функция foo принимает только массивы?
или это просто формальная запись примеров, и в настоящем коде так писать нельзя?
>function foo (array Students) значит ли что функция foo принимает только массивы?
Значит.
>или это просто формальная запись примеров, и в настоящем коде так писать нельзя?
http://php.net/manual/ru/language.oop5.typehinting.php
>>Насчет MediaDataMapper.php, мне кажется слово Mapper тут не очень подходит, так как под Mapper обычно имеется в виду DataMapper , код которые сохраняет/загружает сущности из БД.
> Да, ты уже трижды это говорил. Но у меня нет идей как назвать.
Гм. Действительно, непросто придумать варианты. MediaDataLoader, MediaDataParser, MediaDataReader, MediaDataDetector, MediaDataManager — вот что я смг придумать.
>>У тебя все равно есть информация о кодеках, так что это наверно не должно быть проблемой?
> Хм, нет информации о кодеках.
Есть, ее должна возвращать id3 для аудио- и видео-файлов. Можно заодно эту информацию на странице скачивания выводить.
> Флеш - грязь.
Флеш — инструмент.
>>Пользователю незачем знать технические подробности ошибки.
> А пользователь ничего и не получает, только сообщение, что файл не сохранен. Должен же он хоть об этом узнать?
Ладно, проверим потом.
> И массив прямо константой класса сделать, наверное.
Массив не может быть константой. Так что приватным статическим полем или функцией.
> Но json восстанавливает из строки объект базового класса.
Надо сделать функцию экспорта медиаданных в обычный массив и функцию восстановления. Сериализация объекта конечно проще и удобнее во многих случаях, но JSON в данном случае надежнее.
>Хотя и есть интерфейс JsonSerializable, реализация которого может исправить
Не слышал про такой. Раз он есть, то логично его использовать.
> p.s. У меня переодически подтормаживает апач, отдает страницу секунд по 15. Даже пустую, mysql/php не при чем. В чем может быть проблема?
Это только для PHP или для html, css файлов тоже такое наблюдается? В логах есть что-то? Это не нормально, значит что-то не так настроено.
>>Насчет MediaDataMapper.php, мне кажется слово Mapper тут не очень подходит, так как под Mapper обычно имеется в виду DataMapper , код которые сохраняет/загружает сущности из БД.
> Да, ты уже трижды это говорил. Но у меня нет идей как назвать.
Гм. Действительно, непросто придумать варианты. MediaDataLoader, MediaDataParser, MediaDataReader, MediaDataDetector, MediaDataManager — вот что я смг придумать.
>>У тебя все равно есть информация о кодеках, так что это наверно не должно быть проблемой?
> Хм, нет информации о кодеках.
Есть, ее должна возвращать id3 для аудио- и видео-файлов. Можно заодно эту информацию на странице скачивания выводить.
> Флеш - грязь.
Флеш — инструмент.
>>Пользователю незачем знать технические подробности ошибки.
> А пользователь ничего и не получает, только сообщение, что файл не сохранен. Должен же он хоть об этом узнать?
Ладно, проверим потом.
> И массив прямо константой класса сделать, наверное.
Массив не может быть константой. Так что приватным статическим полем или функцией.
> Но json восстанавливает из строки объект базового класса.
Надо сделать функцию экспорта медиаданных в обычный массив и функцию восстановления. Сериализация объекта конечно проще и удобнее во многих случаях, но JSON в данном случае надежнее.
>Хотя и есть интерфейс JsonSerializable, реализация которого может исправить
Не слышал про такой. Раз он есть, то логично его использовать.
> p.s. У меня переодически подтормаживает апач, отдает страницу секунд по 15. Даже пустую, mysql/php не при чем. В чем может быть проблема?
Это только для PHP или для html, css файлов тоже такое наблюдается? В логах есть что-то? Это не нормально, значит что-то не так настроено.
Смотри, ты немного не так сделал. Что делает ssh-agent -s? Он запускает агента и выводит на экран команды установки переменных окружения. Зачем он их выводит? Какой смысл?
Смысл в том что ты можешь выполнить эти команды и в оболочке выставятся нужные значения переменных, которые передаются во все запускаемые программы, и с помощью которых эти программы могут связаться с агентом.
Например, команда ssh-add сможет связаться с агентом и добавить в него ключ. Команда git сможет связаться с агентом и получить данные для аутентификации.
Естественно, руками вводить команды не надо. Надо просто набрать
eval `ssh-agent -s`
Если макаба съела символы, то там идет eval (косая кавычка) ssh-agent -s (косая кавычка)
косые кавычки выполняют команду и сохраняют то, что она выведет, и передают это функции eval. eval выполняет переданный ей код, то есть создает для этой сессии переменные окружения.
Также, ssh-agent можно испльзовать по-другому.
Можно набрать
ssh-agent bash
Тогда ssh-agent запустится, создаст переменные и запустит командную оболочку bash в которой эти переменные выставлены и доступны всем программам.
Ты можешь спросить, почему так запутанно? дело в том, что переменные окружения передаются только от родителей детям. Дочерняя программа никак не может поменять переменные окружения в родителе. Потому нам надо выставить их именно в bash, чтобы они пердавались всем запущенным детям.
И еще, зачем нужен ssh-agent. Он нужен для того, чтобы ты один раз вводил пароль от приватного ключа (агент им расшифроывает ключ и после этого подписывает аутентификационные данные от других программ). Без агента пароль придется вводить каждый раз заново.
Вот еще советы по использованию агента. Можно прописать его в bashrc чтобы он запускался автоматически при открытии консоли и добавлял ключи:
http://stackoverflow.com/a/15870387 (это для msysgit)
https://help.github.com/articles/working-with-ssh-key-passphrases/#auto-launching-ssh-agent-on-msysgit (написано что это более правильный скрипт)
Имей в виду что тебе придется вводить пароль при запуске консоли. Если не хочешь, убери из скрипта команду ssh-add.
Смотри, ты немного не так сделал. Что делает ssh-agent -s? Он запускает агента и выводит на экран команды установки переменных окружения. Зачем он их выводит? Какой смысл?
Смысл в том что ты можешь выполнить эти команды и в оболочке выставятся нужные значения переменных, которые передаются во все запускаемые программы, и с помощью которых эти программы могут связаться с агентом.
Например, команда ssh-add сможет связаться с агентом и добавить в него ключ. Команда git сможет связаться с агентом и получить данные для аутентификации.
Естественно, руками вводить команды не надо. Надо просто набрать
eval `ssh-agent -s`
Если макаба съела символы, то там идет eval (косая кавычка) ssh-agent -s (косая кавычка)
косые кавычки выполняют команду и сохраняют то, что она выведет, и передают это функции eval. eval выполняет переданный ей код, то есть создает для этой сессии переменные окружения.
Также, ssh-agent можно испльзовать по-другому.
Можно набрать
ssh-agent bash
Тогда ssh-agent запустится, создаст переменные и запустит командную оболочку bash в которой эти переменные выставлены и доступны всем программам.
Ты можешь спросить, почему так запутанно? дело в том, что переменные окружения передаются только от родителей детям. Дочерняя программа никак не может поменять переменные окружения в родителе. Потому нам надо выставить их именно в bash, чтобы они пердавались всем запущенным детям.
И еще, зачем нужен ssh-agent. Он нужен для того, чтобы ты один раз вводил пароль от приватного ключа (агент им расшифроывает ключ и после этого подписывает аутентификационные данные от других программ). Без агента пароль придется вводить каждый раз заново.
Вот еще советы по использованию агента. Можно прописать его в bashrc чтобы он запускался автоматически при открытии консоли и добавлял ключи:
http://stackoverflow.com/a/15870387 (это для msysgit)
https://help.github.com/articles/working-with-ssh-key-passphrases/#auto-launching-ssh-agent-on-msysgit (написано что это более правильный скрипт)
Имей в виду что тебе придется вводить пароль при запуске консоли. Если не хочешь, убери из скрипта команду ssh-add.
>Есть, ее должна возвращать id3 для аудио- и видео-файлов. Можно заодно эту информацию на странице скачивания выводить.
Я думал ты об информации о кодеках пользователя.
>Массив не может быть константой. Так что приватным статическим полем или функцией.
Уже обнаружил. Ни статические поля, ни функции мне не понравились, поэтому я просто вынес локализацию в отдельный файл. В общем-то оно работает, но я сразу взялся за переделку в json, так что там сейчас ничего не должно работать, потому не залил на гитхаб.
>Это только для PHP или для html, css файлов тоже такое наблюдается?
Для всего.
>В логах есть что-то?
Я даже не знаю, что искать. Но покапаюсь позже.
Еще добавлю насчет «флеш - грязь».
Представь, что есть пользователь с не поддерживающим HTML 5 video браузером. Что он предпочтет - отобразить видео иногда глючным и тормозящим флешем, или вообще остаться без видео?
Так что пока наберись терпения, флеш уже умер и скоро исчезнет сам по себе. Убил его по-видимому закрытый код, так как производители устройств, например, мобильных не могут контролировать потребление им ресурсов и исправлять баги.
>>410046
Ты в правильном направлении думаешь.
цикл ($i по всему массиву) {
цикл ($j по всему массиву) {
получаем все возможные комбинации $i и $j здесь;
}
}
>>410051
Тут есть способ хитрее. Чтобы не перебирать каждую пару 2 раза (3-й + 7-й или 7-й + 3-й = одна и та же пара) и не перебирать пары элемента с самим собой (3-й + 3й) можно начинать внутренний цикл не с нуля, а с текущего индекса в первом цикле ($i из примеры выше).
> if ($def == 0)
Это не очень правльный код так как могут быть 2 одинаковых числа, которые годятся на звание самой близкой пары.
>>410060
да, это тайп хинт и он делает код понятнее и надежнее. Используй его везде где можно.
>>410063
Это из задач для понимания вложенных циклов и многомерных массивов, которые я дал анону. Если ты плохо понимаешь какую-то тему, я могу дать задачи на нее, только объясни чтобы было понятно что ты понимаешь, а что не очень.
Еще добавлю насчет «флеш - грязь».
Представь, что есть пользователь с не поддерживающим HTML 5 video браузером. Что он предпочтет - отобразить видео иногда глючным и тормозящим флешем, или вообще остаться без видео?
Так что пока наберись терпения, флеш уже умер и скоро исчезнет сам по себе. Убил его по-видимому закрытый код, так как производители устройств, например, мобильных не могут контролировать потребление им ресурсов и исправлять баги.
>>410046
Ты в правильном направлении думаешь.
цикл ($i по всему массиву) {
цикл ($j по всему массиву) {
получаем все возможные комбинации $i и $j здесь;
}
}
>>410051
Тут есть способ хитрее. Чтобы не перебирать каждую пару 2 раза (3-й + 7-й или 7-й + 3-й = одна и та же пара) и не перебирать пары элемента с самим собой (3-й + 3й) можно начинать внутренний цикл не с нуля, а с текущего индекса в первом цикле ($i из примеры выше).
> if ($def == 0)
Это не очень правльный код так как могут быть 2 одинаковых числа, которые годятся на звание самой близкой пары.
>>410060
да, это тайп хинт и он делает код понятнее и надежнее. Используй его везде где можно.
>>410063
Это из задач для понимания вложенных циклов и многомерных массивов, которые я дал анону. Если ты плохо понимаешь какую-то тему, я могу дать задачи на нее, только объясни чтобы было понятно что ты понимаешь, а что не очень.
>Так что пока наберись терпения, флеш уже умер и скоро исчезнет сам по себе.
Жду этого с того дня, как впервые увидел сайт, сделанный полностью на флеше.
http://ideone.com/bHj13u
> поэтому я просто вынес локализацию в отдельный файл.
ой-ой, по моему это уже оверинжиниринг, отдельный файл.
Кстати, если тебе интересна тема локализации/интернационализации, мы можем сделать это дополнительным пунктом в задаче. Но делать тогда ее надо не велосипедами, а используя нормальные решения:
— расширение gettext, котрое умеет эффективно загружать переводы из mo-файлов (для их создания и редактирования есть готовые программы, например poedit): http://php.net/manual/ru/book.gettext.php
gettext используется например, для локализации программ в линуксе и многих других свободных программ. Для редактирования mo/po файлов есть готовые программы. Не стоит изобретать свой велосипед с хранением текста в файлах своего формата.
— замечательное расширение Intl, которое умеет сравнивать строки по алфавиту (с учетом нац. особенностей), форматировать суммы денег, числа, работать с календарем, делать подстановки вроде «You have {count} {ruble|rubles}»: http://php.net/manual/ru/book.intl.php
Если ты хочешь разобраться в этой теме, можешь попробовать сделать перевод всего сайта на английский (или любой другой) язык. Мне кажется, это интересная задача, со своими подвохами. ну и заодно сможешь говорить, что разбираешься в этой теме.
Переключение должно делаться какой-нибудь кнопочкой в меню, страницы на разных языках должны иметь разные URL, запоминать предпочтения при выборе можно в куках. То есть неуправляемых автоматических редиректов быть не должно, но можно например при первом заходе из английского браузера на главную выводить подсказку «не хотите ли переключиться на английскую версию?» сверху.
Пока что я еще не разобрался Гитом, по этому код на ideone.
Правильно ли использован DataMapper? Меня смущает предпоследняя строка.
ОП, ты был прав. Времени уйдет больше, чем сегодня завтра. Я только сохранения переделал, а еще надо проверять поля на корректность + поиск и пагинацию делать. Как их реализовать идей нет вообще пока-что.
У меня цель с нового года найти работу, надеюсь - смогу.
Алсо, а ты случайно не знаешь, где можно почитать понятным языком про принципы SOLID?
погугли по словам apache slow, apache slow windows, есть такие советы:
http://serverfault.com/a/349618
http://stackoverflow.com/a/7553256
>>410077
Современные сайты ненамного лучше. Ты берешь Хром 2-3 летней давности (почему? а почему бы и нет), и в части из них разваливается верстка, в части вообще не отображется из-за яваскрипт или других ошибок. И это вполне современные сайты, сделанные современными разработчиками, перечитавшимися хабра или блогов. По моему, веб всегда таким и был, люди не хотят изучать технологии как следует.
>>410079
Да, понять обозначают переменные действительно трудно. Подймай как избежать проверки каждоый пары чисел по 2 раза.
>Подймай как избежать проверки каждоый пары чисел по 2 раза
Так ты уже заспойлерил выше. А насчет переменных, это да, фантазия у меня хромает, да и я не стал заморачиваться.
Не знаю. Попробуй погуглить, может на хабре что есть.
> $STH = $STH->execute($student);
Это не очень надежно, так как во-первых, поля могут не все быть для сохранения в базу, во-вторых, дату/время удобнее хранить таймспампом или DateTime и надо преобразовывать при сохранеиее/загрузке из БД.
> Как их реализовать идей нет вообще пока-что.
Ну как дойдешь, попроси подсказку, я подскажу.Пагинация делается за счет конструкции LIMIT в SQL-запросе, с поиском придется поднапрячься, но я думаю можно через OR/LIKE сделать.
Если ты слабо знаешь SQL, могу посоветовать задачки: https://gist.github.com/codedokode/10539213
> Правильно ли использован DataMapper?
Вроде да.
> public function __construct(Array $student) {
А вот это сомнительное место. У тебя надо передать массив со всеми полями. Но это не всегда удобно, иногда хочется написать напрмер
$student = new Student( );
$student->name = ...;
$student->....
Своим требованием обязательно передать все поля в конструктор ты делаешь исплоьзование класса менее удобным. Для загрузки данных их массива можно сделать отдельный метод вроде setAttributes(array $values)
Не ставь ?> в конце, если ты после нее забудешь пробел, то сессии, отправка кук и заголовки могут перестать работать.
>ой-ой, по моему это уже оверинжиниринг, отдельный файл.
Да ладно, наоборот самое простое, что я смог придумать.
>Кстати, если тебе интересна тема локализации/интернационализации
Пока что совсем не интересна. Есть куча всего другого же. А интернациональные приложения мне пока что не светят.
Я там обновил гитхаб. Пока что думаю над превью.
>современные сайты, сделанные современными разработчиками, перечитавшимися хабра или блогов
Так может в этом и проблема?
>По моему, веб всегда таким и был, люди не хотят изучать технологии как следует.
Пока нет нужды и не будут.
> $k = 0;
> do {
....
> \t$k++;\t
> } while ($k < $i);
Это то же самое что for только написанное более запутанно. Удали это и напиши for вместо этого.
А так да, проверка на k < i вполне годится.
Ну и код выровняй нормально, тяжело понять где какой цикл заканчивается.
Вот нормальные имена:
$lastValue1, $lastValue2 -> можно сделать массив $pair или $bestPair или $closestPair
$lastDef -> $minDiff
$def -> $diff (difference = разница)
$mass -> $array, $input
«mass» не годится так как по английски это значит «масса» и именно так воспринимается.
Спасибо. Погуглю на счет преобразования в DataTime.
Про лимит я знаю, но спасибо.
Кстати, твой гит у меня в закладках.
То есть в конструкторе передавать отдельное поле по отдельности, а для заполнения из массива сделать отдельную функцию? А разве в данном случае есть смысл? Мне в любом случае надо, что бы юзер ввел все поля, иначе кердык.
> include
Лучше писать require так как он упадет с фатальной ошибкой при отсутсвии файла, а include нет.
> require 'vendor/autoload.php';
Тут лучше писать require_once. Вдруг тебе самому понадобится подключить index.php из другого скрипта где уже делалоь это require.
> $data = array('appName' => $app->getName());
Это можно не копипастить, а выставить один раз через view->set или как-то так, в документации этого нет, потому почитай исходники Слима: https://github.com/codeguy/Slim/blob/master/Slim/View.php
> https://github.com/sqghub/uppu.ru/blob/master/index.php#L82
Если GET-параметра нет, будет ошибка.
> https://github.com/sqghub/uppu.ru/blob/master/index.php#L88
Тут это подойдет, но вообще имей в виду, что валидацию (проверку правильности заполнения форм например) лучше делать не исключениями, а отдельным методом — так код получается более явным. Хотя, питонщики например любят для этой цели писать исключения. Там даже был холивор на хабре по этому поводу.
Папка для хранения файлов не в гите. Почему так? Учти, что саму папку закоммитить нельзя, коммитить можно только файлы. чтобы закоммитить пустую папку. в нее кладут файл .placeholder и коммитят его.
https://github.com/sqghub/uppu.ru/blob/master/static/MediaLocalization.php
Я думал папка static для статики в смысле «css, js». Не надо сюда php класть. Клади тоже в Models. Ну и лучше просто сделать функцию в mediaData которая вернет этот массив, и вторую, которая объединит его с медиаданными и вернет результат. Тогда в шаблоне ты будешь писать
foreach ($file->getMediaData()->getSomething() as $title => $value)
> last.php
> search.php
Тут копипаста кода вывода таблицы по моему. Общий код надо выносить например в папочку partial и инклудить.
Не ставь ?> в конце файлов. За ним легко забыть пробел.
https://github.com/sqghub/uppu.ru/blob/master/model/config.php#L2
namespace тут не нужен
https://github.com/sqghub/uppu.ru/blob/master/model/Searcher.php#L14
порт надо в конфиг
> $this->pdo = new \PDO($dsn);
Лучше оформить это как синглтон sphinxQl в слиме.
https://github.com/sqghub/uppu.ru/blob/master/model/FileMapper.php#L59
Это непраивльно. Надо хранить число байт, а не его представление в виде строки.
> new \DateTime("now")
now можно не писать в этом случае, просто new \DateTime()
https://github.com/sqghub/uppu.ru/blob/master/model/CommentMapper.php#L18
Таки строчки надо писать вертикально, с отступом.
https://github.com/sqghub/uppu.ru/blob/master/model/CommentMapper.php#L35
Непраивльно что переменная может быть, а может не быть. Конструкций типа isset(переменная) не должно быть в коде. Просто присвой comments пустой массив в начале функции.
https://github.com/sqghub/uppu.ru/blob/master/model/CommentMapper.php#L42
Здесь не хватает return
> getCommentFromPost
лучше назвать функцию createCommentFromArray, или сделать у comment метод setAttributes(array $attrs) который позволяет любым элементам отстутвовамть:
$comment = new Comment( );
$comment->setAttributes($_POST);
if ($commentMapper->validate($comment)) {
$commentMapper->save($comment);
}
Но при таком подходе кроется возможность сделать ошибку. Допустим у нас в комментарии есть поле isAdminComment, которое подсвечивает его красным цветом. Злоумышленник тогда может выставить этот флаг через POST. Конечно, у тебя в приложении нет уязвимости, но если так писать везде то легко можно забыть сделать фильтрацию значений.
Именно такая ошибка была в очень многих Ruby on Rails приложениях, и некто Егор Хомяков через нее, по моему, смог взломать гитхаб пару лет назад: http://habrahabr.ru/post/139399/ (кстати хороший аргумент тем кто говорит что php плохой и дырявый, а руби хороший и надежный).
> include
Лучше писать require так как он упадет с фатальной ошибкой при отсутсвии файла, а include нет.
> require 'vendor/autoload.php';
Тут лучше писать require_once. Вдруг тебе самому понадобится подключить index.php из другого скрипта где уже делалоь это require.
> $data = array('appName' => $app->getName());
Это можно не копипастить, а выставить один раз через view->set или как-то так, в документации этого нет, потому почитай исходники Слима: https://github.com/codeguy/Slim/blob/master/Slim/View.php
> https://github.com/sqghub/uppu.ru/blob/master/index.php#L82
Если GET-параметра нет, будет ошибка.
> https://github.com/sqghub/uppu.ru/blob/master/index.php#L88
Тут это подойдет, но вообще имей в виду, что валидацию (проверку правильности заполнения форм например) лучше делать не исключениями, а отдельным методом — так код получается более явным. Хотя, питонщики например любят для этой цели писать исключения. Там даже был холивор на хабре по этому поводу.
Папка для хранения файлов не в гите. Почему так? Учти, что саму папку закоммитить нельзя, коммитить можно только файлы. чтобы закоммитить пустую папку. в нее кладут файл .placeholder и коммитят его.
https://github.com/sqghub/uppu.ru/blob/master/static/MediaLocalization.php
Я думал папка static для статики в смысле «css, js». Не надо сюда php класть. Клади тоже в Models. Ну и лучше просто сделать функцию в mediaData которая вернет этот массив, и вторую, которая объединит его с медиаданными и вернет результат. Тогда в шаблоне ты будешь писать
foreach ($file->getMediaData()->getSomething() as $title => $value)
> last.php
> search.php
Тут копипаста кода вывода таблицы по моему. Общий код надо выносить например в папочку partial и инклудить.
Не ставь ?> в конце файлов. За ним легко забыть пробел.
https://github.com/sqghub/uppu.ru/blob/master/model/config.php#L2
namespace тут не нужен
https://github.com/sqghub/uppu.ru/blob/master/model/Searcher.php#L14
порт надо в конфиг
> $this->pdo = new \PDO($dsn);
Лучше оформить это как синглтон sphinxQl в слиме.
https://github.com/sqghub/uppu.ru/blob/master/model/FileMapper.php#L59
Это непраивльно. Надо хранить число байт, а не его представление в виде строки.
> new \DateTime("now")
now можно не писать в этом случае, просто new \DateTime()
https://github.com/sqghub/uppu.ru/blob/master/model/CommentMapper.php#L18
Таки строчки надо писать вертикально, с отступом.
https://github.com/sqghub/uppu.ru/blob/master/model/CommentMapper.php#L35
Непраивльно что переменная может быть, а может не быть. Конструкций типа isset(переменная) не должно быть в коде. Просто присвой comments пустой массив в начале функции.
https://github.com/sqghub/uppu.ru/blob/master/model/CommentMapper.php#L42
Здесь не хватает return
> getCommentFromPost
лучше назвать функцию createCommentFromArray, или сделать у comment метод setAttributes(array $attrs) который позволяет любым элементам отстутвовамть:
$comment = new Comment( );
$comment->setAttributes($_POST);
if ($commentMapper->validate($comment)) {
$commentMapper->save($comment);
}
Но при таком подходе кроется возможность сделать ошибку. Допустим у нас в комментарии есть поле isAdminComment, которое подсвечивает его красным цветом. Злоумышленник тогда может выставить этот флаг через POST. Конечно, у тебя в приложении нет уязвимости, но если так писать везде то легко можно забыть сделать фильтрацию значений.
Именно такая ошибка была в очень многих Ruby on Rails приложениях, и некто Егор Хомяков через нее, по моему, смог взломать гитхаб пару лет назад: http://habrahabr.ru/post/139399/ (кстати хороший аргумент тем кто говорит что php плохой и дырявый, а руби хороший и надежный).
> То есть в конструкторе передавать отдельное поле по отдельности, а для заполнения из массива сделать отдельную функцию?
Конструктор лучше вробще пустым сделать.
> Мне в любом случае надо, что бы юзер ввел все поля, иначе кердык.
Это пока. А завтра тебе понадобится добавлять данные из какого-нибудь другого источника или еще что-нибудь. Просто принято делать либо через неоьязательный массив в конструкторе либо через отдельный метод.
>>410116
Все верно.
Задрачиваю html и php пока не успеваю по времени, а время поджимает.
Не хочу идти на фриланс, скину деньгу на телефон или кошелек, куда вам удобнее.
Само задание:
Разработайте функцию, выводящую в удобочитаемой форме содержимое переменной или массива – в зависимости от того, переменная или массив поданы на вход.
Разработайте функцию, возвращающую индекс элемента из массива многократной вложенности (если элемент находится на первом уровне - выводится один индекс, на втором уровне - два индекса (от верхнего и первого вложенного массива), на третьем - три, и так далее).
Я специально написал косые кавычки. Не одинарные, а косые, над клавишей Tab. Тбея самого не удивляет, что код с переменными вывелся. а не выполнился?
А, слушай, исправь-ка еще CSRF уязвимость в постинге комментов. По моему у тебя можно постить комменты от чужого IP если заманить польозователя на страницу с самоотправляющейся формой.
Заодно добавь валидацию типа комментарий должен быть не пустым, что parentId существует и принадлежит тому же файлу, и т.д. на стороне сервера. Решето же какое-то получается.
Исправить желательно так, чтобы другие формы (если они будут) легко бы защищались.
Благодарю, скинь на фейкопочту anonas1@yandex.ru свой номер или кошелек, скину копейку.
Ну и было бы приятно сотрудничать дальше, т.к. это не последнее, что мне нужно.
И такой вопрос, что мне нужно выучить, чтобы самому решить это задание?
Пройди задания ОП-а и все сможешь сам сделать. Алсо, ты уже постил эти задания где-то, я тебе еще ответ на первый вопрос сделал.
Наркоман, поиск в офф мануале и ищет функции. Или там есть какой-то другой поиск, который ищет не функции?
А хотя действительно есть, я долбоёб.
>Папка для хранения файлов не в гите. Почему так? Учти, что саму папку закоммитить нельзя, коммитить можно только файлы. чтобы закоммитить пустую папку. в нее кладут файл .placeholder и коммитят его.
Если я залью её, а потом добавлю в .gitignore, она же не будет обновляться?
>Ну и лучше просто сделать функцию в mediaData
Сделаю.
>порт надо в конфиг
У меня там какая-то беда с портами. Апи работает по одному (и берет его из конфига), а pdo не соединяется, но получается по другому.
>Лучше оформить это как синглтон sphinxQl в слиме.
QI - что значит?
>Здесь не хватает return
Не, здесь функция лишняя. Я не нашел, где вызываю её. Ну пусть пока живет.
>лучше назвать функцию createCommentFromArray, или сделать у comment метод setAttributes(array $attrs) который позволяет любым элементам отстутвовамть:
В моем случае и так могут отсутствовать элементы. Но переименовать функцию не трудно.
>Допустим у нас в комментарии есть поле isAdminComment, которое подсвечивает его красным цветом.
Тогда бы я этот флаг брал бы не из поста, очевидно.
>Благодарю, скинь на фейкопочту anonas1@yandex.ru свой номер или кошелек, скину копейку.
Забудь.
>И такой вопрос, что мне нужно выучить, чтобы самому решить это задание?
Да ничего. Это и без всяких понтов с генераторами можно было сделать, а тогда надо лишь понимать, что такое массив и что такое рекурсия.
Еблан потому что я, выше написал же, что времени не хватает.
пхп нас не учат, а на втором занятии дали эти задания и учите сами как хотите, я и подзабил на время, а сессия то подходит.
Да и зачет будет, лекций и пары лаб хватит, а пхп и так учить хочу.
Такие дела.
http://archive-ipq-co.narod.ru/ этого хватит, чтобы уметь писать такие задачки?
>http://archive-ipq-co.narod.ru/ этого хватит, чтобы уметь писать такие задачки?
Этого хватит и на большее.
Думаю ответ на этот вопрос дать невозможно.
>Если я залью её, а потом добавлю в .gitignore, она же не будет обновляться?
Разобрался. В в .gitignore прописал userFiles//
Создать один из них. .bashrc например (проверить работает ли он можно написав в нем echo "Hello" и запустив новую консоль с bash)
Увидеть путь к домашней директории можно с помощью команды echo $HOME если что
>>410157
А зачем ей обновляться? Алсо, в gitignore можно добавлять исключения с помощью !
> порты
Да, там 2 порта. Как иначе сфинкс поймет по какому протоколу ты хочешь общаться? Один порт работает на сфинксовом протоколе, другой на MySQL-совместимом. Эти порты задаются в конфиге сфинкса.
> QI - что значит?
SphinxQl = Sphinx Query Language я думаю, отсылка к SQL. Так называется MySQL -совместимый протокол в документации по сфинксу: http://habrahabr.ru/company/sphinx/blog/61222/
> Ну пусть пока живет.
Почему не удалишь? В гите код останется все равно.
>>410161
от 2 до 12 недель.
чуствую препод про yield впервые услышит
не работает, фух.
мне нужно проверять вроде:
if ($mass[0] == $reg0) {}
if ($mass[1] == $reg1) {}
...
if ($mass[n] == $regN) {}
или есть другой способ, проще?
Хотя нет, это я спизданул не подумав, у тебя же разные переменные.
[code]
$values = array(1, 2, 3);
$pattern = array(3, 3, 3);
$handler = array('func1', 'func2', 'func3');
foreach ($values as $key => $value) {
if ($value == $pattern[$key]) {
call_user_func($handler[$key]);
}
}
[/code]
уж проще будет через if
http://ideone.com/YPWx7i
Пишу по большей части высоконагруженные серверные приложения разного рода, бекэнды со сложной бизнес-логикой. Из технологий плотно работаю с mysql, sphinx, rabbitmq, memcached, еще с огромной кучей знаком поверхностно.
Отвечу на вопросы новичков по php коду, БД, технологиям.
И что там непонятно то? Ты выплачиваешь меньшее из "сколько могу" и "сколько осталось платить".
Выбирает меньшее из того, что сможет заплатить анон и оставшейся суммой кредита. Если кредит все еще больше 5к, то функция выберет 5к, если меньше, то функция выберет оставшуюся сумму, дабы не переплачивать.
Мне норм, я не в ДС живу. У нас тут цивильно более-менее. Недавно вот ездил в ДС на конференцию по разработке, кстати, и думаю, что если бы жил там - то мечтал бы о тракторе.
А ты что, хочешь жить в Тайланде и верстать гостевухи за еду по удалёнке? Я не видел, чтобы во фрилансе бывали сложные и интересные задачи, одно говно, которым заниматься ну просто зашквар белому человеку.
>>410211
Деанон же, тут половина разрабов из моей конторы двачует. Трактор пока не пробовал, образование еще не закончено.
Вообще, я пришёл обсуждать код и технологии, а не себя или тракторы.
Так что пилите вопросы, если у кого есть, отвечу завтра.
Тут вряд-ли есть с кем обсудить, 90% треда еще полные нубы, может два-три человека файлообменник осилили.
Самоучка? Вышку пошел получать уже работая? Хотя бы количество лет опыта назови, лол.
Алсо, какие перспективы у пыхи? Какие технологии будут актуальны через 5 лет? Какая часть логики переедет на фронт?
Как к успеху пришел? Какое образование?
Окей, накидай список актуальных тем/технологий по php которые стоит задрачивать/смотреть/изучать, можешь даже ссылки привести, а то книги - одно старое говно, а блогам всяких васей пупкиных я не доверяю. Сейчас учу английский и собираюсь перекатываться на ubuntu и учиться настраивать все ручками(пока в учебных целях использую open server).
А я думал, что я ленивый, лол.
Короче, проходил по верхам несколько самоучителей, дошел и заинтересовался базами данных, но мускул на компе чета не работает. Регнулся на бесплатном хосте, у них майсокл прям на сайте - думаю, удобно прямо там бд создавать и отрабатывать, не навернется. Пока что прохожу (и повторяю) более подробный учебник по пхп. Установил денвер (хоспаде, как хорошо, что его кто-то сделал и мне не пришлось все самостоятельно настраивать - это просто ад). Такие дела.
http://www.slideshare.net/jsmith92/unsung-heroes-of-php
Лучше бы http://www.wampserver.com/ru/ или любой другой современный wamp заместо денвера.
А вообще, в первый раз лучше самому настраивать, чтобы понимать как это вообще вместе работает, потратишь побольше времени, зато в будущем окупится. У ОПа даже гайдик простой где-то есть.
А старое можно оставить для совместимости и потихоньку избавляться.
схоронил
Учтите, что жто сборник рецепотов то есть книга ориентированная на тех, кто уже неплохо знает SQL. Я кстати, не люблю сборники рецептов.
>>410301
Ну есть функция filter_var, ее можно иногда использовать и по моему она не стоит того чтобы занять половину презентации.
На 37 слайде ненадежный код, забыли htmlspecialchars ну и substr + strpos плохо читаемый и ненадежный код напоминает, я бы регуляркой сделал.
Так, начинабщим может быть полезно это изучить, главное не совать потом эти итераторы везде.
да это не так принципиально по моему. Ну есть mb_strlen($s) вместо $s->length() и что? Тебе это код писать мешает? Если тебе хочется писать как на Питоне/руби, может на них и писать?
У бесплатных хостингов обычно запрещен доступ к MySQL извне, то есть скрипт надо запускать там же. Удобнее поставить MySQL себе на комп. Информация по Апачу/MySQL: https://gist.github.com/codedokode/10774100
http://ideone.com/cZx3m8
Не знаю как отформатировать текст так же но без использования таблицы
http://ideone.com/Ietb32
Я имею ввиду насчет класса мышек, весь остальной код я уже ранее скидывал.
PHP-синьер с 5 летним опытом репортинг ин.
Если коротко, я ненавижу симфони 2 и то, во что превратился похапе за последние пару лет.
Вот нахуя все так усложнять? Зачем пиздеть про охуенность юнит-тестов и функциональных, если блять все равно НИКТО ИХ НЕ ПИШЕТ, ПОКРЫТИЕ БЛЯТЬ 25%, ЧТО ЭТО ТАКОЕ НАХУЙ? КАКОЙ СМЫСЛ БЛЯТЬ В ЭТОМ?
Tdd дало бы 100% покрытие, ко-ко-ко - ага блять, только НИКТО ЕГО БЛЯТЬ НЕ ПРАКТИКУЕТ, ВСЕ ТОЛЬКО ЛЮБЯТ ПИЗДЕТЬ О НЕМ С УМНЫМ ВИДОМ В КУРИЛКЕ.
Симфони, ко-ко-композер, SOLID - да нахуй идите. Депенденси инжекшон, уменьшает связность, ко-ко-ко - да похуй на эту связность, вот чем она тебе мешает? Проще тестировать, ко-ко-ко - ТАК ТЫ ЖУЕБА ЖЕ НЕ ТЕСТИРУЕШЬ СУКА, 25% БЛЯТЬ ПОКРЫТИЕ! А все что не равно 100% фактически блять 0, так как все равно нужно прокликивать, перекликивать или гуи-тесты писать тестировщику.
На практике тесты на всех проектах где я работал не отловили ни одного бага, только при смене кода ломаются постоянно, чем вообще сводят на нет даже мизерную от них пользу. "Тесты ломаются, это ты знач дибил))) нада нормально тесты писать)))". Так хули ты (ты блять, ты) нормально их не пишешь? И никто блять не пишет их нормально, да и вообще никак, какая-то сплошная имитация блять, лишь бы было куда время зарепортить лишнее.
На больших проектах заебешься ко-ко-ко - а нахуй на php большие проекты? Нужен тебе тырпрайз - бери си-решетка/джава макак, они там напиздячат по всем канонам абстрактных заводов одиночных фасолин. Или кто-то и правда считает, что PHP-макака, нормально знающая симфони 2, практикующая TDD и такая вся пиздая будет стоить дешевле сравнимого по скиллу джава-раба?
Вот и нахуй тогда все это усложнять, композеры эти хуезеры. Если проект тебе надо на всякие гигантские подмодули блять дробить композером - пиши на джабе/c#. А для сайтов это нахуй не нужено. Всякие гандонки и виджеты а-ля "рецепт дня: суп из семи залуп" и так прикручиваются элементарно.
Я три года назад тоже радовался, вот заебок, сейчас будем уже как ПОГРОМИСТЫ писать, ОБРАЗОВАННО, ГРАМОТНО. Охуевал от этих всех плюшек, тестирования, энтерпрайзности. А сейчас вот блять объективно посмотреть, скорость разработки с этим говном пиздец упала, а качество-то не сильно улучшилось.
Я считаю, золотой век похапе - период Kohana 3.1-3.2, самый простой фреймоврк был, маленький, без магий там всяких и пизданутого кода (а-ля Yii), жаль мало дилд под него было на гитхабе, не зафорсили увы.
А сейчас похапе катится в говно, становится тулом для энтерпрайзо говна, но дорогим по факту и хуевым
Простите за маты, накипело просто, так-то я няшка
PHP-синьер с 5 летним опытом репортинг ин.
Если коротко, я ненавижу симфони 2 и то, во что превратился похапе за последние пару лет.
Вот нахуя все так усложнять? Зачем пиздеть про охуенность юнит-тестов и функциональных, если блять все равно НИКТО ИХ НЕ ПИШЕТ, ПОКРЫТИЕ БЛЯТЬ 25%, ЧТО ЭТО ТАКОЕ НАХУЙ? КАКОЙ СМЫСЛ БЛЯТЬ В ЭТОМ?
Tdd дало бы 100% покрытие, ко-ко-ко - ага блять, только НИКТО ЕГО БЛЯТЬ НЕ ПРАКТИКУЕТ, ВСЕ ТОЛЬКО ЛЮБЯТ ПИЗДЕТЬ О НЕМ С УМНЫМ ВИДОМ В КУРИЛКЕ.
Симфони, ко-ко-композер, SOLID - да нахуй идите. Депенденси инжекшон, уменьшает связность, ко-ко-ко - да похуй на эту связность, вот чем она тебе мешает? Проще тестировать, ко-ко-ко - ТАК ТЫ ЖУЕБА ЖЕ НЕ ТЕСТИРУЕШЬ СУКА, 25% БЛЯТЬ ПОКРЫТИЕ! А все что не равно 100% фактически блять 0, так как все равно нужно прокликивать, перекликивать или гуи-тесты писать тестировщику.
На практике тесты на всех проектах где я работал не отловили ни одного бага, только при смене кода ломаются постоянно, чем вообще сводят на нет даже мизерную от них пользу. "Тесты ломаются, это ты знач дибил))) нада нормально тесты писать)))". Так хули ты (ты блять, ты) нормально их не пишешь? И никто блять не пишет их нормально, да и вообще никак, какая-то сплошная имитация блять, лишь бы было куда время зарепортить лишнее.
На больших проектах заебешься ко-ко-ко - а нахуй на php большие проекты? Нужен тебе тырпрайз - бери си-решетка/джава макак, они там напиздячат по всем канонам абстрактных заводов одиночных фасолин. Или кто-то и правда считает, что PHP-макака, нормально знающая симфони 2, практикующая TDD и такая вся пиздая будет стоить дешевле сравнимого по скиллу джава-раба?
Вот и нахуй тогда все это усложнять, композеры эти хуезеры. Если проект тебе надо на всякие гигантские подмодули блять дробить композером - пиши на джабе/c#. А для сайтов это нахуй не нужено. Всякие гандонки и виджеты а-ля "рецепт дня: суп из семи залуп" и так прикручиваются элементарно.
Я три года назад тоже радовался, вот заебок, сейчас будем уже как ПОГРОМИСТЫ писать, ОБРАЗОВАННО, ГРАМОТНО. Охуевал от этих всех плюшек, тестирования, энтерпрайзности. А сейчас вот блять объективно посмотреть, скорость разработки с этим говном пиздец упала, а качество-то не сильно улучшилось.
Я считаю, золотой век похапе - период Kohana 3.1-3.2, самый простой фреймоврк был, маленький, без магий там всяких и пизданутого кода (а-ля Yii), жаль мало дилд под него было на гитхабе, не зафорсили увы.
А сейчас похапе катится в говно, становится тулом для энтерпрайзо говна, но дорогим по факту и хуевым
Простите за маты, накипело просто, так-то я няшка
PHP-синьер с 5 летним опытом репортинг ин.
Если коротко, я ненавижу симфони 2 и то, во что превратился похапе за последние пару лет.
Вот нахуя все так усложнять? Зачем пиздеть про охуенность юнит-тестов и функциональных, если блять все равно НИКТО ИХ НЕ ПИШЕТ, ПОКРЫТИЕ БЛЯТЬ 25%, ЧТО ЭТО ТАКОЕ НАХУЙ? КАКОЙ СМЫСЛ БЛЯТЬ В ЭТОМ?
Tdd дало бы 100% покрытие, ко-ко-ко - ага блять, только НИКТО ЕГО БЛЯТЬ НЕ ПРАКТИКУЕТ, ВСЕ ТОЛЬКО ЛЮБЯТ ПИЗДЕТЬ О НЕМ С УМНЫМ ВИДОМ В КУРИЛКЕ.
Симфони, ко-ко-композер, SOLID - да нахуй идите. Депенденси инжекшон, уменьшает связность, ко-ко-ко - да похуй на эту связность, вот чем она тебе мешает? Проще тестировать, ко-ко-ко - ТАК ТЫ ЖУЕБА ЖЕ НЕ ТЕСТИРУЕШЬ СУКА, 25% БЛЯТЬ ПОКРЫТИЕ! А все что не равно 100% фактически блять 0, так как все равно нужно прокликивать, перекликивать или гуи-тесты писать тестировщику.
На практике тесты на всех проектах где я работал не отловили ни одного бага, только при смене кода ломаются постоянно, чем вообще сводят на нет даже мизерную от них пользу. "Тесты ломаются, это ты знач дибил))) нада нормально тесты писать)))". Так хули ты (ты блять, ты) нормально их не пишешь? И никто блять не пишет их нормально, да и вообще никак, какая-то сплошная имитация блять, лишь бы было куда время зарепортить лишнее.
На больших проектах заебешься ко-ко-ко - а нахуй на php большие проекты? Нужен тебе тырпрайз - бери си-решетка/джава макак, они там напиздячат по всем канонам абстрактных заводов одиночных фасолин. Или кто-то и правда считает, что PHP-макака, нормально знающая симфони 2, практикующая TDD и такая вся пиздая будет стоить дешевле сравнимого по скиллу джава-раба?
Вот и нахуй тогда все это усложнять, композеры эти хуезеры. Если проект тебе надо на всякие гигантские подмодули блять дробить композером - пиши на джабе/c#. А для сайтов это нахуй не нужено. Всякие гандонки и виджеты а-ля "рецепт дня: суп из семи залуп" и так прикручиваются элементарно.
Я три года назад тоже радовался, вот заебок, сейчас будем уже как ПОГРОМИСТЫ писать, ОБРАЗОВАННО, ГРАМОТНО. Охуевал от этих всех плюшек, тестирования, энтерпрайзности. А сейчас вот блять объективно посмотреть, скорость разработки с этим говном пиздец упала, а качество-то не сильно улучшилось.
Я считаю, золотой век похапе - период Kohana 3.1-3.2, самый простой фреймоврк был, маленький, без магий там всяких и пизданутого кода (а-ля Yii), жаль мало дилд под него было на гитхабе, не зафорсили увы.
А сейчас похапе катится в говно, становится тулом для энтерпрайзо говна, но дорогим по факту и хуевым
Простите за маты, накипело просто, так-то я няшка
PHP-синьер с 5 летним опытом репортинг ин.
Если коротко, я ненавижу симфони 2 и то, во что превратился похапе за последние пару лет.
Вот нахуя все так усложнять? Зачем пиздеть про охуенность юнит-тестов и функциональных, если блять все равно НИКТО ИХ НЕ ПИШЕТ, ПОКРЫТИЕ БЛЯТЬ 25%, ЧТО ЭТО ТАКОЕ НАХУЙ? КАКОЙ СМЫСЛ БЛЯТЬ В ЭТОМ?
Tdd дало бы 100% покрытие, ко-ко-ко - ага блять, только НИКТО ЕГО БЛЯТЬ НЕ ПРАКТИКУЕТ, ВСЕ ТОЛЬКО ЛЮБЯТ ПИЗДЕТЬ О НЕМ С УМНЫМ ВИДОМ В КУРИЛКЕ.
Симфони, ко-ко-композер, SOLID - да нахуй идите. Депенденси инжекшон, уменьшает связность, ко-ко-ко - да похуй на эту связность, вот чем она тебе мешает? Проще тестировать, ко-ко-ко - ТАК ТЫ ЖУЕБА ЖЕ НЕ ТЕСТИРУЕШЬ СУКА, 25% БЛЯТЬ ПОКРЫТИЕ! А все что не равно 100% фактически блять 0, так как все равно нужно прокликивать, перекликивать или гуи-тесты писать тестировщику.
На практике тесты на всех проектах где я работал не отловили ни одного бага, только при смене кода ломаются постоянно, чем вообще сводят на нет даже мизерную от них пользу. "Тесты ломаются, это ты знач дибил))) нада нормально тесты писать)))". Так хули ты (ты блять, ты) нормально их не пишешь? И никто блять не пишет их нормально, да и вообще никак, какая-то сплошная имитация блять, лишь бы было куда время зарепортить лишнее.
На больших проектах заебешься ко-ко-ко - а нахуй на php большие проекты? Нужен тебе тырпрайз - бери си-решетка/джава макак, они там напиздячат по всем канонам абстрактных заводов одиночных фасолин. Или кто-то и правда считает, что PHP-макака, нормально знающая симфони 2, практикующая TDD и такая вся пиздая будет стоить дешевле сравнимого по скиллу джава-раба?
Вот и нахуй тогда все это усложнять, композеры эти хуезеры. Если проект тебе надо на всякие гигантские подмодули блять дробить композером - пиши на джабе/c#. А для сайтов это нахуй не нужено. Всякие гандонки и виджеты а-ля "рецепт дня: суп из семи залуп" и так прикручиваются элементарно.
Я три года назад тоже радовался, вот заебок, сейчас будем уже как ПОГРОМИСТЫ писать, ОБРАЗОВАННО, ГРАМОТНО. Охуевал от этих всех плюшек, тестирования, энтерпрайзности. А сейчас вот блять объективно посмотреть, скорость разработки с этим говном пиздец упала, а качество-то не сильно улучшилось.
Я считаю, золотой век похапе - период Kohana 3.1-3.2, самый простой фреймоврк был, маленький, без магий там всяких и пизданутого кода (а-ля Yii), жаль мало дилд под него было на гитхабе, не зафорсили увы.
А сейчас похапе катится в говно, становится тулом для энтерпрайзо говна, но дорогим по факту и хуевым
Простите за маты, накипело просто, так-то я няшка
Попробовал получить токен как указано здесь: http://habrahabr.ru/post/226585/
Далее попробовал его использовать в прилагающемся тамже примере и в ином классе с гитхаба для работы с api.
И там и там возникают проблемы с access token.
wtf?
___
и еще, при попытке запустить php скрипт на моем пк я вижу... просто пустую страницу, если загружаю на сайт и запускаю уже там - вижу ошибки.
>А все что не равно 100% фактически блять 0
расскажи-ка, что, по-твоему, гарантирует 100% покрытие
>расскажи-ка, что, по-твоему, гарантирует 100% покрытие
Когда каждая макака будет на 100% покрывать пишущейся им код, весь проект будет покрыт на 100% (без багов сторонних библиотек)
sat — это название remote, удаленного репозитория. Ты можешь добавлять, удалять и менять их адреса с помощью git remote: http://git-scm.com/book/ru/v1/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D1%83%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F%D0%BC%D0%B8
Собственно, поменяй адрес у sat на тот что гит тебе советует, с https.
>>410425
> и еще, при попытке запустить php скрипт на моем пк я вижу... просто пустую страницу,
В PHP по умолчанию выключено отображение ошибок в браузере, так как обычному пользователю сайта эта информация ни к чему. Но тебе, как программисту, надо видеть эти ошибки. Вот, как можно их просмотреть:
- ошибки сохраняются в лог ошибок. Можно открыть его и почитать. Если ты запускаешь код на локалхосте, у себя, то лог хранится в папке Апача (обычно она называется logs) и имеет название вроде error.log (в линуксе в папку /var/log/apache2 ). Если на хостинге — там либо есть файл error.log либо раздел в панели управления, где лог можно посмотреть
- также, ты можешь включить отображение ошибок. Открой файл php.ini, поставь там display_errors = On и error_reporting = E_ALL и перезапусти сервер. Теперь ошибки должны выводиться на экран.
Проверить, работает ли вывод ошибок, можно запустив скрипт содержающий обращение к несуществующей переменной вроде echo $sdgasdad; и проверив, выведется ошибка или нет. Если все верно, то должна вывестись.
>>410442
Покрытие это лишь число для оценки. Оно не гарантирует что тесты покрывают все сценарии использования системы, потому не надо за ним слепо гнаться.
>Покрытие это лишь число для оценки. Оно не гарантирует что тесты покрывают все сценарии использования системы, потому не надо за ним слепо гнаться.
Ну так да, тем более нет смысла их писать
В общем что я хотел сказать вам после трех дней работы. В первую очередь - спасибо ОПу треда. Уже с первых часов на работе становится понятно, что никто с тобой не будет сидеть и разбирать твой говнокод. Все заняты своими делами, никто не возится с нубом. Так что всем местным скажу, что радуйтесь блджад, что с вами кто-то сидит и разбирает ваш говнокод, и пользуйтесь пока можете. Ну я типа не выпендриваюсь, сам скорее всего сюда вернусь как только времени будет чуть больше свободного.
Судя по
https://help.github.com/articles/which-remote-url-should-i-use/#cloning-with-ssh
Ты должен сгенерировать и привязать к аккаунту публичный ключ, чтобы использовать доступ по ssh (git:// это как раз и есть доступ через SSH).
Тут
https://help.github.com/articles/generating-ssh-keys/#step-4-test-everything-out
написана команда ssh -T, которой можно проверить, правильно ли у тебя настроены ключи.
Ну или ты можешь просто пока исплоьзовать https и вводить пароль каждый раз.
Есть ситации, когда тесты бесполезны. Например, довольно глупо покрывать ими очевидные функции или контроллеры (если ты пишешь тонкие контроллеры как правильный разработчик). Но есть и ситуации где они помогают, в коде с хитрой логикой например.
Я хотел сказать что не надо считать главным критерием цифру покрытия, а то что тесты не нужны, это ты уже от себя придумал.
>>410451
Не беда, я думаю, со временем освоишься.
Пробовал искать ответ в документации? http://vk.com/dev
Поищи там сначала.
Ну и если вконтакт пишет что access token неприальный, то он наверно действительно неприавльный или не соответствует аккаунту или еще что-нибудь.
>Но есть и ситуации где они помогают, в коде с хитрой логикой например.
такие места в первую очередь НЕ покрывают, потому что не так очевидно
>а то что тесты не нужны, это ты уже от себя придумал
Я не говорил, что они не нужны в теории.
Я говорил, что в таком виде, в каком НА ПРАКТИКЕ тесты пишутся в проектах на похапе, соотношение профит/геморой стремится к нулю.
> PHP Notice: Undefined offset: 14 in /home/1UaNeb/prog.php on line 38
> PHP Notice: Undefined offset: 15 in /home/1UaNeb/prog.php on line 38
> PHP Notice: Undefined offset: 16 in /home/1UaNeb/prog.php on line 38
Ты ошибки видел эти, внизу под твоей программой? Надо их исправить.
Это ты пытаешься обратиться к несуществующему элементу в мссиве.
> как отформатировать текст
Пробелами и \n
Насчет вывода, если ты запускаешь программу в браузере и все разъезжается, вот совет.
Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
header("Content-Type: text/plain; charset=utf-8");
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
По моему ты просто один фреймворк знаешь лучше, а другой хуже, отсюда и неприязнь. Я не работал с коханой, но видел codeigniter, к которому она имеет какое-то отнощение и он мне не нравится. Там глобальные функции есть и куча & везде. И этот стремный $this->load на каждом шаге. Ужас же.
Ну и одно из преимуществ фреймворков, что они предлагают готовые компоненты. Не надо придуиывать свой HttpRequest, Response, можно исплоьзовать ORM, не надо писать свой роутер, есть куча плагинов и расширений, не надо писать свой CRUD для админки, авторизацию и т.д. Если ты не используешь это, а велосипедишь то преимуществ может и не быть.
Ну и новичков по идее фреймворк должен дисциплинировать.
Ну и раз так, я тоже пожалуюсь.
Я нормально отношусь к Симфони и композеру. Но меня раздражают например дебилы-фанатики, которым надо везде использовать монгу, ноду, написанный каким-то аутистом ангулар, twitter bootstrap, убейте уже его кто-нибудь, grunt, аякс не к месту и еще кучу библиотек не потому что они лучше подходят для решения, а потому что про них пишут на хабре и в твиттере. Естественно ни в одной их этих библиотек они дальше онов не разбираются.
SQL в 100 раз лучше монги. С SQL ты просто пишешь любой запрос в консоли и получаешь результат, а с монгой ты ничего не получаешь, сложнее поиска записи по id там руками ничего не сделать.
Казалось бы какая мне разница? А разница есть, может мне потом сделанный на этих поделиях сайт открывать придется или что хуже, с этим кодом взаимодейстовать. То, что можно просто сверстать на HTML или сгенерировать php на сервере, усложняют без меры, и делают кривое поделие которое отправив 10 аякс запросов может что-то отобразить и которое тормозит даже при прокрутке (ок, тормозит оно не из-за скриптов, а из-за верстки и браузера но мой сайт или двач почему-то так не тормозит и плавно прокручивается, а их — тормозит значит это они виноваты).
Отдельно хочется послать проклятий дизайнерам и верстальщикам которые делают прилепляющиеся сверху, снизу, справа, слева панели. Какой идиот их придумал? Зачем вы их делаете? Для даунов которые не могут найти на странице меню и не знают про кнопку Home? Самый лучший дизайн это черный текст на белом фоне с большими полями.
Отдельно хочется вспомнить любителей руби, которые из фанатизма написали свой JS на отступах, CSS на отступах и даже HTML на отступах. Как их вообще всерьез воспринимать можно?
> Зачем пиздеть про охуенность юнит-тестов и функциональных, если блять все равно НИКТО ИХ НЕ ПИШЕТ
А как вы тестируете код? Людьми-тестировщиками? Сдаете заказчику неоттестированный? Людям-тестировщикам не надоедает рутина?
> Tdd дало бы 100% покрытие,
Не знаю, не работал с TDD, но оно мне со стороны напоминает фанатизм.
> да похуй на эту связность, вот чем она тебе мешает?
Вообще, мешает. Завтра ты захочешь делать какое-то действие скриптом из командной строки и обнаружишь что код этого действия влеплен в контроллер, использует кучу других классов, куски реквеста и проще написать:
wget http://example.com/doSometing?a=1
Чем разобраться.
> ко-ко-композер
Нормально же. Я его изучил за счет анончиков, которые его использовали и по моему проще вписать строчку в composer.json чем возиться со скачиванием архивов, распаковкой, копированием, забиванием репозитория мусором, писать require нужный файл для автозагрузки. Композер полезная штука. Также, при работе с нодой все ставлю через npm, норм.
Ты может в командной строке не силен?
> Нужен тебе тырпрайз - бери си-решетка/джава макак,
Интуиция подсказывает что они напишут примерно то же, только объемнее и дороже.
По моему ты просто один фреймворк знаешь лучше, а другой хуже, отсюда и неприязнь. Я не работал с коханой, но видел codeigniter, к которому она имеет какое-то отнощение и он мне не нравится. Там глобальные функции есть и куча & везде. И этот стремный $this->load на каждом шаге. Ужас же.
Ну и одно из преимуществ фреймворков, что они предлагают готовые компоненты. Не надо придуиывать свой HttpRequest, Response, можно исплоьзовать ORM, не надо писать свой роутер, есть куча плагинов и расширений, не надо писать свой CRUD для админки, авторизацию и т.д. Если ты не используешь это, а велосипедишь то преимуществ может и не быть.
Ну и новичков по идее фреймворк должен дисциплинировать.
Ну и раз так, я тоже пожалуюсь.
Я нормально отношусь к Симфони и композеру. Но меня раздражают например дебилы-фанатики, которым надо везде использовать монгу, ноду, написанный каким-то аутистом ангулар, twitter bootstrap, убейте уже его кто-нибудь, grunt, аякс не к месту и еще кучу библиотек не потому что они лучше подходят для решения, а потому что про них пишут на хабре и в твиттере. Естественно ни в одной их этих библиотек они дальше онов не разбираются.
SQL в 100 раз лучше монги. С SQL ты просто пишешь любой запрос в консоли и получаешь результат, а с монгой ты ничего не получаешь, сложнее поиска записи по id там руками ничего не сделать.
Казалось бы какая мне разница? А разница есть, может мне потом сделанный на этих поделиях сайт открывать придется или что хуже, с этим кодом взаимодейстовать. То, что можно просто сверстать на HTML или сгенерировать php на сервере, усложняют без меры, и делают кривое поделие которое отправив 10 аякс запросов может что-то отобразить и которое тормозит даже при прокрутке (ок, тормозит оно не из-за скриптов, а из-за верстки и браузера но мой сайт или двач почему-то так не тормозит и плавно прокручивается, а их — тормозит значит это они виноваты).
Отдельно хочется послать проклятий дизайнерам и верстальщикам которые делают прилепляющиеся сверху, снизу, справа, слева панели. Какой идиот их придумал? Зачем вы их делаете? Для даунов которые не могут найти на странице меню и не знают про кнопку Home? Самый лучший дизайн это черный текст на белом фоне с большими полями.
Отдельно хочется вспомнить любителей руби, которые из фанатизма написали свой JS на отступах, CSS на отступах и даже HTML на отступах. Как их вообще всерьез воспринимать можно?
> Зачем пиздеть про охуенность юнит-тестов и функциональных, если блять все равно НИКТО ИХ НЕ ПИШЕТ
А как вы тестируете код? Людьми-тестировщиками? Сдаете заказчику неоттестированный? Людям-тестировщикам не надоедает рутина?
> Tdd дало бы 100% покрытие,
Не знаю, не работал с TDD, но оно мне со стороны напоминает фанатизм.
> да похуй на эту связность, вот чем она тебе мешает?
Вообще, мешает. Завтра ты захочешь делать какое-то действие скриптом из командной строки и обнаружишь что код этого действия влеплен в контроллер, использует кучу других классов, куски реквеста и проще написать:
wget http://example.com/doSometing?a=1
Чем разобраться.
> ко-ко-композер
Нормально же. Я его изучил за счет анончиков, которые его использовали и по моему проще вписать строчку в composer.json чем возиться со скачиванием архивов, распаковкой, копированием, забиванием репозитория мусором, писать require нужный файл для автозагрузки. Композер полезная штука. Также, при работе с нодой все ставлю через npm, норм.
Ты может в командной строке не силен?
> Нужен тебе тырпрайз - бери си-решетка/джава макак,
Интуиция подсказывает что они напишут примерно то же, только объемнее и дороже.
Потому что ваши разработчики не хотят, не мотивированы, не имеют возможности или не умеют их писать. Если так то ничего не сделаешь. Тесты тут не виноваты, а я бы как раз предпочел покрыть именно хитрую логику которую легко сломать и не заметить.
Ты читал на хабре про Баду или Яндекс? У них там вообще тестовы тысячи.
Алсо, хочу пожаловаться еще. Дебилы переверстали мануал php по модным техникам, засунув в него мегабайт шрифтов. Угадай-ка, отображается ли текст пока не загрузился шрифт?
Если раньше я кликал по результате в гугле и через полсекунды-секунду читал нужное мне место, то сейчас я вижу страницу без текста, которая еще и не прокручивается пока что-то там не загрузится.
Алсо, она еще и в локалсторадж пытается несколько мегабайтный индекс для поиска скачать и записать которым я все равно никогда не пользуюсь.
Алсо, принципиально в браузерах ставлю ограничение для кеша в 20 мегабайт. Нечего мне диск засорять.
А ты хорош, продолжай.
справедливости ради, верстальщики/фронтендщики всегда были теми еще быдлокодерами, просто раньше все писалось на обычном HTML, клиентсайд приложений не было и им негде было развернуться.
Команды я уже немного подучил, но это нормально что у меня ничего не работает с первого раза?
>>В PHP по умолчанию выключено отображение ошибок в браузере, так как обычному пользователю сайта эта информация ни к чему. Но тебе, как программисту, надо видеть эти ошибки.
Действительно)) На днях php обновил, он еще ругнулся на файл конфигурации и заменил новым.
Спс тебе, няша)
>>Пробовал искать ответ в документации? http://vk.com/dev
А то. Муть какая то. Хотя мб это я сейчас торможу, завтра попробую еще раз на свежую голову вникнуть.
>>то он наверно действительно неприавльный
Да не, вряд ли. Я старательно копировал.
>Не беда, я думаю, со временем освоишься.
Так я и не жалюсь, просто когда есть с чем сравнивать, то пересматриваешь отношение ко всяким вещам. Такие дела. Алсо на работе изучаю в день наверное больше чем за неделю дома самостоятельно. Было бы конечно лучше работать в таких же комфортных условиях как дома, но с такими же темпами как там.
Радуйся тому, что есть. В моем мухосранске одна вакансия на пхп джуниора, но вид сайта этих ребят прямо кричит о том, что им нифига не программист нужен, а дизайнер с верстальщиком.
Это потому что ты мало читал книгу, я думаю. Читай еще:
http://git-scm.com/book/ru/v1/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D1%83%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F%D0%BC%D0%B8
http://git-scm.com/book/ru/v1/%D0%92%D0%B5%D1%82%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2-Git-%D0%A3%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B2%D0%B5%D1%82%D0%BA%D0%B8
Если кратко, то это ошибка, когда ты склонировал репозиторий, сделал коммиты и хочешь запушить их назад в гитхаб, но кто-то уже успел туда что-то еще закоммитить и потому твои изменения не принимаются, чтобы не сломать историю. ты должен сделать pull (или fetch + merge ), то есть загрузить эти чужие изменения с удаленного репозитория и смерджить со своими и только после этого пушить.
>По моему ты просто один фреймворк знаешь лучше, а другой хуже, отсюда и неприязнь.
Да ничего такого, кишки симфони я наверное даже более внимательно изучил, чем Кохану
Просто симфони слишком "заумная" для типичного проекта на php. Многие вещи оттуда на среднепроектах просто не нужны
>но видел codeigniter, к которому она имеет какое-то отнощение
Я говорил про кохану 3-ю, она к CI вообще никакого отношения не имеет
>Ну и одно из преимуществ фреймворков, что они предлагают готовые компоненты. Не надо придуиывать свой HttpRequest, Response, можно исплоьзовать ORM, не надо писать свой роутер
Я не против фреймворков как таковых, все вышеперечисленное и в Кохане есть
>не надо писать свой CRUD для админки, авторизацию и т.д.
Дело в том, что оно, увы, не работает как plug-n-play, часто нужно все равно разбираться как оно внутри работает, и в итоге вся экономия на нет сводится
Ну можно конечно сделать "набор", разобраться и им пользоваться, так часто и делают, но если бы все (или почти все) эти компоненты сами писались, было бы не сильно больше времязатрат
>А как вы тестируете код? Людьми-тестировщиками? Сдаете заказчику неоттестированный? Людям-тестировщикам не надоедает рутина?
При чем люди-тестироващики к юнит-тестам?
>Завтра ты захочешь делать какое-то действие скриптом из командной строки и обнаружишь что код этого действия влеплен в контроллер, использует кучу других классов, куски реквеста и проще написать:
Проблема в том, что это типичное "а если бы, да кабы, в носу росли грибы". А завтра вообще вдруг конец света, что тебе эта связность тогда даст?
Я могу тебе сказать, что по факту di экономит намного меньше времени и сил в итоге, чем нужно на регулярное его использование и предварительное вкуривание
>Ты может в командной строке не силен?
Думаю норм, деплой-скрипты например всякие писать умею, ну и в повседневности часто использую
>Интуиция подсказывает что они напишут примерно то же, только объемнее и дороже.
Практика показывает, что нет
Надо либо использовать button type="button" onclick=... либо предоствращать дейтсиве по умолчанию (отправка формы) в событии onsubmit как тут описано: http://javascript.ru/tutorial/events/intro#deystvie-brauzera-po-umolchaniyu
Замени <input type="submit" value="Submit"> на <button type="button">, дело в том что выполняется твой код в атрибуте onsubmit, а потом форма отправляется, потому что <input type="submit"> и <button type="submit">/<button> по умолчанию отправляют форму.
> di экономит намного меньше времени и сил в итоге, чем нужно на регулярное его использование и предварительное вкуривание
А что там вкуривать? Если брать простой случай то DI это когда зависимости передаются например в конструктор класса и это однозначно делает код лучше (чем глобальные переменные или везде передающийся супер-объект): как минимум, взглянув на конструктор ты понимаешь, что нужно этому классу для работы.
По моему с DI писать как раз проще и разбираться в коде тоже проще.
Ну и описать сервис в services.yml (если мы о Сифмони) тоже несложно, займет от силы секунд 30.
Естественно если под использованием DI ты подразумеваешь использование какой-нибудь сложной системы с кучей Xml-конфигов, ну извини, тут ты сам виноват что выбираешь такой способ.
аноны помогите составить программу нахождения суммы цифр двузначного числа в ебаном бейсике
мимотяншкольница
Что за мухосрань и как ты пытаешься преодолеть эту проблему?
я ничего в бейсике не понимаю
Делишь число на десять без остатка, записываешь результат в переменную А. Потом вычисляешь остаток от деления числа на 10 и записываешь в переменную Б. Складываешь Б с А, профит.
А можно даже не плодить переменные.
чет подозрительно легко. ну ладно
>А что там вкуривать? Если брать простой случай то DI это когда зависимости передаются например в конструктор класса и это однозначно делает код лучше (чем глобальные переменные или везде передающийся супер-объект): как минимум, взглянув на конструктор ты понимаешь, что нужно этому классу для работы.
Ок,простой случай. Обычный блять сайт. Есть контроллер. В нем мы берем какой-нибудь апи, из которого потом дергаем методы (да похуй вообще)
1. $yobaApu = new Koloboque_Api(YOBA::config->get('credentials'));
2. --services.yml
parameters:
koloboque_credentials: huipizda
services:
koloboque_service:
class: Koloboque_Api
parameters:
credentials: %koloboque_credentials%
--controller
$this->get('koloboque_service');
Еще блять нужны комментарии? какой в этом случае выйгрыш от DI?
А проигрыши такие, больше кода, нет автокомплита без phpdoc на объектом сервиса
В общем, в первом случае есть DI, но только в рамках инициализации API (передаю креденшелы параметрами)
Все SOLID принципы хороши, ляляля, но суть в том, что на простых сайтах это нахуй не нужно, и выйгрыша от этого никакого.
А на php лучше всего делать именно простые сайты, говорю это как человек работавший на йоба-мега проектах с миллионами юников дейли
>>410516-кун
Идея services.yml в том, что тебе не надо копипастить в 5 мест
$yobaApu = new Koloboque_Api(YOBA::config->get('credentials'));
$yobaApu->setSomeMode( );
$yobaApu->setSomethingElse( );
(да, оно потом разрастется) и потом в 5 местах это исправлять если надо что-то поменять, а можно просто вынести описание сервиса в конфиг.
Если тебе это только в одном месте нужно, очевидно, сервис можно не описывать (хотя имхо по времени особой разницы нет что первое что второе написать). Тебя же никто не заставляет, понадобится, впишешь, не понадобится не впишешь. Главное чтобы класс не использовал внутри жестко прописанных зависимостей. сигнлотонов и глобальных переменных.
Ну и мне конечно не нравятся статические методы. Мне кажется, написать
$this->container->getParam('credentials') или как-то аналогично не намного сложнее чем YOBA::config->get
Ну и еще профит в том, что бандлы могут предоставлять свои сервисы (но это нужно разработчикам бандлов конечно).
Насчет автодополнения, да, есть такая проблема. Но саблайм текст все равно не умеет в него.
Я под использованием DI имел в виду именно то, что в классах не должны быть жестко вхардкодены зависимости. А использовать DI Container или создавать через new (а позже перенести в сервис) - это не так принципиально, конечно если каждый класс заставлять описывать как сервис то это уже нездоровый фанатизм.
Ну если я делаю через \n и | ячейки не выглядят как на картинке с заданием. Когда через <table> хотя бы кое-как выглядит
>что тебе не надо копипастить в 5 мест
>$yobaApu = new Koloboque_Api(YOBA::config->get('credentials'));
>$yobaApu->setSomeMode( );
>$yobaApu->setSomethingElse( );
Так мне эти сеты и не нужны. И очень-очень редко нужно было что-то такое делать. Забирать конфиги можно и прямо из модели и тогда вообще "копипастить" ничего не нужно
Не нужно мне расписывать книжные приемущества DI и контейнера симфони, я это все "знал" еще 3 года назад. Дело в том, что "чистый" код улучшает возможности для расширения и увеличивает гибкость (в ущерб компактности и скорости разработки), но суть в том что среднепроекты не нуждаются в этом. А значит в этих преждевременных оптимизациях с мотивацией "а вот вдруг у бабушки вырастет хуй и она станет дедушкой" нет никакого смысла.
>Сейчас учу английский
С этого нужно было начинать.
>собираюсь перекатываться на ubuntu
С этого нужно было начинать, в нормальных конторах везде линукс, и на серверах, и на рабочих пекарнях.
>Окей, накидай список актуальных тем/технологий по php которые стоит задрачивать/смотреть/изучать
Mysql/postgres, memcached, mongodb, rabbitmq, sphinx, nginx - это однозначно стоит изучить. Читай доки на офф. сайтах, и хабр, этого вполне достаточно. По спорным моментам ответы на вопросы ищи на stack overflow.
Конкретно по php, глянь фреймворк phalcon, composer для зависимостей, phinx для миграций, phpunit/paratest для юнит тестов.
>>410274
Книжечки нахуй, всё, что нужно - есть в оффициальных доках.
http://dev.mysql.com/doc/refman/5.7/en/
То же самое могу и про пхп сказать, и вооще, про любую библиотеку или технологию.
Еще поищи доклады с highload++, там много годноты про БД, например, в этом году Пётр Зайцев (один из разработв mysql) читал про работу с индексами в mysql, очень полезно, таких тонкостей ни в одной книге не найдешь. Ну и хабр читай, там тоже много полезного. А на толстые книги не трать время, КПД низок.
Сразу видно теоретика, который ни в одном серьёзном проекте не участвовал и ни на одной серьёзной работе не работал.
А почему ты рекомендуешь phalcon а не к примеру гораздо более известные и распространенные symfony components или silex или что-то еще? Как я помню phalcon на Си++ написан и без бекграунда в этой области в принципе малополезен.
Ну и изучать rabbitmq если не представляешь для чего используются очереди, по моему трудно: анон просто толком ничего не поймет.
Просто выдавать куки с email-ом не конает?
Это я о задаче с ЕГЭ.
Мне же нужно дать возможность редактировать посредством установки куки? Что в куки пхать? e-mail, как я полагаю не вариант потому, что зная e-mail можно редактировать информацию о человеке.
Хочется что бы просто и нового поля в БД не создавать. Есть идеии?
Зачем через куки? Через куки тебе предложено авторизацию делать или что-то такое.
После регистрации сайт должен запомнить пользователя и вместо формы регистрации показывать форму редактирования своих данных. Запомнить пользователя можно с помощью кук, ставить на 10 лет. Надо использовать какой-то код, чтобы нельзя было отредактировать чужие данные.
Так это запомнить пользователя нужно с помощью кук. А данные эти брать с базы, видимо.
Так тебе какая разница? Ты внутри программы получаешь сразу всю пачку, у тебя же там целый класс должен быть для этих данных. А что выводить - это уже другой вопрос.
Так, а смысл? Если брать md5 от мыла, разве чувак не сможет взять мыло, и зашифровать его в md5, а потом в куки подставить?
Соль добавлять что-ли?
Ты вообще чего хочешь добиться?
> Если брать md5 от мыла, разве чувак не сможет взять мыло, и зашифровать его в md5, а потом в куки подставить?
Только если будет знать, какое мыло добавлять.
>Соль добавлять что-ли?
К примеру
Что бы использовать какую-то информацию мения доступную людям посторонним же.
Да любую соль к md5
>>> setcookie() ...cookie должны передаваться до того как >>>будут выведены какие-либо другие данные скрипта >>>(это ограничение протокола). Это значит, что в >>>скрипте вызовы этой функции должны располагаться >>>прежде остального вывода, включая вывод тэгов >>><html> и <head>, а также пустые строки и пробелы.
Значит, что скрипт может выполнять любые данные, кроме вывода до того, как установить куки?
вроде
$m = md5($_POST['email']);
setcookie('edit' $m);
Могу я так делать?
Когда пользователь вводит информацию, генерирует сложный токен (например, 40 букв и цифр) и кладешь его в базу и в куки. Также, кладешь в куки id. При редактировании сравниваешь, тот ли он за кого себя выдает.
То есть это что-то вроде невидимого для пользователя пароля.
Задача: https://gist.github.com/codedokode/d7e7f11449fc3bcb24b4
Надо сделать чтобы пользователь мог редактировать только свои данные, при этои без явных регистраций и авторизаций, прозрачно для человека.
Использовать предлагается куки. Конечно они вряд ли проживут 10 лет.
Жив. ты хочешь изучать PHP? Как насчет сайта из ОП-поста? Если тебе не нравится мой учебник, там еще названия 2 серьезных книг приведены, но для них надо знать основы.
>>410621
Да.
После вывода нельзя ставить куки, так как куки ставятся через заголовок, а в HTTP ответе заголовки идут до содержимого страницы. Если ты вывел хоть один пробел, поезд ушел.
Ну я так и думал, кароче без английского и понимания как все работает(архитектура пк, ос, сервера, сети, протоколы и т.д.) хорошей пхп-макакой не стать, как и любой другой. Просто я хотел попробовать "быстрый старт", лол. Мне после окончания вузика в этом году(уже в следующем получается) пиздовать в армию. Задрачивать что-то умеренно, видимо, смысла нет. Подзадрачить что-то в ближайший месяц, два и рассылать резюме тоже смысла нет. Пойду впадать в апатию и плакать от отвращения к себе.
ушел выпиливаться
Да, хороший разработчик должен в этих вещах разбираться. Но на джуниора/стажера иногда могут взять и без этого, зависит от компании. nginx, rabbitmq и сфинкс у джуниоров не спрашивают обычно. Да и знание сетей нужно на общем уровне, что такое Ip-адрес, порт, tcp, http, а настраивать маршрутизацию например тебя никто не будет просить.
Кстати, в задании на файлообменник мы изучаем как работать со sphinx. Ну и на MySQL у нас задачки имеются. И если захочешь с чем-то еще разобраться, придумаем задачу.
Я тут забыл, на чем мы остановились в моем файлобменнике.
https://github.com/sqghub/uppu.ru
И имеет ли смысл продолжать работать с ним. Может пора уже отправить изучать что-то еще?
Учебник вин, да. Не думал, что анон еще может делать качественные вещи. Значити сосач не деградировал.
А я пока попробую придумать какое-нибудь задание на Yii 2. Или ты может хочешь яваскрипт помучать? У нас есть задачки: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
Ну и на HTML/CSS имеются: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
Ок, гляну.
> protected $previousX;
> protected $previousY;
Неиспользуемый код надо удалять.
> $this->cats[] = $animal;
А зачем использовать тут свойство объекта? Что, список кошек вокруг это свойство мышки и его надо хранить постоянно? по моему тут удобнее вернуть массив через return.
> public function checkTile($x, $y)
Это должно быть в классе карта. можно например сделать функцию «получить животное по координатам».
> if ($this->x < $this->cats[0]->getCoordinateX() && $this->x != 0 && $this->checkTile($this->x - 1, $this->y)
Вот это не очень хороший код. Там повторяется 4 почити одинаковых скопипастыенных куска, и это плохо. Далеее, ты проверяешь только первую кошку. А что если есть вторая, которая ближе и опаснее? может ты делаешь шаг навстречу к ней?
Я думаю, надо делать систему с очками, иначе мышка долго не протянет. Как временный код для проверки годится, но как решение нет.
> && $this->x != 0 && $this->x != 19)
Надо сделать метод у карты, проверябщий есть ли такакя клеточка. И уж точно не прописывать размер карты числом.
Дальше, не надо напрямую менять this->x. Надо записывать координаты в переменные x, y и вызвать метод типа move(x, y)
> public function setSleepIcon()
> {
> $this->previousIcon = $this->icon;
> $this->icon = "@";
Это костыль, я уже писал выше, иконку менять не надо, достаточно подправить функцию getIcon
> public function move($x, $y)
> {
> if ($this->sleepCount == 0) {
Если у тебя есть код
if (условие) {
50 строк
} else {
2 строки
}
То его надо попробовать перевернуть, чтобы было
if (не выполняется условие) {
2 строки
} else {
50 строк
}
А еще лучше
if (не выполняется условие) {
2 строки;
return;
}
50 строк;
> if ($this->x == $target['x'] && $this->y == $target['y']) {
Опять же здесь удобно было бы использовать функцию «определить какое животное стоит на точке x, y» а не странный костыль с findClosestMouse, который будет работать некорректно в ситуации, когда рядом с кошкой 2 или больше мышей.
Также надо проверять перед ходом есть ли такая клеточка на поле и не занята ли она например кошкой.
> public function findClosestMouse()
Удобнее наверно из этой функции возвращать саму мышку.
Ну и вывод надо допилить чтобы карта не искажалась.
Ок, гляну.
> protected $previousX;
> protected $previousY;
Неиспользуемый код надо удалять.
> $this->cats[] = $animal;
А зачем использовать тут свойство объекта? Что, список кошек вокруг это свойство мышки и его надо хранить постоянно? по моему тут удобнее вернуть массив через return.
> public function checkTile($x, $y)
Это должно быть в классе карта. можно например сделать функцию «получить животное по координатам».
> if ($this->x < $this->cats[0]->getCoordinateX() && $this->x != 0 && $this->checkTile($this->x - 1, $this->y)
Вот это не очень хороший код. Там повторяется 4 почити одинаковых скопипастыенных куска, и это плохо. Далеее, ты проверяешь только первую кошку. А что если есть вторая, которая ближе и опаснее? может ты делаешь шаг навстречу к ней?
Я думаю, надо делать систему с очками, иначе мышка долго не протянет. Как временный код для проверки годится, но как решение нет.
> && $this->x != 0 && $this->x != 19)
Надо сделать метод у карты, проверябщий есть ли такакя клеточка. И уж точно не прописывать размер карты числом.
Дальше, не надо напрямую менять this->x. Надо записывать координаты в переменные x, y и вызвать метод типа move(x, y)
> public function setSleepIcon()
> {
> $this->previousIcon = $this->icon;
> $this->icon = "@";
Это костыль, я уже писал выше, иконку менять не надо, достаточно подправить функцию getIcon
> public function move($x, $y)
> {
> if ($this->sleepCount == 0) {
Если у тебя есть код
if (условие) {
50 строк
} else {
2 строки
}
То его надо попробовать перевернуть, чтобы было
if (не выполняется условие) {
2 строки
} else {
50 строк
}
А еще лучше
if (не выполняется условие) {
2 строки;
return;
}
50 строк;
> if ($this->x == $target['x'] && $this->y == $target['y']) {
Опять же здесь удобно было бы использовать функцию «определить какое животное стоит на точке x, y» а не странный костыль с findClosestMouse, который будет работать некорректно в ситуации, когда рядом с кошкой 2 или больше мышей.
Также надо проверять перед ходом есть ли такая клеточка на поле и не занята ли она например кошкой.
> public function findClosestMouse()
Удобнее наверно из этой функции возвращать саму мышку.
Ну и вывод надо допилить чтобы карта не искажалась.
>Уменьшенные картинки.
Так уменьшил. Правда я просто сохраняю превью на диск, но переделать на генерацию превьюшки - минута делов.
>Плюс, загрузка файлов перетаскиванием не сделана.
А это уже будет в куче с остальным js, которым я пока и начну заниматься.
http://ideone.com/19LdFN
Так пойдет?
И вопрос по третьей бонусной задачке по считалке. Создал массив от 1 до N, написал формулу считалки
$k = $skip $i;
\t\tif ($k > $count)
\t\t{
\t\t\t$z = floor($k / $count);
\t\t\t$k -= $count$z;
\t\t}
Дальше не знаю с чего начать, попытался применить unset(array[$k]), оно ожидаемо удаляет половину ключей с элементами из массива и дальше уже просто вхолостую ходит оставшееся количество циклов, вот либо формулу надо переделывать, либо уже нужно что-то делать с массивом и с нумерацией ключей после того как цикл обошел массив до конца.
Вот пока маленький список замечаний. У тебя там download.php не очень хоррошо все.
https://github.com/sqghub/uppu.ru/blob/master/create.sql#L13
Анонима до сих пор не исправил....
https://github.com/sqghub/uppu.ru/blob/master/templates/download.php#L17
У DateTime есть метод format
> <?endforeach;
> //для изображений
> if ($mediaData->isImage()) {
Это надо писать в 2 отдельных блока:
<?php endforeach; ?>
<?php if ($mediaData->isImage()): ?>
> src="/userFiles/<?= $file->getId() ?>/preview.png">
Правльнее сделать где-то метод типа getPreviewImageUrl. Так и код понятнее станет, и поменять алгоритм будет несложно.
Более того, ты не проверяешь, есть для картики превью или нет. Я думаю, надо при создании превьюшки в ImageData записывать путь к ней и тогда проверить ее наличие будет несложно.
Для cover image тоже наверно надо делать превьюшку, вдруг она большая. Можно использовать ту же самую функцию что у тебя есть, и сделать в базовом классе MediaData функцию для добваления/получения/проверки наличия превьюшки.
То есть будет общий код для любых превьюшек вроде:
<? if ($mediaData->hasPreview()): ?>
....
> } elseif ($mediaData->isAudio()) {
Тут нужна версия с двоеточием и вынести if в отдельный блок
Теги video/audio лучше использовать в форме с source как тут:
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source#Examples
(у тебя будет один source). type ты можешь получить от getId3. Тогда браузер если не поддеривает формат, даже не будет пытаться скачать и воспроизвести файл.
> 20 substr_count($comment->getPath(), '.')
Тут должно быть $comment->getDepth() или что-то такое, а не ручной подсчет числа точек
> case 'bmp':
> $img = imagecreatefromwbmp($sourcePath);
wbmp — это не bmp. GD не поддерживает bmp из коробки, его поддерживает вроде бы (не уверен) ImageMagick, но если неохота, можно не делать поддержку этого формата.
> if (!list($width, $height) = getimagesize($sourcePath)) return "Unsupported picture type!";
Лучше return false. Как ты это будешь через if проверять?
Ктстати, если тебе понадобится где-то рабоать с изображениями, это удобно делать с помощью библиотек вроде такой: https://github.com/Gregwar/Image — там создание превьюшки займет 3 строчки кода.
Еще есть такая библиотека, http://phpimagemagician.jarrodoberto.com/ она умеет в чтение BMP, но не поддерживает композер и довольно старая.
Ну это так, для информации, использовать их сейчас не требуется.
Вот пока маленький список замечаний. У тебя там download.php не очень хоррошо все.
https://github.com/sqghub/uppu.ru/blob/master/create.sql#L13
Анонима до сих пор не исправил....
https://github.com/sqghub/uppu.ru/blob/master/templates/download.php#L17
У DateTime есть метод format
> <?endforeach;
> //для изображений
> if ($mediaData->isImage()) {
Это надо писать в 2 отдельных блока:
<?php endforeach; ?>
<?php if ($mediaData->isImage()): ?>
> src="/userFiles/<?= $file->getId() ?>/preview.png">
Правльнее сделать где-то метод типа getPreviewImageUrl. Так и код понятнее станет, и поменять алгоритм будет несложно.
Более того, ты не проверяешь, есть для картики превью или нет. Я думаю, надо при создании превьюшки в ImageData записывать путь к ней и тогда проверить ее наличие будет несложно.
Для cover image тоже наверно надо делать превьюшку, вдруг она большая. Можно использовать ту же самую функцию что у тебя есть, и сделать в базовом классе MediaData функцию для добваления/получения/проверки наличия превьюшки.
То есть будет общий код для любых превьюшек вроде:
<? if ($mediaData->hasPreview()): ?>
....
> } elseif ($mediaData->isAudio()) {
Тут нужна версия с двоеточием и вынести if в отдельный блок
Теги video/audio лучше использовать в форме с source как тут:
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source#Examples
(у тебя будет один source). type ты можешь получить от getId3. Тогда браузер если не поддеривает формат, даже не будет пытаться скачать и воспроизвести файл.
> 20 substr_count($comment->getPath(), '.')
Тут должно быть $comment->getDepth() или что-то такое, а не ручной подсчет числа точек
> case 'bmp':
> $img = imagecreatefromwbmp($sourcePath);
wbmp — это не bmp. GD не поддерживает bmp из коробки, его поддерживает вроде бы (не уверен) ImageMagick, но если неохота, можно не делать поддержку этого формата.
> if (!list($width, $height) = getimagesize($sourcePath)) return "Unsupported picture type!";
Лучше return false. Как ты это будешь через if проверять?
Ктстати, если тебе понадобится где-то рабоать с изображениями, это удобно делать с помощью библиотек вроде такой: https://github.com/Gregwar/Image — там создание превьюшки займет 3 строчки кода.
Еще есть такая библиотека, http://phpimagemagician.jarrodoberto.com/ она умеет в чтение BMP, но не поддерживает композер и довольно старая.
Ну это так, для информации, использовать их сейчас не требуется.
> Дальше не знаю с чего начать, попытался применить unset(array[$k]), оно ожидаемо удаляет половину ключей с элементами из массива и дальше уже просто вхолостую ходит оставшееся количество циклов, вот либо формулу надо переделывать, либо уже нужно что-то делать с массивом и с нумерацией ключей после того как цикл обошел массив до конца.
Тут есть 2 варианта:
— перенумеровывать ключи массива после каждого удаления, например с помощью array_values. Надо также не забывать уменьшать при этом счетчик.
— обходить массив в цикле через foreach и удалять каждый N-й элемент (отсчитывать можно с помощью переменной). Тогда нам не принципиально есть ли дырки в нумерации или нет.
Ну и $skip × $i конечно не годится, тут нужна формула получше, надо прибавлять к числу величину шага, и если ты вышел за пределы массива то вычитать его размер. Ну и в первом варианте еще уменьшать при удалении элементов.
Насчет стихов, надо бы сделать нормально, без HTML тегов.
У тебя сейчас посмотри, код вообще ничего не выводит.
Это из-за того, что ты исплоьзуешь str_split который ломает буквы в utf-8, и ideone откаызвается их выводить. Я не вижу, в чем сложность заменить его на preg_split который я советовал выше, а также отказаться от каши из html-тегов и php. Давай сделаем нормально.
Если у тебя в браузере что-то не отображется, давай выясним чем проблема и исправим, а не будем писать код на допотопных 8-битных кодировках.
ну и посмотри сам, разве это нормально, смесь из php и html? Это же ужасно смотрится:
> border=\"1\" cellpadding=\"3\"
Здаров, пехапяч
Заказали говно: магазин с корзиной и товарами разных продавцов.
Все готово кроме отправки заказов на почту. По хорошему - надо бить заказ на куски по продавцу и каждому слать заказ только с его товарами.
Но меня беспокоит геморой с электронной почтой, раньше постоянно были проблемы, в том числе с приходом писем на яндекс-мейлру. А в этот раз сразу дохуя писем придется слать!
Так вот вопрос: если я mail()-м в цикле хуяну заказы, это нормально будет, или надо sleep там надо, или в базу загнать и кроном разослать. Как это лучше всего сделать?
Как дебажить готовый проект?
Кратко: в гос. учреждении, которое я эникею по договору, пытаются запилить систему тестирования персонала. Состоит она из wamp-сервера на одном из локальных компьютеров, к которому должны обращаться остальные по внутреннему айпишнику (проброс в hosts сделаем позже). Но это всё хуйня. Проблема в том, что программисттян скидывает полностью свою папку вампа с работающим у неё проектом на нашу пеку с установленной точно такой же версией вампа, подключает базу через phpmyadmin и О БОГИ, ТРИ ОШИБКИ В index.html. Страница не грузится. Сейчас привести их не смогу, потому что какой-то уебан на том конце провода (работаю удалённо) прямо во время моей работы нажал Пуск-Завершение работы и продолжить смогу только завтра, а проект скопировать себе не подумал, ну да похуй.
Короче, соль ошибок в том, что сначала он не может найти какую-то константу, а потом не может найти какой-то файл в папке c:\php\pear\, НО БЛЯДЬ! У программиста сайта тоже такой папки нет и всё робит! Её доводы такие: "у меня стоит ХР х86, всё работает. У вас 7 х64, ставьте ХР х86". Да пошла она нахуй, тут оперативки 4 гига и вообще ебал я в рот!
Хочу разобраться с проблемой. До этого пытался учить пхп для себя, но не взлетело, поэтому почти нихуя не знаю. Завтра попробую поковыряться. Собственно, вопрос знатокам: как правильнее и, самое главное, по фасту отдебажить это говно, чтобы отвязаться уже от работы которую, по сути, я не должен вообще делать?
Есть мысль - отключить вывод ошибок и пускай оно конём ебётся, но это не правильно же.
Буду рад хоть какой-то помощи.
> (проброс в hosts сделаем позже).
Я бы советовал поднять свой DNS-сервер. У меня конечно нет опыта админства, но интуиция подсказвыает что так добавлять хотсты проще да и вконтактики всякие можно заодно блокировать.
> Собственно, вопрос знатокам: как правильнее и, самое главное, по фасту отдебажить это говно, чтобы отвязаться уже от работы
Все ошибки пишутся под Апачем в логи (папка logs если ты не менял конфиг и если приложение не исплоьзует какую-то свою систему логгирования). Ты открываешь логи, вдумчиво читаешь ошибки, потом и идешь и исправляешь их по одной. После чего запускаете сайт, читаешь логи через пару недель и исправляешь оставшиеся (или передаешь программисту или учишь ее читать логи).
Ну и хорошо бы конечно научить программиста гиту, ибо изменения передавать вручную это ад, легко что-то еще сломать.
Также, проверь одинаковые ли у вас настройки php.ini, одинаковые ли расширения установлены. Просмотреть список расширений можно в консольке, набрав
c:\php\php -m
Просмотреть информацию о конфигурации php можно либо в консольке через
c:\php\php -i
Либо выполнив файл с кодом <?php phpinfo( ); через сервер и браузер.
> а потом не может найти какой-то файл в папке c:\php\pear\
Возможно что в константе как раз описан путь к файлу. Также, возможно что у тебя на сервере не установлены нужные пакеты из PEAR. PEAR — это репозиторий библиотек на php. В этом случае ты должен на сервер установить PEAR и используемые пакеты, в ту же папку. Как устанавливать пакеты PEAR под винду, я думаю, можн нагуглить. Делается это через консольку.
http://pear.php.net/manual/en/installation.php
http://stackoverflow.com/a/13032983
(пункт Installation of a local PEAR copy on a shared host не для тебя, а вот пункт Checking if PEAR works как раз надо выполнить) .
По сути надо скачать установщик, go-pear.phar и запустить его.
Папка куда ставятся пакеты, задается при установке PEAR вроде бы. Можно набрать
c:\php\php go-pear.phar --help
И посмотреть есть ли там опция для выбора папки. Ну или может он сам спросит при установке. Естественно, эту команду можно делать когда ты уже скачал go-pear.phar
Ну и надо путь к пакетам добавить в php.ini если его там нет. Опять же, инсталлятор умеет это делать сам.
Если ты плохо разбираешься в консольке, почитай мой мини-гайд: https://gist.github.com/codedokode/10539568
Было бы очень хорошо, если бы ты мог где-то у себя попрактиковаться в скачивании и работе с PEAR чтобы потом не тратить время. Для этого по идее достаточно иметь только php, даже Апач не нужен.
Если есть еще вопросы или что-то енпонятно, задавай.
> (проброс в hosts сделаем позже).
Я бы советовал поднять свой DNS-сервер. У меня конечно нет опыта админства, но интуиция подсказвыает что так добавлять хотсты проще да и вконтактики всякие можно заодно блокировать.
> Собственно, вопрос знатокам: как правильнее и, самое главное, по фасту отдебажить это говно, чтобы отвязаться уже от работы
Все ошибки пишутся под Апачем в логи (папка logs если ты не менял конфиг и если приложение не исплоьзует какую-то свою систему логгирования). Ты открываешь логи, вдумчиво читаешь ошибки, потом и идешь и исправляешь их по одной. После чего запускаете сайт, читаешь логи через пару недель и исправляешь оставшиеся (или передаешь программисту или учишь ее читать логи).
Ну и хорошо бы конечно научить программиста гиту, ибо изменения передавать вручную это ад, легко что-то еще сломать.
Также, проверь одинаковые ли у вас настройки php.ini, одинаковые ли расширения установлены. Просмотреть список расширений можно в консольке, набрав
c:\php\php -m
Просмотреть информацию о конфигурации php можно либо в консольке через
c:\php\php -i
Либо выполнив файл с кодом <?php phpinfo( ); через сервер и браузер.
> а потом не может найти какой-то файл в папке c:\php\pear\
Возможно что в константе как раз описан путь к файлу. Также, возможно что у тебя на сервере не установлены нужные пакеты из PEAR. PEAR — это репозиторий библиотек на php. В этом случае ты должен на сервер установить PEAR и используемые пакеты, в ту же папку. Как устанавливать пакеты PEAR под винду, я думаю, можн нагуглить. Делается это через консольку.
http://pear.php.net/manual/en/installation.php
http://stackoverflow.com/a/13032983
(пункт Installation of a local PEAR copy on a shared host не для тебя, а вот пункт Checking if PEAR works как раз надо выполнить) .
По сути надо скачать установщик, go-pear.phar и запустить его.
Папка куда ставятся пакеты, задается при установке PEAR вроде бы. Можно набрать
c:\php\php go-pear.phar --help
И посмотреть есть ли там опция для выбора папки. Ну или может он сам спросит при установке. Естественно, эту команду можно делать когда ты уже скачал go-pear.phar
Ну и надо путь к пакетам добавить в php.ini если его там нет. Опять же, инсталлятор умеет это делать сам.
Если ты плохо разбираешься в консольке, почитай мой мини-гайд: https://gist.github.com/codedokode/10539568
Было бы очень хорошо, если бы ты мог где-то у себя попрактиковаться в скачивании и работе с PEAR чтобы потом не тратить время. Для этого по идее достаточно иметь только php, даже Апач не нужен.
Если есть еще вопросы или что-то енпонятно, задавай.
Алсо, такую организацию работы (копировать папки руками, не использовать репозитории, сервер на windows, ручная настройка) используют только те, кому своего времени не жалко.
> У программиста сайта тоже такой папки нет и всё робит!
У нее она может быть в другом месте.
Как не попадать в спам, длинная история которую кратко не перескажешь. Читай хабр и гугли:
http://habrahabr.ru/post/114852/
http://toster.ru/q/12552
sleep тут вряд ли поможет
>Также, проверь одинаковые ли у вас настройки php.ini, одинаковые ли расширения установлены. Просмотреть список расширений можно в консольке, набрав
Да она полностью папку вампа кидает со всем говном. Никаких внешних файлов, кроме базы данных, сайт не использует.
А так спасибо, я всё понял. Только днс-сервер не буду поднимать. Я им, пожалуй, даже адрес не буду фигачить. Добавлю в закладки айпишник и пусть жрут говно.
С пиром то же самое. Я же сказал, что всё как у неё по файлам. А может быть она пиздит, что у неё нет папки C:\php\pear.
С соснолью знаком, не совсем ньюфаг.
Спасибо.
Да какая организация работы, ты о чём? Она комментарии на русском языке пишет. Человек шёл явно по пути говнообучения через русскоязычные устаревшие статьи. И вообще, вангую, что не писала, а ебашила в конструкторе каком-нибудь. Когда я спросил, кто писал, а она неуверенно сказала, что сама, в чём я усомнился почти сразу после того, как сидел и объяснял ей суть выводимых ошибок.
Оп, давно я тебе не писал. Тут решил заняться фронтендом. Я хоть и не изучал специально хтмл и ксс, но в течение жизни сталкивался и могу ориентироваться. Я не хочу туториалов "Getting started". Мне бы какой нибудь мануал по адаптивному дизайну, чтобы сразу там написали что надо знать для этого и как делать. Хочу простенький сайт-визитку с нуля написать, чтобы на мобилках красиво выглядел.
http://ideone.com/K48YzI
перевел в utf-8, в первом цикле я K сравнил с длиной самой длинной строки но вручную, я не знаю как сделать проверку внутри циклов чтобы не обходило несуществующие ячейки
если на идеван ещё выглядит сносно, то в браузере выводит кашу которая внутри ещё и начинает съезжать.
>А что плохого в русских комментариях?
Без знания русского языка их не прочитать.
В общем-то это их единственный недостаток.
>Надо переключать раскладку, чтобы их написать, например.
До недостатка это немного не дотягивает.
урлы не смотрел но внезапно понял что у меня кроме магазина тут еще кмс целый, так что пускай в личку заказы идут
Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить
header("Content-Type: text/plain; charset=utf-8");
Это заставит браузер воспринимать то, что выводит твоя программа, как обычный текст, а не HTML, и уважать переносы строк в нем (так как в языке HTML перенос строки равносилен пробелу).
Иначе перенос строки будет в исходном коде страницы (его можно увидеть нажав Ctrl + U), но на самой странице его не будет.
Задачки (пока без картинок)
Дан текст, который по идее должен быть номером телефона в виде 8-(911)-506 56 56 (т.е. человек может ввести не только цифры, но и скобки, минусы, может что-то еще). Но в реальности, пользователь может вместо номера написать что угодно. Напиши скрипт для проверки правильности введенного номера («8(911)-506 56 56» — правильный номер, «8-911-50-656-56» — правильный, «89115065656» — праивльный, «02» — неправильный, «89115065656 позвать Люду» — неправильный).
«Grammar Nazi». Напиши скрипт, проверяющий текст на наличие злостных ошибок:
нет пробела после запятой, точки с запятой, восклицательного знака, вопросительного знака, двоеточия
«жи» или «ши» написано с буквой ы
в тексте есть слово «координально» или «сдесь», «зделал», «зделаю», «зделан»
в тексте есть слова «а» или «но» без запятой перед ними.
(можешь добавить еще несколько правил, если хорошо знаешь русский язык)
В случае обнаружения ошибки скрипт должен писать сообщение об этом и выводить кусок текста с ошибкой (чтобы было понятно, что не так).
Вся надежда на тебя
То что я вижу на картинке выглядит не как проблема с браузером или чем-то еще, а ошибка в программе. То есть ты что-то написал неправильно. Попробуй посмотреть, может ты где-то пробел забыл вывести или наоборот лишний вывел. Можешь для удобства поменять текст чтобы в нем было всего несколько строк и проверить.
У тебя какие-то невидимые символы в коде программы. Скорее всего ты в редакторе выбрал для перевода строк формат «Windows» который при сохранении в файл вставляет в конец строчки невидимые символы \r\n.
Так как ты разбиваешь текст по символу \n то \r остается в конце строки, и в браузере при выводе он разрывает строку, отсюда такая картинка.
Решение — либо поменяй в редакторе кода формат строк на «unix», который вставляет только \n в конец строки, либо в программе для каждой строчки сделать trim() которая удаляет в том числе символы \r c краев строки.
Вообще, форматов конца строки 3: windows при сохранении помечает перевод строки 2 символами \r\n, unix символом \n, mac символом \r (имеется в виду древние версии макинтошей: современный мак использует unix формат).
Я проверил, скачав код с ideone — все отображается нормально (так как ideone использует unix формат видимо). Попробуй скачать свою программу с ideone и запустить — должно отображаться нормально.
По программе: сделано неплохо, есть небольшие замечания.
> for ($k = 0; $k < 34; $k++) {
Лучше сделать чтобы максимальная длина вычислялась автоматически. Это можно сделать в одну строчку с помощью функций max и array_map.
Маркер ?> в конце программы ставить не требуется.
Давай начнем с более простой задачи. Дана строка, например:
$s = '7123h666';
Программа должна проверить, является ли она строкой из 11 цифр, первая из которых равна 7, или нет (в примере не является). И вывести соответствующее собщение.
Это ты можешь сделать?
Надо сделать регулярку, которая соответствует цифре 7, за которой идет любые 10 любых цифр. И с помощью if (preg_match...) проверить соответствует ли строка регулярке или нет.
Если что-то непонятно, задавай вопросы. Я поясню или дам ссылку. Регулярки сложная для начинающего тема, но в них надо разбираться.
Вот тебе пример программы, которая проверяет, начинается ли строка с буквы или нет: http://ideone.com/HLi0E8
Изучи его, если что-то непонятно, тоже задавай вопросы.
И обязательно вкидывай решения в тред.
> я K сравнил с длиной самой длинной строки но вручную, я не знаю как сделать проверку внутри циклов чтобы не обходило несуществующие ячейки
Надо найти длину каждой строки и взять максимальное значение. Это умеет например делать функциия max.
Адаптивный дизайн по большому счету сводится к правилу @media в CSS и пары метатегов в html.
http://alexdev.ru/1497/
http://frontender.com.ua/mobile-web/wtf-viewport/
http://frontender.com.ua/mobile-web/useful-mobile-head-elements/
Ни в коем случае не снижай удобство польщования. Например не отключай зум на мобильных устройствах.
У меня есть макет, который нужно сверстать адаптивно, можешь попробовать: http://rghost.ru/59302066 (ну или если у тебя есть свой дизайн, можешь верстать его).
Вот примеры других адаптивных сайтов: http://designmodo.com/responsive-design-examples/
Из твоего поста вроде как ясно, что сами HTML/CSS ты знаешь и простые туториалы тебе не нужны. А как насчет моих простых задачек из «Пути HTML»? Если ты так хорошо знаешь все, ты на каждую не больше пары минут потратишь. А если вдруг у тебя где-то пробелы, это сразу станет видно и ты сможешь это исправить. Не хочешь попробовать свои силы? Вот ссылка: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
Мне кажется, эти задачки очень полезные. Если они тебе выглядят знакомыми, посмотри внимательно: у части я поменял условия, а часть добавил новых.
Спасибо, посмотрю.
Cкачал учебник по пхп, не помню источник. Столько ошибок в коде - ужс, лишние скобки, вот это все. Кто ж так пишет. Не первый раз замечаю, в мануалах на сайтах тоже такое встречается.
>Лучше return false. Как ты это будешь через if проверять?
Конкретно это просто скопипастил из примера. Я потом поменял на return false, но забыл обновить гитхаб.
>Анонима до сих пор не исправил....
А что здесь исправлять, я не помню?
https://github.com/sqghub/uppu.ru
Я переделал генерацию превью и сохранение обложек, но у меня ощущение, что я перебрал там.
http://pastebin.com/Mq9EPiEy
Вот так работает. И мне от этого грустно. Хотя хранение всех файлов в формате id/id-name спасет отца российской демократии.
Сделал вот так http://ideone.com/zKp8G9
Пробовал сохранять и под UNIX и под Win с trim(), всё равно каша в браузере, а в ideone выглядит нормально, пробовал брать другой текст всё равно в строке где заканчивается несколько слов остальная часть строки переезжает на следующую
Ты неправильно делаешь trim. Так у тебя trim не вырежет \r в переносах строк, он режет тольо края строки. Надо сначала разбить текст на отдельные строки и к ним применять trim по отдельности.
>>411090
Это версии Апача 2.2 и 2.4 так различаются. У меня видимо под 2.2 был.
Вообще, самый надежный способ — хранить файлы на сервере, где есть только какой-нибудь nginx и нет php. Вконтакте вроде так делает.
Ну или переименовывать их для хранения, типа
hello.php.txt
А при отдаче с помощью трбка с rewrite отдавать их по адресу /download/hello.php тем самым получая нормальное имя при сохранении. Мне кажется, стоит так сделать. Все же безопасность важная штука.
Один анон делал через php engine off, а потом оказалось что у него на хостинге эта опция отключена и защита фактически оказалась неработающей. Менять расширение все же надежнее.
> foreach ($newArray as $numStr => $str) {
> $lengthArray[$numStr] = mb_strlen($str, 'UTF-8');
> }
> $maxLength = max($lengthArray);
'utf-8' писать не надо если есть mb_internal-encoding. Также, этот цикл можно заменить на array_map, советую почитать мануал по этой функции.
Так, программа работает верно.
>>411086
> А что здесь исправлять, я не помню?
Не надо для анонимов хранить в базе строку Аноним, а надо хранить NULL.
> - 'year' => $id3['tags']['id3v2']['year'][0],
> + 'artist' => $id3['tags']['id3v1']['artist'][0],
А это почему так? Как я понимаю, там в треке могут быть id3 теги второй версии, а могут быть первой, а могут быть обе.
По поводу откуда брать теги, смотри, там на сайте id3 есть примеры разных медиафайлов:
http://www.getid3.org/demo/
http://www.getid3.org/demo/MPEG.mp3.html
http://www.getid3.org/demo/ASF.WMA.wma.html
id3v1, id3v2 — это теги только для mp3. В том же WMA их нет. А вот поле comments.artist есть в обоих примерах. мне кажется из него брать гораздо надежнее.
> Я переделал генерацию превью и сохранение обложек, но у меня ощущение, что я перебрал там.
Да не, вроде нормально с виду.
А вот что мне не очень нравится, это изменения в файле static/bootstrap/css/bootstrap-theme.css
Это часть бустстрапа? ты не должен никогда править что-то в сторонних библиотеках. Если хочешь дописать свои стиил, пиши их в своем css файле вне папки бутстрапа. Нельзя править сторонние библиотеки.
> foreach ($newArray as $numStr => $str) {
> $lengthArray[$numStr] = mb_strlen($str, 'UTF-8');
> }
> $maxLength = max($lengthArray);
'utf-8' писать не надо если есть mb_internal-encoding. Также, этот цикл можно заменить на array_map, советую почитать мануал по этой функции.
Так, программа работает верно.
>>411086
> А что здесь исправлять, я не помню?
Не надо для анонимов хранить в базе строку Аноним, а надо хранить NULL.
> - 'year' => $id3['tags']['id3v2']['year'][0],
> + 'artist' => $id3['tags']['id3v1']['artist'][0],
А это почему так? Как я понимаю, там в треке могут быть id3 теги второй версии, а могут быть первой, а могут быть обе.
По поводу откуда брать теги, смотри, там на сайте id3 есть примеры разных медиафайлов:
http://www.getid3.org/demo/
http://www.getid3.org/demo/MPEG.mp3.html
http://www.getid3.org/demo/ASF.WMA.wma.html
id3v1, id3v2 — это теги только для mp3. В том же WMA их нет. А вот поле comments.artist есть в обоих примерах. мне кажется из него брать гораздо надежнее.
> Я переделал генерацию превью и сохранение обложек, но у меня ощущение, что я перебрал там.
Да не, вроде нормально с виду.
А вот что мне не очень нравится, это изменения в файле static/bootstrap/css/bootstrap-theme.css
Это часть бустстрапа? ты не должен никогда править что-то в сторонних библиотеках. Если хочешь дописать свои стиил, пиши их в своем css файле вне папки бутстрапа. Нельзя править сторонние библиотеки.
если у тебя была непонятная ошибка при установки установщиком с официального сайта то это индусы из оракла напортачили и сделали кривой инсталлятор.
> Если в процессе установки вылетает ошибка «произошло исключение DateFormat что-то там такое», то пошли лучи проклятия криворуким разработчикам из Oracle и попробуй в настройках Windows временно поменять формат даты на English (US). Или скачай zip-версию и установи руками как описано тут: http://malwselennaiaru.ru/182-ustanovka-mysql-na-windows.html (этот совет был написан в 2014, может он устарел).
Еще раз напомню что многие хостинги не разрешают подсоединяться к базе снаружи хостинга.
> , но я глаза поломал искать вручную в огромном текстовом редакторе
Ну надо привыкать. Инструменты для программистов, они такие.
Выдает ошибки
> PHP Notice: Undefined variable: html in parser.php on line 23
> PHP Fatal error: Call to a member function find() on a non-object in parser.php on line 23
хотя если убрать функции, то все работает нормально. На php ни разу ничего не писал.
Помоги, анон.
Бесплатные это где всякие narod.ru? Нет, такие не надо. Еще вопрос, кстати, может показаться вам глупым:
Допустим я на локалхосте запускаю сайт под апачем, когда я апач выключаю, соответственно и сайт не работает. Так вот, такая же система будет и с хостингом, или существуют такие, где ты скидываешь файлы на их сервер и сайт работает независимо от твоего компьютера?
Любой хостинг работает независимо 24 часа в сутки. Насчет выбора, погугли, поищи обзоры хостнгов, где можно на одной странице сравнить параметры и цены.
>Так вот, такая же система будет и с хостингом, или существуют такие, где ты скидываешь файлы на их сервер и сайт работает независимо от твоего компьютера?
Лолд. Хостинг из названия подразумевает содержание твоего сайта на удалёлённой машине. Если ты покупаешь не впс, то там будет свой апач или энжайникс определённой версии со всем остальным говном вроде mysql и php, тебе надо будет просто закинуть папку с сайтом через ftp. Если впс, то тебе даётся чистый виртуальный сервак на прыщах, можешь туда хоть вишмастер поставить. Всякие апачи и прочую лабуду, разумеется, устанавливаешь сам через ssh.
Не путай с арендой домена, там ты просто название арендуешь.
О! спасибо, вставил в foreach где создавал новый массив с построчной длиной ещё и строку $newArray[$numStr] = trim($str, "\r");
теперь в браузере отображается идеально.
Насчет "неправильно скопировал" маловероятно.
Я переписал код , вставив стили прямо в него.
У меня всё работает нормально , я создаю "новый материал" в джумле , всталяю туда этот же код. В template.css к которому он обращается прописал все стили. и ни черта .
Мало того что не работают стили (хотя и отображаются в файрбаге), там ссылка тоже не включается.
>>410078
вот все применяемые стили.
Возможно реально блокируется каким-то js , но я не понимаю как обойти.
>А это почему так? Как я понимаю, там в треке могут быть id3 теги второй версии, а могут быть первой, а могут быть обе.
У меня все работало с v2, а потом внезапно я начал получать массив с тегами v2, в которых было куча всего, но не artist/album/etc.
>По поводу откуда брать теги, смотри, там на сайте id3 есть примеры разных медиафайлов:
Кк, посмотрю.
>А вот что мне не очень нравится, это изменения в файле static/bootstrap/css/bootstrap-theme.css
Я наоборот скачал бустстрап и залил его прямо из архива туда. Потому что перед этим я попробовал по глупости отформатировать пхпстормом всю папку с кодом.
>>411122
>Мне кажется, стоит так сделать. Все же безопасность важная штука.
Вообще я сразу думал, что стоит их хранить без имени совсем. Форматом id/id, а само имя хранить в бд и отдавать с ним. Но не захотел писать еще один скрипт, хотя понимал, что это правильно.
Бтв, я посмотрел, что делают с такими файлами различные файловые обменники. Одни отдают мне файл "htaccess", другие отдают "htaccess.какаятофигня", один попался, который отказался заливать .htaccess и попросил впихнуть его в архив.
И еще, у меня move_uploaded_file сохраняет имя файла в юникоде. Т.е. русские имена файлов в винде у меня отпадают. Я не знаю, стоит ли уделять этому внимание сейчас.
Не знаю, попробуй.
>>411187
> Т.е. русские имена файлов в винде у меня отпадают.
Если хочкшь чтобы под виндой работало надо в функции работы с файлами передавать имя в win-1251. То есть только под виндой перекодировать и только для передачи в функцию работы сфайлами. Я смотрел код PHP, он вместо юникода под виндой зачем-то использует 8-битную ansi колировку, то есть в России это будет Win 1251, где-нибудь в Европе какая нибудь европейская коировка. Не лучшее решение.
Я тоже не уверен, надо ли. Все равно не входящие в win1251 символы из других языков сохранить не удастся.
Может стоит хранить под id или под латинским именем, а просто отдавать по ссылке с нужным именем за счет rewrite
> что делают с такими файлами различные файловые обменники.
rghost вроде корректно работает тем не менее. Он правда на Руби написан и не использует Апач так что htacccess для него ничего не значит.
неужели мне в html надо писать include 'script.php';?
Можно из php подключить html через include. Все переменные будут доступны в подключенном скрипте.
Вот что-то на тему http://www.phpinfo.su/articles/practice/shablony_v_php.html
Спасибо, анончик, твоя задача получилась
http://ideone.com/MOsqAu
А вот мое решение задачи из списка http://ideone.com/CEZF1v
Не могу найти ошибку
Скобки это спец-символ, его нужно экранировать обратными слешами
http://ideone.com/Rp8C1i
Плюс у тебя пробелы в номере, а твое регулярное выражение их не принимает, следовательно нужно доделать его немного.
Не понимаю почему делает 2 цикла нормально, потом ансетит 29 ячейку, указатель переходит на 30, потом переходит на несуществующую ячейку, дальше включает проверка isset и next() срабатывает лишний раз http://ideone.com/ZqpPM5
Наконец-от решил последнее задание. У меня от этого РЕФЕРЕНСНЫЙ ГЕНОМ!
Проверка
Ну для начала, у меня проблема в том, что через денвер сайт отображается не корректно. Ну а во-вторых: на мыло не приходит сообщение с формы. В общем, если можешь помочь, напиши в скайп mirontsar
> твоя задача получилась
Нет, пока не получилась. Посмотри внимательно, внизу ошибки:
> PHP Warning: preg_match(): No ending delimiter '/' found in /home/CRxm4b/prog.php on line 8
Ты в начале регулярки поставил ограничитель, слеш, а в конце забыл и из-за этого она не работает.
Регулярка должна быть всегда с 2 сторон заключена в ограничитель, это может быть например слеш, восклицательный знак, решетка или еще какой-то символ, который не является спецсимволом:
/abc/
~abc~
!abc!
#abc#
Внимательно ли ты читал урок? Там в самом начале большими буквами нарисован пример регулярки.
Также, еще одна ошибка, у тебя там стоит лишний пробел:
"/^7[0-9] {11}"
Получается, твое выражение читается так:
— в начале должна идти цифра 7
— за ней 1 любая цифра
— за ней ровно 11 пробелов
Если бы пробела не было, конструкция {11} относилась бы в цифрам в квадратных скобках и было бы так:
— в начале должна идти цифра 7
— за ней 11 любых цифр
Исправь ошибки и снова покажи что вышло. В программировании надо быть внимательным к мелочам, тут нельзя просто так забыть какую-нибудб точку с запятой или лишний пробел постаивть.
После этой задачи советую решить задачку на регулярки чуть посложнее:
Дан текст, надо проверить есть ли в нем дата, если есть то вывести ее. Дата выглядит как «3 марта», то есть день, за ним идет месяц. Между днем и месяцем может быть 1 или больше пробелов. При этом фраза вроде «3 маяка» не должна восприниматься как «3 мая».
Не забудь поставить в конце регулярки флаг u иначе русские буквы правильно работать не будут.
> твоя задача получилась
Нет, пока не получилась. Посмотри внимательно, внизу ошибки:
> PHP Warning: preg_match(): No ending delimiter '/' found in /home/CRxm4b/prog.php on line 8
Ты в начале регулярки поставил ограничитель, слеш, а в конце забыл и из-за этого она не работает.
Регулярка должна быть всегда с 2 сторон заключена в ограничитель, это может быть например слеш, восклицательный знак, решетка или еще какой-то символ, который не является спецсимволом:
/abc/
~abc~
!abc!
#abc#
Внимательно ли ты читал урок? Там в самом начале большими буквами нарисован пример регулярки.
Также, еще одна ошибка, у тебя там стоит лишний пробел:
"/^7[0-9] {11}"
Получается, твое выражение читается так:
— в начале должна идти цифра 7
— за ней 1 любая цифра
— за ней ровно 11 пробелов
Если бы пробела не было, конструкция {11} относилась бы в цифрам в квадратных скобках и было бы так:
— в начале должна идти цифра 7
— за ней 11 любых цифр
Исправь ошибки и снова покажи что вышло. В программировании надо быть внимательным к мелочам, тут нельзя просто так забыть какую-нибудб точку с запятой или лишний пробел постаивть.
После этой задачи советую решить задачку на регулярки чуть посложнее:
Дан текст, надо проверить есть ли в нем дата, если есть то вывести ее. Дата выглядит как «3 марта», то есть день, за ним идет месяц. Между днем и месяцем может быть 1 или больше пробелов. При этом фраза вроде «3 маяка» не должна восприниматься как «3 мая».
Не забудь поставить в конце регулярки флаг u иначе русские буквы правильно работать не будут.
> Не могу найти ошибку
Пробел в регулярке обозначает, что в тексте на этом месте тоже должен быть пробел. То есть твоя регулярка телефоны записанные без пробелов не распознает.
> [0-9] {7}
Та же ошибка. У тебя число повторений, {7}, относится к пробелу а не к цифре. То есть у тебя регулярка значит:
— должна идти цифра
— за ней ровно 7 пробелов
Этот >>411245\t анон правильно написал про скобки. Если ты хочешь сказать «в этом месте должна быть скобка», то надо писать
\\(
так как скобка является спецсимволом в регулярках. Вот полный список символов которые надо экранировать бекслешем: http://php.net/manual/ru/regexp.reference.meta.php
По моему тут ошибка:
> reset($newArray);
> for ($s = 1; $s < $z; $s++) {
> next($newArray);
> }
Зачем этот цикл? Если ты вышел за границу массива, надо просто поставить указатель на начало и продолжать внешний цикл по $i, а ты дополнительно сдвигаешь указатель и он куда-то не туда начинает указывать.
Также, мне кажется лучше не решать задачу через next/currrent. Это очень неудобные функции, так как внутренний указатель массива не виден, и он сбрасывается при некоторых операциях. Я думаю, явно использовать переменную-счетчик гораздо лучше. А так, смотри, ты сам в своем же коде запутался. Это значит он не очень понятный и надо его упростить.
Вот варианты:
— Ты можешь перенумеровывать массив после удаления элемента через array_values
— ты можешь удалять элемент по его номеру (не по ключу а именно по номеру) функцией array_splice
— ты можешь использовать обход массива через foreach с уменьшением счетчика, если он дошел до нуля, удаляем текущий элемент
— ты можешь использовать двусвязный список, обходить его и удалять каждый N-й элемент. В PHP есть класс для организации такого списка, но увы, для его исплоьзования надо знать ООП: http://php.net/manual/ru/class.spldoublylinkedlist.php
Явное лучше неявного и переменная-счетчик гораздо удобнее возни с current и reset.
А бля, я >>411479 тупанул, ты пытаешься использовать его, но у тебя нихера не выходит.
>> PHP Fatal error: Call to a member function find() on a non-object in parser.php on line 23
В общем качаешь сначала саму библиотечку, например в этой статье есть прямая ссылка: http://habrahabr.ru/post/69149/
Ну далее скидываешь её в папку с пхп или в папку с твоим непосредственно сайтом и в своём быдлокоде её подключаешь
с помощью:
> require ('phpQuery/phpQuery.php');
Как проделаешь все это - отпишись.
Опять хуйни насоветовал, ты просто передаешь в функцию неправильную переменную, что-то упущено в цепочке кароче. Загугли примеры лучше в интернетах, и посмотри как в них сделано.
Держи, очень простая: http://codeforces.ru/problemset/problem/1/A
Еще одна очень простая: http://codeforces.ru/problemset/problem/4/A
Это для быстрой разминки. Если ты их решил то переходи к этой:
http://codeforces.ru/problemset/problem/71/A — там написано что буквы могут быть только латинскими, это слишком просто, сделай чтобы буквы были из любого алфавита. Также, пусть на вход даются не отдельные слова, а одна строка с текстом — твоя программа должна сама найти и заменить в ней длинные слова.
Тебе может помочь эта информация: http://php.net/manual/ru/regexp.reference.unicode.php
Если ты и эту решил, давай возьмем еще посложнее: http://codeforces.ru/problemset/problem/50/A
Не смотри что задачи с codeforces, их там решило больше 10 000 человек, так что они элементарные.
Ну и если ты решил задачи из учебника и не показывал решение, то советую показать. Может ты думаешь, что все верно. а там ошибки.
Я тут глянул твой файлообменник, оказывается в нем баги. Чтобы запустить код, приходится их исправлять.
> `date` DATETIME NOT NULL DEFAULT NOW()
Не работает. Пробовал загрузить свой же дамп? Надо писать DEFAULT CURRENT_TIMESTAMP, выражения в DEFAULT нельзя использовать.
> <?php include('/scripts/scripts.php'); ?>
Это не работает. Слеш в начале значит что это абсолютный путь, то есть путь от корня диска или файловой системы (в линукс к примеру). Естественно, у меня там этого скрипта нет, так как полный путь это что-то вроде /var/www/test.dev/scripts/scripts.php
Более того, ты должен подключать этот файл не в шаблоне а в index.php
Насчет формы поиска: в бутстрапе есть готовая форма для верхней панельки: http://getbootstrap.com/2.3.2/components.html#navbar
Не используй <?, используй <?php либо <?= так как короткий открывающий тег может быть выключен: http://php.net/manual/ru/ini.core.php#ini.short-open-tag
При ошибке у тебя зачем-то вываливаются технические подробности ошибки поьзователю:
> Ошибка! Ошибка сохранения файла. exception 'ErrorException' with message 'mkdir(): Permission denied' in /var/www/test.dev/www/model/FileMapper.php:101 .....
> if (!mkdir("userFiles/" . ($file->getId()), 0, true)) {
Ты создаешь папку с разрешением = 0 то есть полный запрет доступа. Соответственно он не может файл туда переместить. Почитай про права под линуксом:
https://ru.wikipedia.org/wiki/Chmod
http://www.opennet.ru/base/sys/file_access.txt.html
При этом помни что в php чтобы написать 8-чное число, надо поставить ноль в начале, например: 0777
Нет никакой валидации комментариев. Я отправляю пустую форму и получаю пустой комментарий.
У тебя XSS при выводе email в комментарии. Попробуй вставить комментарий с email = hello<s>world (если браузер не позволяет, можно вставить в базу).
В комментарии не работают переводы строк и весь текст пишется без разрывов строк.
Форма очень крошечная, попробуй сам впиши туда осмысленный комментарий.
После постинга комментария надо редиректить чтобы страница прокручивалась к комментарию, добавив к ссылке для редиректа #comment-1234567 (и прописав это в аттрибуте id у комментария).
Чтобы картинки скачивались, а не открывались в браузере, надо добавить через htaccess заголовок Content-Disposition: attachment к файлам внутри userFiles
Размер файла в списке последних файлов лучше выводить также как и на странице просмотра, в килобайтах. У тебя должна быть функция для преобразования числа в человекопонятный формат.
Для gif не создаются превьюшки.
Если загрузить маленькую картинку, то она ставится в качестве превьюшки. Но ссылка прописана неверно и вместо /userFiles/.... мы получаем /download/X/userFiles/... и картинка не отображается.
Если загрузить файл tif то он почему-то ставится в качестве превьюшки, хотя браузер такой формат не поддерживает.
Если загрузить прозрачную PNG то прозрачность заменяется на черный цвет (понятно что JPG не поддерживает прозрачность, но лучше сделать белый или в клеточку фон).
Если загрузить файл с очень длинным именем, оно переносится в таблице последних файлов на вторую строчку, и она разъезжается. Тут конечно надо применять table-layout: fixed и вручную заданную ширину колонок.
Если загрузить mp3 файл без ID3v1 тегов то вываливается исключение: Ошибка сохранения файла. exception 'ErrorException' with message 'Undefined index: id3v1' in /var/www/test.dev/www/model/media/MediaDataManager.php:36
Если загрузить wav файл то вываливается Ошибка! Ошибка сохранения файла. exception 'ErrorException' with message 'Undefined index: tags' in /var/www/test.dev/www/model/media/MediaDataManager.php:36
Для формы комментария надо сделать защиту от CSRF через передачу токена. Токен можно хранить например в куках.
Ты исплоьзуешь функцию Query в Sphinx API. У нее в описании написано: http://sphinxsearch.com/wiki/doku.php?id=php_api_docs#query_query_index
что она возвращает false при ошибке. Ты не проверяешь результат возврата функции на ошибку и соответственно не узнаешь о ней. Надо проверять. Получить текст ошибки можно через GetLastError( ).
Я тут глянул твой файлообменник, оказывается в нем баги. Чтобы запустить код, приходится их исправлять.
> `date` DATETIME NOT NULL DEFAULT NOW()
Не работает. Пробовал загрузить свой же дамп? Надо писать DEFAULT CURRENT_TIMESTAMP, выражения в DEFAULT нельзя использовать.
> <?php include('/scripts/scripts.php'); ?>
Это не работает. Слеш в начале значит что это абсолютный путь, то есть путь от корня диска или файловой системы (в линукс к примеру). Естественно, у меня там этого скрипта нет, так как полный путь это что-то вроде /var/www/test.dev/scripts/scripts.php
Более того, ты должен подключать этот файл не в шаблоне а в index.php
Насчет формы поиска: в бутстрапе есть готовая форма для верхней панельки: http://getbootstrap.com/2.3.2/components.html#navbar
Не используй <?, используй <?php либо <?= так как короткий открывающий тег может быть выключен: http://php.net/manual/ru/ini.core.php#ini.short-open-tag
При ошибке у тебя зачем-то вываливаются технические подробности ошибки поьзователю:
> Ошибка! Ошибка сохранения файла. exception 'ErrorException' with message 'mkdir(): Permission denied' in /var/www/test.dev/www/model/FileMapper.php:101 .....
> if (!mkdir("userFiles/" . ($file->getId()), 0, true)) {
Ты создаешь папку с разрешением = 0 то есть полный запрет доступа. Соответственно он не может файл туда переместить. Почитай про права под линуксом:
https://ru.wikipedia.org/wiki/Chmod
http://www.opennet.ru/base/sys/file_access.txt.html
При этом помни что в php чтобы написать 8-чное число, надо поставить ноль в начале, например: 0777
Нет никакой валидации комментариев. Я отправляю пустую форму и получаю пустой комментарий.
У тебя XSS при выводе email в комментарии. Попробуй вставить комментарий с email = hello<s>world (если браузер не позволяет, можно вставить в базу).
В комментарии не работают переводы строк и весь текст пишется без разрывов строк.
Форма очень крошечная, попробуй сам впиши туда осмысленный комментарий.
После постинга комментария надо редиректить чтобы страница прокручивалась к комментарию, добавив к ссылке для редиректа #comment-1234567 (и прописав это в аттрибуте id у комментария).
Чтобы картинки скачивались, а не открывались в браузере, надо добавить через htaccess заголовок Content-Disposition: attachment к файлам внутри userFiles
Размер файла в списке последних файлов лучше выводить также как и на странице просмотра, в килобайтах. У тебя должна быть функция для преобразования числа в человекопонятный формат.
Для gif не создаются превьюшки.
Если загрузить маленькую картинку, то она ставится в качестве превьюшки. Но ссылка прописана неверно и вместо /userFiles/.... мы получаем /download/X/userFiles/... и картинка не отображается.
Если загрузить файл tif то он почему-то ставится в качестве превьюшки, хотя браузер такой формат не поддерживает.
Если загрузить прозрачную PNG то прозрачность заменяется на черный цвет (понятно что JPG не поддерживает прозрачность, но лучше сделать белый или в клеточку фон).
Если загрузить файл с очень длинным именем, оно переносится в таблице последних файлов на вторую строчку, и она разъезжается. Тут конечно надо применять table-layout: fixed и вручную заданную ширину колонок.
Если загрузить mp3 файл без ID3v1 тегов то вываливается исключение: Ошибка сохранения файла. exception 'ErrorException' with message 'Undefined index: id3v1' in /var/www/test.dev/www/model/media/MediaDataManager.php:36
Если загрузить wav файл то вываливается Ошибка! Ошибка сохранения файла. exception 'ErrorException' with message 'Undefined index: tags' in /var/www/test.dev/www/model/media/MediaDataManager.php:36
Для формы комментария надо сделать защиту от CSRF через передачу токена. Токен можно хранить например в куках.
Ты исплоьзуешь функцию Query в Sphinx API. У нее в описании написано: http://sphinxsearch.com/wiki/doku.php?id=php_api_docs#query_query_index
что она возвращает false при ошибке. Ты не проверяешь результат возврата функции на ошибку и соответственно не узнаешь о ней. Надо проверять. Получить текст ошибки можно через GetLastError( ).
Я исправил пробелы и поставил слеш в конце, но он все равно не хочет видеть эту сраную семерку. http://ideone.com/9K6pA9
В разных БД разный синтаксис. Но в любом случае ты дату вставляешь в запрос каким-то образом, и тут тебе понадобится метод format.
Он должен находить номера из 11 цифр. А посчитай внимательно, сколько цифр ожидает увидеть твоя регулярка.
Также, она пропускает длинннющие номера: http://ideone.com/IO9jAV
Решено! Может кому-то поможет.
В общем , встроенный в джумлу редактор менял код , зачем то выводя <p> вне ссылки <a> .
Помогло принудительное отключение редактора.
Сейчас решил нахуй удалить форму акции (pic1), в шаблоне закоментил (pic2) , она вместо того чтобы исчезнуть превратилась в пикрелейтед 3.
За этот кусок теперь отвечает что-то под название simpleform2 , его вообще не могу найти
Функция (x) {
если нажимаем на элемент x, то делаем его красным;
остальные элементы делаем серым цветом;
}
В общем, я не один раз уже сталкивался с подобной хуйней, кто более опытный, помогите, пожалуйста.
Про передачу параметров в аргумент функции знаю, но не знаю как реализовать в данном примере.
Функции и есть техника для избавления от повторяющего кода
заменяеш повторяющийся места на параметр
function ChangeColor_x(x) {
\tfor (i=0; i<items.length; i++) {
\t\titems.style.color = "grey";
\t\titems[x-1].style.color = "red";
\t\t}
\t}
параметр передаётся при вызове
Спасибо, анон! Только нужно было так:
items.style.color = "grey";\t
items[x].style.color = "red";
Пофиксил, добра!
}
будет испольняться если строка не соотвествует заданому шаблону, верно?
Верно
Личный опыт. Зандстра это не та книжка, которую стоит читать второй по php. Не много в голове останется. Но если ты конечно уже на чем-то пишешь, тогда не знаю. Но тогда тебе не нужна книжка по основам, тебе нужна документация.
Вообще странная книга. Я чуть-чуть пробовал её читать, но даже с моими малыми знаниями она выглядела как некое пособие "как перестать перестать быдлокодить для опытных быдлокодеров".
Учебник в оп-посте, очевидно же.
Посмотри оп-пост
mb_iternal_encoding('utf-8'); в php
charset = 'utf-8' в форме.
>>411663
Хм, не знаю, что тебе посоветовать. Я имел понятия о sql(в 14 лет интересовался sql-inj) и начал писать сразу. Юзаю PDO, брат жив.
концу
в views/layouts/main есть <div id="mainmenu"> для вывода менюшки наверху экрана. Я пытался добавить свои ссылки по подобию, но облажался.
Хотел: http://127.0.0.1/yii/music/index.php?r=gii
Написал: array('label'=>'Gii Module', 'url'=>array('gii'))
Получил: http://127.0.0.1/yii/music/index.php?r=<текущий модуль>/gii
Как писать нормально ссылки?
Вопрос 2:
В представлении захерачил отображении картинки таким образом: <img width="50" height="50" src="http://127.0.0.1/yii/music/images/cover/<?php echo CHtml::encode($data->cover); ?>">
Вопрос: как бы сделал Yii-программист?
>>411561
Сделал только что остальные, нужны задачки посложнее
http://ideone.com/f5vT2t
http://ideone.com/L13yxC
>Пробовал загрузить свой же дамп? Надо писать DEFAULT CURRENT_TIMESTAMP
Хм, у меня работает.
>Это не работает. Слеш в начале значит что это абсолютный путь
Я на это и расчитывал, думал, что он начнет путь от сервера. Ну и я не знал, как подключить относительным путем, шаблон то не в корне лежит. Но оказалось, что путь отсчитывается с index.php.
>Более того, ты должен подключать этот файл не в шаблоне а в index.php
Хорошо.
>Насчет формы поиска: в бутстрапе есть готовая форма для верхней панельки
А у меня нет таких классов. Наверное, это связано с этим
>Heads up! These docs are for v2.3.2, which is no longer officially supported. Check out the latest version of Bootstrap!
>Не используй <?, используй <?php либо <?= так как короткий открывающий тег может быть выключен
А при выключенных коротких тегах <?= работает?
>Ты создаешь папку с разрешением = 0 то есть полный запрет доступа. Соответственно он не может файл туда переместить. Почитай про права под линуксом:
Шиндоус же. Я вписал 0 и был доволен. В линуксе нужно 0777 и все?
>У тебя XSS при выводе email в комментарии.
500 раз, я же говорил.
Бтв, в тексте коммента тоже.
>Нет никакой валидации комментариев.
Это да. По хорошему и имейл стоит проверять, но можно же и не проверять?
>Размер файла в списке последних файлов лучше выводить также как и на странице просмотра, в килобайтах.
Это я просто до этого хранил в формате "x кб" и забыл переделать это. Косяк.
>В комментарии не работают переводы строк и весь текст пишется без разрывов строк.
Честно говоря даже нет идей. Но позже посмотрю, что я смогу сделать.
>что она возвращает false при ошибке. Ты не проверяешь результат возврата функции на ошибку и соответственно не узнаешь о ней.
В общем то у меня там стоит if (data == 0), что сработает, при возвращении false. Но, я так понимаю, надо выводить что-то в лог?
>Для формы комментария надо сделать защиту от CSRF через передачу токена. Токен можно хранить например в куках.
Это вообще жуть. Я ни слова не понял. Но разберусь.
А с картинками-аудиофайлами я потом посмотрю, что сделать.
>Пробовал загрузить свой же дамп? Надо писать DEFAULT CURRENT_TIMESTAMP
Хм, у меня работает.
>Это не работает. Слеш в начале значит что это абсолютный путь
Я на это и расчитывал, думал, что он начнет путь от сервера. Ну и я не знал, как подключить относительным путем, шаблон то не в корне лежит. Но оказалось, что путь отсчитывается с index.php.
>Более того, ты должен подключать этот файл не в шаблоне а в index.php
Хорошо.
>Насчет формы поиска: в бутстрапе есть готовая форма для верхней панельки
А у меня нет таких классов. Наверное, это связано с этим
>Heads up! These docs are for v2.3.2, which is no longer officially supported. Check out the latest version of Bootstrap!
>Не используй <?, используй <?php либо <?= так как короткий открывающий тег может быть выключен
А при выключенных коротких тегах <?= работает?
>Ты создаешь папку с разрешением = 0 то есть полный запрет доступа. Соответственно он не может файл туда переместить. Почитай про права под линуксом:
Шиндоус же. Я вписал 0 и был доволен. В линуксе нужно 0777 и все?
>У тебя XSS при выводе email в комментарии.
500 раз, я же говорил.
Бтв, в тексте коммента тоже.
>Нет никакой валидации комментариев.
Это да. По хорошему и имейл стоит проверять, но можно же и не проверять?
>Размер файла в списке последних файлов лучше выводить также как и на странице просмотра, в килобайтах.
Это я просто до этого хранил в формате "x кб" и забыл переделать это. Косяк.
>В комментарии не работают переводы строк и весь текст пишется без разрывов строк.
Честно говоря даже нет идей. Но позже посмотрю, что я смогу сделать.
>что она возвращает false при ошибке. Ты не проверяешь результат возврата функции на ошибку и соответственно не узнаешь о ней.
В общем то у меня там стоит if (data == 0), что сработает, при возвращении false. Но, я так понимаю, надо выводить что-то в лог?
>Для формы комментария надо сделать защиту от CSRF через передачу токена. Токен можно хранить например в куках.
Это вообще жуть. Я ни слова не понял. Но разберусь.
А с картинками-аудиофайлами я потом посмотрю, что сделать.
Надо было конечно не только функцию написать, а еще ее вызов и echo, а то неудобно как-то.
По задаче про деление арбуза: допустим аргбуз весит 2 кг. Твоя программа напишет YES, а как ты его разделишь?
По задаче про площадь: возьмем площадь 9×9 и плитку 8×8. Твоя программа посчитает что надо 2 плитки. А теперь нарисуй это на листочке и попробуй покрыть 2 плитками площадь.
Увы, пока неверно. Старайся дальше.
И вот еще неприавльное место:
> \t$half = $w / 2;\t
>if (is_int($half))
Это неправильно. В PHP числа могут быть представлены в 2 видах: int или float. int может хранить только небольшие целые числа, а float любые, в том числе и целые:
$a = 3.0;
var_dump($a); // float
http://ideone.com/G0KgWJ
Потому проверка in_int не гарантирует ничего, так как целое число может быть и типа float. Проверять делится ли число на 2, надо взяв остаток от деления на 2. Проверять целое ли число надо сравнив его с окргуленной версией самого себя и найдя разницу (так как в компьютере неточная приближенная арифметика то надо проверить что разница меньше определенной величины. Просто сравнивать что числа равны не стоит).
> зачем то выводя <p> вне ссылки <a> .
Ты бы стандарт HTML почитал. В HTML4 внутри a нельзя класть блочные ээлементы (в HTML5 стало можно но другие ограничения остались). Ты не изучил даже основы HTML, а уже говоришь что редактор плохой.
Ты так далеко не уйдешь методом проб и ошибок. Надо изучать и html и css и php, иначе всегда так и будешь шариться в потемках.
>>411596
О, крутые «косимиси», интересно получилось. Хотя как-то у тебя все вырождается в движение по кругу. И проверки на коллизии нету, несколько мышек находятся в одной точке пространства. Ну и еще у мышки радиус зрения ограничен, так что они не должны в центре совершать колебания, а должны гулять не замечая кошек. Ну и непонятно, съели они хоть оду мышку когда окружили или нет. Надо было какой-нибудь эффект сделать при съедении.
Ну и кружочки наверно стоило сгладить, а то зубчатые края бросаются в глаза.
Я вижу ты не очень знаешь яваскрипт. Не хочешь ли порешать наши задачки, которые помогут тебе исправить пробелы в знаниях? Я проверю решения и подскажу если ты где-то запутался: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
Ну и то, что ты делаешь, конечно надо делать не так. Удобнее работать не со стилями, а менять css классы на элементе. Ну а в новых браузерах такая штука вообще делается на CSS3 без яваскрипта. В моем «Пути HTML» как раз такая задача есть: https://gist.github.com/codedokode/58ebc90bd006baf4b35c
>>411622
Не ругайся в треде.
>>411653
Это может быть и так, но понимаешь, многие другие книги «для начинающих» это «как начать быдлокодить», а не «как начать программировать». Потому я ее и рекомендую, что она правильному учит. ну да, хотя может быть она не для начинающих.
>>411663
У меня есть самый краткий мануал (который правда тольком ничего не обхясняет, а только дает список слов), ссылки на теорию и задачки, которые я советую решить и выложить на sqlfiddle. Задачки на мой взгляд неплохие: https://gist.github.com/codedokode/10539213
Сперва и хотел дважды разделить пополам, но потом стал перечитывать условие задачи и удалил второе деление. Вот ещё по задаче на К-строку http://ideone.com/IozJXd
> окромя ооп, dom'ов, ajax'ов
Вообще зря. У меня в учебнике в последней главе есть объяснение ООП, которое даже полный идиот поймет перечитав несколько раз, и задачки на ООП. НУ и я готов подсказать и дать ссылочку. А то без ООП ты в наши дни никуда не уйдешь: фреймворки все на ООП.
> mysql(устарел же, только mysqli или PDO, не?
Верно, и я советовал бы PDO. У mysqli есть крутые фичи, но наичнающий в них только запутается.
Ну и насчет пилить что-то, у нас есть 2 годных задачи:
проще: https://gist.github.com/codedokode/d7e7f11449fc3bcb24b4
сложнее https://gist.github.com/codedokode/9424217
http://ideone.com/ulJYel
это по арбузам.
А по задачке покрытия площади я не согласен. Вот в условии: "Какое наименьшее количество плит понадобится для замощения площади? Разрешено покрыть плитами большую поверхность, чем театральная площадь, но она должна быть покрыта обязательно. Гранитные плиты нельзя ломать или дробить, а разрешено использовать только целиком. Границы плит должны быть параллельны границам площади." то-есть покрыть площадь надо обязательно и можно покрыть большую площадь, если взять твое условие: возьмем площадь 9×9 и плитку 8×8., одна плитка не покроет, а это уже противоречие условиям задачи (нельзя оставлять непокрытую площадь), а вторая покроет намного большую площадь чем нужно, но это не противоречит условиям задачи напрямую, там сказано, что можно замостить площадь больше чем нужно, и так как плитку ломать нельзя, тогда думаю что моё решение удовлетворяет условия задачи.
файл с исходником в utf-8 (без BOM) сохранен?
>>411683
Почитай доки: http://www.yiiframework.com/doc/guide/1.1/ru/topics.url — там нет ответа?
Особенно это:
> Подсказка: Адрес URL, генерируемый методом createUrl является относительным. Для того, чтобы получить абсолютный адрес, нужно добавить префикс, используя Yii::app()->request->hostInfo, или вызвать метод createAbsoluteUrl.
> захерачил отображении картинки таким образом:
ну вот теперь сам подумай, выложишь ты сайт на хостинг, откроет его кто-то и что он увидит по адресу 127.0.0.1 вместо картинки? Я думаю ничеого если у него Апач не установлен.
Во-первых, ты не обязан писать полный URL включая пртокол, хост и тд. Можно исплоьзовать короткий относительный URL: http://htmlbook.ru/samhtml/ssylki/absolyutnye-i-otnositelnye-ssylki
http://www.uamedwed.com/web/absolyutnyj-i-otnositelnyj-put-k-fajlam.htm
Во-вторых, не прописывай явно пути, а вынеси в какую-нибудь переменную (или поищи существующую).
>>411696
Ну давай проверим.
> длинные слова
Там надо сделать по-другому. Тебе дан текст, ты должен найти в нем длинные слова, заменить и вернуть измененный текст. У тебя же программа работает с одним словом.
ну и echo и вызов функции допиши чтобы было видно что работает.
Про домино — верно, действительно что-то слишком просто. Я чуть более сложный алгоритм придумал (стыдно-стыдно такую простую задачку сразу не решить)
Вот новые задачки:
Попроще: http://codeforces.ru/problemset/problem/433/A (если что я не знаю, откуда персонажи в задаче)
Среднее: задачи 2 и 5 отсюда: http://archive-ipq-co.narod.ru/i-am-smart.html
Посложнее: http://codeforces.ru/problemset/problem/476/B
(там у меня на примете есть еще задачи)
файл с исходником в utf-8 (без BOM) сохранен?
>>411683
Почитай доки: http://www.yiiframework.com/doc/guide/1.1/ru/topics.url — там нет ответа?
Особенно это:
> Подсказка: Адрес URL, генерируемый методом createUrl является относительным. Для того, чтобы получить абсолютный адрес, нужно добавить префикс, используя Yii::app()->request->hostInfo, или вызвать метод createAbsoluteUrl.
> захерачил отображении картинки таким образом:
ну вот теперь сам подумай, выложишь ты сайт на хостинг, откроет его кто-то и что он увидит по адресу 127.0.0.1 вместо картинки? Я думаю ничеого если у него Апач не установлен.
Во-первых, ты не обязан писать полный URL включая пртокол, хост и тд. Можно исплоьзовать короткий относительный URL: http://htmlbook.ru/samhtml/ssylki/absolyutnye-i-otnositelnye-ssylki
http://www.uamedwed.com/web/absolyutnyj-i-otnositelnyj-put-k-fajlam.htm
Во-вторых, не прописывай явно пути, а вынеси в какую-нибудь переменную (или поищи существующую).
>>411696
Ну давай проверим.
> длинные слова
Там надо сделать по-другому. Тебе дан текст, ты должен найти в нем длинные слова, заменить и вернуть измененный текст. У тебя же программа работает с одним словом.
ну и echo и вызов функции допиши чтобы было видно что работает.
Про домино — верно, действительно что-то слишком просто. Я чуть более сложный алгоритм придумал (стыдно-стыдно такую простую задачку сразу не решить)
Вот новые задачки:
Попроще: http://codeforces.ru/problemset/problem/433/A (если что я не знаю, откуда персонажи в задаче)
Среднее: задачи 2 и 5 отсюда: http://archive-ipq-co.narod.ru/i-am-smart.html
Посложнее: http://codeforces.ru/problemset/problem/476/B
(там у меня на примете есть еще задачи)
Я советую не возвращать из функций строки вроде "Sorry, your string is invalid\n" так как это невозможно проверть с помощью if. Лучше вернуть например false или -1.
Не принимает строку print_r(doKstring('аббаббаббабб', 4)); хотя она верная
Также, открой код по своей ссылке и посмотри внимательно внизу:
> PHP Notice: Use of undefined constant абвавбабв - assumed 'абвавбабв' in /home/Nq1VYY/prog.php on line 35
> PHP Notice: Undefined offset: 9 in /home/Nq1VYY/prog.php on line 25
> PHP Notice: Undefined variable: new_string in /home/Nq1VYY/prog.php on line 29
Это надо исправить. Ты по моему кавычки забыл вокруг строки.
Если ты запускал код на локалхосте и не видел ошибок то у тебя отключен их вывод.
В PHP по умолчанию выключено отображение ошибок в браузере, так как обычному пользователю сайта эта информация ни к чему. Но тебе, как программисту, надо видеть эти ошибки. Вот, как можно их просмотреть:
- ошибки сохраняются в лог ошибок. Можно открыть его и почитать. Если ты запускаешь код на локалхосте, у себя, то лог хранится в папке Апача (обычно она называется logs) и имеет название вроде error.log (в линуксе в папку /var/log/apache2 ). Если на хостинге — там либо есть файл error.log либо раздел в панели управления, где лог можно посмотреть
- также, ты можешь включить отображение ошибок. Открой файл php.ini, поставь там display_errors = On и error_reporting = E_ALL и перезапусти сервер. Теперь ошибки должны выводиться на экран.
Проверить, работает ли вывод ошибок, можно запустив скрипт содержающий обращение к несуществующей переменной вроде echo $sdgasdad; и проверив, выведется ошибка или нет. Если все верно, то должна вывестись.
>а вторая покроет намного большую площадь чем нужно, но это не противоречит условиям задачи напрямую, там сказано, что можно замостить площадь больше чем нужно, и так как плитку ломать нельзя, тогда думаю что моё решение удовлетворяет условия задачи.
Правильно, ты можешь покрыть большую площадь чем надо, но непокрытого места не должно быть. Возьми листочек и нарисуй как ты 2 плитками 8×8 покроешь площадь 9×9. Это невозможно.
Требуется именно покрыть всю площадь или больше. Потому твое решение неверное, так как оно не покрывает. То что площадь 2 плиток больше чем требуется еще не значит что ими можно замостить площадь.
>Там надо сделать по-другому. Тебе дан текст, ты должен найти в нем длинные слова, заменить и вернуть измененный текст. У тебя же программа работает с одним словом.
упс, что-то я просмотрел, завтра уже переделаю на поиск длинных слов в тексте, что-то я сегодня очень рассеянный.
Тогда надо как минимум 4 плитки, видимо придется не от площади отталкиваться, а от длины сторон площади и плитки
> Yii::app()->request->hostInfo
то, что надо
по поводу вопроса 1, надо было всего лишь добавить слеш перед названием модуля
>>>411620
>Я вижу ты не очень знаешь яваскрипт. Не хочешь ли порешать наши задачки, которые помогут тебе исправить пробелы в знаниях? Я проверю решения и подскажу если ты где-то запутался: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
ОП, покажи, пожалуйста, пример, где выполняется та же самая задача только с заменой классов (речь идет о той, которая в этой ссылке http://jsfiddle.net/zybs794e/1/) Я не могу присвоить элементу "x" определенный стиль с цикле.
Это копия, сохраненная 26 декабря 2014 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.