Forwarded from Zhovner Hub
Алло, мы ищем таланты. Хотите поучаствовать в разработке флиппера? Вам сюда.
Пожалуйста пошарьте этот пост в своих технических сообществах, нам это очень поможет.
https://habr.com/ru/post/514326/
Пожалуйста пошарьте этот пост в своих технических сообществах, нам это очень поможет.
https://habr.com/ru/post/514326/
Хабр
Flipper Zero — давайте пилить вместе. Приглашаем разработчиков
Flipper Zero — проект карманного мультитула для хакеров в формфакторе тамагочи, который я разрабатываю с друзьями. Предыдущие посты [1],[2],[3],[4] За первые...
"3d Printing a $10.000 Camera Arm"
https://youtu.be/V9e9ZWflCQU
https://youtu.be/V9e9ZWflCQU
YouTube
3d Printing a $10,000 Camera Arm
Professional Camera arms are crazy expensive! So I decided to build one, using 3d printing and a bunch of easy to come by parts.
All the 3d files are available for download here: https://www.alch.shop/
Merchandise: https://teespring.com/stores/alch
…
All the 3d files are available for download here: https://www.alch.shop/
Merchandise: https://teespring.com/stores/alch
…
This media is not supported in your browser
VIEW IN TELEGRAM
До чего же прекрасен fallout V
Forwarded from Geeks (Aleksandr Mikheev)
Ноутбуки Apple на собственном чипе M1 только появились в продаже, но люди уже ринулись ставить приложения с iOS на новенькие компьютеры. Как оказалось, даже не нужно, чтобы разработчик разрешил подобную установку - достаточно скопировать приложение с телефона и оно почти всегда будет запускаться. Так, например, наконец можно получить настоящие приложения Netflix, Hulu и даже Instagram - вот уж неожиданно, что оно запускается и работает без проблем. Конечно, есть определённые ограничения: в основном это связано со специфичными запросами вроде обязательной сим-карты в устройстве или с тем, что приложение невозможно открыть на полный экран.
Но очень круто, что гигантская библиотека iOS-программ сразу стала доступна, ведь есть куча софта, которая на компьютерах или не работает или открывается только в браузере. Те же приложения, которые разработчики указали совместимыми с компьютерами, доступны уже сейчас в Mac App Store для загрузки. Они работают даже лучше обычных программ, ведь изначально они оптимизировались под слабое железо телефонов, которое ещё и ограничено небольшой батарейкой. В ноутбуках таких ограничений по питанию нет, поэтому приложения могут подгружать и обновлять информацию намного быстрее. M1 пока выглядит очень многообещающе! https://9to5mac.com/2020/11/18/how-to-install-iphone-ipad-app-m1-mac/
Но очень круто, что гигантская библиотека iOS-программ сразу стала доступна, ведь есть куча софта, которая на компьютерах или не работает или открывается только в браузере. Те же приложения, которые разработчики указали совместимыми с компьютерами, доступны уже сейчас в Mac App Store для загрузки. Они работают даже лучше обычных программ, ведь изначально они оптимизировались под слабое железо телефонов, которое ещё и ограничено небольшой батарейкой. В ноутбуках таких ограничений по питанию нет, поэтому приложения могут подгружать и обновлять информацию намного быстрее. M1 пока выглядит очень многообещающе! https://9to5mac.com/2020/11/18/how-to-install-iphone-ipad-app-m1-mac/
9to5Mac
Here’s how to install almost any iPhone or iPad app on M1 Macs, including Netflix, Instagram, and more
As we detailed earlier today, it’s easy to download iPhone and iPad apps from the Mac App Store to run them on the new M1-powered MacBook Air, Mac mini, and MacBook Pro. However, Apple gives developers the ability to opt-out of having their application available…
https://artsandculture.google.com/project/ancient-egypt
Тут Гугл в рамках проекта Art and Culture запустили проект по истории, культуре и искусству Древнего Египта. Залипалово
Тут Гугл в рамках проекта Art and Culture запустили проект по истории, культуре и искусству Древнего Египта. Залипалово
Google Arts & Culture
Ancient Egypt: Mummies and Mysteries - Google Arts & Culture
Crack the hieroglyphic code, explore the pyramids, and meet the mummies
Ладно, сейчас тут будет что-то по истине важное.
Ни для кого не секрет, что работа с регулярками = боль. Раньше и я так думал (на самом деле и сейчас думаю) пока не нашел для себя лучший сервис для работы с ними. Огромный словарь паттернов, удобство в использовании и адекватный интерфейс. Пожалуй, это лучшее что я встречал из онлайн сервисов для работы с выражениями.
Сам сайт: https://regexr.com/
Ни для кого не секрет, что работа с регулярками = боль. Раньше и я так думал (на самом деле и сейчас думаю) пока не нашел для себя лучший сервис для работы с ними. Огромный словарь паттернов, удобство в использовании и адекватный интерфейс. Пожалуй, это лучшее что я встречал из онлайн сервисов для работы с выражениями.
Сам сайт: https://regexr.com/
RegExr
RegExr: Learn, Build, & Test RegEx
RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).
Что-то генераторы фонового шума все платные стали. Вот нашелся один хороший (и бесплатный, разумеется) которым и сам пользуюсь и другим с советую
https://noises.online/
https://noises.online/
Noises.Online
Noises.Online w/ Sound Map
Create and explore a spatial ambient soundscape in your browser.
Попутно еще сервис по конвертированию сюда вкину чтобы не забыть.
Удобно, быстро, качественно. Побольше бы такого
https://convertio.co/
Удобно, быстро, качественно. Побольше бы такого
https://convertio.co/
convertio.co
Convertio — File Converter
Convertio - Easy tool to convert files online. More than 309 different document, image, spreadsheet, ebook, archive, presentation, audio and video formats supported.
Кто бы мог подумать.
Оказывается, московский музей Дарвина имеет свой аккаунт на скетчфаб. Отсканированы более 260 позиций с хорошим описанием. Посмотреть/покрутить тут
https://sketchfab.com/darwinmuseum.ru/models
Оказывается, московский музей Дарвина имеет свой аккаунт на скетчфаб. Отсканированы более 260 позиций с хорошим описанием. Посмотреть/покрутить тут
https://sketchfab.com/darwinmuseum.ru/models
Sketchfab
3D models by darwinmuseum.ru
View 3D models by darwinmuseum.ru
Оу, оказывается у Smithsonian есть нечто подобное.
https://3d.si.edu/explore
Тут можно и на перчатки экипажа Apollo 11 посмотреть (или даже распечатать).
Тут даже слепок лица Линкольна есть. ЧОТКА
https://3d.si.edu/explore
Тут можно и на перчатки экипажа Apollo 11 посмотреть (или даже распечатать).
Тут даже слепок лица Линкольна есть. ЧОТКА
Forwarded from Doque Embedded
По мотивам вчерашнего обсуждения в https://t.me/theyforcedme/2895
Уточню что моя цель - писать код который легко поддерживать, дописывать и менять его логику, и это требование я выношу в основные.
Довольно частая ситуация при написании программы - захват ресурса и освобождение его при выходе из функции. Для примера ресурса возьмем память. (тут и далее я прошу учитывать что я ограничен в объеме текста, и между захватом - освобождением ресурса вполне могут быть страница-две кода)
Чтобы не отвлекать программиста на другие функции мы можем использовать что-то наподобие "анонимной функции", например цикл из одной итерации. Цикл из одной итерации может быть любого вида, while, for, но do {} while (false); это довольно распространенная и понятная идиома, не требующая дополнительных переменных.
Уточню что моя цель - писать код который легко поддерживать, дописывать и менять его логику, и это требование я выношу в основные.
Довольно частая ситуация при написании программы - захват ресурса и освобождение его при выходе из функции. Для примера ресурса возьмем память. (тут и далее я прошу учитывать что я ограничен в объеме текста, и между захватом - освобождением ресурса вполне могут быть страница-две кода)
void foo(){
// выделяем память
DataType* data = malloc(sizeof(Data));
// работаем с памятью
process(data);
// освобождаем память
free(data);
}
Пока что все выглядит ок. Но требования меняются, и теперь нам надо обрабатывать данные в зависимости от того что вернула предыдущая обработка.void foo(){
DataType* data = malloc(sizeof(Data));
if(process_1(data)){
if(process_2(data)){
if(process_3(data)){
process_4(data);
}
}
}
free(data);
}
Цикломатическая сложность растет, и если мы продолжим писать в этом же стиле - рано или поздно мы уйдем ifами за правый край экрана (ну или запутаемся в блоках). Код становится неприятно читать и сложно поддерживать, давайте его перепишем на множественный возврат из функции.void foo(){
DataType* data = malloc(sizeof(Data));
if(!process_1(data)){
free(data);
return;
}
if(!process_2(data)){
free(data);
return;
}
if(!process_3(data)){
free(data);
return;
}
process_4(data);
free(data);
}
Это выглядит и читается приемлимо, но поддерживать этот код стало еще сложнее, например очень легко можно забыть освободить память перед возвратом. Для борьбы с этим человечество придумало блоки finally и идиому "Получение ресурса есть инициализация" (RAII). К сожалению мы любим простреленные ноги и пишем на языке Си, в котором подобное невозможно реализовать не превратив код обмазанный макросами в некрономикоподобный диалект. Что же мы можем сделать?void foo(){
DataType* data = malloc(sizeof(Data));
if(!process_1(data)) goto finally;
if(!process_2(data)) goto finally;
if(!process_3(data)) goto finally;
process_4(data);
finally:
free(data);
}
К сожалению столь лаконичный код получился с использованием goto. Использование оператора goto в целом критикуется, так как программу с его использованием читать на порядки сложнее, как минимум неявны начала и концы переходов, для подробной критики см "Go To Statement Considered Harmful" Эдсгера Дейкстры. Нам нужен блок который бы исполнялся один раз и из которого мы можем выйти оператором отличным от goto, например возьмем отдельную функцию.void process_data(DataType* data){
assert(data);
if(!process_1(data)) return;
if(!process_2(data)) return;
if(!process_3(data)) return;
process_4(data);
}
void foo(){
DataType* data = malloc(sizeof(Data));
process_data(data);
free(data);
}
Приемлимый и поддерживаемый вариант, но требующий передачи ресурса в аргумент (а следовательно проверки аргумента) и требующий от программиста скакать по функциям, плюс загрязняющий область видимости.Чтобы не отвлекать программиста на другие функции мы можем использовать что-то наподобие "анонимной функции", например цикл из одной итерации. Цикл из одной итерации может быть любого вида, while, for, но do {} while (false); это довольно распространенная и понятная идиома, не требующая дополнительных переменных.
void foo(){
DataType* data = malloc(sizeof(Data));
do {
if(!process_1(data)) break;
if(!process_2(data)) break;
if(!process_3(data)) break;
process_4(data);
} while(false);
free(data);
}
В результате мы получили идиому которая явно указывает начало-конец перехода, выделяет блоком код который можно менять не отвлекаясь на освобождение ресурса, и в целом код который довольно лаконично выглядит.Telegram
Меня заставили создать канал
Вы когда-нибудь видели такие конструкции?
Я программировать практически не умею, увидела такое впервые. Высший пилотаж 🤯
Я программировать практически не умею, увидела такое впервые. Высший пилотаж 🤯