933 заметки с тегом

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

«Apple I» в музее техники Эпл

Реплика компьютера «Эпл I» в музее техники Эпл, к сожалению в момент посещения музея этот компьютер не работал

Пока был в Москве, сходил в «Музей техники Эпл», благо три дня в неделю он работает до 9 вечера, так что была возможность заскочить после работы.

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

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

Оригинального «Эпла I» в музее нет — в мире их осталось меньше сотни, зато есть реплика, но не повезло — в этот день, как нарочно, у неё не работала клавиатура. Моя программа небольшая, много времени набор на клавиатуре не занял бы.

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

Думаю, такой конвертор в звук должен существовать, но пока найти его мне не удалось.

15 декабря   apple   музеи   программирование

ZMODEM

Виндовый XShell понимает что такое ZMODEM, при запуске утилиты на сервере готов передавать файлы

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

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

Непростое занятие, которое надо делать параллельно с другими делами. Очень раздражает. Ситуация немного улучшилась, когда я в какой-то паузе решил посмотреть не поддерживает ли XShell (ssh-клиент, который нам поставили) протокол передачи файлов ZMODEM.

ZMODEM — довольно древняя штука, сейчас уже малоизвестная, использовалась ещё на бибиэсках, там подобных протоколов было, как грязи. Я узнал о ней из ssh-клиента SecureCRT, пользовался им когда ещё сидел под Виндоуз. SecureCRT на команду передачи файла на сервер, запускает на удалённой стороне утилиту rz, открывает диалог выбора файлов и очень бодро перекачивает выбранное. Удобно.

Реинкарнация утилиты rz нашлась в виде пакета lrzsz, а запуск установленной команды открыл окно выбора файлов — XShell прекрасно понял чего я от него ожидаю. Жизнь немного улучшилась.

13 декабря   программирование

Физическое воплощение TCP-пакета

Физическое воплощение TCP-пакета, обеспечивается гарантированная доставка, надо полагать

В чате бывших сотрудников «Яндекса» сегодня всплыла безвестная картинка с пакетом (на самом деле — сумкой) с принтом в виде TCP-пакета. Каламбур зашёл, местные гики изошли слюной.

Я тоже заинтересовался — где такую взять и ценой вопроса. С заметным трудом разыскал источник — китайский мономагазин, сумка стоит по-божески — 48¥ ($7), но, судя по всему, на доставку по всему миру автор не рассчитывал.

Видимо не удастся такую получить, разве что найти кого-то в Китае, но я не припомню, чтобы у меня там жили знакомые. Жаль, принт вызывает слюноотделение, да и вещь не бесполезная — молния, внутренний карман, рассчитана на «Макбук Эйр» 13″. Я как раз собирался переходить со своей «прошки» на «Эйр» модели этого года.

30 ноября   программирование

Apple I

Моя первая программа в машинных кодах «Эпл I» бесконечно выводит таблицу символов

Заметил позитивную тенденцию — меня снова стали интересовать статьи на «Хабре», вплоть до зуда что-нибудь попробовать самому. В одно время «Хабр» чрезвычайно испортился — в ленте стало столько маркетинговой чуши, что иногда я неделями туда не заходил, всё равно читать нечего.

Не знаю, что ребята сделали, но направление верное, молодцы!

В общем, прочитал недавно там статью про самодельный «Эпл I» и сегодня не спал до двух ночи.

Нет, свой компьютер я не собрал, да и начиналось всё невинно — сначала скачал несколько эмуляторов, попробовал что-то позапускать готовое. Потом почитал про тамошний ассемблер (на борту там процессор 6502) и решил написать что-нибудь простое на нём.

Для этой цели мне очень подошёл «ОупенЭмулятор» и онлайн-компилятор с возможностью отладки «Асм80». Неожиданно удобная штука, кстати, не знаю сколько я бы без неё проваландался.

Программа, выводящая таблицу символов в компиляторе и отладчике «Асм 80»

Первая моя программа умела совсем мало — только бесконечно выводить на экран таблицу символов. Она такая короткая (всего восемь байт), так как для самого сложного — печати на экран, используется вызов ECHO, встроенной в «Эпл I» программы «Woz Monitor», — по всей видимости её писал Возняк, поэтому она так называется.

В ассемблере 6502 особо не развернёшься — три восьмибитных регистра (A, X, Y), 56 команд (не считая нескольких недокументированных), только целые числа, нет деления и умножения. Я совсем не помню свой первый ассемблер (для «Радио-86РК»), но кажется даже он был богаче.

