• Пакетное автоулучшение изображений GIMP

    В гимп встроены такие скриптовые языки как Scheme (Filters>Script-Fu>Console) и Python (Filters>Python-Fu>Console). Тк мне ближе Python, то расскажу о нем:
    1) документация
    2) можно открыть в самом гимпе консоль Filters>Python-Fu>Console и побаловаться с командами (особенно смотри кнопку Browse)
    3) Небольшой пример использования скрипта: нужно было создать много однотипных маркеров из иконок, просто добавив иконку на фон:
    import os
    
    ORIGINAL_IMAGES_IN_PATH = '../img/icons'
    
    MARKER_IMAGES_OUT_PATH = '../img/markers'
    MARKER_TEMPLATE_PATH = '../css/img-base/marker-template.png'
    
    script = '''
    import os
    
    images_in_path = '%(images_in_path)s'
    
    markers_out_path = '%(markers_out_path)s'
    marker_template_file = '%(marker_template_file)s'
    
    image_extension = '.png'
    
    image_filter = lambda file_name: file_name[-len(image_extension):] == image_extension
    
    
    for root, dirs, files in os.walk(images_in_path):
        for file in filter(image_filter, files):
            input_path = os.path.join(root, file)
            output_path = os.path.join(markers_out_path, file)
    
            image = pdb.gimp_file_load(marker_template_file, 'template')
            layer = pdb.gimp_file_load_layer(image, input_path)
            image.add_layer(layer, 0)
            layer.scale(23, 23, 0)
            layer.set_offsets(7, 7)
            merged_layer = image.merge_visible_layers(0)
            pdb.file_png_save2(image, merged_layer, output_path, output_path, 0, 9, 0, 0, 0, 0, 0, 0, 0)
    
    
    pdb.gimp_quit(0)
    ''' % {'images_in_path': os.path.abspath(ORIGINAL_IMAGES_IN_PATH),
           'markers_out_path': os.path.abspath(MARKER_IMAGES_OUT_PATH),
           'marker_template_file': os.path.abspath(MARKER_TEMPLATE_PATH),}
    
    os.system("""gimp --no-interface --batch-interpreter python-fu-eval --batch "%s" """ % script)
    

    4) похоже Вам нужна команда gimp-levels-stretch
    Automatically modifies intensity levels in the specified drawable.
    This procedure allows intensity levels in the specified drawable to be remapped according to a set of guessed parameters. It is equivalent to clicking the «Auto» button in the Levels tool. This procedure is only valid on RGB color and grayscale images. It will not operate on indexed drawables.
    Ответ написан
    Комментировать
  • Перевод римских чисел в арабские (ошибка в цикле)?

    Используйте 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 комментария
  • Создание карты покрытия?

    Если Вам достаточно точечного покрытия с разной силой, то можно посмотреть в сторону heat map, например, как здась (для яндекса реализации нет, но по примерам видимо это не турдно сделать).
    Ответ написан
    Комментировать
  • Cрабатывание element.remove(subelement) в цикле через раз

    Если глянуть в ElementTree.__getitem_(self, index), то можно заметить что с каждой итерацией item в params передается index: первая итерация 0, вторая — 1и дт
        def __getitem__(self, index ):
            return self._children[index]
    

    Но, вы удаляете элементы из param, следовательно:
    при первой итерации у вас первый item, который удалится
    при второй item (который был третим), который удаляется
    выходим из цикла

    Итого у Вас остаются в params два item
    Ответ написан
    1 комментарий
  • Как получить пользовательские метки?

    В гугло картах для своих меток есть экспорт в KML, по идее его можно получить по данному урлу:
    https://maps.google.com/maps/ms?ie=UTF8&authuser=0&msa=0&output=kml&msid=your_msid_there.
    Для этого нужно чтобы пользовательская карта была расшарена и знать ее msid.
    Ответ написан
  • Какие действуют ограничения на Google Maps API?

    Использование карты и геокодирования

    Библиотеки считаются на клиента, а не для хоста в целом.

    Странно, но в использовании карты говорится о сайте, а не о клиенте: «For-profit web sites are permitted to generate up to 25 000 map loads per day using the Google Maps JavaScript API v3». К тому же нужно быть ну очень настойчивым пользователем чтобы загрузить карту 25000 раз.

    К сожалению в лимит я еще не упирался, но теоретически возможно это можно проверить: открываем 10 вкладок на тестовом хосте и на js раз в 10 секунд перегружаем странцу с картой: приблизительно за 6 часов вы достигните лимита, если Вас не посчитают ботом или лимит на текущий дент не сбросится.
    Ответ написан
    1 комментарий
  • Использование Python-кода из Visual Basic?

    Можно также глянуть emler или shed-skin.
    Также нашел интересную статейку на хабре.
    Ответ написан
    Комментировать
  • Как из изображения графика вытащить координаты?

    Если быстро и на коленке то:
    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
    Ответ написан
    Комментировать
  • Выгрузка данных из Datastore

    На первый взгляд есть две идеи:
    1. Если у Вы можите ограничить запрос каким нибудь значением, например, WHERE id > 0 AND id <= 1000 ORDER BY id
    2. Посмотреть на backup/restore, возможно через него можно сделать
    Ответ написан
  • Оцените кусочек кода

    0. Укажите версию питона.

    1. Узнайте что за исключение кидается except Exception as exception и идите в этом направлении, но у меня просто не находит файл по вводимой строке и пропуская os.path.isdir и os.path.isfile выходит (у вас нет проверки что можно ввести неверное имя файла).
    2. Странно, у меня на венде работает, так что не подскажу.
    3. Нужно пробежаться по всем расширениям и проверить каждое, например если перечислять расширения через запятую.
    any([file_path.endswith(extension) for extension in '.rar,.txt'.split(',')])
    

    4. Почитайте pep8, давайте переменным осмысленные имена, используйте u"%s сконвертирован." % file_path вместо file_path + u" сконвертирован.".
    5. Используйте if __name__ == '__main__':
    6. В функцию converter лучше сразу передавать file_path
    7. Возможно Вам не нужно использовать raw_input, а передавать параметры в виде аргументов (тут поможет sys.argv или argparser)
    8. Вместо print u"-------------------------------" можно писать print u"-" * 20
    9. Лучше добавлять атрибут 'b' в команду open: open(file_path, 'rb') и open(file_path, 'wb')
    Ответ написан
    6 комментариев
  • И все же sscanf в Python — или парсинг простых строк?

    Можете глянуть в сторону pyparsing и похожих утилит по парсингу тескта (синтаксическим анализаторам).
    Ответ написан
    1 комментарий
  • Система аудио комментариев существует/используется?

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

    Из минусов:
    * нужно всегда иметь с собой наушники и/или микрофон
    * неудобно будет оставлять сообщения в зашумленных местах, например метро
    * вопросы с индексацией
    * вопросы с поиском по комментариям
    * вопросы с хранением и передачей, тк звук занимает гораздо больше места чем текст

    Но возможно эта идея подойдет для людей с ограниченными возможностями, или автомобилистам во время управления авто, или людей делающих пробежку вечером. Но все же я склоняюсь что для этого случая лучше сделать возможность надиктовывать и воспроизводить текст голосом, а все данные хранить в текстовом виде. Если же делать комментарии для сайта по выразительному чтению стихов, то возможно лучше хранить дорожку.
    Ответ написан
    Комментировать
  • Как в скрипте создать изображение?

    Задаем ответу тип image/png или что другое и возвращаете содержимое Вашей иконки.
    Для того чтобы сгенерировать содержимое Вашей иконки думаю подойдет PIL, но сам с ним не работал.
    Ответ написан
    1 комментарий
  • Как готовить тематический сайт на основе карты?

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

    По поводу API: в Вашем случае отлично подойдут яндекс карты, но как альтернативу могу предложить посмотреть на google maps api и на основе OSM: leaflet, mapbox и openlayers.

    По поводу js фреймворка: выбирайте то что больше подходит Вашему сайту независимо от карты, тк карта по сути представление, такое же как, например, список или таблица. Возможно Вам хорошо подойдет какой-нибудь MVC фреймворк. По поводу JS MVC фреймфорков можно найти не одну статью на хабре.

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

    Надеюсь мой коментарий хоть чем-то Вам помог.
    Ответ написан
    Комментировать
  • Как одновременно искать в тексте несколько регулярных выражений?

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

    Если и это будет медленно, можно попробовать переписать на C.
    Ответ написан
    1 комментарий
  • Как подсчитать кол-во страниц множества PDF- файлов?

    Вот решение на питоне собранное с помощью py2exe в exe файл и не требующее .net (использует pyPdf если запускать сам скрипт). Первым параметром передается путь к папке, а если его нет, то считаются что это текущая директория:

    # -*- coding: utf-8 -*-
    
    import os
    import sys
    from pyPdf import PdfFileReader
    
    
    PDF_EXTENSION = '.pdf'
    DEFAULT_PATH = '.'
    
    def pages_count(path):
        return PdfFileReader(file(path, "rb")).getNumPages()
    
    if __name__=="__main__":
        path = sys.argv[1] if len(sys.argv) > 1 else DEFAULT_PATH
        total_pages_count = 0
        for root, dirs, files in os.walk(path):
            for file_name in files:
                if file_name[-len(PDF_EXTENSION):] == PDF_EXTENSION:
                    file_path = os.path.join(root, file_name)
                    file_pages_count = pages_count(file_path)
                    print file_path, file_pages_count
                    total_pages_count += file_pages_count
        print 'total:', total_pages_count
    
    
    Ответ написан
    Комментировать
  • Давно не решали занимательные задачки на Хабре?

    Сперва думал что нашел решение с 5ю попытками, потом решил проверить кодом: для 5и и меньше попыток решения не нашел, для 6и 1056 разных решений, причем последний ход не всегда заканчивается поднятием последнего стакана.
    Или же мой код неверен.

    Решение в лоб для 5и попыток:

    wins = 0
    # i1, i2, i3 и тд - выбор стакана на 1ом, 2ом, 3ем и тд шагах соответственно
    for i1 in xrange(1, 11):
        for i2 in xrange(1, 11):
            for i3 in xrange(1, 11):
                for i4 in xrange(1, 11):
                    for i5 in xrange(1, 11):
                        win = 0
                        # j - начальное положение шарика
                        # pos1, pos2, pos3 и тд
                        # - положение шарика в начале 1ого, 2ого, 3его и тд хода
                        for j in xrange(1, 11):
                            pos1 = min(j + 0, 10)
                            pos2 = min(j + 1, 10)
                            pos3 = min(j + 2, 10)
                            pos4 = min(j + 3, 10)
                            pos5 = min(j + 4, 10)
                            if i1 == pos1 or i2 == pos2 or i3 == pos3\
                            or i4 == pos4 or i5 == pos5:
                                win += 1
                        if win == 10:
                            print i1, i2, i3, i4, i5
                            wins += 1
    print wins
    


    Решение в лоб для 6и попыток:

    wins = 0
    # i1, i2, i3 и тд - выбор стакана на 1ом, 2ом, 3ем и тд шагах соответственно
    for i1 in xrange(1, 11):
        for i2 in xrange(1, 11):
            for i3 in xrange(1, 11):
                for i4 in xrange(1, 11):
                    for i5 in xrange(1, 11):
                        for i6 in xrange(1, 11):
                            win = 0
                            # j - начальное положение шарика
                            # pos1, pos2, pos3 и тд
                            # - положение шарика в начале 1ого, 2ого, 3его и тд хода
                            for j in xrange(1, 11):
                                pos1 = min(j + 0, 10)
                                pos2 = min(j + 1, 10)
                                pos3 = min(j + 2, 10)
                                pos4 = min(j + 3, 10)
                                pos5 = min(j + 4, 10)
                                pos6 = min(j + 5, 10)
                                if i1 == pos1 or i2 == pos2 or i3 == pos3\
                                or i4 == pos4 or i5 == pos5 or i6 == pos6:
                                    win += 1
                            if win == 10:
                                print i1, i2, i3, i4, i5, i6
                                wins += 1
    print wins
    
    Ответ написан
    Комментировать
  • Что разрабатываю Java и .NET программисты?

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

    Если Вам хочется писать веб, то лучше попробовать python или ruby и еще java script.
    Если Вам хочется писать системные утилиты, алгоритмы, то лучше поробовать C или C++.
    Если Вам хочется писать под мобильные системы, то можно выбирать между java, objective-C, .net (можно также подумать о java script, но совет спорный).
    Если Вам хочется писать игры, здесь я ничего не подскажу.
    Если Вам хочется писать десктопные приложения, то лучше попробовать C++, .net (только венда).
    Если Вам хочется сидеть не на венде и писать не только под венду, то лучше не думать о .net.

    По поводу IDE: у java есть eclipse, net beans, но я бы посоветовал idea (особенно когда Вы не видите жизни без решарпера под вижлу). Кстати все эти IDE написаны на java.

    По поводу использования: понятно что .net широко использует microsoft, java же использует, например, google. Но должен дать замечание, что на обоих этих языках широко пишут «некоторые» аутсорсинговые компании так называемые enterprise приложения (вероятно большинство вакансий именно их) код которых возможно бывал в руках некоторых индуских племен или морально устарел.

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

    Поэтому еще раз посоветую выбирать то, к чему больше лежит душа. Например мне сперва нравилась java и я начинал изучать ее, но потом пришлось работать с .net, а сейчас я перехожу на python. Или же найдите компанию, где хотите работать (и/или где есть большая вероятность быть принятым на работу), узнайте на чем пишут там. Возможно также не стоит ограничиваться только java и .net. В любом случае если усердно работать и развиваться, то выбор языка по сути не имеет значения.
    Ответ написан
    Комментировать