Походное кресло
Коллеги ещё в сентябре, на день рождения подарили шикарное походное кресло. Я тогда активно ездил с ночёвкой с друзьями на острова, фактически необитаемые. Естественно, удобств там не было, а с собой мы брали самый минимум, но про раскладные стулья не забывали. Любоваться, когда стемнело, около костра на воду, сидя на стульях — бесценно.
Правда у нас их было два на троих, так как своего у меня не было. Так что коллеги с подарком угадали.
Думаю, подразумевалось, что подарок я буду использовать в походных условиях. К сожалению, по разным причинам мы с ночёвкой больше не ездили, а потом похолодало.
Конечно в следующем году будут ещё походы, но кресло мне пригодилось гораздо скорее. У дочки тут
Как я быстро убедился, присесть на таких мероприятиях обычно некуда, разве что на пол, поэтому стал брать с собой кресло. Тем более в его карманы можно положить термос свысока снизу вверх, довольно похлёбывая горяченькое.
Нечётные числа: uint32_t
В программе есть место жёстко завязанное на тип, — печать числа, а мне хотелось сделать так, чтобы при смене типа ничего не ломалось. Поэтому я решить попробовать обобщённое программирование. Его в Си мне использовать ещё не приходилось, вот и выпал случай.
Заодно попробовал в действии функции __builtin_*_overflow, позволяющие использовать математику с контролем переполнения. Я только недавно задумался о том, что они должны бы быть в языке, а до этого переполнение я проверял дедовским способом — смотрел не стал ли результат меньше аргумента.
Обобщённое программирование выглядит следующим образом:
#define PRINT_U(x) ({ \
_Generic((x), \
uint128_t: printf_u128, \
uint64_t: printf_u64, \
uint32_t: printf_u32 \
); \
})(x)Тут у меня макрос PRINT_U зависит от типа аргумента, а выбор делается при помощи стандартной конструкции _Generic — она принимает аргумент и, в зависимости от того выражение какого типа было передано, возвращает одно значение из указанного списка.
static void printf_u128(const uint128_t v) {
unsigned long long low, high;
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
low = MASK64(v);
high = MASK64(v >> 64);
#else
high = MASK64(v);
low = MASK64(v >> 64);
#endif
printf("0x%016llX%016llX\n", high, low);
fflush(stdout);
}
static inline void printf_u64(const unsigned long long v) {
printf("0x%016llX\n", v);
fflush(stdout);
}
static inline void printf_u32(const unsigned int v) {
printf("0x%08X\n", v);
fflush(stdout);
}Пока отлаживал, нашёл пару досадных багов в исходной программе. Получается, зря мой ноутбук трудился, результат всё равно можно было бы выкинуть.
Функции переполнения у меня используются вот так:
#define MUL2_ADD1(x) ({ \
typeof(x) y; \
__builtin_mul_overflow(x, 2, &y) || __builtin_add_overflow(y, 1, &y) ? 0 : y; \
})Были сомнения будут ли они работать
Любопытно, что мой ноутбук на процессоре M3 Max справился с перебором за 57 минут, тогда как компьютер с Intel Core
В результате нашлось 14434686 значений, из них нечётных подряд — 172 значения, потом появляются «дырки».
Нечётные числа: прогресс
Пока по поиску нечётных чисел прогресс такой. Программа работает уже чуть больше 25 часов. Самое большое найденное на этот момент число — 340281726619687019118949463859138658303 или 0xFFFFE06E43129C9EBA1E335BA7FFFFFF в шестнадцатеричном виде. Как мы видим, предел точности близок.
Всего пока найдено 36,5 миллионов чисел, список чисел занимает 1,2 гигабайта.
Добавлено:
Добавлено:
Добавлено:
Добавлено: 63 часа работы, найдено 57,3 миллиона чисел, новое самое большое число — 0xFFFFE0EC9B9F17FFFFFFFFFFFFFFFFFF или 340281736629840009040727513758703812607.
Нечётные числа
Что же я там считаю такое, что мне понадобились
Коллега в офисе, который
Формулировка у неё была очень простая.
Дано множество X. Единица принадлежит X. Если 3×x принадлежит X, то и x принадлежит X. Если x принадлежит X, то и 2×x + 1 принадлежит X. При этом x — натуральное, разумеется.
Требуется доказать, что таким образом можно получить множество всех натуральных нечётных чисел. Авторы статьи, кстати, были убеждены, что найти доказательство у читателей не получится.
Упомянутый коллега у себя в университете при помощи студента, Фортрана и Пролога пытался проверить эту теорему по следующему алгоритму.
Берём число, например, «9». Оно могло быть получено, согласно перечисленным утверждениям, двумя путями: либо
В этой задаче очень быстро растёт разрядность, поэтому в те времена рассчитать даже первую сотню чисел было достаточно проблематично.
В общем, я решил с этой задачкой побаловаться.
Для начала написал программу, которая вычисляет эти числа перебором. Начинаем, понятное дело, с единицы, следующее число получаем по формуле 2×x + 1, потом, пока число делится на три, делим и выводим эти числа, считая для каждого ещё и 2×x + 1 и так далее. Кроме того, пришлось ещё запоминать все найденные числа, чтобы избегать циклов.
Первую версию я написал с использованием рекурсии, но программа падала примерно через полторы минуты работы — стек просто кончался. Пришлось переписать. Новая версия работает уже несколько часов на моём ноутбуке и вычислила за это время уже почти 17 миллионов чисел. Оставлю её на ночь, интересно, закончит ли она к утру.
128-битный тип в Си
В одной из программ на Си мне понадобился
Мой компилятор _BitInt(128) прекрасно поддерживает, казалось — счастье так близко, но…
Каково же было моё удивление и разочарование, когда оказалось, что в языке нет ни способа вывести его на экран (у printf нет необходимого спецификатора формата), ни способа задать константу такого размера!
( (_BitInt(128) ) 0xFFFFFFFFFFFFFFFF << 64) | 0xFFFFFFFFFFFFFFFF
Батарейки CR2032 ★
Я, как и многие, наверное, подозревал, что с плоскими батарейками
А тут недавно в одном из каналов попалась ссылка на тестрирование батарей CR2032. У меня на картинке лишь вершина айсберга, загляните сами — разница между лидером и аутсайдером в 11 раз! Что, кстати, неплохо укладывается в мои ощущения в год и месяц работы.
Что расстраивает, батарейки известных брендов, согласно этому сравнению, работают средне. Надеюсь дело в том, что их не стесняются подделывать.
Из хорошего. Приятно удивили батарейки «Фотон» — они на втором месте, что тоже логично — подделывать местный бренд опаснее. Буду теперь, пожалуй, покупать именно их.
7000 и кафе ★
Формально эта заметка — семитысячная на этом сайте. Формально, потому что некоторые посты я пишу задним числом, копируя их из «Дневников жизни», которые я вёл с 1989 года
Тем не менее, это знаковое число и я, по подсказке одного из читателей, планировал написать её
К сожалению, я заболел и с задачей не справился — список пока находится в зачаточном состоянии. Был выбор — не писать
Честно говоря, я планировал выбрать первый вариант, но вчера случилось событие о котором невозможно молчать, — мы с ещё двумя друзьями подписали договор, условия которого обсуждали почти месяц. В скором времени мы будем открывать кафе, даже два — одну точку в виде киоска недалеко от одной из центральных улиц Казани и ещё одну на фудкорте строящегося торгового центра.
По мере успеха предприятия, буду сюда об этом писать, пока же вперёд забегать не буду — помимо подписи на трёх экземплярах договора мной пока ничего не сделано.
PowerShoot
Ну
Играть, правда, получится только на «МакБуке». Думаю, несложно будет адаптировать игру под терминал любой операционной системы, было бы желание.
Геймплей простой — на вас бегут враги, надо убивать их бомбами. Игрок бросает бомбу, когда «МакБук» подключается к зарядке. Чтобы бросить две бомбы, надо подключить его, потом отключить, потом снова подключить.
Врагов больше двух не бывает, но сложность в том, что игра реагирует на подключение зарядки с задержкой. Кроме того, можно в теории убиться собственной бомбой — пространство зациклено.
Добавлено: как справедливо заметил один из читателей, такие действия могут влиять на оставшееся количество циклов зарядки батареи ноутбука, но прошу не относиться к этой игре серьёзно, она, конечно же, сделана была в шутку, чтобы развеяться.
Заболел
Заболел я
Полежу до конца недели дома, надеюсь быстро поправлюсь.
Шахматы: разобрали мат ладьёй
В качестве работы над ошибками, совершёнными в прошлый раз в турнире по шахматам, разобрали с дочкой мат ладьёй. Посмотрели два способа — длинный, где король ставится в оппозицию и покороче, «квадратный».
Первый даже сыграли пару раз, второй не стали, только разобрали — дочка была уставшая, после занятия с репетиторами по русскому и по гитаре, так что я не стал настаивать.
Плюс она сыграла одну партию с ботом. Странно, но через интернет с живыми людьми ей играть не хочется. Непонятно почему, то ли есть
Попробуем в этот раз готовиться к турниру, а не просто в нём участвовать. Плюс я сделал
Пальцы Ёлки: контраргументы
Всем читателям большое спасибо за великолепную дискуссию по поводу длины пальцев Ёлки, я получил удовольствие. Пост вызвал довольно заметное оживление, породив по всем площадкам совокупно более десятка комментариев. Вроде это и немного, но по сравнению с обычной реакцией — небывалый всплеск.
Мне особенно понравилось, что дискуссия была не голословная, некоторые читатели заморочились — поискали другие картинки или изготовили доказательный материал самостоятельно. Прямо здорово.
Напоминает
Приходится признать — по всей видимости, это не брак, вышедший
Casio WQV-3 и виртуалка
Ура! Дело было не в бобине!
Хорошо, что купил тогда на всякий случай ещё и второе устройство.
Это инфракрасный приёмопередатчик компании SigmaTel. При подключении «Виндоуз» его сразу узнала и радостно поставила драйвер
Пальцы Ёлки
Мне сложно поверить, но, видимо, так оно и есть — большинство людей, похоже, вообще не замечает, что с картинками, которые сейчас генерируют нейросети,
Сегодня, пока ехали из Елабуги, на экран автомобиля аудиоплеер вывел обложку альбома певицы Ёлки «Точки расставлены». Я её обычно не слушаю, поэтому и обложку эту вижу в первый раз. Сразу бросилось в глаза, что с рукой на переднем плане
Судя по информации в «Википедии», это альбом
Продолжение турнира по шахматам у дочки
Сегодня у дочки были следующие четыре тура по шахматам. В прошлый раз было всего два. Такой перекос — следствие плохой организации. В первый день было столпотворение, потеряли час, поэтому игру сократили.
Тут надо сказать, что турнир организовывала школа, поэтому, естественно, о нём нам стало известно буквально за день до начала. Это было ещё в прошлые выходные и в тот раз всё сложилось удачно — у дочки на тот же день было запланировано выступление на пони и оно, к счастью, разошлось по времени с шахматами.
В эти выходные у нас в планах была туристическая поездка в Елабугу, причём там был оплачен отель по невозвратному тарифу. Поэтому мы съездили, но сегодня встали в шесть утра, чтобы успеть к началу следующих туров.
Первую игру она выиграла, взяв противника измором. У него оставался король, а у Евы король и ладья. Как с их помощью поставить мат она не знала, поэтому просто гоняла его по доске, пока тот не устал настолько, что
К сожалению, сама она на той доске тоже оставила много сил, да и следующий противник оказался слишком сильным, проиграла быстро. Расстроилась, конечно, одно наложилось на другое и в следующей партии упустила шанс сыграть ничью. Расстроилась ещё больше и к четвёртому туру была уже совершенно никакая — голова болит, мораль на нуле.
Без особой надежды я уговорил попробовать доиграть и предложил сдаться, если окажется, что партия ей не по силам. Она посидела буквально несколько минут, поняла, что сил нет и подставилась под мат.
Четыре тура — это
Прошлое: Дни Интернета в Казани ★
Вчера встретил в кафе нашего офисного центра своего друга А. Х., который общался
А. Х. попросил меня помочь, но сначала мне пришлось отказаться — меня ждали на встрече. Позже выяснилось, что встречу передвинули и у меня есть минут 15—20, чтобы спринтом пробежаться по памяти
События очень давние, поэтому вспомнить удалось не так много как хотелось бы, но зато в памяти всплыл один забавный случай, про который я нигде не писал. Журналисткам он не подошёл по тематике, поделюсь здесь.
В конце девяностых—начале двухтысячных в Казани проводились Дни Интернета. Событие, насколько я помню, должно было стать ежегодным, но не стало. Его провели не менее двух раз
В интернете об этом упоминаний не сохранилось,
Я был на двух «Днях». Один из них проводил на свои деньги известный тогда в казанском интернете деятель Daddy Hab, а второй, если мне не изменяет память, провайдер
Кажется оба раза это было в зале НКЦ «Казань», но что там конкретно было, я уже и не помню. Вероятно, просто тусовка с алкоголем. Но что я помню хорошо, что перед одним из этих событий в качестве приглашённого гостя был анонсирован Артемий Лебедев, в те годы — абсолютная суперзвезда в интернете.
На беду организаторов я тогда с ним активно переписывался, поэтому не постеснялся узнать правда ли его пригласили. Он сказал, что в первый раз об этом слышит и я, для смеха, выслал ему фотографию флайера с его именем. К сожалению, электронная почта того времени работала иногда из рук вон плохо и файл с картинкой никак до него не доходил. На третьей попытке я его сконвертировал, для надёжности, в несколько форматов и выложил на свой сайт ссылками, которые и отослал ему в письме.
Как пошутил А. Х., я делился файлами через облако до того как это стало модным.
Разумеется я не помнил этого в таких подробностях, но вчера написал Артемию, в надежде, что у него осталось это письмо и не обманулся — он мне его переслал, после чего эта история проступила в памяти более ясно.
Организаторы так и не признались, что не стали приглашать Лебедева и на самом событии интригу тянули до последнего. Я бродил в толпе и вносил смуту среди своих знакомых, но и у меня, думаю, теплилась надежда.
К сожалению, чуда не случилось. В итоге
UTM и Casio WQV-3
Окрылённый успехом с часами Casio
Но,
В общем, решил дать шанс. Скорость работы оказалась отличной, ничего не тормозит и не зависает, а вот с часами — фиаско. Не работает. Сначала показалось, что дело в батарейке —
Батарейку я заменил, но ситуацию это не изменило — приложение после запуска сообщает, что часы оно не обнаружило. Грешу теперь на урезанный дистрибутив. Попробую найти и поставить полный. Если и тут меня будет ждать неуспех, придётся купить
Bash HTTPd
У писателя Леонида Каганова, который в последние годы ушёл в айти, началась
Я ему сегодня утром пытался хоть
В процессе там понадобился
Обошлись
В общем, мне стало
В процессе код стал занимать меньше места (моя минифицированная версия на 25 байт короче), научился обрабатывать имена, содержащие пробелы и национальные символы и заработал не только под «Линуксом», но и под «Макосью».
Лица
Очень смешной мем нашёл! Ведь все знают, что первое лицо — это «я», а «вы» — это второе. Наоборот же всё! Кого они этим обмануть хотят?
Тип «‟char”»
Недавно я узнал, что, кроме text, varchar и char, в Постгресе есть ещё и строковый тип "char", именно так, в кавычках. Используется во внутренних таблицах Постгреса для простого перечисления. Интересен тем, что занимает ровно один байт, в отличие от более известных типов, которые во внутреннем представлении хранят ещё и свою длину, поэтому всегда занимают больше.
Использования его в своих таблицах, наверное, лучше избегать, но знать про него интересно. Кстати, есть ещё и тип name, который всегда занимает 64 байта и используется для хранения имён объектов, но, как по мне, он не такой интересный.
Снимки с Casio WQV-3
Боже мой, я прямо не верю! Успешно удалось переписать фотографии с часов! Спасибо одному из читателей, который
В итоге, чтобы переписывать снимки с этих часов, необходимо следующее:
- собственно часы;
- программа Casio WQV Link 2;
- компьютер или виртуалка с ОС, на которую эта программа поставится; я ставил Windows XP;
- адаптер IrDA, на которые надо найти драйвера; на мой Ark3116T (PCIID: 18EC 3118) драйвера нашлись.
Подсоединяем адаптер IrDA к компьютеру, запускаем Casio WQV Link 2, открываем там контрольную панель, кнопкой сверху выбираем папку, в которую будут сохраняться картинки, кладём часы напротив адаптера, запускаем там передачу (Select → Select → IR Beam), нажимаем в контрольной панели «Save All».
После этого снимки можно посмотреть в указанной папке.