Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2015-05-31

Параллельная парковка

Прочитал новость:
в Мэриленде, США, исключили из водятловского экзамена упражнение «параллельная парковка».

Maryland has become the most recent state to drop the parallel-parking requirement from its road test, sparking debate about whether the next generation of motorists will be adequately prepared to safely navigate streets.

Buel Young, a Maryland Motor Vehicles Administration spokesman, said the requirement was officially removed May 19 after state officials had determined the maneuvers and skills required to parallel park -- which include backing up, using mirrors and depth perception -- were already being evaluated in other parts of the test.


Типа, нафиг надо еще и этим страшным тестом напрягать, когда мы уже проверили: задом ездить умеет, по зеркалам ориентируется и расстояние оценивает приемлемо.

Ну отменили и хрен с ними. Поразило меня другое.

Читаю:

Private driving coaches and others have speculated that Maryland ended the parking requirement because too many teens were flunking that part, which resulted in long waits to take the test because so many applicants were reapplying.
The MVA has been trying to shorten the wait.


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

Вы вдумайтесь только. Даже если предположение неверно и тест отменили не из-за увеличивающихся сроков, сам факт, что люди это предполагают и обсуждают – наводит на размышления.
Люди уверены, что администрация готова упростить тесты, лишь бы не заставлять людей ждать в очереди.
Это же в корне отличается от взаимоотношений народ-администрация в нашем гондурасе.

Вот, у меня сравнение на тему http://vasnake.blogspot.com/2014/12/blog-post.html

Хочу в USA.




original post http://vasnake.blogspot.com/2015/05/blog-post_31.html

2015-05-30

Сборник о Python

Что-то накопилось в браузере табов, ждущих моего внимания.
Сегодня разберем пачку про Python.

1. vim & Python
Если кто не в курсе, vim это удивительный текстовый редактор. С первого взгляда кажется, что это что-то убогое, родом из детства Unix. Но стоит посмотреть на него внимательно, оказывается, что это очень удобный и мощный инструмент на каждый день. Для сисадмина и программиста. Какая бы функция вам не понадобилась от текстового редактора, можно быть уверенным, что кто-нибудь ее уже реализовал в рамках vim.
После того как вы разберетесь с командами, плагинами и функциями, выработаете свой набор клавиатурных шорткатов и занесете это в мышечную память, ни на какой другой редактор уже не встанет вы уже смотреть не захотите. Тем более, что vim есть практически на любой платформе. Перетаскиваете свой конфиг и продолжаете стучать по клаве. Кстати, в полной мере осознать могучесть vim можно только научившись клавиатурить в 10 пальцев вслепую, English.

Вводная про vim дана, переходим к Python.

Мартин показывает как можно заточить vim под разработку на Python.
Vim as a Python IDE (Martin Brochhaus)
This is the code for my PyCon APAC 2012 talk about Vim as Python IDE.


Эндрю предлагает писать плагины к vim на Python.
Snake (SNAAAAAAAAKKKE) by Andrew Moffat
Snake lets you use Python to its fullest extent to write Vim plugins:


2. Сниппеты для освежения в памяти разных фишек Python.

Типа конспект книги Марка Лутца "Learning Python", 5-ое издание в сниппетах
от Alexey Evseev
Что особо интересно, показана разница между 2-м и 3-м Python.
Материал полезен высокой плотностью информации.

80 вопросов на знание Python
Довольно удачный тест, тупых вопросов мало.


3. Внутреннее устройство

CPython для самых маленьких: введение by Aleksandr Koshkin
Этой статьей мне хотелось бы открыть цикл, посвященный внутреннему устройству интерпретатора языка Python
Что происходит в интерпретаторе, как он работает. Не то, чтобы это было очень полезно на практике, но никто пока не отменил общий принцип – чем лучше ты знаешь, как эта фигня работает, тем проще тебе с ней управляться.


4. Подборка сцылок

Статья на Хабре, содержащая ссылки на статьи на Хабре. Местами очень неплохо.
Подборка информации по теме разработки на Python.


5. Изучение программирования.

Кто-то умный, не помню кто, сказал, что осваивать языки программирования просто: достаточно потратить месяц на решение задач с
на том языке, который хотите изучить. И дело в шляпе.
Кто как, а я думаю взяться за Scala.

А вы можете решать задачки на Python.




original post http://vasnake.blogspot.com/2015/05/python.html


2015-05-28

Навигация 2015

Вчера, 27 мая 2015 года мы открыли навигацию :)
В смысле, вывезли в Строгино свой пароход и изрядно покатались.