Тем интереснее было написать что-нибудь чуть более серьёзное. Я написал, разумеется, «песню о пиве», в ближайшее время выложу. Машинные коды вбивал сначала руками прямо в «монитор», всё как в детстве, в начале 90-х, но ближе к ночи устал и написал на «Пайтоне» программу, которая hex-файл «Асма80» перебивает в эмулятор, имитируя нажатия на клавиши через «ЭплСкрипт».

Кстати, какое-то время пришлось ещё потратить на то, чтобы понять как работать с «монитором» Возняка — это предельно аскетичная командная строка, в которой без руководства не разобраться, что, учитывая скромные размеры программы, объяснимо. К счастью, в сети есть копия « Apple-I Operation Manual», которую я наскоро проштудировал.

Там всего несколько страничек, вникнуть просто и сейчас (о ужас!) мне даже удобно.

30 ноября   apple   ассемблер   история   программирование

Самый долгий merge в моей жизни

Заметка будет интересна только программистам.

Фотография ниже лежит у меня на ноуте с августа 2013 года. Очень не люблю такое — всё нужное я привык закачивать в интернет, всё ненужное — удалять. Не мог определиться куда деть это фото, решил положить в блог, снабдив небольшим рассказом.

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

Наверное все программисты знают что такое «мерж» (merge) — слияние двух веток и согласование изменений, сделанных в файлах в рамках этих веток. Если системе контроля версий удаётся справить самостоятельно, то «мержи» происходят автоматически, это, в моей практике, наиболее частая ситуация. В противном случае возникает «конфликт» — «мерж» останавливается до разрешения конфликта человеком. Только человек может решить как будет выглядеть сводный код, учитывающий изменения, сделанные в двух слияемых ветках.

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

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

Через год попытались слить две ветки воедино и получили конфликты почти во всех основных файлах проекта. Ничего совсем уж неожиданного, конечно, особенно с учётом того, что часть кода была переписана с ПХП на «Твиг», но никогда в ещё в жизни я не видел столько конфликтов. Затронуты были, если мне не изменяет память, несколько сотен файлов.

С одной стороны, других вариантов, кроме как собрать это всё воедино, не рассматривалось, с другой стороны, объём предстоящей работы удручал.

В общем, погрустил я, погрустил, повесил табличку «Не беспокоить» и заперся в кабинете на неделю. Каждый файл с конфликтом распечатывал дважды — из каждой ветки. Потом раскладывал распечатанное на полу, выделял маркером одинаковые места, рисовал стрелками что куда переместилось, шёл к ноутбуку и так или иначе разрешал конфликт.

На фотографии — процесс разрешения конфликтов одного из файлов. Через неделю я был полностью разбит монотонностью работы, но ветки слил.

27 ноября   программирование

Как открыть файл в формате HLP

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

Возможно существует какой-то быстрый и приятный путь читать такие файлы, но мне на него выйти не удалось. Гуглёжка принесла не первой свежести утилиту winhelpcgi, которая просто так не скомпилировалась, пришлось разбираться и патчить:

diff --ignore-blank-lines --minimal -urd a/winhelpcgi/dib2png.c b/winhelpcgi/dib2png.c
--- winhelpcgi-1.0/winhelpcgi/dib2png.c	2004-06-15 11:38:40.000000000 +0400
+++ winhelpcgi-1.0-patched/winhelpcgi/dib2png.c	2018-11-03 13:59:03.405031382 +0300
@@ -85,7 +85,7 @@
   /* Set error handling.  REQUIRED if you aren't supplying your own
 	* error hadnling functions in the png_create_write_struct() call.
 	*/
-  if (setjmp(png_ptr->jmpbuf))
+  if (setjmp(png_jmpbuf(png_ptr)))
 	 {
       /* If we get here, we had a problem writing the file */
       png_destroy_write_struct(&png_ptr,  (png_infopp)NULL);
@@ -93,7 +93,7 @@
 	 }

   /* Set the I/O callback function to transfer directly to memory */
-  png_set_write_fn(png_ptr, (voidp) sbout, user_write_data, NULL);
+  png_set_write_fn(png_ptr, (png_voidp) sbout, user_write_data, NULL);

   /* Get access to the windows DIB data */
   lpbmi = (LPBITMAPINFOHEADER) GlobalLock(hDIB);

Утилита с грехом пополам преобразовала файл в нечитаемый ХТМЛ, который пришлось перекодировать:

/usr/local/bin/winhelpcgi.cgi --tar HELP.HLP |
php -r 'echo mb_convert_encoding(strtr(stream_get_contents(STDIN), ["\0"=>""]),
"CP1252", "HTML-ENTITIES");' > help.html

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

3 ноября   windows   программирование

Числа от «n» до нуля без сравнений

На «Хабре» интересную задачу увидел, требуется написать на Си программу, выводящую числа от «n» до нуля, не используя (скрыто или явно) операторы сравнения.

