Analitycs

вторник, 29 ноября 2011 г.

Как включить показ ошибок PHP в браузере?

Классический вопрос всех похапешников - "как показать ошибки PHP скрипта в окне браузера"

error_reporting(E_ALL);
ini_set("display_errors", 1);

P.S. Причем сам постоянно забываю, как точно пишется эта конструкция - особенно после переключения с языка на язык. Ненавижу переключать контекст мозга ;-)

четверг, 24 ноября 2011 г.

Почему не любят SEOшников?

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

Как и везде - люди бывают разные, но похоже, что ни одна профессия не вызывает такой нелюбви, как SEOшники.

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

Причин подобной нелюбви много, перечислю основные.

1) Маленький возраст бОльшей части сеошников

Когда 14 летний парень начинает строить из себя специалиста по SEO, SMM и контекстной рекламе, имея за душой один мелкий бложик и 20 фидов в ГуглоРидере как источник знаний - это еще ладно, допустим.

Но ведь это только начало, "возраст - это единственный недостаток, который проходит сам по себе - со временем" (с)

Дальше начинается - хуже.

2) Неумение писать и нежелание это делать

Знаете, что я больше всего ненавижу в сети? Копи-паст и рерайт, в который воткнуты реферральные ссылки. Если тебе нечего сказать/написать - так может - не стоит и браться?

Что, денег захотелось? Ну так иди работай - пиши, рисуй, код лабай, точи на заводе что-нибудь, переводи что-нибудь на худой конец - но не засирай интернет копи-пастой, пожалуйста.

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

Да и своего времени хотя бы пожалей - уж если чужого не жалко.

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

3) Вопиющий непрофессионализм/профанация

Чем больше человек знает, тем меньше в нем уверенности, что он знает много. Обратное - верно Как не почитаешь очередного мегасеошника - знает все обо всем, правда - преимущественно по другим блогам ;-)

4) ТИЦедрочерство

Простите мой французский, это вообще смешно. Будете писать интересно - будут ссылки, будет трафик, будет ТИЦ.

5) Нарушения причинно-следственной связи - ярко выраженный "культ карго"

Когда я смотрю якобы аналитическую статью, в которой человек пишет про исследования CTR объявлений Яндекс-Директа, основываясь на данных порядка 600 показов до изменения и потом 600 показов после...  вот именно тут хочется биться головой о стену...

Потому что финальный вывод  - "вот CTR подрос, значит мое предположение верно - все делайте как я"... Неверен в принципе!

Мальчики и девочки!

На статистических данных меньше 100 000 показов любые псевдоаналитические построения - пустая трата времени. Туева хуча случайных и неучтенных вами факторов полностью уничтожают всякую логическую конструкцию - там могло произойти все что угодно

Вот, например:
 * в прошлый раз пришло 3 человека с английских IP, которые вообще ни фига не понимают по-русски - зачем им кликать?
* и вообще - таки показалась ли подобным людям реклама?
* время в которое смотрели? Из дома или с работы? Параметры поведения - разные
* с каких устройств ходили люди?
* что это были за люди? Гики рекламу почти игнорируют, в отличии от простых людей...

И так далее - продолжать набор таких факторов можно почти до бесконечности.

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

Единственная возможность как-то нивелировать подобные нюансы - брать длительные промежутки времени и большое количество показов. Ну не 600 же штук!!!

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

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

Уф, "доклад окончен" (с) - сегодня что-то прорвало.



Как сделать автодополнение git в MacOS X?

При установке git возникает ошибка и автодополнение не работает

-bash: __git_ps1: command not found

Лечение (работаю со SnowLeopard)

Ставим MacPorts из .dmg, затем в консоли

$ sudo port selfupdate
$ sudo port install git-core +bash_completion

Если нужна дополнительная работа с SVN и docs, вторую строчку заменяем на:


$ sudo port install git-core +bash_completion +doc +svn

Затем добавляем в ваш ~/.profile или ~/.bash_profile:

# MacPorts Bash shell command completion
if [ -f /opt/local/etc/bash_completion ]; then
    . /opt/local/etc/bash_completion
fi

среда, 23 ноября 2011 г.

Как распаковать содержимое rpm-пакета?

Довелось недавно устанавливать дополнительный софт на одну виртуалку со сломанным дистрибутивом. Предыдущий админ воткнул посторонние пакеты, переломав зависимости. Так как надо было поставить обычную софтинку на PHP - решил просто расковырять RPM пакет.

Обычный rpm-пакет - это архив формата cpio вместе с некоторым набором метаданных.

