TeleBolkNote
184 subscribers
1.46K photos
4 videos
1.6K links
Моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь, большие языковые модели и программирование. Совпадает с сайтом bolknote.ru
Download Telegram
Дочка и домашка

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

Сделала всё обязательное, а так как до сна ещё оставалась какое-то время, решила сделать и задачку со звёздочкой. Я подсел ближе — стало интересно как она с ней справится.

Задание следующее: в 2021 году сумма цифр была 5, надо сказать через какое наименьшее число лет повторится такая же сумма тех же цифр, какой это будет год.

Решила, на мой взгляд, вполне эффективно — сначала выписала все варианты на первые две позиции — «10», «12», «20», «21», «22». Потом вычеркнула оттуда «10» и «12», потому что год получался в прошлом, следом убрала 20, где оба варианта не подошли, потом взяла «21», где взяла минимальный год из «2102» и «2120» и таким образом нашла правильный ответ.

Я, кстати, тоже никакого способа, кроме перебора, больше не знаю. На всякий случай перепроверил ответ на Пайтоне:

from itertools import permutations
print(min(x for x in (int(''.join(x)) for x in permutations('2021')) if x > 2021)) # 2102
🔥2
«Виола» и безопасность

Когда я только начинал заниматься восстановлением браузера «Виола», меня поразило как много он себе позволяет делать в системе. Если бы браузер с такими возможностями и с полным отсутствием защиты от несанкционированного их применения дожил до конца девяностых, хакеры бы от его репутации камня на камне не оставили.

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

В 1995-м году, когда вышла последняя версия браузера, защита уже была необходима и, как оказалось, автор «Виолы» это тоже понимал. В частности в тринадцатой главе своей недописанной книги, он пишет:

At this point you’re probably thinking how great this this, but how do I know that the applets I run won’t delete my files, smuggle info out of my system, and do other mischiffs?

The answer is that these imported objects can’t (or shouldn’t be able to).

The current security policy is pretty straightforward and somewhat limiting for the objects. It basically goes this way: all imported objects are marked as untrusted, and as such these imported objects have no system priviledges, have no access to sub interpreters, and can not coarse other objects to execute scripts arbitrarily.


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

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

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

↓↓↓↓
↑↑↑↑

Из защищённого режима браузер переключается в режим без защиты только с разрешения пользователя, переключение инициируется, если во время интерпретации скрипта встречается вызов, требующий переключения в доверенный режим (например, работа с файловой системой или открытие сокета), а так же, если на странице установлен тег SECURITY с атрибутом LEVEL=0.

Оказывается, автор браузера предосмотрел такой тег, но не успел реализовать. Название атрибута в коде уже было, а вот его значение — это моё обоснованное предположение. В коде есть центральный флаг securityMode, принимающий два значения — 0 (система безопасности отключена) и 1. Я предположил, что атрибут LEVEL должен влиять на значение этой переменной.

Если пользователь не согласился на переход в доверенный режим, вызов, запросивший повышение привилегий, завершается с нефатальной ошибкой — там, где можно вернуть флаг того, что произошла ошибка, я это делаю. Как только браузер встретит следующий такой вызов, он опять попросит разрешения сменить режим. Тут, опять же, слабое место, — можно заспамить пользователя такими запросами. Собственно, эта проблема была в любом браузере девяностых годов.

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

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

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

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

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

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

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

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

Кажется, что в этом много возни, но мне, если честно, даже нравится сам процесс. Не то, чтобы я сделал бы это своим хобби, но раз в год разрезать секатором две ёлки — приятная физическая нагрузка, рекомендую.
👍4
«Мы — Легион. Мы — Боб»

Как-то делился с женой, что иногда очень хочется, чтобы попалась к чтению какая-то книга, в которой у главного героя всё хорошо. Нужно, конечно, чтобы появлялись какие-то проблемы, а то, наверное, совсем неинтересно было бы читать, но он их как-то очень легко решал и двигался дальше. Честно, иногда так задолбаешься с проблемами на работе и в жизни, хочется, чтобы хотя бы в книге всё было просто.

