<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Праздник Игоря &#187; Техноблог</title>
	<atom:link href="http://www.kigorw.com/category/technoblog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kigorw.com</link>
	<description>Алогичная логика</description>
	<lastBuildDate>Thu, 25 Feb 2010 17:56:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Яндекс&#160;и&#160;суббота</title>
		<link>http://www.kigorw.com/2009/04/28/yandex-css/</link>
		<comments>http://www.kigorw.com/2009/04/28/yandex-css/#comments</comments>
		<pubDate>Tue, 28 Apr 2009 20:10:28 +0000</pubDate>
		<dc:creator>Кигорв</dc:creator>
				<category><![CDATA[Техноблог]]></category>
		<category><![CDATA[семинар]]></category>
		<category><![CDATA[яндекс]]></category>

		<guid isPermaLink="false">http://www.kigorw.com/?p=801</guid>
		<description><![CDATA[В субботу&#160;ходил на&#160;субботник.
Интересно, что&#160;бесплатно&#160;и&#160;в&#160;придачу&#160;дали&#160;кучу&#160;цацек&#160;(включая&#160;водичку, чай, кофе, соки, бутерброды в&#160;перерывах). Особенно, мегапонравилась ручка&#160;с&#160;фонариком, которая&#160;проецирует надпись яндекс&#160;на&#160;любые поверхности. Попросил даже еще одну&#160;ручку.

Сначала&#160;было&#160;выступление, посвященное верстке в&#160;Idea от&#160;JetBrains. Возможно, в&#160;будущем сделаю шаг в&#160;сторону&#160;от&#160;эклипса&#160;и&#160;навстречу&#160;Идее.
Потом рассказывали&#160;про&#160;нарезку&#160;картинок. Узнал про&#160;гамму&#160;2.2 и&#160;оптимизаторы картинок. Полезный доклад.

Далее Виталий Харисов&#160;говорил про&#160;верстку&#160;независимыми&#160;блоками. К слову, мы в&#160;студии&#160;используем его&#160;подход (и&#160;вообще многим вещам научились из&#160;докладов&#160;яндексовцев). Еще я&#160;узнал, что&#160;подняли&#160;клуб, посвященный этому&#160;делу.

]]></description>
			<content:encoded><![CDATA[<p>В субботу&nbsp;ходил на&nbsp;<a href="http://clubs.ya.ru/company/replies.xml?item_no=15607&#038;ncrnd=3542">субботник</a>.<br />
Интересно, что&nbsp;бесплатно&nbsp;и&nbsp;в&nbsp;придачу&nbsp;дали&nbsp;кучу&nbsp;цацек&nbsp;(включая&nbsp;водичку, чай, кофе, соки, бутерброды в&nbsp;перерывах). Особенно, мегапонравилась ручка&nbsp;с&nbsp;фонариком, которая&nbsp;проецирует надпись яндекс&nbsp;на&nbsp;любые поверхности. Попросил даже еще одну&nbsp;ручку.<br />
<img src="http://kigorw.com/files/yandex_cacki.jpg" alt="" /></p>
<p>Сначала&nbsp;было&nbsp;выступление, посвященное верстке в&nbsp;Idea от&nbsp;JetBrains. Возможно, в&nbsp;будущем сделаю шаг в&nbsp;сторону&nbsp;от&nbsp;эклипса&nbsp;и&nbsp;навстречу&nbsp;Идее.</p>
<p>Потом рассказывали&nbsp;про&nbsp;нарезку&nbsp;картинок. Узнал про&nbsp;гамму&nbsp;2.2 и&nbsp;оптимизаторы картинок. Полезный доклад.<br />
<img src="http://kigorw.com/files/yandex_knife.jpg" alt="" /></p>
<p>Далее Виталий Харисов&nbsp;говорил про&nbsp;верстку&nbsp;независимыми&nbsp;блоками. К слову, мы в&nbsp;студии&nbsp;используем его&nbsp;подход (и&nbsp;вообще многим вещам научились из&nbsp;докладов&nbsp;яндексовцев). Еще я&nbsp;узнал, что&nbsp;подняли&nbsp;<a href="http://clubs.ya.ru/yacf/">клуб, посвященный этому&nbsp;делу</a>.<br />
<img src="http://kigorw.com/files/yandex_blocks.jpg" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.kigorw.com/2009/04/28/yandex-css/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bind-функция&#160;для&#160;jQuery</title>
		<link>http://www.kigorw.com/2009/03/12/jquery-bind/</link>
		<comments>http://www.kigorw.com/2009/03/12/jquery-bind/#comments</comments>
		<pubDate>Thu, 12 Mar 2009 20:33:58 +0000</pubDate>
		<dc:creator>Кигорв</dc:creator>
				<category><![CDATA[Техноблог]]></category>

		<guid isPermaLink="false">http://www.kigorw.com/?p=729</guid>
		<description><![CDATA[Как&#160;разработчик&#160;привыкший к&#160;использованию библиотеки&#160;prototype.js, я&#160;не&#160;смог понять причину&#160;отсутствия&#160;в&#160;библиотеке jQuery отсутсвия&#160;метода&#160;bind, который позволяет в&#160;обработчик&#160;передать контекст (scope). А я&#160;часто&#160;пишу&#160;слабо&#160;связанные классы, которые связываются&#160;посредством событий.
Поэтому, взяв&#160;за&#160;основу&#160;код из&#160;prototype.js я&#160;его&#160;адаптировал к&#160;полной независимости&#160;от&#160;библиотек.

Function.prototype.bind = function() {
    if (arguments.length < 1 &#038;& typeof arguments[0] != "undefined") return this;
    var __method = this, args = [];
	for(var i=0;i]]></description>
			<content:encoded><![CDATA[Как&nbsp;разработчик&nbsp;привыкший к&nbsp;использованию библиотеки&nbsp;prototype.js, я&nbsp;не&nbsp;смог понять причину&nbsp;отсутствия&nbsp;в&nbsp;библиотеке jQuery отсутсвия&nbsp;метода&nbsp;bind, который позволяет в&nbsp;обработчик&nbsp;передать контекст (scope). А я&nbsp;часто&nbsp;пишу&nbsp;слабо&nbsp;связанные классы, которые связываются&nbsp;посредством событий.
Поэтому, взяв&nbsp;за&nbsp;основу&nbsp;код из&nbsp;prototype.js я&nbsp;его&nbsp;адаптировал к&nbsp;полной независимости&nbsp;от&nbsp;библиотек.
<textarea  name="code" class="js" cols="80" rows="30">
Function.prototype.bind = function() {
    if (arguments.length < 1 && typeof arguments[0] != "undefined") return this;
    var __method = this, args = [];
	for(var i=0;i<arguments.length;i++){ args.push(arguments[i]);}
	
	var object = args.shift();
    return function() {
	  var args_to_apply = []
	  
	  for(var i=0;i<args.length;i++){ args_to_apply.push(args[i]);}
	  for(var i=0;i<arguments.length;i++){ args_to_apply.push(arguments[i]);}
      return __method.apply(object, args_to_apply);
    }
  };
</textarea>
Теперь можно&nbsp;так&nbsp;обрабатывать события&nbsp;(ну&nbsp;или&nbsp;коллбеки, кто&nbsp;как&nbsp;назовет):
<textarea  name="code" class="js" cols="80" rows="30">
tree1.getAsyncData = this.getAsyncData.bind(this, 1);
</textarea>
В отличие от&nbsp;распространенной практики&nbsp;в&nbsp;jQuery:
<textarea  name="code" class="js" cols="80" rows="30">
var _this = this;
tree1.getAsyncData = function(arg) { _this.getAsyncData(arg, 1); };
</textarea>
Еще сторонники&nbsp;jQuery часто&nbsp;пишут код обработчика&nbsp;прямо&nbsp;в&nbsp;анонимной функции.
Замечу, что&nbsp;постоянно&nbsp;вижу&nbsp;у&nbsp;jQuery-разработчиков&nbsp;очень грязный код, в&nbsp;котором одна&nbsp;функция&nbsp;может быть на&nbsp;весь экран и&nbsp;более.
Следует всегда&nbsp;в&nbsp;независимости&nbsp;от&nbsp;принятых подходов&nbsp;в&nbsp;фреймворке оформлять код руководствуясь книгой «Рефакторинг» Фаулера. Мне&nbsp;лично&nbsp;нравится&nbsp;продуманность и&nbsp;чистота&nbsp;кода&nbsp;библиотеки&nbsp;Ext.js]]></content:encoded>
			<wfw:commentRss>http://www.kigorw.com/2009/03/12/jquery-bind/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Алгоритм эффективного&#160;выполнения&#160;любого&#160;задания</title>
		<link>http://www.kigorw.com/2009/03/04/algoritm-effektivnogo-vypolneniya-lyubogo-zadaniya/</link>
		<comments>http://www.kigorw.com/2009/03/04/algoritm-effektivnogo-vypolneniya-lyubogo-zadaniya/#comments</comments>
		<pubDate>Wed, 04 Mar 2009 11:38:15 +0000</pubDate>
		<dc:creator>Кигорв</dc:creator>
				<category><![CDATA[Мысли Кигорва]]></category>
		<category><![CDATA[Техноблог]]></category>

		<guid isPermaLink="false">http://www.kigorw.com/?p=716</guid>
		<description><![CDATA[Постоянно&#160;вижу, как&#160;по&#160;причине&#160;недостаточного&#160;планирования&#160;серьезно&#160;снижается&#160;скорость работы.
Предлагаю простой способ&#160;для&#160;повышения&#160;эффективности&#160;и&#160;сохранения&#160;работоспособности&#160;мозга.
Вам поставили&#160;локальную задачу&#160;в&#160;рамках проекта. Алгоритм решения:
1. Понять для&#160;чего&#160;проект и&#160;каким целям служит. Если&#160;не&#160;понятно, спросить.
2. Узнать все, что&#160;требуется&#160;для&#160;того&#160;чтоб&#160;ваша&#160;задача&#160;считалась завершенной.
3. После того&#160;как&#160;задача&#160;понятна, следует расписать ее на&#160;мелкие подзадачи, т.е. составить план (разумеется, записать его).
Каждый пункт плана&#160;должен быть небольшим, чтоб&#160;с&#160;большой долей правды его&#160;можно&#160;было&#160;оценить по&#160;времени. Подробное планирование заставляет мозг обдумать способы решения&#160;и&#160;закрепить картину&#160;выполнения.
4. Сказать тому&#160;кто&#160;поставил задачу&#160;прогнозируемое время&#160;выполнения&#160;и&#160;прогнозируемую [...]]]></description>
			<content:encoded><![CDATA[<p>Постоянно&nbsp;вижу, как&nbsp;по&nbsp;причине&nbsp;недостаточного&nbsp;планирования&nbsp;серьезно&nbsp;снижается&nbsp;скорость работы.<br />
Предлагаю простой способ&nbsp;для&nbsp;повышения&nbsp;эффективности&nbsp;и&nbsp;сохранения&nbsp;работоспособности&nbsp;мозга.</p>
<p>Вам поставили&nbsp;локальную задачу&nbsp;в&nbsp;рамках проекта. Алгоритм решения:</p>
<p>1. Понять для&nbsp;чего&nbsp;проект и&nbsp;каким целям служит. Если&nbsp;не&nbsp;понятно, спросить.</p>
<p>2. Узнать все, что&nbsp;требуется&nbsp;для&nbsp;того&nbsp;чтоб&nbsp;ваша&nbsp;задача&nbsp;считалась завершенной.</p>
<p>3. После того&nbsp;как&nbsp;задача&nbsp;понятна, следует расписать ее на&nbsp;мелкие подзадачи, т.е. составить план (разумеется, записать его).<br />
Каждый пункт плана&nbsp;должен быть небольшим, чтоб&nbsp;с&nbsp;большой долей правды его&nbsp;можно&nbsp;было&nbsp;оценить по&nbsp;времени. Подробное планирование заставляет мозг обдумать способы решения&nbsp;и&nbsp;закрепить картину&nbsp;выполнения.</p>
<p>4. Сказать тому&nbsp;кто&nbsp;поставил задачу&nbsp;прогнозируемое время&nbsp;выполнения&nbsp;и&nbsp;прогнозируемую дату. В тоже время&nbsp;мозг получит ограничение по&nbsp;времени&nbsp;и&nbsp;в&nbsp;фоновом режиме начнет корректировать действия&nbsp;чтоб&nbsp;уложиться&nbsp;в&nbsp;срок.</p>
<p>5. Последовательно&nbsp;выполнить каждый пункт плана.<br />
По&nbsp;себе знаю, что&nbsp;с&nbsp;большой неохотой сажусь за&nbsp;выполнение непонятных мне&nbsp;задач, делаю их&nbsp;медленно. Если&nbsp;же проанализировать вначале задачу&nbsp;и&nbsp;сделать ее ясной&nbsp;— выполнение пойдет плавно&nbsp;и&nbsp;приятно.</p>
<p>Если&nbsp;у&nbsp;вас&nbsp;много&nbsp;разных задач, ведите туду&nbsp;лист (мне&nbsp;хватает текстовых файликов).<br />
В случае если&nbsp;у&nbsp;вас&nbsp;есть мелкие задачки, лучше их&nbsp;сделать быстро&nbsp;и&nbsp;сразу, чтоб&nbsp;освободить место&nbsp;в&nbsp;мозге.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kigorw.com/2009/03/04/algoritm-effektivnogo-vypolneniya-lyubogo-zadaniya/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Значение поля&#160;формы в&#160;Django шаблоне</title>
		<link>http://www.kigorw.com/2009/02/03/django-form-field-value-template/</link>
		<comments>http://www.kigorw.com/2009/02/03/django-form-field-value-template/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 23:25:20 +0000</pubDate>
		<dc:creator>Кигорв</dc:creator>
				<category><![CDATA[Техноблог]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://www.kigorw.com/?p=631</guid>
		<description><![CDATA[Порой мелкие и&#160;простые ситуации&#160;отнимают лишнее время. Сегодня&#160;я&#160;встретился&#160;с&#160;ситуацией, что&#160;мне&#160;нужно&#160;было&#160;получить в&#160;шаблоне&#160;значение поля&#160;формы. Можно&#160;было&#160;бы передать значение в&#160;контексте, но&#160;это&#160;было&#160;бы уже дублированием.
Есть простой способ&#160;получить значение поля&#160;формы:
{{form.initial.field_name}}
]]></description>
			<content:encoded><![CDATA[<p>Порой мелкие и&nbsp;простые ситуации&nbsp;отнимают лишнее время. Сегодня&nbsp;я&nbsp;встретился&nbsp;с&nbsp;ситуацией, что&nbsp;мне&nbsp;нужно&nbsp;было&nbsp;получить в&nbsp;шаблоне&nbsp;значение поля&nbsp;формы. Можно&nbsp;было&nbsp;бы передать значение в&nbsp;контексте, но&nbsp;это&nbsp;было&nbsp;бы уже дублированием.<br />
Есть простой способ&nbsp;получить значение поля&nbsp;формы:<br />
{{form.initial.field_name}}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kigorw.com/2009/02/03/django-form-field-value-template/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python yield&#160;— простым языком</title>
		<link>http://www.kigorw.com/2008/12/21/python-yield-generator/</link>
		<comments>http://www.kigorw.com/2008/12/21/python-yield-generator/#comments</comments>
		<pubDate>Sun, 21 Dec 2008 09:04:30 +0000</pubDate>
		<dc:creator>Кигорв</dc:creator>
				<category><![CDATA[Техноблог]]></category>

		<guid isPermaLink="false">http://www.kigorw.com/?p=548</guid>
		<description><![CDATA[
>>> def a():
...     yield 1
...     yield []
...     yield [21, 212]
...     yield [21, 21222]
...     yield [21]
...
>>> b = a()
>>> b.next()
1
>>> b.next()
[]
>>> b.next()
[21, 212]
>>> b.next()
[21, 21222]
>>> b.next()
[21]
>>> b.next() # уже нет значений, сейчас будет эксепшн
Traceback (most recent [...]]]></description>
			<content:encoded><![CDATA[<textarea  name="code" class="js" cols="80" rows="30">
>>> def a():
...     yield 1
...     yield []
...     yield [21, 212]
...     yield [21, 21222]
...     yield [21]
...
>>> b = a()
>>> b.next()
1
>>> b.next()
[]
>>> b.next()
[21, 212]
>>> b.next()
[21, 21222]
>>> b.next()
[21]
>>> b.next() # уже нет значений, сейчас будет эксепшн
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
</textarea>
Надеюсь, теперь понятно, что&nbsp;делает это&nbsp;команда. Фактически&nbsp;в&nbsp;функции&nbsp;встроен скрытый массив&nbsp;<em>result</em>, в&nbsp;который мы добавляем значения&nbsp;при&nbsp;вызове yield. При&nbsp;вызове <em>next</em> мы делаем <em>pop</em> из&nbsp;возвращенного&nbsp;значения. 
Можно&nbsp;также бежать по&nbsp;результату&nbsp;вызова&nbsp;функции&nbsp;(итератору) <em>a</em> как&nbsp;по&nbsp;обычному&nbsp;массиву&nbsp;<textarea  name="code" class="js" cols="80" rows="30">
for elem in a():
...
</textarea>]]></content:encoded>
			<wfw:commentRss>http://www.kigorw.com/2008/12/21/python-yield-generator/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Решение криптоарифметической задачи</title>
		<link>http://www.kigorw.com/2008/12/20/python-crypto-solve/</link>
		<comments>http://www.kigorw.com/2008/12/20/python-crypto-solve/#comments</comments>
		<pubDate>Sat, 20 Dec 2008 09:07:49 +0000</pubDate>
		<dc:creator>Кигорв</dc:creator>
				<category><![CDATA[Техноблог]]></category>

		<guid isPermaLink="false">http://www.kigorw.com/?p=543</guid>
		<description><![CDATA[
Начал читать книгу&#160;«Экспертные системы: принципы разработки&#160;и&#160;программирование». Книга&#160;массивная, много&#160;букв. В конце первой главы дается&#160;криптоарифметическая&#160;задачка&#160;donald+gerald = robert при&#160;условии, что&#160;d = 5. Взял листик&#160;бумаги&#160;и&#160;ручку, минут 5–10 ушло&#160;на&#160;решение. В книге дают задание написать программу, решающую эту&#160;задачу. Начал придумывать как&#160;бы я&#160;написал эту&#160;программу. В голову&#160;пришло&#160;решение «в&#160;лоб», используя&#160;перебор.


Собрал в&#160;кулак&#160;свою лень, создал питоновский файл и&#160;начал писать. Далее будет код с&#160;краткими&#160;вкраплениями&#160;моих&#160;комментариев:

# у меня стоит [...]]]></description>
			<content:encoded><![CDATA[<p>
Начал читать книгу&nbsp;«Экспертные системы: принципы разработки&nbsp;и&nbsp;программирование». Книга&nbsp;массивная, много&nbsp;букв. В конце первой главы дается&nbsp;криптоарифметическая&nbsp;задачка&nbsp;donald+gerald = robert при&nbsp;условии, что&nbsp;d = 5. Взял листик&nbsp;бумаги&nbsp;и&nbsp;ручку, минут 5–10 ушло&nbsp;на&nbsp;решение. В книге дают задание написать программу, решающую эту&nbsp;задачу. Начал придумывать как&nbsp;бы я&nbsp;написал эту&nbsp;программу. В голову&nbsp;пришло&nbsp;решение «в&nbsp;лоб», используя&nbsp;перебор.
</p>
<p>
Собрал в&nbsp;кулак&nbsp;свою лень, создал питоновский файл и&nbsp;начал писать. Далее будет код с&nbsp;краткими&nbsp;вкраплениями&nbsp;моих&nbsp;комментариев:
<textarea  name="code" class="js" cols="80" rows="30">
# у меня стоит питон 2.5 этой функции там еще нет, но в питоне 2.6 она уже есть
# эта функция перемешивает массив чисел создавая все возможные комбинации, и добавляя в итератор
def permutations(iterable, r=None):
    # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
    # permutations(range(3)) --> 012 021 102 120 201 210
    pool = tuple(iterable)
    n = len(pool)
    r = n if r is None else r
    indices = range(n)
    cycles = range(n, n-r, -1)
    yield tuple(pool[i] for i in indices[:r])
    while n:
        for i in reversed(range(r)):
            cycles[i] -= 1
            if cycles[i] == 0:
                indices[i:] = indices[i+1:] + indices[i:i+1]
                cycles[i] = n - i
            else:
                j = cycles[i]
                indices[i], indices[-j] = indices[-j], indices[i]
                yield tuple(pool[i] for i in indices[:r])
                break
        else:
            return

import time
#декоратор для замера времени
def print_timing(func):
    def wrapper(*arg):
        t1 = time.time()
        res = func(*arg)
        t2 = time.time()
        print '%s took %0.3f s' % (func.func_name, (t2-t1))
        return res
    return wrapper


class Resolver(object):
#хардкодом инициализирую все что нужно
    item1 = "donald"
    item2 = "gerald"
    result = "robert"
    known_elem = {"d": 5}
   
    # создаю массив уникальных букв, собранных из 3 слов, вероятно есть более красивый способ на питоне написать такой код (по мере своего развития в питоне буду такой код писать)
    def get_letters_array(self):
        result = []
        s = self.item1+self.item2+ self.result
        arr = list(s)
        for letter in arr:
            if not letter in result and not letter in self.known_elem:
                result.append(letter)
        
        return result

#по порядку создаем хеш где каждой букве соответствует число из массива (и тут питон не идеален)
    def get_letters_numbers(self, letters_array, numbers):
        result = {}
        i = 0
        
        for letter in letters_array:
            result[letter]= numbers[i]
            i+=1
        return result
  
#строка преобразуется в числовое значение например "donald" => в число
    def get_number(self, letters_numbers, _str):
        result = []
        for s in list(_str):
            if s in self.known_elem:
                result.append(str(self.known_elem[s]))
                continue
            result.append(str(letters_numbers[s]))
            
        return int("".join(result))
        
 #создаем массив цифр для подстановок, если уже есть известный элемент удаляем его для сокращения количества итераций      
    def get_initial_numbers(self):
        arr = range(0, 10)
        if self.known_elem.values()[0] in arr:
            arr.remove(self.known_elem.values()[0] )
        return arr

   #проверяем чтоб число не начиналось с 0
    def firstNumberIs0(self, letters_numbers):
        return (letters_numbers[self.item1[0]]==0 or
               letters_numbers[self.item2[0]]==0 or
               letters_numbers[self.result[0]]==0)
       
#тут все начинается      
    @print_timing
    def resolve(self):
        letters_array = self.get_letters_array();
        current_iterantion = 0
        initial_numbers = self.get_initial_numbers()
        
        for numbers in permutations(initial_numbers):
            letters_numbers = self.get_letters_numbers(letters_array, numbers)
            item1 = self.get_number(letters_numbers, self.item1)
            item2 = self.get_number(letters_numbers, self.item2)
            result = self.get_number(letters_numbers, self.result)
            if item1 + item2 ==result:
                print "result found on %s iteration: %s + %s = %s" % (current_iterantion, item1, item2, result)
                break
            current_iterantion+=1
        return
            
            
        
if __name__ == '__main__':
    Resolver().resolve()
</textarea>
</p>
<p>
Результаты:<br />
<em>donald+gerald = robert</em>
если&nbsp;известно, что&nbsp;<em>d = 5 </em>:<br />
<em>
result found on 103487 iteration: 526485 + 197485 = 723970<br />
resolve took 9.399 s</em><br />

если&nbsp;ничего&nbsp;не&nbsp;известно&nbsp;— подольше:<br />
<em>result found on 1917887 iteration: 526485 + 197485 = 723970<br />
resolve took 183.831 s</em>
</p>
<p>
Нашел еще задачку:
<em>send+more = money</em><br />

<em>result found on 2787378 iteration: 9567 + 1085 = 10652<br />
resolve took 265.016 s</em>
</p>
<p>
Сделал для&nbsp;себя&nbsp;несколько&nbsp;выводов. Метод перебора, довольно&nbsp;таки&nbsp;дубовый и&nbsp;медленный. В следующий раз хочу&nbsp;попробовать что-то&nbsp;быстрое, может генетический алгортим.
Понял, что&nbsp;нужно&nbsp;углубить знания&nbsp;в&nbsp;питоне&nbsp;для&nbsp;более эффективного&nbsp;написания&nbsp;кода.
</p>]]></content:encoded>
			<wfw:commentRss>http://www.kigorw.com/2008/12/20/python-crypto-solve/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Сlonedigger&#160;— инструмент нахождения&#160;дубликатов&#160;в&#160;Python коде</title>
		<link>http://www.kigorw.com/2008/12/18/python-code-duplication-detector/</link>
		<comments>http://www.kigorw.com/2008/12/18/python-code-duplication-detector/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 07:04:15 +0000</pubDate>
		<dc:creator>Кигорв</dc:creator>
				<category><![CDATA[Техноблог]]></category>

		<guid isPermaLink="false">http://www.kigorw.com/?p=533</guid>
		<description><![CDATA[Нашел отличный инструмент для&#160;нахождения&#160;дублирования&#160;в&#160;питоновском коде. Давно&#160;искал что-то&#160;подобное. Качественный инструмент. В результате прогона&#160;по&#160;коду, инструмент генерирует удобный html-отчет.
http://clonedigger.sourceforge.net/index.html
]]></description>
			<content:encoded><![CDATA[<p>Нашел отличный инструмент для&nbsp;нахождения&nbsp;дублирования&nbsp;в&nbsp;питоновском коде. Давно&nbsp;искал что-то&nbsp;подобное. Качественный инструмент. В результате прогона&nbsp;по&nbsp;коду, инструмент генерирует удобный html-отчет.<br />
<a href="http://clonedigger.sourceforge.net/index.html">http://clonedigger.sourceforge.net/index.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.kigorw.com/2008/12/18/python-code-duplication-detector/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Динамические запросы (фильтры) в&#160;django</title>
		<link>http://www.kigorw.com/2008/11/30/dynamic-django-filtering/</link>
		<comments>http://www.kigorw.com/2008/11/30/dynamic-django-filtering/#comments</comments>
		<pubDate>Sun, 30 Nov 2008 14:23:28 +0000</pubDate>
		<dc:creator>Кигорв</dc:creator>
				<category><![CDATA[Техноблог]]></category>

		<guid isPermaLink="false">http://www.kigorw.com/?p=483</guid>
		<description><![CDATA[Хороший заголовок, информации&#160;в&#160;гугле по&#160;этому&#160;поводу&#160;не&#160;найдено. Стоит задача&#160;сделать фильтр. Возьмем, к&#160;примеру, таблицу, первая&#160;строка&#160;которой содержит фильтры для&#160;колонок. Усложненный вариант фильтра&#160;позволяет выбирать сразу&#160;несколько&#160;значений. Реализовать такой механизм средствами&#160;ORM django довольно&#160;просто.

Создаем метод, получающий на&#160;вход имя&#160;поля&#160;и&#160;массив&#160;значений:

from django.db.models import Q
# тут происходит or соединение условий
 def _get_condition(self, field, values):
        result = None
     [...]]]></description>
			<content:encoded><![CDATA[<p>Хороший заголовок, информации&nbsp;в&nbsp;гугле по&nbsp;этому&nbsp;поводу&nbsp;не&nbsp;найдено. Стоит задача&nbsp;сделать фильтр. Возьмем, к&nbsp;примеру, таблицу, первая&nbsp;строка&nbsp;которой содержит фильтры для&nbsp;колонок. Усложненный вариант фильтра&nbsp;позволяет выбирать сразу&nbsp;несколько&nbsp;значений. Реализовать такой механизм средствами&nbsp;ORM django довольно&nbsp;просто.</p>
<p>
Создаем метод, получающий на&nbsp;вход имя&nbsp;поля&nbsp;и&nbsp;массив&nbsp;значений:
<textarea  name="code" class="js" cols="80" rows="30">
from django.db.models import Q
# тут происходит or соединение условий
 def _get_condition(self, field, values):
        result = None
        for value in values:
            query = Q(**{str(field): str(value)})
            if not result:#for first value
                result = query
            else:
                result = result | query
        return result

# тут происходит and соединение условий
  def _get_filtering_param(self, filters):
        result = None
        for field, values in filters.items():
                condition = self._get_condition(field, values)
                if not result:#for first value
                    result = condition
                else:
                    result = result & condition
       
        return result
</textarea>
Вызывать можно&nbsp;таким образом:
<textarea  name="code" class="js" cols="80" rows="30">
condition = self._get_filtering_param(
{"city__country__name", ["Ukraine", "Russua"], "title": ["Wow"]}
)
query = self.model.objects.filter(condition)
#print query.query.as_sql() - при желании можем посмотреть, сгенерированный sql
</textarea>
Обращаю внимание на&nbsp;одну&nbsp;очень замечательную особенность ORM django&nbsp;— <em>city__country__name</em>. Эта&nbsp;запись означает, что&nbsp;мы фильтруем по&nbsp;имени&nbsp;страны, к&nbsp;которой принадлежит город нашей целевой модели. Работу&nbsp;по&nbsp;созданию джоинов&nbsp;джанго&nbsp;берет на&nbsp;себя.
</p>
<p>
Основываясь на&nbsp;коде, приведенном выше можно&nbsp;построить универсальную систему&nbsp;фильтрации.
</p>]]></content:encoded>
			<wfw:commentRss>http://www.kigorw.com/2008/11/30/dynamic-django-filtering/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="1" length="" type="" />
		</item>
		<item>
		<title>Анализируя&#160;JavaScript код</title>
		<link>http://www.kigorw.com/2008/11/24/javascript-patterns/</link>
		<comments>http://www.kigorw.com/2008/11/24/javascript-patterns/#comments</comments>
		<pubDate>Mon, 24 Nov 2008 15:11:37 +0000</pubDate>
		<dc:creator>Кигорв</dc:creator>
				<category><![CDATA[Техноблог]]></category>

		<guid isPermaLink="false">http://www.kigorw.com/?p=453</guid>
		<description><![CDATA[Порой анализируя&#160;свой и&#160;чужой код, можно&#160;обнаружить много&#160;интересного&#160;даже в&#160;простых мелочах. Рассмотрим примеры.


Спрятать и&#160;показать

Типичный код,&#160;— абсолютно&#160;симметричная&#160;пара&#160;методов&#160;для&#160;сокрытия&#160;и&#160;показа&#160;чего-то. Но&#160;решение не&#160;самое лучшее из-за&#160;дублирования:

    show:function()
    {
        this.container.style.visibility = "visible";
        this.open_button.style.visibility = "hidden";
    },

    hide:function()   [...]]]></description>
			<content:encoded><![CDATA[<p>Порой анализируя&nbsp;свой и&nbsp;чужой код, можно&nbsp;обнаружить много&nbsp;интересного&nbsp;даже в&nbsp;простых мелочах. Рассмотрим примеры.
</p>

<h2>Спрятать и&nbsp;показать</h2>
<p>
Типичный код,&nbsp;— абсолютно&nbsp;симметричная&nbsp;пара&nbsp;методов&nbsp;для&nbsp;сокрытия&nbsp;и&nbsp;показа&nbsp;чего-то. Но&nbsp;решение не&nbsp;самое лучшее из-за&nbsp;дублирования:
<textarea  name="code" class="js" cols="80" rows="30">
    show:function()
    {
        this.container.style.visibility = "visible";
        this.open_button.style.visibility = "hidden";
    },

    hide:function()   
    {
        this.container.style.visibility = "hidden";
        this.open_button.style.visibility = "visible";
    },
</textarea>
</p>
<p>
Рефакторим:
<textarea  name="code" class="js" cols="80" rows="30">
     show:function()
    {
       this.setState(true);
    },

    hide:function()   
    {
        this.setState(false);        
    },
    
    _setState:function(showContainer)
    {
        var visibility= ["visible","hidden"]; 
        this.container.style.visibility = visibility[showContainer?1:0];
        this.open_button.style.visibility = "visibility[showContainer?0:1];
    }

</textarea>
</p>
<p>
Вполне&nbsp;резонно&nbsp;заметить, что&nbsp;получившегося&nbsp;кода&nbsp;стало&nbsp;больше на&nbsp;один метод и&nbsp;не&nbsp;ясно, стоит ли&nbsp;увеличивать комплексность кода. В данном случае экономия&nbsp;весьма&nbsp;не&nbsp;очевидна, как&nbsp;и&nbsp;затраты. Я за&nbsp;то&nbsp;чтобы делать рефакторинг, начиная&nbsp;с&nbsp;самого&nbsp;незначительного&nbsp;— все дело&nbsp;в&nbsp;стиле мышления&nbsp;(не&nbsp;говоря&nbsp;о&nbsp;гибкости, которая&nbsp;появилась). Поддерживая&nbsp;порядок, будешь жить в&nbsp;чистоте. Иначе&nbsp;— известно&nbsp;в&nbsp;чем.
</p>
<h2>Массивы</h2>
<p>
Часто&nbsp;можно&nbsp;встретить такой вид создания:
<textarea  name="code" class="js" cols="80" rows="30">
var arr = new Array();
</textarea>
</p>
<p>
Более короткая&nbsp;версия:
<textarea  name="code" class="js" cols="80" rows="30">
var arr = [];
</textarea>
</p>
<p>
Удаление элемента&nbsp;из&nbsp;массива. Интуитивно-понятного&nbsp;метода&nbsp;<em><code>remove</em></code> у&nbsp;массива&nbsp;нет, к&nbsp;сожалению. Поэтому&nbsp;можно&nbsp;встретить код:
<textarea  name="code" class="js" cols="80" rows="30">
function removeFromArray(arr, elem)
 {
     result = [];
     for(var i=0;i<arr.length;i++)
     {
         if(arr[i]==elem) continue;
         result.push(arr[i]);         
     }
     return result;
 }
</textarea>
Тут происходит простое копирование всего&nbsp;в&nbsp;новый массив, за&nbsp;исключением ненужного&nbsp;элемента. Не самый быстрый способ, особенно&nbsp;в&nbsp;случае большого&nbsp;массива.
Пользователи&nbsp;библиотеки&nbsp;Prototype.js для&nbsp;этой часто&nbsp;используют метод&nbsp;— <code><em>arr.without(el)</em></code>, который работает по&nbsp;той&nbsp;же самой схеме (все&nbsp;же замечу, что&nbsp;у&nbsp;прототайпа&nbsp;великолепные методы для&nbsp;расширения&nbsp;класса&nbsp;Array).
Тривиально, но&nbsp;многие не&nbsp;знают, что&nbsp;удаление из&nbsp;массива&nbsp;выполняет встроенная&nbsp;операция&nbsp;— <code><em>arr.splice(номер элемента, количество удаляемых элементов)</em></code>&nbsp;— еще метод позволяет делать замену.
</p>
<h2>Создание элементов</h2>
<p>
Часто&nbsp;можно&nbsp;увидеть большое количество&nbsp;кода&nbsp;создающего&nbsp;DOM-структуру. Пишутся&nbsp;обертки&nbsp;для&nbsp;удобного&nbsp;создания&nbsp;DOM-елементов. А ведь решение&nbsp;— не&nbsp;самое производительное.
</p>
<p>
По&nbsp;производительности&nbsp;innerHTML&nbsp;— лучший. Исходя&nbsp;из&nbsp;этого, в&nbsp;большинстве случаев&nbsp;методы DOM отбрасываем (есть исключения, такие как&nbsp;тег&nbsp;— table в&nbsp;IE, он не&nbsp;дает ничего&nbsp;записать в&nbsp;свой innerHTML).
Мне&nbsp;очень нравится&nbsp;класс&nbsp;Template в&nbsp;библиотеке Prototype, позволяющий создавать штмл подобным образом:
<textarea  name="code" class="js" cols="80" rows="30">
            var template = new Template('<option value="#{id}">#{name}</option>');
            var options = []
            for(var i=0;i<cities.length;i++)
            {
                var city = cities[i];
                options.push(template.evaluate(city));
            }
            this.cbCity.innerHTML = options.join("");
</textarea>
Для&nbsp;остальных пользователей легко&nbsp;придумать решение используя&nbsp;стандартный <code><em>replace</em></code>.
Еще на&nbsp;один момент следует обратить внимание. Временным контейнером штмл является&nbsp;массив&nbsp;строк&nbsp;и&nbsp;в&nbsp;конце происходит <code><em>this.cbCity.innerHTML = options.join("");</em></code>&nbsp;— это&nbsp;дает лучшую производительность.
</p>
<h2>В заключение</h2>

<p>Мне&nbsp;еще попадались различные стандартные ситуации. По&nbsp;мере возможности, в&nbsp;будущем соберу&nbsp;их&nbsp;еще в&nbsp;одну&nbsp;часть.</p>]]></content:encoded>
			<wfw:commentRss>http://www.kigorw.com/2008/11/24/javascript-patterns/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Симметрия&#160;кода</title>
		<link>http://www.kigorw.com/2008/11/17/code-symmetry/</link>
		<comments>http://www.kigorw.com/2008/11/17/code-symmetry/#comments</comments>
		<pubDate>Mon, 17 Nov 2008 15:32:19 +0000</pubDate>
		<dc:creator>Кигорв</dc:creator>
				<category><![CDATA[Техноблог]]></category>

		<guid isPermaLink="false">http://www.kigorw.com/?p=400</guid>
		<description><![CDATA[Прочитал книгу&#160;Кента&#160;Бека&#160;«Implementation Patterns», у&#160;нас&#160;почему-то&#160;названную «Шаблоны интеграции&#160;корпоративных приложений». Коэффициент полезного&#160;содержания&#160;в&#160;этой книге, по&#160;какой-то&#160;причине, оказался&#160;меньшим чем я&#160;рассчитывал (возможно, прочитанное будет вылазить из&#160;недр сознания&#160;позже).


Тем не&#160;менее, мысль о&#160;симметрии&#160;в&#160;коде, мне&#160;понравилась. Возможно, термин «однородность кода» ходит где-то&#160;рядом.


Симметричный код читать легче. Например, зная&#160;один метод, можно&#160;предположить, что&#160;ему&#160;есть пара: enable, disable; add, remove; undo, redo и&#160;так&#160;далее. Симметричность может проявляться&#160;не&#160;только&#160;в&#160;именах-антонимах, но&#160;и&#160;в&#160;логике кода.

Возьму&#160;книжный пример (вдобавок&#160;мое вольное изложение [...]]]></description>
			<content:encoded><![CDATA[<p>Прочитал книгу&nbsp;Кента&nbsp;Бека&nbsp;«Implementation Patterns», у&nbsp;нас&nbsp;почему-то&nbsp;названную «Шаблоны интеграции&nbsp;корпоративных приложений». Коэффициент полезного&nbsp;содержания&nbsp;в&nbsp;этой книге, по&nbsp;какой-то&nbsp;причине, оказался&nbsp;меньшим чем я&nbsp;рассчитывал (возможно, прочитанное будет вылазить из&nbsp;недр сознания&nbsp;позже).
</p>
<p>
Тем не&nbsp;менее, мысль о&nbsp;симметрии&nbsp;в&nbsp;коде, мне&nbsp;понравилась. Возможно, термин «однородность кода» ходит где-то&nbsp;рядом.
</p>
<p>
Симметричный код читать легче. Например, зная&nbsp;один метод, можно&nbsp;предположить, что&nbsp;ему&nbsp;есть пара: <em>enable, disable; add, remove; undo, redo</em> и&nbsp;так&nbsp;далее. Симметричность может проявляться&nbsp;не&nbsp;только&nbsp;в&nbsp;именах-антонимах, но&nbsp;и&nbsp;в&nbsp;логике кода.
</p><p>
Возьму&nbsp;книжный пример (вдобавок&nbsp;мое вольное изложение на&nbsp;основе воспринятого):

<textarea  name="code" class="js" cols="80" rows="30">

void process () {
  input ();
  count++;
  output ();
}
</textarea>

Код не&nbsp;симметричен: <em>count++</em> дает слишком много&nbsp;детализации&nbsp;по&nbsp;сравнению с&nbsp;<em>input </em>и&nbsp;<em>output</em>.

<textarea  name="code" class="js" cols="80" rows="30">
void process () {
  input (); &#8211; ввод 
  incrementCount (); &#8211; увеличить количество
  output (); &#8211; вывод
}
</textarea>

Теперь более симметрично. Но&nbsp;<em>ввод, увеличить количество, вывод</em>&nbsp;— не&nbsp;самые симметричные вещи. Куда&nbsp;однороднее звучит&nbsp;— <em>ввод, счет, вывод</em>.

<textarea  name="code" class="js" cols="80" rows="30">
void process() {
  input ();
  tally ();
  output ();
}
</textarea>

</p>
<p>
Теперь попробую применить к&nbsp;своему&nbsp;коду&nbsp;(внимание, эксперементальный юмор):
<p>
Джаваскриптовый метод, создающий штмл для&nbsp;вывода&nbsp;городов&nbsp;в&nbsp;выпадающем списке.
</p>

<textarea  name="code" class="js" cols="80" rows="30">
		renderCities:function(cities)
		{
			
			var options = []
			options.push(this.optionTemplate.evaluate({id:&raquo;", name: &laquo;&#8212;&#8212;&#8212;&raquo;}));
			for(var i=0;i<cities.length;i++)
			{
				var city = cities[i];
				options.push(this.optionTemplate.evaluate(city));
			}
			this.cbCity.innerHTML = options.join("");
					
		}
</textarea>

Подозреваю, с&nbsp;точки&nbsp;зрения&nbsp;симметрии&nbsp;не&nbsp;самый лучший код, попробую его&nbsp;улучшить (выношу&nbsp;инициализацию, выношу&nbsp;заполнение, делаю обновление списка):
<p>Промежуточная&nbsp;версия&nbsp;кода&nbsp;была&nbsp;бы куда&nbsp;менее близка&nbsp;к&nbsp;симметрии:</p>

<textarea  name="code" class="js" cols="80" rows="30">
		renderCities:function(cities)
		{
			var options = this.getInitializedOptions();
			this.fillOptionsArray(options);
			this.cbCity.innerHTML = options.join(&raquo;");     			
		}
</textarea>

А вот&nbsp;финальная&nbsp;версия, с&nbsp;точки&nbsp;зрения&nbsp;детализации, является&nbsp;симметричной:

<textarea  name="code" class="js" cols="80" rows="30">
		renderCities:function(cities)
		{
			var options = this.getInitializedOptions();
			this.fillOptionsArray(options);
			this.updateCitySelect(options);     			
		}
</textarea>

</p>]]></content:encoded>
			<wfw:commentRss>http://www.kigorw.com/2008/11/17/code-symmetry/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