Распаковать его можно

# rpm2cpio package.rpm | cpio -dimv

Параметры и флаги



  • имя rpm-файла, который необходимо распаковать и перенаправить вывод на архиватор cpio.
  • -i - распаковать архив,
  • -d - сохранить структуру директорий.
  • -v - вывести список распакованных файлов,
  • -m - наследовать даты модификаций извлекаемых файлов.
  • PHP - хак быстрого логгирования в файл


    Если вам в зубы выдали какой-то очередной супер-мега-пупер проект на PHP, в дебрях которого нет возможности и желания разбираться, однако нужно что-то быстро пофиксить с отладкой, (причем доступа к php error_log нету) - то можно быстро воткнуть небольшой полезный хак.

    Это дополнительный метод в класс (или просто - функция) с минимальным количеством кода.

       function log($msg) {
           file_put_contents(SUPER_CMS_ROOT_PATH.'/cache/php-debug.log',"\n".$msg, FILE_APPEND);
       }
    

    Соотвественно, после отладки ее можно либо убить, либо оставить, закомментировав содержимое.

    P.S. И да -про некошерность данного метода и недопустимости этого при учете всех методик программирования - я в курсе, не нужно возбуждаться. ;-)
    Просто нужно пофиксить и отладить - БЫСТРО.

    воскресенье, 20 ноября 2011 г.

    Как на python проверить, открыт ли какой-то port?


    from socket import socket, gethostbyname, AF_INET, SOCK_STREAM
    
    target = "localhost"
    targetIP = gethostbyname(target)
    port = 80
    s = socket(AF_INET, SOCK_STREAM)
    
    result = s.connect_ex((targetIP, port))
    
    if(result == 0) :
     print 'Port %d is open' % (port,)
    s.close()
    

    суббота, 19 ноября 2011 г.

    Как запустить приложение MacOS X из terminal.app с передаваемым файлом?

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

    $ open -a TextMate ./README

    Ненавидишь соседей?

    "Хочешь я убью соседей, что мешают спать?" (c)

    Простенько, функциональненько, иногда может пригодится ;-)

    Различные комбинации - в стиле Ссора+Секс, Ребенок с барабаном+Новорожденный заставляют задуматься ;-)

    Ну и колоночки с усилителем нужны помощнее ;-)

    Короче, вам сюда - FanSwitcher

    пятница, 18 ноября 2011 г.

    Skyrim vs Fallout

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

    Воспитательница в детском саду уже спросила - "что за странную группу вы слушаете? Ребенок напевает какую-то новую музыку и размахивает дрыном" ;-) ;-)

    Ну а в целом - весьма нравится. Расписывать не буду - и так везде на каждом сайте описания валяются.

    Правда, можно  продолжить старую цитату с башорга - если раньше "запускаешь Fallout 3 - а там Oblivion" (с), то теперь - запустил Skyrim - а там... Fallout New Vegas ;-)

    понедельник, 14 ноября 2011 г.

    Как реализовать периодические задачи в Twisted? (cron vs LoopingCall)

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

    Есть же методически грамотное, ВСТРОЕННОЕ решение - и нашел я его сегодня случайно, когда искал совершенно другую вещь.

    from twisted.internet.task import LoopingCall
    
    #==============================================================================
    class MySuperServer(MyServer, twisted.web.server.Site):
        '''
        мой собственный веб-сервер, с блекджеком и шлюхами ;-)
        '''
    
        def __init__(self):
            lp = LoopingCall(self.checkStatus)
            lp.start(1.0) # период в секундах    
    
        def checkStatus(self):
            #self._log('Looping call')
            pass
    

    пятница, 11 ноября 2011 г.

    Chef creating new cookbook - rake aborted! Don't know how to build task

    При попытке создания нового cookbook для Chef по некоторым мануалам вываливается ошибка

    # rake new_cookbook COOKBOOK=xxx CB_PREFIX=site-
    rake aborted!
    Don't know how to build task 'new_cookbook'
    

    Причина - прямое использование rake тут было deprecated, потом вообще убрали. Теперь труЪ-путь для подобных операций - только использование knife, командной утилиты Chef.

    
    
    # knife cookbook create xxx
    

    Вот не люблю ruby за это очень сильно - ведь был же суслик... а теперь его нету. ;-(

    четверг, 10 ноября 2011 г.

    Синхронизация времени на CentOS/Fedora

    Как поправить разошедшееся время на CentOS/Fedora

    $ sudo yum update tzdata -y
    

    Проверить/выставить

    $ cat /etc/sysconfig/clock 
    ZONE="Europe/Moscow" 

    И под конец запустить

    $ sudo chkconfig --level 345 ntpd on && sudo service ntpd start
    

    Подрезано тут (спасибо sanjek65)

    среда, 9 ноября 2011 г.

    PHP header("HTTP/1.0 404 Not Found") показывает пустую страницу

    При отправке из PHP скрипта HTTP ошибки 404 - показывается белая страница, хотя в настройках вашего веб сервера явно задана собственная красивая страничка для этой ошибки.

    Как лечить?

    Просто считать содержимое файла с красивой 404 ошибкой и вывести его HTML в поток - примерно так
    if ($is404) {
     $html = file_get_contents(YOUR_ROOT_PATH.'/404.htm');
     header("HTTP/1.0 404 Not Found");
     echo $html;
     exit();
    }
    
    

    четверг, 3 ноября 2011 г.

    Python, Twisted, logging - Как логгировать несколько процессов/демонов в один файл?

    Давайте поговорим немного про логгирование в Python.

    Да, меня это ДЕЙСТВИТЕЛЬНО беспокоит, и я хочу об этом поговорить ;-)

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

    В общем, мораль сей басни такова...

    Есть в Python СТАНДАРТНЫЙ модуль logging  - его и нужно использовать для разного типа логгирования. Батарейка-то уже включена ;-)

    Чтобы пример кода не был совсем тривиальным - приведу решение для той ситуации, когда у нас есть несколько многопроцессных РАЗНЫХ демонов на Twisted на одной машине, а еще и cron-скрипт запускается время от времени. И всю жизнедеятельность этого дурдома нужно логгировать в один файл

    import os
    import logging
    from twisted.python import log                                                                                   
    
    CURRENT_PATH = os.path.realpath(os.path.dirname(__file__))
    
    # Все это "по уму" обычно запихивается в нормальный конфиг-файл
    LOG_DIR = os.path.join(CURRENT_PATH, 'logs')                            
    LOG_FILE = os.path.join(LOG_DIR, 'super-puper.log')  
    LOG_LEVEL = logging.INFO
     
    # инициализируем
    FORMAT = ('%(asctime)-15s %(levelname)s %(message)s') 
    
    if not os.path.exists(LOG_DIR):
        os.mkdir(LOG_DIR) 
     
    logging.basicConfig(format=FORMAT, filename=LOG_FILE, handler=logging.handlers.RotatingFileHandler)   
    observer = log.PythonLoggingObserver(loggerName='twisted')
    observer.start()
    observer.logger.setLevel(LOG_LEVEL)  
    
    # класс-примесь для логгирования - в принципе - необязательно, реализация может быть разная - хоть функциями
    class BasicLogClass():
    
        def _log(self, msg):
            log.msg(msg, logLevel=logging.INFO)
    
        def _error(self, msg):
            log.msg(msg, logLevel=logging.ERROR)
    
        def _warning(self, msg):
            log.msg(msg, logLevel=logging.WARNING)
    

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

    Кстати, если у кроновских скриптов нет использования twisted'овского reactor, то могуть быть проблемы, нужно подумать. Как вариант - использовать развилку в инициализации и логгировании без применения observer, но не уверен.

    вторник, 1 ноября 2011 г.

    Как исправить переход на зимнее время в MacOS X Snow Leopard 10.6.8?

    Проблема 2011 года подкралась незаметно - новые машины с Lion не пострадали, а вот Snow Leopard честно перевел часы, не зная о новом приказе президента РФ.

    Варианта решения два

    1) Поставить другой TimeZone в настройках

    2) Отхачить по аргентинскому рецепту (первый хак для консоли, второй для GUI)

    mkdir temp
    cd temp
    curl -O http://www.iana.org/time-zones/repository/releases/tzdata2011m.tar.gz
    tar zxvf tzdata2011m.tar.gz
    sudo zic europe
    
    curl -O http://www.opensource.apple.com/tarballs/ICU/ICU-400.42.tar.gz
    tar zxvf ICU-400.42.tar.gz
    cp tzdata2011m.tar.gz ICU-400.42/icuSources/tools/tzcode/
    cd ICU-400.42/icuSources
    ./runConfigureICU MacOSX --with-data-packaging=archive
    gnumake
    sudo install -o root -g wheel -m 0644 -Sp data/out/icudt40l.dat /usr/share/icu/icudt40l.dat
    cd ../../..
    rm -rf temp
    
    
    Источник 
    В этом гаджете обнаружена ошибка