Похоже книга «Мы — Легион. Мы — Боб» Денниса Тейлора как раз из таких. Не скажу, что у Боба, главного героя проблемы незначительные, но решаются они без особых сложностей, да и сильных, долговременных эмоций он по этому поводу не испытывает.

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

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

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

Но, в целом, я думал, что фильм должен был неплохо состариться за 45 лет, что ему будет-то? Приключения и приключения.

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

Можно подумать, что фильм совсем детский и дети на такое внимание не обращают, но даже дочка отметила как нелепо они прячутся.

Фильм мы досмотрели, несмотря на все недостатки, скучать не приходилось, но пересматривать я его уже точно никогда не буду.
😭2😁1
Прототипирование и ИИ

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

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

А на днях я подумал — почему бы не попробовать сделать прототип (срезав кое-какие острые углы, разумеется) при помощи ИИ? Выделил на это несколько рабочих часов, заперся в переговорки с дизайнерам и аналитиками и мы попробовали.

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

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

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

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

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

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

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


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

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

Во-вторых, это чисто интерфейсный прототип без учёты взаимодействия с сервером. Тут никак не учтены очень важные детали, которые необходимо положить в фундамент архитектуры, чтобы потом всё не переделывать.

В-третьих, этот код никак не учитывает архитектуру остального проекта, написан он с «чистого листа», совершенно изолированно, соответственно, при попытке его интегрировать его придётся серьёзно переделывать.

В-четвёртых, мы опасаемся утечек нашего кода в чужие облака. Что там делать с ним будут — неизвестно.
👍3
«Ollee Watch»

Приехала моя прелесть, ехавшая ко мне через Китай из Нидерландов. Эта штука похожа на «The Sensor Watch» — тоже вставляется внутрь корпуса часов «Касио», но возможностей у неё куда больше, — например, в ней есть шагомер и она умеет соединяться со смартфоном через «Блютуз».

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

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

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

Уже после обеда, решив зафиксировать, всё-таки, достигнутый результат, я создал репозиторий через git init, добавил в него все файлы через git add -A, но сообразил, что в туда попадёт слишком много мусора и решил сначала «прибраться».

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

Минуту, наверное, я ошарашенно смотрел на дело рук моих, но потом вспомнил, что когда-то читал про git и его временные файлы, которые он не сразу уничтожает. И я подумал, что возможно вся проделанная работа может лежать в одном из таких временных файлов, созданный после запуска git add -A.

В том же редакторе, где вайбкодил, — в «Курсоре», спросил у нейросети нельзя ли как-то восстановить стёртое и я оказался прав — нейросеть мне всё восстановила!

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

Увидел в интернете интересный эксперимент — визуализацию звука при помощи лазерной указки. Решил попробовать повторить для дочки.

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

В середину поверхности шарика наклеиваем что-нибудь лёгкое и светоображающее. Зеркало не подойдёт, оно слишком тяжёлое. В оригинале закрепляли кусочек компакт-диска, но у нас дома их нет, поэтому я взял блёстку от ёлочного серпантина.

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

В итоге лазер начинает рисовать на стене разнообразные пятна в такт музыке или речи, очень интересно смотрится.
🔥8👍2
Силиконовый брат

Вроде Доли́ну, которая Кремниевая, уже мало кто называет «Силиконовой» (путаница произошла из-за того что слово «кремний» по-английски будет «silicon»), так может и Старшего Брата (Big Brother) сможем научиться не называть «Большим Братом»?
😢2
Год с «Дуолинго»

Как-то незаметно прошёл год, как я занимаюсь английским с «Дуолинго». Хотелось бы сказать, что я заметил как вырос мой уровень, но на самом деле я не могу с уверенностью сказать так это или нет. Хотя задания в приложении за этот год стали сложнее, у меня всё же нет ощущения, что я как-то заметно прокачался, в том смысле что ни к какому новому качеству в моей жизни это не привело.

Книги по-английски не читаю, видео на английском не смотрю. Я пытался подобрать какой-нибудь регулярный видеоконтент мне по силам, но всё что мне интересно явно выше моего уровня.

Правда купил пару книг на английском и, думаю, я вполне способен прочесть их целиком без словаря, но пока как-то не приступлю — увлекла серия книг про Боба, пока не дочитаю, ни на что другие отвлекаться не хочется.

