Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Archive for the ‘Розмітка’ Category

Красиво друкуємо xml в термінал

leave a comment »

XML то жахіття ще те, але іноді його таки треба читати, нікуди не дінешся. Аби зробити своє життя трішки кращим можна написати таке:

def pprint_xml(text):
    import xml.dom.minidom
    from pygments import highlight
    from pygments.lexers import XmlLexer
    from pygments.formatters import TerminalFormatter
    xml = xml.dom.minidom.parseString(text)
    print highlight(xml.toprettyxml(), XmlLexer(), TerminalFormatter())

Потребує pygments.

Разом з Інтроспектором та іншими утилітами для дебагу це вже тягне на якусь лібу. Напевне наступного тижня заведу собі таку десь на github.

Written by bunyk

Серпень 2, 2013 at 14:12

Оприлюднено в Кодерство, Розмітка

Tagged with ,

Журнальне програмування, JavaScript

with 3 comments

Я вже якось писав що без написання коментарів можна обійтись, якщо використовувати рефакторинг “extract method”. Це не означає що коментарі не варто писати, це означає що їх потрібно писати на іншому рівні абстракції і бажано в мові предметної області. Як цього навчитись – складне питання. Щоправда недавно вичитав в пості Дмитра Сіренка на Google+ ідею про те що коментарі краще робити виводом в якийсь лог.

Ця ідея для мене нова і мені дуже сподобалась. По-перше це допоможе краще думати про що ж все таки писати в коментарі. Про те що відбувається:
Прочитати решту цього запису »

Written by bunyk

Липень 6, 2013 at 12:56

Дівчина-салат

with 11 comments

Дівчина-салат – це робоча назва прототипу підручника німецької який я на тих вихідних створив, але все не мав нагоди про це написати.

Власне якби я був голлівудським продюсером, я б вже давно на додачу до людини-павука, людини-кажана, жінки-кішки і решти людей-гібридів зняв би “дівчину-салат”. Це історія про дівчинку яка народилась від того що її мама з’їла генетично-модифіковану рослину (а які ви думаєте ще можуть рости на городі у відьми?) з виду Valerianella locusta, також відому як Рапунцель. А вони зняли якусь “Заплутану історію”, яку я не дивився, зате, прочитав оригінал братів Грімм. Казка містить глибоку мораль, суть якої в тому, що коли дітей недостатньо виховали, то навіть якщо їх замкнути в вежі, це не допоможе.

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

Рапунцель з нотатками

Рапунцель з нотатками

І під час того я постійно думав, що це взагалі мій улюблений спосіб вчитись, тому що це не нудно і швидко набирається словниковий запас. Але чи вчусь я, поки гортаю сторінки словника? Здається єдине чого я вчусь – швидше відкривати потрібну сторінку і швидше знаходити на ній слово. На запам’ятовування самого слова йде менше часу і це напевне не добре.

Тому я подумав, що класно було б мати книжки, де словник знаходиться прямо на тій сторінці яку я читаю. Як в Gerda malaperis! (коли з’явиться українська стаття, нагадайте замінити посилання, не соромтесь). Gerda malaperis звісно виняткова книжка, бо написана саме з навчальною метою і на жаль аналогічних я більше не знаю.

Ще я подумав що подібним чином можна адаптувати звичайні твори. І саме для цієї мети мають чудово підходити зноски які вміє робити LaTeX. Їх було так багато, що довелось застосувати деякі нестандартні модулі аби спростити нумерацію. А ще довелось застосувати XeTeX, він знає про Unicode-шрифти. Бо в звичайному TeX Live отримати одночасно німецькі умляути й кирилицю дуже важко.

Є ще метод Іллі Франка, але він мені чомусь не дуже йде, напевне тому що там дізнаватись значення слова занадто просто і я ловлю себе на тому що читаю не німецькою а російською, пропускаючи все що не в дужках.

Коментарі щодо мого розуміння німецької граматики (і української), підказки щодо вдосконалення оформлення видання (ось код для XeTeX, рев’ю можна робити як тут, так і прямо на Google Code) та інша критика вітається.

Written by bunyk

Травень 9, 2013 at 23:46

Як встановити пакет LaTeX, та як зробити так щоб зноски починали нумеруватись на кожній сторінці заново?

with 6 comments

Спочатку відповім на друге запитання, бо воно простіше. В заголовку документа прописуємо:

\usepackage{perpage}
\MakePerPage[1]{footnote}

Друга команда вказує на те що зноскам варто на кожній сторінці починати нумерацію з 1.

При компіляції документа може вилізти така помилка:

