#general
Однобуквенные языки программирования. Часть І
*Если интересна вторая часть, то проявите активность
А
Язык программирования A+ является потомком APL, как и другие языки на этой странице, потому что сообщество APL любит однобуквенные имена. Артур Уитни (создатель многих диалектов APL) создал A, затем Морган Стенли расширил его до A+.
B
Язык программирования B является предшественником C и в наши дни больше не используется.
C
Нет необходимости представлять C. Мы также можем считать C++ и C #, поскольку разрешены небуквенные и нецифровые символы.
D
D — это улучшенный C++. Если у вас есть возможность выбирать языки, считайте это рекомендацией проверить D!
E
Язык программирования E — довольно уникальный язык. Он ориентирован на распределенное программирование, а также на обеспечение безопасности.
Существует также Amiga E, который часто называли просто E. Воутер ван Оортмерссен задумывал его как язык сценариев для игр и описывает его как «огромный успех, он стал одним из самых популярных языков программирования на amiga.» Он доступен как бесплатная программа.
F
F# относительно хорошо известен. По сути, O'Caml портировали на .NET.
Также существует F, который является подмножеством Fortran. Он должен быть проще в обучении, использовании и откладке, чем полный Fortran.
F* — это функциональный язык программирования типа ML, предназначенный для проверки программ. Основным текущим вариантом использования F* является создание проверенной и удобной замены всего стека HTTPS.
G
G-код также называется языком программирования G, поэтому он подходит. Язык программирования устройств с числовым программным управлением (ЧПУ). Похоже на ассемблеры.
Внутри LabView есть настоящий язык программирования G. Это язык графического потока данных.
H
H — текстовый язык со слабой типизацией. О нём известно не так много.
Есть еще один H, который не менее полезен. H не является продуктивным инструментом. Вы не можете создать ничего полезного с помощью H.
I
I — это язык, вдохновленный J, который хочет расширить фокус с массивов на большее количество структур данных.
J
J — еще один потомок APL и, вероятно, самый популярный. Например, в Rosetta Code J — один из наиболее популярных языков.
K
K — один из главных потомков APL Артура Уитни. Это коммерческий продукт, используемый в банках для финансирования и торговли.
L
L был языком, который дал синтаксис C для TCL.
L является братом E по HP Labs. L — это подмножество Common Lisp.
L — это теоретический язык в книге «Вычислимость, сложность и языки: основы теоретической информатики».
M
Язык M был изобретен Французским Управлением государственных финансов (DGFiP), эквивалентным IRS, для преобразования налогового кода в машиночитаемые инструкции. Это небольшой предметно-ориентированный язык, основанный на объявлениях переменных и арифметических операциях. Реверс-инжиниринг компилятора доступен здесь.
N
Из запейволленой публикации 1989 года:
Ожидая в ближайшем будущем широкого использования алгоритмов нейронных сетей, наша цель — получить полную среду разработки программного обеспечения для программирования и тестирования новых приложений. Мы намерены создать язык высокого уровня для спецификации нейронных сетей как часть такой среды.
Однобуквенные языки программирования. Часть І
*Если интересна вторая часть, то проявите активность
А
Язык программирования A+ является потомком APL, как и другие языки на этой странице, потому что сообщество APL любит однобуквенные имена. Артур Уитни (создатель многих диалектов APL) создал A, затем Морган Стенли расширил его до A+.
B
Язык программирования B является предшественником C и в наши дни больше не используется.
C
Нет необходимости представлять C. Мы также можем считать C++ и C #, поскольку разрешены небуквенные и нецифровые символы.
D
D — это улучшенный C++. Если у вас есть возможность выбирать языки, считайте это рекомендацией проверить D!
E
Язык программирования E — довольно уникальный язык. Он ориентирован на распределенное программирование, а также на обеспечение безопасности.
Существует также Amiga E, который часто называли просто E. Воутер ван Оортмерссен задумывал его как язык сценариев для игр и описывает его как «огромный успех, он стал одним из самых популярных языков программирования на amiga.» Он доступен как бесплатная программа.
F
F# относительно хорошо известен. По сути, O'Caml портировали на .NET.
Также существует F, который является подмножеством Fortran. Он должен быть проще в обучении, использовании и откладке, чем полный Fortran.
F* — это функциональный язык программирования типа ML, предназначенный для проверки программ. Основным текущим вариантом использования F* является создание проверенной и удобной замены всего стека HTTPS.
G
G-код также называется языком программирования G, поэтому он подходит. Язык программирования устройств с числовым программным управлением (ЧПУ). Похоже на ассемблеры.
Внутри LabView есть настоящий язык программирования G. Это язык графического потока данных.
H
H — текстовый язык со слабой типизацией. О нём известно не так много.
Есть еще один H, который не менее полезен. H не является продуктивным инструментом. Вы не можете создать ничего полезного с помощью H.
I
I — это язык, вдохновленный J, который хочет расширить фокус с массивов на большее количество структур данных.
J
J — еще один потомок APL и, вероятно, самый популярный. Например, в Rosetta Code J — один из наиболее популярных языков.
K
K — один из главных потомков APL Артура Уитни. Это коммерческий продукт, используемый в банках для финансирования и торговли.
L
L был языком, который дал синтаксис C для TCL.
L является братом E по HP Labs. L — это подмножество Common Lisp.
L — это теоретический язык в книге «Вычислимость, сложность и языки: основы теоретической информатики».
M
Язык M был изобретен Французским Управлением государственных финансов (DGFiP), эквивалентным IRS, для преобразования налогового кода в машиночитаемые инструкции. Это небольшой предметно-ориентированный язык, основанный на объявлениях переменных и арифметических операциях. Реверс-инжиниринг компилятора доступен здесь.
N
Из запейволленой публикации 1989 года:
Ожидая в ближайшем будущем широкого использования алгоритмов нейронных сетей, наша цель — получить полную среду разработки программного обеспечения для программирования и тестирования новых приложений. Мы намерены создать язык высокого уровня для спецификации нейронных сетей как часть такой среды.
Однобуквенные языки программирования. Часть ІІ
О
O — это стековый язык с однобуквенными командами. Например, «io» читает строку ввода (i), а затем выводит ее (o).
P
Язык программирования P предназначен для асинхронного программирования, управляемого событиями. Он использовался для реализации и проверки стека драйверов USB-устройств, поставляемого с Microsoft Windows 8 и Windows Phone.
P′′ — это примитивный формальный язык с 1964 года. Это был первый язык без GOTO, подтверждённо полный по Тьюрингу. Brainfuck — это P ′′ плюс IO.
P# — это интерпретатор Пролога для .NET.
Q
Q — это оболочка вокруг K и базы данных kdb+, чтобы сделать ее более читаемой.
Другой язык Q — это функциональный язык программирования, основанный на переписывании терминов. Его сменил Pure.
Существует также Q#, «предметно-ориентированный язык программирования, используемый для выражения квантовых алгоритмов. Он должен использоваться для написания подпрограмм, которые выполняются на дополнительном квантовом процессоре под управлением классической главной программы и компьютера».
R
R — хорошо известный язык статистического программирования. Он считается наравне с коммерческими инструментами, такими как SAS.
S
S — это язык статистического программирования, а R считается реализацией. Большая часть кода S работает в R.
Т
T — диалект Scheme или Lisp. Последний релиз был в 1984 году, так что его можно считать мертвым.
U
Язык программирования U — личный проект Роба Апкрафта. Он хотел простой C-подобный язык для написания собственной операционной системы.
V
В сводке за 1985 год упоминается язык программирования V.
W
W был создан Виктором Тотом в 2001 году для программирования двух старинных компьютеров от HP. Это очень простой язык, описываемый как C, без ключевых слов, типов и стандартной библиотеки.
X
X# — это язык программирования низкого уровня, где-то между сборкой x86 и C. Он разработан в рамках Cosmos, набора инструментов для операционной системы с открытым исходным кодом.
X++ — это язык программирования, используемый в одном из программных продуктов Microsoft для планирования ресурсов предприятия. Он является производным от C++ и добавляет сборщик мусора и синтаксис запросов SQL.
Y
https://dl.acm.org/doi/10.1145/954269.954278
Z
Z-нотация — это формальный язык спецификаций, стандартизированный как ISO/IEC13568:2002.
Другой Z — крошечный, строгий, нечистый, каррированный, частично прикладной язык программирования с довольно своеобразным синтаксисом.
О
O — это стековый язык с однобуквенными командами. Например, «io» читает строку ввода (i), а затем выводит ее (o).
P
Язык программирования P предназначен для асинхронного программирования, управляемого событиями. Он использовался для реализации и проверки стека драйверов USB-устройств, поставляемого с Microsoft Windows 8 и Windows Phone.
P′′ — это примитивный формальный язык с 1964 года. Это был первый язык без GOTO, подтверждённо полный по Тьюрингу. Brainfuck — это P ′′ плюс IO.
P# — это интерпретатор Пролога для .NET.
Q
Q — это оболочка вокруг K и базы данных kdb+, чтобы сделать ее более читаемой.
Другой язык Q — это функциональный язык программирования, основанный на переписывании терминов. Его сменил Pure.
Существует также Q#, «предметно-ориентированный язык программирования, используемый для выражения квантовых алгоритмов. Он должен использоваться для написания подпрограмм, которые выполняются на дополнительном квантовом процессоре под управлением классической главной программы и компьютера».
R
R — хорошо известный язык статистического программирования. Он считается наравне с коммерческими инструментами, такими как SAS.
S
S — это язык статистического программирования, а R считается реализацией. Большая часть кода S работает в R.
Т
T — диалект Scheme или Lisp. Последний релиз был в 1984 году, так что его можно считать мертвым.
U
Язык программирования U — личный проект Роба Апкрафта. Он хотел простой C-подобный язык для написания собственной операционной системы.
V
В сводке за 1985 год упоминается язык программирования V.
W
W был создан Виктором Тотом в 2001 году для программирования двух старинных компьютеров от HP. Это очень простой язык, описываемый как C, без ключевых слов, типов и стандартной библиотеки.
X
X# — это язык программирования низкого уровня, где-то между сборкой x86 и C. Он разработан в рамках Cosmos, набора инструментов для операционной системы с открытым исходным кодом.
X++ — это язык программирования, используемый в одном из программных продуктов Microsoft для планирования ресурсов предприятия. Он является производным от C++ и добавляет сборщик мусора и синтаксис запросов SQL.
Y
https://dl.acm.org/doi/10.1145/954269.954278
Z
Z-нотация — это формальный язык спецификаций, стандартизированный как ISO/IEC13568:2002.
Другой Z — крошечный, строгий, нечистый, каррированный, частично прикладной язык программирования с довольно своеобразным синтаксисом.
#java
Методы Stream API (
Методы Stream API (
1/n
)filterОтфильтровывает записи, возвращает только записи, соответствующие условию.
skipПозволяет пропустить N первых элементов.
distinctВозвращает стрим без дубликатов (для метода equals)
mapПреобразует каждый элемент стрима
limitПозволяет ограничить выборку определенным количеством первых элементов
sortedПозволяет сортировать значения либо в натуральном порядке, либо задавая Comparator
#java
Многопоточность (
Многопоточность — это свойство системы выполнять несколько вычислений одновременно, тем самым ускоряя процесс этого вычисления. Например, когда Вы играете в компьютерные игры, вы видите, что Ваш персонаж выполняет определенное действие, другие персонажи, анимация, звук. Это все отдельные потоки если говорить примитивно.
В языке Java есть стандартный класс, который реализует многопоточность: Thread, который имплементирует Runable интерфейс. Для того, чтобы реализовать многопоточность в своей программе нужно унаследовать свой класс от Thread или имплементировать интерфейс Runable.
В классе Thread есть метод run() и start(), которые созданы чтобы делать вычисления и запускать выполнение кода соответственно. То есть в методе run() мы пишем, что хотим выполнить, а когда вызываем метод start(), он автоматически запускает наш код в run.
Потоки имеют определенные состояния. Всего их 4:
Многопоточность (
1/n
)Многопоточность — это свойство системы выполнять несколько вычислений одновременно, тем самым ускоряя процесс этого вычисления. Например, когда Вы играете в компьютерные игры, вы видите, что Ваш персонаж выполняет определенное действие, другие персонажи, анимация, звук. Это все отдельные потоки если говорить примитивно.
В языке Java есть стандартный класс, который реализует многопоточность: Thread, который имплементирует Runable интерфейс. Для того, чтобы реализовать многопоточность в своей программе нужно унаследовать свой класс от Thread или имплементировать интерфейс Runable.
В классе Thread есть метод run() и start(), которые созданы чтобы делать вычисления и запускать выполнение кода соответственно. То есть в методе run() мы пишем, что хотим выполнить, а когда вызываем метод start(), он автоматически запускает наш код в run.
Потоки имеют определенные состояния. Всего их 4:
⟡
создание (когда мы написали new Thread();⟡
старт (thread1.start());⟡
выполнение (пока выполняется метод run());⟡
завершение (когда поток выполнил свою работу).#java
Многопоточность (
Как видим на рисунке (пред. пост), поток может еще и ожидать. Для того, чтобы на время заставить поток прекратить свою работу в классе есть метод wait(), который приостанавливает выполнение пока не будет вызван метод notify(). Неправильно говорить, что это методы класса потока. Это методы объекта. Может у Вас когда то будет вопрос на тесте или собеседовании назвать методы класса Object; тогда к тем методам что Вы вспомните можете смело называть wait() и notify().
Из статических методов есть метод sleep(), который принимает целочисленную переменную в качестве миллисекунд на который следует приостановить поток. Вызов этого метода можно осуществлять в любом месте кода, где Вы желаете приостановить или замедлить выполнение. Я часто использовал этот метод в циклах, когда нужно было в консоли увидеть большое количество данных и найти нужное.
Есть еще метод yield(), при вызове которого, поток на время прекращает работу, позволяя другим потокам тоже выполниться.
Чтобы уничтожить потоки есть методы stop() и destroy(). Разница между ними в том, что при вызове destroy() поток уже нельзя возобновить. Можно прервать выполнение потока вызвав метод interrupt().
Многопоточность (
2/n
)Как видим на рисунке (пред. пост), поток может еще и ожидать. Для того, чтобы на время заставить поток прекратить свою работу в классе есть метод wait(), который приостанавливает выполнение пока не будет вызван метод notify(). Неправильно говорить, что это методы класса потока. Это методы объекта. Может у Вас когда то будет вопрос на тесте или собеседовании назвать методы класса Object; тогда к тем методам что Вы вспомните можете смело называть wait() и notify().
Из статических методов есть метод sleep(), который принимает целочисленную переменную в качестве миллисекунд на который следует приостановить поток. Вызов этого метода можно осуществлять в любом месте кода, где Вы желаете приостановить или замедлить выполнение. Я часто использовал этот метод в циклах, когда нужно было в консоли увидеть большое количество данных и найти нужное.
Есть еще метод yield(), при вызове которого, поток на время прекращает работу, позволяя другим потокам тоже выполниться.
Чтобы уничтожить потоки есть методы stop() и destroy(). Разница между ними в том, что при вызове destroy() поток уже нельзя возобновить. Можно прервать выполнение потока вызвав метод interrupt().
Чистый_код_Создание,_анализ_и_рефакторинг_Роберт_Мартин_Роберт_Мартин
6 MB
#books
Чистый код. Создание, анализ и рефакторинг. Роберт Мартин
Прочитав книгу, вы узнаете много нового о коде. Более того, вы научитесь отличать хороший код от плохого. Вы узнаете, как писать хороший код и как преобразовать плохой код в хороший.
Чистый код. Создание, анализ и рефакторинг. Роберт Мартин
Прочитав книгу, вы узнаете много нового о коде. Более того, вы научитесь отличать хороший код от плохого. Вы узнаете, как писать хороший код и как преобразовать плохой код в хороший.
⟡
Книга состоит из трех частей. В первой части излагаются принципы, паттерны и приемы написания чистого кода; приводится большой объем примеров кода. ⟡
Вторая часть состоит из практических сценариев нарастающей сложности. Каждый сценарий представляет собой упражнение по чистке кода или преобразованию проблемного кода в код с меньшим количеством проблем.⟡
Третья часть книги - концентрированное выражение ее сути. Она состоит из одной главы с перечнем эвристических правил и "запахов кода", собранных во время анализа. Эта часть представляет собой базу знаний, описывающую наш путь мышления в процессе чтения, написания и чистки кода.#news
Автономный мягкий робот впервые погрузился в Марианскую впадину
Автономный мягкий робот, прообразом которого является рыба Pseudoliparis swirei, выдержал невероятное давление глубин Марианской впадины.
Бездна Челленджера – глубочайшая из глубин Мирового океана. Она уходит примерно на 10990 метров ниже уровня моря. В этом месте огромный слой воды оказывает на морское дно колоссальное давление, более чем в тысячу раз превышающие показатели атмосферного давления на уровне моря, что соответствует приблизительно 108,6 МПа. Это сравнимо с давлением веса целого слона, который балансирует на кончике Вашего большого пальца.
https://www.youtube.com/watch?v=gkuL4AYlExE
Автономный мягкий робот впервые погрузился в Марианскую впадину
Автономный мягкий робот, прообразом которого является рыба Pseudoliparis swirei, выдержал невероятное давление глубин Марианской впадины.
Бездна Челленджера – глубочайшая из глубин Мирового океана. Она уходит примерно на 10990 метров ниже уровня моря. В этом месте огромный слой воды оказывает на морское дно колоссальное давление, более чем в тысячу раз превышающие показатели атмосферного давления на уровне моря, что соответствует приблизительно 108,6 МПа. Это сравнимо с давлением веса целого слона, который балансирует на кончике Вашего большого пальца.
https://www.youtube.com/watch?v=gkuL4AYlExE
YouTube
This snailfish-inspired robot can explore the deepest sea | Science News
Researchers successfully ran a soft autonomous robot through several field tests at different depths in the ocean. At 3,224 meters deep in the South China Sea, the tests demonstrated that the robot could swim autonomously (free swim test). The team also tested…
#backEnd #NodeJS
Релиз Node.js 16
20 апреля состоялся релиз новой 16 версии Node.js. Среди основных изменений обновление движка JavaScript V8 до версии 9.0, встроенные бинарники (двоичные файлы) для Apple Silicon и несколько API, но обо всем по порядку.
Из основных изменений движка можно назвать поддержку индексов соответствия в регулярных выражениях (regexp match indices), а также улучшение (повышение скорости) доступа к свойству «super».
Идексы соответствия позволяют разработчикам получать массив подмассивов, содержащих начальные и конечные позиции (индексы) групп захвата (capture groups) в регулярном выражении при наличии совпадения (или нескольких совпадений). Данный массив доступен через свойство «indices» объекта с совпадениями. Обратите внимание, что регулярное выражение, используемое для поиска совпадений, должно иметь флаг «/d».
Timers Promises API предоставляет альтернативный набор таймеров, возвращающих объект «Promise», что избавляет от необходимости использования util.promisify().
Релиз Node.js 16
20 апреля состоялся релиз новой 16 версии Node.js. Среди основных изменений обновление движка JavaScript V8 до версии 9.0, встроенные бинарники (двоичные файлы) для Apple Silicon и несколько API, но обо всем по порядку.
Из основных изменений движка можно назвать поддержку индексов соответствия в регулярных выражениях (regexp match indices), а также улучшение (повышение скорости) доступа к свойству «super».
Идексы соответствия позволяют разработчикам получать массив подмассивов, содержащих начальные и конечные позиции (индексы) групп захвата (capture groups) в регулярном выражении при наличии совпадения (или нескольких совпадений). Данный массив доступен через свойство «indices» объекта с совпадениями. Обратите внимание, что регулярное выражение, используемое для поиска совпадений, должно иметь флаг «/d».
const re = /(a)(b)/d // Регулярное выражение. Обратите внимание на наличие флага /dДоступ к свойству «super» был улучшен за счет использования системы встроенного кэша и оптимизации генерации кода в «TurboFan» (TurboFan — это компилятор, за интепретацию кода в V8 отвечает Ignition). Как утверждают разработчики V8, скорость доступа к super стала почти такой же, как скорость доступа к обычному свойству.
const m = re.exec('ab') // Объект с совпадениями
console.log(m.indices[0]) // Первый подмассив — это полное совпадение
// [0, 2]
console.log(m.indices[1]) // Второй подмассив — первая группа захвата
// [0, 1]
console.log(m.indices[2]) // Третий подмассив — вторая группа захвата
// [1, 2]
Timers Promises API предоставляет альтернативный набор таймеров, возвращающих объект «Promise», что избавляет от необходимости использования util.promisify().
import { setTimeout } from 'timers/promises'Timers Promises API был представлен в Node.js 15 в качестве экспериментальной возможности. Теперь он приобрел статус стабильного интерфейса.
async function run() {
const greet = await setTimeout(3000, 'Hi!')
console.log(greet) // Hi!
}
run()
#news #science #space
NASA выбрало SpaceX для полета на Луну, и это ключевой момент в истории космонавтики
Через несколько лет астронавты NASA собираются вернуться на Луну. И условия возвращения куда более комфортабельны, чем те, что были у первопроходцев. Все потому, что возвращаться они будут на Starship, длина которого от хвоста до носа составляет 50 метров. А вот Базз Олдрин с Нилом Армстронгом довольствовались всего 7 метрами. Им было не просто тесно, а очень тесно, что можно видеть на фотографиях того времени.
Отличает эту экспедицию еще и то, что она будет реализована силами частной компании — SpaceX.
Частная компания — и только она — ответственна за проектирование, тестирование и реализацию двух полетов на Луну. Один из них, пилотируемый, должен состояться уже в 2024 году.
Конечно, все это далеко не бесплатно: SpaceX получила $2,89 млрд на реализацию проекта. Это огромные средства, но потрачены они во благо — компания Илона Маска сможет значительно ускорить процесс подготовки полета. Частная компания более свободна в своих действиях, чем государственное агентство, а Маск известен тем, что, хотя и с задержкой, но успешно реализует большинство намеченных планов.
NASA выбрало SpaceX для полета на Луну, и это ключевой момент в истории космонавтики
Через несколько лет астронавты NASA собираются вернуться на Луну. И условия возвращения куда более комфортабельны, чем те, что были у первопроходцев. Все потому, что возвращаться они будут на Starship, длина которого от хвоста до носа составляет 50 метров. А вот Базз Олдрин с Нилом Армстронгом довольствовались всего 7 метрами. Им было не просто тесно, а очень тесно, что можно видеть на фотографиях того времени.
Отличает эту экспедицию еще и то, что она будет реализована силами частной компании — SpaceX.
Частная компания — и только она — ответственна за проектирование, тестирование и реализацию двух полетов на Луну. Один из них, пилотируемый, должен состояться уже в 2024 году.
Конечно, все это далеко не бесплатно: SpaceX получила $2,89 млрд на реализацию проекта. Это огромные средства, но потрачены они во благо — компания Илона Маска сможет значительно ускорить процесс подготовки полета. Частная компания более свободна в своих действиях, чем государственное агентство, а Маск известен тем, что, хотя и с задержкой, но успешно реализует большинство намеченных планов.
#math #longRead
Как выглядит самое красивое математическое уравнение?
Давайте вспомним о тождестве Эйлера — по праву самом красивом уравнении, важное место в котором занимает число e, но не только оно. Представьте на секунду, что вы почти ничего не знаете о математике, только начинаете открывать её бесконечную красоту — и наслаждайтесь.
Все мы знаем о числе π — магическом отношении длины окружности к её диаметру. Число π можно приближённо представить в виде дроби 22/7. Особенность числа π состоит в том, что в его десятичной записи знаки после запятой никогда не заканчиваются. Его приближённое значение — 3,141592653589793238… Вот почему π называют иррациональным числом — его нельзя записать в виде конечного числа цифр после запятой. А вот другое интересное иррациональное число — e. Число e — это "число Эйлера" (от Euler). Вот первые несколько цифр числа e: 2,7182818284590…
Поговорим теперь о другом интересном математическом объекте. Он называется просто: i. Разберёмся, что это такое.
Если умножить 2 на 2, получится 4. То есть 2 в квадрате равняется 4. Квадрат положительного числа — это положительное число. Но, если возвести в квадрат –2, также получится 4, то есть положительное число. Другими словами, ни один квадрат действительного числа не может быть отрицательным числом. Вот тут-то и возникает понятие мнимого числа.
Число √-1 записывается буквой i. i означает мнимую (imaginary) единицу. То есть запись √-5 можно заменить записью √5 i. Отсюда следует, что i² = -1. Число i формирует множество комплексных чисел, то есть комбинаций действительных и мнимых чисел. Например, запись 8 + i√5 является комплексным числом. Для визуализации комплексных чисел используется плоскость мнимых чисел.
Изучать свойства комплексных чисел математики начали примерно с середины XVIII века. Однажды Эйлер развлекался с женой Тейлора... ох, простите... с рядом Тейлора.
https://numl.org/Hxd
Этому сумасброду просто стало интересно, как будет вести себя ряд Тейлора, если подставить в него число i (а что, вполне нормальная мысль для любого сумасброда).
Одни члены ряда, содержащие i, сводятся в одну группу, а другие, не содержащие мнимую часть, то есть без числа i, — в другую. Получаются два ряда Тейлора: один — для косинуса, другой — для синуса.
Мы получили знаменитую формулу Эйлера. Различные значения x и e^(ix) можно отразить на комплексной плоскости.
Это комплексное число, которое может быть представлено на комплексной плоскости. Если продолжить наносить на график точки e^(ix) для разных значений x, получится окружность.
https://numl.org/Hxe
Если нужно узнать радиус r в любой точке (например, в точке 5 + 7i), рассчитывается значение x и берётся действительная часть re^(ix).
Объединив три самых необыкновенных математических символа, получаем магическое уравнение:
Как выглядит самое красивое математическое уравнение?
Давайте вспомним о тождестве Эйлера — по праву самом красивом уравнении, важное место в котором занимает число e, но не только оно. Представьте на секунду, что вы почти ничего не знаете о математике, только начинаете открывать её бесконечную красоту — и наслаждайтесь.
Все мы знаем о числе π — магическом отношении длины окружности к её диаметру. Число π можно приближённо представить в виде дроби 22/7. Особенность числа π состоит в том, что в его десятичной записи знаки после запятой никогда не заканчиваются. Его приближённое значение — 3,141592653589793238… Вот почему π называют иррациональным числом — его нельзя записать в виде конечного числа цифр после запятой. А вот другое интересное иррациональное число — e. Число e — это "число Эйлера" (от Euler). Вот первые несколько цифр числа e: 2,7182818284590…
Поговорим теперь о другом интересном математическом объекте. Он называется просто: i. Разберёмся, что это такое.
Если умножить 2 на 2, получится 4. То есть 2 в квадрате равняется 4. Квадрат положительного числа — это положительное число. Но, если возвести в квадрат –2, также получится 4, то есть положительное число. Другими словами, ни один квадрат действительного числа не может быть отрицательным числом. Вот тут-то и возникает понятие мнимого числа.
Число √-1 записывается буквой i. i означает мнимую (imaginary) единицу. То есть запись √-5 можно заменить записью √5 i. Отсюда следует, что i² = -1. Число i формирует множество комплексных чисел, то есть комбинаций действительных и мнимых чисел. Например, запись 8 + i√5 является комплексным числом. Для визуализации комплексных чисел используется плоскость мнимых чисел.
Изучать свойства комплексных чисел математики начали примерно с середины XVIII века. Однажды Эйлер развлекался с женой Тейлора... ох, простите... с рядом Тейлора.
https://numl.org/Hxd
Этому сумасброду просто стало интересно, как будет вести себя ряд Тейлора, если подставить в него число i (а что, вполне нормальная мысль для любого сумасброда).
Одни члены ряда, содержащие i, сводятся в одну группу, а другие, не содержащие мнимую часть, то есть без числа i, — в другую. Получаются два ряда Тейлора: один — для косинуса, другой — для синуса.
Мы получили знаменитую формулу Эйлера. Различные значения x и e^(ix) можно отразить на комплексной плоскости.
Это комплексное число, которое может быть представлено на комплексной плоскости. Если продолжить наносить на график точки e^(ix) для разных значений x, получится окружность.
https://numl.org/Hxe
Если нужно узнать радиус r в любой точке (например, в точке 5 + 7i), рассчитывается значение x и берётся действительная часть re^(ix).
Объединив три самых необыкновенных математических символа, получаем магическое уравнение:
#network
New IP — следующий этап развития Интернета или ужесточение контроля над пользователями
В марте 2021 года Китай опубликовал свой 14-й пятилетний план экономического развития, включая намеченные следующие шаги в области технологий. В проекте чётко говорится, что Китай и его сетевой гигант Huawei готовятся к тому, чтобы их видение Интернета стало глобальным.
Планы Huawei в отношении 6G и выше делают озабоченность США по поводу 5G ничтожной: Huawei предлагает фундаментальный редизайн Интернета, которое называется «New IP», призванный обеспечить «внутреннюю безопасность» в сети. Внутренняя безопасность означает, что отдельные лица должны зарегистрироваться для использования Интернета, а органы власти могут в любой момент отключить доступ к Интернету отдельного пользователя. Короче говоря, Huawei стремится интегрировать китайские режимы «социального кредита», слежки и цензуры в архитектуру Интернета. А по замыслу разработчиков новый протокол выведет интернет на новый уровень и позволит быстрее развивать существующие телекоммуникационные сервисы и внедрять новые, в том числе технологию голографического присутствия.
В New IP реализован специальный алгоритм «отключения» (killswitch), позволяющий блокировать все данные, поступающие из сети на определенный адрес или с него в сеть. Делать это можно будет в любой момент времени, и это означает, что регуляторы интернета смогут не только моментально отключать неугодные ресурсы, но и блокировать доступ к интернету конкретных людей, в буквальном смысле вычисляя их по IP-адресу. Переход на New IP также может потребовать авторизации и аутентификации как новых интернет-адресов, так и людей, связанных с ними. Другими словами, New IP подразумевает полное отсутствие анонимности и приватности в интернете и напоминает глобальную версию «Великого китайского файервола», блокирующего жителям КНР доступ ко многим международным ресурсам.
New IP имеет три ключевые особенности:
Изменяемая длина IP-адреса для беспрепятственной поддержки межсетевого взаимодействия;
Семантическое определение IP-адреса для идентификации физических и виртуальных объектов;
Определяемый пользователем IP-заголовок, позволяющий конечным пользователям указывать настраиваемые функции, выполняемые с пакетами данных.
https://www.huawei.com/us/industry-insights/innovation/new-ip
New IP — следующий этап развития Интернета или ужесточение контроля над пользователями
В марте 2021 года Китай опубликовал свой 14-й пятилетний план экономического развития, включая намеченные следующие шаги в области технологий. В проекте чётко говорится, что Китай и его сетевой гигант Huawei готовятся к тому, чтобы их видение Интернета стало глобальным.
Планы Huawei в отношении 6G и выше делают озабоченность США по поводу 5G ничтожной: Huawei предлагает фундаментальный редизайн Интернета, которое называется «New IP», призванный обеспечить «внутреннюю безопасность» в сети. Внутренняя безопасность означает, что отдельные лица должны зарегистрироваться для использования Интернета, а органы власти могут в любой момент отключить доступ к Интернету отдельного пользователя. Короче говоря, Huawei стремится интегрировать китайские режимы «социального кредита», слежки и цензуры в архитектуру Интернета. А по замыслу разработчиков новый протокол выведет интернет на новый уровень и позволит быстрее развивать существующие телекоммуникационные сервисы и внедрять новые, в том числе технологию голографического присутствия.
В New IP реализован специальный алгоритм «отключения» (killswitch), позволяющий блокировать все данные, поступающие из сети на определенный адрес или с него в сеть. Делать это можно будет в любой момент времени, и это означает, что регуляторы интернета смогут не только моментально отключать неугодные ресурсы, но и блокировать доступ к интернету конкретных людей, в буквальном смысле вычисляя их по IP-адресу. Переход на New IP также может потребовать авторизации и аутентификации как новых интернет-адресов, так и людей, связанных с ними. Другими словами, New IP подразумевает полное отсутствие анонимности и приватности в интернете и напоминает глобальную версию «Великого китайского файервола», блокирующего жителям КНР доступ ко многим международным ресурсам.
New IP имеет три ключевые особенности:
Изменяемая длина IP-адреса для беспрепятственной поддержки межсетевого взаимодействия;
Семантическое определение IP-адреса для идентификации физических и виртуальных объектов;
Определяемый пользователем IP-заголовок, позволяющий конечным пользователям указывать настраиваемые функции, выполняемые с пакетами данных.
https://www.huawei.com/us/industry-insights/innovation/new-ip
huawei
A Brief Introduction about New IP Research Initiative
This article outlines the reasoning behind the New IP initiative, the motivation (why) of the work, the definition & work areas of investigation
#principles
Внедрение зависимостей (Dependency injection, DI)
Внедрение зависимостей — это стиль настройки объекта, при котором поля объекта задаются внешней сущностью. Другими словами, объекты настраиваются внешними объектами. DI — это альтернатива самонастройке объектов.
Эта концепция состоит в том, чтобы перенести ответственность за создание экземпляра объекта из тела метода за пределы класса и передать уже созданный экземпляр объекта обратно.
Звучит это все довольно абстрактно, так что вот пример:
Представьте себе очень простую зависимость между двумя классами: класс «Автомобиль» (Car) зависит от класса «Двигатель» (CarEngine).
Однако, мы знаем, что это стоит программировать с помощью интерфейса: (№1)
Но, чтобы изолировать класс Car, недостаточно ввести интерфейс Engine. В коде класса Car также должно быть невозможным создание нового экземпляра класса CarEngine: (№2)
Теперь с помощью этого дизайна можно создавать экземпляры класса Car: (№3)
Внедрение зависимостей (Dependency injection, DI)
Внедрение зависимостей — это стиль настройки объекта, при котором поля объекта задаются внешней сущностью. Другими словами, объекты настраиваются внешними объектами. DI — это альтернатива самонастройке объектов.
Эта концепция состоит в том, чтобы перенести ответственность за создание экземпляра объекта из тела метода за пределы класса и передать уже созданный экземпляр объекта обратно.
Звучит это все довольно абстрактно, так что вот пример:
Представьте себе очень простую зависимость между двумя классами: класс «Автомобиль» (Car) зависит от класса «Двигатель» (CarEngine).
Однако, мы знаем, что это стоит программировать с помощью интерфейса: (№1)
Но, чтобы изолировать класс Car, недостаточно ввести интерфейс Engine. В коде класса Car также должно быть невозможным создание нового экземпляра класса CarEngine: (№2)
Теперь с помощью этого дизайна можно создавать экземпляры класса Car: (№3)
#backEnd
Личный сервер shadowsocks за 10 минут без затрат
shadowsocks - это шифрованный сетевой туннель, клиентская часть которого предоставляет доступ приложениям к сети как SOCKS-прокси, запущенный на этом же устройстве. В некотором смысле его можно использовать как VPN, потому что клиенты поддерживают прозрачное перенаправление трафика приложений в туннель
В этом руководстве используется замечательный проект готового приложения для Heroku, которое реализует всё необходимое автоматически.
Ссылка на GitHub проекта. https://github.com/aditya-shri/VPN
Шаг 1. Регистрация в сервисе Heroku
Для этого нужно зайти на сайт Heroku, нажать Sign up и заполнить требуемые сведения. Для регистрации нужна только электронная почта.
Шаг 2. Начало развёртывания
Нажмите на эту ссылку.
https://dashboard.heroku.com/new?template=https%3A%2F%2Fgithub.com%2Faditya-shri%2FVPN%2Ftree%2Fmain
Шаг 3. Конфигурирование
В появившейся форме заполните все поля как показано на скриншоте:
В качестве значений "App Name" и AppName впишите какое-то уникальное имя приложения, одинаковое в обоих полях. Это имя станет частью доменного имени appname.herokuapp.com, по которому станет доступен сервис.
Вместо PASSWORD задайте свой пароль. Можно задать подлиннее и понадёжнее - Вам, скорее всего, не придётся вводить его вручную.
Кроме того, желательно поменять пути QR и путь обработчика прокси V2_Path на какое-нибудь трудноугадываемое значение.
Шаг 4
Заполнив форму, нажмите Deploy app.
После завершения сборки и запуска QR-код с конфигурацией для мобильных устройств будет доступен по адресу
https://APPNAME.herokuapp.com/qr/vpn.png
а строка с конфигурацией в виде URL будет доступна по адресу
https://APPNAME.herokuapp.com/qr/
где APPNAME - выбранное Вами имя приложения. Если Вы меняли путь к QR-коду, то ссылка изменится в соответственно. Во второй ссылке косая черта на конце обязательна.
Всё, можно пользоваться!
Личный сервер shadowsocks за 10 минут без затрат
shadowsocks - это шифрованный сетевой туннель, клиентская часть которого предоставляет доступ приложениям к сети как SOCKS-прокси, запущенный на этом же устройстве. В некотором смысле его можно использовать как VPN, потому что клиенты поддерживают прозрачное перенаправление трафика приложений в туннель
В этом руководстве используется замечательный проект готового приложения для Heroku, которое реализует всё необходимое автоматически.
Ссылка на GitHub проекта. https://github.com/aditya-shri/VPN
Шаг 1. Регистрация в сервисе Heroku
Для этого нужно зайти на сайт Heroku, нажать Sign up и заполнить требуемые сведения. Для регистрации нужна только электронная почта.
Шаг 2. Начало развёртывания
Нажмите на эту ссылку.
https://dashboard.heroku.com/new?template=https%3A%2F%2Fgithub.com%2Faditya-shri%2FVPN%2Ftree%2Fmain
Шаг 3. Конфигурирование
В появившейся форме заполните все поля как показано на скриншоте:
В качестве значений "App Name" и AppName впишите какое-то уникальное имя приложения, одинаковое в обоих полях. Это имя станет частью доменного имени appname.herokuapp.com, по которому станет доступен сервис.
Вместо PASSWORD задайте свой пароль. Можно задать подлиннее и понадёжнее - Вам, скорее всего, не придётся вводить его вручную.
Кроме того, желательно поменять пути QR и путь обработчика прокси V2_Path на какое-нибудь трудноугадываемое значение.
Шаг 4
Заполнив форму, нажмите Deploy app.
После завершения сборки и запуска QR-код с конфигурацией для мобильных устройств будет доступен по адресу
https://APPNAME.herokuapp.com/qr/vpn.png
а строка с конфигурацией в виде URL будет доступна по адресу
https://APPNAME.herokuapp.com/qr/
где APPNAME - выбранное Вами имя приложения. Если Вы меняли путь к QR-коду, то ссылка изменится в соответственно. Во второй ссылке косая черта на конце обязательна.
Всё, можно пользоваться!
#java
Интерфейс Comparable ♨️
Небольшое вступление. Мы создали класс ArrayList в котором хранятся объекты класса String - имена ваших коллег. Вы захотели отсортировать вашу коллекцию, написав Collections.sort(
String реализует интерфейс Comparable (
Другое дело, мы создали наш собственный клас, к примеру, Person (человек), и хотим как то их сравнивать, но как? Если мы создадим список наших объектов, и захотим их отсортировать у нас будет ошибка, так как метод
(№1) Мы создали класс Person, у него есть поле height, за которым будет производится сравнивание. Имплементируем метод compareTo(), он возвращает целое число. Единица, если текущий объект больше за другой, 0 если объекты равны, -1 если текущий объект меньше.
То есть этим методом мы показываем как именно и за каким "свойством" будут сравнивается объекты "нашего" типа.
(№2) Тестируем сортировку объектов нашего класса.
Интерфейс Comparable ♨️
Небольшое вступление. Мы создали класс ArrayList в котором хранятся объекты класса String - имена ваших коллег. Вы захотели отсортировать вашу коллекцию, написав Collections.sort(
ваш ArrayList с именами
), хорошо. Оно их действительно отсортирует, но как?String реализует интерфейс Comparable (
сравнимый, который поддается сравнению
). В этом методе описывается как именно объекты должны сравниваться друг с другом. Поскольку это строка, объекты класса String сравниваются лексикографически, если не ошибаюсь, то есть по алфавиту.Другое дело, мы создали наш собственный клас, к примеру, Person (человек), и хотим как то их сравнивать, но как? Если мы создадим список наших объектов, и захотим их отсортировать у нас будет ошибка, так как метод
sort
не будет знать как именно это делать. Для этого и существует интерфейс Comparable.(№1) Мы создали класс Person, у него есть поле height, за которым будет производится сравнивание. Имплементируем метод compareTo(), он возвращает целое число. Единица, если текущий объект больше за другой, 0 если объекты равны, -1 если текущий объект меньше.
То есть этим методом мы показываем как именно и за каким "свойством" будут сравнивается объекты "нашего" типа.
(№2) Тестируем сортировку объектов нашего класса.
#java
Разница между equals() и compareTo()
♨️ При реализации интерфейсного метода Comparable compareTo, мы решаем как именно наши объекты будут сравниваться с друг с другом.
♨️В свою очередь, equals просто говорит нам, равны ли 2 объекта.
Разница между equals() и compareTo()
⟡
Метод equals() проверяет объекты на равенство, то есть возвращает просто логическое значение - true/false.⟡
compareTo() сравнивает объекты, и возвращает 0 если объекты равны, 1(или другое положительное число) если объект больше другого объекта, -1(или другое отрицательное число) - объект меньше другого объекта.♨️ При реализации интерфейсного метода Comparable compareTo, мы решаем как именно наши объекты будут сравниваться с друг с другом.
♨️В свою очередь, equals просто говорит нам, равны ли 2 объекта.
#python
6 хитростей Python, о которых никто не рассказывает новичкам
1. Выбор случайного элемента из последовательности элементов
2. Распаковка элементов с помощью *
3. Использование set для оптимизации различных операций
4. Просмотр атрибутов и методов класса в интерпретаторе Python
5. Операции со срезами
6. Вызов отладчика 10-символьной командой
Функцией breakpoint() можно пользоваться в Python 3.6+. Она инициирует запуск сессии pdb.set_trace().
6 хитростей Python, о которых никто не рассказывает новичкам
1. Выбор случайного элемента из последовательности элементов
import random as r
my_list = [1, 2, 3, "go"]
print(r.choice(my_list))
2. Распаковка элементов с помощью *
my_list = [1, 2, 3, 5, 7]
print(*my_list) # 1 2 3 5 7
3. Использование set для оптимизации различных операций
def eliminate_duplicates(lst):
"""
Возвращает отсортированный список, не содержащий дубликатов
"""
new_list = list(set(lst))
new_list.sort()
return new_list
list1 = [25, 12, 11, 4, 12, 12, 25]
print(eliminate_duplicates(list1))
4. Просмотр атрибутов и методов класса в интерпретаторе Python
string = "A string"
print(dir(string))
5. Операции со срезами
lst = ["Fun", "is", "Programming"]
lst = lst[::-1]
print(lst) # ['Programming', 'is', 'Fun']
# Инвертирование строки
string = "Dog running on the park"
string = string[::-1]
print(string) # krap eht no gninnur goD
6. Вызов отладчика 10-символьной командой
Функцией breakpoint() можно пользоваться в Python 3.6+. Она инициирует запуск сессии pdb.set_trace().
n_odds = 0
for i in range(1, 14, 2):
# Проверка значения i в каждой итерации
breakpoint()
# Если это условие выполняется - значит, нас что-то не устраивает
if i % 2 == 0:
n_odds += 1
print(n_odds)
#science #openSource
Если хотите стать частью истории, то вот ссылка на репозиторий вертолета от NASA
https://github.com/nasa/fprime
https://github.blog/2021-04-19-open-source-goes-to-mars/
Если хотите стать частью истории, то вот ссылка на репозиторий вертолета от NASA
https://github.com/nasa/fprime
https://github.blog/2021-04-19-open-source-goes-to-mars/
GitHub
GitHub - nasa/fprime: F´ - A flight software and embedded systems framework
F´ - A flight software and embedded systems framework - nasa/fprime
#java
Что такое атомарность в Java?
Как можно определить атомарность?
Атомарность операции чаще всего принято обозначать через ее признак неделимости: операция может либо примениться полностью, либо не примениться вообще. Хорошим примером будет запись значений в массив:
При использовании метода nonAtomic существует вероятность того, что какой-то поток обратится к array[0] в тот момент, когда array[0] не проинициализирован, и получит неожиданное значение. При использовании probablyAtomic (при том условии, что массив сначала заполняется, а уже потом присваивается. Такого быть не должно: array всегда содержит либо null, либо проинициализированный массив, но в array[0] не может содержаться что-то, кроме 1. Эта операция неделима, и она не может примениться наполовину, как это было с nonAtomic - только либо полностью, либо никак, и весь остальной код может спокойно ожидать, что в array будет либо null, либо значения, не прибегая к дополнительным проверкам.
Кроме того, под атомарностью операции зачастую подразумевают видимость ее результата всем участникам системы, к которой это относится (в данном случае - потокам); это логично, но, на мой взгляд, не является обязательным признаком атомарности.
Почему это важно?
Атомарность зачастую проистекает из бизнес-требований приложений: банковские транзакции должны применяться целиком, билеты на концерты заказываться сразу в том количестве, в котором были указаны, и т.д.
Что такое атомарность в Java?
Как можно определить атомарность?
Атомарность операции чаще всего принято обозначать через ее признак неделимости: операция может либо примениться полностью, либо не примениться вообще. Хорошим примером будет запись значений в массив:
При использовании метода nonAtomic существует вероятность того, что какой-то поток обратится к array[0] в тот момент, когда array[0] не проинициализирован, и получит неожиданное значение. При использовании probablyAtomic (при том условии, что массив сначала заполняется, а уже потом присваивается. Такого быть не должно: array всегда содержит либо null, либо проинициализированный массив, но в array[0] не может содержаться что-то, кроме 1. Эта операция неделима, и она не может примениться наполовину, как это было с nonAtomic - только либо полностью, либо никак, и весь остальной код может спокойно ожидать, что в array будет либо null, либо значения, не прибегая к дополнительным проверкам.
Кроме того, под атомарностью операции зачастую подразумевают видимость ее результата всем участникам системы, к которой это относится (в данном случае - потокам); это логично, но, на мой взгляд, не является обязательным признаком атомарности.
Почему это важно?
Атомарность зачастую проистекает из бизнес-требований приложений: банковские транзакции должны применяться целиком, билеты на концерты заказываться сразу в том количестве, в котором были указаны, и т.д.
#Spring #backEnd #java
Spring: @Component против @Bean
@Component и @Bean делают две совершенно разные вещи, и их не следует путать.
@Component (а также @Service и @Repository ) используются для автоматического обнаружения и автоматической настройки бобов с помощью сканирования classpath. Существует неявное отображение one-to-one между аннотированным классом и Бобом (то есть один боб на класс). Управление проводкой при таком подходе довольно ограничено, поскольку оно носит чисто декларативный характер.
@Bean используется для явного объявления одного компонента, а не позволяет Spring делать это автоматически, как описано выше. Он отделяет объявление Боба от определения класса.
Spring: @Component против @Bean
@Component и @Bean делают две совершенно разные вещи, и их не следует путать.
@Component (а также @Service и @Repository ) используются для автоматического обнаружения и автоматической настройки бобов с помощью сканирования classpath. Существует неявное отображение one-to-one между аннотированным классом и Бобом (то есть один боб на класс). Управление проводкой при таком подходе довольно ограничено, поскольку оно носит чисто декларативный характер.
@Bean используется для явного объявления одного компонента, а не позволяет Spring делать это автоматически, как описано выше. Он отделяет объявление Боба от определения класса.