В общем, спустя год похвастаться мне особо нечем, но всё равно буду заниматься дальше, — ощущения, что я впустую трачу время у меня тоже нет. Думаю польза есть, просто год по пятнадцать минут в день — это мало.
👍41🤡1
Cardputer ADV + «мышастик»

Как говорится, когда у тебя в руке молоток, всё вокруг превращается в гвозди. Бог знает зачем купил модуль «мышастика» к «Кардпьютеру». Даже не уверен, что буду использовать его в качестве узла связи, наверное просто хотелось посмотреть какими ещё возможностями обладает это устройство, тем более, что модуль стоил недорого.

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

Получается с «Кардпьютером» у нас теперь пять нод — две стационарные ретрансляционные на окнах квартиры, плюс ещё три — носимые.
🔥5
«Our Red Army Ally»

Читал на днях брошюру «Our Red Army Ally» («Наш Союзник — Красная Армия»), которая была выпущена весной 1945 года американцами, чтобы объяснить бойцам что из себя представляет союзная Красная Армия и как себя вести при встрече с красноармейцами.

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

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

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

В холодную погоду неразбавленная водка с кусочком селёдки на чёрном хлебе помогает согреть желудок красноармейца.


В общем, очень интересное чтиво на самом-то деле и написано хорошо.

Одно мне непонятно — почему так плохо нарисован Ленин на Ордене Ленина? Скорее похоже на профиль Полифема в костюме. При этом детализация остальных рисунков нареканий не вызывает. Очень странно.
Слово денисовца

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

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

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

Есть ещё вариант найти какую-то чёткую разницу между языками народов, у которых есть вклад денисовцев в ДНК и тех, у кого его нету, но за давностью истории это вполне может быть и просто случайностью, которая возникла по другим причинам.
🤔1
«Виола», формулы и стилизация

Долго же я прикидывал правда ли автор «Виолы» задумывал, чтобы математические формулы у него выводились на красном фоне. С одной стороны в коде именно так, да и мне это кажется даже в чём-то логичным, с другой стороны комментарий одного из читателей посеял во мне сомнения.

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

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

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

Вот, кстати, как выглядело недописанное место, где можно подсмотреть что планировалось сделать:


tagPtr = STG_tagPtr("MATH");
i = STG_attr(tagPtr, "BGColor");
if (i) set("BGColor", i);
i = STG_attr(tagPtr, "FGColor");
if (i) set("FGColor", i);
i = STG_attr(tagPtr, "BDColor");
if (i) set("BDColor", i);


А то некоторые читатели недоумевают, наверное, откуда я вообще знаю что задумывал автор.

Нередко такие места содержат в себе достаточно понятные намёки на то как это было задумано, в других же случаях помогают комментарии, главы из недописанной книги автора или его редкие письма в различные группы рассылок, куда он редкий раз писал свои мысли в самом начале 90-х.
Собрал «Ollee Watch»

Что-то меня увлекла идея переделанных «Касио» — вторые такие часы себе уже приобрёл. Думаю, меня привлекает возможность вложить туда немного личного — хоть это и довольно просто, но их приходится собирать самостоятельно, плюс для первых своих таких часов — «The Sensor Watch» я даже написал свою игру. Кроме того, сама идея такого апгрейда довольно обычных наручных часов очень гиковская, мне такое нравится.

Правда вторые часы, «Ollee Watch» ощущаются чуть менее гиковскими, чем предыдущие и похожи на что-то, что могла выпустить какая-нибудь большая компания. Та же «Касио», например. У них, в отличие от «The Sensor Watch», есть приложение для смартфона, с которым они умеют соединяться через блютуз, NFC (я пока не разобрался зачем) и шагомер.

Шагомер — пока наиболее интересная для тут меня штука, я когда-то решил нахаживать не менее 10 тысяч шагов в день и выполнял норму, пока мог контролировать её на часах. Но с тех пор, как я приобрёл «The Sensor Watch», ношу, в основном, только их и вся эта история с шагами ушла на задний план — следить перестал, а надо бы, я думаю.