Мой вариант:

#include <stdlib.h>
#include <stdio.h>

void print(const int n) {
	printf("%d\n", n - 1);
}

int main(int argc, char* argv[])
{
	const int N = atoi(argv[argc - 1]);

	void (*f[])(int) = {print, exit};
	for (int n = -1;;n++) {
		f[~n/~N](N - n);
	}
}
31 октября   программирование   си

Слоны

Есть такая система репликации на триггерах для СУБД «Постгрес» — Slony, не знаю кто как читает это слово по всему миру, я всегда произносил его как «Сло́ни» — вслед за нашими системными администраторами.

Оказывается читать это слово следует немного иначе.

Примерно в конце девяностых на логотипе «Постгреса» появился слон, к этому логотипу, да и видимо вёрстке сайта, приложили руку россияне. Так картинка со слоном называлась «slonik.gif» и прислал её, как достоверно известно, петербуржец Дмитрий Самерсов, рисунок сделала какая-то его знакомая.

Тот самый логотип со слоном

Ян Вик, активный участник сообщества, в то время искал название для своей системы репликации и поинтересовался что значит «slonik», а потом спросил как будет много слонов, так и родилось название «Slony» — «Слоны́».

12 октября   postgres   история   программирование

mozjpeg 3.3.1

Заворачивал в пакет для седьмой ЦентОСи относительно свежий mozjpeg. В теории всё просто, на практике просто так пакет не собрался, пришлось корректировать руками. Запишу себе сюда, чтобы не забыть что делал.

Нужно отредактировать в двух местах файл mozjpeg.spec.in (ниже готовый патч под утилиту patch):

diff -urd --ignore-blank-lines --minimal a/release/mozjpeg.spec.in b/release/mozjpeg.spec.in
--- a/release/mozjpeg.spec.in	2017-07-10 13:58:14.000000000 +0300
+++ b/release/mozjpeg.spec.in	2018-10-12 12:30:04.172828265 +0300
@@ -8,7 +8,7 @@
 %define _datadir %{__datadir}

 # Path under which docs should be installed
-%define _docdir /usr/share/doc/%{name}-%{version}
+%define _docdir /opt/mozjpeg/doc/%{name}-%{version}

 # Path under which headers should be installed
 %define _includedir %{__includedir}
@@ -35,7 +35,7 @@
 Release: @BUILD@
 License: BSD-style
 BuildRoot: %{_blddir}/%{name}-buildroot-%{version}-%{release}
-Prereq: /sbin/ldconfig
+Requires(pre,preun): /sbin/ldconfig
 %ifarch x86_64
 Provides: %{name} = %{version}-%{release}, @PACKAGE_NAME@ = %{version}-%{release}, libturbojpeg.so()(64bit)
 %else

Дальше запустить:

autoreconf -fiv
./configure
make rpm

И получится пакет.

Предложил авторам утилиты правку на «Гитхабе», посмотрим примут ли.

Дополнение: ура, патч приняли в репозиторий, теперь можно не патчить самостоятельно.

12 октября   jpeg   программирование

Мелочь в синтаксисе SELECT

В синтаксисе запроса SELECT «Постгреса» есть приятная мелочь, которая хоть и нестандартна, но греет мне душу, — согласно описанию, выбираемые поля (часть между SELECT и FROM) можно опускать.

Вот как это работает в консоли:

SELECT FROM usr;
--
(588910 строк)

Кстати, можно ещё поставить там ключевое слово ALL, будет результат будет точно такой же.

Для чего это может пригодиться? Для подзапросов с EXISTS. Мне не нравится, как выглядит всем привычный вариант:

SELECT COUNT(*)
FROM document
WHERE EXISTS (
    SELECT NULL
    FROM document_n
    WHERE id = document.id
)

В подзапросе после SELECT по стандарту надо что-то указать, всё равно что, использоваться это не будет. Мне такая избыточность не по вкусу. А вот «Постгрес» позволяет ничего там не указывать:

SELECT COUNT(*)
FROM document
WHERE EXISTS (
    SELECT
    FROM document_n
    WHERE id = document.id
)

Смотрится как будто чуть почище. Знаю, многие ребята осуждают использование особенностей реализации эскуэля в конкретной СУБД, из-за возможных проблем с портированием на другие СУБД, но для нас это вряд ли проблема — в нашем продукте используется множество куда более сложных специфичных для «Постгреса» вещей.

Если когда-либо встанет вопрос о переезде на другую СУБД, то вышеописанное — самая малая из проблем и решить её просто — заменой через регулярное выражение.

2018   postgres   программирование
Ранее Ctrl + ↓