Вы немного не в ту степь, либо я о другом писал, и друг друга не поняли. То, о чем вы говорите, и так замечательно работает в рамках хабра. Хочется мнения — пожалуйста, создавайте топик и ждите обсуждений. Можно, конечно, сделать и отдельный блог.
Я же говорил именно о модели бизнес-линча в том виде, в котором это придумано Лебедевым, т.е. именно экспертная (тут «эксперт» и «культ личности» попрошу различать) оценка. Кому-то хочется просто грамотного и аргументированного мнения одного-двух специалистов и профессионалов, отцов, если хотите. Мнение людей, подкрепленное опытом, образованием, а не любителей.
На примере дизайна — дизайн — это то, что [якобы] умеют и знают все. Также как футбол или политика — каждый горазд давать советы. Это неплохо, в споре рождается истина, как известно. Но у традиционное образование все же подразумевает наличие учителя или наставника, который должен направить в нужное русло, хотя попутно можно со сверстниками «креативить» и искать нетрадиционные подходы (но только после того, как сказали «как надо» и когда есть хорошая база знаний).
Увидев название топика, я тоже вспомнил своего массажиста — он мне как раз тоже рассказывал про пользу отжиманий и даже предложил хотя бы просто отжиматься, если совсем лень. А про тренажерные залы сказал, что нужно обходиться весом собственного тела, а не зависеть от железа, т.к. в зал не всегда можно сходить, а зарядку с утра делать ничто кроме лени не мешает.
Почему популярен бизнес-линч Лебедева? Потому рецензенты — люди уважаемые и с большим авторитетом в веб-разработке. Как бы к САЛ и самому Лебедеву не относились, с его мнением считаются (ну или как минимум интересуются), за его работами следят и его рецензии ценят.
Чтобы получить аналог бизнес-линча (в этом есть смысл, т.к. по одной рецензии в день на весь рунет явно не хватает), нужно для начала собрать (например, с помощью голосования) такую же команду рецензетов, чье мнение будет уважаемым. Формат оценки в комментариях тут точно не подойдет — это превратится просто в публичную критику с огромным количеством противоположных мнений. Нужно мнение именно экспертов, желательно разделить экспертов по отраслям. А перед тем, как эксперты начнут оценивать, их должны узнать и признать их экспертовский авторитет.
«Немного» ошиблись аудиторией, точнее просчитались. Интернет — не телевизор. Люди, сидящие здесь, в большинстве своем не смотрят Малахова и очередной сериал с бездарным актерами. Здешнее «быдло» привыкло самостоятельно выбирать информацию и формировать собственное мнение о происходящем.
Радует, что есть еще хоть что-то и кто-то, неподвластное деньгам.
Можно ли пользоваться MySQL-сервером из «сторонних» сетей?
Ответ: Это возможно при помощи ssh-тунелирования.
Для этого вам необходимо:
Подключится к ssh.login.nichost.ru порт 22 настроив предварительно тунель на сервер login.mysql:3306 и порт 3306, где login это индитификатор хостинга. Затем ввести логин для ssh-соединения и пароль.
После чего вы можете удаленно подключиться к БД указав в качесве сервера localhost порт 3306 тип подключения прямое.
Для ssh тунелирования можем вам посоветовать использовать программу PuTTY
Для организации тунеля необходимо:
В левом окне программы перейти в закладку Connection -> SSH -> Tunnels
В поле «Source port» ввести 3306 а в поле «Destination» ввести login.mysql:3306, где login это ваш индитификатор хостинга.
Нажать кнопку «add». Далее перейти в закладку «Session» и ввести в поле «Host Name» ssh.login.nichost.ru. Далее в поле «Saved Session» ввести название подключения и нажать «Save».
Для входа достаточно двойного клика мыши на названии сессии.
Можно настроить тунелирование с помощью SSH, таким образом можно коннектиться удаленно к серверу БД на хостинге, где разрешен доступ только с localhost. Описание есть в разделе «Помощь» на hosting.nic.ru
По ссылке про declare интересная информация про отладку скрипта. В частности, в комментариях к функции приводится пример, как можно проанализировать время выполнения каждой функции.
У кого-нибудь реализован класс с хорошей функциональностью для этих целей?
Пишу откровенный оффтоп, но лишь по причине, что не хватает кармы для публикации, чтобы хоть кто-то заметил проблему…
Наткнулся, как мне кажется на баг, ну или как минимум особенность PHP, связанную с конкатенацией строк.
1. $a = $a. $b;
2. $a .= $b;
Первый вариант выполнятеся в сотни раз дольше.
Строка $b должна быть не менее 40 символов, чтобы заметить результат. Количество итераций — порядка 10000.
Причем при изучении этого вопроса выяснилось, что синтаксическое усложнение либо увеличение длины присоединяемой строки сильно влияет на скорость в первом случае, и гораздо меньше во втором.
Вот кусок кода, которые каждый может проверить у себя сам:
Пожалуйста, опубликуйте это в соответствующем разделе. Может быть гуру PHP давно знают, как быстрее и правильнее делать простейшие операции, а вот новичкам будет точно интересно.
Если перед автором серьезно стоит проблема нарезки и настройки шаблона в ЦМС, то рекомендую хотя бы просто ознакомиться с такой вещью как TemplaVoila в CMS/CMF TYPO3. Нарезка в фотошопе + TemplaVoila не сложнее того, что предлагает автор, с той лишь разницей, что в TYPO3 этот инструмент уже не первый год успешно используется многими профессионалами.
Я думал об этом. Решается проверкой буфера наверное ))
А вообще идея все-таки фигня, написаная от недосыпа :), т.к. все равно потом нужно что-то отсылать серверу и получать ответ. И боту не нужно эмулировать никакие события, достаточно просто послать на сервер то, что нужно.
Пользователя от бота отличает еще и сам процесс набора текста и те события, которые при этом наступают в браузере. При этом для отсеивания ботов не нужно пользователя утруждать лишними действиями - он просто делает то, что ему нужно - заполняет форму.
Реализовать это можно, на мой взгляд так: мы к каждому элементу формы добавляем обработчик события, например onKeyDown. Когда это событие наступает, мы добавляем символ, соответсвующий нажатой клавише, к строковой переменной JavaScript и тут же сверяем обновленное значение переменной с текущим значением в поле. Такая сверка позволит исключить ситуацию, если бот все-таки "догадается" проанализировать функцию, которая должна выполняться по этому событию, и выполнить необходимые действия.
P.S. Если JavaScript отключен, то выдаем стандартную стойкую "каптчу".
Жду ваших возражений и способов обхода этого алгоритма ботом (как сэмулировать нажатие клавиши?). Если же алгоритм можно обойти, можно подумать над его усложнением, чтобы увеличить затраты на обучения бота.
Сейчас стоит задача парсить нн-ое количество сайтов с целью извелчения однотипной информации. Допустим, извлечение каталога из различных интернет магазинов. Родилась идея вот такого проектика.
Проект универсального парсера.
Предлагаемый алгоритм работы.
1. Из исходного файла формируется форматированный исходный код с подстветкой синтаксиса в виде HTML (см. пример модуля templavoila в typo3).
Любой тэг из текста исходника заключается в , при клике на который определяется его путь (XPath) в структуре DOM.
2. Пользователь добавляет новый ресурс, указав адрес страницы и указав имя, под которым будут храниться конкретные настройки парсера именно этого ресурса.
2.1 После указания стартовой страницы парсинга пользователю выводятся обработанные исходники этой страницы в соотвествеии с п.1.
Здесь он выбирает (просто кликнув по имени тэга) ближайший контейнер, который содержит данные для парсинга.
Дальнейшая работа будет осуществляться только внутри этого контейнера, весь остальной HTML-документ во внимание не будет браться.
2.1.1 Каждый раз при запуске парсинга каждого ресурса необходимо проверять, что путь к контейнеру не изменился (точнее, что такой контейнер вообще существует).
Если это не так, то нужно уведомлять пользователя о том, что исходный код страницы изменился, поэтому необходимо перенастроить парсер, иначе будут извлечены неверные данные со страницы.
В будущем имеет смысл сделать более продвинутую проверку
(например отслеживать, чтобы на одном уровне в дереве элементов не появился одноименный элемент,
или тем более элемент с одинаковым id!, или сообщать об изменениях внутренней структуры первого вложенного уровня контейнера)
2.2 Далее в проект добавляются объекты для парсинга. Предполагается 2 типа объектов:
а) Одиночные. Парсер просто ищет внутри контейнера по XPath нужный объект и извлекает требуемые данные.
б) Повторяющиеся. Пользователь указывает на один из повторяющихся объектов, а парсер на этом же уровне отбирает все одноименные объекты. (Например это могут быть строки ).
* внутри повторяющегося объекта обязательно указывается один или несколько одиночных объектов.
* допустима вложенная структура повторяющихся объектов
* допустима вложенная структура одиночных объектов
2.3.
Каждый одиночный объект имеет XPath и путь в базе данных, куда его необходимо сохранить (для краткости назовем его DBPath, формат произвольный).
В настройках контейнера должен быть указан столбец для хранения уникальных Id новых записей (должен быть AUTO_INCREMENT, вообще его лучше определять автоматом (Primary key), и если такого поля нет, нужно предложить создать его).
Одиночным объектом может быть или содержимое тэга, или его атрибут.
DBPath добавляется с помощью выбора пользователем из разворачивающегося списка таблицы и столбца, из БД, указанной в настройках ресурса. Из всех полей необходимо делать фильтр по типам
и оставлять только те, которые подходят для хранения выбранных данных (например, нельзя сохранить текст в столбце с типом INT).
В дополенение третья разновидность одиночного объекта - файл по ссылке. В этом случае пользователю предлагается указать из всех элементов тот, который является ссылкой на файл.
В форме указания DBPath должны быть только поля типа BLOB, если в настройках указано сохранять файлы в БД, или в противном случае -
строковые поля нужной длины, чтобы уместилось уникальное сгенерированое имя файла, под которым будет сохранен загруженный файл в каталоге, указанном в настройках.
2.4. При добавлении нового объекта внутрь существующего, необходимо указать, каким образом хранить данные в БД. Возможно 2 варианта:
а) Дочерний элемент хранится в той же таблице, что и родительский, но с указанием pid (parent id). В этом случае при создании вложенного объекта необходимо
указать столбец для хранения pid (это делается один раз при создании первого вложенного объекта).
б) Дочерний элемент хранится в отдельной таблице. В этом случае каждый раз при создании вложенного объекта указывается:
- таблица, в которую будут поступать данные
- Primary Key этой таблицы (лучше определять автоматом, а если он не создан, то предлагать создать)
- столбец Foreign Key, куда будет записываться Primary Key родительской таблицы
Уважаемый автор, вы меня извините, но ваша программа — просто ппц !
Дайте вы людям, которые ее еще не купили, спокойно и нормально с ней ознакомиться, а не задалбывать его постоянным напоминанием да еще в такой навязчиваой форме, что надо оплатить программу!!
Поддавшись вашей умелой рекламе я из любопытсва скачал программу и решил попробовать. Разминка и первые ознакомительные упражнения занимают времени минут 15, за это время было показано более ТРИДЦАТИ напоминаний о покупке программы и куча текста про ее создателей! Мне совершенно не интересно 35 различных мнений создателей программы или тех, кто ей пользовался! Оставьте это для рекламных компаний! Если я скачал программу, значит мне уже инетересно, хватит мне промывать мозг! Куда делась ваша хваленая забота о времени, если вы просто вынуждаете читать уйму ненужного мне текста, перед каждым упраженнием. А ведь совсем его пропускать тоже неправильно, т.к. там встречается полезные рекомендации к самому упражнению. Не заставляйте пользователя фильтровать глазами эти рекомендации из кучи ваших шуток и прибауток, оставьте суть!
Я конечно понимаю, что 150р. сумма куда более разумная и заплатить ее может любой (собственно на массовость и расчитано), но не будет никто платить сразу, пока не ознакомятся.
Программу не куплю теперь уже из приницпа. Пиратской версией тоже пользоваться не буду — неудобно, выкиньте прелюдии, оставьте суть!
Есть подозрения, что подобная особенность уже давно используется в контекстной рекламе. Не раз было замечено, что Begun или Яндекс.Директ чудеснейшим образом показывают те объвления, которые очень близки к тематике сайтов, на которых пользователь побывал ранее.
Отличный стартап, хочется пожелать ему и его разработчикам успехов.
Было бы не плохо сделать группировку по тематикам, чтобы можно было формировать группы по интересам и заниматься переводом того, что нужно самим. Например, открыть группу TYPO3, залить туда самую важную документацию и предложить всем заинтересованным программистам на форуме typo3 помогать в свободное время переводом.
1. Куда потом будут деваться переведенные тексты? Будет ли архив переводов?
2. Можно ли будет в дальнейшем заливать книги в HTML или других форматах с иллюстрациями, схемами, чтобы сделать полноценный перевод "под ключ" :)? Хотя, наверное, сервис не до этого. Пусть книжку потом уже склеивает ответственный за конкретный перевод человек.
Я же говорил именно о модели бизнес-линча в том виде, в котором это придумано Лебедевым, т.е. именно экспертная (тут «эксперт» и «культ личности» попрошу различать) оценка. Кому-то хочется просто грамотного и аргументированного мнения одного-двух специалистов и профессионалов, отцов, если хотите. Мнение людей, подкрепленное опытом, образованием, а не любителей.
На примере дизайна — дизайн — это то, что [якобы] умеют и знают все. Также как футбол или политика — каждый горазд давать советы. Это неплохо, в споре рождается истина, как известно. Но у традиционное образование все же подразумевает наличие учителя или наставника, который должен направить в нужное русло, хотя попутно можно со сверстниками «креативить» и искать нетрадиционные подходы (но только после того, как сказали «как надо» и когда есть хорошая база знаний).
Чтобы получить аналог бизнес-линча (в этом есть смысл, т.к. по одной рецензии в день на весь рунет явно не хватает), нужно для начала собрать (например, с помощью голосования) такую же команду рецензетов, чье мнение будет уважаемым. Формат оценки в комментариях тут точно не подойдет — это превратится просто в публичную критику с огромным количеством противоположных мнений. Нужно мнение именно экспертов, желательно разделить экспертов по отраслям. А перед тем, как эксперты начнут оценивать, их должны узнать и признать их экспертовский авторитет.
Радует, что есть еще хоть что-то и кто-то, неподвластное деньгам.
Ответ: Это возможно при помощи ssh-тунелирования.
Для этого вам необходимо:
Подключится к ssh.login.nichost.ru порт 22 настроив предварительно тунель на сервер login.mysql:3306 и порт 3306, где login это индитификатор хостинга. Затем ввести логин для ssh-соединения и пароль.
После чего вы можете удаленно подключиться к БД указав в качесве сервера localhost порт 3306 тип подключения прямое.
Для ssh тунелирования можем вам посоветовать использовать программу PuTTY
Для организации тунеля необходимо:
В левом окне программы перейти в закладку Connection -> SSH -> Tunnels
В поле «Source port» ввести 3306 а в поле «Destination» ввести login.mysql:3306, где login это ваш индитификатор хостинга.
Нажать кнопку «add». Далее перейти в закладку «Session» и ввести в поле «Host Name» ssh.login.nichost.ru. Далее в поле «Saved Session» ввести название подключения и нажать «Save».
Для входа достаточно двойного клика мыши на названии сессии.
У кого-нибудь реализован класс с хорошей функциональностью для этих целей?
Наткнулся, как мне кажется на баг, ну или как минимум особенность PHP, связанную с конкатенацией строк.
1. $a = $a. $b;
2. $a .= $b;
Первый вариант выполнятеся в сотни раз дольше.
Строка $b должна быть не менее 40 символов, чтобы заметить результат. Количество итераций — порядка 10000.
Причем при изучении этого вопроса выяснилось, что синтаксическое усложнение либо увеличение длины присоединяемой строки сильно влияет на скорость в первом случае, и гораздо меньше во втором.
Вот кусок кода, которые каждый может проверить у себя сам:
<? php
$a = NULL;
$b = «Довольно длинная строка, символов эдак 40»;
$start = getmicrotime();
for($i=0;$i<10000;$i++) {
$a = $a. $b;
}
$end = getmicrotime();
$time = $end — $start;
echo $time.«
»;
$a = NULL;
$b = «Довольно длинная строка, символов эдак 40»;
$start = getmicrotime();
for($i=0;$i<10000;$i++) {
$a .= $b;
}
$end = getmicrotime();
$time = $end — $start;
echo $time;
function getmicrotime()
{
list($usec, $sec) = explode(« „, microtime());
return ((float)$usec + (float)$sec);
}
?>
Пожалуйста, опубликуйте это в соответствующем разделе. Может быть гуру PHP давно знают, как быстрее и правильнее делать простейшие операции, а вот новичкам будет точно интересно.
А вообще идея все-таки фигня, написаная от недосыпа :), т.к. все равно потом нужно что-то отсылать серверу и получать ответ. И боту не нужно эмулировать никакие события, достаточно просто послать на сервер то, что нужно.
Реализовать это можно, на мой взгляд так: мы к каждому элементу формы добавляем обработчик события, например onKeyDown. Когда это событие наступает, мы добавляем символ, соответсвующий нажатой клавише, к строковой переменной JavaScript и тут же сверяем обновленное значение переменной с текущим значением в поле. Такая сверка позволит исключить ситуацию, если бот все-таки "догадается" проанализировать функцию, которая должна выполняться по этому событию, и выполнить необходимые действия.
P.S. Если JavaScript отключен, то выдаем стандартную стойкую "каптчу".
Жду ваших возражений и способов обхода этого алгоритма ботом (как сэмулировать нажатие клавиши?). Если же алгоритм можно обойти, можно подумать над его усложнением, чтобы увеличить затраты на обучения бота.
Проект универсального парсера.
Предлагаемый алгоритм работы.
1. Из исходного файла формируется форматированный исходный код с подстветкой синтаксиса в виде HTML (см. пример модуля templavoila в typo3).
Любой тэг из текста исходника заключается в , при клике на который определяется его путь (XPath) в структуре DOM.
2. Пользователь добавляет новый ресурс, указав адрес страницы и указав имя, под которым будут храниться конкретные настройки парсера именно этого ресурса.
2.1 После указания стартовой страницы парсинга пользователю выводятся обработанные исходники этой страницы в соотвествеии с п.1.
Здесь он выбирает (просто кликнув по имени тэга) ближайший контейнер, который содержит данные для парсинга.
Дальнейшая работа будет осуществляться только внутри этого контейнера, весь остальной HTML-документ во внимание не будет браться.
2.1.1 Каждый раз при запуске парсинга каждого ресурса необходимо проверять, что путь к контейнеру не изменился (точнее, что такой контейнер вообще существует).
Если это не так, то нужно уведомлять пользователя о том, что исходный код страницы изменился, поэтому необходимо перенастроить парсер, иначе будут извлечены неверные данные со страницы.
В будущем имеет смысл сделать более продвинутую проверку
(например отслеживать, чтобы на одном уровне в дереве элементов не появился одноименный элемент,
или тем более элемент с одинаковым id!, или сообщать об изменениях внутренней структуры первого вложенного уровня контейнера)
2.2 Далее в проект добавляются объекты для парсинга. Предполагается 2 типа объектов:
а) Одиночные. Парсер просто ищет внутри контейнера по XPath нужный объект и извлекает требуемые данные.
б) Повторяющиеся. Пользователь указывает на один из повторяющихся объектов, а парсер на этом же уровне отбирает все одноименные объекты. (Например это могут быть строки ).
* внутри повторяющегося объекта обязательно указывается один или несколько одиночных объектов.
* допустима вложенная структура повторяющихся объектов
* допустима вложенная структура одиночных объектов
2.3.
Каждый одиночный объект имеет XPath и путь в базе данных, куда его необходимо сохранить (для краткости назовем его DBPath, формат произвольный).
В настройках контейнера должен быть указан столбец для хранения уникальных Id новых записей (должен быть AUTO_INCREMENT, вообще его лучше определять автоматом (Primary key), и если такого поля нет, нужно предложить создать его).
Одиночным объектом может быть или содержимое тэга, или его атрибут.
DBPath добавляется с помощью выбора пользователем из разворачивающегося списка таблицы и столбца, из БД, указанной в настройках ресурса. Из всех полей необходимо делать фильтр по типам
и оставлять только те, которые подходят для хранения выбранных данных (например, нельзя сохранить текст в столбце с типом INT).
В дополенение третья разновидность одиночного объекта - файл по ссылке. В этом случае пользователю предлагается указать из всех элементов тот, который является ссылкой на файл.
В форме указания DBPath должны быть только поля типа BLOB, если в настройках указано сохранять файлы в БД, или в противном случае -
строковые поля нужной длины, чтобы уместилось уникальное сгенерированое имя файла, под которым будет сохранен загруженный файл в каталоге, указанном в настройках.
2.4. При добавлении нового объекта внутрь существующего, необходимо указать, каким образом хранить данные в БД. Возможно 2 варианта:
а) Дочерний элемент хранится в той же таблице, что и родительский, но с указанием pid (parent id). В этом случае при создании вложенного объекта необходимо
указать столбец для хранения pid (это делается один раз при создании первого вложенного объекта).
б) Дочерний элемент хранится в отдельной таблице. В этом случае каждый раз при создании вложенного объекта указывается:
- таблица, в которую будут поступать данные
- Primary Key этой таблицы (лучше определять автоматом, а если он не создан, то предлагать создать)
- столбец Foreign Key, куда будет записываться Primary Key родительской таблицы
Дайте вы людям, которые ее еще не купили, спокойно и нормально с ней ознакомиться, а не задалбывать его постоянным напоминанием да еще в такой навязчиваой форме, что надо оплатить программу!!
Поддавшись вашей умелой рекламе я из любопытсва скачал программу и решил попробовать. Разминка и первые ознакомительные упражнения занимают времени минут 15, за это время было показано более ТРИДЦАТИ напоминаний о покупке программы и куча текста про ее создателей! Мне совершенно не интересно 35 различных мнений создателей программы или тех, кто ей пользовался! Оставьте это для рекламных компаний! Если я скачал программу, значит мне уже инетересно, хватит мне промывать мозг! Куда делась ваша хваленая забота о времени, если вы просто вынуждаете читать уйму ненужного мне текста, перед каждым упраженнием. А ведь совсем его пропускать тоже неправильно, т.к. там встречается полезные рекомендации к самому упражнению. Не заставляйте пользователя фильтровать глазами эти рекомендации из кучи ваших шуток и прибауток, оставьте суть!
Я конечно понимаю, что 150р. сумма куда более разумная и заплатить ее может любой (собственно на массовость и расчитано), но не будет никто платить сразу, пока не ознакомятся.
Программу не куплю теперь уже из приницпа. Пиратской версией тоже пользоваться не буду — неудобно, выкиньте прелюдии, оставьте суть!
Было бы не плохо сделать группировку по тематикам, чтобы можно было формировать группы по интересам и заниматься переводом того, что нужно самим. Например, открыть группу TYPO3, залить туда самую важную документацию и предложить всем заинтересованным программистам на форуме typo3 помогать в свободное время переводом.
1. Куда потом будут деваться переведенные тексты? Будет ли архив переводов?
2. Можно ли будет в дальнейшем заливать книги в HTML или других форматах с иллюстрациями, схемами, чтобы сделать полноценный перевод "под ключ" :)? Хотя, наверное, сервис не до этого. Пусть книжку потом уже склеивает ответственный за конкретный перевод человек.