Температура воздуха до 30 по Цельсию, ветер был от 5 м/с, местами до 10-11. Двенадцати м/с, я думаю, не было. Меня на бластинг так ни разу и не вытащило. А вот Наташка легкая, ей удалось по воде блинчиком пролететь. Везунчик.

Пару раз окунулись, вода холодная пока. С непривычки (полгода не катались) оттянули себе все руки-ноги. Хорошо!

Надо, надо менять пароход на что-то более легкое и малолитражное.
Продам 200 литровую доску, куплю 150 литровую.

И парус надо хотя бы 7 метров.


Кстати, специально для вывоза на воду нашего парохода, я купил багажник на крышу, что-то вроде AMOS TRAMP AM-2. Баксов в 50 мне он обошелся, в отличие от родного реношного или знаменитого Thule. Но у меня есть одно но. Вернее два.
Первое, очень неудобно закреплять багажник на крыше. Надо закрутить четыре очень неудобных болта (вообще, там надо крутить болты на 8 и на 10, помимо барашков на тросовых стяжках). Я раза четыре ронял ключ, рискуя повредить покрытие машины. И, по первому разу, установка этого чуда заняла у меня больше часа времени.
Второе, пластиковые ноги не производят впечатления крепких и надежных. Стремно.


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




original post http://vasnake.blogspot.com/2015/05/2015.html

2015-05-26

Patterns

DP это Design Patterns, хорошо известные любому толковому программеру.
Давайте поглядим на DP применительно к Python.

Delegate pattern
the delegation pattern is a design pattern in object-oriented programming where an object, instead of performing one of its stated tasks, delegates that task to an associated helper object. There is an Inversion of Responsibility in which a helper object, known as a delegate, is given the responsibility to execute a task for the delegator.

Понятно, что применение этого шаблона может привести к утомительной работе: прописыванию в делегирующем классе всех свойств реализуемого интерфейса.
Но может и нет. Это Python, Карл!

Джейкоб Циммерман показывает как

class DelegatedAttribute:
    def __init__(self, delegate_name, attr_name):
        self.attr_name = attr_name
        self.delegate_name = delegate_name

    def __get__(self, instance, owner):
        if instance is None:
            return self
        else:
            # return instance.delegate.attr
            return getattr(self.delegate(instance),  self.attr_name)

    def __set__(self, instance, value):
        # instance.delegate.attr = value
        setattr(self.delegate(instance), self.attr_name, value)

    def __delete__(self, instance):
        delattr(self.delegate(instance), self.attr_name)

    def delegate(self, instance):
        return getattr(instance, self.delegate_name)

    def __str__(self):
        return "<delegated attribute, '" + self.attr_name + "' at " + str(id(self)) + '>'
Это будет обертка вокруг свойств делегата.

class Foo:
    def __init__(self):
        self.bar = 'bar in foo'
    def baz(self):
        return 'baz in foo'

class Baz:
    def __init__(self):
        self.foo = Foo()
    bar = DelegatedAttribute('foo', 'bar')
    baz = DelegatedAttribute('foo', 'baz')

x = Baz()
print(x.bar)  # prints 'bar in foo'
print(x.baz())  # prints 'baz in foo'
Это демонстрация того, как оно работает.

А теперь самое вкусное, декоратор, выполняющий всю нудную работу по прописыванию делегируемых свойств в словарь делегатора
def delegate_as(delegate_cls):
    # gather the attributes of the delegate class to add to the decorated class
    attributes = set(delegate_cls.__dict__.keys())

    def inner(cls):
        # create property for storing the delegate
        setattr(cls, 'delegate', SimpleProperty())
        # don't bother adding attributes that the class already has
        attrs = attributes - set(cls.__dict__.keys())
        # set all the attributes
        for attr in attrs:
            setattr(cls, attr, DelegatedAttribute('delegate', attr))
        return cls
  
    return inner


Часть вторая, Borg versus Singleton
Статья Алекса Мартелли, многим известного по книгам http://www.oreilly.com/pub/au/918

Начав с реверансов, что DP это хорошо и правильно, Алекс продолжает так:

