Закончил первую главу Языков и исчислений!
Добавил параграфы про полную систему связок и про схемы из функциональных элементов.
Новый текст начинается примерно отсюда https://nikalexxx.github.io/?/books/vereshagin-shen-firstord#page-50
Также добавил список литературы с автоматической нумерацией, также нумерацию получили таблицы и рисунки.
В этот раз я сначала прогонял свой наколеночный скрипт https://github.com/nikalexxx/nikalexxx.github.io/blob/master/data/books/text2bbm.js и уже потом подправлял руками.
Добавил импорты прямо в разметку, так удобно раскладывать по папкам и собирать всё в корне https://github.com/nikalexxx/nikalexxx.github.io/blob/master/data/books/data/vereshagin-shen-firstord/book.bbm
И глава стала выглядеть очень чисто, всего заголовок и три импорта параграфов.
Дальше буду обновлять сразу по главам, чтобы за 4 подхода закончить книгу (всего глав 5). Также полезные наработки стоит перенести в ядро движка разметки bbm. Ну и давно просится обновление сайта https://bookbox-format.github.io. Он кстати на solid.js, возможно стоит переписать на parvis
Добавил параграфы про полную систему связок и про схемы из функциональных элементов.
Новый текст начинается примерно отсюда https://nikalexxx.github.io/?/books/vereshagin-shen-firstord#page-50
Также добавил список литературы с автоматической нумерацией, также нумерацию получили таблицы и рисунки.
В этот раз я сначала прогонял свой наколеночный скрипт https://github.com/nikalexxx/nikalexxx.github.io/blob/master/data/books/text2bbm.js и уже потом подправлял руками.
Добавил импорты прямо в разметку, так удобно раскладывать по папкам и собирать всё в корне https://github.com/nikalexxx/nikalexxx.github.io/blob/master/data/books/data/vereshagin-shen-firstord/book.bbm
И глава стала выглядеть очень чисто, всего заголовок и три импорта параграфов.
Дальше буду обновлять сразу по главам, чтобы за 4 подхода закончить книгу (всего глав 5). Также полезные наработки стоит перенести в ядро движка разметки bbm. Ну и давно просится обновление сайта https://bookbox-format.github.io. Он кстати на solid.js, возможно стоит переписать на parvis
Прошёл финал чемпионата Яндекса по программированию.
В этот раз я делал задачи как для квалификационного этапа, так и для финала. К сожалению в этом году мою задачу снова никто не решил. Но в этот раз многие попытались.
Что самое забавное, решение можно было записать в 10 строк. Как только эта задача появится на coderun.yandex.ru, обязательно поделюсь)
Поздравляю победителей! И жду новых участников в следующем году
В этот раз я делал задачи как для квалификационного этапа, так и для финала. К сожалению в этом году мою задачу снова никто не решил. Но в этот раз многие попытались.
Что самое забавное, решение можно было записать в 10 строк. Как только эта задача появится на coderun.yandex.ru, обязательно поделюсь)
Поздравляю победителей! И жду новых участников в следующем году
Обновил parvis до версии 0.2.0🏃♂️
https://www.npmjs.com/package/parvis
parvis — фреймворк на virtual dom, позволяющий писать интерфейсы, используя привычный jsx и компонентный подход. Он поддерживает реактивное обновление стейта, хуки для методов жизненного цикла и поддержку ts. При этом очень мало весит.
В новой версии он больше не имеет внешних зависимостей (теперь их 0), и размер бандла также уменьшен на пару килобайт (esm с 21 до 19).
Начать очень легко, вся документация помещается в README. Пробуйте, несите фидбек, ставьте звёздочки и всё такое)
https://www.npmjs.com/package/parvis
parvis — фреймворк на virtual dom, позволяющий писать интерфейсы, используя привычный jsx и компонентный подход. Он поддерживает реактивное обновление стейта, хуки для методов жизненного цикла и поддержку ts. При этом очень мало весит.
В новой версии он больше не имеет внешних зависимостей (теперь их 0), и размер бандла также уменьшен на пару килобайт (esm с 21 до 19).
Начать очень легко, вся документация помещается в README. Пробуйте, несите фидбек, ставьте звёздочки и всё такое)
npm
npm: parvis
Light library for user interface. Latest version: 0.2.1, last published: 2 months ago. Start using parvis in your project by running `npm i parvis`. There are no other projects in the npm registry using parvis.
Прямо сейчас на мероприятии в честь людей, которые делают молодёжные программы, в том числе и для стажеров.
И как раз сегодня в мои команды вышел новый стажёр. Я всегда рад новым людям, мне нравится передавать опыт, поэтому я во всём этом и участвую, преподаю и занимаюсь стажировками.
Если вы или ваши знакомые хотят попасть на стажировку в Яндекс, приглашаю в инфраструктуру! Я сам начинал со стажировки, и с тех пор не пожалел. У нас теперь даже сайт есть infra.yandex.ru
Решите задачи в системе контеста и можете приходить на собеседования, всё действительно так просто. Ну и выбирайте фронтенд)
П.С. пост не проплачен и не является рекламой и финансовой рекомендацией
И как раз сегодня в мои команды вышел новый стажёр. Я всегда рад новым людям, мне нравится передавать опыт, поэтому я во всём этом и участвую, преподаю и занимаюсь стажировками.
Если вы или ваши знакомые хотят попасть на стажировку в Яндекс, приглашаю в инфраструктуру! Я сам начинал со стажировки, и с тех пор не пожалел. У нас теперь даже сайт есть infra.yandex.ru
Решите задачи в системе контеста и можете приходить на собеседования, всё действительно так просто. Ну и выбирайте фронтенд)
П.С. пост не проплачен и не является рекламой и финансовой рекомендацией
Добавил вторую главу "Исчисление высказываний" в книгу Верещагина и Шеня "Языки и исчисления".
Начинается отсюда https://nikalexxx.github.io/?/books/vereshagin-shen-firstord#page-194
С помощью скрипта все 4 секции удалось перевести с tex на bbm за 1 день.
Решил на этом не останавливаться и добавить новую функциональность. В html генераторе добавил возможность создавать любые меню справа, исходя из данных книги.
Для математических книг в первую очередь это навигация по теоремам 🎓. Можно быстро увидеть в одном списке все теоремы в книге и быстро перейте к нужной.
Так с каждой новой главой буду добавлять что-то новое и в сам книжный формат bookbox. Начать очень просто — https://bookbox-format.github.io/?path=quick-start
Пробуйте и вы, чтобы сделать книги в вебе доступнее и понятнее!
Начинается отсюда https://nikalexxx.github.io/?/books/vereshagin-shen-firstord#page-194
С помощью скрипта все 4 секции удалось перевести с tex на bbm за 1 день.
Решил на этом не останавливаться и добавить новую функциональность. В html генераторе добавил возможность создавать любые меню справа, исходя из данных книги.
Для математических книг в первую очередь это навигация по теоремам 🎓. Можно быстро увидеть в одном списке все теоремы в книге и быстро перейте к нужной.
Так с каждой новой главой буду добавлять что-то новое и в сам книжный формат bookbox. Начать очень просто — https://bookbox-format.github.io/?path=quick-start
Пробуйте и вы, чтобы сделать книги в вебе доступнее и понятнее!
В идеальном языке программирования не нужен while.
while допускает бесконечные циклы, но в реальных программах их быть не должно, мы хотим, чтобы программы завершались за конечное время (и вообще быстрее работали). На самом деле нам от while нужен не бесконечный цикл, а неопределенное количество итераций. Когда мы не знаем точное количество шагов, то пишем условие на выход из цикла. При этом само количество шагов конечно, просто неизвестно программисту. А что если известно 🤔?
Я утверждаю, что в подавляющем числе задач мы можем дать верхнюю оценку количества шагов ЗАРАНЕЕ ☝️.
Возьмём типичный пример — обход графа в глубину или в ширину. Мы точно знаем количество итераций, это количество нод. Поэтому вместо while и перемещения по указателям мы могли бы итерироваться по структуре нативно. Конечно, структуры должны это поддерживать, как например, это сделано для массивов во многих языках программирования.
А как же вычислимость по Тьюрингу? В прикладном программировании задач с неизвестным количеством итераций исчезающе мало. Однако я говорил только про синхронные вычисления. Ничто не мешает выделять асинхронно по 2^32 шагов в каждом новом асинхронном событии. Это на случай математических задач, а для промышленного 🚜 программирования хватает итерации по структурам.
Поздравляем, вы переизобрели функциональное программирование! Не совсем, ведь в нём есть рекурсия, а значит, можно пропустить условие выхода и упереться в стек вызовов. Тут уже хорошо, что вообще есть ограничение на длину этого стека. Чтобы этого избежать, самое простое решение — запретить рекурсию 🙅♀. Но это тоже довольно малый диапазон задач.
Итого, в идеальном языке программирования должен отсутствовать while ❌ и рекурсия ❌, и достаточно итерации ✅ по структурам.
while допускает бесконечные циклы, но в реальных программах их быть не должно, мы хотим, чтобы программы завершались за конечное время (и вообще быстрее работали). На самом деле нам от while нужен не бесконечный цикл, а неопределенное количество итераций. Когда мы не знаем точное количество шагов, то пишем условие на выход из цикла. При этом само количество шагов конечно, просто неизвестно программисту. А что если известно 🤔?
Я утверждаю, что в подавляющем числе задач мы можем дать верхнюю оценку количества шагов ЗАРАНЕЕ ☝️.
Возьмём типичный пример — обход графа в глубину или в ширину. Мы точно знаем количество итераций, это количество нод. Поэтому вместо while и перемещения по указателям мы могли бы итерироваться по структуре нативно. Конечно, структуры должны это поддерживать, как например, это сделано для массивов во многих языках программирования.
А как же вычислимость по Тьюрингу? В прикладном программировании задач с неизвестным количеством итераций исчезающе мало. Однако я говорил только про синхронные вычисления. Ничто не мешает выделять асинхронно по 2^32 шагов в каждом новом асинхронном событии. Это на случай математических задач, а для промышленного 🚜 программирования хватает итерации по структурам.
Поздравляем, вы переизобрели функциональное программирование! Не совсем, ведь в нём есть рекурсия, а значит, можно пропустить условие выхода и упереться в стек вызовов. Тут уже хорошо, что вообще есть ограничение на длину этого стека. Чтобы этого избежать, самое простое решение — запретить рекурсию 🙅♀. Но это тоже довольно малый диапазон задач.
Итого, в идеальном языке программирования должен отсутствовать while ❌ и рекурсия ❌, и достаточно итерации ✅ по структурам.
Самое время выложить фотографии с путешествия в Йошкар-Олу 30 ноября.
Центр города это безумная смесь датской набережной, копии башен московского кремля и дворянских деревянных домов. Больше всего мне понравился гигантский замок, который на самом деле является театром кукол, видимо в этом городе куклы очень влиятельны)
Мэр, который всё это построил, вроде как сидит за воровство. Не поделился к кукольным магнатами?
В целом город хороший, ламповый. Советую посетить хотя бы раз.
П.С. а ещё республика Марий Эл, столицей которой и является Йошкар-Ола, соединила в одну связанную область посещённые регионы центральной России и Урала. Теперь осталось исследовать больше восток страны.
Центр города это безумная смесь датской набережной, копии башен московского кремля и дворянских деревянных домов. Больше всего мне понравился гигантский замок, который на самом деле является театром кукол, видимо в этом городе куклы очень влиятельны)
Мэр, который всё это построил, вроде как сидит за воровство. Не поделился к кукольным магнатами?
В целом город хороший, ламповый. Советую посетить хотя бы раз.
П.С. а ещё республика Марий Эл, столицей которой и является Йошкар-Ола, соединила в одну связанную область посещённые регионы центральной России и Урала. Теперь осталось исследовать больше восток страны.
Немного про параметризацию сервисов proto 🌚
У меня в базе несколько типов объектов, фиксированное количество, их поля описаны в прото файлах. И есть метод get, который получает объект по его id. Что мы делаем в прото? Конечно, создаём
Проблема в том, что в прото нет ни параметризации (дженериков), ни наследования. Какие варианты?
Можно забить 🥴 и использовать
Есть другой путь, сделать несколько прото сервисов. Под каждый тип объекта будет сервис со своим методом
Действительно, так как все типы объектов известны заранее, то простой скрипт может сгенерировать нужный файл прото со всеми сервисами. Важно, что переиспользуемые части сервисов нужно вынести в отдельные поля, тогда не нужно будет парсить прото и имитировать наследование, а просто использовать импорт из файла с общими кусками.
Каюсь, что использовал
Забавно, что go генерирует прото, а потом
У меня в базе несколько типов объектов, фиксированное количество, их поля описаны в прото файлах. И есть метод get, который получает объект по его id. Что мы делаем в прото? Конечно, создаём
service
. Вот только мы хотим точно знать, какой объект вернется, например, в запросе передав тип объекта.Проблема в том, что в прото нет ни параметризации (дженериков), ни наследования. Какие варианты?
Можно забить 🥴 и использовать
bytes
, а уже в системе типов целевого языка правильно добавить типы (например через интерфейсы в go или дженерик типы в typescript). Это простой вариант, но работа перекладывается на целевые языки, причём работа механическая.Есть другой путь, сделать несколько прото сервисов. Под каждый тип объекта будет сервис со своим методом
rpc
Get, и соответственно в returns
можно указать правильные message
для нужного типа. Всё выглядит хорошо, но нужно писать много однообразного прото. Тут на помощь приходит кодогенерация 🤯Действительно, так как все типы объектов известны заранее, то простой скрипт может сгенерировать нужный файл прото со всеми сервисами. Важно, что переиспользуемые части сервисов нужно вынести в отдельные поля, тогда не нужно будет парсить прото и имитировать наследование, а просто использовать импорт из файла с общими кусками.
Каюсь, что использовал
go
для написания скрипта, просто много кода на go, и мне хочется набить руку в этом языке. Вот собственно сам скрипт (упрощён для понимания)
package main
import (
"fmt"
"os"
"strings"
)
var objects = []string{"A", "B", "C"}
// сопоставление имён типов объектов и их message
func createObjectMapMessage() string {
// ...
}
// генерация service c методами rpc
func createObjectService(name string) string {
// ...
}
func createAutogenProto() string {
services := []string{}
for _, name := range objects {
services = append(services, createObjectService(name))
}
// в service.proto лежат общие части для сообщений ответов
result := fmt.Sprintf(`syntax = "proto3";
import "service.proto";
%s
%s
`, createObjectMapMessage(), strings.Join(services, "\n"))
return result
}
func main() {
text := createAutogenProto()
os.WriteFile("autogen.proto", []byte(text), 0666)
}
Забавно, что go генерирует прото, а потом
protoc
из прото генерирует go код. Цикл замкнулся)Ещё в Питере перед новым годом закупился новой порцией книг, ищу свежую научную фантастику. Не люблю воздевать палец к небу и провозглашать, что Азимов, Лем и Дик были гениями, а все современные просто меркнут на их фоне. В прошлом году я рекомендовал трилогию Квантовый вор (Райаниеми), и авторы прошлого века просто не могли в своих произведениях применять научные знания нашего времени, например квантовые вычисления и вообще программирование продвинулись далеко.
На картинке коллаж, который я собрал за полчаса из суперобложек трёх книг. Все три книги вы можете найти по названиям. Сейчас я на середине одной из них, думаю напишу рецензию по прочтении. Не думаю, что когда-нибудь смогу составить общий топ научной фантастики, уж слишком отличаются эпохи даже в 20 веке, не говоря уже о нашем 21.
В таких книгах я люблю в первую очередь дух будущего. Ведь многое из того, что чудесного есть в них, законы физики разрешают, и осталось лишь догнать технологиям.
Ведь как известно, любая достаточно продвинутая технология неотличима от магии!
На картинке коллаж, который я собрал за полчаса из суперобложек трёх книг. Все три книги вы можете найти по названиям. Сейчас я на середине одной из них, думаю напишу рецензию по прочтении. Не думаю, что когда-нибудь смогу составить общий топ научной фантастики, уж слишком отличаются эпохи даже в 20 веке, не говоря уже о нашем 21.
В таких книгах я люблю в первую очередь дух будущего. Ведь многое из того, что чудесного есть в них, законы физики разрешают, и осталось лишь догнать технологиям.
Ведь как известно, любая достаточно продвинутая технология неотличима от магии!