среда, 26 сентября 2012 г.

Windows 8 :: Hotkeys

Win - открывает и скрывает интерфейс Метро, так же в интерфейсе Метро вы сможете начать вводить название нужной программы для её поиска
Win - D - покажет старый добрый рабочий стол
Win - C - отобразит новое меню в котором вы сможете быстро и удобно расшарить файлы, выполнить поиск и изменить различные настройки
Win - I - открывает панель настроек для текущего приложения, изменить громкость, настроить беспроводные сети, настроить яркость и завершить работу
Win - Z - открывает панель приложений для запущенной Метро программы
Win - H - открывает панель Метро расшаривания файлов
Win - Q - открывает поиск Метро приложений
Win - W - открывает поиск Метро по настройкам
Win - F - открывает поиск Метро по файлам
Win - K - открывает панель устройств
Win - . (точка) - прикрепляет приложение Метро к одному из краёв экрана
Win - Shift - . (точка) - прикрепляет приложение Метро к другому краю экрана
Win - J - переключает между приложениями Метро, которые были прилеплены к одному из краёв экрана
Win - Tab - переключает между запущенными приложениями в Метро стиле

ссылка на оригинал: http://www.agarkov.org/2012/03/windows-8.html
Читать далее

Быстрая установка Django Debug Toolbar

  1. Скачать и установить sudo pip install django-debug-toolbar
  2. Добавить следующее middleware в файл настроек: 
    • debug_toolbar.middleware.DebugToolbarMiddleware',
  3. Добавить в настройки прослушивающий ip INTERNAL_IPS = ('127.0.0.1',)
  4. Добавить debug_toolbar в INSTALLED_APPS
Читать далее

пятница, 14 сентября 2012 г.

Проверка рейтинга голосования на сайте ibuildapp.com

Недавно решил поучаствовать в конкурсе по созданию мобильных приложений. Давно была хорошая идея («Удобный поиск экомобиля») и решил её реализовать. Однако конкурс проводил Сбербанк и в качестве платформы для создания приложения был выбран сайт russia.ibuildapp.com, на котором все приложение приходится делать с помощью их «чудо» инструментов, в общем прекрасный инструмент для домохозяек при помощи, которого можно делать много ****  =). Коль уже было принято решения участвовать, то решил просто отписать версию для браузера, чтобы можно было через мобильник с ней работать. С результатом и с идей можно вот здесь ознакомиться: http://photopuma.ru/eco/
В ходе голосование за приложение появились забавные тролли, которым не понравилось, что приложение находится в первых местах и в один прекрасный момент у меня появилось около ста голосов с «1». Приложение с 3го места весело укатилось на 27ое. К счастью о приложении опубликовали в одном журнале np-mag.ru/articles/otdaj-svoj-golos-za-ekomobil и в паре пабликов в ВК, за что им спасибо. И приложение начало обратный путь на верх. Однако, вот такие нападки бывают часто. Написать голосовалку для накручивания не проблема, но коль решил действовать честно буду идти до конца =)

Написал небольшой скрипт на python для проверки рейтинга чтобы можно было легко смотреть динамику голосованию и отслеживать такие моменты.  Для написания использовал библиотеку PyQuery, она позволяет искать элементы DOM'a при помощи синтаксиса схожего с селекторами jQuery.

#!/usr/bin/python
from pyquery import PyQuery as pq
import urllib
import csv
from datetime import datetime

def Rating(number):
# f = csv.reader(open('stats.csv', 'rb'), delimiter=' ', quotechar='|')
 now = datetime.now()
 f = csv.writer(open('stats.csv', 'a'), delimiter=' ', quotechar='"', quoting=csv.QUOTE_MINIMAL)
 //Open page 
 d = pq(url='http://russia.ibuildapp.com/projects.php?action=info&projectid=%s' % number)
 //Search by id 
 avg_rating = d('#avg_rating')
 num_votes = d('#num_votes')   
 //Search bold element in paragraph with text_large and grey_text classes
 views = d('p.text_large.grey_text b')
 print "now = %s \navg = %s \nvotes= %s \nviews = %s" % (now, avg_rating.html(), num_votes.html(), views.html())
 #f.write("%s %s %s" % (avg_rating.html(), num_votes.html(), views.html()))
 f.writerow([now, avg_rating.html(), num_votes.html(), views.html()])

if __name__ == '__main__':
 Rating('320387')

  Кстати, за приложение можно проголосовать здесь: http://goo.gl/4B87b

«Экомобиль» — передвижной пункт приема опасных отходов. Сегодня каждый экологически ответственный петербуржец может абсолютно бесплатно сдать в мобильный пункт приема «Экомобиль» следующие виды опасных отходов:
  • люминесцентные и энергосберегающие лампы,
  • ртутные термометры,
  • батарейки,
  • оргтехнику,
  • автопокрышки (не более 4-х штук)
  • бытовую химию,
  • лаки и краски,
  • лекарства с истекшим сроком годности.
Более подробную информацию можно найти на официальном сайте.
Читать далее

Написание большого плагина на jQuery

Как писать плагины для определенной функциональности для jQuery - понятно, а если нет то можно ознакомиться здесь http://docs.jquery.com/Plugins/Authoring. Возникает вопрос что делать когда таких функций становится много? Принял для себя решения ввести подобие пространства имен. Например вводим пространства в соответствии с функциональными блоками pagination и facet_filter.
(function ($) {
  options: {
    //…
  }
  methods: {
    init: function(){
        //Обращение к методам внутри блоков
        methods.pagination.init();
        methods.filter.init();
    },
    get: function (option) {
      if (options[option])
        return options[option];
      else
        methods.error('Option ' + option + ' does not exist in SATIN');
      },
    pagination: {
      init: function () {
        //…
      },
      render: function(){
        //…
      },
      destroy: function(){
        //…
      }
    },
    filter: {
      init: function () {
        //…
      },
      render: function(){
        //…
      },
      destroy: function(){
        //…
      }
    },
  }
  $.fn.OurBigPlugin = function (method_name) {
    //…
  }
})(jQuery);
Теперь необходимо придумать как к таким блокам обращаться:
$.fn.OurBigPlugin = function (method_name) {
        var namespace = '',
            method = '';
 
        if (typeof method_name === 'string') {
            if (method_name.split('.').length > 1) {
                namespace = method_name.split('.')[0];
                method = method_name.split('.')[1];
            } else {
                method = method_name;
            }
        }
 
        if (typeof method_name === 'object' || !method_name) {
            return methods.init.apply(this, arguments);
        } else if (namespace) {
            return methods[namespace][method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (method) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else {
            $.error('Method ' + method + ' in ' + namespace + ' namespace does not exist on OurBigPlugin');
        }
    };
Теперь вызывать функции можно следующим образом:
$().OurBigPlugin("pagination.loadpage", 5)
Читать далее