Python's forte is simplicity. Again and again, problems that are difficult in other languages scale down to "pretty easy" in the light of Python's bright Sun. The amount and caliber of intellectual weaponry that it makes sense to bring to bear on a problem depends on the problem's difficulty level. For a simpler problem, an informal approach may make more sense, while a harder problem might profit from more structured and formalized procedures. One plus of making problems simpler is that, the simpler a problem, the more simplicity you can deploy in solving it. Of course, one always aims (or should) at making each solution as simple as it can possibly be (but, admittedly, no simpler than that:-). Maybe you can get away with an idiom (language specific usage), or even just "good common practice", where another language would require you to unearth and apply a full-fledged design pattern. At times, it's a reasonably big win, in terms of simplicity, even just to avoid forcing an aspect of the solution into the object oriented mold (so pervasive, and indeed so often appropriate, in software development Design Patterns). One aspect of Python's simplicity is, indeed, that you only do OO when you want to!

И далее показывает, что всеми любимый DP Singleton легким движением превращается в шорты четыре строчки на Python

class Borg:
    _shared_state = {}
    def __init__(self):
        self.__dict__ = self._shared_state

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


Часть третья, релаксационная заключительная. Тоже про шаблоны, шаблоны самодисциплины в разработке.
9 Anti-Patterns Every Programmer Should Be Aware Of

A healthy dose of self-criticism is fundamental to professional and personal growth

1 Premature Optimization
2 Bikeshedding
3 Analysis Paralysis
4 God Class
5 Fear of Adding Classes
6 Inner-platform Effect
7 Magic Numbers and Strings
8 Management by Numbers
9 Useless (Poltergeist) Classes



Понятно без пояснений, правда?



original post http://vasnake.blogspot.com/2015/05/patterns.html

2015-05-25

Lambda calculus

Мне кажется, я знаю ответ на вопрос, почему функциональное программирование никак не расцветет в ширнармассах. Казалось бы, такая прекрасная вещь – программы в функциональном стиле, предсказуемые, безопасные, легко тестируемые. Ан нет. Никак. Почему?
Ну, вынося за скобки вопросы быстродействия и требований к ресурсам, я думаю, проблема в том, что для успешного применения функционального подхода надо изрядно вывернуть мозги. Человеки с детства приучаются рассуждать и мыслить в императивном стиле. И вдруг, раз, на тебе, надо стиль мышления перестраивать. Не все готовы. А те, кто готов, не все могут. Чтобы в этом убедиться, достаточно взять любой учебник по Lisp (не говоря уже о более современных реализациях концепции) и начать смотреть примеры кода. К 10 странице мозги неподготовленного программера начнут плавиться. Если нет, поздравляю, вы кандидат в элитные войска бойцов клавиатурного фронта.

Вот пример, для иллюстрации, из статьи, рассчитанной на обычного, среднего программиста (код я слегка переформатировал):
bands = [
    {'name': 'sunset rubdown', 'country': 'UK', 'active': False},
    {'name': 'women', 'country': 'Germany', 'active': False},
    {'name': 'a silver mt. zion', 'country': 'Spain', 'active': True}
]

def assoc(_d, key, value):
    from copy import deepcopy
    d = deepcopy(_d)
    d[key] = value
    return d

def call(fn, key):
    def apply_fn(record):
        return assoc(record, key, fn(record.get(key)))
    return apply_fn

def pipeline_each(data, fns):
    return reduce(
        lambda a, x: map(x, a),
        fns,
        data
    )

print pipeline_each(
    bands,
    [
        call(lambda x: 'Canada', 'country'),
        call(lambda x: x.replace('.', ''), 'name'),
        call(str.title, 'name')
    ]
)

А теперь скажите, сколько времени надо этому среднему программеру на то, чтобы понять, что тут написано, как оно работает и что оно делает? Что будет выведено на консоль?
А сколько времени надо, чтобы самому это написать?

А теперь посмотрите, как выглядит код, который напишут 146% программеров для решения задачи:
def format_bands(bands):
    for band in bands:
        band['country'] = 'Canada'
        band['name'] = band['name'].replace('.', '')
        band['name'] = band['name'].title()
И скажите, положа руку на сердце, какой код понятнее и проще?

Но, как уже было упомянуто, функциональное программирование дает нам такие фундаментальные ценности, как предсказуемость и безопасность. Для больших и серъезных проектов это не просто важно а архиважно. Поэтому интерес к функциональщине не ослабевает. А с ростом вычислительных ресурсов даже растет. Ибо проблемы быстродействия и потреблядства мощностей перестают быть шоустоппером.

А посему, несколько интересных материалов для самостоятельного изучения:

Функционально на Python

