Ответы пользователя по тегу Программирование
  • Структура данных для поиска подходящих CSS-правил

    Если учитывать что Вы не привязваетесь к DOM, то можно предположить что все возможныне css правила это бесконечное множество (конечно можно сделать его конечным с ограничениями на число элементов или длине строки правила). Теперь любой css или группу css или одно css правило можно представить как подмножество всех css правил. Как я понимаю Вы хотите сделать из подмножества группы css другое подмножество с меньшим или равным количесвом правил (иначе весь смысл теряется). Те Вы хотите для двух любых правил найти найти в лучшем случае одно, в худшем два правила. Тогда:

    a {...} a {...} можно преобразовать в a {...}

    a {...} div a {...} можно преобразовать в a {...} только в том случае если правила a имеют больший приоритет, например !important, в противном случае этого сделать нельзя тк данные правила определяют разные возможные подмножества.

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

    Теперь поиск. Для того чтобы определить элементы которому удовлетворяет правило, необходимо пройтись по всему дереву. Это достаточно интересный момент, тк некоторые css правила могут явно описывать элементы находящиеся внутри другого правила, например:

    .base .child и .base .child .node заведомо извесно что все .base .child .node элементы будут находиться внутри .base .child.

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

    Вариации поиска. Я вижу два основных варианта:
    1. берем правило, проходим по DOM, для каждого элемента вычисляя является ли правило DOM элемента подмножеством определенного правила и применяем его, переходим к сл правилу.
    2. берем DOM и начинаем проходить по нему, для элемента вычисляя является ли правило DOM элемента подмножеством определенного каждого правила и если да, то применяем его, переходи к сл элементу.

    На второй вариант очень хорошо ложится предложение с деревом подправил и вообще кажется более интересным ввиду того что требуется один обход DOM.
    Ответ написан
    2 комментария
  • Плюсы и минусы разработки и поддержки мобильного веб-приложения на html5 вместо нативных приложений

    Я как-то задавал вопрос: habrahabr.ru/qa/27311/.

    Из минусов:

    Есть люди которые сильно ругаются на всякого рода фреймворки как sencha touch и jquery mobile, говоря что они тормознутые, с другой стороны они в себе решают многие проблемы которые можно встретить в широком мире мобильных браузеров (это я наверное про андроид сейчас, тк использую phonegap, а он работает к сожалению с нативным браузером).

    С другой стороны можно писать все самому, решая многие интересные задачи, но все равно нужно тестировать приложение хотя бы на основных девайсах и допускать что новая версия ОС может поломать Ваше приложение. Здесь также можно проводить ассоциации с IE6, например если брать андроид и пройтись по canisue.com.

    И да работа браузерного кода будет помедленнее.

    Из плюсов:

    Мобильные браузеры тоже не стоят на месте и развиваются, сейчас в современных барузерах поддерживается мультитач, есть нативные списки (owerflow: auto или scroll) и тд. И Вам скорее всего не нужно поддерживать телефоны/версии ОС, которыми мало кто пользуется.

    Писать можно сразу для всех платформ и как вариант выкинуть веб версию. Пишется довольно быстро.

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

    Имхо это интерсно и перспективно на фоне chrome os, firefox os, tizen.
    Ответ написан
    1 комментарий
  • Какие навыки в своей работе Вы используете довольно часто?

    Гугление, очень помогает, когда чего-то не знаешь (сюда же вопросы на стеке или хабре).
    Системы контроля версий.
    Математика, разная, конечно в зависимотси от задач.
    Порой доказывать свою правоту, те обяснить, что то что ты предлагаеш хорошо или то что предлагают другие — бред. Для этого взвешивать за и против. Не боятся высказывать свое мнение или точку зрения, порой даже когда тебя не просят. При этом всем не терять терпение.
    Чтение чужего кода (код коллег или используемых продуктов).
    Ответ написан
    Комментировать
  • Перевод римских чисел в арабские (ошибка в цикле)?

    Используйте enumerate, которая позволит Вам иметь и индекс и значение элемента. Тогда цикл можно записать так:
    for index, literal in enumerate(a):
         pass
    


    Но Вашу задачу я решил бы так:
    #!/usr/bin/env python
    
    rule_add = {
        'I': 1,
        'V': 5,
        'X': 10,
        'L': 50,
        'C': 100,
        'D': 500,
        'M': 1000,
    }
    
    rule_div = {
        ('I', 'V'): 3,
        ('I', 'X'): 8,
        ('X', 'L'): 30,
        ('X', 'C'): 80,
        ('C', 'D'): 300,
        ('C', 'M'): 800,
    }
    
    def roman_to_arabic(roman_number):
        number = 0
        prev_literal = None
        for literal in roman_number:
            if prev_literal and rule_add[prev_literal] < rule_add[literal]:
                number += rule_div[(prev_literal, literal)]
            else:
                number += rule_add[literal]
            prev_literal = literal
        return number
    
    
    
    import unittest
    
    class RomanNumTest(unittest.TestCase):
        def test_roman_num(self):
            self.assertEquals(roman_to_arabic('I'), 1)
            self.assertEquals(roman_to_arabic('II'), 2)
            self.assertEquals(roman_to_arabic('III'), 3)
            self.assertEquals(roman_to_arabic('IV'), 4)
            self.assertEquals(roman_to_arabic('V'), 5)
            self.assertEquals(roman_to_arabic('VI'), 6)
            self.assertEquals(roman_to_arabic('VII'), 7)
            self.assertEquals(roman_to_arabic('VIII'), 8)
            self.assertEquals(roman_to_arabic('IX'), 9)
            self.assertEquals(roman_to_arabic('X'), 10)
            self.assertEquals(roman_to_arabic('XXXI'), 31)
            self.assertEquals(roman_to_arabic('XLVI'), 46)
            self.assertEquals(roman_to_arabic('XCIX'), 99)
            self.assertEquals(roman_to_arabic('DLXXXIII'), 583)
            self.assertEquals(roman_to_arabic('DCCCLXXXVIII'), 888)
            self.assertEquals(roman_to_arabic('MDCLXVIII'), 1668)
            self.assertEquals(roman_to_arabic('MCMLXXXIX'), 1989)
            self.assertEquals(roman_to_arabic('MMX'), 2010)
            self.assertEquals(roman_to_arabic('MMXI'), 2011)
            self.assertEquals(roman_to_arabic('MMXII'), 2012)
            self.assertEquals(roman_to_arabic('MMMCMXCIX'), 3999)
    
    Ответ написан
    2 комментария
  • Как из изображения графика вытащить координаты?

    Если быстро и на коленке то:
    1) подготавливаем специальным образом изображения удаляя ненужныю информацию:



    и



    2) получаем значения граничных линий сетки, цвета сетки и графиков для подготовленных изображений:
    по x: 10 и 10000, по y: -25 и 10, сетка rgb(221,221,221), график rgb(0,0,255)
    по x: 30 и 10000, по y: 90 и 132, сетка rgb(104,104,104), график rgb(150,255,0)

    3) на питоне с помощью PIL пишем код который будет получать по предоставленным данным координаты:
    # -*- coding: utf-8 -*-
    
    from math import log10, fabs
    import Image
    
    
    def check_pixel_colour(pixel, colour, delta=(0,0,0)):
        '''сравниваем цвет пиксиля с эталонным цветом с погрешностью дельта'''
        return (colour[0] - delta[0]) <= pixel[0] <= (colour[0] + delta[0]) and\
               (colour[1] - delta[1]) <= pixel[1] <= (colour[1] + delta[1]) and\
               (colour[2] - delta[2]) <= pixel[2] <= (colour[2] + delta[2])
    
    
    def better_colour_value(pixels, colour):
        '''из списка цветов выбираем более подходящий эталонному цвету'''
        delta = 1024
        better_pixel = None
        for pixel in pixels:
            current_delta = fabs(pixel[0] - colour[0]) +\
                            fabs(pixel[1] - colour[1]) +\
                            fabs(pixel[2] - colour[2])
            if current_delta < delta:
                delta = current_delta
                better_pixel = pixel
        return better_pixel
    
    
    def get_border_grids(image, grid_colour):
        '''
        получаем номера пиксилей по оси x первой и последней линий сетки, по оси y верхней и нижней
        данные пиксили соответствуют переданным граничным значениям сетки
        '''
        width, height = image.size
        for x in xrange(width):
            if check_pixel_colour(image.getpixel((x, 0)), grid_colour):
                yield x
                break
        for x in xrange(width - 1, -1, -1):
            if check_pixel_colour(image.getpixel((x, 0)), grid_colour):
                yield x
                break
        for y in xrange(height - 1, -1, -1):
            if check_pixel_colour(image.getpixel((0, y)), grid_colour):
                yield y
                break
        for y in xrange(height):
            if check_pixel_colour(image.getpixel((0, y)), grid_colour):
                yield y
                break
    
    
    def get_linear_value(x, x1, x2, x1_value, x2_value):
        '''получаем значение для текущего пикселя с учетом граничных значений сетки для линейной оси'''
        k = (x2 - x1) / (x2_value - x1_value)
        b = x1 - k * x1_value
        return (x - b) / k
    
    
    def get_log_value(x, x1, x2, x1_value, x2_value):
        '''получаем значение для текущего пикселя с учетом граничных значений сетки для логорифмической оси'''
        k = (x1 - x2) / (log10(x1_value) - log10(x2_value))
        b = x1 - k * log10(x1_value)
        return 10**((x - b) / k)
    
    
    def process_graph(image_path, x1_value, x2_value, y1_value, y2_value, colour, delta, grid_colour):
        '''получаем список координат графика на изображении'''
        image = Image.open(image_path)
        width, height = image.size
        x1, x2, y1, y2 = get_border_grids(image, grid_colour)
        coordinates = []
    
        for x in xrange(width):
            pixels = {}
            for y in xrange(height):
                pixel = image.getpixel((x, y))
                if check_pixel_colour(pixel, colour, delta):
                    pixels[pixel] = y
            if len(pixels) > 0:
                y = pixels[better_colour_value(pixels.keys(), colour)]
                x_value = get_log_value(x, x1, x2, x1_value, x2_value)
                y_value = get_linear_value(height - y, height - y1, height - y2, y1_value, y2_value)
                coordinates.append((x_value, y_value))
    
        return coordinates
    
    
    if __name__ == '__main__':
        print process_graph('test_001.png', 10., 10000., -25., 10., (0,0,255), (10,10,50), (221,221,221))
        print process_graph('test_002.png', 30., 10000., 90., 132., (150,255,0), (50,50,10), (104,104,104))
    
    


    4) запускаем программу и получаем результаты для каждого пикселя по ox
    Ответ написан
    2 комментария
  • Что выбрать для изучения программирования под веб с нуля сегодня?

    Также можно питон на Flask
    Ответ написан
    Комментировать
  • Каким языкам программирования учить в колледже?

    Я присоединюсь к мнению о питоне.

    GUI: Знакомство программированием у меня началось с Delphi, было интересно писать программы по которым можно было покликать (тогда мне казалось это настоящие программы). Потом я немного познакомился с Qt, там было еще интереснее, но мне всегда было сложновато с C++. Потом я познакомился с Python и через некоторое время мне понадобилось писать гуевое приложение, что я и сделал с помощью PyQt (Python + Qt). Эта связка (PyQt) содержала для меня простоту создания форм Delphi, мощность Qt и простоту Python. Хотя на питоне можно писать используя GTK, Tk, wxWidgets и др.

    Web. Сейчас мне больше всего интересен веб (html+css+js), поэтому возможно именно возможность делать страничку как в ВКонтакте будет более интересна студентам, а серверную часть можно запросто сделать на питоне используя, например, flask (простой и мощный веб фреймворк на питоне). Здесь питон может соревноваться с PHP или Ruby.

    Алгоритмы. Алгоритмы всегда мне казались скучными, но без них никуда. Для этого также подойдет питон (можно глянуть книгу с примерами на питоне: Тоби Сегаран — Программируем коллективный разум), но возможно лучше все же C или C++. Хотя для питона есть всякие SciPy и NumPy, что думаю гораздо будет проще для студентов, чем так и не понятый мной матлаб.

    Также помимо питона было бы полезно и интересно изучить html+css+js, а также C. Вообще то количество преподаваемых мне в университете языков (Delphi, C, C++, asm, java, matlab, prolog) явно излишне. Но главное чтобы студенту было интересно на Ваших занятиях и столкнувшись с трудностями он не забил на все и просто бы старался получить зачет.

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

    Резюмируя:
    Питон очень простой язык, что является огромнейшим плюсом для студентов особенно если нет опыта программирования.
    Питон очень правильный язык, который заставляет писать читаемый и компактный код.
    Питон интересный язык, используя его можно писать простые приложения, решающие практически любые задачи.
    Питон мощный и практичный (прагматичный) язык, который очень популярен и используем и имеет огромную стандартную библиотеку, не говоря о сторонних инструментах.
    Питон имеет удобные и мощные средства для разработки, например, PyCharm бесплатен для студентов.
    Ответ написан
    1 комментарий