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

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

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

Як склеїти всі pdf-файли в один?

leave a comment »

Сьогодні дізнався команду яка допоможе коли наприклад дружина прислала тобі 5 сканів в файлах pdf, мережеве з’єднання до принтера не працює, принтер вміє друкувати файли з флешки, але вибираючи кожен файл поокремо в меню принтера можна стерти пальці, і хочеться спростити собі життя. Знайшов на AskUbuntu:

gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=all.pdf *

Плюси (для мене) цієї команди порівняно з іншими варіантами:

  • Виявилася вже встановлена на Ubuntu
  • gs (GhostScript) – це інтерпретатор екзотичної тюрінг-повної мови програмування PostScript, яка є чимось середнім між TeX та Forth. Завжди корисно як не вивчити нову мову то хоча б її штрикнути одним пальцем.
  • Автором цієї утиліти є чувак про якого я колись читав книжку і не одну.
Advertisements

Written by bunyk

Квітень 4, 2018 at 18:46

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

Символи вікіпедії, детальніший аналіз

with one comment

Щодо моєї попередньої публікації, мені зауважили що є різні простори імен. Тому сьогодні буде аналіз лише тих символів які можна зустріти в статтях (а не в категоріях, шаблонах, на сторінках користувачів і проектів), розбивка по різних алфавітах (може кому треба буде для частотного аналізу).

Загалом статті складаються з 3 613 435 448 символів, з яких різних 23 717. Вони розподілені так (намальовано лише початок розподілу, бо решта – неозрброєним оком не видно):


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

Written by bunyk

Березень 18, 2018 at 19:05

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

Tagged with ,

Красиво друкуємо 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 , ,