Рассуждая о функциональном программировании, люди часто начинают выдавать кучу «функциональных» характеристик. ...
Забейте. Функциональный код отличается одним свойством: отсутствием побочных эффектов. Он не полагается на данные вне текущей функции, и не меняет данные, находящиеся вне функции. Все остальные «свойства» можно вывести из этого.



Будни преподавателя

студенты зажигают
Дал им "дополнительную домашку" - выразить next succ в лямбде через комбинаторы.
Вот их ответ:
S(K (S ( S(KS) ( S(KK)I ) ) )) ( S ( S (KS) ( S(K(S(KS))) ( S ( KS)( S(KK)( S(KS)( S(KK)I) ))) (K (S(KK)I )))) ) (K (KI) ) )



Чтобы было понятнее, о чем это у ivan-gandhi, смотрите сюда:

Scala implementation of a lambda calculus interpreter

Lambda calculus (also written as λ-calculus) is a formal system in mathematical logic for expressing computation based on function abstraction and application using variable binding and substitution.
Counterparts to lambda calculus in computer science are functional programming languages, which essentially implement the lambda calculus (augmented with some constants and datatypes)




Combinatory logic is a notation to eliminate the need for quantified variables in mathematical logic. It was introduced by Moses Schonfinkel and Haskell Curry, and has more recently been used in computer science as a theoretical model of computation and also as a basis for the design of functional programming languages. It is based on combinators. A combinator is a higher-order function that uses only function application and earlier defined combinators to define a result from its arguments

CombLogic
This project is a combinatory logic playground



original post http://vasnake.blogspot.com/2015/05/lambda-calculus.html

2015-05-23

Markdown lint

В мире полно разных линтеров (lint tool) для статического анализа текстов программ. Многие даже ими пользуются. Кстати, очень удобно – сразу видно, где накосячил код написан не по стандарту.

Давид написал на JavaScript линтер для Markdown

Я знаю, программисты не любят писать документацию. Но приходится. Линтер в помощь.

Онлайн демо

Реп. с кодом

Описание правил линтера

Спасибо тебе, Давид.





original post http://vasnake.blogspot.com/2015/05/markdown-lint.html

Hancock

Намедни отсмотрел фильму «Хэнкок», что в оригинале «Hancock» 2008 года.
Режиссер Peter Berg.
В главной роли Will Smith.

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

А вот вторая половина никакая.

Кстати, John Hancock, это жаргонизм, обозначающий подпись

A signature. Derives from John Hancock's signature, which was written in large letters, on the Declaration of Independence.





original post http://vasnake.blogspot.com/2015/05/hancock.html

2015-05-22

Книги

Собралась тут коллекция ссылок на хорошие книги. Оставлю тут, чтобы были под рукой.

Но сперва, спасибо Arbat, несколько цитат:

"It is a good thing for an uneducated man to read books of quotations"
Winston Churchill

"I believe that every individual is naturally entitled to do as he pleases with himself and the fruits of his labor, so far as it in no way interferes with any other men’s rights"
Abraham Lincoln

"There is only one basic human right, the right to do as you damn well please. And with it comes the only basic human duty, the duty to take the consequences"
P.J. O'Rourke

"The best government is the one that charges you the least blackmail for leaving you alone"
Thomas Rudman-Brown

"A government which robs Peter to pay Paul can always depend on the support of Paul"
George Bernard Shaw



Итак, книги, худлит

Рекомендовано avva:




Книги, программирование

Рекомендовано alenacpp:

Самая лучшая книга по C++11 и C++14. Просто, понятно с примерами. Для тех, кто знает С++ и хочет использовать фичи нового стандарта.

...
С фокусом на многопоточность, которой раньше в стандарте не было.

...
Поэтому рекомендую эту книгу тем, кто решил начинать изучать STL. Обратите внимание на издание, вам нужно второе издание, там на обложке крупно написано С++11.
Вообще это относится ко всем книгам по С++. То, что издано до 2012 года можно считать устаревшим



Цены, особенно с учетом нынешнего курса, не слишком гуманные. Целый день надо работать, чтобы три книги купить.



original post http://vasnake.blogspot.com/2015/05/blog-post_22.html

Apache Drill

v.1.0 Apache Drill – это серъезная заявка.
Развелось тут, понимаешь, всяких датастораджей, плюнуть некуда – попадешь в Hadoop или в МонгоДБ какой-нибудь.
Приходится извращаться, делать поверх всей этой чехарды слой шоколада SQL запросов. Надо же как-то данные смотреть/вынимать, правда?

