Archive for the ‘Программировани’ Category

Use Rope (Python Refactoring Tool) from console

Март 20, 2015

Hi! I’he just performed a tiny python refactoring just from my console. With a help of `rope` of course. There is a little information about it, so I want to share it.


>>> # Prepare rope
>>> import rope.base.project
>>> from rope.base import libutils
>>> myproject = rope.base.project.Project('~/Development/backend')
>>> myresource = libutils.path_to_resource(myproject, '~/Development/backend/xxx/yyy.py')

>>> # Get position of code to be extracted to method
>>> raw_file = open('/Users/stromsund/Development/backend/xxx/yyy.py').read()
>>> raw_file = raw_file.decode('utf-8') # rope uses not byte positions, but unicode ones.
>>> start = raw_file.index('# step 1')
>>> end = raw_file.index('# second')

>>> from rope.refactor.extract import ExtractMethod
>>> extractor = ExtractMethod(myproject, myresource, start, end)
>>> changes = extractor.get_changes('extracted_method')
>>> myproject.do(changes)

Viola! It works! New method was created!

Домашние работы

Май 3, 2012

Наверное, я понимаю, что уже завалил все сроки. Но научиться решать задачи мне всё же интересно.

Поэтому, чтобы это было ещё интереснее, я прикрутил к домашкам
Google C++ Test Framework. И правда очень простая и удобная в обращении библиотека.

The post is brought to you by lekhonee v0.7

LISP styled F# :-)

Сентябрь 1, 2010

I’m loveing it!

let canonicalize_headers (headers: WebHeaderCollection) =
    String.concat "" (
        Array.map (fun (x : string) -> String.Format("{0}:{1}\n", x.ToLower(), headers.Get(x))) (
            Array.sort (
                Array.filter (fun (x : string) -> x.StartsWith("x-ms-")) headers.AllKeys
            )
        )
    )

И снова я сделал это!

Август 22, 2010

В одном очень хорошем блоге есть хорошая статья о начале работы с REST API к Windows Azure Storage Services.

Но информации по некоторым вопросам там явно недостаточно. Автор, к сожалению, не дает с собой связаться. Так же странно себя ведет документация к REST API. Я потратил почти 6 часов на то, чтобы понять, что фильтры не входят в параметры канонизации строки. И исходников .NET не видно. Создавал на C# классы, пробовал-пробовал, отлаживал-отлаживал. Вроде, прорвался через фильтрацию.

И вот что мне очень не нравится в F# — его сильная ориентированность на .NET. Я, конечно, понимаю, что он так и задумывался. Но о какой автоматической параллельности может идти речь, если приходится вызывать в коде потоконебезопасные методы со сторонними эффектами?

Под катом продолжение моей библиотеки на F# для работы с Azure

(more…)

Я сделал это! Сделал, сделал, сделал, сделал!!! F# function for Windows Azure Storage Tables

Август 19, 2010

Получение списка таблиц Azure на F#

// Learn more about F# at http://fsharp.net 

open System.IO 
open System.Net 
open System.Security.Cryptography

let stringToSign verb contentMD5 contentType date canonicalizedResource =
    System.String.Format("{0}\n{1}\n{2}\n{3}\n{4}", verb, contentMD5, contentType, date, canonicalizedResource)

let getAuthorization user (key : string) (canonicalizedString : string) =
    let hasher = new HMACSHA256(System.Convert.FromBase64String(key))
    let data = System.Text.Encoding.UTF8.GetBytes(canonicalizedString)
    let signature = System.Convert.ToBase64String(hasher.ComputeHash(data))
    System.String.Format(System.Globalization.CultureInfo.InvariantCulture, "SharedKey {0}:{1}", user, signature)

