Автор: admin

  • Расположение модулей в joomla шаблоне.

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

    если мы обратимся к joomla вот по такой Урле

    http://blabla bla.ru/index.php?tp=1Code language: HTML, XML (xml)

    то нам будет счастье.

  • Делаем скриншот сайта из консоли сервера 😉

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

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

    В тырнете куча мануалов как сделать это на атвомате но если у нас установлен Х-сервер.
    но у меня вот так сложилась что ни на одном сервере его нету.

    Но не беда есть есть Fake Xserver завётся он xvfb
    Устанавливаем

    aptitude install xvfbCode language: Bash (bash)

    при тестовом запуске

    Xvfb :99 -acCode language: Bash (bash)

    он будет ругаться на кучу всего

    [dix] Could not init font path element /usr/share/fonts/X11/misc, removing from list!
    [dix] Could not init font path element /usr/share/fonts/X11/cyrillic, removing from list!
    [dix] Could not init font path element /usr/share/fonts/X11/100dpi/:unscaled, removing from list!
    [dix] Could not init font path element /usr/share/fonts/X11/75dpi/:unscaled, removing from list!Code language: Bash (bash)

    Исправляем это, устанавливаем всё нам необходимое

    sudo aptitude install x11-xkb-utilsCode language: Bash (bash)
    sudo aptitude install xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillicCode language: Bash (bash)
    sudo aptitude install xserver-xorg-coreCode language: Bash (bash)

    Также нам нужен будет файрфокс, для создания скриншотов.

    sudo aptitude install firefoxCode language: Bash (bash)

    Теперь нам надо поставить вот такую утилитку
    CutyCapt — для генерации картинок с виртулаьного Хсервера.

    sudo apt-get update
    sudo apt-get -y install build-essential
    sudo apt-get install xfs xfonts-scalable xfonts-100dpi
    sudo apt-get install libgl1-mesa-dri
    sudo apt-get install subversion libqt4-webkit libqt4-dev g++Code language: Bash (bash)

    Создаём каталог временный где угодно (/home/username/CutyCapt например), в нём выполняют команды

    svn co https://cutycapt.svn.sourceforge.net/svnroot/cutycapt
    cd cutycapt/CutyCapt
    qmake
    makeCode language: Bash (bash)

    всё теперь у нас есть CutyCapt.

    можно пробовать 🙂

    создаём файл
    touch screenner.sh
    в него кидаем вот такой код

    #!/bin/bash
    
    
    xvfb-run --server-args="-screen 0, 1024x768x24" /home/developer/scr/cutycapt/CutyCapt/CutyCapt --url=http://www.google.com --out=/var/exchange/screensite/`date +%F-%H-%M`.pngCode language: Bash (bash)

    Мы запускаем виртуальный сервер с параметрами (0 скрин) указываем разрешение (если сайт длинный можно указать хоть 2000 во втором параметре)
    /home/developer/scr/cutycapt/CutyCapt/ — это путь до CutyCap там мы делали qmake и make

    Ну и куда сохранить, мне нужно было дату + время ставить.

    Вот и всё готово.

    Мог что-то упустить из виду т.к. по факту ставил пакетов больше, но пригодились ли они, не уверен.

  • django regroup пример

    Сегодня Django снова порадовала, мне требовалось отобразить список категорий с под категориями
    не важно можно с ul-li.
    мне надо было завернуть всё это в красивый селект, ну вот что-то вроде этого.

    в хтмл это примерно вот так

    <SELECT NAME=browser>
        <OPTGROUP LABEL="Firefox">
          <OPTION LABEL="2.0 or higher">
            Firefox 2.0 or higher
          </OPTION>
          <OPTION LABEL="1.5.x">Firefox 1.5.x</OPTION>
          <OPTION LABEL="1.0.x">Firefox 1.0.x</OPTION>
        </OPTGROUP>
    </select>Code language: HTML, XML (xml)

    Допустим у меня есть 2 вот таких модели в вакууме.
    Одна: категория — Firefox (как в примере выше.)

    class Category(models.Model):
        name = models.CharField(max_length=100)
        
        def __unicode__(self):
                return self.nameCode language: Python (python)

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

    class SubCategory(models.Model):
        category_name = models.ForeignKey(Category)
        name = models.CharField(max_length=200)
        
        def __unicode__(self):
                return self.nameCode language: Python (python)

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

    Но тут у нас всё интереснее, в притом намного.
    Мы во views должны сформировать что-то и отправить в шаблон уже как-то почти готовое для отображения.

    Хочется городить велосипед, но тут Документация Django какбэ подсказывает

    что есть такая хреновая, которая мне поможет.

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

    В итоге во views.py я делаю выборку того, что мне нужно.
    Например вот так:

    sub_category_list = SubCategory.objects.all()Code language: Python (python)

    И всё вот это мы отправляем тихо мирно в шаблон.
    А в шаблоне нас встретит уже магический regroup

    Вот с такой конструкцией

    {% regroup sub_category_list by category_name as categ_list %}
         <select id="id_sub">
         <option value="">-----</option>
      {% for ca in categ_list %}
          <optgroup label="{{ca.grouper}}">
                 {% for item in ca.list %}
              <option value="{{ item.id }}"> {{ item.name }}</option>
                 {% endfor %}
          </optgroup>
      {% endfor %}
         </select>Code language: Python (python)

    Теперь по порядку.

    {% regroup sub_category_list by category_name as categ_list %}Code language: Python (python)

    Группируем sub_category_list по полю category_name и называем результат categ_list
    Дальше создаём html элемент, тут я думаю всё понятно.

    и начинаем разбирать то, что у нас в categ_list

    {% for ca in categ_list %}Code language: Python (python)

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

    <optgroup label="{{ca.grouper}}">Code language: Python (python)

    Тут мы выводим то почему мы группировали {{ca.grouper}}

    {% for item in ca.list %}Code language: Python (python)

    Вложенный цикл, обходим то, что внутри группы (тут нам помогает ca.list )

    <option value="{{ item.id }}"> {{ item.name }}</option>Code language: Python (python)

    Собственно выводим всю эту красоту в конечный элемент

                 {% endfor %}
          </optgroup>
      {% endfor %}Code language: Python (python)

    Вот и завершили все наши дела.
    и получили нечто похожее на селект рутреккера тот, что в самом верху.

    просто красиво и со вкусом.

  • Мой отчёт по sape

    Картинка для заманухи
    И так прошло несколько месяцев, как я писал, что мой доход перевалил 100р. в сутки.

    и я достиг той психологической метки, которую ставил — 200+р. в сутки

    и вот сейчас……
    (далее…)

  • Связанные списки select в django (ajax select linked)


    Потратив часа 3 на поиск рабочего решения связанных полей (Это когда в зависимости от категории нужно показывать под категорию) спешу поделиться чтоб не забыть

    в urls.py

    (r'^ajax/categ/$', 'proj.list.views.feeds_subcat'),Code language: Python (python)

    во Вьюхе

    def feeds_subcat(request):
        from django.core import serializers
        json_subcat = serializers.serialize("json", SubCategory.objects.filter(category_name=request.GET['id']))
        return HttpResponse(json_subcat, mimetype="application/javascript")Code language: Python (python)

    Примерно рассказываю что там происходит
    В модели SubCategory выбираем имя субкатегории, которая соответствует ид_категории, что к нам привалило.
    всё это оборачиваем в JSON попутно подгружаем библиотеки для этих дел.
    и отправляем прямо в формате js всё обратно.

    теперь создаём ещё один js файл называем его как душе угодно (и не забываем подключить)

    <script src="/static/js/categ.js" type="text/javascript"></script>Code language: HTML, XML (xml)
      $(function(){
        $("select#id_categ").change(function(){
          $.getJSON("/ajax/categ/",{id:+$(this).val()}, function(j) {
            var options = '<option value="">---------- </option>';
            for (var i = 0; i < j.length; i++) {
              options += '<option value="' + parseInt(j[i].pk) + '">' + j[i].fields['name'] + '</option>';
            }
            $("#id_sub").html(options);
            $("#id_sub option:first").attr('selected', 'selected');
            $("#id_sub").attr('disabled', false);
          })
          $("#id_categ").attr('selected', 'selected');
        })
      })Code language: JavaScript (javascript)

    Что он делает?
    находит элемент select с id = «id_categ»
    При изменении которого вызывает функцию $.getJSON, которая долбится по урле /ajax/categ/ гет запросом и параметром ?id=то_что_выбрано
    Если всё отлично выполняется функция j
    Которая и меняет значение во втором селекте.
    #id_categ — ИД_селекта категории
    #id_sub — ИД_селекта подкатегории