Этого треда уже нет.
Это копия, сохраненная 16 ноября 2014 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
40 Кб, 500x500
231 Кб, 279x420
117 Кб, 965x2844
54 Кб, 640x360
рнр тред номер 34 #395787 В конец треда | Веб
А вот и мы. В этом ИТТ треде мы изучаем PHP (и некоторые другие языки для веба вроде JS), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет научиться программировать, кто-то хочет изучить этот язык, кто-то хочет просто размять мозги и заняться чем-то полезным.

Это тред для начинающих. Не написал за свою жизнь ни одной программы? Ты наш человек.

Требуемые знания: умение читать. Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Netbeans PHP или PhpStorm (необязательно).

Предыдущий тред был тут: >>386602

У нас есть уроки по основам PHP, они собраны и выложены по адресу http://archive-ipq-co.narod.ru Если ты ньюфаг, просто решай задачки оттуда, они там реально простые, и пости сюда ссылки на решения, мы посмотрим и скажем, правильно или нет и дадим совет, если можно что-то улучшить. Если не совсем ньюфаг, напиши, что ты знаешь, что нет, что хочешь изучить, я дам тебе какую-нибудь задачку посложнее. После прохождения учебника напиши, ОП даст тебе более сложные задания.

Есть задачки по основам JS и DOM, хорошие, многие их с ходу решить не могут, попроси, дадим ссылку. Есть задачка на 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
Позиционирование в CSS: http://softwaremaniacs.org/blog/category/primer/ (снизу вверх).
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 дня слушаешь от заказчика что он о тебе думает, есть удаленная работа — продаешься в рабство, и занимаешься только программированием, задачи тебе будут подкидывать наготово. Ищется по слову «удаленно» на перечисленных сайтах. Зарплата на удаленной работе может быть меньше чем в офисе в столице, но больше чем в твоей деревне. На одеске зарабатывают больше, чем на русском фрилансе.

В общем, давайте начинать уже!
55 Кб, 500x644
228 Кб, 420x279
3449 Кб, 1920x1080
Клуб изучающих PHP !ОП #2 #395792
Вообще, наш тред называется «Клуб изучающих PHP», и он рассчитан на тех, кто изучает этот язык. А название в ОП-посте не очень отражает его суть.

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

Расскажу заодно про то, как надо оформлять код.

Код надо писать не как попало, а аккуратно и красиво. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.

Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.

Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:

- переменные и функции пишутся с маленькой буквы, _ не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
- скобки в for и if/else ставятся так:

[code]
if (...) {
// ...
} else {
// ...
}

for (...) {
// .....
}
[/code]

- у определений функций и классов так:

[code]
function makeMeFeelGood(...)
{
// ...
}
[/code]

В общем, пиши как на картинке, и проблем не будет.
55 Кб, 500x644
228 Кб, 420x279
3449 Кб, 1920x1080
Клуб изучающих PHP !ОП #2 #395792
Вообще, наш тред называется «Клуб изучающих PHP», и он рассчитан на тех, кто изучает этот язык. А название в ОП-посте не очень отражает его суть.

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

Расскажу заодно про то, как надо оформлять код.

Код надо писать не как попало, а аккуратно и красиво. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть.

Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.

Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:

- переменные и функции пишутся с маленькой буквы, _ не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
- скобки в for и if/else ставятся так:

[code]
if (...) {
// ...
} else {
// ...
}

for (...) {
// .....
}
[/code]

- у определений функций и классов так:

[code]
function makeMeFeelGood(...)
{
// ...
}
[/code]

В общем, пиши как на картинке, и проблем не будет.
# OP #3 #395794
Слух, выкинь к чертовой матери из пиков треда это вонючее аниме.
!ОП #4 #395795
Алсо, на самом деле предыдущий 33-й тред был тут >>391949
705 Кб, 1280x720
!ОП #5 #395796
Нет.
#6 #395797
Можно ли начать учить php c фреймворка?
Сколько нужно потратить времени, чтобы выучить api wordpress, и отлично натягивать шаблоны любой сложности и писать модули?
Заранее спасибо за ответы.
!ОП #7 #395798
>>395797

> Можно ли начать учить php c фреймворка?


надо знать сам PHP и ООП, так как фреймворки вовсю его используют. Иначе ничего не понятно будет.

> Сколько нужно потратить времени, чтобы выучить api wordpress, и отлично натягивать шаблоны любой сложности и писать модули?


Время зависит от тебя, если ты хорошо знаешь PHP то шаблоны натягивать за несколько дней научишься, модули писать — чуть подольше, так как надо разобраться с устройством вордпресс. Мануалов в сети предостаточно, вот например официальный:

http://codex.wordpress.org/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0

http://codex.wordpress.org/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%82%D0%B5%D0%BC
#8 #395801
>>395743

>Но ты бы потратил эти часы не зря, а разбираясь с тем, как правильно создавать классы, свойства, методы в них, как организовать их взаимодействие.


нет, я бы потратил это время на то как обрабатывать пользовательский ввод, как вообще расположить в пространстве мышь и кошку.

первое что приходит в голову - двухмерный массив где 1 - мышь, 2 - кошка.
!ОП #9 #395802
>>395801

> первое что приходит в голову - двухмерный массив где 1 - мышь, 2 - кошка


Это не ООП-подход и работать с таким массивом будет очень неудобно, когда ты будешь писать например алгоритм выбора хода. Эта задача кстати хорошо показывает преимущества ООП. Если не веришь мне, можешь попробовать написать кусочек и увидишь.

> я бы потратил это время на то как обрабатывать пользовательский ввод, как вообще расположить в пространстве мышь и кошку.


Тут нет пользовательского ввода. Можно в 2 переменные поместить число кошек/мышек и в начале программы генерировать их случайно.
#10 #395803
>>395802
Что почитать по ООП, и как понять ООП в php? Желательно примеры кода, и объяснения. Спасибо.
#11 #395805
>>395802
дай ссылку на задачу.
#12 #395806
>>395805
или условие
#13 #395811
>>395803
Не знаю стоит ли оно того, но мне очень помогла начать эта книжка http://www.ecb.ac.in/admin/uploads/c720fc21400f01e53cce016085882a0f.pdf (Jump Start php)
Но она корявая очень. Много ошибок в коде, из за которых, правда, пришлось этот код разбирать и понимать. И до конца я тот блог так и не сделал. Но понял как использовать ООП и вообще организовывать проэкт, как использовать базы данных, куки, сессии. Хотя я это читал в основном не из книжки, книжка как-бы говорила мне, что мне надо читать. Основной плюс я конечно получил это понимание ООП. Хотя он там тоже кривой немного, лол.
#14 #395812
>>395805

http://archive-ipq-co.narod.ru/l1/pasta.html

Внизу задача про кошек-мышек

>>395803

Можешь почитать мой урок по ссылке выше. Также, 2 книги (названия в оп посте), Зандстра и Шлосснейгл.
#15 #395813
Посоветуйте простую CMS или blogging paltform типа Wordpress для изучения исходников. Wordpress мягко говоря великоват для изучения, мб есть что попроще?
23 Кб, 279x400
#16 #395814
>>395803
Лучше пикрелейтед ничего нет по ООП.
11 Кб, 736x253
15 Кб, 1109x79
1 Кб, 163x28
57 Кб, 429x532
#17 #395819
Прочитал вчера пост этого господина: >>394200
Поставил себе эту хуйню, весь вечер пердолился с выделением 80 порта для этого вашего апача. Вообще не ебу, что это. Освободил порт, запустил, зашел на 127.0.0.1, и что дальше? Вижу пикрилейтед. Пробовал скопировать свой код с ideone, записать в php-файл, и вбросить в папку projects. Какая-то параша, ничего не открывается, только второй пикрилейтед. Это было задание на массивы, про составление стихов. Попробовал даже написать обычный Hello, world!, но, когда открыл его, увидел просто исходный код.
Как совладать со всем этим говном? Помню, когда-то пытался учить питон, но у меня тоже нихуя не вышло, из-за этого пердолинга с программками. С РНР, вроде, всё было просто, зашел на ideone, написал код, запустил с одной кнопки, увидел результат. А тут ПЕРДОЛЬКА ПЕРДОЛЬКА ВЕБ СЕРВЕРА АПАЧ АПАЧ КОДИРОВКА. Что за хуйня, почему нельзя сделать всё нормально, по-людски?
63 Кб, 600x595
#18 #395826
Опе, я сделал прото-тестовый парсер. Че-как зацени https://github.com/Electric-Lizard/Some_Parser/blob/master/test.php Зацени сам подход, реализацию и как построено дерево. И как лучше будет делать парсинг? Сразу проходится по всему или сначала пройтись по всему тексту на, например, теги, затем на смайлы, затем на урл и т.д?
#19 #395828
>>395819
А как ты запускал код? Обычно с подобной проблемой сталкиваются новички, которые открывают пхп файлы через браузер.
168 Кб, 400x675
#20 #395830
>>395828
Зашел в папку EasyPhp, нашел там папку projects, скинул туда свой рнр-файл. Потом зашел на 127.0.0.1, увидел то, что на первом пике в том посте, зашел там в папку projects, и запустил оттуда свой файл.
#21 #395831
>>395819

>А тут ПЕРДОЛЬКА ПЕРДОЛЬКА ВЕБ СЕРВЕРА АПАЧ АПАЧ КОДИРОВКА. Что за хуйня, почему нельзя сделать всё нормально, по-людски?


Очевидно что-то не прописал в апаче или в пхп.ини. Я пхп целый день ставил вообще. Он не хотел работать, я решил поставить сборку, чтоб посмотреть что у меня не так. Что-то там менял-переменял - заработало, пытался откатывать, оно все равно работало. Я нихера не понял и решил интереса ради все нахуй удалить и снова поставить. В этот раз все заработало. Так и не понял в чем проблема была. Или понял и забыл.
"По-людски" можешь сборку поставить, но это, типо, не тру.
#22 #395832
Аааа, сука, как же тяжко вникнуть в ебаный вордпресс, но без него мне ни один заказ на фрилансе не дают. сука пизда
22 Кб, 320x240
#23 #395833
>>395831

> "По-людски" можешь сборку поставить, но это, типо, не тру.


Я и поставил сборку EasyPhp. Думал, всё из коробки будет работать.
#24 #395834
>>395833
Поставь другую значит. Которую ставил я работала сразу, ссылку на неё нашел через оффициальный сайт. Но я её сразу снёс чтобы ровным пацаном быть.
#25 #395835
сука тупари, поставьте openServer и не ебите мозг. я на нем ша тему вордпресс делаю по своей верстке.
не могу задать стили у ссылок в хедере, бля пиздос
#27 #395842
>>395308
http://jsbin.com/picocoqixoya/1/edit . Чего он у меня мою бомбочку не показывает?
#28 #395863
Вопрос по javascript. Можно ли как-нибудь из b вызвать методы класса A? Допустим, А это класс интерфейса игры, а В - внутреннее представление(объект B находится в A). В В мы мы делаем проверку на проигрыш, и вызываем метод из А(popup например с надписью). Или проверку на проигрыш лучше делать в А, анализируя информацию из В?
#29 #395876
>>395819

Вот тут есть немного инфы:https://gist.github.com/codedokode/10774100

Насчет того что код не выполняется − скорее всего не настроен PHP как модуль Апача.
#30 #395878
>>395863

> Или проверку на проигрыш лучше делать в А, анализируя информацию из В?


Можно сделать, только b содержит ссылку на a, вызывает a, а также подписывается на события через него.

Можно сделать чтобы a и b содержали ссылки друг на друга.

Можно сделать чтобы a содержал ссылку на b, вызвал его, и как-то у него получал информацию об изменениях (например подпиской на события изменения состояния клеток), это наверно будет самый сложный, хотя и самый близкий к MVC вариант.

В общем, вариантов много.
#31 #395899
>>395842
Черт, у меня почему координаты не меняются. Что-то не так с событием.
#32 #395902
Нужно чтобы проверялось условие: если в массиве есть хотя бы один из этих ключей и нет никаких других, то...
Как это написать? Какие функции использовать?
#33 #395905
>>395902
Цепочки foreach()?
#34 #395909
>>395842
http://jsbin.com/rarunesitunu/1/edit. Еще немного пошаманил, но ни черта все равно не работает. Когда будешь оценивать - скажи по какому из кодов смотрел. Они практически одинаковые, один из посмотри.
#36 #395917
>>395916
Если работает, какие проблемы?
#37 #395920
>>395917
Ну может можно еще оптимизировать. До этого я написал то же самое, только длинее
#38 #395921
Вопрос по wordpress
Вот есть на странице текст <p>lorem ipsum</p>
Как узнать какой тег добавить и куда, чтоб этот текст можно было редактировать из админки? И как такое реализовать, появится ли он в админке после добавления тега?
С тайтлом и дескрипшином все получилось, а вот с текстом хуй знает что делать.
В документации об этом ни слова, и вопрос такой не гуглится, выдает хуйню по визуальным редакторам.
#39 #395963
Решил в итоге написать что-то типа своего QueryBuilder'a.
http://ideone.com/gDwkqf
Почему он игнорирует "`".$key.'`=' в 7 строке?
#40 #395992
>>395902

проверить есть ли ключи можно функцией

array_intersect(array_keys($array), ....)

проверить если ли другие ключи можно через

array_diff(array_keys($array), ....)

Циклы не нужны.
#41 #395997
>>395921

Нет, не появится. Текст из шаблона автоматически в админке не появится. С чего бы? Текст хранится в базе данных.

Ты можешь только создать статическую страницу с текстом, назначить ей шаблон (или использовать шаблон страницы поста) и в нем пометить место где будет выведен текст через the_content() если я ничего не путаю:

http://codex.wordpress.org/Function_Reference/the_content
http://codex.wordpress.org/Pages#Page_Templates

Ну и еще есть другие варианты, например использовать плагин https://wordpress.org/plugins/static-texts/ или сделать плагин, в нем зарегистрировать настройки для админки: http://codex.wordpress.org/Creating_Options_Pages и выводить текст из них.

Возможно, можно еще как-то использовать закрепленный пост.

Хочу предупредить на тот случай, если ты не хочешь читать про устройство вордпресса и изучать разработку тем, а хочешь делать все методом тыка. Имей в виду, так ты далеко не уйдешь и ничему не научишься. Не понимая, как работает вордпресс внутри (хотя бы на уровне который описан в документации), ты не сможешь понять как реализовать ту или иную фичу.

Ну и такие вещи как статические страницы или закрепленный пост ты должен вообще знать назубок. Все, что делается через нажатие кнопок в админке, а не написание кода, надо знать идеально.
#42 #395999
>>395997

> Текст хранится в базе данных.


Я имел в виду, текст постов и страниц хранится в базе данных.
#43 #396000
>>395963

В этом «недобилдере» SQL-узявиимость. Погугли, что это такое. И я бы советовал подключить готовый — например, Doctrine DBAL или Zend_Db_Select.
#44 #396014
>>395819

Твоя проблема в том, что ты не прочел мануал/урок по тому как работает Апач, как он взаимодействует с браузером и с php. Оттого ничего и непонятно. Не знаю, правда, есть ли где-то хороший урок на эту тему.

Вот ответ: http://ideone.com/OP1cWh

Алсо, константы PI видимо нету. надо использовать функцию pi()

Алсо, echo вывелось как есть, так как Php выполняет только код после маркера <?php — а остальное он выводит как есть. Мануал: https://php.net/manual/ru/language.basic-syntax.phpmode.php
#45 #396017
>>395819

> почему нельзя сделать всё нормально, по-людски?


Это и есть нормально. Ты просто видимо не знаком с линуксом, командной строкой и консольными программами, оттого и непонимание. Я бы советовал изучать эту тему, так как это тебе может пригодиться. Многие утилиты (в том числе использующиеся в PHP фреймворках) сделаны как программы для командной строки.

Апачу, PHP и подобным программам не нужен графический интерфейс с кнопочками, он излишен. Они запускаются из командной строки, их настройки задаются через текстовые файлы. Это дает гораздо больше возможностей и гибкости чем программы с окошечками и кнопками. Потому что с окошечками может взаимодействовать только живой человек, а через командную строку можно вызвать программы из скриптов. Например, это позволяет серверу ideone передать твою программу php на выполнение и вывести результат.

В кошмарном сне я видел все эти окошки.

Вот для начала краткий гайд по командной строке: https://gist.github.com/codedokode/10539568

Он не имеет прямого отношения к Апачу, но поможет тебе лучше понять концепцию. Привыкай, если ты хочешь быть программистом то должен рано или поздно научиться.

И еще. Сборки вроде easyPHP рассчитаны на опытных программистов, которым лень тратить время на установку. Но начинающим рекомендуется установить и настроить Апач/PHP/MySQL самостоятельно. Я бы советовал удалить сборку и установить все самому. Вот инструкции (немного устаревшие но who cares):

https://gist.github.com/codedokode/7054af4a03865c4cc863
https://gist.github.com/codedokode/10774100
#46 #396019
>>395826

Ты зря отказываешься от ООП и пишешь все на функциях. Логичнее было бы сделать класс Tokenizer и класс Parser и методы в них. Ну и для дерева сделать набор классов, 1 тег = 1 класс. Это позволит легко добавлять новые теги.

Ну да ладно, можно пока и так писать.

В регулярке для разбора у тебя ошибки:

> =[\'"]?[^\'"\]\


Если в теге 2 аттрибута без кавычек, он съест их оба: a=1 b=2. Если в аттрибуте есть кавычка, он запнется: title="hello' world"

Надо написать 3 отдельных выражения, для аттрибута без кавычек, с одниарными и с двойными кавычками.

Логично сделать такие токены (но тут есть подвох, о нем ниже):

[hello — начало тега
[/hello — начало закрывающего тега
] — конец тега
attr=val — атрибут без кавычек
attr='val' — атрибут с кавычками
attr="val" — атрибут с двойными кавычками
(пробелы)
(любой другой символ) — обычный текст

Но тут есть подвох. Смотри, допустим у нас есть текст:

attr="val[y]..."

Очевидно он должен быть разбит на токены:

attr="val (текст)
[y (начало тега)
] (конец)
..." (текст)

Но наш парсер ошибется. Какие тут есть варианты решения?

1) разбить сначала сложной (сложной так как ] внутри кавычек не должна закрывать тег) регуляркой текст на теги/обычный текст а уже теги парсить отдельно. Мне не очень нравится, так как при усложнении синтаксиса регулярка станет еще сложнее.

2) хранить в токенайзере состояние «мы внутри тега» и «мы в обычном тексте», в зависимости от которого используются разные регулярки. И использовать preg_match с параметром offset чтобы идти по тексту слева направо. А набор токенов взять тот, который написан выше, просто сделать часть токенов доступными только когда мы внутри тега.

3) сделать токены более мелкими:

[ (начало тега или просто скобка)
] (конец тега или скобка)
"
'
/
=
идентификатор из латинских букв и цифр например hello
(любые другие символы в любом количестве)

Тогда текст attr="val[yes title="no"]..." будет разбит на токены:

attr
=
"
val
[
yes
(пробел)
title
=
"
no
"
]
...
"

Тогда, правда, сам парсер станет чуть сложнее, и работать будет медленее так как токенов будет гораздо больше. Но зато тут мы сможем отличить кавычку в тексте от кавычки, открывающей атрибут.

Мне кажется, проще будет сделать вариант 3, а вариант 2 сложнее но даст чуть более высокую скорость разбора так как в нем токены более крупные и их меньше.
#46 #396019
>>395826

Ты зря отказываешься от ООП и пишешь все на функциях. Логичнее было бы сделать класс Tokenizer и класс Parser и методы в них. Ну и для дерева сделать набор классов, 1 тег = 1 класс. Это позволит легко добавлять новые теги.

Ну да ладно, можно пока и так писать.

В регулярке для разбора у тебя ошибки:

> =[\'"]?[^\'"\]\


Если в теге 2 аттрибута без кавычек, он съест их оба: a=1 b=2. Если в аттрибуте есть кавычка, он запнется: title="hello' world"

Надо написать 3 отдельных выражения, для аттрибута без кавычек, с одниарными и с двойными кавычками.

Логично сделать такие токены (но тут есть подвох, о нем ниже):

[hello — начало тега
[/hello — начало закрывающего тега
] — конец тега
attr=val — атрибут без кавычек
attr='val' — атрибут с кавычками
attr="val" — атрибут с двойными кавычками
(пробелы)
(любой другой символ) — обычный текст

Но тут есть подвох. Смотри, допустим у нас есть текст:

attr="val[y]..."

Очевидно он должен быть разбит на токены:

attr="val (текст)
[y (начало тега)
] (конец)
..." (текст)

Но наш парсер ошибется. Какие тут есть варианты решения?

1) разбить сначала сложной (сложной так как ] внутри кавычек не должна закрывать тег) регуляркой текст на теги/обычный текст а уже теги парсить отдельно. Мне не очень нравится, так как при усложнении синтаксиса регулярка станет еще сложнее.

2) хранить в токенайзере состояние «мы внутри тега» и «мы в обычном тексте», в зависимости от которого используются разные регулярки. И использовать preg_match с параметром offset чтобы идти по тексту слева направо. А набор токенов взять тот, который написан выше, просто сделать часть токенов доступными только когда мы внутри тега.

3) сделать токены более мелкими:

[ (начало тега или просто скобка)
] (конец тега или скобка)
"
'
/
=
идентификатор из латинских букв и цифр например hello
(любые другие символы в любом количестве)

Тогда текст attr="val[yes title="no"]..." будет разбит на токены:

attr
=
"
val
[
yes
(пробел)
title
=
"
no
"
]
...
"

Тогда, правда, сам парсер станет чуть сложнее, и работать будет медленее так как токенов будет гораздо больше. Но зато тут мы сможем отличить кавычку в тексте от кавычки, открывающей атрибут.

Мне кажется, проще будет сделать вариант 3, а вариант 2 сложнее но даст чуть более высокую скорость разбора так как в нем токены более крупные и их меньше.
#47 #396021
>>395826

Вот еще пост: http://ideone.com/xT3z2a

Давай начнем с упрощенного варианта парсера и токенайзера с одним тегом без атрибутов чтобы лучше разобраться как все работает.
#48 #396023
>>395826

> И как лучше будет делать парсинг?


Лучше всего и парсинг, и разбиение на токены делается в один проход. Если ты начинаешь скакать вперед-назад, то это обычно значит что ты все усложнаяешь.
#49 #396025
>>395832

Задавай вопросы (только сначала погугли сам).

>>395835

Нет. Начинающим лучше все самим ставить. Плюс в этом openServer ты так просто командную строку не запустишь.

>>395840

Имена переменных я бы поменял. Почему массив называется total? Логично назвать его girls или places или numbers.

$i я бы переименовал в $current (текущий элемент)

> sort($array);


Зачем сортировка? Разве у тебя числа не по возрастанию расположены?

