12 августа, 21:58

Набор патчей

Купил набор из 30 пластырей. Они там разных цветов, форм и размеров. Напоминает велосипедную аптечку.

Медицинский пластырь, большой универсальный набор № 5

Ответить
12 августа, 21:46

Про очереди

В винницком отделении Укртелекома, что около парка Козицкого, используют простой и грубый способ организации очередей. Жёлтая линией на полу разделяет зал на две половины: в первой обслуживают клиента, а во второй толпятся все остальные желающие. Подходить по одному, остальным за линию не заходить. Аналогичный метод применяют в аэропортах.

Схема очереди в Укртелекоме

Гораздо лучше обстоят дела в винницком БТИ. Подходите к терминалу, выбираете необходимое отделение и получаете талончик регистрации. Там указан ваш номер, номер оператора, который вас обслужит и размер текущей очереди. Забавно, что если размер текущей очереди достаточно большой, то терминал, перед печатью талона, переспросит действительно ли вы готовы так долго ждать. В зале висит большое табло, на котором высвечиваются номера операторов и текущих посетителей.

Талон на очередь в БТИ

К сожалению, много людей не знают или не хотят брать талоны, пытаются занять очередь «старым способом» да или просто лезут напролом. Например, размер моей очереди был больше 10 человек, номер моего талона был 115, номер талона женщины передо мной — 118 (ей его поднесли), но обслужили меня третьим (:

В целом о БТИ у меня сложилось очень приятное впечатление. Как говорится, пример европейской цивилизации.

Ответить / очередь, социум, навигация
23 декабря, 03:24

Ночник

Существует хороший способ сделать красивый и уникальный подарок — роспись по стеклу. Причём расписывать можно всё что угодно: стаканы, тарелки, бутылки, пепельницы, вазы, подсвечники, фоторамки… А особенно красиво смотрятся светильники украшенные полупрозрачной краской. Я решил попробовать свои силы в этой области. Сразу оговорюсь, что это не мастер-класс, а просто краткое описание моего опыта.

Объект. В магазине была куплена небольшая настольная лампа выполненная в виде прозрачного куба со стороной в шесть сантиметров. Единственной потенциальной проблемой были вогнутости на каждой из боковых граней. Я боялся, что это сильно затруднит нанесение рисунка, но в действительности сложностей с этим почти не оказалось.

Рисунок. Что нарисовать я придумал практически сразу: ночная панорама города и влюблённая мурлыкающая парочка на крыше одного из домов. Но эскиз удалось сделать только для одной грани, там где располагались кот с кошкой. Остальное придумывалось непосредственно перед нанесением контура.

Контур и краски. Техника росписи стекла заключается в следующем. Сначала на поверхность стекла объёмной краской — контуром — наносятся линии будущего рисунка. У меня был чёрный контур Idea. Далее каждая область при помощи синтетической кисти заливается цветной краской. Я использовал прозрачные витражные краски Marabu, которые не требуют обжига.

Процесс. Очищаем поверхность плафона спиртом. Тонким маркером наносим опорные точки рисунка. Кладём контур, при этом все ошибки и ляпы оставляем как есть. Даём контуру хорошо засохнуть и только после этого при помощи обычного канцелярского ножа убираем неправильно положенный контур. Потом переходим к раскрашиванию: цвет за цветом, грань за гранью. Кисть моем обычным уайт-спиритом или в худшем случае дешёвой жидкостью для снятия лака. Через 48 часов изделие готово к эксплуатации.

Результат. Я очень доволен тем, что получилось и что получилось вообще. Благодарю Андрея Пилипчука за идею про трамвайчик.

Ночной светильник расписанный витражными красками

2 ответа / фото, стекло, DIY, подарок
7 ноября, 22:19

Интерактивное сравнение в git-е

Когда я перешёл с Mercurial-а на git, меня постигло небольшое разочарование: я не нашёл аналога расширению extdiff. А конфигурационный параметр diff.external работал не так, как я этого ожидал.

Зачем нужен extdiff и как он работает? Это расширение позволяет использовать внешние программы для сравнения файлов. Преимуществ перед внутренним diff-ом несколько:

extdiff создаёт две временные директории, воссоздаёт в них структуру сравниваемых commit-ов и запускает внешнюю программу для сравнения этих двух папок. После завершения те файлы что были взяты из рабочей директории (разумеется, если это имело место быть) возвращаются назад.

git работает иначе: он запускает diff.external отдельно для каждой пары изменённых файлов. И всё.

Решение проблемы. В общем-то, git прав, поскольку работает по принципу KISS. Но от этого не легче. Поиск готового решения привёл к GitDiff.bat и GitDiff.rb, которые меня не устроили как минимум по причине зависимостей от Ruby и Windows-а. И я решил написать своё на Perl-е.

Предлагаю вашему вниманию скрипт git-idiff. Для начала работы переопределите переменную $diff и вызов вашей любимой программы для сравнивания (в коде есть примеры). Запускать так же как и git diff, например:

	git-idiff --cached

Поскольку git для работы требует Perl, то для работы git-idiff-а у вас уже всё есть. Работоспособность проверялась на GNU/Linux-е с git-ом версии 1.6.2.1 и на Windows-е XP с msysGit-ом версии 1.6.5.1. При использовании Perl-а из пакета msysGit-а есть некоторые нерешённые проблемы.

2 ответа / git, Perl, diff
25 июля, 22:58

ADOM на большом экране

Так играть намного удобнее (:

ADOM на большом экране

1 ответ / adom, фото, я
5 июля, 16:11

История двух нитей

На собеседовании в ИТ-компании было предложено ответить на следующий вопрос.

Задача. Дано такой код:

	static int counter = 0;

	void worker()
	{
		for (int i = 1; i <= 10; i++)
			counter++;
	}

Процедуру worker() запускают из двух нитей. Какое значение будет содержать переменная counter по завершении работы обеих нитей и почему?

Немного теории. Нити — это параллельно-исполняемые задачи в пределах одного процесса. Основное различие между процессами и нитями такое, что все нити одного процесса работают в общем адресном пространстве своего процесса.

Я не называю нити потоками, что бы не путать потоки выполнения (thread) и потоки данных (stream).

Вариант ответа № 1. Переменная counter будет содержать число 20 — это самый желаемый результат, но и самый неверный ответ.

Проблема в том, что данный код никак не защищён от рассинхронизации. Каждая нить работает независимо друг от друга и не подозревает, что общие данные (переменная counter) могут быть изменены кем-то ещё. Поэтому более правильный ответ такой: это небезопасный код и значение переменной counter будет неопределённым.

Вариант № 2. Всё же зная основы работы процессора, ОС и компилятора можно более точно предположить какой результат мы получим.

Подпрограмма worker() достаточно простая. Поэтому компилятор на этапе оптимизации может развернуть for-цикл в такую конструкцию:

	counter += 10;

Теперь код настолько тривиален, что первая нить может успеть закончить его выполнение ещё до того как запустится вторая нить. Таким образом мы получим число 20.

Возможен и такой случай. Нити прочтут из оперативной памяти значение переменной counter (ноль) и занесут его в регистр процессора. Так как каждая нить работает в своём контексте процессора, то у каждой есть «свой независимый» набор регистров. Таким образом первая нить в своём контексте увеличит значение регистра с нуля до десяти и потом занесёт полученный результат обратно в память. А потом вторая нить сделает тоже самое и перезапишет ту десятку своей. В результате получим число 10.

Значения 10 и 20 наиболее вероятны в реальной практике, но и это ещё не полный ответ.

Вариант № 3. Давайте представим потенциально реальную, но максимально неэффективную схему работы. Так каждая итерация цикла будет одинаково повторять три атомарных действия: чтение значения counter в регистр процессора, инкремент этого регистра, запись нового значения из регистра обратно в память. (Реализацию самого цикла я не рассматриваю, так как она не играет никакой роли.) Плюс к этому переключение контекста выполнения нитей будет происходить тогда, когда этого хочется нам. На таких условиях мы можем получить результат от 2 до 20.

Теперь на временной шкале в виде таблицы рассмотрим возможность получения двойки. Шаг 0 — изначальное состояние. Операции «→n», «n+» и «n→» соответственно представляют чтение из памяти в регистр, инкремент регистра и запись значения регистра в память в контексте нити № n. Строка «цикл» показывает номер итерации. Изменения значений на текущем шаге выделены для лучшего восприятия.

Шаг 0 1 2 3 4 5 27 28 29 30 31 32 33 34 35 57 58 59 60
Операция →1 1+ →2 2+ 2→ →2 2+ 2→ 1→ →2 2+ →1 1+ 1→ →1 1+ 1→ 2→
Нить № 1 Регистр 0 1 1 1 1 1 1 1 1 1 1 1 2 2 9 10 10 10
Цикл 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 10 10 10 10
Нить № 2 Регистр 0 1 1 8 9 9 9 1 2 2 2 2 2 2 2 2
Цикл 1 1 1 1 1 1 9 9 9 9 10 10 10 10 10 10 10 10 10
Память 0 0 0 0 0 1 8 8 9 1 1 1 1 1 2 9 9 10 2

Шаги 1—2: первая нить заносит в регистр ноль и увеличивает его на единицу. 3—29: управление передаётся второй нити, которая тоже считывает ноль и выполняет девять полных итераций. 30: первая нить завершает первую итерацию цикла и заносит посчитанную единицу в память (перетирая девятку). 31—32: вторая нить начинает последнюю (десятую) итерацию, читает и инкриминирует единицу. 33—59: первая нить полностью выполняет девять оставшихся итераций и заканчивает свою работу. 60: вторая нить записывает в память посчитанную двойку и заканчивает свою работу.

2 ответа / программирование, параллелизм, собеседование
27 июня, 19:16

Проставил метки к записям блога.

6 ответов / этот сайт
17 июня, 21:43

Учитесь жонглировать

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

Начать можно с информации на сайтах jugglers.ru и IJDb.

Максим Вуец жонглирует

6 ответов / я, жонглирование, фото
11 июня, 14:39

Программируем для фотоаппарата

Для фотоаппаратов компании Canon существует забавная штукенция — CHDK. Это резидентная программа (чаще называемая альтернативной прошивкой), которая предоставляет множество новых полезных функций, например: съёмку в raw-формате, живую гистограмму, индикатор заряда аккумулятора в процентах, игры и даже выполнение сценариев (скриптов).

CHDK на G7 я использую около года, но необходимость написать свой сценарий возникла только сегодня: понадобилось автоматически запустить серийную съёмку через некоторый интервал времени. Стандартными средствами сделать это можно только попросив кого-то начать и остановить съёмку по вашим командам. Но поблизости никого не было.

Программировать можно на двух языках: uBASIC и Lua. Мой CHDK умеет исполнять только uBASIC-программы. Я изучил документацию, несколько примеров и написал сценарий, который сделал, то что мне требовалось.

	rem Author: Maxim Vuets <http://maxim.vuets.name/>
	@title Shot holder for continous shooting
	@param d Delay 1st shot, secs
	@default d 0
	@param a Adjusting time, 10th secs
	@default a 15
	@param c Shooting duration, secs
	@default c 3

	if d<0 then let d=0
	if a<0 then let a=15
	if c<0 then let c=3

	print "Delaying..."
	sleep d*1000

	print "Adjusting..."
	press "shoot_half"
	sleep a*100

	print "Go!"
	press "shoot_full"
	sleep c*1000

	release "shoot_full"
	release "shoot_half"
3 ответа / CHDK, программирование, Canon
8 июня, 11:21

Я завёл микроблог.

6 ответов / я
7 июня, 11:50

Пузыри из компакт-диска

Дурной пример заразителен. Зато не обман (:

Пузыри из компакт-диска

4 ответа / забава, фото
5 июня, 10:30

Не понимаю

Я не понимаю, зачем на форумах пишут «Нажмите на кнопку "Спасибо", чтобы увидеть ссылку (нужна регистрация)». Почему выкладывают архивы и ставят на них пароли, при этом пароль сообщается всем и представляет из себя адрес сайта на котором выложен файл. Неясно что даёт попытка защитить PDF-документы.

Я ужасно не люблю сайты, на которых размещают flash-проигрыватели без прямой ссылки на воспроизводимые аудио- или видео-файлы.

Остаётся загадкой почему для публикации на сайте отсканированного изображения диплома, свидетельства или другого документа используют формат doc. А для элементарной таблицы с расписанием или прейскурантом — xls.

1 ответ / массаракш, дураки, мнение, я
4 июня, 20:44

За чистоту

Мне очень не нравится, когда в русскую речь домешивают кальки на английские слова. «Проджект менеджер должен делать так, что бы метрики не превышали таргеты, иначе это станет ризоном для закрытия проекта кастомером, окей?» Ещё противнее когда это не разговорная речь, а деловая переписка. Это не только неуважение к языку, но и, в первую очередь, неуважение к себе самому. Я полагаю.

Про «окей» отдельный разговор. Не переношу это слово вне английского. Особенно противно когда его употребляют в джаббере и набранным кириллицей. Фу. Неужели наше душевное «угу» хуже? А бывает доходит до маразмов, когда ты ставишь собеседнику вопрос, а в ответ получаешь лишь неоднозначное «ок».

Вдогонку к «окею» ещё слова-паразиты: дринк, плиз, сори, гуд, йес.

Также я не понимаю этой повсеместной несбалансированной любви к Лиспу: «))) то были пары))». Да просто нашествие слепых одурманенных смайликов какое-то.

Минутка ненависти подошла к концу. Спасибо за внимание. Лисп, конечно, ни при чём.

2 ответа / массаракш, язык, мнение, я
23 мая, 22:26

ДахаБраха у Вінниці

Вчора — 22 травня — у Вінницькій обласній філармонії відбувся концерт київського етно-хаос гурту «ДахаБраха». Квитки були вартістю від 40 до 80 грн.

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

Квиток на концерт ДахаБрахи

Концерт розпочався із запізненням на 15 хвилин. Це, мабуть, таке нове правило етикету. На сцену вийшов чувак і почав представляти російською гурт і спонсорів. (Скажіть, яка роль спонсорів, якщо виступ комерційний?) Тут із залу почулось: «Українською!» (: Чувак спробував відмазатись, що якщо він почне українською, то це буде казна-що. Згодом знову пролунав заклик перейти на українську і цього разу чувак виконав прохання. Дарма він так боявся.

Нарешті, почався виступ, який, до речі, присвячений новому альбому «На межі». Спочатку виконали декілька старих пісень, потім перейшли до тих, що з нового альбому. Також прозвучало дві пісні на «англійському діалекті», що досі не видавались: про кохання і колискова.

Різноманіття музичних інструментів і пристроїв, що були використанні, просто приголомшує. Їх було близько 15, але я не наважусь перерахувати усі, тому що просто боюсь неправильно назвати усі ті «барабани» (: Скажу лишень, що були навіть стільниковий телефон і рупор. Є невеличкий відео-фрагмент із телефоном на початку (MPEG-1, 10,3 МБ, 3 хв).

ДахаБраха на сцені Вінницької обласної філармонії

Щодо стилю виконання, то це виглядає приблизно наступним чином. Повільний затяжний початок із поступовим нарощуванням гучності і складності. Далі слова, які аналогічно поступово перетворюються на хаотичний галас. Багато ударних. І, зрештою, раптове повне або часткове припинення гри. У межах однієї композиції такий цикл може повторюватись декілька разів. Тільки не знаю: це принцип етно-хаосу взагалі чи такий стиль саме цього гурту. Незважаючи на перевагу народних інструментів все це звучить досить потужно і класно.

Були дві пісні, які я б умовно окреслив за стилем як етно-реп і етно-хорор (: Назву першої я не пам'ятаю (здається вона ще не видавалась), але було сказано, що за її основу була взята закарпатська коломийка. Йшлося про дівчину, яка ніяк не могла вирішити за якого парубка їй вийти заміж. Друга називається «Ванюша» і ввійшла до нового альбому. Розповідається страшна історія із великою кількістю крові (:

Концерт тривав дві години. Зал аплодував стоячи і стоячи слухав останню пісню на біс. Після концерту усі охочі отримували автографи і фотографувались із учасниками гурту.

За лаштунками

Ответить / ДахаБраха, музыка, этно, концерт, Винница, фото, видео
19 мая, 16:08

Впечатления от Сишарпа

Недавно появилась необходимость ознакомиться с языком программирования C#. Неважно почему и зачем. Важно, что надо было узнать побольше и побыстрее. А потом ещё закрепить полученные знания на практике.

Дима обеспечил теоретической пищей — Programming C#. А бывший сокурсник Андрей практической задачей — сделать программу для тестирования студентов. Главным и единственным требованием было «что бы там можно было добавлять иллюстрации к вопросам». Работу делал в среде Visual Studio 2005.

Студия и Сишарп — очень удобные RAD-инструменты для создания программ с графическим интерфейсом. Последний раз так просто можно было работать только на Visual Basic-е 6. Visual C++ и MFC я не считаю удобными в этом плане. Понравилось, что созданные формы превращаются в обычный код, а не хранятся отдельно в ресурсных или XML-файлах:

	// Фрагмент метода void QuestionsForm.InitializeComponent()
	this.text_title = new System.Windows.Forms.TextBox();
	this.text_title.Location = new System.Drawing.Point(12, 12);
	this.text_title.Name = "text_title";
	this.text_title.Size = new System.Drawing.Size(772, 35);
	this.text_title.Text = "Назва тесту";
	this.Controls.Add(this.text_title);

Сишарп очень сильно напоминает Джаву, что не особо удивляет. Тоже многословный, строгий, скурпулёзный. Вероятно, это отличный выбор для дяденек в строгих костюмах (: Понравилось, что итоговый файл — с виду обычный exe-шник. Очень хорошо, что существует тесная интеграция между продуктами Microsoft-а. Плохо, что программное окружения для запуска очень большое — более 200 МБ (как контрпример: окружение для запуска Джава-приложений занимает порядка 15 МБ). А упоминающаяся кросс-платформенность .NET-а реально достигается только при помощи Mono.

Программа для тестирования из-под Mono

Столкнулся я и с достаточно неприятными моментами. Например, так и не понял почему System.Drawing.Bitmap полностью работает с PNG, а не работает с BMP, JPEG, GIF и WMF: я загружал файлы этих форматов, а потом сохранял их в Bitmap.RawFormat. В результате получал исключительную ситуацию с сообщением «A generic error occurred in GDI+».

В целом, Сишарп мне понравился. Наверное, даже больше чем Джава. Но писать на нём мне всё же не хочется.

Ответить / C#, .NET, программирование, мнение
18 мая, 15:51

GitHub Pages

Оказывается, уже почти полгода GitHub предоставляет простой хостинг и домен третьего уровня вида yourname.github.com. Впрочем, они дают возможность припарковать и свой домен.

Классно. Теперь GitHub напоминает SourceForge.

Ответить / GitHub
17 мая, 20:38

Дни Европы в Виннице

Мазки

На этих выходных в Виннице проходило празднование Дней Европы. В сквере им. Козицкого разместилась небольшая ярмарка сувениров, выставка работ детских школ искусств и фотографов. Работала полевая кухня, где поляки предлагали откушать тушёной капусты с мясом.

Дни Европы в Виннице

На Соборной — центральной улице города — перекрыли движение транспорта и организовали демонстрацию живых скульптур, которые и притягивали бо́льшую часть внимания зевак. Буквально каждый норовил сделать снимок рядом с изваянием, что приводило к постоянным давкам, вай. Мне так и не удалось получить хороший снимок, а вот Юля молодец.

Юля и живая статуя

Ещё были конкурсы рисунков на асфальте, квас и музыкальные соревнования. Играли джаз, рок, рэп, фолк, рок-н-ролл. В парке им. Горького ничего особенно не наблюдалось — обычные массовые гулянья.

В целом, нам очень понравилось. А Рома сказал, что было скучно (:

1 ответ / Винница, День Европы, праздник, я, Kauz, фото
15 мая, 15:59

Это *ец какой-то! Пришёл в, наверное, единственный на университет (ВНТУ, да) центр печати, что бы сделать несколько распечаток, а там такая засада. Разумеется, что документы были в PDF-формате. Ага, нет у них ни одной PDF-открывалки. Зато есть Windows, Office, Photoshop… приклеенное объявление, что флешки надо открывать только через Total Commander (это они так вирусов боятся), KAV и уже́ на моей флешке два новосозданных файла с подозрительными именами. Не сложно догадаться, что это за файлы. У них даже DjVu-смотрелка есть! Ну, а Интернета у них, конечно, нет. Пришлось возвращаться на работу за PDF-читалкой.

Рокер, Вакуум, Салкем, Тарк, будете собираться печатать что-то в ГУК-е — берите с собой ещё Sumatra PDF или Foxit Reader.

5 ответов / ВНТУ, массаракш, дураки
15 мая, 11:03

Попробуй ещё

Давно я не «фотожабил»… Кстати, сделано с помощью GIMP-а.

Скретч-карта Киевстара

5 ответов / юмор, Киевстар, фото, фотообман
14 мая, 08:58

Сгущёнка — средство для похудения

В ней минус триста тридцать восемь с половиной килокалорий.

Банка сгущёнки

1 ответ / дураки, фото, сгущёнка
13 мая, 17:54

Контрольная работа в unиx-стиле

Приближается экзаменационная сессия. Сокурсники попросили меня помочь им с контрольной работой по дисциплине «Основи захисту інформації» («Основы защиты информации»). Поэтому в этот раз я решил максимально автоматизировать процесс выполнения поставленной задачи.

Контрольная состоит из четырёх заданий по криптографии. Главная суть каждого: зашифровать произвольный текст заданным методом или алгоритмом.

Общая идея была такова: составить файлы с исходными данными для заданий (открытые тексты, шифроключи), написать программы для произведения расчётов и подготовить шаблоны, по которым работа будет собираться воедино.

По новой традиции документы составлены на LaTeX-е. Расчёт делается на Perl-е. Шаблонами заправляет Template Toolkit. А всю работу координирует GNU Make.

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

	\subsection*{Створення ключа}

	Вихідним алфавітом є~малі літери українського алфавіту та~дефіс:

	\begin{center}
		\begin{tabular}{*{%% Abc.size %%}{|c}|}
			\hline
			%%- FOREACH a IN Abc %%
				\verb#%% a %%#
				%%- LAST IF loop.last %% &
			%%- END %%
			\\ \hline
		\end{tabular}
	\end{center}

Теперь необходимо подготовить к печати, допустим, 25 работ. Наполняем dat-файлы исходными данными, выполняем команду make batch и через две минуты получаем 25 PDF-файлов. Класс!

Польза, которую я извлёк из работы: нашёл баг в TT, вспомнил про КОИ-8, лучше разобрался с GNU Make-ом и git-ом, осилил DES, помог людям (:

Исходный код доступен на GitHub-е. А ещё есть пример уже готовой контрольной (PDF, 340 КБ, 34 стр.), если интересно.

3 ответа / ВНТУ, учёба, unix way, LaTeX, Perl, Template Toolkit, DES
9 мая, 18:00

Юля написала стих про Ubuntu. Забавный (:

4 ответа / Ubuntu, Kauz, стих
9 мая, 17:55

Цветы ли?

Квіти

2 ответа / дураки, цветы, фото
9 мая, 00:50

Транслит при помощи КОИ-8

Кодовая страница КОИ-8 создавалась таким образом, что бы при передаче русского текста по 7-битному каналу связи (то есть, теряя восьмой бит) сохранить его читаемость. Таким образом «Привет, медведь!» превращается в «pRIWET, MEDWEDX!». (Подозреваю, что регистр букв нарочно поменяли местами дабы проще было заметить потерю значащего бита.)

Эту особенность можно применить для создания примитивного транслита — записи русского текста буквами латинского алфавита. Для этого необходимо конвертировать исходный текст в КОИ-8 и отбросить восьмой бит.

	$ echo 'Привет, медведь!' | \
	  iconv -t koi8-r | \
	  perl -pe '$_ = pack "C*", (map {$_ & ~(1<<7)} unpack "C*")'
	pRIWET, MEDWEDX!

Теперь нужно исправить регистр. Несложно заметить, что в КОИ-8 прописная русская буква отличается от строчной лишь шестым битом: «Ы» — 11111001, «ы» — 11011001. Также видно, что все буквы (кроме «ё») имеют установленный седьмой бит. Поэтому проверяем является ли текущий символ буквой и, если да, инвертируем его шестой бит:

	$ echo 'Привет, медведь!' | \
	  iconv -t koi8-r | \
	  perl -pe '$_ = pack "C*", (map {($_ &= ~(1<<7)) & 1<<6 ? $_ ^ 1<<5 : $_} unpack "C*")'
	Priwet, medwedx!
12 ответов / КОИ-8, Perl, забава, транслит
8 мая, 22:56

ХУІІ

Продолжая тему XVII века:

ХУІІ

Сестричка из школы принесла.

3 ответа / дураки, фото
8 мая, 11:14

Баг в Template Toolkit-е с UTF-8

Вчера наткнулся на очень неприятную ошибку в Template Toolkit-е. Он не находит в хеше ключи, которые представляют из себя строки в UTF-8.

Еще одной проблемой является то, что виртуальный метод length возвращает количество байт, а не символов (см. #43323, #45017).

Как выяснилось, проблема кроется в Template::Stash::XS — XS-версии хранилища данных шаблона. Если вместо этого модуля воспользоваться чисто Perl-овым Template::Stash, то проблема исчезает.

Вывод. Template::Stash::XS не умеет корректно работать с UTF-8. Воспроизводится на последних версиях: 2.20 и 2.20_1. Создана заявка #45842.

Обход проблемы. Необходимо явно указать какой stash вы хотите использовать:

	$Template::Config::STASH = 'Template::Stash';

Демонстрация.

	#!/usr/bin/perl

	use strict;
	use warnings;
	use utf8;
	use Template;

	binmode STDOUT, ':utf8';

	# XXX: uncomment this to make Template work properly
	#$Template::Config::STASH = 'Template::Stash';

	Template->new()->process(\*DATA, {
		ascii => 'key',
		utf8  => 'ключ',
		hash  => {
			key  => 'value',
			ключ => 'значение'
		},
		str   => 'щука'
	});

	__DATA__
	ascii        = [% ascii %]
	hash.$ascii  = [% hash.$ascii %]
	utf8         = [% utf8 %]
	hash.$utf8   = [% hash.$utf8 %]
	str.length   = [% str.length %]

С XS-версией stash-а:

	ascii        = key
	hash.$ascii  = value
	utf8         = ключ
	hash.$utf8   = 
	str.length   = 8

С Perl-версией shash-а:

	ascii        = key
	hash.$ascii  = value
	utf8         = ключ
	hash.$utf8   = значение
	str.length   = 4

Добавлено 4 июля 2009 года: сегодня Andy исправил этот баг.

3 ответа / Template Toolkit, баг, UTF-8, Perl
5 мая, 22:49

Ubuntu 9.04 и Wubi, что б ей…

Юра — мой идеологический наставник — рассказал, что для Ubuntu есть такая штучка Wubi, которая позволяет устанавливать систему из-под Windows-а в обычный файл (образ диска) вместо настоящего раздела. И потом удобно загружать её через NTLDR. И так я решил посмотреть новую Ubuntu 9.04.

О первом горьком опыте работы рассказал ещё Юра. Он хотел установить Ubuntu на флешку, но Wubi отказалась запускаться. Вынимает флешку — запускается. Вставляет обратно — снова не хочет. По журналу он выяснил, что причина в русской метке раздела на флешке. Я попробовал воспроизвести — правда. Причем программа падает тихо, без каких либо уведомлений. Знающие о журнале работы обнаружат в нем что-то такое:

	05-05 22:09 ERROR  root: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
	Traceback (most recent call last):
	  File "Z:\home\evan\bzr\wubi.trunk\build\wubi\files\lib\wubi\application.py", line 54, in run
	  File "Z:\home\evan\bzr\wubi.trunk\build\wubi\files\lib\wubi\backends\common\backend.py", line 153, in fetch_basic_info
	  File "Z:\home\evan\bzr\wubi.trunk\build\wubi\files\lib\wubi\backends\win32\backend.py", line 73, in fetch_host_info
	  File "Z:\home\evan\bzr\wubi.trunk\build\wubi\files\lib\wubi\backends\win32\backend.py", line 291, in get_drives
	  File "Z:\home\evan\bzr\wubi.trunk\build\wubi\files\lib\wubi\backends\win32\drive.py", line 44, in __init__
	  File "Z:\home\evan\bzr\wubi.trunk\build\wubi\files\lib\wubi\backends\win32\drive.py", line 74, in get_volume_information
	UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

Теперь о моих личных приключениях. Пришёл домой, прожёг образ Ubuntu 9.04 на CD-R, запустил установку через Wubi. Проходит несколько минут и я получаю такое сообщение:

	---------------------------
	Ubuntu Installer
	---------------------------
	An error occurred:

	Invalid argument

	For more information, please see the log file: c:\windows\temp\wubi-9.04-rev128.log
	---------------------------
	ОК
	---------------------------

В журнале информация малополезная:

	05-05 22:16 ERROR  TaskList: [Errno 22] Invalid argument
	Traceback (most recent call last):
	  File "Z:\home\evan\bzr\wubi.trunk\build\wubi\files\lib\wubi\backends\common\tasklist.py", line 196, in __call__
	  File "Z:\home\evan\bzr\wubi.trunk\build\wubi\files\lib\wubi\backends\common\utils.py", line 206, in copy_file
	IOError: [Errno 22] Invalid argument
	05-05 22:16 DEBUG  TaskList: # Cancelling tasklist
	05-05 22:16 ERROR  root: [Errno 22] Invalid argument

Тыкал и туда, и сюда. Искал по базе багов. Просто искал. Ничего. Взялся за изучение исходного кода. Оказалось, что Wubi обратно создает образ диска, который я прожёг, а потом ей что-то не удается прочесть в функции copy_file. В конце-концов от проблемы избавился так: положил образ ubuntu-9.04-desktop-i386.iso и wubi.exe в одну папку, запустил установку без диска. Всё хорошо.

Потом пришёл к Юле, что бы установить Ubuntu на её компьютер. Наученный предыдущим опытом я сразу проверил метки дисков на наличие неугодных Wubi символов. Положил образ и wubi.exe в одну папку, запустил. Огрёб:

	---------------------------
	Ubuntu Installer
	---------------------------
	Произошла ошибка:

	writelines() argument must be a sequence of strings

	Более подробную информацию смотрите в файле журнала: c:\windows\temp\wubi-9.04-rev128.log
	---------------------------
	ОК
	---------------------------

	05-05 22:11 ERROR  TaskList: writelines() argument must be a sequence of strings
	Traceback (most recent call last):
	  File "Z:\home\evan\bzr\wubi.trunk\build\wubi\files\lib\wubi\backends\common\tasklist.py", line 196, in __call__
	  File "Z:\home\evan\bzr\wubi.trunk\build\wubi\files\lib\wubi\backends\win32\backend.py", line 161, in copy_installation_files
	  File "Z:\home\evan\bzr\wubi.trunk\build\wubi\files\lib\wubi\backends\common\utils.py", line 257, in replace_line_in_file
	TypeError: writelines() argument must be a sequence of strings
	05-05 22:11 DEBUG  TaskList: # Cancelling tasklist

МПиО показал, что причина в выбранном украинском языке. С английским тоже не работало. Только с русским.

Ладно, процесс пошёл. Но ненадолго. Wubi снова молча куда-то исчезла, лишь оставив в журнале следующее:

	05-05 22:50 ERROR  TaskList: 'ascii' codec can't decode byte 0xf1 in position 0: ordinal not in range(128)
	Traceback (most recent call last):
	  File "Z:\home\evan\bzr\wubi.trunk\build\wubi\files\lib\wubi\backends\common\tasklist.py", line 196, in __call__
	  File "Z:\home\evan\bzr\wubi.trunk\build\wubi\files\lib\wubi\backends\common\backend.py", line 578, in create_preseed
	UnicodeDecodeError: 'ascii' codec can't decode byte 0xf1 in position 0: ordinal not in range(128)
	05-05 22:50 DEBUG  TaskList: # Cancelling tasklist

Я долго думал, МПиО-пил, искал. В результае оказалось, что причина в русском названии профиля пользователя Windows-а. Какой кошмар.

Кстати, смотрю вот, что сегодня ошибка с не-ASCII символами, кажется, была исправлена.

Ох, уж этот оупенсорс.

Добавлено. Вспомнил, что была ещё одна ошибка у Юли на компьютере: Wubi требовала наличия какого-то bcdedit.exe. Пришлось скачать и подсунуть.

11 ответов / Ubuntu, Wubi, баг, массаракш
4 мая, 13:47

Far Manager

Тоже синие с белым.

Перчатки FAR

4 ответа / FAR, перчатки, фото
3 мая, 01:11

Как я нечаянно обошел защиту PDF-файла

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

А недавно звонит сокурсник Тарас и спрашивает как же я распечатал эти работы. «Брошюркой (:» — отвечаю я, недоумевая. Оказалось, что все они были защищены от распечатки, модификации, частичного копирования и так далее.

Информация о защите PDF-документа

Рецепт прост: воспользуйтесь pdf2ps(1) (из пакета Ghostscript) или pdftops(1) (из poppler) для конвертации PDF-документа в PostScript-документ. Разница между ними, кажется, в том, что первый преобразовывает текст в кривые, а второй оставляет его как есть. Я не вникал в детали. При необходимости можно также сделать конвертирование обратно при помощи ps2pdf(1) или pstopdf(1).

А еще есть pdftotext(1), который просто извлекает текст.

2 ответа / PDF, Ghostscript, poppler, дураки
2 мая, 23:56

Знаете, что делает команда «правила» контекстного меню Foxit Reader-а? — Включает отображение линеек (rules) (:

1 ответ / перевод, дураки