Представлен первый значительный релиз проекта Apache Drill, в рамках которого развивается движок для организации выполнения SQL-запросов над полуструктурированными данными, хранящимися в NoSQL-хранилищах. Особенностью движка является независимость от схемы хранения данных, что позволяет организовать анализ данных в различных хранилищах без предварительного определения их структуры (schema-free). В частности, Apache Drill даёт возможность выполнять интерактивные запросы на языке ANSI SQL для сложных или постоянно изменяющихся структур данных, включая форматы JSON, ProtoBuf, XML, AVRO и Parquet, а также таблицы HBase, без необходимости задания схемы хранения.

Структура данных в хранилище распознаётся на лету и преобразуется во внутреннюю JSON-подобную модель данных, которая предоставляет информацию о структуру БД при выполнении SQL-запросов. Для обработки сложных и вложенных типов данных в Apache Drill предусмотрен ряд расширений SQL. В качестве одного из практических применений Apache Drill называется возможность интеграции завязанных на SQL систем бизнес-аналитики и хранилищ больших объёмов данных на основе Apache Hadoop или MongoDB



"The production-ready 1.0 release represents a significant milestone for the Drill project," said Tomer Shiran, member of the Apache Drill Project Management Committee. "It is the outcome of almost three years of development involving dozens of engineers from numerous companies. Apache Drill's flexibility and ease-of-use have attracted thousands of users, and the enterprise-grade reliability, security and performance in the 1.0 release will further accelerate adoption."

With the exponential growth of data in recent years, and the shift towards rapid application development, new data is increasingly being stored in non-relational, schema-free datastores including Hadoop, NoSQL and Cloud storage. Apache Drill revolutionizes data exploration and analytics by enabling analysts, business users, data scientists and developers to explore and analyze this data without sacrificing the flexibility and agility offered by these datastores. Drill processes the data in-situ without requiring users to define schemas or transform data.







original post http://vasnake.blogspot.com/2015/05/apache-drill.html

2015-05-21

М2 / E105

Съездил (четверг-пятница) в Белгородскую область, из Москвы и обратно по М2. Туда 730 км, 12 часов в пути, с четырех утра до 16 вечера, с тремя (или четырьмя – не помню точно) остановками на размяться. На следующий день обратно 730 км, 12 часов в пути, с 11 утра до 23 вечера, с четырьмями остановками. Остановки минут по 15-20.
Долго думал, ехать по М4 или по М2. Накануне все навигаторы показали, что по М4 будет дольше (по времени), несмотря на то, что дорога лучше. Поэтому поехал по М2. Дешевле, короче и быстрее, что еще надо.

Нормально, думал будет хуже. Дорога приличная, если не считать Тульской области. Практически везде можно ехать 100 кмч и даже больше. Ну, кроме населенных пунктов. На двухполосной дороге часто очень широкая обочина, вполне можно уйти вправо и пропустить особо нетерпеливых. Вот только грузовики очень не любят на обочину уходить, хз почему. Их либо выдавливать приходится, либо ждать подъема с уширением. Либо честно обгонять, с выездом на встречку. Почти все время дорога была пустая, никакого напряга с трафиком.

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

Бензин дешевле на пару рублей, чем в Москве. Заправки ТНК, Газпром. Лучше всех оказалась Руснефть, во как.
Проверил расход по трассе, как и положено, меньше 6 литров на 100 километров. На одном литре 17 километров.

Всю дорогу на пятой передаче. Тронулся с первой, вторая и сразу пятая, и погнали. Даже в гору на пятой, даже груженый, только педальку посильнее придавить – и нормально. Прося – молодец.

Обратно ехали под почти постоянным дождем. Переходящим в ливень. С сильным ветром. Ливни были такие, что местами дворники на последей скорости не справлялись. Насчитали 9 ливней, пока до Москвы доехали.
Как оказалось, самое страшное не то, что дорогу не видно. Самое страшное, когда в колее лужа образуется и ты в эту лужу на скорости выше 70 кмч влетаешь. Вот это реально страшно. Выходить на глиссер без плавника никому не посоветую.

Что любопытно, за два дня и 1500 км. не видели ни одной аварии. Следы «тормоз в пол» часто попадаются, а вот аварий не было, слава богу. А въехали в Москву и почти сразу на кольце встряли в объезд аварии. Не берегут себя люди.

Что еще интересного. Ночью по трассе без освещения, только с фарами, ехать совсем не прикольно. Не видно ни черта. А дорога вся в ремонтах, хз, что там кроется, в темноте.


В общем, теперь у меня есть некий опыт езды по трассе. Расту над собой потихоньку.