Мои новые часы показывают, что я сегодня прошёл 196 шагов и выполнил свою норму на ноль процентов ↓↓
Джойстик для «Кардпьютера»

Блин, ничего не понимаю. Чтобы было удобнее играть в эмуляторе в игры на «Кардпьютере» мне нужен вот такой джойстик, как у меня на картинке. Другие модели не подходят. Называется он Joystick2 и доступен для заказа везде — на «Озоне», «Алиэкспрессе» и так далее.

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

Окей, я верю, нет, не выпускается, но почему, товарищи продавцы, после отмена заказа вы не закрываете позицию в своих магазинах, а продолжаете продавать товар, которого у вас нет? Я проверил карточки всех товаров, за которые мне вернули деньги — ни один продавец не снял этот джойстик с продажи.
PHP: (unset) и (void)

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

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

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

Я хочу поворчать на одну из таких мелких тем.

В ПХП с незапамятных времён была конструкция (unset), которая приводила любой тип к NULL. Не самое очевидное название, поэтому, наверное, и применял её мало кто — не всем очевидно чем она могла бы быть полезна.

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


class Smth
{
private function saveSmth($stat)
{
// тут какие-то действия
// прошло успешно, но выше где-то может быть и false
return true;
}

public function doSmth($action, $stat)
{
// тут какой-то код
// результат вызова метода ниже мы игнорируем
(unset) $this->saveSmth($stat);
return true;
}
}


Мне казалось и до сих пор кажется, что это полезный паттерн. В «Гоу», например, в этом случае нужно присвоить возвращаемое значение специальной переменной _, иначе компилятор ругается.

И вот, много лет назад, в версии 7.2 использование (unset) в коде стало вызывать предупреждение об устаревшей конструкции. Я тогда попытался как-то повлиять на это, но не осилил пробиться к людям принимающим решение и махнул рукой. Позже в версии 8.0 конструкцию убрали вовсе и много лет не в языке было хорошего способа делать то же самое.

А в версии 8.5 внезапно та же идея возвращается под новым именем, только теперь нужно писать (void), а не (unset).

Да, имя более логичное, да функционал расширен — появился ещё и новый атрибут, да синтаксис изменён — результат (unset) можно было чем-то присвоить, с (void) так поступать нельзя. Но почему столько лет назад выплеснули с водой ребёнка и вообще никак не смотрели в эту сторону?
2👍2
PHP: (binary)

И, чтобы, как говорится «два раза не вставать», расскажу про самую бесполезную конструкцию в ПХП. Я знаю, что не так много народу знают про (unset), про которую я ворчал вчера, а про эту вещицу, как мне кажется, знает ещё меньше программистов на ПХП.

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

Какое-то время назад с этим пытались что-то сделать — в шестой, так и не вышедшей версии ПХП строки решили разделить на два типа — binary, это однобайтовые строки, которые остались в языке до сих пор и string — строки с Юникодом.

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

Но некоторые отголоски этой не совершившейся революции всё-таки можно обнаружить и в современных версиях ПХП.

В версии 8.5 по сих пор есть преобразование типа (binary), которое является алиасом к (string), но выдаёт предупреждение об устаревшей конструкции. А кроме этого, у строки есть префикс b: b"string", придуманный для того, чтобы создавать в ПХП6 однобайтовые строки. В современных версиях ПХП он, разумеется, ничего со строкой не делает.

И эту всю красоту из языка почему-то не удалили, а от (unset) избавились. Никакой логики.
1👍1
Фотография как источник

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

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

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

Если же попробовать изучить, например, мою жизнь по фото на моём сайте, не факт, что мелкие детали на фотографиях соответствуют моменту и месту съёмки — у меня много лет нет ни одной необработанной, так или иначе, нейросетями фотографии.

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

Как пример, фотография ниже, сделанная изнутри здания казанского айти-парка. Сравните мою фотку (думаю легко понять где она) и результат обработки нейросетями.

Понятно, что информацию о тех участках, которые заслонены металлическими конструкциям, взять неоткуда, нейросеть там нарисовала отсебятину, пусть и достоверную. Если туда попали какие-то важные детали, то они только по случайности совпадут с реальностью.
👍4