! LaTeX Error: File `perpage.sty' not found

Це означає що вам бракує встановленого пакета bigfoot.

Потрібно завантажити архів, розпакувати його, та запустити команду latex bigfoot.ins. Вона розпакує з файлу bigfoot.dtx інші файли.

Далі нам потрібен лише perpage.sty. Його треба скопіювати кудись, а щоб дізнатись куди, для TeX Live потрібно виконати таку команду:

bunyk@xubuntyk:~/bigfoot$ texhash
texhash: /usr/local/share/texmf: directory not writable. Skipping...
texhash: /var/lib/texmf: directory not writable. Skipping...
texhash: /var/lib/texmf: directory not writable. Skipping...
texhash: /var/lib/texmf: directory not writable. Skipping...
texhash: Done.

Я вибрав /usr/local/share/texmf і створив там шлях tex/latex/bigfoot. Куди й кинув файл perpage.sty (повний шлях /usr/local/share/texmf/tex/latex/bigfoot/perpage.sty).

Далі потрібно запустити:

bunyk@xubuntyk:~/bigfoot$ sudo texhash

Це все, документ скомпілювався і я досяг чого хотів, а якщо хочете, можете читати більше про встановлення пакетів.

Written by bunyk

Травень 6, 2013 at 16:07

Оприлюднено в Кодерство, Розмітка

Tagged with

Відкрити браузер і передати йому html

leave a comment »

На роботі часто пишу email розсилки. І перед тим як їх тестувати на живому сервері (і на живих клієнта) ми стараємось тестувати їх в локальних умовах. Раніше для цього в конфігу вмикалась опція яка замінювала адресу отримувача на всіх листах що відправляються на адресу розробника чи тестера, після чого десь на порталі натискалась кнопка, чи з інтерактивної сесії Python запускалась функція яка збирала всі дані для заповнення шаблону, рендерила його і посилала листа.

Але це заморочливо. Тепер я вмію мокати smtplib і листи почнуть покриватись тестами. І тоді вже почнеться повне TDD і всім буде добре, бо розробники зможуть виправляти помилки ще до того як відправити їх тестерам.

Тільки от біда, що є речі які автоматичними тестами не покриваються. Наприклад треба переконатись що текст не вилазить за межі кнопочки шаблон якої зверстали наші круті стиляги-верстальщики.

Рішення яке використовую я – під час розробки показати html що генерується у браузері. Як у webtest може об’єкт responce.

Перед тим як щось робити самому я звичайно погуглив, і знайшов спосіб, який щоправда трохи застарілий. Потрібно хоча б заголовок Content-Type передавати, тому що його не задають в мета-тегу, а в заголовках формату MIME.

Власне ось сам код – веб-сервер в одній функції що відповідає на один запит:

import webbrowser
from wsgiref.simple_server import make_server
def show_in_browser(html):
        html = html.encode('utf-8')
        def wsgiapp(environ, start_response):
        headers = [('Content-type', 'text/html; charset=utf-8'),
                   ('Content-Length', str(len(html)))]
        start_response('200 OK', headers)
        return [html]

    # нульовий порт означає "знайди вільний сам"
    server = make_server('127.0.0.1', 0, wsgiapp)
    webbrowser.open('http://127.0.0.1:%s' % server.server_port)
    server.handle_request() # один запит

Мене на рев’ю запитали чому ж я не запишу html в тимчасовий файл? Видно я вже занадто веб-девелопер, бо раніше не знав як таке зробити. Зараз знаю як створити тимчасовий файл, але щось локальні файли відкриваються неадекватно. В текстовому редакторі.

Written by bunyk

Листопад 2, 2012 at 01:25

Оприлюднено в Кодерство, Розмітка

Tagged with , ,

Додзьо для регулярного ніндзя

with 7 comments

Щойно вивчив чим відрізняється negative lookbehing від negative lookahead.

Шукав всі пітонівські файли які не є скомпільованими мако файлами що містять певний шаблон. В моєму випадку – всі місця в проекті, в яких рендериться вміст листів. Написав:

    :Ack -G "(?!\.mako)\.py$" "email/[_/\w\d]+\.mako"

Не знайшов. Бачите в чому помилка? Тут я використав lookahead, а треба було lookbehind. Lookbehind пишеться так:

    :Ack -G "(?<!\.mako)\.py$" "email/[_/\w\d]+\.mako"

Хто б подумав, що треба писати так. Але тепер я вже знаю :). Ах, для тих хто не зрозумів що відбувається, ack – це типу grep.

І от в мене виникла ідея – взяти якось на вихідних і написати інтерактивний підручник регулярних виразів. Такий собі html-файлик, всередині якого в JSON записано набір уроків в такому форматі:

[
    {
        'Назва': "...",
        'Текст уроку': "...",
        'Вправи': [
            {
                'Умова': "...",
                'Корпус тексту': "...",
                'Тип вправи': 1, # пошук/заміна
                'Підрядки що потрібно отримати з домогою виразу': ["...", ...],  # якщо пошук
                'Текст що потрібно отримати в результаті': "...", # якщо заміна
                'Бали': XP, 
            },
            ...
        ]
    },
    ...
]

І тебе пускають до наступного коли ти набрав необхідну кількість балів на попередньому.

Тепер розшукую regexp – гуру, jQuery – гуру, гуру верстки, і технічних письменників (чи просто літературних редакторів) які б це все допомогли реалізувати.

Written by bunyk

Квітень 20, 2012 at 19:34

Micro python HTML templating engine

with 3 comments

Idea that XML is not the most compact form of trees markup is not new. Like idea that HTML is hard to write by hand and should be dynamically generated on server. (Or compiled. There is even whole class of software – site compilers, which can be cheaper equivalents to content management systems). Furthermore, today even CSS can be compiled from SASS and JavaScript can be compiled from CoffeScript. Which means that web is making a new leap to a more high-level languages, which are compiled to “machine code” (and in our case “machine” is a browser).

Oh, and now I should return to my point. XML document is just a tree. HTML too. And code of any programming language also represent a tree. This is most explicitly seen in Lisp-like languages where we have a lot of parentheses. So why not to write web-pages in Lisp? Or, as I don’t know Lisp good enought, in Python?

Now I am presenting you my brand new lispy micro html templating engine. It is supercompact, and probably superslow, but I am too lazy to test. Also it doesn’t have escaping support, so use with caution.

Прочитати решту цього запису »

Written by bunyk

Грудень 22, 2011 at 00:02

Оприлюднено в Кодерство, Розмітка, English posts

Tagged with , ,