let listOfTables user key = 
    let request_path = "http://ipv4.fiddler:10002/devstoreaccount1/Tables"
    let request_method = "GET"
    let current_date = System.DateTime.UtcNow.ToString("R", System.Globalization.CultureInfo.InvariantCulture);
    let contentMD5 = System.String.Empty
    let content_type = "application/atom+xml"
    let canonicalized_resource = System.String.Format("/{0}/{1}", user, "devstoreaccount1/Tables");
    let auth_header = getAuthorization user key (stringToSign request_method contentMD5 content_type current_date canonicalized_resource)
    let ms_version = "2009-09-19" 
    let request : HttpWebRequest = downcast WebRequest.Create(request_path)
    request.Method <- request_method 
    request.ProtocolVersion <- (System.Version(1, 1))

    request.ContentType <- content_type 
    request.Method <- request_method 
    request.Headers.Add("x-ms-date", current_date) 
    request.Headers.Add("Authorization", auth_header)
    request.Headers.Add("DataServiceVersion", "1.0;NetFx")
    request.Headers.Add("MaxDataServiceVersion", "1.0;NetFx")
    request.Headers.Add("Accept-Charset", "UTF-8")
    request.Headers.Add("x-ms-version", ms_version) 
    let response : HttpWebResponse = downcast request.GetResponse()
    let dataReader = response.GetResponseStream()
    let streamReader = new StreamReader(dataReader)
    let str_response = streamReader.ReadToEnd()
    str_response 

printfn "%s" (listOfTables "devstoreaccount1" "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==")

Бесплатно скачать антивирус win-realpcsecurity.info

Июнь 19, 2010

Вы хотите самый лучший антивирус на свете получить бесплатно? С исходными кодами? Тогда перейдите по адресу win-realpcsecurity.info, нажмите скачать и введите код: 739204.

Ура!

Благодарности оставляйте, пожалуйста, в комментариях.

Current state

Июнь 11, 2010

Думаю о роли истории, об электронном органайзере, Django и саморазвитии.

История

Зачем нужны историки? Такие вот люди, которые изучают дела минувших дней, пытаются найти справедливость, засекреченные документы, сожженных свидетелей. Мне кажется, что работа у них порой интересная, а порой неблагородная. Но всё же, зачем?

  1. история как entertainment по зомбоящику. Да, порой забавно послушать что сделал слон, когда пришёл Наполеон.
  2. история как средство объективного анализа личности. Скажем, рассказать людям, что Ленин жил, но умер, в 1924 году, несмотря на завяления о том, что он жив и будет жить.
  3. самое главное, наконец. Самой главной задачей историков я вижу этакий исторический Data Mining. Самый обычный цикл: получение данных, очистка данных, кластеризация, анализ. Вот так я объясняю роль истории.

Электронный органайзер

Электронная записная книжка

Да, вот такая. Нашёл недавно в груде своего хлама. Думаю, что интереснее — восстановить или купить Asus EEE PC 1001?

Django

Суть проблемы банальна, на эту тему исписано множество статей, но всё же мне всё не нравилось.

Задача: один и тот же шаблон может быть отрисован различными методами. Подсвечивать тот или иной элемент меню в зависимости от метода.

Большинство методов основываются на том, что в шаблоне проверяется текущий путь и некоторая константа (к примеру «cart.html»). Однако, это мне не нравится, так как я считаю, что строковые константы должны быть только в одном месте, в urls.py. Этого недостатка лишён этот сниппет (http://djangosnippets.org/snippets/1153/), но устанавливать отдельный middleware для этого не хотелось.

Я изобрёл свой велосипед: передавать в шаблон имя текущего метода и сравнивать его. Код:

# views.py
import inspect
 
 
def __common_method(request):
    d = {"af": inspect.stack()[1][3]} # magic!
    return render_to_response("editor/writer/overview.html", d)

 
 
 
#overview.html
class="{% ifequal af ‘show_expiring_soon’ %}active{% endifequal %}"

Самообразование

Пришёл вчера список книг, рекомендуемых к прочтению компанией Intel (профессиональная литература для кодеров и программистов): http://www.intel.com/technology/rr/?cid=sw:dslnews5210

Дизайн пользовательских интерфейсов

Май 11, 2010

Сегодня с Каришкой делали дизайн для одного проекта. Нам очень понравился инструмент http://www.balsamiq.com/builds/mockups-web-demo/ . С его помощью быстро пришли к глубокому пониманию друг друга в нелёгком вопросе дизайна и юзабилити 🙂 Хотя, наверное, дело не в инструменте, а в том, что я её очень сильно люблю!

Идея Плазмоида

Май 3, 2010

Появилась идея сделать плазмоид (plazmoid), для воспроизведения online радиостанций (тот же самый moskva.fm, live365.com).

Python-западло

Апрель 25, 2010

Это первая задача в моей жизни, с которой не справился Python.

>>> date = datetime.now()
>>> date.strftime(u"%d.%m.%Y в %H:%M")

ибо нельзя передавать Unicode строки в strftime. Выкручивался просто через жопу.