original post http://vasnake.blogspot.com/2015/05/2-e105.html

2015-05-11

Kilo

Вышел релиз 11 платформы OpenStack, назвали «Kilo», что как-бы намекает на число 11.


OpenStack Data Processing (Sahara) по прежнему «в начале пути».


original post http://vasnake.blogspot.com/2015/05/kilo.html

2015-05-10

A Family Thing

Намедни отсмотрел фильму «Семейное дело», что в оригинале «A Family Thing» 1996 года.
Режиссер Richard Pearce.

У реднека из Арканзаса, уже пожилого дядечки за 50 (Роберт Дюваль), умирает мама. Через пару дней реднек узнает, из написанного мамой перед смертью письма, что он вовсе даже не реднек, а ниггер черножопый. И ему надо найти его старшего брата, где-то в Чикаго. А теперь ты будешь деревянным

Наверное, из такого сюжета можно было бы вытащить и поболе, но и так фильма получилась очень приятная.



original post http://vasnake.blogspot.com/2015/05/a-family-thing.html

2015-05-08

Монада, да не та

Нынче, на волне интереса к функциональщине в программировании, термин «монада» в среде программистов трактуется однозначно. Дискурс такой.
Но монады бывают разные.

Ну вот теперь я перехожу к делу. Значит, я буду рассказывать про теорию самого общего математического объекта, который только есть. Я его называю для простоты «монадой» по Лейбницу и объясню сейчас вам, что это такое. Значит, монада. Это самый простой математический объект, какой только можно придумать.

Пусть имеется конечное множество — оно там М обозначено. И пусть имеется отображение этого конечного множества в себя. Каждой точке этого конечного множества сопоставляется новая точка. Это и есть монада. Значит, вот, оказывается, существует теория этих монад, и из этой теории вытекают совершенно нетривиальные математические и физические следствия. И я некоторые из этих теорий, некоторые из этих следствий вам сейчас покажу

Сложность конечных последовательностей нулей и единиц и геометрия конечных функциональных пространств

Владимир Игоревич Арнольд



original post http://vasnake.blogspot.com/2015/05/blog-post_8.html

Python introspection

Тут недавно меня попросили выдать информацию о происходящем в runtime в Naudoc/Zope. Конкретнее, что там есть такого в обрабатываемом документе, в процессе воркфлоу.
Один из простых способов получить такую информацию заключается в применении интроспекции. Недолгое гугление не принесло исчерпывающего готового рецепта, только составные части в стиле do it yourself.

Например. Часть первая

Guide to Python introspection
How to spy on your Python objects

Отсюда я взял первую часть рецепта, добавив в него чуть-чуть отсебятины, в частности обертку для перенаправления stdout в список строк (из
class ListStream:
    def __init__(self):
        self.data = []
    def write(self, s):
        self.data.append(s)

def interrogate(item):
    """Print useful information about item.
    Returns list of strings.
    """
    sys.stdout = x = ListStream()

    if hasattr(item, '__name__'):
        print "NAME:    ", item.__name__
    if hasattr(item, '__class__'):
        print "CLASS:   ", item.__class__.__name__
    print "ID:      ", id(item)
    print "TYPE:    ", type(item)
    print "VALUE:   ", repr(item)
    print "CALLABLE:",
    if callable(item):
        print "Yes"
    else:
        print "No"
    if hasattr(item, '__doc__'):
        doc = getattr(item, '__doc__')
    doc = doc.strip()   # Remove leading/trailing whitespace.
    firstline = doc.split('\n')[0]
    print "DOC:     ", firstline
    print "ATTRIBUTES:", vars(item)
    print "NAMES:     ", dir(item)

    sys.stdout = sys.__stdout__
    return x.data

В вывод попало нечто вроде
NAME:
    ttt
CLASS:
    HTMLDocument
ID:
    77748944
TYPE:
    <type 'ImplicitAcquirerWrapper'>
VALUE:
    <HTMLDocument at /docs/storage/members/valik/test/ttt>
CALLABLE:
    Yes
DOC:
    Subclassed Document type
ATTRIBUTES:
    {'contributors': (), 'nd_uid': '143058357876X4990437627', 'distribution_log': [], '_safety_belt': 'None',
    'id': 'ttt', 'subject': (), 'category': 'BGClientCard', '_last_safety_belt': '', 'skip_catalogize': [],
    'subscribed_users': {}, '_last_safety_belt_editor': 'zope', '_Delete_objects_Permission': ('Director', 'Manager'),
    'text_format': 'html', 'version': <Products.CMFNauTools.ContentVersions.VersionsContainer object at 0x4bf86e0>,
    '_objects': ({'meta_type': 'Object Manager', 'id': 'version'},),
    'followup': <Products.CMFNauTools.TaskItemContainer.TaskItemContainer object at 0x4bc9230>,
    '_version_tag': -8584773770338532410, 'portal_type': 'HTMLDocument', 'registry_data': {},
    'language': 'ru', 'rights': '', 'expiration_date': None, '_Manage_properties_Permission': ('Author', 'Owner', 'Writer'),
    '_owner': (['acl_users'], 'zope'), 'changes_log': [], '__ac_local_roles__': {'zope': ['Owner']}}
NAMES:
    ['COPY', 'COPY__roles__', 'Category', 'CategoryAttributes', 'Contributors', 'Contributors__roles__',
    'CookedBody', 'CookedBody__roles__', 'CreationDate', 'CreationDate__roles__', 'Creator', 'Creator__roles__', ...

Заказчику этого было мало, он захотел получить сигнатуры методов, в смысле, имена параметров. На это я ответил, что самый простой способ получить эту информацию, это grep по исходному коду.
Но можно иначе.

Например. Часть вторая

inspect – Inspect live objects
Purpose: The inspect module provides functions for introspecting on live objects and their source code.

If the .py file is available for a module, the original source code for the class or method can be retrieved using getsource() and getsourcelines().
import inspect
import example

print inspect.getsource(example.A.get_name)
In addition to the documentation for a function or method, it is possible to ask for a complete specification of the arguments the callable takes, including default values. The getargspec() function returns a tuple containing the list of positional argument names, the name of any variable positional arguments (e.g., *args), the names of any variable named arguments (e.g., **kwds), and default values for the arguments. If there are default values, they match up with the end of the positional argument list.
import inspect
import example

arg_spec = inspect.getargspec(example.module_level_function)
print 'NAMES   :', arg_spec[0]
print '*       :', arg_spec[1]
print '**      :', arg_spec[2]
print 'defaults:', arg_spec[3]

args_with_defaults = arg_spec[0][-len(arg_spec[3]):]
print 'args & defaults:', zip(args_with_defaults, arg_spec[3])
То есть, получив в первой части список методов класса, можно скормить его inspect-у и получить как исходный код, так и спецификацию аргументов.
Но этого я делать не стал, грепать попроще таки.





original post http://vasnake.blogspot.com/2015/05/python-introspection.html

2015-05-05

Вакансия

Увидел вакансию. Не шедевр, но глоток свежего воздуха как минимум. Был бы мастер в Java/Scala, тут же бы им отписался.

Практически полный текст:

Searching for 2 Fucking Great Developers ($115k - $140k / yr) (San Diego)

If you're a great fucking developer who wants to make a bunch of money working somewhere awesome then keep reading. We're a San Diego Tech Company (relocation covered for the right candidates) that's looking for not one but two awesome developers. So digest this ad, accept your fate, and take one last lap around your office to say goodbye to your friends because you're about to upgrade.

The Pay:
Starting Salary Range: $115,000 - $140,000 / yr + Medical + Dental + Stock Options + Relocation costs up to $2,500

The Job:
Our current stack runs on Scala, Java, MongoDB, Redis, Bootstrap, Play Framework, Guice, and AngularJS. If you think you can handle that shit, then it'd be fucking awesome if you also knew SQL. Mostly looks great but you've never touched Scala or MongoDB? That happens, so fucking check them out and include a blurb with your job app with why you're excited to fucking learn and use them.

What You'll Be Doing:
This quarter you'll be adding kick ass new features to our already massively successful products. Afterwards depending on your ability, interests, and attitude you'll be working on any number of projects like new products, internal tools, improving our already fucking great scalable architecture, or skunk works machine learning data analysis for new product R&D.

On Leaving Whatever The Fuck You're Doing Now:
Don't fucking worry about it. They'll find somebody else and you'll be off balling with a fresh start. It doesn't matter if you have a great job, shit job, or you're marathon'ing through X-Files on Netflix while collecting unemployment. Mulder and Scully will be right where you left them, and your ex-coworkers will stay in touch too but honestly fuck 'em, you'll have new, better friends.

The People:
I promised new friends didn't I? We have boys, we have girls, we have kite surfers, we have regular surfers, we have video game fanatics, we have clubbers (night clubs, not seals), we have a Scottish guy, we have a Serbian girl, we have movie nerds, we have board game nerds, we have regular nerds, we have musicians, and we have somebody out this week for Coachella. Look, the fact is we can fill whatever type of friendship void you have.

The Environment:
We're on the top floor of a building right next door to a fucking brewery. We have Arcade games (yes we have Mortal Kombat), Pinball, and free fucking water. The floor we are on is filled exclusively with tech startups and we have a huge monthly Werewolf (http://www.games-wiki.org/wiki/Werewolves_of_Millers_Hollow/) game (beer included) held in our break room comprised of people from all of the companies on the floor, as well as from various other companies downtown.

Company Fucking Meetings:
We celebrate our successes and we've had a lot of them lately, hence the hiring. In the last year alone we've gone on a sailing trip, a downtown scavenger hunt, frisbee golfing, kart racing, and more. Next up? Not sure but it's always a group decision. . .Laser tag, paintball, movies, or even repeats of things we've done and enjoyed are all on the table. How about you fucking suggest something?

Hiring Process:

1) You e-mail us the shit requested in this job ad.
2) We video skype and figure out if you know what you said you know.
3) You come meet the team for a vibe check.
4) Tell everybody about how great your fucking life just became because you're super fucking hired.

Good Ideas:
Send us some self assessed scores for the job requirements listed above. -- Don't you fucking bullshit us, we're going to find out during the Skype call so don't waste your time or ours. I'm fucking serious if you're thinking about putting a 9/10 for Javascript and you don't know what a closure is you're responding to the wrong ad. -- Answer honestly, maybe we don't give as many fucks about Javascript as you think so 6/10 is fine.
E-mail us an excerpt of some code you've written that you're proud of. -- Tell us why out of all the shit code you've written in your life you decided to send us that.
Type something to us. Anything. Tell us something about yourself. -- This section will not be graded.

You're Doing It Wrong:
Shit I have to go read through my notes on algorithm efficiency and study up on logic brain teasers. -- Nope.
I need to update my resume. -- Nah, if it's out of date just put NEEDS updating.
I better get my interview clothes dry cleaned. -- Slow your roll, after the e-mail screen it's a Skype video call.

P.S. Share this shit. Don't be worried about friends or coworkers stealing your job, there are two fucking jobs open. Maybe even more if we find people that we can't pass up.

P.P.S. We do not encourage or display profanity levels above the social norm in the work place. As such, profanity will not be accepted in lieu of skill






original post http://vasnake.blogspot.com/2015/05/blog-post.html

2015-05-02

A Bronx Tale

Что-то прям чередой три хорошие фильмы.
Намедни отсмотрел фильму «Бронкская история», что в оригинале «A Bronx Tale» 1993 года.
Режиссер Robert De Niro.
В ролях Robert De Niro, Chazz Palminteri.

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

Не шедевр, конечно, но занимательно, весьма.



original post http://vasnake.blogspot.com/2015/05/a-bronx-tale.html

2015-05-01

The Remains of the Day

Намедни отсмотрел фильму «На исходе дня», что в оригинале «The Remains of the Day» 1993 года.
Режиссер James Ivory.
В главных ролях Anthony Hopkins, Emma Thompson.
Местами и Хью Грант появляется.

Обожаю Эмму Томпсон, да и Хопкинс тоже выступает неслабо.

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


Очень интересно.




original post http://vasnake.blogspot.com/2015/05/the-remains-of-day.html

With Honors

Намедни отсмотрел фильму «С почестями», что в оригинале «With Honors» 1994 года выпуска.
Режиссер Alek Keshishian.
В главных ролях Joe Pesci, Brendan Fraser.

С Джо Пеши, да и с Бренданом Фрейзером я готов смотреть любую фильму. А конкретно эта лента получилась совсем неплохо, совсем. Правда Джо Пеши можно узнать только по голосу, да по комплекции – как мех на лице меняет человека.

Брендан заканчивает Гарвард, для чего ваяет свой тезис (thesis), по нашему, что-то вроде дипломной работы. И, внезапно (про бэкапы в Гарварде не рассказывают студням) проебывает электронную версию работы. Остается только бумажная распечатка. Которую он также умело проебывает. К счастью, распечатка попадает в руки местного бомжа (Джо Пеши). И Джо, толковый парень, не отдаст ни листика без пользы для себя. Ну и так далее.


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




original post http://vasnake.blogspot.com/2015/05/with-honors.html

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Manager (15) web-browser (15) Никонов (15) Klaipeda (14) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)