> if ($total[$i] == $lastElement) {


Можно проще, сравнить $i и count($total). Но я не понимаю, почему отдельный блок кода для последнего элемента? Он что, особенный какой-то? Я думаю, можно этот код смело убирать.
#50 #396026
>>395840

> foreach ($total as $value) {


Можно через echo implode вывести без цикла.

Задача про Маяковского

> $max = mb_strlen(max($splittedText));//Чому это не работает?


Потому что max(массив строк) вернет наибольшую строку из массива. Но что такое «наибольшая строка»? Как сравниваются строки?

Ответ надо искать в мануале. Но я его не нашел, потому скажу своими словами. Строки сравниваются по кодам первого символа, у которой код больше — та и больше. Если первые символы одинаковые, то по второму, и так далее. Коды можно увидеть тут: http://unicode-table.com/ru/#cyrillic

Как видишь, частично они идут по алфавиту, при этом маленькие буквы имеют больший код чем большие, а буква ё стоит отдельно. Таким образом, для Php слова сравниваются так:

'ёлка' > 'юла' > 'арбуз' > 'Юля' > 'Антон' > 'Ёлка' > 'hello world'

Как ты видишь, сравнение по кодам символов дает довольно-таки бессмысленный результат, потому лучше им не пользоваться вообще.

Чтобы найти наибольшую длину строки, сначала преобразуй массив строк в массив длин строк с помощью array_map, а потом ищи максимаьное из этих чисел.
#51 #396028
Ананасы, имеет смысл дрочить нативный пхп, если с laravel обучение идет неплохо? (с рельсобекграундом дается проще чем чистый пхп)
Не будет ли это проблемой, при поиске работы и прочей хуйни?
#52 #396029
>>396028
мимо мамин хакер
#53 #396030
>>395840

Банкомат

А где число купюр? Не выводит же.

Не, код слишком запутанный, давай переделывай. Я хочу тебе подкинуть идею: у тебя номинал купюр и количество лежит в массиве. А что мы можем использовать для обхода массива? Конечно, цикл.

Почему бы не сделать цикл от самых крупных купюр к самым мелким? На каждом шаге мы берем максимально возможное число купюр и считаем сколько еще остается выдать.

Ну и die() надо убрать из функции. зачем нам такая функция которая может завершить всю программу?
#54 #396035
>>395863

Вот пост: http://ideone.com/RBsKso

Что за дебильный спам лист на этом сайте.

>>395909

Смотрел это: http://jsbin.com/rarunesitunu/1/edit

> this.cells[pos1][pos2][Field.MINE]


Вот это называется «лезть внутрь» другого объекта (и что за странная идея, хранить имя поля в константе? константы так не используют). Не надо так, надо так:

if (this.cells[pos1][pos2].hasMine()) ....

А еще лучше писать так:

if (this.getCellAt(x, y).hasMine()) ....

Намного читабельнее.

> Field.prototype.getCell = function(cell) {


Тут можно избавиться от циклов, так как у DOM элемента td есть свойство cellIndex: https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableCellElement а у строки — rowIndex: https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableRowElement

Ну хотя твой вариант с циклами тоже годится, он даже чуть надежнее получается. Только вместо i/k лучше писать x/y.

> contentCell.appendChild(mine);


Тут есть более простой способ, ты можешь вставлять контент через innerHTML: http://learn.javascript.ru/basic-dom-node-properties#innerhtml-содержимое-элемента

Только никогда не делай так:

node.innerHTML += ...;

Почему, подумай сам.

> contentCell = td.appendChild(span),


А зачем сохранять результат в отдельную переменную? У тебя же есть span. Функция appendChild его и вернет.

Не работает код потому, что ты не смотришь в консоль, а там ошибка:

> "TypeError: this.cells[pos1][pos2] is undefined (line 120)"



Также, есть возможность отлаживать код. Открой страницу просмотра ( http://jsbin.com/koxudosupigu/1 ) и на ней нажми Ctrl Shift + I. Откроется инспектор, в нем перейди на вкладку Script. Там ты можешь ставить точки останова, выполнять код пошагово и смотреть содержимое переменных. Если ты не умеешь, то советую научиться, пригодится еще не раз. Вот статьи:

http://popel-studio.com/blog/article/otladka-javascript-v-chrome-dev-tools-chast-2-tochki-ostanovki.html
http://habrahabr.ru/post/143767/

Это статьи для Хрома, в фаерфоксе есть аналогичный отладчик. Обязательно попробуй поотлаживать свою программу, чтобы научиться им пользоваться.
#54 #396035
>>395863

Вот пост: http://ideone.com/RBsKso

Что за дебильный спам лист на этом сайте.

>>395909

Смотрел это: http://jsbin.com/rarunesitunu/1/edit

> this.cells[pos1][pos2][Field.MINE]


Вот это называется «лезть внутрь» другого объекта (и что за странная идея, хранить имя поля в константе? константы так не используют). Не надо так, надо так:

if (this.cells[pos1][pos2].hasMine()) ....

А еще лучше писать так:

if (this.getCellAt(x, y).hasMine()) ....

Намного читабельнее.

> Field.prototype.getCell = function(cell) {


Тут можно избавиться от циклов, так как у DOM элемента td есть свойство cellIndex: https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableCellElement а у строки — rowIndex: https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableRowElement

Ну хотя твой вариант с циклами тоже годится, он даже чуть надежнее получается. Только вместо i/k лучше писать x/y.

> contentCell.appendChild(mine);


Тут есть более простой способ, ты можешь вставлять контент через innerHTML: http://learn.javascript.ru/basic-dom-node-properties#innerhtml-содержимое-элемента

Только никогда не делай так:

node.innerHTML += ...;

Почему, подумай сам.

> contentCell = td.appendChild(span),


А зачем сохранять результат в отдельную переменную? У тебя же есть span. Функция appendChild его и вернет.

Не работает код потому, что ты не смотришь в консоль, а там ошибка:

> "TypeError: this.cells[pos1][pos2] is undefined (line 120)"



Также, есть возможность отлаживать код. Открой страницу просмотра ( http://jsbin.com/koxudosupigu/1 ) и на ней нажми Ctrl Shift + I. Откроется инспектор, в нем перейди на вкладку Script. Там ты можешь ставить точки останова, выполнять код пошагово и смотреть содержимое переменных. Если ты не умеешь, то советую научиться, пригодится еще не раз. Вот статьи:

http://popel-studio.com/blog/article/otladka-javascript-v-chrome-dev-tools-chast-2-tochki-ostanovki.html
http://habrahabr.ru/post/143767/

Это статьи для Хрома, в фаерфоксе есть аналогичный отладчик. Обязательно попробуй поотлаживать свою программу, чтобы научиться им пользоваться.
#55 #396037
>>395909

Есть еще статьи на английском по отладке: https://developer.chrome.com/devtools/docs/javascript-debugging

Кстати, с помощью кнопочки с паузой в кружочке можно вываливаться в отладчик при ошибке. При этом будет видно место остановки и значения переменных.
#56 #396038
>>395916

удобнее array_diff/array_intersect и без циклов.

>>395963

А завтра тебе понадобится не только условие = но и больше\меньше, что делать будешь?

>>396028

Как ты lavarel пользоваться будешь не зная PHP?

Конечно будет проблемой.
16 Кб, 500x327
#57 #396039
>>396038

>Как ты lavarel пользоваться будешь не зная PHP?


Прям как рельсами без руби.
#58 #396048
>>395787
В голос с оппиков, в кой-то век правильные.
#59 #396059
Оп, начал потиху писать кошек мышек, я у тебя еще в прошлом трэде совета спрашивал. Вот что накидал -
http://ideone.com/Z2MvWx
Тут прочел что использовать двумерный массив плохая идея, а что вместо него тогда? Взял идею с двумерным массивом для хранения поля из задачки про рисование окружности.
Ну и еще 1 - http://ideone.com/a08KuY
В б пару дней назад проскочил пост от чувака который жаловался на то что 2/3 приходящих на собеседование php макак не в состоянии решить задачу - развернуть строку задом наперед используя рекурсию. Ну я вот попробовал, раньше с рекурсией дела не имел. Правда не могу понять почему внутрь этой функции дебаггер пхп шторма войти не может, просто проскакивает ее и выдает результат.
# OP #60 #396061
>>395798
Вообще-то я !ОП.
кек
#61 #396077
>>396059

Советы и замечания:

> while (true) {


Не делай бесконечные циклы, делай цикл вроде for с 5-10 попытками. А то у тебя если мышку загнать в угол, программа зависнет.

> public $x;


Давай в этой программе откажемся от public свойств и используем только private/protected. Инкапсуляцию используем, в общем.

Инкапсуляция это когда свойства помечены как private/protected и прямой доступ к ним имеет только сам класс, а не вся программа. Это делает код более надежным, а классы менее связанными друг с другом (то есть один класс не лезет внутрь другого, а лишь вызвает разрешенные методы). Инкапсуляция особенно важна когда код станет большим и там будет не 1, а сотни и тысячи классов — в таком объеме без нее никак.

Сам представь: в случае инкапсуляции, чтобы найти все места, где меняется значение свойства, достаточно просмотреть один класс. Без инкапсуляции — весь код.

> public function move(Map $map)


Это неправильно, передавать карту в функцию move.

Тут явно есть связь животное -> карта (и обратная связь, карта знает кто на ней находится). Значит, у животного должна быть ссылка на карту, которая проставляется при добавлении на карту и очищается при удалении с нее. Для надежности можно при добавлении проверять что ссылка пуста — это позволит защититься от ошибки когда животное добавляют сразу на несколько карт (ты скажешь, но у нас одна карта? да, но ничто не запрещает сделать несколько и связать их телепортаторами например).

> if (($y >= 0) && ($y <= $map->height - 1)) {


Лучше сделать у карты метод isInMap($x, $y). Это задача карты, определять доступна клеточка или нет.

> if ($cell instanceof Mouse) {


> echo 'M';


Лучше сделать $cell->getMapLetter(); Если ты видишь switch/instanceof — это скорее всего неправильно и значит что его надо заменить на метод.

> if (!($this->field[$y][$x] instanceof Animal)) {


Тут тоже лучше без instancceof обойтись.

> $this->field[$animal->y][$animal->x] = 0;


Тут хорошо бы для надежности добавить проверку что там дейстивтельно это животное - это поможет защититься от ошибок (в твоем варианте ошибка останется незамеченной).

> public function makeMove()


Вот этого тут не должно быть. Карта не управляет животными. Это должно быть в каком-нибудь классе Game. Туда же можно и поместить тот код который у тебя находится в конце программы.

Насчет хранения животных на карте, при твоем способе появляются сложности: надо перед ходом очистить клеточку, а после хода сохранить объект в новую. Это конечно решаемо (если животное содержит ссылку на карту то может вызвать нужные методы), и такой подход часто используют в играх, но не проще ли хранить плоский одномерный массив с животными, а двухмерный массив с клеточками вообще выкинуть?

А так, пока неплохо, ты движешься в верном направлении.
#61 #396077
>>396059

Советы и замечания:

> while (true) {


Не делай бесконечные циклы, делай цикл вроде for с 5-10 попытками. А то у тебя если мышку загнать в угол, программа зависнет.

> public $x;


Давай в этой программе откажемся от public свойств и используем только private/protected. Инкапсуляцию используем, в общем.

Инкапсуляция это когда свойства помечены как private/protected и прямой доступ к ним имеет только сам класс, а не вся программа. Это делает код более надежным, а классы менее связанными друг с другом (то есть один класс не лезет внутрь другого, а лишь вызвает разрешенные методы). Инкапсуляция особенно важна когда код станет большим и там будет не 1, а сотни и тысячи классов — в таком объеме без нее никак.

Сам представь: в случае инкапсуляции, чтобы найти все места, где меняется значение свойства, достаточно просмотреть один класс. Без инкапсуляции — весь код.

> public function move(Map $map)


Это неправильно, передавать карту в функцию move.

Тут явно есть связь животное -> карта (и обратная связь, карта знает кто на ней находится). Значит, у животного должна быть ссылка на карту, которая проставляется при добавлении на карту и очищается при удалении с нее. Для надежности можно при добавлении проверять что ссылка пуста — это позволит защититься от ошибки когда животное добавляют сразу на несколько карт (ты скажешь, но у нас одна карта? да, но ничто не запрещает сделать несколько и связать их телепортаторами например).

> if (($y >= 0) && ($y <= $map->height - 1)) {


Лучше сделать у карты метод isInMap($x, $y). Это задача карты, определять доступна клеточка или нет.

> if ($cell instanceof Mouse) {


> echo 'M';


Лучше сделать $cell->getMapLetter(); Если ты видишь switch/instanceof — это скорее всего неправильно и значит что его надо заменить на метод.

> if (!($this->field[$y][$x] instanceof Animal)) {


Тут тоже лучше без instancceof обойтись.

> $this->field[$animal->y][$animal->x] = 0;


Тут хорошо бы для надежности добавить проверку что там дейстивтельно это животное - это поможет защититься от ошибок (в твоем варианте ошибка останется незамеченной).

> public function makeMove()


Вот этого тут не должно быть. Карта не управляет животными. Это должно быть в каком-нибудь классе Game. Туда же можно и поместить тот код который у тебя находится в конце программы.

Насчет хранения животных на карте, при твоем способе появляются сложности: надо перед ходом очистить клеточку, а после хода сохранить объект в новую. Это конечно решаемо (если животное содержит ссылку на карту то может вызвать нужные методы), и такой подход часто используют в играх, но не проще ли хранить плоский одномерный массив с животными, а двухмерный массив с клеточками вообще выкинуть?

А так, пока неплохо, ты движешься в верном направлении.
#62 #396109
>>396019

> Ты зря отказываешься от ООП и пишешь все на функциях. Логичнее было бы сделать класс Tokenizer и класс Parser и методы в них.


Ясное дело полноценный парсер, я напишу с ООП, тут я просто пытался понять как его вообще реализовать, примерно. Теперь перейду на классы.

> И надо понимать, что узлы образуют дерево и могут быть вложены друг в друга. Не вижу, где у тебя это? У тебя нет дерева.


Ты о том что я не проверял содержимое тега на другие теги? Это у меня совсем из головы вылетело, да. Или там сама структура в массиве не правильная?
Сейчас ты предлогаешь мне сделать парсер без аттрибутов но с проверкой содержимого тегов на другие теги?
#63 #396111
>>396109

У тебя не предусмотрена возможность что теги могут быть вложены друг в друга. А это должно поддерживаться.

> Или там сама структура в массиве не правильная?


В этом плане она непраивльная, что не поддерживает вложенность.

> Сейчас ты предлогаешь мне сделать парсер без аттрибутов но с проверкой содержимого тегов на другие теги?


Да. Для начала можно сделать только один вид тега, но со вложенностью.
!ОП #64 #396112
Аноны, написал мини-урок про работу с БД и ORM: https://gist.github.com/codedokode/c4cbc4d7dc8e45ea074a

Можете глянуть, кому интересно.
sage #65 #396128
Только начал учить пхп, дошел до задачки с айфоном в кредит. Вроде бы сделал, но что-то подсказывает что неправильно.
Добрый анон, рассуди. http://ideone.com/ZZe6vz
#66 #396129
>>396128
сажа приклеилась
#67 #396130
>>396128

Должно быть около 61270 всего выплачено.

Смотри, у тебя в последний месяц анон платит 5000, и сразу же выплачивает 4139 остатка. А ведь он не может сразу это выплатить, он должен подождать месяц, за который набегут проценты и комиссии и итоговая сумма выйдет больше — не 49139, а около 61270.

Также, если поставить маленькую сумму кредита, например 1000, твоя программа не учтет это и все равно в первый месяц выплатит 5000, хотя достаточно заплатить 2030.

Надо смотреть чему равен остаток долга и обрабатывать ситуацию, когда она маленький, а не выплачивать сразу же 5000 вот в этом месте: ... + $servicePayment - $monthlyPayment;

Попробуй переписать код внутри цикла примерно так:

- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
#68 #396133
Мне нужно убрать из массива значения, ключи которых меньше $someInt, при этом сохранить ключи. А функция array_slice() требует флаг true для этого. Но тогда надо заполнить третий аргумент, а это длина обрезки, мне нужно чтобы чтобы длина была максимальной.
#69 #396134
>>396130
Я могу вводить условия в цикл? т.е мне после

$creditBalance = ( $creditBalance $percent ) + $servicePayment - $monthlyPayment;

надо ввести if или эту вместо этого ввести if ?

ПС спасибо за ответ
#70 #396135
>>396130
>>396134
Хуй знает, вышло еще хуже http://ideone.com/ZZe6vz
#71 #396140
Котаны привет, спрашивал в вебаче но там проигнорили.
Тупой вопрос: на странице есть такая тема допустим
if(isset($_POST['1']))
{
$a = 1;
}
if(isset($_POST['2']))
{
$b = $a + 1;
}
короче во втором ифе не получаем первую переменную потому что скоупы, есть вариант разрулить это без сессии?
#72 #396146
>>396134

Смотри, эта строчка

> $creditBalance = ( $creditBalance $percent ) + $servicePayment - $monthlyPayment;



Одновременно и прибавляет проценты, и сразу же выпливает 5000. Ее надо разбить на 2 команды — а между ними вставить if
#73 #396148
>>396134

И вообще, вместо исправления я думаю лучше стереть все, что внутри цикла и написать с нуля.

Чтобы было как я написал выше:

- прибавляем проценты и комиссию к остатку долга
- если остаток маленький, выплачиваем сколько осталось и уходим
- иначе платим 5000
#74 #396152
>>396140

Какие скоупы? В PHP видимость переменных ограничена функциями: http://php.net/manual/ru/language.variables.scope.php

Если ты пришел из других языков (Си например), то их правила в PHP не работают.

Но ты прав в том, что неправильно создавать переменную внутри одного блока, а обращаться к ней в другом. Надо просто вынести ее выше, из if наружу.

Алсо код, у тебя наркоманский: если if выполнится, переменная будет создана, если нет то не будет. Это ошибка, такого быть не должно. Создай переменную перед этими if.
#75 #396154
>>396133

Во-первых, можно вместо array_slice просто обойти массив циклом и создать новый их тех элементов которые соответствуют твоим требованиям.

Во-вторых, можно удалить ключи через unset (у меня вроде в уроке это написано).

Зачем тебе вообще array_slice?
#76 #396186
У меня глаза вылезают с этим деревом. Я вижу что явно что-то не так, но хер поймешь че он там выводит, ужас-ужас.
#77 #396193
>>396186
А не, таки сделал. https://github.com/Electric-Lizard/Some_Parser/blob/master/index.php
Теперь буду делать с разными тегами и ссылками и все-такое, если нету фатальных ошибок. И как это потом форматировать? Циклы foreach()?
#78 #396214
Проголосуйте пожалyйста
http://arhivach.reformal.ru/proj/?ia=707078
#79 #396241
>>396140
Есть мнение, что к этим массивам не стоит напрямую обращаться.
filter_input(INPUT_POST, '1'), но тоже аккуратно надо.
#80 #396242
>>396241
И тогда не надо будет isset.
#81 #396243
>>395787
ОП, снова по поводу тестхаба.

>Резлультат теста: результаты сдачи всех тестов хранятся в БД, включая время ответа на каждый вопрос и выбранный ответ.


То есть это будет выглядеть как-то так?

RESULTS
question_id INT внешний ключ к вопросу, который содержит внешний ключ к тесту
student_id INT внешний ключ к студенту
answer_id INT
answer_number DECIMAL
answer_text VARCHAR
exec_time INT
result INT

И если тестируемый решил ответить строкой на вопрос, где нужно указать цифру, мне ему запрещать это делать?

Алсо, то что я буду хранить целые числа в DECIMAL это нормально?
И посмотри пожалуйста алгоритм сравнения чисел http://ideone.com/6b2xkp.
135 Кб, 568x895
#82 #396247
ОПчик, я тут с вопросами.

Делаю задание на макет, а какие размеры выставлять не знаю. Ставлю наугад где в пикселях, где в процентах. Иногда на глаз меряю, иногда ставлю столько пикселей сколько было нарисовано на картинке.
Вот мне интересно как верстальщики определяют какие размеры ставить, так что б правильно?

Сколько времени ушло бы у опытного человека сделать такой макет? Я догадываюсь что как минимум раз в 10 бы быстрее чем у меня, но всё же.

Раз я уже отписался в треде, глянь чуток на недоделанную вёрстку. http://rghost.ru/58561496
#83 #396260
>>396247

>Ставлю наугад где в пикселях, где в процентах.


Все значения должны быть одного вида, либо пиксели, либо проценты, либо емы, либо ремы. Размеры должны быть точные, если в макете 12 пикселей от и до, значит и при вёрстке должно быть 12 пикселей. Проценты никто уже не использует (почти, но если ты их используешь, то должен знать, зачем), либо пиксели, либо емы, но с емами ебля, поэтому придумали ремы — та же хуйня, только считается не от родительского элемента, а от корневого. Если будешь использовать ремы, смотри поддержку браузеров, это относительно новая вещь. Если боишься брать емы, потому что ебля, и не можешь при этом использовать ремы, то используй пиксели. Как-то так.
#84 #396261
>>396243

> решил ответить строкой на вопрос, где нужно указать цифру, мне ему запрещать это делать?


Да, выводить сообщение об ошибке и не принимать ответ пока не исправит.
#85 #396262
>>396243

Насчет ключей: мне кажется, связь должна быть такая:

Студент (1) - (N) РезультатыТеста (1) - (N) Ответ
Тест (1) - (N) РезультатыТеста

То есть нужна сущность «результаты теста» которая соответствует одной попытке прохождения теста. Например, список «результатов теста» может просмотреть преподаватель.
#86 #396264
>>396243

> я буду хранить целые числа в DECIMAL это нормально?


Это может и нормально, но ты понимаешь особенность DECIMAL и чем оно отличается от INT/FLOAT?
#87 #396265
>>396247

Лучше бы конечно гит и гитхаб освоить, там можно сразу же выложить верстку как статический сайт: https://pages.github.com/
#88 #396266
>>396193

Обычно токенайзер не отдает токены, а хранит в себе их список и номер текущего токена. А парсер только вызвает методы вроде получитьСледующий(ожидаемый тип), определитьТипТекущегоТокена(), являетсяЛиСледующий(такоим-то типом) и так далее.

Соответственно тебе не нужен будет foreach и не придется использовать костыль в виде передачи position туда-сюда.

> "data" => $this->parse($tagContent, true));


Вот это очень неэффективно, преобразуем токены назад в текст, а текст снова парсим. Так делать не надо.

Также, объект токенайзера обычно передается в парсер в качестве исходных данных.

Для каждого тега позже стоит завести свой класс (а в парсере — соответствие имя тега -> имя класса). Тогда можно будет легко добавлять новые.

Ты используешь preg_match для определения типа токена. Позже можно будет убрать preg_split и двигаться по строке с помощью параметра offset у preg_match.

Проверку существует ли такой тег наверно лучше перенести в парсер, токеназйеру незачем знать какие теги существуют.
#89 #396267
>>396193

Ну и пока твой парсер не соответствует алгоритму recursive descent так как в этом алгоритме мы имеем набор функций, каждая из которых умеет парсить какую-то часть синтаксиса целиком и возвращает узел дерева как результат. Ну то есть у нас могут быть методы типа:

parsePlainText() // парсит кусок текста без тегов и возвращает текстовый узел
parsePairTag() // парсит код от открывающего до закрывающего тега и возвращает узел-тег
parseSingleTag()

и не должно быть методов типа searchEndTag()

Возвращаясь к примеру с парсером математических выражений, каждая функция умеет парсить свой тип выражения (суммы, произведения, отдельные числа), при этом она вызывает другие функции чтобы например распознать произведение внутри суммы. Также и у тебя, parsePairTag() может вызывать parsePlainText() чтобы распарсить текст внутри тега и может вызывать себя рекурсивно чтобы распарсить вложенный тег.
#90 #396268
>>396243

Насчет проверки ответа: мне кажется, надо проверять что ответ пользователя лежит между (answer - precision) ... (answer + precision) или abs(answer - userAnswer) <= precision.

epsilon тут как я понимаю, не нужен, если precision != 0

Эта формула будет работать за исключением случая когда precision = 0 (то есть ответ должен точно совпадать). Дробные числа нельзя проверять на равенство с помощью == и надо вводить epsilon.

Фиксированный epsilon имеет тот недостаток, что если правильный ответ = 0.000000001 то он огромный в сравнении с ответом. Я видел такой алгоритм сравнения дробных чисел на равенство:

http://floating-point-gui.de/errors/comparison/ (англ)
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm (англ, хардкорная статья про особенности плавающих чисел)

Статьи на английском, но код в первой статье, думаю, понятен.

Потому если ты хочешь добиться максимального качества, то при precision = 0 надо использовать хитрый алгоритм с епсилоном, при отличии погрешности от нуля эпсилон не нужен. Если не хочешь реализовывать хитрый алгоритм, можно просто запретить указывать нулевую погрешность.
#91 #396269
>>396243

В любом случае, не забудь вынести алгоритм сравнения в отдельную функцию с понятным названием.

Насчет строк, там тоже надо допускать вольность — в регистре букв и в пробелах. Может быть еще стоит игнорировать все, кроме букв и цифр, чтобы знаки препинания не влияли, но тут я не уверен.

>>396247

> а какие размеры выставлять не знаю.


По логике. Если размер зависит от ширины родителя — проценты, если не зависит — пиксели. em/en используются когда нужна привязка к тексту, например «блок, по ширине примерно равный 10 буквам».

Старайся как можно меньше ставить размеры и как можно больше использовать width/height auto; — когда ты захочешь изменить ширину блока, менять придется гораздо меньше кода. Все, что может определяться автоматически, должно определяться автоматически.

> Сколько времени ушло бы у опытного человека сделать такой макет?


Часа 3-4 если делать старательно, я думаю. Если кое как то меньше. Хотя у меня всегда верстка получалась медленно, так как я старался все перепроверить и все сделать тщательно.

По картинкам: что-то картинки много весят. Ты разбираешься в форматах картинок для web (JPEG, GIF, PNG8, PNG24, SVG), знаешь их особенности? Если нет, надо изучить и поколдовать в фотошопе или другой программе с выбором подходящего формата и уровня сжатия. Ну и мыла смотри чтобы не было.

http://htmlbook.ru/samhtml/izobrazheniya/formaty-faylov
http://www.designonstop.com/useful/photoshop/vse-delo-v-formate-ili-kak-pravilno-soxranit-kartinku-v-fotoshope.htm
http://arttower.ru/tutorial/Svetilkin/spravochnicki/Photoshop_for_WEB/Charter2/1.htm

Иконки соцсетей внизу (которые рядом) стоит объединить в одну картинку с использованием css спрайтов: http://learn.javascript.ru/css-sprite (только без фанатизма)

Пункты меню, кнопки должны реагировать на наведение мыши.
#91 #396269
>>396243

В любом случае, не забудь вынести алгоритм сравнения в отдельную функцию с понятным названием.

Насчет строк, там тоже надо допускать вольность — в регистре букв и в пробелах. Может быть еще стоит игнорировать все, кроме букв и цифр, чтобы знаки препинания не влияли, но тут я не уверен.

>>396247

> а какие размеры выставлять не знаю.


По логике. Если размер зависит от ширины родителя — проценты, если не зависит — пиксели. em/en используются когда нужна привязка к тексту, например «блок, по ширине примерно равный 10 буквам».

Старайся как можно меньше ставить размеры и как можно больше использовать width/height auto; — когда ты захочешь изменить ширину блока, менять придется гораздо меньше кода. Все, что может определяться автоматически, должно определяться автоматически.

> Сколько времени ушло бы у опытного человека сделать такой макет?


Часа 3-4 если делать старательно, я думаю. Если кое как то меньше. Хотя у меня всегда верстка получалась медленно, так как я старался все перепроверить и все сделать тщательно.

По картинкам: что-то картинки много весят. Ты разбираешься в форматах картинок для web (JPEG, GIF, PNG8, PNG24, SVG), знаешь их особенности? Если нет, надо изучить и поколдовать в фотошопе или другой программе с выбором подходящего формата и уровня сжатия. Ну и мыла смотри чтобы не было.

http://htmlbook.ru/samhtml/izobrazheniya/formaty-faylov
http://www.designonstop.com/useful/photoshop/vse-delo-v-formate-ili-kak-pravilno-soxranit-kartinku-v-fotoshope.htm
http://arttower.ru/tutorial/Svetilkin/spravochnicki/Photoshop_for_WEB/Charter2/1.htm

Иконки соцсетей внизу (которые рядом) стоит объединить в одну картинку с использованием css спрайтов: http://learn.javascript.ru/css-sprite (только без фанатизма)

Пункты меню, кнопки должны реагировать на наведение мыши.
#92 #396270
>>396247

Картинки, которые являются частью оформления сайта, надо вставлять не через img а через background-image. Тег img предназаначен только для иллюстраций, фотографий, рисунков, которые являются частью содержимого страницы а не частью дизайна.

Стиль text-align: center на body странный. Ты хочешь сказать, на всех страницах по умолчанию весь текст дложен быть выровнен по центру? В body задаются именно стили по умолчанию.

Когда задаешь шрифт, в конце списка всегда надо ставить один из стандартных шрифтов (serif, sans-serif, monospace и подобные).

В именах классов и id обычно используется минус, а не подчеркивание. Но это я просто информирую, это не ошибка.

> <p class="portfolio_title">


Это называется h2

Для контактной информации по идее есть тег address, может он тут пригодится?

Значки телефона и метки перед адресом удобнее всего сделать через background-image или псевдоэлементом и не засорять HTML.

Что насчет браузеров? В ИЕ тестировал или собираешься? У меня если что есть мануал на тему: https://gist.github.com/codedokode/855e3970124687b26a1c
50 Кб, 729x505
178 Кб, 228x377
#93 #396325
|||||| ||||||||| |||||||||| |||||| |||||||||||||||||||||
#94 #396328
Хотелось бы спросить:

Как по куки дать доступ к редактированию конрктной строки из БД?
#95 #396329
>>396325
Что тебе не нравится, поехавший?
#96 #396337
>>396329
А, я разобрался, ну, короче, интерфейс и абстрактный класс похожи, просто я не мог понять почему, блять, там идет наследование опять, как и у интерфейса.
# OP #97 #396339
Вот у меня обращение личное к начальнику тредов о РНР.
Что, блять, тебе трудно тред создавать самому? Ты же его мониторишь постоянно, совсем распиздяй?
635 Кб, 1500x1000
#98 #396370
Переделка простейшего банкомата:
http://ideone.com/meyGFI

Михаил Круг:
http://ideone.com/CJVeId
#99 #396381
Когда экранирую ввод данных в базу через execute(), то он ставит бекслеш перед каждой кавычкой. Судя по тому что этот бекслеш оказывается в базе данных, он ставит два бекслеша. Какого хера? Почему? Как убрать? гугл говорит про magic_quotes, я проверил phpinfo(), они отключены.
#100 #396386
>>396337

Если ты не очень разобрался, то лучше спроси, если непонятно, или книгу Зандстры перечитай.

абстрактный метод — это метод, у которого нет тела и который ты должен реализовать в потомке. Это похоже на интерфейсы, но это совсем другая вещь так как абстрактный класс — это класс (не до конца дописанный), а интерфейс — это набор требований к классу.

> почему, блять, там идет наследование опять


Не понял вопроса, но абстрактный класс как раз для того и пишется, чтобы от него наследоваться. Если ты решал нашу задачу про Вектор или кошек-мышек то там это используется.

> огда экранирую ввод данных в базу через execute(), то он ставит бекслеш перед каждой кавычкой.


Покажи простой пример кода. Интуиция подсказывает что все же какие-то magic quotes виноваты, там 2 или 3 таких опции.
#101 #396387
>>396381

Покажи простой пример кода. Интуиция подсказывает что все же какие-то magic quotes виноваты, там 2 или 3 таких опции.

Алсо, бекслеш может уже изначально быть в данных.
#102 #396442
>>396035

>Вот это называется «лезть внутрь» другого объекта


Так, т.е в теле метода нужно использовать его This, либо его arguments? Все остальное нельзя трогать?
#103 #396443
>>396000
Спасибо за совет. Я поиграюсь и установлю готовый. Но, почему он сжирает "`".$key.'`=' в 7 строке?
#104 #396446
>>396442

Есть какой-то объект. Есть 2 способа работать с ним:

1) напрямую читать и изменять его свойства
2) вызывать его методы

Способ 1 приводит к тому, что код изменяющий свойства размазан по всему проекту, в в способе 2 он содержится только в одном классе и очевидно код получается лучше, а классы изолированы друг от друга. Это называется инкапсуляция, и это один из принципов ООП (другие 2: полиморфизм и наследование). В нормальных языках есть слова private/protected чтобы закрыть доступ к свойствам извне, в JS нет, но можно на словах договориться так не делать.

Важность инкапсуляции становится особенно заметна, когда классов много: без нее получается не код, а спутанная лапша.

Соответственно, такого правила

> т.е в теле метода нужно использовать его This, либо его arguments? Все остальное нельзя трогать?



нету. Есть просто пожелание придерживаться принципов ООП (инкапсуляции) и использовать по возможности вызов методов вместо того, чтобы обращаться к свойствам другого объекта напрямую.

>>396443

Поставь везде echo/var_dump чтобы было видно что происходит внутри функции и посмотри почему (если не увидишь сам, выложи код на ideone — я гляну).
#105 #396450
>>396328

Я не очень понял вопрос, но может быть генерировать длинный сложный код, класть его в куку и в строку БД, а при попытке редактирования сравнить? Ты понимаешь, как куки работают и что это такое?

>>396339

Куда спешить? Оттого что мы денек повисим на второй странице никто не умрет. Когда будет время и настроение, тогда и создаю.

>>396370

Банкомат

Код стал проще, но его по-прежнему много. Давай упрощать еще.

Вместо твоих сложных способов получить номинал очередной купюры лучше отсортировать массив купюр по убыванию (одной из функций http://php.net/manual/ru/array.sorting.php ) а потом перебирать купюры обычным foreach.

> if ($needed <= $bills[$bill]) {


Вместо if тут можно использовать min/max

Наконец, у тебя echo стоит внутри цикла. Почему? Ты обираешься вывести надпись об ошибке и продолжать выполнять цикл? Это смотрится странно. В цикл помещают то, что выполняется несколько раз.

> foreach ($billsWeHave as $key => &$value) {


Неопнятно зачем & перед value. И вообще непонятно, зачем нам нужна giveMeSmallerBill если есть цикл.
#106 #396454
>>396370

> function out($array)


лучше переименовать $screen => $array, $array2 => $line, во-вторых, тут можно минимум один цикл заменить на implode.

> convert($value)


Есть deg2rad и rad2deg — можно выпилить твою функцию вообще.

Насчет углов, если ничего не менять, то там по умолчанию 0° — это точка снизу и углы отсчитываются против часовой стрелки. Чтобы сделать по часовой, надо поменять знак перед cos или sin или уменьшать угол вместо увеличения.

И вместо 200° можно было сделать начальный угол (200 - 360) = -160°, а конечный 530 - 360 = 170°. Тригонометрию вроде бы изучают в школе, так что ты наверно это и сам знаешь.

Так, нормально, все остальное верно (я думаю, достаточно convert удалить и переименовать переменные и все будет готово).
88 Кб, 1300x1021
#107 #396457
>>396454

>Тригонометрию вроде бы изучают в школе, так что ты наверно это и сам знаешь.


>tfw когда ты уже не школьник.


>и уже не студент даже



>>396450

>echo стоит внутри цикла. Почему? Ты обираешься вывести надпись об ошибке и продолжать выполнять цикл?


Брейк забыл. Это всмысле? Или вообще убрать?
#108 #396458
>>396035

>и что за странная идея, хранить имя поля в константе? константы так не используют


А как? Я же в прошлых задачах как раз для имен полей их и использовал.

Смотри, вот здесь я получается залезаю в чужой объект?:
Field.prototype.getCellAt = function(x, y) {
return this.cells[x][y][Field.MINE];
};


Пока, так: http://jsbin.com/jizorederi/1/edit?html,js,console,output
7 Кб, 579x333
#109 #396465
>>395787
Скажем есть у меня функция принимающая по ссылке, массивы arg1, arg2, arg3. При этом, мне нужно чтобы можно было вызвать эту функцию, с arg2 = 0. Это возможно без обьявления какой то $zero = 0 ?
#110 #396480
>>396457

Или break поставить или из цикла вынести. Лучше вынести.

>>396458

> Я же в прошлых задачах как раз для имен полей их и использовал.


Надеюсь что нет. Какой смысл заводить константу когда можно просто сдеоать cell.hasMine = true ?

> вот здесь я получается залезаю в чужой объект?:


да

>>396465

Ты неправильно спроектировал свою функцию. Во-первых, лучше не использовать & а возвращать результат через return. Во-вторых, если у тебя есть аргумент то в нем всегда должны передаваться данные одного типа, иначе это становится не код, а быдлокод.

Потому тебе надо переделать свою функцию, а не искать способы передать ноль по ссылке (это невозможно).
#111 #396483
>>396480

>Ты неправильно спроектировал свою функцию. Во-первых, лучше не использовать & а возвращать результат через return. Во-вторых, если у тебя есть аргумент то в нем всегда должны передаваться данные одного типа, иначе это становится не код, а быдлокод.


Мне нужно, чтобы когда я вызывал эти функции никаких ненужных копий не создавалось. Я не изменяю ничего в этих обьектах, я просто читаю их.
#112 #396484
>>396483
Оптимизатор хуев.
Ты, кстати, значешь, что, по мнению Кнута, является корнем зла?
#113 #396485
>>396450
Знаю, как работают.

А нельзя ли просто в куках сохранять значения e-mail и по нему уже искать и вносить изменения в данные?

Только вот не безопасно это нихрена.

Я эту задачу решаю, в 10 не уложусь, кстати, кроме php приходится учить много математики:
https://gist.github.com/codedokode/d7e7f11449fc3bcb24b4
#114 #396486
>>396485
Шифровать что ли e-mail?
#115 #396490
>>396484

>покпокпок преждевременная оптимизация


Предлагаешь создавать копии кучи файлов при каждом вызове? Скрипт работает за 5 секунд с референсами, и час без них.
#116 #396515
>>396483

Ты знаешь что такое copy-on-write? В PHP и так если ты ничего не изменяешь то копий не создается. ты бы, голова дубовая, померял сначала профайлером где у тебя тормозит, а потом в оптимизацию лез.
#117 #396521
>>396515
Ебать я дебил, спасибо.
#118 #396525
>>396485

>А нельзя ли просто в куках сохранять значения e-mail и по нему уж


Тогда любой мамкин хакер впишет себе в куки чужой емайл. Надо генерировать код, не менее 32-х символов из набора не менее чем буквы (большие и маленькие) + цифры (это даст нам 62 ^ 32 = достаточно много комбинаций).
#119 #396528
>>396525
Я уже сказал, что можно шифровать e-mail. Муторно как-то добавлять еще одно поле в таблицу.
#120 #396529
>>396528

Что значит муторно? В чем сложность-то?
#121 #396530
>>396528

Если ты хочешь шифровать e-mail, опиши схему. Какие алгоритмы применяются, и т.д.
#122 #396533
>>396485

Насчет времени — это написана оценка. Тебе не обязательно уложиться в 10 дней, делай как удобно, хоть год.
#123 #396543
>>396530
crypt() в md5
>>396533
Окей, спасибо
#124 #396545
>>396543

crypt — это хеширование а не шифрование. Любой может сам выполнить crypt и получить код.

Что ты так упираешься? почему не сделать случайный код для доступа?

Конечно можно хешировать (email + секретный пароль) но утечка одного пароля означает утечку доступа ко всем данным. В этом плане коды надежнее.
#125 #396547
>>396545
Для этого ему нужно будет знать e-mail конкретного человека.

Тем более, я буду редактировать только ту строку, где crypt(e-mail) совпадает с введенным.

Если я добавлю еще одно поле, то код будет совсем плохо смотрется. Глупая причина, я знаю, а как переписать лучше, я не знаю.
#126 #396549
>>396547

Это и есть уязвимость. e-mail — не секретная информация, не говоря уже о том что их можно перебирать. Делай нормально. А насчет кода — если плохо смотрится то исправляй пока не станет хорошо смотреться.
6 Кб, 531x126
#127 #396571
>>396549
Ладно, так и сделаю

Каким образом? Пик
#128 #396590
>>396000
Я вот не пойму, мне чтобы Zend_Db_Select заработал,ю нужно весь фреймворк ставить а вместе с ним и еще composer какой-то?
#129 #396626
>>396571

При сохранении данных в первый раз генерируешь код и сохраняешь его в таблицу и в куки. при попытке обновить данные в базе проверяешь у пользователя наличие кода.

>>396590

По идее фреймворк состоит из отдельных компонент, и весь фреймворк тянуть необязательно, достаточно Zend_Db, но тогда надо знать, от чего зависит Zend_Db_select и соответственно не забыть его зависимости. Но скачать отдельно Zend_Db не уверен что возможно.

Я сейчас глянул, для ZF1 можно скачать Minimal Version (10 Мб) — но там не только Zend_Db а еще дофига всего.

Если ты не боишься перейти на ZF2 то там можно установить только нужный компонент: http://framework.zend.com/downloads/composer — composer сам подтянет нужные зависимости. В принципе, можешь использовать этот вариант — он и новее, и в случае использования композера вообще руками ничего качать не придется.

Композер также сгенерирует код для автозагрузки файлов фреймворка. Тебе останется написать один раз require_onece в своем коде и все.

Использование композер: http://habrahabr.ru/post/145946/

Изучи его, он тебе пригодится, так как это сейчас главный менеджер пакетов для PHP.
#130 #396629
>>396590

Алсо, zend db 2 доступен на packagist: https://packagist.org/packages/zendframework/zend-db — это значит, что никакие репозитории прописывть в composer.json достаточно лиim прописать одну строчку (она есть на странице packagist).
Аноним #131 #396663
>>395787
оп, я полный 0, хочу изучить php, у меня мак, скачал sublime text 3, открыл, вбил туда первую задачку, и в мою пустую голову поступил вопрос, что собственно делать дальше? как проверить правильно ли? а то там голый недокод и больше ничего, как запустить хз(
Аноним #133 #396683
>>396677
сайт не работает(
#135 #396685
>>396663
для новичка denwer - самое то.
#136 #396689
>>396480
>>396035

>if (this.getCellAt(x, y).hasMine())...


Я сделал так, но чтобы не лезть внутрь объекта в getCellAt у меня не получается. Это же метод для того, чтобы получить ячейку? Кроме как написать return this.cells[x][y]; ничего в голову не приходит. И еще, нельзя чтобы метод и имя поля совпадали? А то у меня ошибка - уже и в файербаге все облазил, не смог разобраться.
http://jsbin.com/lexuradadu/edit
#137 #396703
PHP-лорды, такой вопрос:
Всю жизнь работал с ебанутой связкой Зенда 1 и Смарти. Причем из Зенда юзался только класс работы с БД, а Смарти для шаблонов. Я вот не задумывался, передавал в шаблон смарти переменные из пхп и выходил такой код:
[CODE]
<h1>{$article.title}</h1>
[/CODE]

Но вдруг у меня встал вопрос: а как в чистом PHP сделать шаблон? Не писать же ужас типа такого:
[CODE]
<?php
$article = array('title' => 'Hi there!');
?>
<h1><?=$article['title']?></h1>
[/CODE]
882 Кб, 698x835
766 Кб, 2000x1495
101 Кб, 992x1200
272 Кб, 640x1476
Воннаби #138 #396704
>>395442

> опечатки


>Он у тебя ищет не опечатки, а любые английские буквы: http://ideone.com/CteSUA


Просидел весь следующий же день над этим твоим замечанием, и не смог грамотно составить регулярку под все возможные случаи смеси русских и латинских символов в 1 слове. В общем где не просто 1 буква среди русских затесалась, а омск вроде +----+, ---+-++---, +++---+++, ---+-+-++ +--++--++++, где плюсы это латиница, а минусы кирилица. Хотя идея как сделать вроде бы была, и всего через одно "или" в регулярке, но всегда были ошибки в итоге. В итоге я задолбался и запил с горя дропнул аж на два дня вообще всё. Обязательно вернусь к этому замечанию позже.

>>395460

>(любое число пробелов)(знак препинания)(любое число проеблов) -> заменяем на (ничего)(знак препинания)(один пробел)


Но как заменяющей функции передать какой там стоял знак припинания? Поэтому у меня и 4 принципиально схожих строки в коде с этим. Под каждый из вариантов.

>Код делающий первую букву заглавной, стоит наверно вынести в отдельную функцию. Зачем все одной портянкой писать.



Сделал в общем косметику и вынес в отдельную функцию код по увеличению первой буквы.

http://ideone.com/NYNN53
#139 #396707
>>396626
А как не повторять одну команду с разными значениями, как на пикче?
32 Кб, 500x520
КНИЖКИ ПО ПЫХУ #140 #396786
Аноны, а я вам пару бестселлеров по PHP принес.


1.1) PHP 5 for Dummies - Janet Valade (2004) [Wiley]
1.2) PHP 5 для чайников – Джанет Валейд (2005) [Диалектика]
2) PHP & MySQL For Dummies 4th Edition - Janet Valade (2010) [Wiley]


Скачать:
http://rghost.net/58598908
#141 #396790
>>396786

Спасибо качаю.
#142 #396795
>>396663

Тебе надо либо запускать в онлайн редакторе ideone либо установить PHP. На Маке, внезапно, в системе уже есть PHP (спасибо Джобсу) так что открой консоль (Terminal App, ищи в поиске) и набери что-то вроде

php -v (показать версию php)

php ~/Desktop/myfile.php (запустить твой скрипт)

Вот краткий гайд по консоли: https://gist.github.com/codedokode/10539568

Чтобы не печатать каждый раз команду, ты можешь настроить в Sublime Build System для PHP, чтобы при вызове команды build запускался скрипт, но как это сделать? надо погуглить.

Но PHP который тебе установил Джобс, довольно старый. Там вполне может быть 5.3 а ведь уже 5.6 вышел. Чтобы поставить новый PHP придется покрасноглазить с консолью.

Поставить новый PHP (и другие консольные программы) можно либо через MacPorts либо через HomeBrew. У HomeBrew довольно модный сайт, думаю, разберешься: http://brew.sh/index_ru.html

Учти что HomeBrew ставит PHP в отдельную папку, а не заменяет системный. Это значит, что чтобы его вызвать, надо будет писать не php, а полный путь вроде /usr/local/bin/php или ~/homebrew/bin/php

http://geektimes.ru/post/151023/

Если что-то непонятно, задавай вопросы.
#143 #396796
>>396685

Неверно. Сборки рассчитаны на опытных программистов, которые все умеют ставить и которым лень с этим возиться. Новичок должен поставить себе Апач + PHP сам.

>>396689

> Я сделал так, но чтобы не лезть внутрь объекта в getCellAt у меня не получается


Не понял

> Это же метод для того, чтобы получить ячейку? Кроме как написать return this.cells[x][y]; ничего в голову не приходит


Ну и нормально. Ты же обращаешься к свойствам своего объекта, а не чужого.

> И еще, нельзя чтобы метод и имя поля совпадали?


В JS метод это и есть поле, в которое записана функция. Там нет разделения на поля и методы на уровне языка.

> this.cells[x][y].hasMine = false;


Это можно (нужно) перенести в конструктор класса Cell. Пусть он сам выставляет свои свойства.

Ошибка (видна в консоли jsbin): "TypeError: this.getCellAt(...).hasMine is not a function (line 117)"

У тебя hasMine не является функцией. Тебе надо переименовать свойство hasMine например в _hasMine

> if (cell.hasMine === true) {


Если там только true/false то можно писать if (cell.hasMine), тут объяснено: https://gist.github.com/codedokode/ce30e7a036f18f416ae0#%D0%9B%D0%BE%D0%B6%D0%BD%D1%8B%D0%B5-%D0%B8-%D0%BF%D1%80%D0%B0%D0%B2%D0%B4%D0%B8%D0%B2%D1%8B%D0%B5-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F
#143 #396796
>>396685

Неверно. Сборки рассчитаны на опытных программистов, которые все умеют ставить и которым лень с этим возиться. Новичок должен поставить себе Апач + PHP сам.

>>396689

> Я сделал так, но чтобы не лезть внутрь объекта в getCellAt у меня не получается


Не понял

> Это же метод для того, чтобы получить ячейку? Кроме как написать return this.cells[x][y]; ничего в голову не приходит


Ну и нормально. Ты же обращаешься к свойствам своего объекта, а не чужого.

> И еще, нельзя чтобы метод и имя поля совпадали?


В JS метод это и есть поле, в которое записана функция. Там нет разделения на поля и методы на уровне языка.

> this.cells[x][y].hasMine = false;


Это можно (нужно) перенести в конструктор класса Cell. Пусть он сам выставляет свои свойства.

Ошибка (видна в консоли jsbin): "TypeError: this.getCellAt(...).hasMine is not a function (line 117)"

У тебя hasMine не является функцией. Тебе надо переименовать свойство hasMine например в _hasMine

> if (cell.hasMine === true) {


Если там только true/false то можно писать if (cell.hasMine), тут объяснено: https://gist.github.com/codedokode/ce30e7a036f18f416ae0#%D0%9B%D0%BE%D0%B6%D0%BD%D1%8B%D0%B5-%D0%B8-%D0%BF%D1%80%D0%B0%D0%B2%D0%B4%D0%B8%D0%B2%D1%8B%D0%B5-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F
#144 #396797
>>396703

> а как в чистом PHP сделать шаблон? Не писать же ужас типа такого:


Именно так и писать:http://www.phpinfo.su/articles/practice/shablony_v_php.html

Только выносить весь HTML в отдельный файл.

Ну и еще, надо экранировать вывод, а то будет XSS. Ты наверняка не экранируешь, а зря, почитай: https://gist.github.com/anonymous/52adda0113428b274c64
#145 #396798
>>396704

ответ: http:/ideone.com/EgjA5n
#146 #396799
>>396707

Передавать массив в execute например. Или написать свою функцию вида

$result = execute(".....", $a, $b, $c);

Алсо, насчет результатов ЕГЭ, а там ведь огут быть разные предметы? Не лучше ли это вынести в отдельную таблицу а не лепить однотипные поля?
#148 #396806
Если я хочу получать 10-15 к не выходя из дома, то пхп пойдет? Есть 3 года за которые надо что то выучить.
#149 #396807
>>396806

Пойдет, но зачем такие низкие цели ставить? За 3 года PHP можно выучить очень хорошо, и успеть джуниором поработать и гораздо большего добиться. При желании не выходя из дома.

>>396805

Все правильно.
#150 #396820
>>396807
ОП, почему ты пишешь без трипкода? Я понимаю что двощь. ананимность и все такое. Но хочется что бы твои посты были легко заметны.
#151 #396822
Вопрос не по теме, но как вы начали зарабатывать на фрилансе? Даже на самые простые задания штук 30 волонтёров, причем некоторые с портфолио. Еще не понимаю за каким хуем грошовая работа по 10рублей требует бизнес-аккаунта?
#152 #396831
>>396822
я одно время сидел в /wrk и там есть одеск-треды, может быть ты там лучше спросишь? А то тут сидят одни учащиеся и всего пара гуру.
!codetripcode #154 #396836
Test
!3MOm6dO3V2 #155 #396837
Test
!xnn2uE3AU. #156 #396839
>>396820

Из быстрого ответа вроде не работает.
#157 #396845
>>396822

Апплайся на все, что можешь сделать, пиши в личку если заказчик не против, будь убедителен. Но вообще, фриланс не для всех подходит. Если ты можешь сделать что-то полезное и тиражировать для многих заказчиков (то есть много времени на каждого не тратить) — хорошо, а если ты каждый раз все делаешь с нуля, то много ты не заработаешь и большую часть времени будешь тратить на поиски и общение с заказчиками разной степени адекватности. В таком случае лучше постоянную работу искать.

>>396835

> Могу ли я в качестве аргумента передать методу openCell() - field1?


Это не очень логично, почему ты поле на котором находится клетка передаешь в функцию ее открытия? Логичнее передать в конструктор при создании либо перенести метод openCell в Field. А в Cell передавать только цифру.
фреймворки #158 #396857
Какие есть годные, и для каких размеров проектов?
Чем один лучше другого?
Желательно вид со стороны менеджера, типа:
"вот заебошили проект на 1к часов на Yii, заебались с Active Record";
"Laravel это не просто тренд, мы на нем проекты по 600 часов уже второй год пилим и все здоровы, зависимость есть";
"Делаю визитки на Zend, подходит идеально, потому что ..."
#159 #396864
Кстати, по поводу индетефикатора для конкретного юзера, что если я беру случайное число, шифрую его, и записываю в куки, сверяя при редактировании.

И, еще одно, как организовать вывод из бд на одну страницу, причем, что бы .php был разделен с html, ибо все, что я нахожу - убогая хуйня.
#160 #396867
>>396864

> что если я беру случайное число, шифрую его, и записываю в куки, сверяя при редактировании.


Шифрование с одним общим паролем вообще опасно тем, что при утечке одного пароля, который хранится в коде, злоумышленник получает доступ ко всем пользователям.

Насчет кода — это общепринятый подход, например при восстановлении пароля на почту: генерируется код, сохраняется в базу и высылается на почту в виде ссылки.

> причем, что бы .php был разделен с html



1) шаблонизатор встроенный в PHP: http://www.phpinfo.su/articles/practice/shablony_v_php.html
2) twig
#161 #396877
>>396867
Не могу понять, как вывести 50 строк, не каждую же строку отдельно выводить.

Во вторых, а вторую страницу как сделать, если там больше 50?
#162 #396884
>>396386

> Покажи простой пример кода. Интуиция подсказывает что все же какие-то magic quotes виноваты, там 2 или 3 таких опции.


Еще раз посмотрел пхпинфо, теперь одна опция включена. Отключил в .htaccess - помогло. Первый раз как я смотрел, непонятно.
#163 #396885
>>396877

Цикл

> а вторую страницу как сделать, если там больше 50?


Пагинация, то есть вывести внизу номера страниц, каждый является ссылкой, содержащей номер вроде:

/table/2
/table/3

или

/table.php?page=2
#164 #396886
>>396266

> Соответственно тебе не нужен будет foreach и не придется использовать костыль в виде передачи position туда-сюда.


Пожалуй так разумней. Хотя позицию надо будет где-то сохранять все равно, но без циклов зато.

> Вот это очень неэффективно, преобразуем токены назад в текст, а текст снова парсим. Так делать не надо.


2-й флаг определяет токенизирован он или нет. Он не превращает обратно в чистый текст, а наоборот освобождает от токенизации, потому-что уже разбит на токены.

> Также, объект токенайзера обычно передается в парсер в качестве исходных данных.



> Для каждого тега позже стоит завести свой класс (а в парсере — соответствие имя тега -> имя класса). Тогда можно будет легко добавлять новые.


Непонял. Как выглядить должно? Как взаимодействовать?
>>396267

> Ну и пока твой парсер не соответствует алгоритму recursive descent так как в этом алгоритме мы имеем набор функций, каждая из которых умеет парсить какую-то часть синтаксиса целиком и возвращает узел дерева как результат. Ну то есть у нас могут быть методы типа:



> parsePlainText() // парсит кусок текста без тегов и возвращает текстовый узел


> parsePairTag() // парсит код от открывающего до закрывающего тега и возвращает узел-тег


> parseSingleTag()


Так ты же сказал наоборот все за один проход надо проверять. А как это тогда сделать? Каждый токен пропускать через все парсеры, а в парсерах делать фильтр на соответствие токена? Это уже отдельный класс, только с фильтрацией на всех парсерах. Не разумней ли тогда её сделать один раз в начале и вызывать только нужный парсер? Или ты что-то другое имел ввиду? Что?
#165 #396905
Я полный ньюфаг в php, некогда читать мануалы, надо прямо сейчас написать кое-что заказчику (к проекту нужна простая веб-морда). Есть у меня один php-файл, который выводится на сайте вместо html (http://www.php.su/php/intro/?2 пользовался этим). Там есть поле для ввода и кнопка. Как сделать так, чтобы пользователь ввел что-то, нажал на кнопку, и этот текст отобразился ниже? Везде вижу мануалы с штуками типа <form action="action.php" method="post">, но мне не нужен никакой action.php, мне нужно реализовать в рамках одного index.php. Как это сделать?
#166 #396910
>>396905
<form action="" method="post">
Хотя советуют делать:
<form action="<?php echo $SERVER['PHP_SELF']; ?>" method="post">
В файле та часть которая выполняется при post запросе можно сделать просто в виде if (SERVER["REQUEST_METHOD"] == "POST") processQuery();
#167 #396911
>>396910
$_SERVER конечно-же
#168 #396916
>>396910
Вот так вот что ли?
[CODE]
echo '<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">'
echo '<input type="text" name="text">'
echo '<input type="submit">'
echo '</form>'
[/CODE]
или одинарные кавычки тут нельзя?
#169 #396924
>>396916
; ещё
#170 #396926
>>396924
Не могу понять: почему не работает?
<html>
<head>
</head>
<body>
<?php
echo "<form action='<?php echo $_SERVER['PHP_SELF']; ?>' method='post'>";
echo "<input type='text' name='text'>";
echo "<input type='submit'>";
echo "</form>";
?>
</body>
</html>
#171 #396933
>>396926

> '<?php echo $_SERVER['PHP_SELF']; ?>'


Кавычки. А вообще теги не выводят через echo, моветон. Я же написал как выводить.
sage #172 #396934
>>396926
даун чтоли?
<html>
<head>
</head>
<body>
<form action='<?php echo $_SERVER['PHP_SELF']; ?>' method='post'>
<input type='text' name='text'>
<input type='submit'>
</form>
</body>
</html>

миморубист
#173 #396936
>>396926
Еще и <?php внутри <?php. <?php - это откуда начинается php код, очевидно открытие когда он уже открыт - ошибка. То что ты написал надо выводить так:
<html>
<head>
</head>
<body>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method='post'>
<input type='text' name='text'>
<input type='submit'>
</form>
?>
</body>
</html>
#174 #396937
>>396936

> ?>


Это лишнее, очепятка.
#175 #396938
>>396905

Плохо что ты берешься за заказы не выучив язык. Ничего хорошего из этого не выйдет. В итоге на поиск решения и исправление ошибок времени уйдет больше чем ушло бы на изучение.

Не очень понял задачу, но если надо что-то показывать по нажатию кнопки то проще всего сделать это на яваскрипте.

>>396926

Потому что код неправильный. Нельзя так писать.
#176 #396941
>>396926
Вот например начало мини-туториала в пхп-мануале. http://php.net/manual/en/tutorial.forms.php хоть бы полчаса потратил, а то ж смешно.
#177 #396942

>не знает чьи формочки - хтмл или пхп


>пытается заставить работать пхп у клиента


Деньги еще, небось, получает.
#178 #396944
>>396936
А это должен быть файл index.html или index.php?
>>396938
Да этого и не было в рамках заказа, просто теперь заказчик захотел прикрутить простенькую веб-морду за доп. плату, ну а я подумал, что наверно разберусь быстро.
Ладно, я тогда лучше изложу работу полностью. Пользователь хочет, чтобы он мог через сайт исправлять содержимое одного txt файла (к нему потом обращается моя программа, но это не суть) на сервере. Файл имеет такой вид:
переменная1 = строка1
переменная2 = строка2
...
Нужно, чтобы пользователь зашёл на сайт и видел перед собой таблицу, где каждая строка отвечает за соответствующую переменную. Т.е. в первой строке таблицы в первой колонке будет написано "переменная1", во втором столбце текстовое поле, в третьем кнопка "изменить значение". Как сделать массив из строк файла и разбивать эти строки на "переменная1" и "строка1" я уже понял, осталось сделать эти формочки.
Извините, что такой даун и не изучаю язык сначала, но вот так вот приходится, времени в обрез.
#179 #396946
>>396944

Если времени в обрез, не лучше найти что-нибудь готовое, готовый скрипт может быть?
#180 #396948
>>396946
А как найти то, что мне нужно? Я правда не знаю даже, что в гугле забивать
#181 #396950
>>396948

я тоже ((
sage #182 #396957
>>396942
Типичный пхпшник.
#183 #396961
Ну же, ананасы, помогите
#184 #396965
>>396961
Хотя бы вот с этим: у меня в цикле создаются кнопки; как сделать так, чтобы value у i-той кнопки было равно i?
примерно так
for ($i = 0; $i < 104; $i++) {
\t<form method="POST" action="<?=$_SERVER['PHP_SELF']?>">
\t<input type="submit" name="okbutton" value=$i>
\t</form>
}

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
\techo $_POST['okbutton'];
}
?>
#185 #396968
>>396944
B зачем формы?
$txtContent = file_get_content('txt.txt');
$rows = explode($txtContent, "\n");
foreach ($rows as $row) {
$varArray = explode($row, " = ");
$variables[$varArray[0]] = $varArray[1];
}
Будет у тебя $variables в которой ключи будут переменными а значения стобственно их значениями. Может и еще проще надо, я тоже нуб.
#186 #396970
>>396968
А как потом их изменить и записать изменения в файл?
#187 #396972
>>396965
<?php for ($i = 0; $i < 104; $i++): ?>
<form method="POST" action="<?=$_SERVER['PHP_SELF']?>">
<input type="submit" name="okbutton" value=<?php echo $i; ?>>
</form>
<?php endfor; ?>
Потрать вечер на мануал, базовый синтаксис, ё-моё. ё
#188 #396984
>>396972
Спасибо. Потрачу, как будет время.
#189 #396986
>>396984
Это работает не так. Сначала ты находишь время на базовый синтаксис. Ну час хотябы. Ну полчаса хотябы. Потом пишешь код. Я слежу за тобой, ничтожество.
#190 #396988
>>396986
Иди нахуй, раз сказал — значит изучу.
#191 #396996
>>396988

Нет ты иди. Не хочешь слушать добрые советы, не заходи в тред.
43 Кб, 1011x517
#192 #396999
>>396988
Простейший, набросанный краешком залупы, быдлокодерский вариант чтения. Добавить обработку кнопки и сохранение, а не только чтение. Подпилить теги ????? Заказ готов.
1204 Кб, 1920x1200
Воннаби #193 #397019
http://ideone.com/tdbsuo

оцените быдлокод, пока только наброски. Ибо как решить эту задачу полностью я пока не знаю. Пытаюсь придумать.
#194 #397051
>>396999
Ты дебил, тебя за такой код кастрировать надо.
#195 #397089
>>395787
Sup, /pr/.
Есть одна задача и тупой анон. Задача состоит в целом: рассчитать календарь на текущий месяц через getdate. В гугл идти не хочу, но может кто-нибудь мне помочь, с чего начать?
#196 #397093
>>397051
Ну как там, заказчик еще ножкой не топчет, программизд?
#197 #397096
Генерирую уникальные секретные имена файлов такой конструкцией:
$fnam = $userid."_".substr (md5 (uniqid (rand (10000000, 99999999).uniqid (rand (10000000, 99999999), true).md5 (rand (10000000, 99999999)), true)), 0, 12).".txt";

Какие подводные камни?
#198 #397138
>>397096
хеш от time() обычно добавляют ещё
31 Кб, 250x188
#199 #397178
Сап, пыханы. Пишу писечку, которая бы генерировала массив из некоторого числа телефонных номеров. А потом ещё проверяла их на соответсвие шаблону.

Сейчас написал генератор номера, но не знаю, как сделать так, чтоб цикл записывал его в массив.

http://ideone.com/qxMPZr

Суть в том, чтобы он записывал в массив не один номер, а столько, столько нужно.
#200 #397179
>>397089
Это как, ну вот захотел я решить твою задачу, а условие то не ясно, алсо если много ранить этот код http://ideone.com/YjXxQl то становится похоже что там минимум два сервера
12 Кб, 640x427
#201 #397180
>>397178

http://ideone.com/8cL2Zn

Держи поправил.

Что бы во время цикла писало в массив, ты должен записывать в $i-й элемент массива при $i проходе цикла.

алсо нельзя вывести массив с помощью echo весь сразу, его тоже нужно выводить в цикле, выводя например $i-й элемент.
58 Кб, 600x450
#202 #397181
>>397178
Всё, отбой. Разобрался.
http://ideone.com/yvdyrR

Теперь есть один небольшой вопрос. Почему mt_rand(001, 999) генерирует иногда число не из 3х цифр, а меньше?
#203 #397189
>>396857

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

>>396886

> Хотя позицию надо будет где-то сохранять все равно


Внутри объекта Tokenizer поле сделай

>> Для каждого тега позже стоит завести свой класс (а в парсере — соответствие имя тега -> имя класса).


> Тогда можно будет легко добавлять новые.


Непонял. Как выглядить должно? Как взаимодействовать?

$map = array(
'b' => 'Node_Tag_B',
'img' => 'Node_Tag_Img'
);

> Так ты же сказал наоборот все за один проход надо проверять. А как это тогда сделать?


Так и будет. Смотри, у тебя сейчас код такой:

foreach ($tokens as $token) {
// пишем весь код внутри цикла и придумываем хитрые костыли вроде пропуска части токенов
}

А будет объект Tokenizer который хранит внутри позицию в списке токенов и у которого есть методы вроде «получитьТекущийТокен», «являетсяЛиТокеномТипа» и тд. И код будет выглядеть так:

....
while (!$this->tokenizer->isNextToken(T_END_TAG)) {
$content[] = $this->tokenizer->getNextToken(T_TEXT);
}
....

Сам посмотри, это дает гораздо больше свободы. И массив токенов остается внутри объекта Tokenizer тем самым реализуя инкапсуляцию.
#203 #397189
>>396857

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

>>396886

> Хотя позицию надо будет где-то сохранять все равно


Внутри объекта Tokenizer поле сделай

>> Для каждого тега позже стоит завести свой класс (а в парсере — соответствие имя тега -> имя класса).


> Тогда можно будет легко добавлять новые.


Непонял. Как выглядить должно? Как взаимодействовать?

$map = array(
'b' => 'Node_Tag_B',
'img' => 'Node_Tag_Img'
);

> Так ты же сказал наоборот все за один проход надо проверять. А как это тогда сделать?


Так и будет. Смотри, у тебя сейчас код такой:

foreach ($tokens as $token) {
// пишем весь код внутри цикла и придумываем хитрые костыли вроде пропуска части токенов
}

А будет объект Tokenizer который хранит внутри позицию в списке токенов и у которого есть методы вроде «получитьТекущийТокен», «являетсяЛиТокеномТипа» и тд. И код будет выглядеть так:

....
while (!$this->tokenizer->isNextToken(T_END_TAG)) {
$content[] = $this->tokenizer->getNextToken(T_TEXT);
}
....

Сам посмотри, это дает гораздо больше свободы. И массив токенов остается внутри объекта Tokenizer тем самым реализуя инкапсуляцию.
#204 #397191
>>396968

Чтобы прочитать файл в массив строк, есть функция file() c кучей опций. Но в твоем случае, формат похож на ini файл и может быть подойдет функция http://php.net/manual/ru/function.parse-ini-file.php

Не надо изобретать велосипеды.

Алсо, я бы использовал JSON.

>>396999

Не надо смешивать PHP/html в одном файле, не надо читать файл через fgets когда есть file() и parse_ini_file(). Не надо наызвать переменные var или array. Ты наверно по устаревшему учебнику учился.

Ну и этот код будет глючить от наличия = внутри значения, а от двойной кавычки он вообще сломается. Ошибка на ощибке.
#205 #397192
>>397019

> $digits = str_split($numberToString);


ну не, так не стоит делать. Для работы с числами используй математику, а не строчные функции.

Это просто, вот 2 волшебных команды:

// получить последние 3 цифры числа:
echo 1234567 % 1000; // выведет 567

// получить число миллионов
echo floor(1234678 / 1000000); // выведет 12

Комбинируя их, можно получить что угодно.
#206 #397194
>>397051

Не ругайся в треде.

>>397089

Почему именно getdate? У меня есть урок по работе с датой-временем в PHP: https://gist.github.com/codedokode/d032cc2def7c44d8c1ccможет поможет.

>>397096

То что выглядит бредово. Зачем md5? Он добавляет случайности? Нет. Намешано все в кучу.

Когда ты пишешь код, надо понимать что ты делаешь, а не лепить все подряд.

В общем, выкинуть весь этот бред и просто случайным генератором сгенерировать в цикле 12 букв.
#207 #397195
>>397138

uniqid использует время.

>>397181

> Почему mt_rand(001, 999) генерирует иногда число не из 3х цифр, а меньше?


Потому что 001 и 1 это одно и то же. Число — это количество чего-то и 001 баран это то же самое что и 1 баран.

Чтобы нули не терялись, надо использовать строки для хранения номеров. Строка хранится как набор символов и "001" и "1" это разные строки. Но естественно, передать строку в mt_rand нельзя и нельзя делать со строками математические операции (точнее можно но PHP преобразует строки в числа в этом случае).

Попробуй понять разницу между числами и строками. Это разные типы данных.
#208 #397196
>>397181

В общем, номер надо генерировать циклом по одной цифре за раз.
#209 #397200
>>397195 >>397196
Ладно, так как мне запилить генератор трёхзначных чисел?
#210 #397201
>>397200
Если число меньше 10, добавляешь перед ним 2 нуля, если меньше 100, но больше 10, добавляешь 1.
мимо нуб
#211 #397203
>>397191

>PHP/html в одном файле


И как же их не смешивать?
#212 #397205
>>397189

> $map = array(


> 'b' => 'Node_Tag_B',


> 'img' => 'Node_Tag_Img'


> );



И все равно не понял, как будут выглядеть классы и как к ним обращаться? Вообще ума не приложу.
#213 #397206
такая проблемка, использую пхпсторм, значит, пришел на работу(первый рабочий день на этой работе), стянул их сайт, у меня не отображаются комментарии на русском, ну и вообще русский шрифт, гуглил, мудрил, положил хуй.
в итоге нужно было отредактировать файл со всеми функциями сайта. ну я там поправил, сохранил. и!!! сбилась кодировка на сайте, такой ад, я чуть в штаны не наложил. Пришлось бекап делать. Как быть? на сайте кодировка WINDOWS-1251, насколько я понимаю. Как сделать её читабельной в пхпсторм? и чтобы таких историй больше не было? буду благодарен за совет
#214 #397217
Спасибо вам, аноны, я более-менее разобрался, покурил много мануалов. Сдал код заказчику, всё работает. Быдлокод пока, но потом буду изучать PHP поглубже.
>>396905-кун
#215 #397219
>>397217
Кстати, если у меня на сайте есть этот скрипт, который меняет содержимое какого-то важного файла, и находится он в site.ru/scripts/script.php, при этом директория site.ru/scripts недоступна для чтения для невладельца, то есть риск того, что какие-нибудь спам-боты таки найдут мой script.php и нафигачат туда всякой левоты, испортив файл (бекапы делаю, но всё же)?
#216 #397223
>>397203

http://www.phpinfo.su/articles/practice/shablony_v_php.html

>>397200

> В общем, номер надо генерировать циклом по одной цифре за раз.


Либо как советует достопочтенный анон >>397201 функцией str_pad

>>397205

Ты же вроде писал что ООП знаешь? Класс Node_Tag_B очевидно унаследован от Node_Tag (абстрактный класс, представляет собой любой тег), а тот унаследован от Node (абстрактный класс, представляет собой узел дерева).

У узлов главное свойство — это дети и родитель. За счет этих свойств узлы связываются в дерево. Мы вроде говорили, что в итоге лучше сделать дерево на ООП, а не на страшных вложенных массивах.

> как к ним обращаться?


В ходе парсинга ты их будешь только создавать через new ну и может будешь им детей добавлять.

Или ты про другие классы спрашивал? Уточни вопрос если что-то непонятно.
#217 #397226
>>397178

Ты ведь урок про массивы явно не читал? Зря. Узнал бы что есть $array[] = $x;
Аноним #218 #397230
>>395797

>wordpress


>>395797
wordpress не фреймворк а cms, с нее начинать нельзя.
#219 #397251
>>397206

В настройках проекта наверно задается. Поищи в их мануале слово «кодировка».
#220 #397256
Как выглядит регулярка для поиска "1 USD = 40.9620 RUB"?
В самом простом исполнении.
#221 #397265
>>397256

>1 USD = 40.9620 RUB


$regexp = '/1 USD = 40\.9620 RUB/i';

вот так как-то
или у тебя вместо этих чисел должны стоять любые другие?
#222 #397270
>>397265
Любые другие. Чтоб можно было, например, вставить евро, или юани.

Вот мой быдлокод:

http://ideone.com/UpqHS6
121 Кб, 807x538
525 Кб, 1920x1080
241 Кб, 1200x644
2203 Кб, 2560x1440
#223 #397271
>>397192
Спасибо, не хотелось конечно пользоваться подсказками, в итоге вот что родил спустя два дня ебли. Он всё еще чем-то недоволен, но я уже не знаю что ему не нравится в 45-й строке.
http://ideone.com/YjXxQl

так как я рад что справился, то победные 4 картинки
#224 #397277
>>397271
Такс, нашел новый косяк.

>14703289 - четырнадцать миллиона семьсот три тысячи двести восемьдесят девять рублей.



Утром не забыть поправить.
#225 #397278
оп, мне нужно передать параметры через страницу пользователя через яваскрипт

но эти параметры пользователь не должен видеть или изменить.

куки\сессии не вариант, так как они повлияют на другой функционал (не на то что нужно)

как это обычно делается? как-то шфруется и передаётся в виде шифрованной строки в жс переменных?
8 Кб, 200x200
#226 #397279
Вброшу и свой высер.
Допилил к изначальной идее ещё и сортировку в разные массивы.

http://ideone.com/5n8UYm

>>397178-кун
Легкое задание #227 #397285
"select from students ORDER BY id DESC LIMIT $offset, $show_pages"

Стало более понятно с пагинацией.

Осталось написать только скрипт поиска в БД и при запуске искать ошибки.

Вообще это нормально, что я ищу решения гуглом, когда не понимаю, но само решение стараюсь понять?

С пагинацией так и вышло, кстати.
#228 #397286
>>397285
Нахуй там DESK и что он значит, бля?!
Забыл спросить
#229 #397288
>>397286
сортировка по убыванию
сортируя по убыванию и устанавливая лимит ты получаешь последних по порядку пользователей (последние 30)

сортируя по возрастанию - первых (30 первых)
#230 #397289
>>397286
Деск, это парта, а пишется DESC чтобы запутать индусов. Значит что количество записей конечно.

Значит что посортирует по ид, только конечный массив записей, бесконечный не посортирует. Все просто как два пальца обосрать.
#231 #397291
>>397289

>количество записей конечно


>бесконечный не посортирует


представил бесконечную таблицу в бд и на секунду стал пхп программистом
#232 #397302
Что почитать по БД? А то я основы реляционных бд знаю, а про указатели ни словом, ни духом.
121 Кб, 1280x1024
#233 #397316
господа, влетаю в тред с тупым вопросом. начинаю знакомиться с пхп на codecademy
делаю простейшие задания на циклы
почему он ругается на хуйню на пикче?
говорит, нет скобок, но они же есть!
#235 #397319
>>397318
спасибо
#236 #397321
>>397318
сайт шлет меня нахуй.
говорит, что цикл бесконечный, неправильно всё
#237 #397322
>>397321
Разумеется он бесконечный, переменная $loopCond равна false и не меняется во время цикла, чего ты ожидал?
#238 #397323
>>397322
того, что он остановится, дойдя до while
#239 #397325
>>397323
Почему?
#240 #397328
>>397323
переменная

$loopCond = фолс

пиши строку до тех пор пока $loopCond == фолс

он пишет бесконечно, потому что $loopCond всегда фолс

что непонятного?
#241 #397329
>>397325
а хер знает. потому что я мудак?
#242 #397330
>>397329
Логично.
#243 #397331
>>397330
еще бы)
но он один хер не работает(
#244 #397332
>>397316
Кстати, задание какое-то не логичное, написано the loop ran even though loop condition is false, хотя loop condition как раз таки true, если не поменять значение переменной, или я чего-то недопонимаю?
#245 #397333
>>397332
слева от поля кода ты текст читаешь?
#246 #397334
>>397333
Слева в задании написано лишь добавить скобки и точку с запятой где нужно и цикл пройдет лишь одну итерацию, но это не так судя по коду. Либо >>397316 поменял значение переменной, прежде чем заскринить, либо там ошибка.
#247 #397335
>>397334
там что-то про $i
да поебать вообще, пусть поставит
$loopCond == тру после первого эхо и катится дальше
#248 #397336
>>397334
я не менял
#249 #397339
>>397335
Только не ==, а =. Но вообще странно, они должны были написать это в задании в таком случае.
#250 #397341
>>397335
а хуй там плыл
#251 #397342
>>397341
Не заставляй меня регистрироваться на этой параше и выяснять что к чему. Просто поставь в условии while ($loopCond == true) и скажи, что получилось.
116 Кб, 1280x1024
#252 #397343
>>397342
а нихуя не получилось
#253 #397347
>>397343
Пишет, что ты забыл скобки вокруг $loopCond, хотя они там есть.
#254 #397348
>>397347
ну вот я поэтому и пришел сюда.
они там есть.
есть, блять.
целых,сука, две.
а он говорит, что нет
#255 #397349
>>397348
Попробуй while (($loopCond) == true), лол
#256 #397350
>>397349
а я уже)
пишет "unexpected ="
101 Кб, 1158x886
138 Кб, 1652x880
#257 #397351
Короче, ты немного наебал нас, вот так изначально выглядел код (то бишь ты все таки изменил условие поставив == false) и вот каким он должен быть.
Наконец-то я могу пойти спать.
#258 #397353
>>397351
блиаааааать!
чувак, ты меня спас.
теперь сам не могу понять, какого хуя я туда наебенил фолс.
спасибо.
извините за такую хуйню, я не специально
#259 #397354
И да, твой код тоже правильный, просто условие задачи не подразумевало ставить == true
($loopCond) это тоже самое, что ($loopCond== true), просто скрипт проверяющий ответы на сайте такой ответ не принимает.
36 Кб, 429x479
#260 #397360
Опчик, если ты еще жив, сто лет те не писал, но раньше ты мне очень помог выучить язык. Хочу узнать у тебя или другого анона такую вещь: как отдавать файлы на скачивание?

Есть файл, нпр картинка .jpg, нужно на странице инициировать обычный диалог для скачивания браузером. Никак не могу нагуглить как это сделать.
#261 #397384
>>397360
Accept-Ranges: bytes хедер
#262 #397393
>>397206
Левый нижний угол глянь.
#264 #397399
>>397360

Content-Disposition: attachment
#265 #397400
>>397360

надо отдать заголовок

Content-Disposition: attachment

не пытайся использовать свойство filename так как оно не поддерживает utf-8

>>397384

Это заголовок для других целей (показывает что сервер поддерживает докачку части файла).
#266 #397402
>>397278

Никак. Все, что происходит в браузере, подконтрольно пользователю. По моему это очевидно.

Так что тебе надо поменять подход или ограничиться защитой от школьников.

>>397285

Никогда не вставляй переменные в запрос напрямую. Используй плейсхолдеры. PDO например их поддерживает.

>Вообще это нормально, что я ищу решения гуглом,


Нормально, но потом покажи код, так как в гугле много плохого и неправильного кода.

> С пагинацией так и вышло, кстати.


Это ты не знал, потому что ты не изучил возможности MySQL. На будущее, вот тут есть список вещей которые надо потом изучить: https://gist.github.com/codedokode/10539213 если хочешь нормально разбираться в базах данных. Если ты совсем ничего по ним не знаешь (а так скорее всего и есть) то прочти хотя бы

http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html (начиная с первой части)
#267 #397403
>>397302

Тут собраны ссылки https://gist.github.com/codedokode/10539213

Вот это вот http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html начиная с части 1 хорошо подходит для знакомства с MySQL
#268 #397404
>>397316

В условии надо писать == чтобы сравнивать равна ли переменная false

Если ты пишешь = то это присваивание, и в скобках всегда будет получаться false и цикл выполнится только один раз.

>>397321

Ты сам головой подумай, ты в переменную кладешь false и делаешь цикл «выполняться пока переменная равна false» — конечно он будет выполняться вечно.

>>397332

Согласен, задание запутывает. Я сам не понял, что именно там надо сделать — но мне кажется, надо добиться чтобы код в цикле выполнился ровно один раз. Например поставить false вместо условия в скобках или заменить == на !=

Также, там где-то есть ссылка на форум, наверняка другие уж заметили что с заданием что-то не так, может там написано что делать.
#269 #397405
>>397348

Он не говорит, что нет. Он говорит «может ты их забыл?». Это скорее всего стандартная фраза, вбитая туда на неправильный ответ, а суть задания как я понял только в расстановке скобок. Ты наверно код переделал а не надо было переделывать, надо было только скобки и точку с запятой расставить.

Потому видимо надо оставить в скобках неграмотный код с = вместо ==. Но только не вздумай такой код писать в реальных проектах.

Странное задание какое-то.
#270 #397406
>>397395

Ага, забавный комикс.
#271 #397420
>>397393
>>397251
я это первым делом всё сделал. как-то до пизды.
#272 #397444
Два вопроса от дебила.
Как обновиться пхп с 5.3.3 до текущей версии на дебиане?
И может ли что-то поломаться после успешного обновления?
#273 #397457
>>397444
Первое, что приходит на ум, это банальное sudo apt-get upgrade php5.
мимо-полтора-часа-опыта-работы-с-убунтой
#274 #397466
>>397444
sudo rm -rf /
Никаких проблем не возникнет.
sage #275 #397467
>>397466
неправильно пишешь, так ошибки будут
надо так
sudo su
а потом
rm -rf /
#276 #397468
>>397467
Да действительно, попробовал твоим способом, обновилось. Спасибо.
#277 #397470
>>397466

для новичков в Линуксе: команда rm -rf / пытается удалить все файлы на всех дисках, а sudo добавляется чтобы команда выполнялась от администратора (от пользователя систему снести не получится, только свои файлы и настройки, и все остается работать).
#278 #397471
>>397444

Дебиан предпочитает не самый новый софт, а надежный и протестированный годами. Обычно обновление ничего не ломает, если ты сидишь на стабильной версии. В debian 7 stable сейчас версия 5.4: https://packages.debian.org/ru/wheezy/php5

(если у тебя squeeze то надо сначала обновиться до wheezy очевидно).

Но PHP вышел уже 5.5 и 5.6. Как получить их? есть варианты.

— Можно обновиться на более новую и менее проверенную версию (jessie = testing или sid = unstable если не страшно).

В jessie https://packages.debian.org/ru/jessie/php5 стоит версия 5.6

— Можно добавить сторонний репозиторий dotdeb и взять php из него. Там http://www.dotdeb.org/2014/10/03/php-5-6-1-for-wheezy/ уже есть 5.6

— Скомпилировать из исходников и поставить в /opt или /usr/local. Это если у тебя много свободного времени и желания покрасноглазить.

Инструкции поищи, если не найдешь или ты не понимаешь что делает какая-то команда, пиши.
#279 #397473
>>397444

Обычно обновление делается как

sudo apt-get update (обновить информацию о пакетах)
sudo apt-get upgrade (обнвоить все установленные пакеты до последней версии)

В stable протестированный годами софт, потому можно смело обновляться. Обновлялка спросит тебя если что-то пойдет не так.
#280 #397501
Программирую на плюсах, но тут решил к пхп присмотреться, а конкретно к замечательным урокам. Задачка про айфон в кредит полностью фимозная. Зачем давать изначально неверный вариант задачи (я не имею ввиду, что надо новичкам дописывать и доделывать, а сам метод выбран абсолютно глупый)? Подсказка к ней тоже идиотская - зачем проверять счетчик с 5000 тысяч, если школьник выплачивает после этого эти же деньги и у него остается долг? (считал на бумаге специально). Мне пришлось полностью переделывать под нормальный алгоритм. Тут меня закидают говном, но я видимо настолько тупой, что даже не мог доделать дурацкую программу. Поэтому прошу Богов пыха кинуть мне рабочий вариант программы - именно как надо было "исправить и переделать".
#281 #397502
>>397501

Так покажи свой код. Я посмотрю.

Подсказка, по моему, правильная. Ты выплачиваешь каждый месяц деньги и начисляешь проценты, пока не дойдешь до нуля, вот и весь алгоритм.
#282 #397503
>>397501

Это сложная задача, на ней все запинаются обычно.
#283 #397506
>>397501
Я тоже очень наебался с этой задачей. 2 дня пытался решить, не отрываясь. Потом ещё 3 месяца не мог ничего учить.
#284 #397512
>>397501
И круто ты кодишь на крестах?
sage #285 #397518
>>397501

> Программирую на плюсах


AHHAHHAHAHAA.jpg

>>397503
Дауны должны страдать, они для этого родились.

http://ideone.com/011Zde
sage #288 #397523
>>397522

>итерация


глав-пхтух, ето ти?
#289 #397525
sage #290 #397531
>>397523
Без итерации на крестах в >>397518, сасай :3
sage #291 #397533
>>397531
клёво
малац)
#292 #397547
Оп, а подскажи. есть один код, который шлет письмо пользователю
$subject = "ошибка от $error_date на сайте исправлена";
\t
\t
$headers = 'Content-type: text/html; charset=utf-8' . "\r\n";\t
\t
$message = "
\t<html>
<head>
<title>Исправлена ошибка на сайте</title>
</head>
<body>
\t<b><p>
\tУважаемый <? echo $user_name; ?> ,
Спасибо за Ваше замечание относительно работы сайта и т.д

\t</p></b>
\t</body>
</html>";

\tmail($user_mail, $subject, $message, $headers); // тут отправляется
но почему-то я не могу вставить в хтмл разметку письма переменную, хотя делаю всё как обычно. Тут нужно как-то её особо экранировать, потому что она как бы пхп в хтмл,а в этом хтмл пхп?
632 Кб, 900x1200
Воннаби #293 #397560
http://ideone.com/Log5qh

Котаны, пишу стековый калькулятор, для познания ООП. Вот описал первый класс, который отвечает как бы за тело стека, всё норм. Как дальше подойти и что делать не знаю. Пусть будет второй класс отвечающий уже за операции и всё такое, но как их подружить и сделать взаимодействовать я пока не понимаю.
#294 #397564
>>397547

Почитай внимательно http://php.net/manual/ru/language.basic-syntax.phpmode.php для начала
#295 #397566
>>397560

У тебя довольно так и бессмысленный код. Методы разбросаны наугад без всякой логики. В чем например смыл этого метода: createStack() если он никак не взаимодействует с классом Calc?

В pop() логичнее выбрасывать исключение при пустом стеке.

Также, в PHP уже есть стек: http://php.net/manual/ru/class.splstack.php

Ты изобретаешь велоипед. И если ты хочешь освоить ООП, ты выбрал не лучший пример, так как стековый калькулятор проще сделать в виде одного класса СтековыйКалькулятор (с методами положитьНаСтекЧисло(), выполнитьОперацию(), и тд). В акчестве стека можно использовать массив или SplStack.

Если ты хочешь хороший пример, то лучше написать полноценный парсер математических выражений вида

2 + 4 sin(1.3)

в дерево (AST) и его вычисление затем. Тут тебе понадобится больше классов: Токенайзер, Парсер, классы для узлов дерева (Число, Сумма, Синус и тд).
Воннаби #296 #397568
>>397566

>У тебя довольно так и бессмысленный код. Методы разбросаны наугад без всякой логики. В чем например смыл этого метода: createStack() если он никак не взаимодействует с классом Calc?


Это я "эксперементирую", что бы понять как это сделать правильно.

>В pop() логичнее выбрасывать исключение при пустом стеке.


Я не понял твое высказывание, разжуй пожалуйста.

>


Ты изобретаешь велоипед. И если ты хочешь освоить ООП, ты выбрал не лучший пример, так как стековый калькулятор проще сделать в виде одного класса СтековыйКалькулятор (с методами положитьНаСтекЧисло(), выполнитьОперацию(), и тд). В акчестве стека можно использовать массив или SplStack.
Я и делал сначала всё это дело 1 классом, но потом опытный товарищь сказал что тут должно быть их много. И в классе отвечающем за тело только поп, пуш и проверка.

>Если ты хочешь хороший пример, то лучше написать полноценный парсер математических выражений вида



>2 + 4 sin(1.3)



>в дерево (AST) и его вычисление затем. Тут тебе понадобится больше классов: Токенайзер, Парсер, классы для узлов дерева (Число, Сумма, Синус и тд).


Обязательно займусь, но сначала хочется решить задачу попроще. Бросать то что я делаю и делать другое? Спасибо за ответ.
#297 #397570
>>397568

Ты возвращаешь null если стек пустой в pop(). А логичнее выбрасывать исключение: http://php.net/manual/ru/language.exceptions.php

Подробнее про исключения написано у Зандстры и Шлосснейгла (названия книг в Оп-посте).
#298 #397571
>>397568

> хочется решить задачу попроще.


Тогда делай то, что ты сейчас делаешь.
#299 #397580
Бля, apt-get install apache2 mysql phpmyadmin вот вам и веб сервер
#301 #397602
>>397580
А где, собственно php5?
#302 #397613
Прошу помочь с проблемами новичка. Я ебусь с ними уже 2е сутки, и ничего не могу понять. Сначала установил мускуль, как написано в документации. Вроде бы все работает, localhost:3333 отвечает(задал в инстолере), но при попытке запустить mysql.exe вылетает "can't connect to server". На оф. сайте написано, что проблема в том, что не запущен сервер. Вообще охуеть.
Это еще хуй с ним, мне необходимо настроить работу с пхп. Попробовал mysqli и pdo, но и то, и другое выдавало fatal error. Почти все туториалы начинаются со слов "предполагая, что вы все установили и все работает, ...", гугл вообще какую-то хуиту выдает, в стэковерфлоу написан миллион вариантов, но ни один не работает. В оф.документации сказано только как работать в интерактивном режиме, но он и не запускается даже. Прошу кого-нибудь растолковать все по пунктам, что куда нужно писать и тыкать, чтобы уже можно было начать работу с мускулем.
#303 #397614
>>397602
В линуксах, вроде, сразу есть рнр.

сидел на линуксе полтора дня
#304 #397626
>>397613

Если ты настроил сервер слушать на нестандартном порту 3333 (стандартный для MySQL = 3128) то при соединении клиенту надо указать этот же порт:

mysql.exe --port=3333

Или же надо в файле конфига my.ini в разделе [client] вписать опцию номера порта (наверно достаточно написать port=3333 но я не уверен).

Список доступных опций можно увидеть, набрав

mysql.exe --help

или открыв мануал: http://dev.mysql.com/doc/refman/5.6/en/mysql-command-options.html

Заметь, что файл my.ini используется и клиентом и сервером, и разделен на секции. Часть настроек соответственно будет прочитана только клиентом, а часть только сервером.
!ОП #305 #397632
>>397613

> Попробовал mysqli и pdo, но и то, и другое выдавало fatal error.


А текст ошибки? Тот же? Так при соединеии ты тоже должен указать номер порта. Как он его угадает, ты думашь PHP твои мысли умеет читать?

Надо в DSN (что такое DSN? это строка с адресом к которому должен подсоединиться PDO) дописать порт и там для этого есть опция:

http://php.net/manual/ru/pdo.construct.php
http://php.net/manual/ru/ref.pdo-mysql.connection.php

Если бы ты изучал сетевые технологии и сокеты, тебе бы было это все очевидно. Зря в большинстве уроков и учебников их пропускают.

Ах да, что такое номер порта. Это число от 1 до 65535. На компьютере может быть запущено несколько программ, которые принимают соединения. При этом каждая программа должна открыть свой порт с уникальным номером, чтобы было понятно, какой из них предназанчены данные. И если ты хочешь соединиться с такой программой-сервером, ты должен указать номер порта (и имя хоста или IP-адрес если сервер расположен на другом компьютере). Wiki: https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%80%D1%82_(%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8)

Увидеть список открытых портов на твоем компьютере можно командой netstat -anb

И конечно порт по умолчанию MySQL = 3306, я ошибся.
#306 #397633
>>397614

В дебиане нет.
#307 #397639
>>397598

Неплохо, но есть косяки.

http://ideone.com/yrvmhV

Что за дебилы составляли спам лист?
#308 #397650
>>397626
Благодарю, если запускать через --port=3333, то интерактивный режим запускается. Но у меня нет файла my.ini, там только my-default.ini, и раздела [client] там нет, только [mysqld]. Там тоже можно прописать port=3333, но это не работает.
#309 #397651
>>397632

>Если бы ты изучал сетевые технологии и сокеты, тебе бы было это все очевидно


Изучал и знаю, даже сделал чатик на сокетах на питоне.

>текст ошибки


Было просто "fatal error in D:\...\...php on line 9" но потом я что-то интуитивно потыкал, теперь фатал еррор исчез. Пока попробую еще погуглить немного, за помощь спасибо. И да, порт я прописывал.

Вот код программы, спижженный с стэковерфлоу http://pastebin.com/Q8p9uSpM

Оно выдает "Подключение не удалось: invalid data source name"
Если еще поможешь с этим, было бы замечательно.
#310 #397663
Еще, если можно, подскажите, как запускать мускуль-сервер. Он уже установлен, но когда тыкаешь в notifier тыкаешь start, выскакивает "The service mysql was not found in windows services". Гугел опять нихуя не находит.
#312 #397667
>>397664
У меня последнее предложение специально было написано, чтобы гугл не предлагали.
Но уже похуй.
В общем, я все переустановил все по новой со стандартными данными, теперь все отлично работает.
31 Кб, 484x643
21 Кб, 1101x389
10 Кб, 200x200
#313 #397668
Задача про стихи.

Как было, и как стало.

Код с первой пикчи я написал 2 дня назад. Только что переписал.

Алсо, чому оно розовым подсвечивает?
39 Кб, 422x530
#314 #397671
>>397668
Скоро printf осилишь.
#315 #397704
>>397651

PDO использует такой формат DSN (тут явно это не описано, но все равно почитай):

http://php.net/manual/ru/pdo.connections.php
http://php.net/manual/ru/ref.pdo-mysql.connection.php

То есть должно быть что-то вроде

mysql:param1=value1;param2=value2;param3=value3

Какие параметры можно указать, написано по ссылке выше.

А теперь сделай var_dump("mysql:host=$host") в своем коде и посмотри что выведет. Он не соответствует требуемому формату.

Кстати, имя базы данных надо указывать тоже в DSN.

И кстати, try/catch писать не надо. Это какой-то неграмотный код. Исключение и так по умолчанию завершает программу и выводится на экран, если у тебя не отключено отображание ошбок (отключено? Включи display_errors = On в php.ini).
#316 #397705
>>397663

> Он уже установлен, но когда тыкаешь в notifier тыкаешь start, выскакивает "The service mysql was not found in windows services"


Ты неправильно что-то установил, например выбрал опцию «установить только для меня» и из-за этого установщик не создал службу mysql (службы в windows — это программы, которые выполняются в фоновом режиме и могут автоматически запускаться после загрузки. Увидеть их список можно, сделав Пуск -> Выполнить -> services.msc ).
#317 #397708
>>397668

> розовым подсвечивает


Намекает что код сомнительный и лучше бы это место переписать.

Второй код, который компактнее, хороший, только внутри строки все же наверно не стоит такие сложные конструкции городить, а стоило сделать через переменные:

$word1 = $words1[array_rand...;
echo "$word1 $word2 $word3\n";
#318 #397709
>>397671

Проще наверно переменные вставлять в строку, хотя конечно сложные выражения может и через printf проще писать. Но мне он не нравится тем ,что с utf-8 не работает (выравнивание например так как он считает байты, а не символы).
#319 #397756
ананасы, прошу помощи. Подскажите рабочий код. Суть в том, что есть поле в БД типа count, каждый месяц это поле должно умножаться на 0,1 автоматически.
1965 Кб, 316x244
#320 #397768
http://ideone.com/yiHR7A
Что с этим можно сделать?(задача на классы)
#321 #397769
>>397756
ну запусти крон-задачу и пускай каждый месяц она умножает
#322 #397770
>>397769
crontab не хотелось бы использовать, есть варианты кода?
#323 #397771
>>397770
ну ты сам подумай, какой-то скрипт должен будет вызываться, при каком событии? логично же, через крон, раз в месяц?
#324 #397774
>>397564
я делаю всё как там написано. в чем дело?
#325 #397775
>>397774
<? echo $user_name; ?> чо за хуйня? ты и так в пхп, пиши просто $user_name
1 Кб, 301x54
#326 #397777
>>397775
ок, спасибо.
#327 #397778
>>397775
короче не работает. я и раньше так пробовал.
#328 #397779
>>397775
а не, сорьки. нужно было " вместо ' просто.
внатуре спасибки.
#329 #397781
>>397779
так у тебя там и так двойные же?
#330 #397783
>>397781
та были двойные, я потом пробовал по разному, одинарные поставил.
#331 #397784
>>397783
на заебись, вся суть двойных в том что переменные там распознаются
109 Кб, 568x559
#332 #397787
>>397783
мотивации чуток
#333 #397793
>>397771
немного подробностей
на хостинге крутится сайтик, движок wordpress, плагин buddypress. Создал кастомное поле в этом плагине, теперь это кастомное поле должно расти раз в месяц на 10%, т.е. 0,1.
Это поле выводится в "Личном кабинете", хотелось бы там и организовать пересчет.
#334 #397799
>>397787
Но они реально быстрее.
100 Кб, 388x399
#335 #397805
Дошёл до игры в кубики, поймал себя на том, что я ни слова не понимаю из того, что я читаю. Заплакал.
489 Кб, 1280x709
#336 #397818
>>397805
Всё в порядке. Я тоже сказочный слоупок, в начале лета начал учить пых, сейчас дошел до регулярных выражений, осваиваю, вот. Учу потом и кровью, страдаю, превозмогаю.
#337 #397819
>>395787
а подскажите.
я использую функцию mail, как мне задать адрес отправителя? или это где-то на хостинге?
289 Кб, 680x680
#338 #397828
>>397818
>>397805
Это хуйня. Пхп еще нормальный язык. Я вот, сейчас, параллельно по ЖС почитываю - вот это днище. Пригорает постоянно. Вчера, вот, вычитал, что свойство length - это не то, что ты думаешь для массива, а ключ последнего элемента - 1. Ну что это за пиздец? Я не дохуя кодер, но у меня этот ваш жабаскрипт уже вызывает тысячи ненависти. У меня уже такое устойчивое ощущение создалось, что везде, в каждой функции, можно обосраться и отстрелить себе пол-туловища. "Там используй, а там не используй". Охуеть. Чтобы сделать то, что в пыхе требует всего лишь стандартной функции, тут требует построение уродливого велосипеда из говна и палок. Извращения, блядь какие-то. Ебанул delete - остались запятые. Какого хуя? Запятые - это что, элемент объекта, блядь? Да-да, я знаю, что нужно использовать другую функцию...
Для йоба-гуру джаваскрипта мой пост, может, и выглядит бугуртом неосилятора, но у меня такое ощущение, что js какой-то... недоделанный что-ли.
ОП, насколько я прав и что не так?
#339 #397837
>>397828

>Для йоба-гуру джаваскрипта мой пост, может, и выглядит бугуртом неосилятора


Да, так и есть, ты школьник который начитался в интернете всякого шлака, нихуя не понял, а теперь бугуртишь.
И да, у меня бугурт от таких даунов.

Но все знают, что ты просто зелёный и очень толстый
#340 #397838
>>397828
1) Любой код проверяй в jslint.
2) Почитай javascript the good parts, там автор объясняет, что жс был сделан в спешке и поэтому там дохуя ошибок дизайна. Книга посвящена частям жс, которые можно использовать, не опасаясь выстрелить себе в ногу.
3) javascript design patterns тоже вроде норм.
4) Чистый жс мало кто использует, обычно используют jquery, а в ней очень много удобств.
5) Можно использовать языки, которые транслируются в жс. Например, кофескрипт имеет синтаксис в стиле руби. Для всех популярных языков такое есть, даже для хаскеля есть purescript или че-то типа того.
#341 #397843
>>397818
Нахуй вы хуйней занимаетесь, пиздуйте сразу клепать сайтики, то что вы делаете не поможет вам в работе, лучше потратить время на изучение какого нибудь фреймворка, будет больше пользы.
#342 #397863
>>397189
Нихрена не понял опять. Вот я сделал методы getNextToken($expectedType), getCurrentTokenType(), еще сделаю, если надо что будет. Начинаю делать парсер. Пишу:
$parsedText = [];
while ($token = getNextToken(array(TOKEN_WHITESPACE, TOKEN_CLOSE_TAG, TOKEN_CLOSE_BRACKET, TOKEN_STRING))) consumePlainText($parsedText, $token);
А дальше снова надо проверять, если сингл таг, то парсировать сингл, если парный - парный и т.п. Теже if или switch, или это норм? А зачем для каждого тега свой класс я хоть убей не могу понять, что них прописывать, какие свойства, какие методы, если от них нужно только название для валидации. Типо парные теги: "1, 2, 3", сингл теги: "6, 5, 4". ЧТО МНЕ С ЭТИМИ КЛАССАМИ ДЕЛАТЬ?
#343 #397905
>>397863

Что за дебилы делали спам-лист на этом сайте. Вот ответ: http://ideone.com/L8JqiH
#344 #397907
>>397863

>А дальше снова надо проверять, если сингл таг, то парсировать сингл, если парный - парный и т.п. Теже if или switch, или это норм?


Я не очень понял, но мне кажется нет. То есть там будет где-то if или switch но не надо все помещать в одну огромную функцию.

> А зачем для каждого тега свой класс я хоть убей не могу понять


У тегов разные свойства, разный набор аттрибутов, они генерируют разный HTML-код. Логично по моему сделать для них разные классы по этой причине. Также потом могут добавиться условия типа тег A можно размещать только внутри тега B. как ты это будешь делать без классов? Лапшой из кучи ифов?
#345 #397914
#346 #397916
>>397783

Надо мануал читать, а не наугад пробовать: http://php.net/manual/ru/language.types.string.php

>>397793

Ну организуй через кнопку в личном кабинете, в чем проблема?

>>397799

На сколько? Померяй для начала. А потом подумай, сколько времени теряет человек из-за более трудночитаемого кода из точек и кавычек. И сколько времени на исправление случайно забытой точки или кавычки.

Потому таких микрооптимизаторов надо гнать из профессии.
#347 #397917
>>397805

Если конкретная вещь непонятна, то можешь задать вопрос. Ну или можешь завтра попробовать еще раз перечитать, может понятнее станет.

>>397819

http://php.net/manual/ru/function.mail.php c помощью additional_headers. Чтобы понять, как задаются заголовки, почитай например https://ru.wikipedia.org/wiki/%D0%AD%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D1%87%D1%82%D0%B0#.D0.A1.D1.82.D1.80.D1.83.D0.BA.D1.82.D1.83.D1.80.D0.B0_.D0.BF.D0.B8.D1.81.D1.8C.D0.BC.D0.B0

Как я понимаю, там надо указывать их в формате

заголовок: значение\r\nзаголовк2: значение2
#348 #397919
>>397828

> что свойство length - это не то, что ты думаешь для массива


Потому, что массивы бывают разные. Если ты изучал PHP то там массивом называют упорядоченный ассоциативный массив, то есть массив в котором могут быть любые ключи и элеменыт могут идти в любом порядке. Но бывают в других языках и «настоящие» массивы или «векторы».

Это числовые массивы, где ключом может быть только число от 0 до N, пропускать ключи нельзя и они всегда идут по порядку (например, 0, 1, 2, 3, 4 ... N).

В JS как раз 2 вида массивов — это ассоциативный массив (или словарь), который создается через {} и вектор, который создается через []. В отличие от PHP, он неупорядочен то есть порядок элементов при переборе в нем случаен и не определен.

Если ты добавляешь в настоящий вектор элемент с ключом 1000, то создаются и элементы 0 ... 999. Потому length равно 1001. В JS тут чуть хитрее: length увеличивается, но элементы не создаются автоматически. Такие массивы с отстустсвющими элеиментами — источник проблем и ошибок, потому делать их не стоит.

Так как в векторе по задумке ключи идут строго по возрастанию, то свойство length работает корректно.

Заметь, что в яваскриптовый вектор можно добавлять в том числе текстовые ключи. Это потому что он основан на словаре. Но такие ключи не меняют свойство length.

В общем, надо знать как устроены эти структуры и проблем не будет.
#349 #397920
>>397828

Уточню:

> В отличие от PHP, он неупорядочен то есть порядок элементов при переборе в нем случаен и не определен.



Это в словаре. В массиве-векторе как раз все упорядочено.

> Ебанул delete - остались запятые. Какого хуя? Запятые - это что, элемент объекта, блядь?


Это ошибки в твоем коде какие-то.

> ОП, насколько я прав и что не так?


В JS есть конечно и недостатки, но все то, что ты перечислил это лишь твое незнание. Читай статьи, учебники и исправляйся.

Могу предложить вот такой сборник задачек например: https://gist.github.com/codedokode/ce30e7a036f18f416ae0 — задачи выглядят простыми но без понимания как работает JS их не решить.
#350 #397921
>>397837

Не ругайся в треде для начинающих.

>>397838

Я бы советовал jshint, он поновее и у него всяких опций больше.

> Чистый жс мало кто использует, обычно используют jquery, а в ней очень много удобств.


jQuery — DOM библиотека и используется лишь для взаимодейcтвия с этим DOM, а не для всего подряд.

> Например, кофескрипт имеет синтаксис в стиле руби.


Ничего кроме отступов и доветочий (+ синтаксис для классов) он не приносит. По моему, это плохая вещь, так как реальная причина — желание чтобы код выглядел как Руби. А это напоминает нездоровый фанатизм.

Мне например он не нравится и кажется плохо читаемым, особенно плохо смотрится стрелочка -> которая обозначает сразу несколько вещей.
#351 #397922
>>397843

Нет. Иди сам клепай.
#352 #397942
Ворвусь с задачкой по SQL про лайки.
Таблицы две: users (поля id и name) и likes (поля like1 для того, кто лайкнул, и like 2 для того, кого лайкнули).
Запрос:
SELECT DISTINCT
users.id as cur_id,
users.name,
(SELECT COUNT() FROM likes WHERE like1=cur_id) AS "Поставил лайков: ",
(SELECT COUNT(
) FROM likes WHERE like2=cur_id) AS "Получил лайков: ",
(SELECT COUNT() FROM likes WHERE (like1=cur_id) AND (like2 IN (SELECT like1 FROM likes WHERE like2=cur_id))) AS "Взаимных лайков: "
FROM users, likes
ORDER BY cur_id
#353 #397946
>>397828
Меня тоже жабаскрипт раздражает, знаю его совсем чуть-чуть, начинал учить, но бросил нахуй. Сейчас для задания понадобился ангуляр - создалось впечатление, что годен только для отдельных задач, которые красочно показаны в их примерах. Попытался ебануть регу к рест сервису - охуел с того, какой велосипед делается, и какие скудные у ангуляра доки.

Мимо-джавакодер
#354 #397966
>>397942
не увидел вопроса, просто дам добрый совет. Заведи себе отдельную табличку likeSosike с полями id, "лайков поставил", "лайков получил", "взаимных лайков". Заполни и потом пусть она периодически пополняется новыми пользователями и для старых обновляется количество (раз в пять минут, например, можешь чаще, можешь реже). Соответственно и получай нужные данные оттуда, а не подсчитывая все лайки каждый раз, как пользователь захочет статистику получить.
Да, пользователи не смогут моментально вздрочнуть на новые лайки, но и сервер тебе запросами к таблице лайков не положат.
#355 #397971
>>397907
А, ты предлагаешь вместо дерева в виде массива которое я сделал в первый раз, сделать дерево в виде классов? И чтобы все узлы были отдельными объектами абстрактных классов своего типа?
#356 #397984
>>397905

> Нам надо сделать на каждую конструкцию выше свою функцию для разбора.


Ну т.е. все равно нужнен общий метод, который будет определять какой токен. Только ты предлагаешь даже не просто определять какой токен (и, например, если это открывающий тег, запустить функцию парсинга тега, которая будет искать закрывающий, и если найдет, поглотит, если нет, примет токен за текст и запустит поглощение токена как текст), А определять целые конструкции. С методами getNextToken(), getTokenType() и т.п. не представляю как это адекватно сделать. Надо будет читать следующие токены, а предыдущие оставлять в какой-то кэш, и если найду закрывающий запускать парсер тегов, если нет поглотить токены из кэша как текст. Это уже совсем на костыли похоже. Понятно, что ты не это имел ввиду. Что-то у меня с думалкой беда совсем.
#357 #397986
>>397966

>Да, пользователи не смогут моментально вздрочнуть на новые лайки, но и сервер тебе запросами к таблице лайков не положат.


Так то оно так, но задача же была составить запрос и вывести. Учебная же задача, а не практическая.
#358 #397990
>>397986
не увидел, что задача учебная. И условия задачи тоже не видел, тред не читал.
Даже в таком случае, во FROM users, likes - likes лишнее, сооответственно и DISTINCT можно убрать.
#359 #397993
>>397990

> во FROM users, likes - likes лишнее


Почему? Я не понимаю.
#360 #397999
>>397993
потому что вся информация о лайках достаётся с помощью коррелирующих подзапросов.
#361 #398000
>>397999
Т.е. в from мы пишем лишь то, что в основном запросе, а то, что в подзапросах - итогового from не касается, так?
#362 #398005
Подумал я тут давеча, лох что ли, пользоваться всякими готовенькими MAMP. Настоящие кодеры ставят все руками. В итоге после целого дня консольной ебли понял, что я ебаное дно. Поставил MAMP обратно.
#363 #398008
>>398005

>В итоге после целого дня консольной ебли понял, что я ебаное дно.


Я просто поставил на второй комп убунту, прописал три команды и все работает. Но зачем - не понял. Юзаю xampp.
#364 #398013
>>398000
В общем, смотри, как это примерно происходит
1. происходит cross join таблиц users и likes - при этом, поскольку нет никаких where, у тебя будет просто дохуиллион абсолютно бессмысленных строк, где id из users будут соответствовать id1 и id2 из likes, не имеющие к нему никакого отношения.
2. Для каждой строки из п.1 будет выполнено по три запроса к таблице likes (твои подзапросы), причём для каждой строки с одинаковым users.id эти значения будут одинаковыми (не важно какие там id1 и id2 в этом наборе).
3. DISTINCT приведёт всё это безобразие к нормальному виду, выкинет лишние строки.

т.е. есть у тебя таблицы
users (id | name):
1 | u1
2 | u2
3 | u3

likes (id1|id2):
1 | 2
1 | 2
2 | 1

в п.1 сервер собирает следующий набор:
users.id| users.name| likes.id1| likes.id2

1|u1|1|2
1|u1|1|2
1|u1|2|1
2|u2|1|2
2|u2|1|2
2|u2|2|1
3|u3|1|2
3|u3|1|2
3|u3|2|1

вот это то, что называется cross join - перекрёстное соединение - всё со всем

потом п.2, с помощью подзапросов получаются "итоги"

users.id| users.name| likes.id1| likes.id2| moi| menya| vzaim

1|u1|1|2|2|1|1
1|u1|1|2|2|1|1
1|u1|2|1|2|1|1
2|u2|1|2|1|2|1
2|u2|1|2|1|2|1
2|u2|2|1|1|2|1
3|u3|1|2|NULL|NULL|NULL
3|u3|1|2|NULL|NULL|NULL
3|u3|2|1|NULL|NULL|NULL

и потом distinct убирает дубли (id1 и id2 я сюда добавлял для наглядности, на самом деле их нет и distinct будет ужимать вот такое:
1|u1|2|1|1
1|u1|2|1|1
1|u1|2|1|1
2|u2|1|2|1
2|u2|1|2|1
2|u2|1|2|1
3|u3|NULL|NULL|NULL
3|u3|NULL|NULL|NULL
3|u3|NULL|NULL|NULL
), в итоге получишь:

1|u1|2|1|1
2|u2|1|2|1
3|u3|NULL|NULL|NULL

Тоже самое гораздо лучше будет получить, просто из таблицы users и подзапросов.
#364 #398013
>>398000
В общем, смотри, как это примерно происходит
1. происходит cross join таблиц users и likes - при этом, поскольку нет никаких where, у тебя будет просто дохуиллион абсолютно бессмысленных строк, где id из users будут соответствовать id1 и id2 из likes, не имеющие к нему никакого отношения.
2. Для каждой строки из п.1 будет выполнено по три запроса к таблице likes (твои подзапросы), причём для каждой строки с одинаковым users.id эти значения будут одинаковыми (не важно какие там id1 и id2 в этом наборе).
3. DISTINCT приведёт всё это безобразие к нормальному виду, выкинет лишние строки.

т.е. есть у тебя таблицы
users (id | name):
1 | u1
2 | u2
3 | u3

likes (id1|id2):
1 | 2
1 | 2
2 | 1

в п.1 сервер собирает следующий набор:
users.id| users.name| likes.id1| likes.id2

1|u1|1|2
1|u1|1|2
1|u1|2|1
2|u2|1|2
2|u2|1|2
2|u2|2|1
3|u3|1|2
3|u3|1|2
3|u3|2|1

вот это то, что называется cross join - перекрёстное соединение - всё со всем

потом п.2, с помощью подзапросов получаются "итоги"

users.id| users.name| likes.id1| likes.id2| moi| menya| vzaim

1|u1|1|2|2|1|1
1|u1|1|2|2|1|1
1|u1|2|1|2|1|1
2|u2|1|2|1|2|1
2|u2|1|2|1|2|1
2|u2|2|1|1|2|1
3|u3|1|2|NULL|NULL|NULL
3|u3|1|2|NULL|NULL|NULL
3|u3|2|1|NULL|NULL|NULL

и потом distinct убирает дубли (id1 и id2 я сюда добавлял для наглядности, на самом деле их нет и distinct будет ужимать вот такое:
1|u1|2|1|1
1|u1|2|1|1
1|u1|2|1|1
2|u2|1|2|1
2|u2|1|2|1
2|u2|1|2|1
3|u3|NULL|NULL|NULL
3|u3|NULL|NULL|NULL
3|u3|NULL|NULL|NULL
), в итоге получишь:

1|u1|2|1|1
2|u2|1|2|1
3|u3|NULL|NULL|NULL

Тоже самое гораздо лучше будет получить, просто из таблицы users и подзапросов.
#365 #398015
>>397639

>> if (x === 0 || x === (this.width + 1) || y === 0 || y == (this.height + 1)) {



>Не понимаю, зачем так сложно делать? Зачем лишние ячейки? Костыли какие-то? Тогда лучше сделать правильно.



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

А открытие соседних клеточек, если они пустые делать через рекурсию?
#366 #398018
>>398015

>В итоге после целого дня консольной ебли понял, что я ебаное дно.


Да. Есть функция открытия клетки, если в открытой клетке нет бомб и число бомб рядом = 0, то вызываешь эту же функцию для всех клеток вокруг текущей.
#367 #398019
>>398013
Короче я все сделал верно, только вот тот самый кросс джойн оказался ни к селу, ни к городу. Я подозревал что-то такое, когда дописывал distinct.
#368 #398021
Поцоны, очень нужна ваша помощь. Дайте книжку по последнему php чтобы покороче была и не шопопало. Литературы куча по PHP, но анон, наверняка, знает какая лучшая. По работе нужно, поэтому времени вникать много нету.
Знаю python немного.
#369 #398060
>>397942

Код лучше всего постить на sqlfiddle: слева пишешь CREATE TABLE/INSERT, справа SELECT и видишь результат табличкой.

А то так я не видя sql-кода не могу проверить правильно ли ты спроектировал таблицы.

Твой пример с вложенными подзапросами неэффективный: MySQL будет обходить построчно объединенную таблицу users, likes (а в ней будет N x M строк, так как по умолчанию таблицы объединяются декратовым произведением) и для каждой строчки делать подзапросы. То есть будут сотни или тысячи подзапросов.

В случае с взаимными лайками еще хуже: он выбирает все строки из likes и для каждой делает подзапрос. И все это повторяется много раз.

В общем, ошибки:

> FROM users, likes


Зачем перечислять тут 2 таблицы? Ты понимаешь, что делаешь?

Вместо подзапросов (тем более двойной вложенности) надо джойнить.

Руссукие алиасы не стоит делать, это лишнее по моему.
#370 #398062
>>397946

> знаю его совсем чуть-чуть, начинал учить, но бросил


> Попытался ебануть регу к рест сервису - охуел с того, какой велосипед делается, и какие скудные у ангуляра доки.


Тебе не кажется что главная проблема в слабых знаниях? Так как ты можешь сделать только то, что описано в примерах, а сам что-то нестандартное написать не можешь.

Аноны, хочу сказать, что я крайне негативно к таким вещам отношусь. Людям лень угулбляться, решать например мои задачки с подвохами, они кое-как освоят основы, потом идут на работу и быдлокодят, а потом кому-то в их коде копаться придется. Я это не ободряю. Не понимаешь яваскрипта — иди учись, а не работай.
#371 #398064
>>398062
Это ты о других думаешь. Тебе вот доставляет помогать куче дегенератов, типа меня. А остальным похер на других. Учиться, а не работать? Но ведь на работе деньги платят, и похер что быдлокод. И похер что оп треда этого не одобряет.
#372 #398068
>>397966

Совет — это хорошо, мы рады когда кто-то помогает советами, но ты должен учить правильному, а не неправильному.

Ты предлагаешь сделать денормализацию ради оптимизаций — но где в задаче что-то сказано про оптимизацию? Это задача для начинающих на изучение джойнов и группировок и они сначала должны полностью научиться ими пользоваться, а потом думать про оптимизацию, а не наоборот.

И даже в случае с кешем все равно таблица пользователей и лайков нужна.

Потому твой совет скорее собъет с толку. Надо было сначала написать про нормализацию и джойны, потом добавить что ради оптимизации делается кеш, хранящий вычисленные данные.

А не делать советы, без объяснений (про нормализацию и кеш).

> и для старых обновляется количество (раз в пять минут, например, можешь чаще, можешь реже)


Если у нас много пользователей и лайков, это неэффективно. Они же со временем только копиться будут.

Я не знаю точно, как сделано в том же контакте, но думаю, что цифру в кеше они увеличивают сразу, а не по таймеру.
#373 #398071
>>398021
PHP Cookbook наверно.
#374 #398072
>>397971

> отдельными объектами абстрактных классов


Нельзя создать объект абстрактного класса. Абстрактный класс это как раз класс, не предназначенный для создания объектов, а как основа для наследования.

> сделать дерево в виде классов?


Конечно, дерево в виде объектов. Я уже не первый раз рассказываю, чем объекты лучше массивов:

— массивы — это бардак так как нигде не определены какие в них могут быть элементы, а какие нет. Используя массивы. ты приходишь вот к такому аду: https://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7 (в Друпале формы описываются огромными валоженными сложными массивами, в которых невозможно разобраться без мануала)

— у массивов нет классов. Глядя на массив ты не можешь сказать точно что он хранит, а имея объект ты всегда можешь проверить какого он класса
— у массивов нет методов
— у массивов нет инкапсуляции, то есть приватных свойств
— у массивов нет наследования

Это нездоровое увлечение хранением всего в массивах сложной структуры — антипаттерн и имеет название «массив-ориентированное программирование»: http://www.epixa.com/2012/04/array-oriented-programming.html

И в чем сложность? Тебе всего-то надо создать несколько классов.
#375 #398073
>>398072

> Конечно, дерево в виде объектов. Я уже не первый раз рассказываю, чем объекты лучше массивов:


До меня только дошло. Я не очень умный.
#376 #398074
>>397984

А, ты про определение конструкций, начинающихся с [ , но не тегов? Ты бы мог сначала сделать без этого (то есть если идет код вида [??? то парсер выбрасывает исключение и останавливается).

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

Если это сложно, сделай первую версию без этого, потом прикрутим.
#377 #398076
>>397993

А ты понимаешь, как работает FROM users, likes? Что выведется если сделать SELECT FROM user, likes?

Это читал? Тут описано. http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html

>>397999

Тут лучше без подзапросов так как они крайне неэффективны и плохо смотрятся. Джойны и группировки тут нужны.

>>398000

Ты не понимаешь, как работает селект. Он работает примерно так. Допустим есть запрос:

SELECT fields FROM tables WHERE cond GROUP BY group ORDER BY order HAVING having LIMIT limit

(некоторые части не обязательны).

Сначала берется список таблиц tables. Это может быть одна таблица, несколько таблиц или несколько таблиц связанных джойнами. Если таблиц несколько, то они объядиняются, обычно по принципу «перебираем все комбинации строчек» то есть если указаны 2 таблицы по 20 строк то поулчается объединенная таблица на 400 строк.

Затем записи отсеиваются по условию cond

Затем группируются (несколько строчек объединяются в одну) по условию group . Если условие group не указано, но ты использовал в fields аггрегатные функции вроде COUTN() или SUM() то все записи группируются в одну.

Затем группированные записи отсеиваются по условию having

Затем сортируются

Затем берется часть результата, соответствующая ограничению limit, а из нее поля fields. На этом же этапе делаются подзапросы в SELECT (для каждой строчки результата — отдельный подзапрос, естественно).

То, что получилось и возвращается как результат.

Чтобы запомнить, вот порядок действий: FROM+JOIN, WHERE, GROUP, HAVING, ORDER, LIMIT, SELECT. Его ты (и все остальные аноны) должны знать наизусть.

Таким образом если ты не делаешь выборку полей из likes и не используешь эти поля в условиях, то не надо ее указывать.
#377 #398076
>>397993

А ты понимаешь, как работает FROM users, likes? Что выведется если сделать SELECT FROM user, likes?

Это читал? Тут описано. http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html

>>397999

Тут лучше без подзапросов так как они крайне неэффективны и плохо смотрятся. Джойны и группировки тут нужны.

>>398000

Ты не понимаешь, как работает селект. Он работает примерно так. Допустим есть запрос:

SELECT fields FROM tables WHERE cond GROUP BY group ORDER BY order HAVING having LIMIT limit

(некоторые части не обязательны).

Сначала берется список таблиц tables. Это может быть одна таблица, несколько таблиц или несколько таблиц связанных джойнами. Если таблиц несколько, то они объядиняются, обычно по принципу «перебираем все комбинации строчек» то есть если указаны 2 таблицы по 20 строк то поулчается объединенная таблица на 400 строк.

Затем записи отсеиваются по условию cond

Затем группируются (несколько строчек объединяются в одну) по условию group . Если условие group не указано, но ты использовал в fields аггрегатные функции вроде COUTN() или SUM() то все записи группируются в одну.

Затем группированные записи отсеиваются по условию having

Затем сортируются

Затем берется часть результата, соответствующая ограничению limit, а из нее поля fields. На этом же этапе делаются подзапросы в SELECT (для каждой строчки результата — отдельный подзапрос, естественно).

То, что получилось и возвращается как результат.

Чтобы запомнить, вот порядок действий: FROM+JOIN, WHERE, GROUP, HAVING, ORDER, LIMIT, SELECT. Его ты (и все остальные аноны) должны знать наизусть.

Таким образом если ты не делаешь выборку полей из likes и не используешь эти поля в условиях, то не надо ее указывать.
#378 #398077
>>398005

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

>>398013

> будет выполнено по три запроса к таблице likes (твои подзапросы),


У него там один подзапрос вложенный, по числу записей в likes так что гораздо больше.

Cross join еще называют декартовым произведением (для каждой строчки первой таблицы присоединяются все строки из второй).

>>398019

Ты сделай запрос SELETC FROM t1, t2 и посмотри сам. И нет, с подзапросами решение не годится, надо сделать нормально. Ну и код создания таблиц покажи, там тоже попридираться можно.
#379 #398078
>>398015

> Мне надо проверять соседние клетки на наличие мин, если клетка с краю, то мне выдает ошибка.


Сделай проверку типа

если (клетка существует(x, y)) {
проверить клетку;
}

Или в цикле поставь ограничения:

for (x = Math.max(0, posX - 1)) .... )

Неужели это такая проблема что ради нее надо усложнять систему, добавлять неунжные ячейки и создавать потенциальные проблемы?
#380 #398079
>>398015

>А открытие соседних клеточек, если они пустые делать через рекурсию?


да. только избегай бесконечной рекурсии

>>398064

Тем не менее, в нашем треде мы одобряем желание научиться и не одобряем желание сделать кое-как, не понимая.

Работы бывают разные, где-то принимают с быдлокодом, а где-то нет.

Что касается других, это их право, если им нравится ограничивать себя и свой уровень, и всю жизнь выполнять примитивные рутинные задачи (ну или может они планируют стать менеджерами и перестать кодить, кто их знает).

>>398073

Не беда, сделаешь эту задачу, станешь умнее. А то понять это, ни разу не написав код парсера, довольно сложно, я бы тоже не понял если мне только на словах объясняли.
#381 #398081
Подскажите, как я понял, для того, чтобы нормально работать в гите надо установить локальный хост и туда уже назначить папку гит?
У меня локалхоста нет, подскажите его лучше сделать?
Меня разрывают 3 варианта: денвер, хампп или попробовать сделать самому (но тут я гуглил и свежих решений не нашел)?
#382 #398088
>>398081

> надо установить локальный хост


правильно это наызывается «веб-сервер». Веб-сервер - это программа (например, Апач, Нгинкс) которая принимает запросы от браузера по протоколу HTTP и отвечает на них. Установив веб-сервер, ты можешь организаовать сайт на своем компьютере. Для гита он не нужен.

«локальный хост» значит «мой компьютер» и звучит довольно бессмысленно.

> для того, чтобы нормально работать в гите надо установить локальный хост


Нет. Нужен только гит и пустая папка, в которой ты создаешь репозиторий. Создать можно либо через git init (пустой с нуля) либо git clone (клонировать существующий например на Гитхабе). Подробности в книге: http://git-scm.com/book/ru/ (она небольшая, понятная и на русском. Глупо не прочитать).

> Меня разрывают 3 варианта: денвер, хампп или попробовать сделать самому (но тут я гуглил и свежих решений не нашел)?


Однозначно пробовать самому. Вот немного устаревший мануал: https://gist.github.com/codedokode/10774100

Проблемы с командной строкой? прочти курс молодого бойца: https://gist.github.com/codedokode/10539568
#383 #398089
>>398081

Учиться работать в гите лучше всего на комадной строке, как в книге. К гиту есть также приложения с графическим интерфейсом, но начинающий запутается в них и скорее всего все сломает. То есть изучи гит сначала, па потом ставь любое графическое прилоежние: http://git-scm.com/downloads/guis

Я графическим приложением смотрю историю и диффы, а коммиты делаю из командной строки.
#384 #398090
>>398088
Вообще, мне не только для гита, а еще свой код тестировать на веб-сервере.
Я пол года назад пробовал настроить сам (т.к. денвер устарел, а хампп перегружен ненужным софтом), вроде ок установил апач, пхп последний, а вот с майскл какая-то беда приключилась, что установилась целая библиотека майскл приложений.
#385 #398095
>>398090

> какая-то беда приключилась, что установилась целая библиотека майскл приложений.


Нужен только сам MySQL Server и по желанию Workbench (рисовать схемы таблиц). Остальное можно удалять, наверняка через стандартный диалог Установка/Удаление программ в настройках это можно сделать.
#386 #398107
Знаю что тупой вопрос, но срошу, как активировать апач?
Т.е. я скачал дистрибутив с сайта апачлонги, кинул папку apache24 в корневую директорию, а как её оттуда активировать в службы?
В мануале написано прописать:

>Start apache in a DOS box:


>httpd.exe


>Install as a service:


>httpd.exe -k install


Но у меня нет досбокса, да и раньше я без него устанавливал через установщик МСИ.
И, нужен ли апач монитор?
#387 #398112
>>398107

> Но у меня нет досбокса, да и раньше я без него устанавливал через установщик МСИ.


Имеется в виду не DOSBox (виртуальная машина имитирующая древний компьютер), а консоль. Вот краткий гайд по консоли: https://gist.github.com/codedokode/10539568

Так что это просто мануал неточно написан.

Если ты выполнишь то, что там написано, то Апач установится как служба (фоновая программа, которая может запускатья при запуске компьютера). Ты можешь управлять службами, зайдя в Пуск -> настройки -> Администрирование -> Службы или Пуск -> services.msc (я предпочитаю второй способ)

запустить/остановить Апач можно как описано тут: https://gist.github.com/codedokode/10774100

> нужен ли апач монитор?


Решай сам, он не обязателен, он просто позволяет запускать/останавливать службу, но может тебе больше нравится когда в углу горит иконка с меню.
#388 #398113
>>398107

>Start apache in a DOS box:


>httpd.exe


Это если ты хочешь запустить Апач как обычную программу прямо в консоли, руками. Не советую, лучше установить Апач как службу и прописать ее автозапуск (ну или запускать вручную).
342 Кб, 1920x1200
#389 #398117
Кажется я что-то не до понимаю.
Скачал архив с апачем, кинул его в c:/apache24 (на скрине).
А как его в службы установить? Пробовал через консоль разные команды, ничего не работает.
#390 #398128
>>398117
А все, оказывается если апач идет не установщиком, а архивом, то он запускается через файл httpd.exe в папке bin.
Как в этом случае создать несколько локалхостов? Т.е. не отдельные папки внутри localhost, а отдельные веб-сервера, например, чтобы сайт загружался прямиком из text.loc.
#391 #398132
Парсеро-вопрос.
Мне же, чтобы парсить парный таг надо вызывать getNextToken() пока не найду закрывающий таг, а если не найду надо вернуть этот токен ([tag) как простой текст, и парсить дальше с этого места, но ведь позиция уже будет в самом конце. Менять позицию вручную $tokenizer->position = ты сказал не правильно, делать в токенайзере специальный метод по проверке на закрывающий тег тоже. Как же тогда быть?
#392 #398142
Ребят, у вас есть ламповая конфочка? Просто я сыч-омежка, в моём окружении айтишников нет, а так хоть можно будет с кем-нибудь пообсуждать какие-нибудь задачки.
#393 #398143
>>398142
Нет, не ламповая, тебя тут будут хуесосить старшаки-альфачи, будешь им папироски таскать.
#394 #398146
>>398143
норм, всё-равно лучше, чем ничего.
#395 #398147
>>398077

>И нет, с подзапросами решение не годится, надо сделать нормально.


А нормально - это как?
#396 #398151
>>398068

Друг, я прошу прощения, что вообще влез в эту тему. Тред не читал и не знал, что это какое-то обучение идёт.

В любом случае, имхо, задача неправильная. Плохому учите вы. С подзапросами, или с группировкой - это будет плохо работать в реальной жизни при большом количестве пользователей (записей в таблице). Имхо, может сформироваться шаблон, что так делать правильно и другие варианты рассматриваться уже не будут.

По поводу как это можно делать в очень больших системах - возможно, тем и правда на каждую запись "в таблицу лайков" обновляется аггрегирующая таблица - это тоже вариант. Просто нужно сравнивать что выгоднее - каждый раз делать три операции записи вместо одной и бороться с блокировками при одновременных лайках, либо периодически обновлять эту таблицу.
#397 #398156
ОП, почему если писать вот так, то jsbin зависает:
for (var x = Math.max(0, posX - 1); x <= (posX + 1); x = Math.min(7, x++)) {...
#398 #398157
>>398156
Все, нашел как по-другому сделать.
sage #399 #398158
>>398156
пиздец говно
sage #400 #398159
>>398147
Прочитал все, а не один пост. Ушел учиться.
sage #401 #398160

> x = Math.min(7, x++)


бляя
#402 #398161
>>398156

Потому что x++ возвращает число до увеличения, и ты это число записываешь назад в x.

Прочитай про пост- и пре-инкремент: http://learn.javascript.ru/operators#инкремент-декремент

(это очень полезный сайт, стоит прочесть его целиком)
#403 #398162
>>398156

Плюс, смотри, x++ равносильно

oldX = x;
x = x + 1;

Тебе надо писать не x++, а x + 1 иначе в твоем наркоманском коде 2 присваивания идет.
#404 #398163
>>398146
так есть у вас конфочка? Или ньюфагам тут не рады?
#405 #398164
>>398151

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



Смотри, это задача для проверки и закрепления понимая, как работают джойны. Ее решает человек, который только-только про эти джойны прочитал.

Я считаю, надо сначала изучить основы баз данных, включая нормализацию, а потом говорить про оптимизации, а не наоборот. Так как человеку который не знаком с осноdами SQL про оптимизацию запросов говорить глупо — он не поймет. И если такие вещи давать с самого начала, то это будет только запутывать и отвлекать.

Или тут я не прав?

> Имхо, может сформироваться шаблон, что так делать правильно и другие варианты рассматриваться уже не будут.


Чтобы этого не было, надо делать урок по оптимизаиям. Но я все равно считаю, сначала нормализация, потом все остальное. Так как иначе мы получим человека, увлекающегося преждевременной оптимизацией там где это не надо.

> это будет плохо работать в реальной жизни при большом количестве пользователей


Верно. Но до большого количества пользователей нам пока далеко.

Плюс, никто же не предлагает такой запрос в код писать. Может я его один раз ручакми в консоли наберу чтобы статистику посмотреть.

> Просто нужно сравнивать что выгоднее - каждый раз делать три операции записи вместо одной и бороться с блокировками при одновременных лайках, либо периодически обновлять эту таблицу.



В хайлоад обычно используются NoSQL кеши, соответственно единичку мы прибавляем не в базе данных, а в кеше, а вставку записи делаем в БД. соответственно, проблем нет. Что касается контакта, у них вообще свое NoSQL хранилище на Си, хранящее данные в памяти, для таких целей есть:

https://github.com/vk-com/kphp-kdb/blob/master/docs/ru/KittenDB_Photo.wiki#%D0%A3%D0%B2%D0%B5%D0%BB%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%D1%83%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D1%86%D0%B5%D0%BB%D0%BE%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BF%D0%BE%D0%BB%D1%8F-%D1%84%D0%BE%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D0%B8

Соответственно, цифры обновляются в реалтайме.
#405 #398164
>>398151

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



Смотри, это задача для проверки и закрепления понимая, как работают джойны. Ее решает человек, который только-только про эти джойны прочитал.

Я считаю, надо сначала изучить основы баз данных, включая нормализацию, а потом говорить про оптимизации, а не наоборот. Так как человеку который не знаком с осноdами SQL про оптимизацию запросов говорить глупо — он не поймет. И если такие вещи давать с самого начала, то это будет только запутывать и отвлекать.

Или тут я не прав?

> Имхо, может сформироваться шаблон, что так делать правильно и другие варианты рассматриваться уже не будут.


Чтобы этого не было, надо делать урок по оптимизаиям. Но я все равно считаю, сначала нормализация, потом все остальное. Так как иначе мы получим человека, увлекающегося преждевременной оптимизацией там где это не надо.

> это будет плохо работать в реальной жизни при большом количестве пользователей


Верно. Но до большого количества пользователей нам пока далеко.

Плюс, никто же не предлагает такой запрос в код писать. Может я его один раз ручакми в консоли наберу чтобы статистику посмотреть.

> Просто нужно сравнивать что выгоднее - каждый раз делать три операции записи вместо одной и бороться с блокировками при одновременных лайках, либо периодически обновлять эту таблицу.



В хайлоад обычно используются NoSQL кеши, соответственно единичку мы прибавляем не в базе данных, а в кеше, а вставку записи делаем в БД. соответственно, проблем нет. Что касается контакта, у них вообще свое NoSQL хранилище на Си, хранящее данные в памяти, для таких целей есть:

https://github.com/vk-com/kphp-kdb/blob/master/docs/ru/KittenDB_Photo.wiki#%D0%A3%D0%B2%D0%B5%D0%BB%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%D1%83%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D1%86%D0%B5%D0%BB%D0%BE%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BF%D0%BE%D0%BB%D1%8F-%D1%84%D0%BE%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D0%B8

Соответственно, цифры обновляются в реалтайме.
#406 #398167
>>398128
>>398117
Подскажите, никак не могу создать сторонний локалхост, вот прописал в хттпд.конф:
<VirtualHost :80>
DocumentRoot C:/Apache24/htdocs/test1.loc
ServerName test1.loc
</VirtualHost>
Это прописал в хостс:
test1.loc 127.0.0.1
Создал папку test1.loc в htdocs.
В браузере пишет проблема с загрузкой траницы, будто он обращается к интернет страничке, а не к веб-серверу.
И, почему-то, сам локалхост теперь стал переходить в эту папку - test1.loc, а не htdocs.
В чем проблема?
#407 #398168
>>398161
Спасибо, я читал летом. Плохо запомнил видимо. Алсо, и с х + 1, и с ++x зависает.
#408 #398169
>>398117

> Пробовал через консоль разные команды, ничего не работает.


Урок внимательно читал? https://gist.github.com/codedokode/10539568

> Внешние команды — их большинство — это фактически программы, лежащие на диске. Оболочка ищет их не по всему диску, а только в заранее заданных папках. Список папок перечислен в специальной переменной PATH



> В Windows PATH — это всякие системные папки вроде c:\windows и так далее + текущий каталог, в котором ты находишься



Тебе надо перейти в папку где лежит httpd.exe либо набирать полный путь к нему (вроде c:\hello\httpd.exe)
#409 #398172
http://pastebin.ru/3WP9zRKg
Оцените мой первый говнокод, анончики.
#410 #398173
>>398128

VirtualHost

>>398132

Ответ http://ideone.com/GufMwT

>>398142

Нету. Я бы не стал участвовать так как отвлекает, а пользы ноль. Но вы можете организоваться, если есть желание.

Алсо, зарегистрируйся на хабре например, там айтишников много.

>>398147

Джойны и группировки. Для начала попробуй считать только число полученных лайков например, а потом постепенно усложняй.

>>398159

Ты можешь постить вопросы если где-то запнешься.
#411 #398177
>>398157

кстати, я помню тредов 15 назад мы тут решали эту задачу, и в итоге пришли к тому что достаточно по моему 2 джойнов (но я не уверен что точно помню).

>>398163

Нету. Можете сами организоваться. Ньюфагам тут рады, я всем стараюсь отвечать, но конфы нету.

>>398167

Апач перезапустил? Чтобы он новый конфиг прочитал.

Ну и для проверки можно сделать в консоли:

httpd.exe -t (проверить правильный ли конфиг)

httpd.exe -t -D DUMP_VHOSTS (показать какие хосты он видит в конфиге)

и посмотреть что выведет.

Ну и в папку test1.loc надо файл index.html положить наверно с текстом.
#412 #398181
>>398078
http://jsbin.com/vuxofevupo/1/edit?html,js,output . Помоги с рекурсией. Функция должна вызывать или возвращать сама себя?
#413 #398182
>>398173

> Ответ http://ideone.com/GufMwT


Еще фишка в том, что там может быть другой валидный тег, так-что его придется таки парсить, а не просто принимать как обычный текст.
#414 #398183
>>398167

Также, Апач ведет логи и пишет в них ошибки. По моему они в папке Апача/logs/error.log — поищи есть ли там что

>>398168

min берет число которое меньше, соответственно если x больше 7 то в нем всегда будет ровно 7 поулчаться.

>>398172

Хорошо в плане логики, но не очень хорошо оформления.

if надо писать в 3 строчки, а не ужимать. Названия переменных из нескольких слов разделяют их заглавной буквой:

usersum -> userSum

Старайся оформлять код аккуратно, чтобы на него было приятно смотреть. Ну и тут описаны способы как это делать автоматически: >>395792

А, а еще если у робота и человека выпали даблы (неважно сколько очков), то победила дружба, ты видимо это не сделал?
63 Кб, 677x770
#415 #398185
>>398177
Вот что выдало.
В папке тест1.лок есть пхп файлик, но, даже если бы там было пусто, мне бы показывался как пустой каталог, а не попытка подключится к серверу.
Апач перезапускал.
#416 #398187
>>398182

Что-то я не очень понимаю. Приведи пример.
#417 #398188
>>398183
Вот логи за последнее время, вроде бы, все ок?
[Thu Oct 23 19:00:19.433358 2014] [mpm_winnt:notice] [pid 3588:tid 216] AH00455: Apache/2.4.10 (Win64) PHP/5.6.2 configured -- resuming normal operations
[Thu Oct 23 19:00:19.433358 2014] [mpm_winnt:notice] [pid 3588:tid 216] AH00456: Apache Lounge VC11 Server built: Jul 17 2014 12:58:29
[Thu Oct 23 19:00:19.433358 2014] [core:notice] [pid 3588:tid 216] AH00094: Command line: 'C:\\Apache24\\bin\\httpd.exe -d C:/Apache24'
[Thu Oct 23 19:00:19.434358 2014] [mpm_winnt:notice] [pid 3588:tid 216] AH00418: Parent: Created child process 3640
Apache server shutdown initiated...
pm_winnt:notice] [pid 3640:tid 240] AH00354: Child: Starting 64 worker threads.
[Thu Oct 23 19:01:12.717406 2014] [mpm_winnt:notice] [pid 3588:tid 216] AH00422: Parent: Received shutdown signal -- Shutting down the server.
[Thu Oct 23 19:01:14.717520 2014] [mpm_winnt:notice] [pid 3640:tid 240] AH00364: Child: All worker threads have exited.
[Thu Oct 23 19:01:14.732521 2014] [mpm_winnt:notice] [pid 3588:tid 216] AH00430: Parent: Child process 3640 exited successfully.
168 Кб, 1246x464
#418 #398189
>>398183
Вот как выглядят хостс и апач конф.
#419 #398190
>>398185

Апач на 80-м порту запущен?

В логах что-то есть?
#420 #398191
>>398182
Я цитировал, но спамм-лист. В смысле, в куске от начальной до текущей позиции могут быть другие теги. Ну вообще "что-то не так" будет если будет парсирован уже весь текст, а закрывающего тега так и не будет, так что текущей позиции и не будет. Так что я напутал немного, все ок.
#421 #398192
>>398190
Да на 80, у торрента и скайпа я 80 порт отключил, вроде. По крайней мере локалхост работает.
#422 #398193
>>398181

> Функция должна вызывать или возвращать сама себя?


Вызывать. это и есть рекурсия.

Тут важно не впасть в бесконечнуб рекурсию, потому должно быть как-то так:

открытьКлетку(коорд.) {
открытьСамуКлетку(коорд);
если (вокруг 0 мин и она не заминирована) {
обходим соседние клетки;
для каждой еще не открытой клетки вызываем открытьКлетку(коорд);
}
}

Обрати внимание на это:

> каждой еще не открытой клетки



должна быть проверка, чтобы 2 раза не открывать уже открытую клетку.
#423 #398195
>>398183
бро, я сделал победу более сильного дабла в случае, если дабл выпал обоим. Именно для этого я не давал победу за дабл, а только умножил сумму (хотя умножить можно и на 7). Учту всё, что ты сказал, спасибо.
Алсо, почему не пашет вот этот код? Чую, что что-то с выводом строковой переменной.
http://pastebin.ru/mpupdZTg
Здесь вроде условия оформлены правильно, в 3 строки читалось бы хуже
#424 #398196
>>398188

Тут нет сообщения об ошибке, это какие-то не те логи.

Попробуй внутрь VirtualHost вписать

ErrorLog logs/some.log

И перезапустить Апач. Он должен по идее ошибку туда писать.

А, еще. Браузер какие-то подробности пишет? Что он пишет вообще?
#425 #398197
>>398195
кстати, на пастебин.ру что, нельзя зарегистрироваться?
#426 #398198
>>398191

> Ну вообще "что-то не так" будет если будет парсирован уже весь текст, а закрывающего тега так и не будет, так что текущей позиции и



Да, согласен, сложно получается. Тогда можно так:

парситьПарныйТег (скобки) {
парситьОткрывающийТег (скобки)
если все плохо, возвращаем текстовый узел и выходим;
если все хорошо, то открывающий тег есть и назад пути нет.
.....
}

Что скажешь?
#427 #398199
>>398191

Спам-лист реагирует на скобки после слова кстати:

test(скобки);
русскоеназвание(скобки);

маразм какой-то
#428 #398200
>>398195

Постил бы код на ideone, там виден результат.

Причина — ты перепутал скобку } c ) (ideone кстати это показывает).

И все же оформлены if неправильно. Стандарты не я придумал, это общепринятая вещь и в нормальной команде тебя все равно попросят переделать код нормально — иначе будет бардак если каждый будет изобретать свой стиль.

> в 3 строки читалось бы хуже


Это ты просто не привык.

> Именно для этого я не давал победу за дабл, а только умножил сумму (хотя умножить можно и на 7).


Если так то ок.
#429 #398201
>>398197

Не знаю, пости на ideone лучше — там регистрация есть и результат видно.
#430 #398202
>>398195
нашёл, закрыл круглой, а не фигурной скобкой. Но аноны, почему у меня во всех случаях выдаёт активиста?
#431 #398203
>>398202

А ты не видишь ошибки

> PHP Notice: Undefined variable: postNumber in /home/ya0fBf/prog.php on line 5



? У тебя ошибка в названии переменной.

Если ты запускаешь код у себя то наверно у тебя выключено отображение ошибок.

В PHP по умолчанию выключено отображение ошибок в браузере, так как обычному пользователю сайта эта информация ни к чему. Но тебе, как программисту, надо видеть эти ошибки. Вот, как можно их просмотреть:

- ошибки сохраняются в лог ошибок. Можно открыть его и почитать. Если ты запускаешь код на локалхосте, у себя, то лог хранится в папке Апача (обычно она называется logs) и имеет название вроде error.log . Если на хостинге — там либо есть файл error.log либо раздел в панели управления, где лог можно посмотреть

- также, ты можешь включить отображение ошибок. Открой файл php.ini, поставь там display_errors = On и error_reporting = E_ALL и перезапусти сервер. Теперь ошибки должны выводиться на экран.
#432 #398205
>>398203
бро, я сижу с ideone.com
#433 #398206
>>398205

Тогда обнови страницу с кодом и посмотри в самый низ — ты переменную по-другому написал второй раз.
#434 #398207
>>398196

>Server not found


>Firefox can't find the server at www.test1.loc.


Вот ошибку выдает.
Прописал в виртуал хосты
<VirtualHost :80>
DocumentRoot C:/Apache24/htdocs/test1.loc
ServerName test1.loc
ErrorLog logs/some.log
</VirtualHost>
Но сам.лог пустой.
#435 #398208
>>398205
уже нашёл. Спасибо за помощь.
Бро, повторюсь, у вас есть конфочка?
#436 #398213
>>398198
Ну, не факт же, что закрывающий тег есть. Но тут все понятно, просто откатимся к сохраненной позиции. Другое дело что контент надо будет складывать? Сейчас токены на стороне токенайзера храняться, надо или делать координаты начала и конца контента тега, чтобы запускать на нем рекурсив, или складывать их в отдельный массив и передавать токенайзеру.
#437 #398214
>>398207

У тебя ошибка на стадии DNS то есть преобразования адреса сайта в Ip-адрес.

Почему www.test1.loc? Надо в адресной строке писать test1.loc так как в hosts у тебя только он. www.test1.loc — это совсем другой домен.
#438 #398215
>>398208
Запили уже сам. Оп в следующем треде в шапку кинет и народ подтянется.
#439 #398216
>>398208

Нету.

>>398213

> Ну, не факт же, что закрывающий тег есть


Даже если нету, наверно есть смысл его добавить, а не превращать все в текст. HTML-парсер в браузерах работает так:

битый открывающий тег вроде x<2 — выводит как текст
если есть открывающий тег, а закрывающего нет, он его дописывает, при этом блочные теги автоматом закрывают строчные:

<div><strong>123</div> — тег strong будет закрыт автоматически
<div>1223 — браузер закроет див автоматически
#440 #398225
>>398214
Ну я пишу test1.loc, а браузер преобразовывает в www.test1.loc.
localhost работает норм, и пхп в нем работает, НО локалхост начал работать из папки test1.loc может с этим что-то связанО?
#441 #398232
ОП, так подскажи что я не так сделал что не могу сделать дополнительный веб-сервер? Могу все заново пересказать как делал и прикрепить файлы хостс и апач конф?
#442 #398234
>>398071
А на русском?
#443 #398235
>>398234
С актуальными книжкам и так туго, а тебе еще на русском подавай. Чем не повод подучить? Я так делал. В литературе этой тематике слов не много, я через тройку недель мог уже читать без переводчика процентов 80.
#444 #398236
ОПушка, я тебя заебал, но пожалуйста, можешь пояснить, что не так с этим кодом? Я уже заебался искать в нём ошибки, почему оставшийся к выплате кредит приравнивается к нулю?
http://pastebin.ru/y78vgdII
Кстати, конфочку я тоже создал, добавляйтесь в скайп к bitardinio.
#445 #398237
>>398236
Да кому твоя конфочка то нужна.
#446 #398239
>>398237
может и не нужна, но пусть всё-таки будет.
#447 #398241
>>398236
блядь, ёбаный второй знак равно, пиздец короче. Теперь я понимаю подобные бугурты погромистов.
#448 #398243
>>398225

Плохо, что преобразовывает, ты уверен что ты в hosts все правильно сохранил?

Попробуй другим браузером, если есть, и набрать http://test1.loc в адресной строке
#449 #398252
>>398167

О, я понял!

https://ru.wikipedia.org/wiki/Hosts

Ты наверно непраивльно адрес в hosts вписалю

Сначала IP адрес идет.
#450 #398259
Чики, программач.
Короче, делаю задание. Даны md5 хэши, необходимо подобрать пароли, которые зашифрованы с помощью md5. Пароли должны включать столько-то англ символов и цифр.
Задание элементарно. Я создаю функцию, которая рандомно генерит строку из нужного количества символов, затем прогоняю эту строку через
$hash = md5($string);
и просто сравниваю полученный $hash с теми md5, которые даны в условии. Вот только... Не работает, блядь.
#451 #398261
>>397916

> сколько времени теряет человек


Сколько?
#452 #398263
Аноны, как можно отлаживать свой код? Вот я опять написал какую-то хуиту, которая снова не пашет.
http://pastebin.ru/te5uHZ7F
#453 #398264
>>398252
Спасибо, действительно что-то я ступил.
Только такой вопрос, а как сделать так, чтобы локалхост был на всю папку htdocs, а всякие тест.локи были внутри?
А то я на локалхост зашел, а он меня на test1.loc преренаправил.
#454 #398265
>>398259
1) Делаешь алфавит, содержащий нужные англ. сиволы и цифры (длиной N символов).
2) Делаешь буфер длиной M, где M - длина проверяемого пароля.
3) На каждом шаге инкрементируешь буфер на 1 с переносом (как в школе - если значение первой ячейки после инкремента = N, сбрасываешь её в 0 и инкрементируешь следующую, если это была последняя - останавливаешься, потому что нихуя не нашёл).
4) На каждом же шаге отображаешь все ячейки буфера на алфавит (банально charset[buffer]), полученный пароль хэшируешь, проверяешь.
Частные случаи можно делать быстрее, без буфера, прямо с алфавитом.
sage #455 #398266
>>398265

> символы


> charset(buffer(i))


быстрофикс
#456 #398268
>>398265
а почему это не может работать как нибудь вот так?
http://ideone.com/IvMHO5
просто не совсем понял твоего объяснения, я тупой
#457 #398276
>>398268
Потому что так перебор займет рандомное время.
Чтобы понять мое объяснение, посчитай 71999 + 1 столбиком на бумажке, а потом представь, что цифры - это номера символов в строке "abcdefghij". А потом представь, что твои цифры не от 0 до (10-1), а от нуля до (len(charset)-1).
#458 #398281
В пхп нет функции =. или вроде такой, чтобы прибавить к данной строке еще строку? В гугле нету, но почему-то люто кажется, что я это видел. ошибся наверное, но лучше спрошу.
#459 #398283
>>398281

$x .= $a;
#460 #398284
>>398263

Отлаживать — отладчиком, который например есть в Eclipse PDT или PhpStorm, но его еще надо настроить.

В твоем случае проще ставить в программе echo и var_dump() чтобы вывести что в какой переменной хранится.

> rates[$i]


Знак $ забыл

Ставить в конце ?> не надо.

в echo в данном случае кавычки не нужны.
#461 #398285
>>398263

Будь внимателен к мелочам. В программировании нельзя пропустить точку с запятой или не так поставить скобку, тут все должно быть точно. Впрочем, со временем ты привыкнешь и будешь на автомате правильно писать.
#462 #398286
>>398264

Создай VirtualHost, указывающий на эту папку и поставь там ServerName localhost
#463 #398288
>>398259

Твой хеш проще гуглом взломать.
#464 #398289
>>398261

Затрудняюсь ответить, наверно зависит от человека. Но уродовать код ради непонятной микрооптимизации однозначно не стоит.
2 Кб, 336x70
sage #465 #398294
>>398289
Ничего непонятного в этом нет. Читается так же легко, как и инлайн, а то и легче. Особенно если не ставить пробелы вокруг точек.
#466 #398295
>>398294

Символов больше, визуального мусора и строка рвется на части (по моему суъективному мнению):

"hello {$user->name}, you have {$count} unread messages"

'hello ' . $user->name . ', you have ' . $count . ' unread messages'

Обрати внимание, как запятая неудачно висит в пространстве во втором примере.

И если ты предпочитаешь конкатенацию потому что она удобнее и лучше читается, то это одно. Но если из-за якобы выигрыша в скорости то это очень нездоровый признак. Таких людей лучше не брать на работу, так как вместо нее они будут заниматься ерундой.
#467 #398296
>>398294

Алсо, смесь одиночных и двоынйх кавычек тоже не очень гармонично.
#468 #398302
>>398295
А я, например, предпочитаю не заказывать у фрилансеров, которые пишут так, как ты - вместо написания одного класса они напишут десять, мотивируя это хорошей архитектурой и вот этим твоим "ну а чё там оптимизировать по мелочам". При более-менее серьёзных изменениях "хорошую" архитектуру всё равно придётся переделывать, так что я предпочитаю, чтобы хотя бы работало быстро.
Смесь разных кавычек плохо смотрится, но что ж поделать, если в PHP всё не как у людей: по непонятной причине не поддерживаются спецсимволы в одинарных.
#469 #398303
Ёпта.
Вот у меня метод parse( ), который возращает распарсенный массив узлов (чтобы можно было парсить и контент тегов рекурсивно, возращается в конце все равно корневой объект, другим методом, использующим этот)Всё бы хорошо, но нужно чтобы на каждый вызов parse( ), был отдельный инстанс токенайзера. Есть выход, кроме как создавать её в области метода (без $this) и передавать другим методам в аттрибутах?
https://github.com/Electric-Lizard/Some_Parser/blob/dev/includes/parser.php
#470 #398304
>>398302

> если в PHP всё не как у людей: по непонятной причине не поддерживаются спецсимволы в одинарных.


Может по этому они и быстрее?
#471 #398305
Привет братишки, я JS обезьяна, хочу прокачать свои скиллы, доставьте задачек.
#472 #398306
>>398304
Нет, экранированные символы обрабатываются один раз ещё на этапе синтаксического разбора, причём не особо замедляя процесс (т.к., \' и \\ всё равно приходится поддерживать), и после него никак не отличаются от других символов в памяти. А вот переменные в строках с двойными кавычками, хоть и на определённые заранее места, но приходится подставлять каждый раз.
#473 #398313
>>398303

Ответ: http://ideone.com/JwJTEg

Вот я еще нашел ссылку, http://www.html5rocks.com/ru/tutorials/internals/howbrowserswork/ там описаны в общих чертах парсеры HTML и CSS в браузере. Можешь почитать потом, хотя там используется не рекурсивный спуск, а конечные автоматы (так получается сложнее в нашем случае).
#474 #398314
>>398305

Держи: https://gist.github.com/codedokode/ce30e7a036f18f416ae0

>>398302

> так что я предпочитаю, чтобы хотя бы работало быстро.


Ради того, чтобы работало быстро, ты меняешь двойные кавычки на одинарные? Ты либо тролль либо ненормален. В любом случае нам дальше не о чем разговаривать.
#475 #398315
>>398302

И судя по

> всё не как у людей



ты все же тролль из какого-то соседнего треда.
#476 #398317
>>398303

Кстати, это ограничение парсера на алгоритме рекурсивного спуска, что он плохо работает в случаях когда есть 2 конструкции с похожим началом, ну например

[ name (открывающий тег)
[ / name (закрывающий тег)

Ты вынужден заглядывать вперед, чтобы понять какой тип тега перед тобой (а в итоге может оказаться что это вообще не тег). Решение либо завести токен [/ чтобы заглядывать вперед было не надо, либо использовать более сложные парсеры (на основе конечных автоматов) которые умеют решать такие ситуации. Такие сложные парсеры обычно не пишут руками, а генерируют с помощью генераторов парсеров из описания грамматики (пример такого для яваскрипта: http://pegjs.majda.cz/ ).
#477 #398320
>>398314
Я не тролль, я из соседнего треда мы с тобой уже не в первый раз спорим по разным поводам, и ты меня не совсем правильно понял. Я имел в виду, что использование двойных кавычек, в числе прочего - признак подхода "а мне похуй на производительность" (можешь в другой соседний тред сходить >>397409).
Но что касается кавычек, я сейчас померял даже на свежем PHP: для простых литералов одинарные быстрее. Если приходится собирать строку более чем из 2-3 переменных, разница становится незаметной, и в некоторых случаях, при большом количестве подстановок двойные кавычки ебут конкатенацию (получается в 1.3 раза быстрее в одном из случаев). Так что буду переучиваться :-)

> всё не как у людей


Я на няшной пишу, последние пару лет ещё и на Python, но PHP тоже знаю.
#478 #398323
>>398320

> признак подхода "а мне похуй на производительность"


Это признак подхода «мне нравится аккуратный и читаемый код».

Какая разница в абсолютных величинах между двойными и одинарными кавычками? Ты знаешь?

Насчет производительности, эта задача решается не заменой кавычек. Если ты считаешь что вид кавычек имеет хоть какое-то значение, это значит что ты в этой теме не разбираешься.

> для простых литералов одинарные быстрее


Насколько? Не во сколько, а на сколько секунд быстрее?

> Я на няшной пишу, последние пару лет ещё и на Python,


Ох лол. А в Питоне какие кавычки быстрее работают?
#479 #398325
>>398323

> Это признак подхода «мне нравится аккуратный и читаемый код».


... и мне похуй, что однажды посещаемость повысится, и сервак встанет, это проблемы клиента, а я люблю обмазываться своим кодом и далее по тексту. Ещё раз повторю: встанет НЕ из-за кавычек, а из-за общего пренебрежения вопросами производительности. Кавычки - лишь "индикатор".

> А в Питоне какие кавычки быстрее работают?


В питоне escape-последовательности в одинарных работают в отличие от.

> на сколько секунд


Нет. Очевидно, что ответ будет зависеть от конкретного скрипта, от железа, от того, сколько этих скриптов сейчас работают параллельно. Никаких на тут быть не может.
#480 #398326
>>398325

На твоем железе сколько?

> , а из-за общего пренебрежения вопросами производительности.


Не вижу связи. Но я считаю, что плохо написаннный код очень тяжело читать, исправлять, оптимизировать, а хорошо написанный — легко и приятно. Потому это очень важно.
#481 #398327
На моём железе в самом извращённом случае (синонимайзер по шаблонам) двойные быстрее (200 мс, дохуя шаблонов, сотня килобайт текста). И хотя я был уверен, что двойные кавычки медленнее (мерял несколько лет назад, и они были медленнее), ты меня >>398320 переубедил, Переубеди ещё в HTML одинарные ставить, а то echo "<a href=\"$url\">..." неудобно пиздец. Ну да ладно, шаблонизаторы рулят..

> хорошо написанный — легко и приятно


Проблема только в том, что большинство считает хорошо написанным кодом ООП головного мозга, где вместо какого-нибудь массива абстрактный класс фабрикой погоняет. Эти же самые люди обычно делают mb_strlen на UTF-8 строке в условии for() и другие глупости, в том числе и двойные кавычкину насчёт них ты оказался прав, ПРАВ, ПРАВ, а когда им об этом говоришь, тебе рассказывают про микрооптимизации.
#482 #398340
>>398276

Можешь немного поподробней рассказать, что это за буферы такие и что они делают? Или где о них почитать можно? Каково их применение?
Я то нуб в пхп, считай, три дня им занимаюсь.
#483 #398342
>>398173

>Джойны и группировки. Для начала попробуй считать только число полученных лайков например, а потом постепенно усложняй.


Посчитать только полученные или только поставленные лайки - совсем легко. Запихнуть в один запрос и то, и другое - уже проблемы. Как впихнуть туда еще и взаимные лайки, у меня совсем нет идей.
sage #484 #398352
>>398342
В общем у меня только гейство, вроде http://sqlfiddle.com/#!2/ca600/1/0 такого выходит.
Днем буду узнавать у вас, как получать взаимные лайки без вложенных запросов.
sage #485 #398353
>>398352
http://sqlfiddle.com/#!2/ca600/5/0
Вот про топ пять популярных.
#486 #398382
>>398327

> в самом извращённом случае (синонимайзер по шаблонам)


А ты уверен что проблема именно в кавычках, а не в других местах алгоритма? Интуиция подсказывает, что в другом.

> а когда им об этом говоришь, тебе рассказывают


Ну исправь, если это мешает. А вместо абстрактных рассуждений покажи цифры где например скрипт вместо 10 секунд начинает выполняться за одну — это будет куда как убедительнее.

А если это не мешает, то тогда какая разница? Это именно нездоровый фанатизм, когда оптимизируют то, что этого не требует. И когда люди тратят на это время вместо того, чтобы заняться чем-то более нужным.

Я не могут вспомнить ни одной ситуации где микрооптимизации хоть что-то решали. То что ты заменишь 10 классов на 1, обычно ничего не решает. Обычно решает изменение схемы хранения данных, алгоритмов и другие высокоуровневые вещи (и внезапно - их удобнее делать на аккуратном коде,а если он спутанный и микрооптимизированный то его проще переписать с нуля).

И то, прежде чем их делать, надо спросить, а точно ли это приоритетная вещь или есть какие-то другие вещи, которые дадут большую отдачу. Главная цель любого проекта обычно получение прибыли, а не написание идеальных алгоритмов.
#487 #398385
>>398327

> echo "<a href=\"$url\">..." неудобно


Не выводи код через echo. Это же невозможно ни читать ни редактировать. Алсо, если тебе все же хочется назло маме отморозить уши всем поставить echo, юзай heredoc/nowdoc (что это? нагугли сам)

>>398340

Он имел в виду «буфер» = массив символов.

>>398342

> Запихнуть в один запрос и то, и другое - уже проблемы


Это специально задача такая

> Как впихнуть туда еще и взаимные лайки, у меня совсем нет идей.


Тут надо мыслить реляционными операциями. Берем пользователя, и приджойниваем к нему 2 таблицы: все поставленные лайки, все полученные лайки (ты приджойнил одной, но поверь, 2 удобнее и более «правильно»). После чего мы получаем все возможные комбинации пар

(кому я поставил), (от кого получил)

Осталось лишь посчитать число взаимных. Такая вот подсказка.
#488 #398389
>>398352

Ты используешь подзапросы опять? Нехорошо, нехорошо.

Если уж ты делаешь подзапрос для выборки взаимных лайков, что тебе мешает сделать так (сджойнить таблицу на саму себя):

SELECT FROM likes left JOIN likes right ON (лайк взаимен)

когда ты джойнишь таблицу на таблицу, ты получаешь все возможные варианты комбинаций

(строка левой таблицы)(строка правой)

остается только отфильтровать их чтобы остались только взаимные лайки. И эту таблицу взаимных лайков уже можно сгруппировать по пользователям (чтобы получить количество). Тебе не нужны допольнительные поззапросы.

Чтобы понять, о чем я говорю, сделай 2 вещи:

- сначала сделай inner джойн таблицы лайков на себя и выведи что получится

- потом добавь условие чтобы остались только взаимные пары лайков
- потом сгруппируй по пользователям и приджойнь таблицу пользователей. Ты должен получить таблицу вида «имя — число взаимных лайков»

Тогда я думаю ты сам увидишь.

Теперь советы и замечания по коду.

— будь последователен при выборе имен. Либо users.id, user.name либо users.user_id, users.user_name

— для всех колонок надо укзаывать можно ли туда ставить NULL. NULL значит «неизвестно» и ты должен сам понять, разрешать его в колонке или нет. Естественно, колонки где запрещен NULL и не указано значение по умолчанию, становятся обязательными для заполнения.

— 20 символов на имя — неразумно. Это напоминает историю про бабушку, которая родилась в 1900 году и не могла указать год рождения на фейсбуке так как там список начинается с 1905

— я бы вместо похожих liker/liker использовал более различимые from/to но это уже дело вкуса

— ты прописал внешние ключи. Молодец. Но ты не прописал действия ON DELETE и ON UPDATE явно, хотелось бы их увидеть.

— в таблице лайков надо поставить уникальный (а еще логичнее первичный) ключ на пару (от кого, кому) чтобы нельзя было вставить повторяющиеся данные

> CASE WHEN `likes`.`liker_id`=`users`.`user_id` THEN 1 ELSE 0 END


Сравнение возвращает либо 0 либо 1 потому можно писать просто

SUM(a = b)

или использовать лаконичный if:

SUM(IF(a = b, 1, 0))

— я бы использовал короткие алиасы таблиц, типа u, l1, l2 — чтобы писать меньше — и не использовал косые кавычки. Но это дело вкуса, тут можешь делать как хочешь

> GROUP BY `users`.`user_id`


> ORDER BY `users`.`user_id`;


GROUP BY включает сортировку, потому ORDER тут не нужен (а мы узнали что ты этого не знал :) ).

— есди джойнить лайки 2 раза, а не один, можно считать число полученны/отданных через COUNT(DISTINCT)

Но вообще, неплохо, я вижу ты начинаешь понимать джойны, только разберись с тем как выбирать взаимные лайки.
#488 #398389
>>398352

Ты используешь подзапросы опять? Нехорошо, нехорошо.

Если уж ты делаешь подзапрос для выборки взаимных лайков, что тебе мешает сделать так (сджойнить таблицу на саму себя):

SELECT FROM likes left JOIN likes right ON (лайк взаимен)

когда ты джойнишь таблицу на таблицу, ты получаешь все возможные варианты комбинаций

(строка левой таблицы)(строка правой)

остается только отфильтровать их чтобы остались только взаимные лайки. И эту таблицу взаимных лайков уже можно сгруппировать по пользователям (чтобы получить количество). Тебе не нужны допольнительные поззапросы.

Чтобы понять, о чем я говорю, сделай 2 вещи:

- сначала сделай inner джойн таблицы лайков на себя и выведи что получится

- потом добавь условие чтобы остались только взаимные пары лайков
- потом сгруппируй по пользователям и приджойнь таблицу пользователей. Ты должен получить таблицу вида «имя — число взаимных лайков»

Тогда я думаю ты сам увидишь.

Теперь советы и замечания по коду.

— будь последователен при выборе имен. Либо users.id, user.name либо users.user_id, users.user_name

— для всех колонок надо укзаывать можно ли туда ставить NULL. NULL значит «неизвестно» и ты должен сам понять, разрешать его в колонке или нет. Естественно, колонки где запрещен NULL и не указано значение по умолчанию, становятся обязательными для заполнения.

— 20 символов на имя — неразумно. Это напоминает историю про бабушку, которая родилась в 1900 году и не могла указать год рождения на фейсбуке так как там список начинается с 1905

— я бы вместо похожих liker/liker использовал более различимые from/to но это уже дело вкуса

— ты прописал внешние ключи. Молодец. Но ты не прописал действия ON DELETE и ON UPDATE явно, хотелось бы их увидеть.

— в таблице лайков надо поставить уникальный (а еще логичнее первичный) ключ на пару (от кого, кому) чтобы нельзя было вставить повторяющиеся данные

> CASE WHEN `likes`.`liker_id`=`users`.`user_id` THEN 1 ELSE 0 END


Сравнение возвращает либо 0 либо 1 потому можно писать просто

SUM(a = b)

или использовать лаконичный if:

SUM(IF(a = b, 1, 0))

— я бы использовал короткие алиасы таблиц, типа u, l1, l2 — чтобы писать меньше — и не использовал косые кавычки. Но это дело вкуса, тут можешь делать как хочешь

> GROUP BY `users`.`user_id`


> ORDER BY `users`.`user_id`;


GROUP BY включает сортировку, потому ORDER тут не нужен (а мы узнали что ты этого не знал :) ).

— есди джойнить лайки 2 раза, а не один, можно считать число полученны/отданных через COUNT(DISTINCT)

Но вообще, неплохо, я вижу ты начинаешь понимать джойны, только разберись с тем как выбирать взаимные лайки.
#489 #398392
>>398353

все верно
#490 #398437
А откуда скачать и какую версию MySQL?
#491 #398439
>>398437
На офф. сайте предлагают скачать какую-то энтерпрайз версию за деньги. А где взять просто mySQL + workbench?
#492 #398458
>>398437

Тебе нужен MySQL Community Server: http://dev.mysql.com/downloads/mysql/

Инсталлятор ставит по умолчанию кучу лишнего, тебе надо только:

— MySQL server
— MySQL Workbench (по желданию, необьязатеьно)

Лучше качать web version который весит полтора мегабайта.

Неи спользуй настройки по уолчанию, все проверь и просмотри глазами.
#493 #398459
>>398340
Под буфером я имел в виду некую структуру данных, в которой хранят какие-то промежуточные данные. В данном случае, это массив из M целых чисел, каждое из которых в диапазоне 0 .. N - 1.
http://ideone.com/2qtMHd как-то так В двух функциях, в общем-то, нет необходимости. Если завести флаг переноса в next_state, можно будет генерировать пароль и делать инкремент одним и тем же циклом.
#494 #398461
>>398459

Неужели нельзя без глобальных переменных?
#495 #398464
>>398458
Скачивать оттуда МСИ инсталлер?
А то я скачал архив какой-то (из списка ниже), распаковал, а это не установщик, а бинарник или как это называется.
#496 #398466
>>398461
Можно. Всё можно. Можно класс сделать. Будет 30 секунд работать вместо пяти. А можно объединить циклы, убрать count, ещё подумать, и будет ровно вдвое быстрее, чем сейчас. Привет.
#497 #398468
>>398464

Надо было инсталлер

>>398466

Нет. Ты просто не разбираешься в PHP, и подозреваю, в других языках тоже.
#498 #398469
>>398468
Выкладывай свой вариант. Можно пароль подлиннее взять, чтобы подбирался минут 30, и было веселее спорить.
#499 #398482
>>398389

>будь последователен при выборе имен. Либо users.id, user.name либо users.user_id, users.user_name


Буду.

>для всех колонок надо укзаывать можно ли туда ставить NULL.


Недостаточно указать лишь те, где нельзя?

>20 символов на имя — неразумно.


Я изначально 10 вообще поставил, но одна фамилия не влезла. Я понимаю, что в реальных условиях и десять, и двадцать - мало.

>я бы вместо похожих liker/liker использовал более различимые from/to но это уже дело вкуса


from/to выглядит лучше, так и сделаю.

>ты прописал внешние ключи


Кстати о них, я ничего про них не понял. Он только ради

>ON DELETE и ON UPDATE


нужны?

>я бы использовал короткие алиасы таблиц, типа u, l1, l2 — чтобы писать меньше — и не использовал косые кавычки.


Пока что я предпочитаю длинные. В коротких к пяти утра я совсем запутался бы.

>есди джойнить лайки 2 раза, а не один


Я так и пытался изначально, но что-то у меня не вышло. Сейчас еще попробую.

>разберись с тем как выбирать взаимные лайки.


http://sqlfiddle.com/#!2/fb2fa/4
199 Кб, 965x800
#500 #398487
Почему когда я пробую выбрать что-то для установки, мне выскакивает эта ошибка?
Пробовал и веб дистрибутив и обычный одно и то же.
#501 #398490
>>398469

Ты от меня отстанешь с микрооптимизацими в этом случае?

Вот этот вариант

http://ideone.com/YLqGSf

работает у меня на компьютере быстрее чем твой. А ведь я его еще не оптимизировал, там простор широкий.
#502 #398492
>>398469

Ну и конечно прежде чем оптмизировать стоило бы попробовать тот же HHVM: он такие числомолотилки отлично ускоряет.
#503 #398493
>>398193
http://jsbin.com/yahaqadaye/1/edit?html,js,console,output - окна проигрыша или победы не доделал. И то, что ты мне говорил про шаблоны пока не сделал(вот это: http://learn.javascript.ru/templates#хранение-шаблона-в-документе).

И еще, как мне страничку перезагрузить? location.reload - не работает. Но, наверное, если код будет не в jsbin'е, а просто из файла запускать, то перезагрузит?
#504 #398496
>>398482

> Недостаточно указать лишь те, где нельзя?


Можно, так как по умолчанию NULL разрешен. А там где можно обычно пишут DEFAULT NULL

> Кстати о них, я ничего про них не понял.


http://denis.in.ua/foreign-keys-in-mysql.htm — читал? Ключи защищают твою базу от внесения неправильных данных, могут автоматически удалять и обновлять дочерние записи при изменении/удалении родителя, в общем их надо ставить обязательно.

Ну и они несут документирующую функцию: сразу видно на что ссылается колонка.

>>ON DELETE и ON UPDATE


> нужны?


Конечно

>>разберись с тем как выбирать взаимные лайки.


Все верно. Теперь можно вернуться к основной задаче. Только там придется считать более хитро чтобы обойтись 2 джойнами.
#505 #398499
>>398487

Криворукие программисты из Оракл постарались.

Тот же баг: http://forums.mysql.com/read.php?11,621378,621378#msg-621378

> I fixed that by just changine the date time format in windows settings to M/dd/yyyy



> chnage the Format in the Region and Language settings to "English (United States)" and then try again



Можно временно поменять формат даты/времени в системе на западный. Или же, установить не установщиком, а руками из огромного zip-архива: http://malwselennaiaru.ru/182-ustanovka-mysql-na-windows.html

Я бы установил из архива. Пр сути надо распаковать архив и установить mysql как службу.

Гайд по командной строке: https://gist.github.com/codedokode/10539568

Из этого ты можешь сделать вывод об уровне разработчиков Оракла. Сама MySQL хороший продукт, а инсталлятор отсттойный.
#506 #398501
>>398487

ну и кто под линуксом/маком, там ставится все из командной строки и проблемы нету.
4 Кб, 295x225
#507 #398515
>>398490
С предсказания

> mb_strtolower(trim($hash)); // everything might happen


проиграл. Готовишься к Чебурашке, вдруг, латиницу в хексах кириллицей заменят?..

Вот, объединил циклы, убрал count и конкатенацию: http://ideone.com/d5iy63 (может, ещё что-то можно было придумать, но я этот ваш php 5.6 только установил, до этого, стыдно признаться, 5.3 был). Да, твой вариант в целом лучше только вот ты забыл абстрактный класс PasswordElement, чтобы в будущем можно было использовать разные алфавиты и даже слова из словаря для некоторой позиции в пароле. Заодно пришлось бы сделать класс парсера, токена, чтобы шаблон пароля разгребать. И AlphabetBuilder, конечно же, куда же без него (ну там ->addRange, addCharacter, ->capitalize и т. д. Всё перечислил?.

Прошу прощения, если достал (ну и извини за некоторую долю троллинга, чего уж тут). Такие споры обычно по-другому и не кончаются. Всего хорошего.
#508 #398535
>>398515

Попробуй перебрать пароль из русских букв в utf-8. Твой код нерабочий.
#509 #398538
>>398499
А подскажи пожалуйста, как из архива сделать службу? Внутри мануалов никаких нет, просто распакованный, как я понял, MySQL.
Я бы хотел установить, как ты сказал - сам майскл и воркбенч.
#510 #398542
>>398538

как тут написано: http://malwselennaiaru.ru/182-ustanovka-mysql-na-windows.html

там есть команда типа

mysql --install что-то там еще
#511 #398552
>>398493

А ставить флажок правой кнопкой нельзя?

> И еще, как мне страничку перезагрузить? location.reload - не работает.



location.reload(скобки) по идее должно перезагружать страницу. Попробуй на отдельной странице просмотра .

Но лучше бы конечно без перезагрузки. Разве это сложно?

> for (var x = Math.max(0, posX - 1); x <= Math.min(7, posX + 1); x++) {


лучше наверно все же сделать через

if (this.cellExists( ...))

а то как-то некрасиво смотрится. Или хотя бы вынести сложные выражения в переменные.

> Field.prototype.openNullCells


Тут надо весь код внутри цикла заменить на вызов openCell(не спам) а то копипаста.

> this.changeState(не спам);


лучit явно указывать в какое состояние мы ставим клетку. И назвать получше, не state а isOpened.

Так, вообще, пока неплохо.
!ОП #512 #398553
Проверка( )
!ОП #513 #398554
О, скобки можно сделать, если поставить внутрь 2 звездочки: call()
#514 #398556
>>398535

> русских букв в utf-8


Предполагал, что ты заметишь. Рабочий, но ждать придётся очень долго намного медленнее твоего (будет брутиться вдвое больший charset, да ещё с дубликатами, и вдвое большее количество символов). Всегда приходится чем-то жертвовать.
Но даже если я сделаю "честную" поддержку UTF-8 (т.е., верну конкатенации, разобью charset на символы), то я всё равно буду значительно быстрее тебя. Только вот "честно и красиво" - это медленнее, чем две функции с копипастом ага-ага, качественный код. Одна быстрая и c поддержкой UTF-8, а другая ещё быстрее и без. Учитывая, что 82% паролей у русскоговорящих юзеров не содержат русских символов, оно того стоит. И это скорее худший случай: цифры меняются в зависимости от аудитории, на многих сервисах русскоязычные пароли вообще запрещены, а на некоторых, по неведомым мне причинам, вообще 1251 до сих пор. А ещё можно воспользоваться тем фактом, что у русскоязычных символов в UTF-8 всего два возможных префикса. Такие вот оптимизации. На этом, пожалуй, уж точно пора закончить. Добра.

Ты сейчас ешё вспомнишь, что пароли на PHP не подбирают, потому что он медленный? Да, на PHP не подбирают, зато на JS подбирают, на AS3 подбирают. С теми же самыми трюками, прямо в браузере.
110 Кб, 1020x329
#515 #398559
>>398542
Делаю как там, дошел до момента когда надо запустить как службу, захожу в службы, нажимаю запуск, а мне написало что программа не отвечает и я её не могу запустить и ничего сделать, даже кнопка запуска исчезла, втф?
#516 #398561
>>398496
http://sqlfiddle.com/#!2/0bf529/1/0
Вроде бы все учел. Только взаимные лайки все еще подзапросом считаются. Джойнить результат запроса - это же нормально?
sage #517 #398564
>>398561
В строке 7 не INNER, а LEFT.
почтибыстрофикс
67 Кб, 660x302
#518 #398566
>>398559
Через командную строку тоже не подключается , хотя подключалось.
Что за фигня.
#519 #398587
Оцените мой говнокод, анончики. Понимаю, что можно оптимизировать по памяти, но так вроде понятнее. Алсо, правильно содержимое массива указал, или лучше в строчку?
http://pastebin.ru/s8FJoByi
Вчерашний новичок
#520 #398588
Я, конечно, дебил. Но как запустить php код в sublime text? Нагугли пару мануалов, но они нихуя не работают. Использую sublime 3
#521 #398590
>>398588
Что значит "запустить код в sublime text"? Звучит как "как запустить код в блокноте?"
#522 #398591
>>398590
Блджад, ну не придирайся к словам.
#523 #398592
>>398591
Где я придираюсь? Я пытаюсь понять, что ты имел ввиду вообще в своем посте. Что значит запустить код в sublime text? Какого ты хочешь результата?
#524 #398593
>>398592
Я хочу, чтобы в разделе tools > build new ssystem появился пункт php, чтобы работало.
#525 #398594
>>398593
Я сам юзаю сублайм, запускаю как обычно, через браузер. Пхп можно запускать в сублайме? Не представляю, как это выглядит.
#526 #398595
>>398594
То есть, ты пишешь через сублайм, а запускаешь через ideone? Объясни сразу, пожалуйста.
#527 #398597
>>398595
Через айдеон? Нет. У тебя должен стоять сервер на компьютере, и запускать код в браузере нужно через локалхост.
#528 #398598
Парни, немного не в тему, но все же.
Надумываю учить питон, для веба, плюс еще можно применить в других областях. За универсальность уважаюб. Стоит ли тратить на это время?
Или для веба оптимальнее использовать рнр? Опять же с рнр имел опыт.
#529 #398599
>>398597
Нихуя не понял. Зделойте в факе пояснение по серверам, ide редакторам, прочему. Я вот нихуя не пойму, говнокодить вроде получается, уже на средних задачках, но писать в айдеоне невозможно.
#530 #398600
Тебе нужно установить сервер и пхп на него.
Я устанавливал вот по этому мануалу:
сам пхп
http://php-myadmin.ru/learning/instrument-php.html
Сервер
http://php-myadmin.ru/learning/instrument-apache.html
Еще в будущем тебе понадобится mysql, но пока и этого хватит. Запускается код, когда ты в браузере обращаешься по его адресу, то-бишь если у тебя файл test.php в папке локалхост, ты вбиваешь в адресную строку что-то вроде localhost/test.php, но ни в коем случае не "открыть с помощью".
#531 #398601
#532 #398604
>>398600
Алсо, есть еще готовые сборки, типа Xamp, где ничего настраивать не надо, но ОП не рекомендует ими пользоваться новичкам, он хочет, чтобы ты лишился девственности, ставя сервер.
#533 #398605
>>398593
http://pastebin.com/NgBEmTAs сохраняешь в <папка с sublime text 3>\Data\Packages\User\PHP.sublime-build, правишь путь в последних строках, пользуешься, не забывая выставлять кодировку исходника выставлять в UTF-8. Ctrl+B синтаксис, Ctrl+Shift+B выполнение.
#534 #398606
>>398605
Повторюсь: поставил убунту и все. Никаких проблем и сложностей.
#535 #398607
>>398606
А как же ИГРЫ? Уж лучше спермовором, чем ебаться с вашими ебунтами.
#536 #398609
>>398607
Я на старый комп поставил. Только ради решения задачек здесь, да.
#537 #398615
>>398566
>>398559
Бамп, осталось только СКЛ настроить и все, и он же и запоролся...
#538 #398623
>>398606

Последний раз, когда я поставил Убунту в виртуалку, она реагировала на клик мышью не меньше чем 10 секунд. Грузилась вообще минуты 2.

Там конечно памяти было немного, может 300-400 Мб, но Windows в аналогичной конфигурации работает нормально. Все, кроме Убунты в такой конфигурации работало нормально.

Конечно, выяснилось что проблема не столько в линуксе, сколько в том что Убунта в отсутствие видеокарты начала эмулировать эту видекарту на процессоре (очень медленно), но тем не менее.

Линукс я ставил и раньше, и в виртуальной машине, и на реальную, и всегда windows был роднее, привычнее, удобнее и быстрее.

Так что не всем совет «просто поставь убунту» подойдет.
#539 #398625
>>398556

Первый раз слышу про подбор паролей в браузере. Не представляю, зачем это может понадобиться. Школьнику-хакеру не хватило на видеокарту?

Есть же оптимизированные программы типа PasswordCracker, mdcrack и иже с ними. Ну и если есть видеокарта то там вообще скорость может быть очень хорошая (10 млрд md5 в секунду, и никто не запрещает тебе поставить много видеокарт в параллель). Плюс есть радужные таблицы, для них правда диск большой нужен, но зато простые хеши ломаются мгновенно.
#540 #398626
>>398556

Более того, я тут подумал еще и не смог придумать сценария, зачем вообще нужно вскрывать хеши.

>>398561

> Джойнить результат запроса - это же нормально?


Это нормально, но это по-прежнему подзапрос. Тут он конечно выполняется всего 1 раз, и это терпимо, но можно вообще без него обойтись и написать запрос значительно короче.
#541 #398627
>>398566

Это какой-то баг, что он у тебя завис в процессе запуска. Никогда с таким не сталкивался.

У тебя битность MySQL (32/64) соответствует битности ОС?

Посомтри в папке MySQL, нет ли каких логов с подробьностями.

Если служба до сих пор зависла, придется перезагрузиться или убить mysql.exe через диспетчер задач. Не забудь отключить автозапуск для службы.

После перезагрузки попробуй запустить MySQL не как службу, а из консоли:

mysqld --console

И посмотреть, запустится ли она и можно ли к ней подсоединиться. Если она все равно зависает, то можно попробовать скачать версию 5.5 напрмер.

Не сдавайся.

> Через командную строку тоже не подключается , хотя подключалось.


Потому что MySQL зависла в процессе запуска.
#542 #398630
>>398588

Ты можешь запускать код в консоли, для начала, как описано тут: https://gist.github.com/codedokode/7054af4a03865c4cc863

Гайд новичка по командной строке: https://gist.github.com/codedokode/10539568

Добейся чтобы код запускался в консоли. После этого ты сможешь настроить в саблайме BuildSystem, чтобы эту же команду можно было выполнять нажатием клавиши:

http://populyarno.com/web-razrabotka/php-build-system-ispolnyaem-skripty-php-v-sublime-text-2/

(это для саблайма 2, но не думаю что там что-то менялось). Не забудь все пути заменить на свои.

Если что-то не рабоатет, пиши в тред.
#543 #398632
>>398588

Если у тебя не установлен PHP, надо сначала его поставить, как описано в моей ссылкке выше.

>>398594

Ты запускаешь код через бразер и веб-сервер, но код можно запускать без этого, напрямую в консоли. Вот как тут в конце написано: https://gist.github.com/codedokode/7054af4a03865c4cc863
#544 #398637
>>398599

>пояснение


PHP может работать в двух как бы режимах:

- 1. отдельно
- 2. как часть веб-сервера, например Апач

В режиме 1 (отдельном) ты запускаешь скрипт, PHP его выполняет и ты видишь результат. Без лишних посредников. В таком режиме ты можешь запускать скрипт в консоли. ideone тоже работает в таком режиме: твой код он передает php на исполнение, а тебе показывает что тот вывел.

В режиме 2 (как часть сервера) ты должен установить еще и веб-сервер. Ты открываешь в браузере страницу, браузер шлет запрос, веб-сервер принимает запрос и запускает php-код, то что выведет код он отправляет в браузер, а он отображает.

В таком режиме php работает на сайтах. Например, на вконтакте.

При этом могут быть такие конфигурации:

- используется встроеннй в php веб-сервер (подробности: http://php.net/manual/ru/features.commandline.webserver.php )

- используется веб-сервер Апач, и PHP подключается к нему как модуль

- исплоьзуется веб-сервер nginx, и PHP запускается через php-fpm (это исплоьзуется на серверах)

- используется еще какой-нибудь другой веб-сервер и php запускается через php-fpm (php-fpm — это программа-надсмотрщик, которая запускает и убивает процессы-работники php по мере необходимости)

Наверно не очень понятное объяснение, так что можешь задавать вопросы если что-то непонятно.

Насчет редакторов и IDE: есть редакторы (Notepad++, SublimeText) и есть IDE (Eclipse PDT, Netbeans, PhpStorm). IDE отличаются большими возможностями:

— более умное автодоплнение (Sublime показывает все похожие слова из открытого файла, а IDE анализирует код и показывает варианты более точно)

— рефакторинг, например ты можешь выделить кусок кода и выбрать «вынести в функцию» и IDE сама выполнит это действие

— в IDE бывает встроен отладчик, которым можно выполнять код по шагам. смотреть содержимое переменных

Более подробно ты можешь прочитать например на сайте phpStorm: https://www.jetbrains.com/phpstorm/ — почитай, посмотри видео

Если ты умеешь эффективно пользоваться редактором или IDE, ты можешь писать код намного быстрее.
#544 #398637
>>398599

>пояснение


PHP может работать в двух как бы режимах:

- 1. отдельно
- 2. как часть веб-сервера, например Апач

В режиме 1 (отдельном) ты запускаешь скрипт, PHP его выполняет и ты видишь результат. Без лишних посредников. В таком режиме ты можешь запускать скрипт в консоли. ideone тоже работает в таком режиме: твой код он передает php на исполнение, а тебе показывает что тот вывел.

В режиме 2 (как часть сервера) ты должен установить еще и веб-сервер. Ты открываешь в браузере страницу, браузер шлет запрос, веб-сервер принимает запрос и запускает php-код, то что выведет код он отправляет в браузер, а он отображает.

В таком режиме php работает на сайтах. Например, на вконтакте.

При этом могут быть такие конфигурации:

- используется встроеннй в php веб-сервер (подробности: http://php.net/manual/ru/features.commandline.webserver.php )

- используется веб-сервер Апач, и PHP подключается к нему как модуль

- исплоьзуется веб-сервер nginx, и PHP запускается через php-fpm (это исплоьзуется на серверах)

- используется еще какой-нибудь другой веб-сервер и php запускается через php-fpm (php-fpm — это программа-надсмотрщик, которая запускает и убивает процессы-работники php по мере необходимости)

Наверно не очень понятное объяснение, так что можешь задавать вопросы если что-то непонятно.

Насчет редакторов и IDE: есть редакторы (Notepad++, SublimeText) и есть IDE (Eclipse PDT, Netbeans, PhpStorm). IDE отличаются большими возможностями:

— более умное автодоплнение (Sublime показывает все похожие слова из открытого файла, а IDE анализирует код и показывает варианты более точно)

— рефакторинг, например ты можешь выделить кусок кода и выбрать «вынести в функцию» и IDE сама выполнит это действие

— в IDE бывает встроен отладчик, которым можно выполнять код по шагам. смотреть содержимое переменных

Более подробно ты можешь прочитать например на сайте phpStorm: https://www.jetbrains.com/phpstorm/ — почитай, посмотри видео

Если ты умеешь эффективно пользоваться редактором или IDE, ты можешь писать код намного быстрее.
#545 #398639
>>398598

Лучше всего знать оба языка. А так, на PHP вакансий больше. Особенно для начинающих.

>>398599

Скачай и установи редактор кода или IDE и пиши в нем. также, поставь php как описано тут: https://gist.github.com/codedokode/7054af4a03865c4cc863 и запускай код у себя на компьютере.

На сайтах IDE обычно есть список полезных клавищ, а на ютубе можно найти видео всяких полезных приемов.
#546 #398641
Аноны, скоро переедем в новый тред. Быстро вы, за 9 дней в бамплимит вывели.

>>398604

У Опа еще есть FAQ по Апачу: https://gist.github.com/codedokode/10774100

Ну и поддержка в треде, отвечаем на вопросы.

>>398606

При чем тут вообще это? Sublime Text и PHP ничуть не хуже работают под виндой и маком.

Линукс конечно полезно рано или поздно изучить, но для этого хватит дебиана в виртуалке.

>>398609

Молодец. Я в своей работе часто сижу в консоли и знание консольных команд позволяет делать разные вещи. например, искать что-то в файлах на сервере, считать сколько раз слово встретилось в логе, и т.д.
!ОП #547 #398645
Аноны, я обновил и дополнил мануал по установке Апача: https://gist.github.com/codedokode/10774100 (оформленный в виде ответов на вопросы воображаемого анона).

Если вы им пользуетесь или недавно пользовались, напишите, все ли понятно, может я что-то забыл упомнянуть.
#548 #398661
>>398626

>но можно вообще без него обойтись


Попытка номер пять: http://sqlfiddle.com/#!2/0bf529/7/0
343 Кб, 1431x541
#549 #398691
>>398627
Вот что дала команда mysqld --console, служба как висела в состоянии запуска, так и висит.
#550 #398696
>>398645

Скажи пожалуйста, а как устанавливать связку апач-php на линукс? В сети есть всякие мануалы, и в них типа прописываешь пару комманд в терминале и всё, у тебя всё стоит. Что-то я к такому не привык. Возникает ощущение что это установка готовой сборки, ну а хочется типа научиться ставить с 0. Это оно и есть?
Алсо я пока не ставил, только вот сейчас буду. Линукс - Убунта на виртуалке (Virtualbox)
#551 #398697
>>398696

Алсо я в Линуксе полный нуб. Собственно до этого его не использовал даже.
14 Кб, 686x157
#552 #398703
А еще вот такая хуйня котаны.
когда в шинде прописываешь echo % % path % %, то получается что крайние знаки % лишние и он выводит % значение переменной %, стало быть ему нужно только echo % path %
Пикрилейтед, алсо пробелы между % что бы вакаба не прятала под спойлер.

А еще оп рекомендует в регулярках экранировать символы двумя слешами \\s \\w \\. и типа того, когда в документации написано что \s \w и тп. Почему так? Откуда пошло это разногласие?
#553 #398716
>>398697
sudo apt-get install apache2 php5
#554 #398724
>>398696

> В сети есть всякие мануалы, и в них типа прописываешь пару комманд в терминале и всё, у тебя всё стоит.



Так и есть. В Линукс никто не мучается с поиском офииального сайта, скачиванием, нажиманием кнопочем Далее. Просто ставишь любые программы пакетным менеждером (в Убунте и Дебиане это apt-get, в других дистрибутивах другой).

И это не сборка, а именно сами программы. В Убунте/дебиане надо написать лишь

sudo apt-get install php5 apache2

И потом также можно установить расширения к php если надо.

Ты можешь почитать про работу пакетного менеджера тут (рекомендуется):

http://help.ubuntu.ru/wiki/%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D0%BE_ubuntu_server/%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%B0%D0%BC%D0%B8/apt-get

http://help.ubuntu.ru/wiki/apt

> Линукс - Убунта на виртуалке


Советую кстати отключить графическую оболочку там если еще не отключил. Лучше настроить виртуалбокс чтобы он разрешал соединения внутрь и логиниться в систему по SSH c помощью PuTTY.

Вот описано как настроить виртуалбокс: http://eugenioz.blogspot.ru/2011/01/ssh-virtualbox.html

(насчет той части где про конфиги — я не уверен что это сработает).

Как отключить экран логина: http://www.steelrat.info/ubuntu/disabling-gui-on-ubuntu-startup/
#554 #398724
>>398696

> В сети есть всякие мануалы, и в них типа прописываешь пару комманд в терминале и всё, у тебя всё стоит.



Так и есть. В Линукс никто не мучается с поиском офииального сайта, скачиванием, нажиманием кнопочем Далее. Просто ставишь любые программы пакетным менеждером (в Убунте и Дебиане это apt-get, в других дистрибутивах другой).

И это не сборка, а именно сами программы. В Убунте/дебиане надо написать лишь

sudo apt-get install php5 apache2

И потом также можно установить расширения к php если надо.

Ты можешь почитать про работу пакетного менеджера тут (рекомендуется):

http://help.ubuntu.ru/wiki/%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D0%BE_ubuntu_server/%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%B0%D0%BC%D0%B8/apt-get

http://help.ubuntu.ru/wiki/apt

> Линукс - Убунта на виртуалке


Советую кстати отключить графическую оболочку там если еще не отключил. Лучше настроить виртуалбокс чтобы он разрешал соединения внутрь и логиниться в систему по SSH c помощью PuTTY.

Вот описано как настроить виртуалбокс: http://eugenioz.blogspot.ru/2011/01/ssh-virtualbox.html

(насчет той части где про конфиги — я не уверен что это сработает).

Как отключить экран логина: http://www.steelrat.info/ubuntu/disabling-gui-on-ubuntu-startup/
#555 #398725
>>398697

Тогда тебе надо отключить графику и перейти на работу в командной строке через протокол ssh программой PuTTY.

Вот гайд по командной строке для начинающих: https://gist.github.com/codedokode/10539568

После него можшь еще нагуглить какой-нибудь учебник по bash и утилитам вроде grep, head, cat и т.д. — пригодится.
#556 #398726
>>398661

Молодец, теперь все верно и лаконично.

В принципе, этого уже достаточно чтобы работать с базами данных, но советую потом почитать список того, что надо знать и изучить то, что еще не знаешь: https://gist.github.com/codedokode/10539213
#557 #398727
>>398691

Она там висит в списке из-за какой-то ошибки. То, что в консоли — запустилось успешно. То есть MySQL отдельно работает нормально, только как служба не работает.

Раз так, то у тебя вариант либо запускать mysql вручную (ты можешь поместить команду запуска в bat файлик чтобы запускать двойным кликом, а не руками). Либо удалить эту MySQL и попробовать скачать другую версию, постарше. В интернете пишут что в 5.5 такой проблемы нет.

>>398703

> стало быть ему нужно только echo % path %


Значит я ошибся. Бывает, спасибо за внимательность.

> А еще оп рекомендует в регулярках экранировать символы двумя слешами \\s \\w \\. и типа того, когда в документации написано что \s \w и тп. Почему так? Откуда пошло это разногласие?



По правилам регулярных выражений бекслеш один, верно. Но ты пишешь регулярное выражение внутри рhp-строки, а в ней бекслеши имеют особое значение тоже. Бекслеш является началом escape-последовательности. Например,

\n вставляет в строку символ переноса строки
\" вставляет двойную кавычку
\\ вставляет в строку бекслеш
...

Чтобы сделать строку из одного символа бекслеш, ты должен повторить его 2 раза:

$x = "\\";
echo $x; // выведет один бекслеш

Потому бекслеши надо удваивать.

Но тут есть особенность, если ты исплоьзуешь несуществующую escape-последовательность, например \d то php оставляет символы как есть. Потому

\d
\\d

работают одинаково. Можно проверить, сделав echo "\d"; echo "\\d"; — они выведут одно и то же (\d)

Многие по этой причине пишут бекслеш один раз.

А вот если ты хочешь найти бекслеш то все сложнее. По правлам регулярок ты должен написать так:

\\

но с учетом правил php каждый бекслеш надо удвоить и получается

\\\\

Такие дела. Алсо, вот мануал, почитай: http://php.net/manual/ru/language.types.string.php

Надеюсь я тебя не запутал.
#557 #398727
>>398691

Она там висит в списке из-за какой-то ошибки. То, что в консоли — запустилось успешно. То есть MySQL отдельно работает нормально, только как служба не работает.

Раз так, то у тебя вариант либо запускать mysql вручную (ты можешь поместить команду запуска в bat файлик чтобы запускать двойным кликом, а не руками). Либо удалить эту MySQL и попробовать скачать другую версию, постарше. В интернете пишут что в 5.5 такой проблемы нет.

>>398703

> стало быть ему нужно только echo % path %


Значит я ошибся. Бывает, спасибо за внимательность.

> А еще оп рекомендует в регулярках экранировать символы двумя слешами \\s \\w \\. и типа того, когда в документации написано что \s \w и тп. Почему так? Откуда пошло это разногласие?



По правилам регулярных выражений бекслеш один, верно. Но ты пишешь регулярное выражение внутри рhp-строки, а в ней бекслеши имеют особое значение тоже. Бекслеш является началом escape-последовательности. Например,

\n вставляет в строку символ переноса строки
\" вставляет двойную кавычку
\\ вставляет в строку бекслеш
...

Чтобы сделать строку из одного символа бекслеш, ты должен повторить его 2 раза:

$x = "\\";
echo $x; // выведет один бекслеш

Потому бекслеши надо удваивать.

Но тут есть особенность, если ты исплоьзуешь несуществующую escape-последовательность, например \d то php оставляет символы как есть. Потому

\d
\\d

работают одинаково. Можно проверить, сделав echo "\d"; echo "\\d"; — они выведут одно и то же (\d)

Многие по этой причине пишут бекслеш один раз.

А вот если ты хочешь найти бекслеш то все сложнее. По правлам регулярок ты должен написать так:

\\

но с учетом правил php каждый бекслеш надо удвоить и получается

\\\\

Такие дела. Алсо, вот мануал, почитай: http://php.net/manual/ru/language.types.string.php

Надеюсь я тебя не запутал.
#558 #398747
Сейчас буду делать эти шаблоны. http://jsbin.com/tomejibeve/1/edit?html,css,js,output . А так - все работает. Кстати, как сделать так, чтобы все не вырвиглазно выглядело? Какими сделать окошечки, цвет поля, ну ты понел. А то у меня с чувством прекрасного беда.
#559 #398748
>>398747
А, еще я не придумал, как новую игру начать. В голове только перезагрузка страницы.
135 Кб, 815x593
#560 #398752
>>398727
Вот попробовал заново, не получилось, выдает такое окошко, качал 64 битную 5.6 версию.
Сейчас гуглю ошибку 1053.
#561 #398764
>>398747
Я так понимаю _.template(tpl, data, options) нельзя из LoDash подключить?
#562 #398767
>>398752
>>398727
ОП, таки установил MySQL как службу!
Перезагрузил комп и она уже работает!
Единственное я 2 вещи сам сделал, когда делал завного - выключил брендмауэр (как я понял в нем была вся соль) и добавил директорию в параметры системы - и все заработало. Единственное, у меня апач работает через иконку запуска, надо погуглить чтобы и он как служба был.

Такой вопрос, получается я установил базовый набор пхп-программиста и мне еще надо установить какой-нибудь пхпмайадмин для удобного редактирования БД и все?
#563 #398773
>>398748

Пройтись по всем клеткам, очистить их, расставить мины, обновить отображение на экране. Если у тебя код разбит на функции, это должно быть не сложно.

>>398764

Можно, если ты понимаешь как она работает.
2 Кб, 209x202
#564 #398774
>>398747

кликаю в отмеченную клетку и пишет что проиграл. wtf?
#565 #398775
>>398747

Алсо, у тебя верстка странная. Например, зачем таблицу позиционировать абсолютно?

Кстати, абс. поз. элементы вырываются и потока — потом body имеет высоту 0 и выглядит как странная красная полоска.
#566 #398781

>>398747

Насчет оформления поля. Классический вариант ты можешь увидеть в программе Сапер которая встроена в windows: http://www.minesweepers.org/images/figures/figure04.gif

Но он конечно довольно старомодный, сделан в стиле середины 90-х.

Я немного порылся по Google Play, нашел там такие варианты оформления:

https://play.google.com/store/apps/details?id=net.ithinkdiff.minesweeper (плоский стиль)

https://play.google.com/store/apps/details?id=com.softbott.campominado (слегка объемные ячейки)

https://play.google.com/store/apps/details?id=com.fruits.games (вариант который с синими квадратиками на черном)

То есть, попробуй поиграть с цветами, эффектом выпуклости ячеек, может чуть скруглить края. Ну и обычно поле под ячейками как бы плоское, а не разделено черными линиями. И шрифт можешь поменять на шрифт без засечек попробовать, сделать его чуть больше и жирнее.

Насчет оформления окошка — тут можно взять за основу что-то из этого:

http://tympanus.net/codrops/2014/02/06/fullscreen-overlay-effects/ (посмотри там демо, плоский стиль)

http://www.jqueryscript.net/demo/Responsive-Accessible-jQuery-Modal-Plugin-Popup-Overlay/ (вариант который Basic аккуратно смотрится)

http://www.instantshift.com/2014/04/11/free-notification-box-psds/ (тут много вариантов)

Я часто ищу примеры поиском на dribbble (сайт где дизайнеры выкладывают свои работы): https://dribbble.com/search?q=popup+window
#566 #398781

>>398747

Насчет оформления поля. Классический вариант ты можешь увидеть в программе Сапер которая встроена в windows: http://www.minesweepers.org/images/figures/figure04.gif

Но он конечно довольно старомодный, сделан в стиле середины 90-х.

Я немного порылся по Google Play, нашел там такие варианты оформления:

https://play.google.com/store/apps/details?id=net.ithinkdiff.minesweeper (плоский стиль)

https://play.google.com/store/apps/details?id=com.softbott.campominado (слегка объемные ячейки)

https://play.google.com/store/apps/details?id=com.fruits.games (вариант который с синими квадратиками на черном)

То есть, попробуй поиграть с цветами, эффектом выпуклости ячеек, может чуть скруглить края. Ну и обычно поле под ячейками как бы плоское, а не разделено черными линиями. И шрифт можешь поменять на шрифт без засечек попробовать, сделать его чуть больше и жирнее.

Насчет оформления окошка — тут можно взять за основу что-то из этого:

http://tympanus.net/codrops/2014/02/06/fullscreen-overlay-effects/ (посмотри там демо, плоский стиль)

http://www.jqueryscript.net/demo/Responsive-Accessible-jQuery-Modal-Plugin-Popup-Overlay/ (вариант который Basic аккуратно смотрится)

http://www.instantshift.com/2014/04/11/free-notification-box-psds/ (тут много вариантов)

Я часто ищу примеры поиском на dribbble (сайт где дизайнеры выкладывают свои работы): https://dribbble.com/search?q=popup+window
#567 #398784
>>398767

> Такой вопрос, получается я установил базовый набор пхп-программиста и мне еще надо установить какой-нибудь пхпмайадмин для удобного редактирования БД и все?



Да. Кстати, мне больше нравится adminer — он новее и минималистичнее, хотя я уже давно им не пользовался, в основном командную строку юзаю. Также, есть отдельные программы типа sqlYog.

И никогда не выставляй в открытый доступ скрипты типа adminer, mysqladmin на боевых серверах — хакеры их найдут и взломают тебя.

> выключил брендмауэр (как я понял в нем была вся соль)


Кстати, может быть, он блокирует программу так как она пытается открыть порт. Надо тогда там добавить mysql в исключения или разрешить ей открывать порт 3306.

Или, что лучше, ты можешь в my.ini настроить чтобы он открывал порт не наружу для всех желающих, а только на внутреннем интерфейсе. Это делается опцией bind-address=127.0.0.1 (там наверно стоит 0.0.0.0 что значит слушать на всех интерфйесах).

Мне кажется, в этом случае брандмауэр не будет беспокоиться.
#568 #398786
>>398784
Поясни за открытый доступ?
Это права, типа 644/755 и т.д. или что?
#569 #398795
>>398786

Открытый доступ - это когда страницу с phpmyadmin можно открыть из браузера. То есть когда ты например на боевом сайте создаешь папочку http://example.com/myadmin и кладешь туда этот майадмин.

Во-первых, ты можешь по забывчивости оставить доступ к базе без пароля.

Во-вторых, в этих скриптах бывают уязвимости.

Я на сервере в логах сам видел обращения от ботов, которые искали phpmyadmmin на нем.

Потому если тебе надо сделать его доступным через интернет, закрой его хотя бы http-авторизацией через htpasswd. Так боты не пролезут.
#570 #398798
>>398795
Еще есть пара вопросов:
1. Какой ОС ты пользуешься?
2. Нормально через командную строку управлять БД? Я, просто, пользовался только через пхпмайадмин или админер, видел бд в командной строке только когда устанавливал майскл, выглядит не очень наглядно и нельзя сделать кучу быстрых операций.
#571 #398799
>>398786

Я посмотрел, уязвимости которые ищут боты, вроде были только в очень старых версиях, в новых про уязвимости неизвестно, но я бы все равно закрывал доступ, так безопаснее будет.

Там кстати еще и XSS уязвимости есть:

http://www.cvedetails.com/vulnerability-list.php?vendor_id=784&product_id=&version_id=&page=1&hasexp=0&opdos=0&opec=0&opov=0&opcsrf=0&opgpriv=0&opsqli=0&opxss=0&opdirt=0&opmemc=0&ophttprs=0&opbyp=0&opfileinc=0&opginf=0&cvssscoremin=0&cvssscoremax=0&year=0&month=0&cweid=0&order=1&trc=70&sha=1684a5bd4b3e54af4be87a9f8ae968b45c2673e4

Злоумышленник может подсунуть человеку, у которого есть доступ к myadmin, специальную ссылку, и при переходе по ней выполнится нужное злоумышленнику действие либо он получит данные для доступа. Или же в некоторых случаях хранящийся в базе яваскрипт может выполниться на странице myadmin.
#572 #398803
>>398798

Windows, но с cygwin (bash + портированные линуксовые утилиты для командной строки)

> Нормально через командную строку управлять БД?


Нормально. Когда надо что-то найти нестандартное, ты все равно будешь в своем майадмине писать sql-запрос.

Конечно для просмотра небольших таблиц графический интерфейс будет удобнее и нагляднее. И наверно для новичка проще.

Но на больших базах, где много таблиц, много данных и колонок, он по моему неудобен.

Плюс, в консоли если видишь что запрос тупит, его можно прервать, а как прервать запрос из браузера? даже если ты закроешь страницу, php-скрипт на сервере продолжит выполняться скорее всего.

Плюс, в консоли можно использовать транзакции, временные таблицы, а в phpmyadmin нет.

Ну не знаю, я как-то комфортно себя в консоли чувствую. А интерфейс phpmyadmin кажется перегруженным и содержит много лишнего.
#573 #398806
>>398803
Хм... Стоит ли мне тоже перейти на комндную строку?
Есть ли какие гайды?
У меня есть небольшой опыт в работе с БД, но есть.
#574 #398831
>>398724
>>398725

Вы так синхронно посоветовали мне отключить графику и настроить доступ через SSH. Но скажите зачем? Я вот установил линукс что бы научиться работать с ним, как бы. Поучить пользоваться коммандной строчкой и все такое. А вы как я понимаю советуете просто отрубить не нем графику, установить туда апач и пхп и сделать из него некий виртуальный сервер и коннектиться к нему с моей же винды? Я не тот анон у которого убунта дико тормозит на виртуалке, у меня все сносно. В общем я и не против для расширения кругозора все это сделть. Просто поясните мне в двух словах зачем. Хочется понимать больше.
#575 #398840
>>398774
Это я кое-что не так сделал, теперь норм вроде.
#576 #398851
Почему во всяких фреймворках пишут __DIR__.'/../test' вместо '../test'?
#577 #398860
>>398831

Чтобы научиться пользоваться командной строкой.

Если ты его используешь как сервер, зачем тебе графическая оболочка? Ни у Апача, ни у MySQL нет никакого графического интерфейса.

> пользоваться коммандной строчкой


Для командной строки не нужен графический интерфейс.

> Я вот установил линукс что бы научиться работать с ним, как бы.


В смысле, научиться запускать браузер и копировать файлы перетаскиванием? Там же изучать нечего, это все очевидно.

Ну как хочешь, дело твое.
#578 #398863
>>398860

Ну в принципе, можешь и не удалять если не хочешь. По ssh ты к нему сможешь подключиться в любом случае.
#579 #398864
>>398806

Ну вот есть такой гайд из 3 частей для начала:

http://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html
#580 #398865
>>398851

> вместо '../test'?


Потому что это ненадежно и в половине случаев не работает. Кто тебе сказал что так можно писать?

_ _ DIR _ _ указывает на каталог в котором находится текущий файл.

../test ищет файл в текущей директории и в include_path, соответственно нет никаких гарагтий что он его найдет. То, что иногда это работает — это везение и случайное совпадение текущей директории с той в которой файл.
#581 #398879
>>398863

Оке, я проделаю всё это, ведь можно все вернуть всегда?
#582 #398895
>>398773
http://jsbin.com/pituhecixo/1/edit?html,js,console,output - пока не работает, у меня есть вопрос. В Util.showWindow() я поместил метод по созданию нового поля, но как мне контекст поля туда притащить? Ведь событие на кнопку я смогу повесить только внутри Util.showWindow(), в основной программе кнопки не видно, т.к она еще не создана.
#583 #398897
>>398865

> То, что иногда это работает — это везение


Чушь. Директория, содержащая файл, сделавший include, проверяется всегда.
#584 #398904
Котаны, в общем такое дело. Пока все равно не стал удалять гуи на убунте и сижу разбираюсь. Сначала пытался понять где тут вообще менюха приложений и терминал. Потом нашел. Установил апач с помощью

sudo apt-get update

sudo apt-get install apache2

далее в мануале предлагают узнать ip хоста
с помощью комманды
ifconfig eth0 | grep inet | awk '{ print $2 }'

оке, выводит вместо стандартного 127.0.0.1 адрес 10.0.2.15 - это что такое? Локалхост виртуалбокса?
Из браузера на виртуалке заходит прекрасно и пишет что It works!
но на виртуалке и 127.0.0.1 тоже самое показывает, втф?
А из виндового браузера 10.0.2.15 не открывается уже просто так. Требует логин и пароль. Причем данные юзера Убунты не подходят. Такие дела? Что вообще я делаю?
#585 #398909
>>398895

> В Util.showWindow() я поместил метод по созданию нового поля


Это неприавльно. С какой стороны функция показа окна должна создавать какие-то поля?

Передавай в функцию showWindow функицю, которая вызвается при нажатии на кнопку.
#586 #398911
Еще такая штука.
ввел в терминале exit
и все зависло. Вообще виртуалка перестала реагировать на любые мои действия. что за фигня?
#587 #398915
>>398904

Я же скидывал ссылку, но ты видимо ее не прочел или не разобрался.

Хост - это твой компьютер. Гость — это система в виртуалке.

Вот описание как работает сеть в виртуалбокс:

https://www.virtualbox.org/manual/ch06.html (англ)
http://rus-linux.net/MyLDP/vm/VirtualBox-networking.html (перевод)

Смотри, у виртуалки по умолчанию создается один (тоже виртуальный) сетевой интерфейс, в режиме nat. Все пакеты с него перехватываются сетевой подсистемой VirtualBox на хосте и отправляются в интернет от его имени. А то, что придет в ответ, передается на сетевую карту виртуалки. При этом хост переписывает IP-адреса в пакетах как требуется. То есть VirtualBox работает как роутер для гостя.

Но с использованием NAT извне нельзя никак установить соединение с гостем. Все соединения инициируются только им.

Ты не можешь в таком режиме соединиться с Апачом в госте.

Отключить NAT тоже нельзя так как тогда гость потеряет выход в интернет.

Что делать? Надо добавить гостю вторую сетевую карту, в режиме Host-only networking. В этом режиме на хосте создается виртуальный сетевой интерфейс, и он соединяется в вирутальную локальную сеть с сетевой картой гостя. У этой карты есть IP-адрес, с помощью которого ты можешь соединиться с сервером на госте. Через эту сеть хост и гость могут соединяться друг с другом (но пи этом эта сеть не имеет связи с интернетом потому NAT тоже должен быть включен).

Создать виртуальную сетевую карту мало. Ты еще должен объяснить ОС гостя что ее надо задействовать и пакеты на Ip-адрес твоего компьютера должны идти через нее, а все остальные через NAT. Для этого надо настроить гостевую ОС.

Вот ссылка на мануал: http://eugenioz.blogspot.ru/2011/01/ssh-virtualbox.html

Там как раз создается сначала вторая сетевая карта для гостя, а потом она настраивается в ОС гостя.

> далее в мануале предлагают узнать ip хоста


> с помощью комманды


лучше бы просто набрать ifconfig, а то эта команда криво и ненадежно вырезает ip адрес из текста.

> А из виндового браузера 10.0.2.15 не открывается уже просто так. Требует логин и пароль. Причем данные юзера Убунты не подходят.


Это ты к кому-то в твоей локалке подсоединяешься. Тот адрес который тебе пишет Убунта — это ее адрес за NAT, в виртуальной сети, между ей и сетевой подсистемой Virtual Box, и в которую ты с хоста не имеешь доступа.

Там должен быть адрес типа 192.168.56... по моему.
#587 #398915
>>398904

Я же скидывал ссылку, но ты видимо ее не прочел или не разобрался.

Хост - это твой компьютер. Гость — это система в виртуалке.

Вот описание как работает сеть в виртуалбокс:

https://www.virtualbox.org/manual/ch06.html (англ)
http://rus-linux.net/MyLDP/vm/VirtualBox-networking.html (перевод)

Смотри, у виртуалки по умолчанию создается один (тоже виртуальный) сетевой интерфейс, в режиме nat. Все пакеты с него перехватываются сетевой подсистемой VirtualBox на хосте и отправляются в интернет от его имени. А то, что придет в ответ, передается на сетевую карту виртуалки. При этом хост переписывает IP-адреса в пакетах как требуется. То есть VirtualBox работает как роутер для гостя.

Но с использованием NAT извне нельзя никак установить соединение с гостем. Все соединения инициируются только им.

Ты не можешь в таком режиме соединиться с Апачом в госте.

Отключить NAT тоже нельзя так как тогда гость потеряет выход в интернет.

Что делать? Надо добавить гостю вторую сетевую карту, в режиме Host-only networking. В этом режиме на хосте создается виртуальный сетевой интерфейс, и он соединяется в вирутальную локальную сеть с сетевой картой гостя. У этой карты есть IP-адрес, с помощью которого ты можешь соединиться с сервером на госте. Через эту сеть хост и гость могут соединяться друг с другом (но пи этом эта сеть не имеет связи с интернетом потому NAT тоже должен быть включен).

Создать виртуальную сетевую карту мало. Ты еще должен объяснить ОС гостя что ее надо задействовать и пакеты на Ip-адрес твоего компьютера должны идти через нее, а все остальные через NAT. Для этого надо настроить гостевую ОС.

Вот ссылка на мануал: http://eugenioz.blogspot.ru/2011/01/ssh-virtualbox.html

Там как раз создается сначала вторая сетевая карта для гостя, а потом она настраивается в ОС гостя.

> далее в мануале предлагают узнать ip хоста


> с помощью комманды


лучше бы просто набрать ifconfig, а то эта команда криво и ненадежно вырезает ip адрес из текста.

> А из виндового браузера 10.0.2.15 не открывается уже просто так. Требует логин и пароль. Причем данные юзера Убунты не подходят.


Это ты к кому-то в твоей локалке подсоединяешься. Тот адрес который тебе пишет Убунта — это ее адрес за NAT, в виртуальной сети, между ей и сетевой подсистемой Virtual Box, и в которую ты с хоста не имеешь доступа.

Там должен быть адрес типа 192.168.56... по моему.
#588 #398917
>>398911

>ще такая штука.


>ввел в терминале exit


>и все зависло. Вообще виртуалка перестала ре


Это баг. Не должно зависать.
#589 #398919
>>398897

Да, ошибочка вышла. Но все равно с DIR получается надежнее так как путь к файлу указан явно. А без абсолютного пути проверяются каталоги в include_path.

Как все в PHP запутанно.
#590 #398920
Насчет пхп есть вопрос.
Где смотреть/изучать методы/подходы которые можно применить в реализации всякой хуйни? Например пагинация, я без понятия на данный момент как организовать это, не считая взять готовый скрипт.
#591 #398927
>>398904

> А из виндового браузера 10.0.2.15 не открывается уже просто так. Требует логин и пароль. Причем данные юзера Убунты не подходят.


Добавлю еще комментарий. Вот смотри, ты подключен в интернет через провайдера. Вряд ли у тебя есть белый внешний IP, скорее у тебя приватный IP типа 10.x.x.x.

Сеть выглядит так:

(ты 10.x.x.x) <-- локалка провайдера --> (10.y.y.y шлюз с NAT a.b.c.d) <-- интернет

Шлюз, как ты видишь имеет 2 сетевых карты с 2 IP адресами, одна карта в локальной сети с приватным IP, другая в интернете c публичным. Таким образом, вся сеть снаружи видна как 1 узел с 1 IP адресом.

В этом случае твои пакеты идут по локалке до шлюза провайдера, он их перехватывает, заменяет в них обратный IP адрес с твоего на a.b.c.d и отправляет в интернет. А с приходящими пакетами делает обратную операцию.

Извне из интернета ты никак не можешь соединиться с твоим компьютером в локалке так как она не имеет прямого соединения и локальные компьютеры в интернете не видны.

Так вот, между хостом и гостем организован такой же NAT.

(гостевая ос 10.x.x.x.) <-- --> (10.y.y.y Сетевая подсистема VirtualBox) <-- --> (локалка)

И гость для тебя находится за НАТом и не виден так же как ты не виден из интернета.

Потому для тебя и для гостя 10.x.x.x — это разные Ip адреса, соответствующие разным узлам.
#592 #398932
>>398904

> выводит вместо стандартного 127.0.0.1


Набери ifconfig и увидишь все в том числе 127.0.0.1. В компьютере есть несколько сетевых интерфейсов.

Например у тебя скорее всего их минимум два:

- локальный интерфейс loopback c адресом 127.0.0.1. Это как бы виртуальная сетевая карта, пакеты с которой не уходят в сеть, а остаются на компьютере

- сетевой интерфейс соответствющий реальной сетевой карте с Ip-адресом типа 10.x.x.x. Это твой внешний Ip-адрес, видимый с других компов в локалке. C него пакеты уходят в сеть и приходят на него.

Также и в виртуальной машине, есть loopback интерфейс и есть интерфейс eth0 с 10.x.x.x. Ну и ты еще должен настроить второй интерфейс eth1 c адресом типа 192.168,x,x
#593 #398934
>>398920

В фреймворках, например Yii2, Symfony 2

Также у меня есть список полезных библиотек на все случаи жизни: https://github.com/ziadoz/awesome-php
#594 #398936
>>398920

Пагинация обычно реализуется так, что передается номер страницы:

/getsomething?page=3

и в скрипте в SQL запрос добавляется LIMIT :limit, :offset вычисленный на основе номера страницы.
8 Кб, 571x93
#595 #398992
Если я эти столбцы сделаю оба первичными, я избегу повторений в таблице?
#596 #399025
>>398992

Ты не можешь сделать 2 первичных ключа (так как первичный ключ может быть только один). Но ты можешь сделать 1 первичный ключ из 2 колонок.

Первичный ключ является уникальным по определению так что да, повторно ту же пару значений вставить будет нельзя.
#597 #399044
>>398909
http://jsbin.com/vacowuvubu/1/edit?html,js,console,output - что мне делать, я там чтобы начать новую игру, тащу через несколько функций контекст, также неправильно?
#598 #399045
>>399044

Не, лучше сделать так:

// В Field или где-то еще
Util.showWindow('you-win', function () {
// вызовется при нажатии кнопки
....
});

Соответственно класс Util ничего не знает о том что делать при нажатии кнопки, он просто вызвает функцию.
#599 #399058
>>399045
http://jsbin.com/cufegazoje/1/edit?js,output - что-то пошло не так
!ОП #600 #399063
Аноны, переходите в новый, 35-й тред: >>399059

>>399058

А что именно? Я не понял.
!ОП #601 #399156
Аноны, я предлагаю открыть рубрику «задачи с собеседований». В ней мы можем посмотреть на задачи с собеседований и попробовать их решить.

Для начала пару задач, которые я увидел в соседних разделах:

> Я на собеседовании не смог сделать алгоритм поиска двух наибольших элементов в массиве.


Собственно, задача, дан массив чисел, найдите 2 наибольших. Решать можно на JS или PHP, кому что роднее.

> Напишите алгоритм сортировки


Дам массив чисел, отсортируйте по возрастанию без использования стандартной функции sort() и подобных. на JS/PHP.

Вот еще задачки с собеседований, на JS/HTML: http://company.yandex.ru/job/vacancies/devint_kinopoisk.xml

Кто хочет может порешать, а я соответственно могу проверить или дать подсказку. Готовых решений в нашем треде ОП никогда не дает, если кто тут новенький, но зато дает подсказки.
#602 #399833

> test


> test


test
45 Кб, 1146x391
46 Кб, 1154x396
48 Кб, 1163x401
#603 #400041
Создавал таблицу через MySQL Workbench. Три представленные таблицы - связующие многие-ко-многим. Вот только почему во всех трех в ограничениях внешнего ключа всё разное, по понятно. Да, и что там нужно прописать, чтобы юаза понимала, что это связь многие-ко-многим?
Тред утонул или удален.
Это копия, сохраненная 16 ноября 2014 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски