Дома

Поездка до дома оказалась тем еще приключением.. 30 часовой перелет с тремя пересадками, в том числе один трансатлантический (10 часов в самолете, а кондоровцы за просмотр фильмов с медиацентра требовали 10 евро, не то что иберия). Суммарно получилось все 60 часов без сна, так как вылет тоже посреди ночи, не поспишь. В Пунта-Кане, Доминикане, оказалось дофига русских (не зря сюда чартеры возят пактеников), а аэропорт оказался самым забавным — все гейты и часть залов ожиданий накрыты соломенными крышами:

Пунта Кана Аэропорт

Нас бекпкеров набралось 11 человек, кто ехал таким замысловатым маршрутом (зато самым дешевым). Половину длинного перелета в итоге проболтал с немкой, живущей в Эдинбурге, переводчицей) А до Москвы рейс оказался полупустым, так что наконец-то удалось три часа поспать. А вот в Москве и начались неприятности — как оказалось, Перу относится к странам с «плохим рейтингом», не говоря уже про мой внешний вид, так что на таможне мне переворошили весь рюкзак (буквально, даже грязное белье), проверили экспресс-тестом на наркотики. В итоге докопались до безобидного, купленного в dute-free чая из листьев коки и каких-то конфет в виде коричневых мягких брусочков — и ладно бы просто изъяли, я спокойно доехал бы до вокзала и упал в поезд. Но нет, бюрократическая машина, и они оформляли этот чай все 3 часа, записывая акты изъятия, взвешивая этот чай и т.д. В итоге опоздал на поезд, пришлось выкупать следующий (сдать предыдущий билет в аэропорту так же возможности нет), еще -3000 рублей. Чай отправили на экспертизу, буду ждать результатов (объем для личного пользования, так что ничего особо серьезного).

Догадайтесь, что сделал на следующее утро штатный милиционер в поезде? Правильно, тоже самое (обычно они просто досматривают по карманам). Люби Россию, блджад! Самое забавное, что оба они досматривают лишь подозрительных граждан — но кто ж доверит перевозку наркоты подозрительным гражданам? Или еще попадаются идиоты с дредами, которые таскают с собой косяки в карманах (потому что даже с этими досмотрами я вполне мог найти 5-10 мест где его заныкать, если бы хотел). Комедия.

Ну да не суть, главное что доехал) Впервые попал в зиму, снег вижу впервые за 4 года — с тех пор как в первый раз уехал в Таиланд.

Деревня

4-х месячный трип окончен, +3 страны, новый континент. Почти все время в Андах — мне весьма понравилось жить в городах на 1500-2000м. Южная Америка оказалось не такой уж дорогой, как все пугали, и не такой опасной. В целом, трип получился годный, жаль пришлось досрочно заканчивать — при таком курсе рубля деньги исчезают слишком быстро (( Альтернатива для зимовок? Вряд ли. Вариант для иммиграции? Очень даже. Последняя неделя в Перу получилась хороша на треки, хотя в целом страна трешовая (разве что еда лучше):

Huaraz

Планы на будущее — отрабатывать долг, реализация пары новых проектов, апгрейд старых. А именно — фриланс (ура, уже есть один небольшой заказ) + с одеском, «пикабу для онямэ» (решил делать на пыхе, ибо буду еще пару месяцев разбираться с монгой, а скрипт мне потом еще понадобится — а может и на продажу пойдет) + бурж sf, коммьюнити вокруг storyfinder + очередная сессия работ над топсапой. Как минимум до мая-июня никуда особо выбираться не буду (разве что по мелочи), так что все пучком.

Сегодня впервые сделал 3+ часа продуктивного времени (а сейчас уже все 5) — засел за скрипт для объединении стат нескольких сайтов с LI (мой мелкоскрипт показывал только текущие данные, а монстра вроде LiViewer ставить и тем более платить не хотелось). Например, за последние 30 дней максимальная посещаемость у меня была 2 марта, 4406 посетителей и 22094 просмотра. В итоге получилось что-то вроде этого:

li_stat

Есть поддержка стат под паролем, БД разумеется не нужна, только файлу sites.dat дать права на запись. Простой как валенок скрипт (это я к тому, что не надо придираться к плохой структуре — я писал в первую очередь для себя и максимально просто и быстро). Подобные этому скрипты (обычно конечно они куда сложнее) я с удовольствием делаю на заказ.

Скачать скрипт

Вот такие новости пока что =) Всем добра!

Шериф

Делаем наглядную статистику событий по дням (PHP + Google Charts)

Сегодня у нас «вебдев для самых маленьких», а именно — оформление разной статистический информации графиками. Задача: есть некоторые события (регистрация пользователей, появление сообщений, поисковый запрос и т.д.), логирующиеся в MySQL, требуется наглядно показать динамику (сколько событий в день/месяц/час), вроде такого:

post_stat

Для начала нужно добавить в таблицу события поле `time_added`, тип TIMESTAMP, значение по умолчанию — CURRENT_TIMESTAMP. Не нужно даже ничего менять в php-коде — в это поле будет автоматически добавляться время добавление записи, а в phpmyadmin он будет выглядеть вполне читабельным значением вроде «2014-03-07 18:22:27» (в отличие от записи timestamp-а в int поле). Затем делаем выборку из таблицы:

  1. //Получаем метку даты 30 дневной давности о оформляем его в удобовариемый mysql-ем вид
  2. $last30d=date("c",strtotime("-30 day"));
  3.  
  4. //Делаем выборку событий из базы старше нужного
  5. $res=mysql_query("SELECT COUNT(*),time_added FROM wordstat WHERE time_added>’$last30d‘ GROUP BY DAY(`time_added`)");
  6. while($row=mysql_fetch_array($res)) {
  7.         $key=date("Y-n-d",strtotime($row[‘time_added’]));
  8.         $days[$key]=$row[‘COUNT(*)’];
  9. }
  10.  
  11. //Сортируем массив в нужном порядке
  12. ksort($days);

Не так уж сложно, как видите) Точно так же можно подсчитывать число событий в месяц или год. Следующая задача — построить график по этим данным. Можно конечно использовать какую-нибудь php-gd библиотеку, или даже самостоятельно всё написать, но зачем, если есть готовые либы? Я использую JS-библиотеку Google Charts, обладающую просто безграничными возможностями, главное в нём разобраться.

  1. <script type="text/javascript" src="https://www.google.com/jsapi"></script>
  2. <script type="text/javascript">
  3.  
  4. // Load the Visualization API library and the piechart library.
  5. google.load(‘visualization’, ‘1.0’, {‘packages’:[‘corechart’]});
  6. google.setOnLoadCallback(drawChart);
  7.    // … draw the chart…
  8.  
  9. function drawChart() {
  10.  
  11.     // Create the data table.
  12.     var data = new google.visualization.DataTable();
  13.         data.addColumn(‘date’, ‘Дата’);
  14.     data.addColumn(‘number’, ‘Запросов’);
  15.     data.addRows([
  16.     <?
  17.     foreach($days as $day=>$count) {
  18.                 $date=strtotime($day)*1000;
  19.                 echo "[new Date($date), $count],\n";
  20.     }
  21.     ?>
  22. ]);
  23.         var options = {‘title’:‘Поисковых запросов, в день:’,
  24.         ‘width’:900,
  25.         ‘height’:200,
  26.         ‘legend’:{‘position’:‘none’},
  27.         ‘titleTextStyle’:{‘fontName’:‘Georgia’,‘fontSize’:20,‘bold’:false},
  28.         chartArea: {width: ‘100%’},
  29.         vAxis: {textPosition: ‘in’,minValue: 0},          
  30.     };
  31.  
  32.     // Instantiate and draw our chart, passing in some options.
  33.     var chart = new google.visualization.AreaChart(document.getElementById(‘chart_div’));
  34.     chart.draw(data, options);
  35. }
  36. </script>
  37.  
  38. <div id="chart_div" style="width: 900px; height: 200px;"></div>

И вауля, график готов. Кастомизировать его можно как угодно, мне больше нравится такой вид, а не дефолтный. Как я уже писал, возможности у библиотеки богатые (это ж гугл), документация весьма обширная, но её надо читать и вкуривать, и далеко не всё получается как надо (я например не могу настроить сетку внутри графика).

Задача решена. Да, возможно в MySQL можно задать такой запрос, который выдаст данные в уже нужном отформатированном виде. Уже перед самой публикацией понял, что я дичайше накосячил (до этого просто выбирал все записи из БД и фасовал их по дате в массив), и при более-менее значительных данных скрипт будет либо падать от нехватки памяти, либо очень очень долго думать. Отсюда вывод — не верьте всему тому, что написано в интернете) Гугл и stackoverflow быстро выдали мне нужное решение, описанное выше (там только SQL-запрос сменился). Хотя я пока еще использую старое ресурсоемкое решение, так-как мне нужно много более подробной информации, а не только динамика. Наверняка там и в других местах можно реализовать более удобно и правильно, например метод передачи данных между php и js.

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

Исходный код оформлен в Pastebin, но для совместимости был скопирован со страницы для печати, вместе со стилями (только javascript-оформление не заработало, поэтому слегка криво подсвечен второй кусок кода)

Верстка это наше всё

Помните я говорил о создании фейковой студии под сапу? Небольшие продвижки таки есть — подобрал название (читаемое, но не слишком запоминающиеся), зарегал домен, нашел «трастовый» хостинг (петерхост… ох уж эта их панелька родом из 2000-х), и даже на скорую руку состряпял одностраничный сайтик.

Но ведь надо соответствовать образу дизайн-студии, не так ли? Вот меня и понесло — простенький первоначальный дизайн доделал и переверстал div-ами (до этого все сайты верстал таблицами), потом подогнал под XHTML 1.0 Strict, в полном соответствии со стандартами — контент в одном месте, оформление — в другом. Все значения — относительные, резиновая верстка, кроссбразуерность вплоть до мобильных платформ, и даже с отключенными стилями сайт вполне читаем. Но мне конечно было проще — я предпочитаю минимализм, а не верстку тремя десятками картинок, фонов и попиксельной расстановке элементов.

Затем — как управлять сайтом, генерировать стандартные страницы и т.д. (на заметку — можно сделать двуязычный сайт, страниц в два раза больше). Использовать готовые движки желание не было никакого, либо слишком мощные (WP, Drupal), либо слишком много дописывать (GetSimple). Пришлось писать еще и CMS, причем MVC — шаблон, данные и логика раздельно, а не собраны в одну кучу, как это у меня обычно бывает. А где хранить данные? Это же простенький сайт, БД подключать резона нет, значит на файлах. А раз файлы, то неплохо бы изучить работу с XML, как наиболее удобную. Даже шаблон, стили и часть кода засунул в XML-файл, вся cms поместилась в три файла 🙂 Кстати, финт ушами — оказывается, ЧПУ удобней делать не вручную (настраивая в .httaccess отдельные правила), а вордпресс-способом — все запросы отсылаются в index.php, а там уже разбирается REQUEST_URI и показывается нужная страница.

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

И теперь идея сайта под сапу мне кажется кощунственной))) И все больше склоняюсь к мысли допиливания CMS, и перевода на неё своих небольших сайтов (а заодно будущих), и скорее всего публикации в открытом доступе. А сам сайт использовать как вполне реальную студию, только работающую над своими проектами — в том числе этой cms, шаблонамии и прочим (халявные ссылки!). А уж извлечь пользу думаю получится. Так что скоро думаю список «Моих проектов» пополнится 🙂

Первоапрельский АГС-апдейт прошел мимо.. Все меньше и меньше за ними слежу, домены суспендятся пачками, чистых ГС в сапе осталось всего несколько штук, да и то приносят копейки.

——————————
МТС жжот — теперь у меня 2-мбитка, хоть и с ограничениями по трафику)

PHP автоматизация: авторизация в LinkFeed

Так-как у линкфида слишком заковыристое апи, к тому же по умолчанию отключенное, используем старый добрый способ парсинга данных «в лоб»:


(если вы не видите код — у вас отключен яваскрипт. Исходный код)

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

Зачем вообще может пригодится подобный скрипт? К примеру, вы можете залогиниться в той же сапе и автоматически добавить несколько десятков/сотен своих сайтов. Если вы залогинитесь в яндексе, то лимит запросов у вас повышается (хотя ограничение остается), к тому же у яндекса достаточно сервисов, добавление информации в которые не требует ввода капчи 🙂 Да и вообще на любые сервисы, где нет капчи при авторизации — различные партнерки, вконтакте, соц. закладки и прочие полезные ресурсы. К сожалению, так же действуют спамеры — комменты отправляются аналогичным POST запросом (и зачем я это сказал..).

Можно отправлять запросы без авторизации — регистрация LI счетчика, добавление в аддурелку рамблера (когда там не было капчи) и т.д. Чтобы вручную не возиться с исходным кодом, можете воспользоваться парсером HTML форм от Jeck.ru. Можно вообще не отправлять запросов, а сразу парсить страницу — ключи с вордстата, кейворды со статистики LI — там все таки более реальные данные (к сожалению, кто-то обнаглел и эту страницу закрыли), выдачу с Яндекс.Блогов (там есть замечательная ссылка на полный текст записи — не надо мучиться с очищением текста, сразу готовый контент) и еще много много сайтов, к которым может приложить руки сеошник со знанием php 🙂

Но будьте аккуратны с хранением cookies — зная их, можно полностью управлять вашим акком на сайте. Это кстати и являлось целью XSS-атак — встроить на страницу яваскрипт, дождаться, пока на неё зайдет админ, получить его куки, вручную вставить их себе — и вауля, вы авторизованы как администратор. Это уже потом, когда заместо надписей «Defased by Вася» стали пихать ссылки, а потом и сапу, начали в срочном порядке закрывать эти баги и отфильтровывать такие ссылки (а они были даже на яндексе). Так-что осторожнее)

—————-

Тестовый сателлит от Сайтуса проиндексировался, 100 страниц из 400 (хотя тут сам виноват, совсем забыл сделать сайтмап). Хотя выглядит он как говно (но может это мне так повезло с тематикой — сериалы), попробую сделать из других категорий. Мой новостной на старом домене выглядит нормально (даже читабельно), только не индексируется совсем — видимо дело в домене, он хоть и старый, но наверное успел попасть в черный список. Лучше буду делать на новых 🙂 Поднимать тИЦ этому хламу рука не поднимается.

Оказывается, у меня уже 3 сайта-сервиса: анализ сайтов + генерация сайтмап (тИЦ 110, класс), получение ссылки на скачивание видео с ютуба (посещаемость 100/500 в день, иногда непонятные всплески до 400/1600) и конвертер книг для iPod (полгига книг обработано). И у всех стабильная посещаемость, полезность для посетителей и плюшки для меня. С доходом к сожалению довольно туго (у всех 1-2 страницы в индексе), но и трат кроме как на их создание особо нет, ресурсов они много не потребляют, гигантских баз не требуют. Сейчас думаю, как же эти сервисы можно улучшить, а главное — увеличить число страниц в индексе — чтобы хоть как то получить с них доход 🙂 Кстати, какие еще сервисы можно создать?

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

Скрипт анализа сайтов

Каждый, у кого больше 3 сайтов, начинает думать о рациональном способе проанализировать все сайты. 1-2 сайта можно проверить напрямую у поисковиков/сервисах, но когда сайтов штук 5, это начинает уже слегка надоедать, особенно после АПов. Поэтому создаются специальные скрипты или сервисы, которые и показывают все пузомерки сайтов (или списка сайтов). Но мне почему то не попадалось нормальных серисов для массовой проверки, или же у них были какие то траблы, поэтому мне постоянно приходилось писать их самому)

Этим скриптом я пользуюсь в данный момент. Может быть, данных не так много, но для моих целей — необходимый и достаточный минимум) Скрипт показывает тИЦ, PR, индекацию в Яндексе, индексацию в Гугле, среднюю посещаемость в день за последние 7 дней. Я этот скрипт использую для анализа своих полу-сдл, блога, проектов, некоторых сателлитов.

Вот так он выглядит:
analiz.gif

Думаете, я собираюсь продавать скрипт? Хех, да нафига оно мне нужно ))) Забирайте так:

Скачать (4кб)

Да, и еще.. Скрипт предоставляется «как есть», все баги — ваши проблемы. Модифицировать можете как угодно, продавать тоже — больше половины функций — не мои, я даже не знаю, как они работают)