Русский
Русский
English
Статистика
Реклама

Я пиарюсь

К вопросу о личной эффективности

05.06.2021 00:21:43 | Автор: admin

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

Но разве таков действующий механизм успеха?

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

Так работают человеческие отношения, так работают экономика и бизнес. Можно получить желаемое, лишь дав что-то желаемое другим. И это первично в эффективности.

Сколько стоит личная эффективность отдельного индивида в деньгах? Другими словами, сколько индивид может за нее получить от людей, общества и государства? Как она монетизируется?

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

Вариант 1

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

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

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

Вариант 2

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

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

Вариант 3

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

В заключение

Личная эффективность человека основана на степени его полезности людям (напрямую или опосредованно) и определяет, в конечном итоге, его доход.

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

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

Реализация человеком своей эффективности зависит еще от оказаться в нужном месте в нужное время. Но оказаться там - тоже личная эффективность!

Подробнее..

Как удвоить эффективность сотрудника при помощи цифровизации

11.06.2021 12:20:14 | Автор: admin

Всем привет!

На связи Алексей Кузнецов CEO брендингового агентства Kuznets. В этой статье я расскажу о том, как обезопасить сотрудников от выгорания и увеличить без найма штат в два раза.

Занимаясь развитием крупных брендов, увеличивая их ценность и вес на рынке, я наблюдаю за тем, как лидирующие компании усиливают свой успех. Это происходит за счёт технологий и автоматизации процессов. Часто этому способствуют HR-порталы, которые ещё в недалёком 2014 были новым веянием, а теперь стали мастхэвом.

Однажды крупная компания обратилась к нам с бизнес-задачей ежегодный рост EBITDA (прибыль до вычета процентов) на 10-15% в ближайшие 5 лет без найма новых сотрудников. Как решить эту задачу не увеличивая штат? Ответ есть цифровизовать предприятие.

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

При чем тут цифровизация?

Цифровизация способна удвоить, а то и утроить эффективность. Если у каждого сотрудника появится цифровой помощник второе цифровое я, то он:

  • уберёт ошибки;

  • автоматизирует рутинные процессы, которые занимают много времени;

  • передаст массу дополнительных знаний и инструментов.

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

Если коллеги находятся на разных этажах огромного здания, то сходить несколько раз за день туда-обратно с 1 на 9 этаж, казалось бы, несложно и занимает всего минут 30 в сумме. Но за год работы эти 30 минут превращаются в 126 часов рабочего времени одного человека. Это больше трёх рабочих недель чистого времени!

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

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

Это привело к тому, что окупаемость вложений снизилась до 3-5 лет. Возврат инвестиций стал быстрее.

Экономическая эффективность

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

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

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

Портал как якорь спасения

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

Сотрудники, выходя на пробежку вне работы, вовлекаются в соревновательность со своими коллегами и объединяются вокруг общей цели сделать свой регион самым быстрым.

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

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

Разработанный HR-портал позволил: управлять развитием сотен тысяч человек в одиночку, модерировать бюджеты, планировать обучение и проводить годовое ревью. Раньше над этим трудился десяток человек, занятых на fulltime с переработками, а теперь их заменяет пара сотрудников. Если помножить это на зарплаты, годы и человеко-часы, то цифры приятно удивят.

А вы в цифре?

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

  1. В вашей компании есть оцифрованные процессы, и вы работаете исключительно по ним;

  2. У вас есть примеры, когда за последние 2-3 года цифровые элементы позволили оптимизировать штат сотрудников;

  3. В постоянном использовании компании есть корпоративные инструменты взаимодействия людей на расстоянии (например, на уровне процессов внедрён Telegram или Zoom);

  4. У вас существуют цифровые системы обучения и развития сотрудников;

  5. Есть корпоративный новостной портал или корпоративная социальная сеть, в которую вовлечены сотрудники.

  6. Часть штата компании работает удалённо на постоянной основе. Есть регламенты удалённого взаимодействия.

Совпало? Поздравляю, вы восхитительны!

Редактор: Наумкина Карина.

Подробнее..

Передача и вызов лямбд на сервере и отказаться от dockerdeploy

26.04.2021 18:04:48 | Автор: admin

При разработке клиент-серверного приложения, у меня всегда появляется вопрос, а как я его буду разворачивать на сервере, упаковать его в jar/war/docker после написания кода, а потом еще надо передать на сервер, и еще много сделать телодвижений чтоб просто засунуть кусок кода на сервере.

Было бы хорошо просто передать на сервер код, как лямбду, так же как мы передаем лямбду в функцию, так же на сервер ее передать.

Но у меня появилась мысль как сделать этот процесс проще, и у меня что-то получилось.

1 | var query = TcpQuery2 |    .create(IEnv.class).host("myserver.com").port(9988)3 |      .build();4 |5 |  query.apply( 6 |      env -> env.processes().stream().filter(7 |          p -> p.getName().contains("java")8 |      )9 |      .collect(Collectors.toList())10|  ).forEach(System.out::println);

Вот код на java,

  • Строки с 1 по 5 включительно и 10 - работают на клиенте

  • А строки с 6 по 9 (тело лямбды env->...) работают на сервере

И это не псевдокод, это реальный рабочий код на Java (11).

Действительно код строк с 6 по 9 (само тело лямбды) передаются на сервер и исполняются на сервере, при том сервер о этом куске кода ничего не знает, он принимает этот код исполняет у себя, и отдает обратно клиенту - а я дальше продолжаю писать код без всякого deploy, не выходя из IDE (Idea/Eclipse/etc...).

Статья будет о том, что такое Serializable Lambda в Java, и как передавать байт-код таких лямбд на сервер, без перезапуска сервера, т.е. как можно в теории отказаться от привычных схем deploy приложений и писать более удобный api (это моя фантазия).


Допустим у нас есть такой интерфейс IEnv:

public interface IEnv {List<OsProc> processes();}

Который возвращает список процессов

public class OsProc implements Serializable {public Optional<Integer> getPpid(){ return ... }public int getPid(){ return ... }public void setPid(int pid){ ... }public String getName(){ return ... }public Optional<String> getCmdline(){ return ... }}

И вот таких простым способом я передаю лямбду на сервер

var query = TcpQuery   .create(IEnv.class).host("myserver.com").port(9988) .build();  query.apply( env -> env.processes().stream().filter(     p -> p.getName().contains("java") ) .collect(Collectors.toList()) ).forEach(System.out::println);

Введение - как это работает ?

При разработке клиентского приложения на Java

  1. Мы создаем набор исходных файлов, допустим Client.java

  2. Компилятор генерирует байт-код - файл Client.class

  3. При вызове query.apply() - мы передаем ссылку на лямбду env -> env.proc...toList())

  4. Реализация query.apply():

    1. Принимает ссылку на лямбду

    2. Для лямбды обнаруживает имя класса (например Client) и метода (например lambda1) реализующего лямбду

    3. Отыскивает среди ресурсов программы соответствующий байт-код класса (Client.class) и его метода

    4. Загружает байт-код реализации лямбды и отправляет его на сервер

      1. Сервер принимает байт-код лямбды

      2. Генерирует в памяти класс в который вставляет принятый байт-код

      3. Загружает этот класс в память и через рефлексию получает доступ к лямбде

      4. Возвращает идентификатор этого метода обратно

    5. Принимает идентификатор метода и делает вызов его на сервере

      1. Сервер выполняет ранее скомпилированный класс/метод/лямбду

      2. Возвращает результат выполнения

    6. Принимает результат серверного вызова и возвращает его как результат локального вызова

  5. Возврат результата вызова query.apply()

Далее в статье будет рассмотрено я на примере очень простой библиотеки покажу, как запустить свои наработки в режиме клиент-сервера, и писать клиентов без выхода из IDE и перезапуска серверов.

Как воспользоваться?

Что бы с этим по играть, воспользуйтесь моим pet project-ом:

v 1.0 https://github.com/gochaorg/trambda/releases/tag/1.0

maven

<dependency>  <groupId>xyz.cofe</groupId>  <artifactId>trambda</artifactId>  <version>1.0</version>  <type>pom</type></dependency><dependency>  <groupId>xyz.cofe</groupId>  <artifactId>trambda-core</artifactId>  <version>1.0</version></dependency><dependency>  <groupId>xyz.cofe</groupId>  <artifactId>trambda-tcp</artifactId>  <version>1.0</version></dependency>

Чтобы воспользоваться, у вас должна быть какая нибудь библиотека к которой вы хотите обращаться по сети (TCP)

В моем примере это будет очень простая библиотека, в ней всего три файла:

  • OsProc.java - описывает процесс ОС (описание было выше)

  • IEnv.java - Интерфейс получения списка процессов для ОС (описание было выше)

  • LinuxEnv.java - Получение списка процессов для ОС Linux - реализация IEnv

Библиотека из примера работает так:

package xyz.cofe.trambda.demo.api;import org.junit.jupiter.api.Test;public class LinuxEnvTest {   @Test   public void test(){       var env = new LinuxEnv();       env.processes().stream()           .filter(p->p.getName().equalsIgnoreCase("java"))           .forEach(System.out::println);   }}

LinuxEnv - это простой класс, он устроен так:

package xyz.cofe.trambda.demo.api;import java.util.ArrayList;import java.util.List;import xyz.cofe.io.fs.File;public class LinuxEnv implements IEnv {   @Override   public List<OsProc> processes(){       ArrayList<OsProc> procs = new ArrayList<>();       File procDir = new File("/proc");       procDir.dirList().stream()           .filter( d -> d.getName().matches("\\d+") && d.isDir() )           .map(OsProc::linuxProc)           .forEach(procs::add);       return procs;   }}

Код его тривиален, он сканирует каталог /proc и находит описание процесса ОС, (для Linux все процессы сервера отображаются в виде файлов/подкаталогов /proc)

Скомпилируем библиотеку (или возьмем свою)

Клонируем репозиторий (git commit 67ec260)

> git clone https://github.com/gochaorg/trambda.gitКлонирование в trambda...remote: Enumerating objects: 978, done.remote: Counting objects: 100% (978/978), done.remote: Compressing objects: 100% (464/464), done.remote: Total 978 (delta 308), reused 862 (delta 195), pack-reused 0Получение объектов: 100% (978/978), 715.70 KiB | 559.00 KiB/s, готово.Определение изменений: 100% (308/308), готово.

Собираем библиотеку для демонстрации

user@user-Modern-14-A10RB:22:10:35:~/Загрузки/sample-tr:> cd trambda/trambda-demo/tr-demo-api/user@user-Modern-14-A10RB:22:10:49:~/Загрузки/sample-tr/trambda/trambda-demo/tr-demo-api:> mvn clean package install...[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time:  13.933 s[INFO] Finished at: 2021-04-18T22:11:11+05:00[INFO] ------------------------------------------------------------------------

В каталоге target должен оказаться файл jar с нашей библиотекой

user@user-Modern-14-A10RB:22:13:13:~/Загрузки/sample-tr/trambda/trambda-demo/tr-demo-api:> ll target/итого 48drwxrwxr-x 10 user user 4096 апр 18 22:11 ./drwxrwxr-x  4 user user 4096 апр 18 22:11 ../drwxrwxr-x  3 user user 4096 апр 18 22:11 classes/drwxrwxr-x  3 user user 4096 апр 18 22:11 generated-sources/drwxrwxr-x  3 user user 4096 апр 18 22:11 generated-test-sources/drwxrwxr-x  2 user user 4096 апр 18 22:11 maven-archiver/drwxrwxr-x  3 user user 4096 апр 18 22:11 maven-status/drwxrwxr-x  4 user user 4096 апр 18 22:11 site/drwxrwxr-x  2 user user 4096 апр 18 22:11 surefire-reports/drwxrwxr-x  3 user user 4096 апр 18 22:11 test-classes/-rw-rw-r--  1 user user 6337 апр 18 22:11 tr-demo-api-1.0-SNAPSHOT.jar

Запуск сервера

Теперь когда библиотека собрана копируем сервер с github и распаковываем архив

user@user-Modern-14-A10RB:22:37:25:~/Загрузки/sample-tr:> wget https://github.com/gochaorg/trambda/releases/download/1.0/trambda-tcp-serv-cli.zip--2021-04-18 22:37:31--  https://github.com/gochaorg/trambda/releases/download/1.0/trambda-tcp-serv-cli.zipРаспознаётся github.com (github.com)... 140.82.121.4Подключение к github.com (github.com)|140.82.121.4|:443... соединение установлено.HTTP-запрос отправлен. Ожидание ответа... 302 FoundАдрес: https://github-releases.githubusercontent.com/350075998/47380d00-9b40-11eb-90a4-4e353f42e67c?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20210418%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210418T173731Z&X-Amz-Expires=300&X-Amz-Signature=97ade1f58bfbe1eaa320805179987e8c4df730b9f5eddf24c05662fb676caafe&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=350075998&response-content-disposition=attachment%3B%20filename%3Dtrambda-tcp-serv-cli.zip&response-content-type=application%2Foctet-stream [переход]--2021-04-18 22:37:31--  https://github-releases.githubusercontent.com/350075998/47380d00-9b40-11eb-90a4-4e353f42e67c?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20210418%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210418T173731Z&X-Amz-Expires=300&X-Amz-Signature=97ade1f58bfbe1eaa320805179987e8c4df730b9f5eddf24c05662fb676caafe&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=350075998&response-content-disposition=attachment%3B%20filename%3Dtrambda-tcp-serv-cli.zip&response-content-type=application%2Foctet-streamРаспознаётся github-releases.githubusercontent.com (github-releases.githubusercontent.com)... 185.199.111.154, 185.199.108.154, 185.199.109.154, ...Подключение к github-releases.githubusercontent.com (github-releases.githubusercontent.com)|185.199.111.154|:443... соединение установлено.HTTP-запрос отправлен. Ожидание ответа... 200 OKДлина: 12107487 (12M) [application/octet-stream]Сохранение в: trambda-tcp-serv-cli.ziptrambda-tcp-serv-cli.zip                                    100%[========================================================================================================================================>]  11,55M  3,75MB/s    за 3,1s    2021-04-18 22:37:35 (3,75 MB/s) - trambda-tcp-serv-cli.zip сохранён [12107487/12107487]user@user-Modern-14-A10RB:22:37:35:~/Загрузки/sample-tr:> llитого 11836drwxrwxr-x  3 user user     4096 апр 18 22:37 ./drwxr-xr-x 11 user user     4096 апр 18 22:00 ../drwxrwxr-x 10 user user     4096 апр 18 22:10 trambda/-rw-rw-r--  1 user user 12107487 апр 12 03:36 trambda-tcp-serv-cli.zipuser@user-Modern-14-A10RB:22:37:42:~/Загрузки/sample-tr:> unzip trambda-tcp-serv-cli.zip Archive:  trambda-tcp-serv-cli.zip   creating: trambda-tcp-serv-cli/   creating: trambda-tcp-serv-cli/jars/  inflating: trambda-tcp-serv-cli/jars/asm-9.1.jar    inflating: trambda-tcp-serv-cli/jars/jline-2.14.6.jar    inflating: trambda-tcp-serv-cli/jars/iofun-1.0.jar    inflating: trambda-tcp-serv-cli/jars/groovy-swing-3.0.7.jar    inflating: trambda-tcp-serv-cli/jars/groovy-console-3.0.7.jar    inflating: trambda-tcp-serv-cli/jars/groovy-xml-3.0.7.jar    inflating: trambda-tcp-serv-cli/jars/trambda-tcp-serv-cli-1.0.jar    inflating: trambda-tcp-serv-cli/jars/ecolls-1.10.jar    inflating: trambda-tcp-serv-cli/jars/trambda-core-1.0.jar    inflating: trambda-tcp-serv-cli/jars/slf4j-api-1.7.25.jar    inflating: trambda-tcp-serv-cli/jars/asm-tree-9.1.jar    inflating: trambda-tcp-serv-cli/jars/asm-util-9.1.jar    inflating: trambda-tcp-serv-cli/jars/fs-1.2.jar    inflating: trambda-tcp-serv-cli/jars/logback-classic-1.2.3.jar    inflating: trambda-tcp-serv-cli/jars/trambda-tcp-1.0.jar    inflating: trambda-tcp-serv-cli/jars/groovy-groovysh-3.0.7.jar    inflating: trambda-tcp-serv-cli/jars/groovy-templates-3.0.7.jar    inflating: trambda-tcp-serv-cli/jars/asm-analysis-9.1.jar    inflating: trambda-tcp-serv-cli/jars/text-1.0.jar    inflating: trambda-tcp-serv-cli/jars/logback-core-1.2.3.jar    inflating: trambda-tcp-serv-cli/jars/groovy-3.0.7.jar    inflating: trambda-tcp-serv-cli/jars/cbuffer-1.3.jar     creating: trambda-tcp-serv-cli/bin/  inflating: trambda-tcp-serv-cli/bin/trambda-tcp-serv.bat    inflating: trambda-tcp-serv-cli/bin/trambda-tcp-serv  user@user-Modern-14-A10RB:22:37:50:~/Загрузки/sample-tr:> rm trambda-tcp-serv-cli.zip 

После копируем нашу библиотеку в каталог trambda-tcp-serv-cli/jars

ser@user-Modern-14-A10RB:22:40:47:~/Загрузки/sample-tr:> cp -v trambda/trambda-demo/tr-demo-api/target/tr-demo-api-1.0-SNAPSHOT.jar trambda-tcp-serv-cli/jars/'trambda/trambda-demo/tr-demo-api/target/tr-demo-api-1.0-SNAPSHOT.jar' -> 'trambda-tcp-serv-cli/jars/tr-demo-api-1.0-SNAPSHOT.jar'

Нам понадобиться подготовить скрипт запуска, скрипт на языке groovy (не беспокойтесь, это не обязательно именно так запускать, все можно сделать на голой Java)

Возьмем скрипт из примера:

> cat trambda/trambda-tcp-serv-cli/src/test/samples/sample-1.groov
// Сервис xyz.cofe.trambda.demo.api.LinuxEnv // будет запущен на порту 9988, и будет доступен с любого IPapp.service( "0.0.0.0:9988", new xyz.cofe.trambda.demo.api.LinuxEnv() ) {    daemon false    // Указываем настройки безопасности    security {        // Какие API/Методы будут доступны извне        allow {            // method("System") {            //     methodOwner ==~ /java.lang.System/ && methodName in ['gc']            // }            // field( "System.out" ) {            //     fieldOwner ==~ /java.lang.System/ && fieldName in ['out','in','err'] && readAccess            // }            invoke( 'Java compiler' ){                methodOwner ==~ /java\.lang\.invoke\.(LambdaMetafactory|StringConcatFactory)/            }            invoke( 'Java collections' ){                methodOwner ==~ /java\.util\.(stream\.(Stream|Collectors)|(List))/            }            invoke( 'Java lang' ){                methodOwner ==~ /java\.lang\.String/            }            invoke( 'Api '){                methodOwner ==~ /xyz\.cofe\.trambda\.demo\.api\.(IEnv|OsProc)/            }        }        // Для всех остальных случаев - запрещаем вызов        deny {            any("ban all")        }    }}

Запускаем сервер

user@user-Modern-14-A10RB:22:56:08:~/Загрузки/sample-tr:> bash ./trambda-tcp-serv-cli/bin/trambda-tcp-serv -s trambda/trambda-tcp-serv-cli/src/test/samples/sample-1.groovy# [main] INFO  x.c.t.tcp.serv.cli.TcpServerCLI - starting xyz.cofe.trambda.tcp.serv.cli.TcpServerCLI # [main] INFO  x.c.t.tcp.serv.cli.TcpServerCLI - executeScript( "trambda/trambda-tcp-serv-cli/src/test/samples/sample-1.groovy", UTF-8 ) # [main] INFO  x.c.t.tcp.serv.cli.TcpServerCLI - registry class xyz.cofe.trambda.demo.api.LinuxEnv on 0.0.0.0:9988 # [main] INFO  x.c.t.tcp.serv.cli.TcpServerCLI - starting service xyz.cofe.trambda.demo.api.LinuxEnv@55e7a35c on /0.0.0.0:9988 # [main] DEBUG x.c.t.tcp.serv.cli.TcpServerCLI - create server socket # [main] DEBUG x.c.t.tcp.serv.cli.TcpServerCLI - bind server socket /0.0.0.0:9988 # [main] DEBUG x.c.t.tcp.serv.cli.TcpServerCLI - server started 

Все, сервер запущен, теперь можем им пользоваться

Запуск клиента

Клиента можно взять из примера (ClientTest.java)

package xyz.cofe.trambda.demo.client;import java.util.stream.Collectors;import org.junit.jupiter.api.Test;import xyz.cofe.trambda.demo.api.IEnv;import xyz.cofe.trambda.tcp.TcpQuery;public class ClientTest {   @Test   public void test01(){       var query = TcpQuery           .create(IEnv.class).host("localhost").port(9988)           .build();       query.apply(           env -> env.processes().stream().filter(p ->               p.getName().contains("java"))           .collect(Collectors.toList())       ).forEach(System.out::println);   }}

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

Что происходит на сервере ?

часть логов я опущу - т.к. для пояснения работы они не важны

Настройка безопасности сервера

Совсем не обязательно использовать сервер через скрипты запуска, сервер можно встроить как часть своего приложения и настраивать так:

// Создание TCP сокетаServerSocket ssocket = new ServerSocket(port);// Настраиваем сокетssocket.setSoTimeout(1000*5);// Создаем серверserver = new TcpServer<IEnv>(    // Передаем сокет    ssocket,        // Передаем функцию получения сервиса для новой сессии    s -> new LinuxEnv(),        // Настраиваем безопасность    SecurityFilters.create(s -> {                // Разрешаем вызовы строго - определенных методов         s.allow( a -> {                        // Публикуемый API нашего сервиса             a.invoke("demo api", c->                c.getOwner().matches(                    "xyz\\.cofe\\.trambda\\.tcp\\.demo\\.([\\w\\d]+)"));                        // Работа с коллекциями            a.invoke("java collections api", c->c.getOwner().matches(                "java\\.util\\.(List)|java\\.util\\.stream\\.([\\w\\d]+)"));                        // Работа с Java строками            a.invoke("java lang api", c->                c.getOwner().matches("java\\.lang\\.(String)"));                        // Методы которые использует компилятор Java            a.invoke("java compiler", c->                c.getOwner().matches(                    "java\\.lang\\.invoke\\.(LambdaMetafactory|StringConcatFactory)"));        });                // Все остальное запрещаем        s.deny().any("by default");    }));// Указываем что Thread сервера будет запущен как фоновыйserver.setDaemon(true);// Запускаем серверserver.start();// Создание TCP сокетаServerSocket ssocket = new ServerSocket(port);// Настраиваем сокетssocket.setSoTimeout(1000*5);

Код приведенный выше вроде кажется понятным, но наверно следует дать несколько пояснений

  • Правила проверки безопасности указываются в виде списка фильтров

  • Список фильтров обрабатывается последовательно и соответственно первые правила имеют более высокий приоритет, нежели последние

  • В списке могут быть как разрешающие, так и запрещающие правила

  • Java компилятор генерирует

    • вызовы LambdaMetafactory когда вы используете лямбды в своем коде

    • вызовы StringConcatFactory когда вы применяете оператор + к строкам

  • Вы также можете контролировать обращения к полям класса на чтения/запись - см. SecurityFilters.java / PredicateBuilder#field

  • Для доступа к стандартным функция, там даже как Object.toString() то, же надо будет задать правила доступа

Более подробную информацию о работе можно найти на странице проекта, например на github или git pages

Чем это может быть полезно?

Резонный вопрос, чем может быть полезно и чем оно отличаеться от уже существующих, например RMI, gRPC ? Давайте рассмотрим отличия

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

  • Передача данных

    • Строго ограниченные форматы данных / типы данных

    • Гибкие форматы данных / комбинированные/структурированные типы данных

  • Передача программного кода

    • Ограничения на алгоритмы

      • Простые выражения

      • Циклы/ветвления

      • Процедуры/функции/объекты

      • Ограничения на интерпретацию алгоритмов

      • Слабая типизация

      • Строгая типизация

    • Безопасность

      • авторизация и т.д.

      • время исполнения

      • и т.д.

  • Поддержка существующий решений

    • Потребность в перезапуске серверов, что бы опробовать новые решения

    • Возможность на ходу опробовать новые решения

    • Профилирование выполнения

Фича

Java-RMI

SOAP

REST-JSON

SQL

GraphQL

Hadoop

Передача данных

+

+

+

+

+

+

Строго ограниченные форматы данных

+/-

+/-

-

-

+

-

Гибкие форматы данных

+/-

+/-

+

+

-

+

Передача программного кода

-

-

-

+

-

+

Простые выражения

-

-

-

+

-

+

Циклы/ветвления

-

-

-

+

-

+

Процедуры/функции

-

-

-

+

-

+

программные объекты

-

-

-

?

-

?

Слабая типизация

-

-

+

-

-

+

Строгая типизация

+

+

-

+

+

-

авторизация

+

+

+

+

+

+

время исполнения

?

?

?

+/-

?

?

Потребность в перезапуске серверов

+

+

?

-

+

-

Возможность находу опробывать новые решения

-

-

?

+

-

+

Профилирование выполнения

+

+

?

+

+

?

  • Большинство протоколов ориентированы только на передачу данных (Java-RMI, SOAP, REST-JSON, GraphQL)

    • Часть из них работают со строго типизированными данными (Java-RMI, SOAP, GraphQL)

    • Другие (REST-JSON, Hadoop) со слабо типизированными

  • Небольшое кол-во протоколов поддерживают еще передачу программного кода (SQL, Hadoop)

Наличие строгой типизации и передачу программного кода из рассмотренных есть только в SQL

В предлагаемом проекте есть следующие возможности, с оговорками

  • Передача данных (*)

    • Гибкие форматы данных / комбинированные / структурированные типы данных

  • Передача программного кода

    • Простые выражения

    • Циклы/ветвления

    • Процедуры/функции/

    • программные объекты (**)

  • Ограничения на интерпретацию алгоритмов

    • Строгая типизация

    • Безопасность (***)

  • Поддержка существующий решений

    • Возможность на ходу опробовать новые решения

    • Профилирование выполнения (****)

Оговорки

  • (*)

    • передаваемые типы должны быть Serializable

    • требуется апробация Proxy для интерфейсов

  • (**)

    • требуется апробация Proxy для объектов - очень неоднозначный вопрос

  • (***)

    • реализована проверка байт-кода, без учета текущего пользователя

    • не реализован механизм аутентификации, см план реализации

  • (****)

Область применения

Поскольку проект только начат, говорить о реальном применении рано, можно говорить о потенциальном применении

Возможны следующий области применения

  • фильтрация данных в программах написанных на Java по аналогии SQL WHERE (уже есть)

  • выполнение серверных процедур по аналогии RPC/RMI/SOAP/ (уже есть)

  • подписка клиента на события сервера

  • масштабирование нагрузки (как частный случай реализации сетевого протокола)

При дальнейшем развитии возможно автоматическая прозрачная трансляция JAVA/Kotlin/Scala кода в целевые системы (SQL, MongoDB, REST, )

Данное возможно при условии развития функции декомпиляции байт-кода в код AST/Java/, по факту такая функция реализована в декомпиляторе JAD

Что собственно ведет к уменьшению издержек при разработке ПО.

Как же оно внутри работает ?

Идея была проста, весь код Java который компилируется, обычно сохраняется в виде байт-кода который является файлом с расширением .class, а для любого объекта java можно узнать класс, обычно это выглядит так: obj.getClass()

Через объект Class можно узнать его название, и соответственно через Class.getResource(имя класса) можно получить URL ссылку на данный файл.

Гладко было на бумаге, но забыли про овраги

Такова была идея, но есть нюансы

Процесс разработки, как найти байт код?

Допустим у нас есть такой код

package xyz.cofe.trambda.l1;import java.util.function.Function;import org.junit.jupiter.api.Test;public class SimpleLambdaTest {   @Test   public void javaLambda01(){       Function<Function<String,String>,String> test = (f) -> {           System.out.println("f="+f.getClass());           return null;       };       test.apply( x -> x.repeat(4) );   }}

При выполнении теста будет вот это:

f=class xyz.cofe.trambda.l1.SimpleLambdaTest$$Lambda$235/0x0000000800142040

По идее у нас в каталоге test-classes/ должен быть файл SimpleLambdaTest$$Lambda$235, но такого файла не видно

user@user-Modern-14-A10RB:00:41:32:~/code/trambda/trambda-core/target/test-classes/xyz/cofe/trambda/l1:> llитого 12drwxrwxr-x 2 user user 4096 апр 25 00:40 ./drwxrwxr-x 5 user user 4096 апр 25 00:40 ../-rw-rw-r-- 1 user user 2162 апр 25 00:40 SimpleLambdaTest.class

Тогда посмотрим байт код

> javap -p SimpleLambdaTest.class Compiled from "SimpleLambdaTest.java"public class xyz.cofe.trambda.l1.SimpleLambdaTest {  public xyz.cofe.trambda.l1.SimpleLambdaTest();  public void javaLambda01();  private static java.lang.String lambda$javaLambda01$1(java.lang.String);  private static java.lang.String lambda$javaLambda01$0(java.util.function.Function);}

По факту где-то lambda$javaLambda01$1 или lambda$javaLambda01$0 находиться код нашей лямбды, но можно долго гадать, но это не наш подход

По факту сопоставить class и лямбду в Java с разбегу не удастся, а гадать это сразу путь на костыли.

В Java есть интересный интерфейс Serializable, и этим интерфейсом можно пометить лямбду

Например так

package xyz.cofe.trambda.l2;import java.io.Serializable;import java.util.function.Function;public interface Fn<A,Z> extends Function<A,Z> , Serializable {}

или вот так

Runnable r = (Runnable & Serializable)() -> System.out.println("Serializable!");

Фактически это заставит компилятор Java сгенерировать дополнительный код, давайте возьмем код теста выше и немного его модифицируем

package xyz.cofe.trambda.l2;import java.lang.invoke.SerializedLambda;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.function.Function;import org.junit.jupiter.api.Test;public class SerialLambdaTest {   @Test   public void serLambda01(){       Fn<Fn<String,String>,String> test = (lambda) -> {           System.out.println("lambda="+lambda.getClass());           Method writeReplace = null;           try{               writeReplace = lambda.getClass().getDeclaredMethod("writeReplace");               writeReplace.setAccessible(true);               SerializedLambda sl = (SerializedLambda) writeReplace.invoke(lambda);               System.out.println(sl);           } catch( NoSuchMethodException | InvocationTargetException | IllegalAccessException e ) {               e.printStackTrace();           }           return null;       };       test.apply( x -> x.repeat(4) );   }}

Теперь результат будет таким, его разбор будет ниже.

lambda=class xyz.cofe.trambda.l2.SerialLambdaTest$$Lambda$235/0x0000000800142040SerializedLambda[capturingClass=class xyz.cofe.trambda.l2.SerialLambdaTest, functionalInterfaceMethod=xyz/cofe/trambda/l2/Fn.apply:(Ljava/lang/Object;)Ljava/lang/Object;, implementation=invokeStatic xyz/cofe/trambda/l2/SerialLambdaTest.lambda$serLambda01$3fed5817$1:(Ljava/lang/String;)Ljava/lang/String;, instantiatedMethodType=(Ljava/lang/String;)Ljava/lang/String;, numCaptured=0]

А при просмотре байт кода мы увидим

user@user-Modern-14-A10RB:00:51:48:~/code/trambda/trambda-core/target/test-classes/xyz/cofe/trambda/l2:> javap -p SerialLambdaTest.class Compiled from "SerialLambdaTest.java"public class xyz.cofe.trambda.l2.SerialLambdaTest {  public xyz.cofe.trambda.l2.SerialLambdaTest();  public void serLambda01();  private static java.lang.Object $deserializeLambda$(java.lang.invoke.SerializedLambda);  private static java.lang.String lambda$serLambda01$3fed5817$1(java.lang.String);  private static java.lang.String lambda$serLambda01$47b6c34$1(xyz.cofe.trambda.l2.Fn);}

Первое что мы можем заметить - у нас появился метод $deserializeLambda$ пока не важно что делает этот метод, есть факт что добавление интерфейса Serializable меняет поведение компилятора.

java.lang.invoke.SerializedLambda - это final класс, который содержит ряд интересных свойств, а именно

  • String getImplClass() - Имя класса, содержащего метод реализации.

  • String getImplMethodName() - название метода реализации.

В stdout можно заметить фрагмент

implementation=invokeStatic xyz/cofe/trambda/l2/SerialLambdaTest.lambda$serLambda01$3fed5817$1:(Ljava/lang/String;)Ljava/lang/String;

И в байт коде:

private static java.lang.String lambda$serLambda01$3fed5817$1(java.lang.String);

Т.е. можно однозначно установить байт-код для лямбды

Сериализация байт кода

Теперь, на данном этапе прочесть байт код лямбды - дело техники, а именно так:

SerializedLambda sl = (SerializedLambda)writeReplace.invoke(lambda);var implClassName = sl.getImplClass()var implClassUrl =labmda.getClass().getResource("/"+implClassName.replace(".","/")+".class");

implClassUrl - указывает на файл класса содержащего байт код

получаем байт код из URL как массив байтов

byte[] classByteCode = null;try{   classByteCode = IOFun.readBytes(implClassUrl);} catch( IOException e ) {   throw new IOError(e);}

После этого передаем этот набор байтов в библиотеку ASM для прочтения байт кода

var classReader = new ClassReader(classByteCode);

и читаем байт код нужного метода

ClassVisitor cv = new ClassVisitor(Opcodes.ASM9) {   @Override   public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {       if( methName.equals(name) && descriptor!=null && descriptor.equals(methSign) ){           mdef0.set(new MethodDef(access,name,descriptor,signature,exceptions));           return dump(byteCodes::add);       }       return null;   }};cr.accept(cv, 0);

MethodVisior - это класс который получает байт код конкретного метода. Методы этого класса можно переопределить, рассмотрим часть реализации MethodDump extends MethodVisitor:

package xyz.cofe.trambda;public class MethodDump extends MethodVisitor implements Opcodes {...@Overridepublic void visitParameter(String name, int access){   emit(new MParameter(name,access));}@Overridepublic void visitInsn(int opcode){   emit(new MInsn(opcode));}...}

Данный класс принимает байт код через вызовы методов visitXXXX(...) - их много методов (по этому показа только часть)

При каждом вызове метода генерируется объект который описывает вызов, например для visitInsn( op ) генерируется new MInsn(op), а потом этот объект передается выше emit(..) где уже этот объект передается в сеть

Восстановление классов из байт кода

После этого как код передан по сети в виде набора объектов, эти объекты обратно собирается в байт код (с дополнительными проверками безопасности)

Для этого в моей библиотеке есть класс xyz.cofe.trambda.MethodRestore его работа заключается примерно в следующем

public synchronized byte[] generate(){  // генерируем имя целевого класса  binClassName = className.replace('.', '/');// Создаем ClassWriter (часть ASM) // в котором будем вызывать методы visitXXXX( op )var cw = new ClassWriter(ClassWriter.COMPUTE_MAXS|ClassWriter.COMPUTE_FRAMES);cw.visit(Opcodes.V11,   Opcodes.ACC_PUBLIC|Opcodes.ACC_SUPER,   binClassName,null,   "java/lang/Object", null);// генерация методаvar mv = cw.visitMethod(  acc, // флаги как static public  name, // имя метода  desc, // параметры метода  sign, // сигнатура если есть Generic параметры  excepts); // исключения которые может генерировать метод// Потом в цикле для каждого переданного объекта // генерируем соответствующий вызов visitXXXX()// генерируем код в той же последовательности, что и был прочитанfor( var bc : byteCodes ){   if( bc instanceof MCode )build((MCode) bc);   else if( bc instanceof MEnd )build((MEnd) bc);   else if( bc instanceof MLabel )build((MLabel) bc);   else if( bc instanceof MLineNumber )build((MLineNumber) bc);   else if( bc instanceof MVarInsn )build((MVarInsn) bc);  ...}// Получаем байт кодreturn cw.toByteArray();}// Вызов visitCode() - начало методаprotected void build(MCode code){ mv.visitCode(); }// Вызов visitEnd() - конец методаprotected void build(MEnd end){ mv.visitEnd(); }protected void build(MTypeInsn tinst){   mv.visitTypeInsn(tinst.getOpcode(), tinst.getOperand());}

Теперь когда у нас есть на сервере байт код, остается его загрузить и вызвать соответствующий метод

Для этого создаем свой ClassLoader

var byteCode = new MethodRestore()   .className(clName)   .methodName("lambda1")   .methodDef(mdef)   .generate();ClassLoader cl = new ClassLoader(ClassLoader.getSystemClassLoader()) {   @Override   protected Class<?> findClass(String name) throws ClassNotFoundException{       if( name!=null && name.equals(clName) ){           return defineClass(name,byteCode,0,byteCode.length);       }       return super.findClass(name);   }};

Загружаем класс

System.out.println("try read class "+clName);Class c = null;try{   c = Class.forName(clName,true,cl);   System.out.println("class found "+c);} catch( ClassNotFoundException e ) {   e.printStackTrace();   return;}

Ищем нужный нам метод класса

Method m = null;System.out.println("methods");for( var delMeth : c.getDeclaredMethods() ){  System.out.println(""+delMeth);  if( delMeth.getName().equals(methName) ){    m = delMeth;  }}

и вызываем его с параметрами

try{   Object arg0 = "abc";   System.out.println("call with "+arg0);   Object res = m.invoke(null, arg0);   System.out.println("result "+res);} catch( IllegalAccessException | InvocationTargetException e ) {   e.printStackTrace();}

Ограничения

Конечно у данного решения есть ряд ограничений

  1. Не для любого языка подойдет

    1. например для Kotlin придется дописывать реализацию, т.к. Kotlin по другому компилирует лямбды, такая же ситуация с Scala

    2. для динамических языков (Groovy, JavaScript) вообще наверно не подойдет - но там наверно можно и по другому передавать лямбды, например передавать AST дерево лямбд - все зависит от их представления промежуточного кода, чем бы это не являлось.

  2. Гарантировать типо безопасность - особенно когда разные версии библиотек на сервере и на клиенте - задача непростая, но еще не означает что невозможно

  3. Потенциально на клиенте может Java более новая, с другим байт-кодом нежели на сервере, сервер может не знать о каких либо конструкциях новой Java

  4. Библиотека не весь байт код передает, это связано с тем, что не весь байт код имеет объектное представление - наверно это решаемый вопрос, вопрос доработки.

  5. Отдельно - это вопрос передачи по сети

    1. Вопрос безопасности - технически это решаемо, но требует допиливание напильником

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

Подробнее..

Много ли у вас открытых вкладок?

20.01.2021 16:09:28 | Автор: admin
У меня в браузере обычно от 50 до 120. Иногда 200, в другой раз 15.

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

Это радикально упростило поиск и чтение статей. И даже волосы мои стали шелковистей. Ну т.е. стал продуктивней.

Откуда берется столько вкладок?


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

За раз получается просматривать много. Но одно из преимуществ такого подхода это возможность получить более полную картину из разных точек зрения.

Кроме того, читать сразу несколько статей по одной тематике намного легче, чем каждую статью по отдельности.

Что делает расширение?


Демо-видео вместо тысячи слов.


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

Чтобы вообще найти содержание страницы, используется адаптация Readability.js. Это версия библиотеки, которую Mozilla использует в Firefox, для показа страниц в режиме читателя.

К сожалению, Readability.js далеко не всегда находит содержание страниц. Поэтому для особо популярных ресурсов сделана отдельная предобработка.

Сейчас здесь: Reddit, HackerNews и YouTube.

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

Также есть отдельные ресурсы, страницы которых сортируются только по URL, если таких больше одной. Это страницы GitHub и GitLab. Т.о. вы получите группировку в соответствии с файловой структурой проектов.

Сделано специально для umputun. Ну почти.

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

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

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

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

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

Например, веб-приложения, почта, соц-сети. По умолчанию, сейчас сюда входят: Facebook, Netflix, Trello, Todoist, Inoreader, Feedly, Gmail и др. сервисы Google.

Если уж совсем нет желания, что-то показывать расширению, то в инкогнито-режиме его работа запрещена на уровне API браузера.

Поддержка браузерами


Расширение сейчас можно поставить для Firefox и Chrome.

Для Safari оно пока не доступно, не смотря на появление WebExtension API в 14-й версии. Там почему-то не добавили поддержку tabs.move(...), чтобы можно было автоматически перемещать вкладки.

Другие браузеры особе не проверялись, хотя, по идее, для Chromium-based браузеров может быть возможность поставить пакет для Chrome.

P.S.


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

В следующей части планирую рассказать о том, что остается за кулисами: о развитии идеи, управлении проектами и деталях разработки.
Подробнее..

CDD Cli Driven Development

03.04.2021 10:09:09 | Автор: admin

Все-таки самоизоляция не проходит бесследно. Сидишь себе дома, а в голову разные мысли приходят. Как, чем осчастливить человечество? И вот оно: CDD! (И еще PDD / SOLID / KISS / YAGNI / TDD / Bootstraping...)

1. CDD - Cli Driven Development - Новый подход

Немного истории

Как-то поручили мне сделать Cli в одном нашем embedded устройстве. Разумеется, C/C++ (пусть будет C++, раз ресурсов хватает). Конечно есть много Cli-фреймворков.

Но я сделал свой вариант.

Для Linux можно использовать <termios.h> и получать коды символов после установки свойств терминала:

signal(SIGINT, SIGINT_Handler); // Ctrl+Csignal(SIGTSTP, SIGTSTP_Handler); // Ctrl+Zint res_tcgetattr = tcgetattr(STDIN_FILENO, &terminal_state_prev);terminal_state_new = terminal_state_prev;terminal_state_new.c_lflag &= ~(ICANON | ECHO);int res_tcsetattr = tcsetattr(STDIN_FILENO, TCSANOW, &terminal_state_new);

Для Windows можно использовать <conio.h>.

Добавляем немного классов, делаем список команд, и добавляем команды по типу:

{ Cli_Command_Abstract_t *cmd = new Cli_Command_Abstract_t(Cli_Command_ID_help); cmd->Add(help_keyword); cmd->Help_Set("show this help, \"help full\" - show all available commands"); command_tree->Add(cmd);}

И все-бы ничего, пока команд 10-20. Ну пусть еще help / quit / debug cli (типа очень нужная команда - об этом позже). Интересно, что основной функционал уложился в 20 команд, а вот разные обвязки Управление SNMP / Syslog / NTP / Users / FTP / SSH / VLAN и у нас - 250 команд. Ух ты! Начинаются проблемы с монолитным приложением, и очень хочется разбить все на модули, желательно попроще и поменьше. И вот отсюда и начинается CDD - Cli Driven Development.

1.1 Использование Cli в различных типах приложений

Вообще, Cli, не смотря на GUI, используется во многих типах приложений: САПР, игры, базы данных, среды выполнения (Erlang, Lua и др.), IDE. Можно утверждать, что включение консоли могло бы сделать многие приложения более удобными (например, можно представить Paint с командной строкой: количество команд невелико, VBA будет лишним, но одна лишь возможность выполнения скриптов могла бы значительно изменить работу с программой).

1.2 Введение в CDD

Cli-интерфейс жив и развивается. Cisco-like - это вполне вполне рабочий термин.

Что же может современный Cli? - Довольно много:

  • развитую систему команд с выводом подробной информации, в том числе об аргументах команды;

  • группировку команд ("уровни");

  • задание группы объектов для управления ("параметры");

  • логгирование;

  • исполнение скриптов;

  • типизированный ввод данных с валидацией;

Я придумал еще одну функцию: debug cli - проверка команд (CMD_ID / CMD_Item / CMD_Handler)

  • может показать число ID ("задуманные команды"), Realized- и NotRealized-команды для каждого модуля; (В идеале счетчики ID, Realized должны быть равны, но если NotRealized не равен 0, то это еще один стимул для разработчика: ну осталось всего-то 30...20...5...2 нереализованных команд - неужели оставим так? может лучше доделать? - и это работает!)

1.3 Основные идеи CDD

Можно сформулировать основные идеи CDD:

  1. Если есть какой-то функционал, должны быть Cli-команды, обеспечивающие управление этим функционалом и команды получения информации о данном функционале. Не должно быть функционала без Cli-команд.

  2. Модульное построение: любой модуль можно убрать или заменить с предсказуемыми изменениями в функционале.

  3. Модули связываются только на самом верхнем уровне: все связи должны легко прослеживаться (фактически мы пользуемся тем, что приложений с полной связностью не существует / не может быть / мы должны избегать).

1.4 mCli - Реализация CDD

CDD использовано при построении mCli - Cli-фреймворка модульного типа (github.com/MikeGM2017/mCli). В текущем состоянии имеются события, типы и модули.

1.4.1 События mCli

В простейшем виде для ввода с клавиатуры нужно определение кода нажатой клавиши и (отдельно) определение нажатия Enter (ввод команды) и Ctrl+C (прерывание команды). В полном наборе необходимо определение нажатия Enter (ввод команды), Ctrl+C (прерывание команды), Up/Down (просмотр истории команд), Left/Right/Home/End (перемещение по строке ввода), Back/Delete (изменение строки ввода).

1.4.2 Типы mCli

mCli предполагает использование типов при вводе данных. В текущей реализации имеются следующие типы:

  • Word / Word_List / Word_Range (ключевые слова, List - можно ввести несколько ключевых слов через запятую, Range - выбор одного ключевого слова из нескольких вариантов)

  • Int / Int_List / Int_Range

  • Str

  • IP4 / IP6

  • MAC

  • Date / Time / DateTime

  • EQU_Range ( == != > < >= <= - для использования в скриптах, условное выполнение)

  • Rem (комментарий - для использования в скриптах)

1.4.3 Модули mCli

Модули mCli можно разделить на базовые, платформо-зависимые и кастомные.

Базовые модули:

  • Base_Quit (выход из приложения)

  • Base_Help (вывод информации по командам и их аргументам)

  • Base_Modules (вывод информации по задействованным модулям)

  • Base_History (история команд)

  • Base_Script (выполнение скриптов)

  • Base_Rem (комментарий, для использования в скриптах)

  • Base_Wait (пауза, для использования в скриптах)

  • Base_Log (управление логом)

  • Base_Debug (проверка списка команд, определение нереализованных команд)

  • Check (условное выполнение, для использования в скриптах)

Платформо-зависимые модули

Вывод:

  • Output_printf (Linux/Window)

  • Output_cout (Linux/Window)

  • Output_ncurses (Linux)

  • Output_pdcurses (Linux/Window)

Ввод:

  • Input_termios (Linux)

  • Input_conio (Window)

  • Input_ncurses (Linux)

  • Input_pdcurses (Linux/Window)

Кастомные модули:

  • ConfigureTerminal (демо: тестирование переменных)

  • SecureTerminal (демо: вход в модуль по паролю)

  • TestTerminal (демо: тестирование типов)

1.5 Объединение модулей в mCli

Связывание модулей происходит на самом верхнем уровне, например в функции main():

Cli_Modules Modules;// Modules Add - BeginModules.Add(new Cli_Module_Base_Rem(Str_Rem_DEF, Cli_Output));bool Cmd_Quit = false;Modules.Add(new Cli_Module_Base_Quit(Cmd_Quit));Str_Filter str_filter('?', '*');Modules.Add(new Cli_Module_Base_Help(User_Privilege, Modules, str_filter, Cli_Output));Modules.Add(new Cli_Module_Base_Modules(User_Privilege, Modules, str_filter, Cli_Output));Cli_History History;Modules.Add(new Cli_Module_Base_History(History, Cli_Output));Modules.Add(new Cli_Module_Base_Log(Cli_Input));bool Cmd_Script_Stop = false;int Script_Buf_Size = 1024;Modules.Add(new Cli_Module_Base_Script(History, Cli_Output,            Str_Rem_DEF, Cmd_Script_Stop, Cmd_Quit, Script_Buf_Size,            CMD_Processor));bool Log_Wait_Enable = true;bool Cmd_Wait_Stop = false;Modules.Add(new Cli_Module_Base_Wait(Log_Wait_Enable, Cmd_Wait_Stop, Cli_Input, Cli_Output));Modules.Add(new Cli_Module_Test_Tab_Min_Max());Modules.Add(new Cli_Module_Test_Terminal(Cli_Input, Cli_Output));Modules.Add(new Cli_Module_Base_Debug(User_Privilege, Modules, Levels, CMD_Processor, Cli_Output));Modules.Add(new Cli_Module_Check(Modules, Values_Map, str_filter, Cli_Output, Cmd_Script_Stop));// Modules Add - End

1.6 CDD и SOLID

SOLID в CDD достаточно легко обнаружить на уровне подключения и объединения модулей. Какие-то модули практически всегда используются, например Cli_Output нужен в большинстве модулей. Другие - гораздо реже (например, Cli_Input нужен только в модулях, в которых команда требует подтверждения).

Таким образом, SOLID в CDD - это:

  • S - каждый модуль отвечает за свой круг задач

  • O - здесь есть проблема: в каждом модуле есть enum Local_CmdID, и получается, что при наследовании список Local_CmdID не так просто расширить? Но в новом модуле мы можем завести новый enum Local_CmdID или (лучше) можно ввести новый enum Local_CmdID только для новых команд, стартующий с последнего элемента предыдущего enum (для этого можно использовать CMD_ID_LAST)

  • L - модуль может быть заменен на другой, с доработанной реализацией

  • I - при замене модуля может возникнуть ситуация, что потребуется больше (или меньше) связанных модулей; при создании экземпляра модуля это легко учесть (через конструктор или статический инициализатор)

  • D - модули связываются на верхнем уровне

1.7 CDD и KISS

В целом, набор команд любого модуля стремится к расширению: более удобный формат команд, новые флаги, новые возможности. Но сам список команд всегда доступен, и, если он сильно разрастается то просто делим модуль на 2 или более модуля!

На уровне модуля команды могут различаться флагами или дополнительными параметрами. Но реализация у них может быть одна. Например, "help" и "help full" реализуются одним методом, в качестве параметра принимающий строку фильтра - "*". Так что KISS сохраняется в таком смысле:

  • команда выполняется методом, имеющим несколько флагов (да, из-за этого метод делается чуть сложнее, зато несколько команд Cli могут выполняться однотипно).

1.8 CDD и DRY

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

1.9 CDD и YAGNI

Нужно убрать какой-то ненужный функционал? - Убираем ненужный модуль (или команды в модуле). За счет слабой связности модулей это несложно.

1.10 CDD и Bootstraping

В некоторых случаях (например, Embedded Baremetal) у нас есть только консоль. CDD может быть применено для разработки приложения "с нуля".

1.11 CDD и TDD

За счет наличия скриптов и модуля условного исполнения автоматизация тестирования сводится к следующему сценарию:

  • вручную вводится последовательность тестируемых команд;

  • история команд сохраняется в файле скрипта;

  • при необходимости скрипт редактируется / дополняется проверкой правильности выполнения;

  • вызов скрипта добавляется в общий скрипт тестирования или используется сам по себе;

1.12 CDD и GUI

А что GUI? GUI (да и Web - тоже) пусть посылает текстовые команды в Cli - эстетично, наглядно, надежно.

2. CDD и PDD

А вот еще и PDD!!!

2.1 PDD - Provocation Driven Development - еще один новый термин :)

Вообще, PDD - это то, что нас настигает постоянно. Допустим, есть путь, по которому мы идем к цели. Но на что нас провоцирует этот путь? Считаю, что мы должны осознавать это. Например, на что провоцируют языки программирования:

  • C провоцирует на нарушения доступа к памяти и на плохо контролируемые приведения типов;

  • C++ - на создание монолита (если за этим не следить, то имеем типовой пример: classMyCoolGame;myCoolGame.Run());

  • SQL, Lua - "все есть таблица";

  • Assembler - "стандартов нет";

  • Java - "щас понаделаем объектов";

  • JavaScript - "щас наподключаем библиотек, не самим же все делать"; и так далее - дополнительные примеры каждый, думаю, сможет придумать.

2.2 Что есть PDD для CDD?

В первую очередь - это тенденция на разбиение проекта на модули. Действительно:

  • Есть объект управления? - Выносим в модуль.

  • Есть повторяющийся код? - Выносим в модуль.

  • Новый функционал? - Добавляем новый модуль.

  • Новая архитектура? - Заменяем модули.

Описание команд - это текстовое описание функционала, фактически мы получаем DSL. Чтобы получить информацию о доступном функционале, достаточно ввести команду "help".

Предсказательный характер архитектуры:

  • пусть в расчетах на каждую Cli-команду отводим 1 (один) человеко-день. Да, можно за 1 день ввести 10-20 простых Cli-команд (да, простые или однотипные команды реализуются быстро), но не нужно обманываться: будет (обязательно будет!) функция, которая потребует 10 дней на реализацию и тестирование. Поэтому проект средней сложности на 200-300 Cli-команд займет 200-300 человеко-дней (хотя, это скорее оценка "сверху", реально проект может быть закончен раньше).

Скрипты с возможностью условного исполнения означают встроенную возможность тестирования, что (в теории) уменьшает вероятность регресса.

Расширяемость: новый модуль может, конечно, добавлять новые команды в глобальную видимость, но предпочтительный путь - группировка команд на уровне модуля, тогда в глобальной видимости появится всего лишь одна команда - переход на "уровень" модуля.

В Cli достаточно легко задавать обработку группы объектов. Можно, например:

  • ввести список объектов в команду;

  • ввести фильтр по именам объектов в команду;

  • ввести список объектов как параметр;

  • или даже ввести модуль Selection для управления группировкой объектов. Таким образом, можно использовать различные варианты групповой обработки.

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

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

3. Встроенный язык скриптов

3.1 Модуль Check

Условное выполнение реализовано в модуле "Check".

Для условного выполнения команд, в принципе, достаточно всего двух команд: "check label " - установка метки "check if == goto " - условный переход (здесь сравнение может быть не только на равенство: == != > < >= <= - вот полный список, но при этом команду можно оставить одну и ту же, а операторы сравнения ввести в виде списка возможных значений)

Переменные в простейшем случае - глобальные, заносятся в map<string,string>, для чего в модуле предусмотрен виртуальный метод .To_Map().

Для работы с переменными введены команды условного и безусловного присвоения, объединения, вывода на экран. Для полноценного языка этого, возможно, мало, но для задач тестирования функционала - вполне приемлемо.

3.2 Модуль Check vs Lua

Да, вместо встроенных модулей скриптов и условного выполнения можно подключить Lua. Однако, вместо нескольких команд (в действительности модуль условного выполнения Check получается не такой уж маленький - более 30 команд, хотя и однотипных) подключение Lua означает большое увеличение размера исполняемого файла, а в некоторых случаях это может быть критичным. Но как вариант, Lua выглядит очень привлекательно.

3.3 Модуль Check vs Erlang

Было бы неплохо, но запросы Уж очень большие у Erlang требования к ресурсам. Возможно, на "жирных" устройствах, как вариант, можно и Erlang подключить.

4. CDD vs Erlang

Неплохая попытка, подход Erlang - довольно похож на CDD. Но задумаемся, в чем PDD для Erlang? - "Ошибаемся и еще раз ошибаемся, а система все равно работает". Это, конечно, сильно. Поэтому вопрос: "CDD или Erlang" безусловно стоит. Но CDD можно реализовать на многих языках программирования (C/C++, C#, Java, JavaScript). А у Erlang - очень специфичный подход. Может быть, не Erlang vs CDD, а Erlang + CDD ??? Кажется, надо попробовать...

5. CDD и дробление монолита

Примерный путь преобразования монолита в CDD-приложение:

  • создаем CDD-приложение из Base-модулей;

  • legacy-монолит добавляем в виде нового Cli-модуля на новом "уровне" с минимальными командами вида "version get" / "info get" - на первом этапе достаточно "установить контакт" с монолитом;

  • в новом модуле вводим команды, специфичные для него: "start" / "stop" / "configure" ;

  • скорее всего новые команды будут группироваться вокруг каких-то понятий / объектов / процедур и т.п. - это повод выделить такие группы в отдельные модули + объекты управления; при этом в основном монолите вводятся ссылки на выделенные объекты;

  • в результате должен получиться набор модулей, причем каждый модуль должен содержать не более 10-20 команд;

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

6. Итоги

CDD выполняет SOLID, KISS, DRY, YAGNI, Bootstraping, TDD.

CDD провоцирует на модульное построение.

CDD дает возможность выполнения скриптов и внутреннее тестирование.

CDD может быть основой большого количества типов приложений.

CDD позволяет вводить новый функционал прогнозируемым способом.

CDD может быть основой построения OS.

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

CDD дает возможность разделения работ:

  • постановщик задачи описывает новый модуль в виде набора команд;

  • исполнитель реализует команды;

  • тестировщик пишет скрипты для проверки нового функционала.

CDD поддерживает введение нового функционала, в том числе на разных уровнях:

  • новые модули;

  • новые команды в существующих модулях.

CDD обеспечивает безопасность при вводе команд:

  • команды парсятся, данные валидируются, сделать что-то вне Cli-команд невозможно (если, конечно, не вводить команды типа exec / system / eval).

CDD фактически дает документацию по функционалу приложения:

  • достаточно подать команду "help * verbose" - и описание команд и их аргументов уже есть.

Этого мало?

Тогда вот вам напоследок: CDD позволяет захватить мир. КМК

Да, и Linux стоит переписать по CDD. КМК

Подробнее..

Storybook Flutter storybook_flutter

29.03.2021 18:20:06 | Автор: admin

Всем привет! В этой статье я буду бессовестно пиарить рассказывать о своей библиотеке для Flutter'а, которая позволяет создавать истории из изолированных виджетов и/или экранов. Что-то типа Storybook из мира React. Собственно, она так и называется: storybook_flutter.

Зачем она нужна?

Во-первых, быстрее делать UI. Конечно, у Flutter'а и так есть hot reload, но если виджет зарыт где-то в дебрях приложения, то до него еще надо добраться. А если этот виджет показывается только при определенных условиях, то эти условия надо воспроизвести. Кроме того, hot reload работает не во всех случаях. Поэтому удобнее изолировать виджет, вынести его в отдельную историю, и работать с этой историей. При этом вам придется задуматься над тем, как бы убрать лишние зависимости из этого виджета, так что код в итоге будет чище.

Во-вторых, демонстрация виджетов/экранов. Например, мы делаем свою дизайн-библиотеку для Flutter'а, и в документацию мы бы хотели встраивать интерактивную песочницу с виджетами, тем более, что Flutter for Web уже в стабильной ветке.

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

Может, взять что-то готовое?

Наверное, можно. Но, во-первых, какого-то явного фаворита в сообществе пока нет. Во-вторых, синдром NIH никто не отменял. В-третьих, я хочу иметь возможность быстро добавлять те фичи, которые нам нужны.

Как она выглядит?

Как-то так:

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

Что она умеет?

  • Навигация по историям с разбивкой по категориям.

  • Параметры (knobs) виджетов.

  • Переключатель светлой/темной темы.

  • Показ истории в отдельном окне без всех элементов интерфейса (в вебе удобно встраивать такую полноэкранную историю в iframe).

  • Кастомизация.

  • Различные рамки (спасибо пакету device_frame) в превью версии.

  • Плагины тоже в превью.

Как с ней работать?

Добавляем в pubspec.yaml(я использую превью-версию, плагины и рамки пока есть только в ней):

storybook_flutter: ^0.5.0-dev.0

Создаем историю (хорошо звучит). В самом простом случае будет что-то такое:

import 'package:flutter/material.dart';import 'package:storybook_flutter/storybook_flutter.dart';void main() => runApp(const MyApp());class MyApp extends StatelessWidget {  const MyApp({Key? key}) : super(key: key);  @override  Widget build(BuildContext context) => Storybook(        children: [          Story.simple(            name: 'Button',            child: ElevatedButton(              onPressed: () {},              child: const Text('Push me'),            ),          ),        ],      );}

Запускаем, смотрим, радуемся:

Добавим несколько параметров. Для этого меняем simple конструктор на обычный, и используем builder вместо child:

Story(  name: 'Button',  builder: (context, k) => ElevatedButton(    onPressed:        k.boolean(label: 'Enabled', initial: true) ? () {} : null,    child: Text(k.text(label: 'Text', initial: 'Push me')),  ),),

Запускаем, радуемся еще больше:

Если надо добавить секцию, просто добавляем параметр section:

Story(  name: 'Button',  section: 'Buttons',  builder: (context, k) => ElevatedButton(    onPressed:        k.boolean(label: 'Enabled', initial: true) ? () {} : null,    child: Text(k.text(label: 'Text', initial: 'Push me')),  ),),

Все истории с одинаковым параметром section будут автоматически сгруппированы.

Как кастомизировать?

У каждой Story есть параметры paddingи background отвечающие, как ни странно, за отступы и фоновый цвет каждой истории:

Story(  name: 'Button',  section: 'Buttons',  padding: const EdgeInsets.all(8),  background: Colors.red,  builder: (context, k) => ElevatedButton(    onPressed:        k.boolean(label: 'Enabled', initial: true) ? () {} : null,    child: Text(k.text(label: 'Text', initial: 'Push me')),  ),),

Но это слишком просто. Гораздо интереснее использовать параметр wrapperBuilder у Story, который позволяет обернуть каждую историю в кастомный виджет:

Story(  name: 'Button',  section: 'Buttons',  wrapperBuilder: (context, story, child) => Container(    decoration: BoxDecoration(border: Border.all()),    margin: const EdgeInsets.all(16),    child: Center(child: child),  ),  builder: (context, k) => ElevatedButton(    onPressed:        k.boolean(label: 'Enabled', initial: true) ? () {} : null,    child: Text(k.text(label: 'Text', initial: 'Push me')),  ),),

Этот же билдер можно передать в качестве параметра storyWrapperBuilder в Storybook, тогда каждая история будет обернута в этот виджет.

Нужно больше кастомизаций!

Если же одних билдеров, врапперов и параметров недостаточно, можно взять CustomStorybook и сделать все своими руками:

class MyApp extends StatelessWidget {  const MyApp({Key? key}) : super(key: key);  @override  Widget build(BuildContext context) {    final decoration = BoxDecoration(      border: Border(        right: BorderSide(color: Theme.of(context).dividerColor),        left: BorderSide(color: Theme.of(context).dividerColor),      ),      color: Theme.of(context).cardColor,    );    return MaterialApp(      debugShowCheckedModeBanner: false,      home: Scaffold(        body: CustomStorybook(          builder: (context) => Row(            children: [              Container(                width: 200,                decoration: decoration,                child: const Contents(),              ),              const Expanded(child: CurrentStory()),              Container(                width: 200,                decoration: decoration,                child: const KnobPanel(),              ),            ],          ),          children: [            Story(              name: 'Button',              builder: (context, k) => ElevatedButton(                onPressed:                    k.boolean(label: 'Enabled', initial: true) ? () {} : null,                child: Text(k.text(label: 'Text', initial: 'Push me')),              ),            )          ],        ),      ),    );  }}

При этом вы можете использовать встроенные виджеты Contents, CurrentStory и KnobPanel (думаю, вы догадались, что они делают). Получим вот такую минималистичную картину:

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

Что там с плагинами?

Как я уже говорил, в превью версии появилась поддержка плагинов и первый 1st party плагин: DeviceFramePlugin:

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

Про создание плагинов, если будет интересно, расскажу в другой статье.

Какие платформы поддерживаются?

Никакой особой магии под капотом нет, так что теоретически должно работать на всех платформах, которые поддерживаются Flutter'ом. Я проверял на Android, iOS, Web и macOS.

Что дальше?

Дальше в планах устаканить API плагинов, подумать, какие плагины еще нужны из коробки (ну и написать их).

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


На этом все. Буду рад замечаниям, предложениям и баг-репортам (ну и лайкам/звездочкам, конечно же, чего уж греха таить).

Подробнее..

Чистим пхпшный код с помощью DTO

31.05.2021 00:23:47 | Автор: admin

Это моя первая статья, так что ловить камни приготовился.

При написании нового метода или сервиса мы стараемся его максимально абстрагировать от внешних зависимостей, чтобы новый функционал реализовывал только заложенную ему логику. Об этом, собственно, нам и говорит один из принципов SOLID - Принцип единственной ответственности (single responsibility principle).

Я постоянно встречаю код, где если у метода больше двух входных аргументов, добавляется условный (array $args), что влечет за собой реализацию проверки наличия ключа, либо она отсутствует и тогда увеличивается вероятность того, что метод может закрашиться в рантайме.

Возможно, такой подход в PHP сложился исторически, из-за отсутствия строгой типизации и такого себе ООП. Ведь как по мне, то только с 7 версии можно было более-менее реализовать типизацию+ООП, используя strict_types иtype hinting.

Также вызов подобных методов может сопровождаться описанием массива, который мы будем передавать. Или вовсе передается какой-то массив с мусором, а метод просто берет нужные ему ключи. Например, сервис по созданию пользователя:

$userService->create([      'name' => $object->name,      'phone' => $object->phone,      'email' => $object->email,  ]);

Меня такой подход не устраивает, поэтому я уже долгое время придерживаюсь DTOшек. Мы создаем нужный нам DTO объект, который требует метод, и его уже передаем. И тогда внутри метода мы с полной уверенностью можем работать с валидными данными. Мы точно знаем, что у него есть нужные типизированные параметры, нет ничего лишнего, а конечный метод у нас становится гораздо чище.

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

Собственно, так и появился мой пакет.

Использование ClassTransformer

С его помощью я автоматически привожу данные к нужному мне классу. Рассмотрим более подробно все также на примере создание пользователя. К нам приходит запрос, и данные из него мы должны отправить в метод. В моем случае на Laravel проекте это выглядит вот так:

class UserController extends Controller {public function __construct(      private UserService $userService,) {}public function createUser(CreateUserRequest $request){      $dto = ClassTransformer::transform(CreateUserDTO::class, $request);      $user = $this->userService->create($dto);      return response(UserResources::make($user));}}
class CreateUserDTO{    public string $name;    public string $email;    public string $phone;}

В запросе к нам приходит массив параметров: name, phone и email. Пакет просто смотрит есть ли такие параметры у класса, и, если есть, сохраняет значение. В противном случае просто отсеивает их. На входе transform можно передавать не только массив, это может быть другой object, из которого также будут разобраны нужные параметры.

Но наименования аргументов могут отличаться. Тогда, в созданной нами DTO, мы можем спокойно описать свою реализацию приведения:

class CreateUserDTO{    public string $name;    public string $email;    public string $phone;        public static function transform(mixed $args):CreateUserDTO    {        $dto = new self();        $dto->name = $args['fullName'];        $dto->email = $args['mail'];        $dto->phone = $args['phone'];        return $dto;    }}

Существуют объекты гораздо сложнее, с параметрами определенного класса, либо массивом объектов. Что же с ними? Все просто, указываем параметру в PHPDoc путь к классу и все. В случае массива нужно указать, каких именно объектов этот массив:

class PurchaseDTO{    /** @var array<\DTO\ProductDTO> $products Product list */    public array $products;        /** @var \DTO\UserDTO $user */    public UserDTO $user;}

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

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

Что мы получаем?

  • Метод сервиса работает с конкретным набором данным

  • Знаем все параметры, которые есть у объекта

  • Можно задать типизацию каждому параметру

  • Вызов метода становится проще, за счет удаления приведения вручную

  • В IDE работают все подсказки.

Аналоги

Увы, я не нашел подобных решений. Отмечу лишь пакет от Spatie - https://github.com/spatie/data-transfer-object

Он пытает решить ту же проблему используя DTO, но их подход заставляет ваш класс наследоваться от их DTO, и самим вызывать инициализацию, передавая в конструктор набор данных. При такой реализации я не вижу особо профита использования, ведь я так же могу сам прописать new DTO() и заполнить параметры.

Я же, в свою очередь, был вдохновлен методом преобразования из NestJS - plainToClass. Такой подход не заставляет реализовывать свои интерфейсы, что позволяет делать преобразования более гибким, и любой набор данных можно привести к любому классу. Хоть массив данных сразу в ORM модель (если прописаны параметры), но лучше так не надо:)

Roadmap

  • Реализовать метод afterTransform, который будет вызываться после инициализации DTO. Это позволит более гибко кастомизировать приведение к классу. В данный момент, если входные ключи отличаются от внутренних DTO, нужно самому описывать метод transform. И если у нас из 20 параметров только у одного отличается ключ, нам придется описать приведение всех 20. А с методом afterTransform мы сможем кастомизировать приведение только нужного нам параметра, а все остальные обработает пакет.

  • Поддержка атрибутов PHP 8

Вот и все.

Подробнее..

Что там в insurtech обсуждаем в подкасте Экспертиза с независимым экспертом из индустрии

13.03.2021 18:22:01 | Автор: admin

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

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

Фотография: Alexander Popov. Источник: Unsplash.comФотография: Alexander Popov. Источник: Unsplash.com

API страховых компаний мы уже работаем с ними

Текстовая версия Аудиоплеер в веб-версии Apple Podcasts

Михаил Михеев, страховой эксперт и соведущий передачи, заинтересовался этой темой еще в 2017 году и рассказал о ней на одной из технологических площадок. После этого он начал готовить собственные ИТ-системы, используемые в работе с клиентами [главным образом для оформления страховок], к потенциальной интеграции с API компаний-партнеров. Стоит признать, что последние на тот момент не были в достаточной степени развиты и доступны для агентов. Поэтому интеграцию начали только в конце 2019-го, после того как Михаил принял участие в одной из профильных insurtech-конференций и познакомился с новыми партнерами.


Ситуация вокруг дизайна ИТ-систем для страхования

Текстовая версия Аудиоплеер в веб-версии Apple Podcasts

Один из первых выпусков, где мы затрагиваем тему insurtech'а. Мы записали его еще в 2017 году, когда большая часть страховых компаний не задумывалась о развитии веб-сервисов, мобильных приложений и существенном улучшении инхаус CRM-систем. К сожалению, с тех пор в сфере страхования появилось не так и много инноваций буквально два-три громких стартапа.

Отношение к ИТ на внутренней кухне крупных страховщиков практически не изменилось, поэтому этот выпуск все еще актуален с точки зрения понимания mindset'а в индустрии.


Гаджеты помогут, но не сразу

Текстовая версия Аудиоплеер в веб-версии Apple Podcasts

Один из классических выпусков подкаста в формате короткой реплики. Здесь Михаил рассуждает о том, как страховые компании воспринимают ситуации, связанные с умными автогаджетами, на примере известного ему случая. Через пару дней после публикации этой аудиозаметки Михаил развернул ряд своих мыслей и написал объемный хабрапост.

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



Без технологий не стать экспертом

Текстовая версия Аудиоплеер в веб-версии Apple Podcasts

Еще один компактный выпуск, в котором Михаил делится мнением о том, как технологии влияют на работу независимого страхового агента. Он рекомендует младшим коллегам задумываться об использовании CRM-систем с первых дней работы. При серьезном отношении к этой профессии и развитии дела переходить к проектированию собственных решений в этой области. Именно так в свое время Михаил поступил сам, что сейчас позволяет ему действовать без оглядки на продукты того или иного ИТ-вендора и быстрее интегрировать API страховых компаний.


Как отработал дилер после моего ДТП

Текстовая версия Аудиоплеер в веб-версии Apple Podcasts

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

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


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

Подробнее..

Что там в insurtech обсуждаем в подкасте с независимым страховым экспертом из индустрии

13.03.2021 20:20:43 | Автор: admin

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

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

Фотография: Alexander Popov. Источник: Unsplash.comФотография: Alexander Popov. Источник: Unsplash.com

API страховых компаний мы уже работаем с ними

Текстовая версия Аудиоплеер в веб-версии Apple Podcasts

Михаил Михеев, страховой эксперт и соведущий передачи, заинтересовался этой темой еще в 2017 году и рассказал о ней на одной из технологических площадок. После этого он начал готовить собственные ИТ-системы, используемые в работе с клиентами [главным образом для оформления страховок], к потенциальной интеграции с API компаний-партнеров. Стоит признать, что последние на тот момент не были в достаточной степени развиты и доступны для агентов. Поэтому интеграцию начали только в конце 2019-го, после того как Михаил принял участие в одной из профильных insurtech-конференций и познакомился с новыми партнерами.


Ситуация вокруг дизайна ИТ-систем для страхования

Текстовая версия Аудиоплеер в веб-версии Apple Podcasts

Один из первых выпусков, где мы затрагиваем тему insurtech'а. Мы записали его еще в 2017 году, когда большая часть страховых компаний не задумывалась о развитии веб-сервисов, мобильных приложений и существенном улучшении инхаус CRM-систем. К сожалению, с тех пор в сфере страхования появилось не так и много инноваций буквально два-три громких стартапа.

Отношение к ИТ на внутренней кухне крупных страховщиков практически не изменилось, поэтому этот выпуск все еще актуален с точки зрения понимания mindset'а в индустрии.


Гаджеты помогут, но не сразу

Текстовая версия Аудиоплеер в веб-версии Apple Podcasts

Один из классических выпусков подкаста в формате короткой реплики. Здесь Михаил рассуждает о том, как страховые компании воспринимают ситуации, связанные с умными автогаджетами, на примере известного ему случая. Через пару дней после публикации этой аудиозаметки Михаил развернул ряд своих мыслей и написал объемный хабрапост.

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



Без технологий не стать экспертом

Текстовая версия Аудиоплеер в веб-версии Apple Podcasts

Еще один компактный выпуск, в котором Михаил делится мнением о том, как технологии влияют на работу независимого страхового агента. Он рекомендует младшим коллегам задумываться об использовании CRM-систем с первых дней работы. При серьезном отношении к этой профессии и развитии дела переходить к проектированию собственных решений в этой области. Именно так в свое время Михаил поступил сам, что сейчас позволяет ему действовать без оглядки на продукты того или иного ИТ-вендора и быстрее интегрировать API страховых компаний.


Как отработал дилер после моего ДТП

Текстовая версия Аудиоплеер в веб-версии Apple Podcasts

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

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


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

Подробнее..

Кому индивидуальных тренировок на основе ИИ?

12.01.2021 20:07:52 | Автор: admin


Привет, Хабр! Мы тут заморочились вопросом о тренировках дома и погрузились в разработку фитнесс приложения (android | ios).

Для начала давайте разберемся, что обычно прячется за маркетингом фитнесс приложений? Мы все чаще встречаем рекламу с главным предложением скачай апп или пройди тест и получи персонализированный план тренировок. Но действительно ли эти тренировки будут соответствовать вашим параметрам? Неужели искусственный интеллект (ИИ) уже во всю используется в приложениях для фитнеса?

Давайте разбираться, как это работает :)

Если вам когда-нибудь приходилось пользоваться фитнес приложением, то наверняка вы столкнулись с одним из следующих сценариев (постарайтесь вспомнить):

  1. Самый простой вариант. Вы регистрируетесь и просто выбираете один из трех уровней сложности: новичок, средний или продвинутый. Потом начинаете тренироваться и оказывается, что тренировки в целом не то чтобы хорошо вам подходят. В начале, конечно, вы рады, что вообще начали тренироваться и кажется даже потеете :) Но уже через недельку тренировки оказываются слишком легкими или слишком скучными. Да, можно перейти на следующий уровень сложности но надолго ли хватит такой истории? Вы сами все понимаете.
    Ну и часто бывает, что вы выбрали уровень новичок (а вы последний раз приседали в школе на физкультуре, и то на скамейку запасных) и вам прилетело 20 отжиманий на одной руке кхм (я почти не утрирую)


  2. Чуть более продвинутый вариант. Вы регистрируетесь, вводите стандартные показатели: дату рождения, пол, рост и вес. Некоторые приложения дополнительно пытаются узнать вашу цель и как часто вы тренируетесь (Спойлер они это делают, чтобы визуализировать на картинке результат и продать вам). У них есть несколько специальных заготовочек. Потом вы получаете подобранные для вас тренировки. Ну на самом деле это такие усредненные тренировки из тех же 3 уровней сложности :) только теперь на вас еще и наваливается сумасшедший выбор из десятка шаблонов. Ну и по итогу вы тыкаете на первую попавшуюся и начинаете тренироваться. Через месяц вы уже выучите наизусть все заготовленные тренировки и у вас даже появятся любимые. Казалось бы все ок Но а что делать дальше? Что там насчет сложности и персонализации? Что делать, если уже нужно больше нагрузки, ведь тело адаптируется к нагрузке и эффективность тренировок сходит на нет? Приседать не 10 раз, а 15?
  3. Ну и самый продвинутый вариант супер-пупер личный тренер на базе ИИ. Тут в начале вас ждет огромная анкета (Да, прошу обратить внимание именно анкета). В которой будут все вышеупомянутые вопросы + еще несколько уточняющих. В анкете спросят про ваши предпочтения, чего вы хотели бы достичь.
    Обычно это стандартные ответы похудеть, нарастить мышцы, поддержать форму ну или сохранить здоровье.
    А какие у вас проблемные зоны? Детализация обычно простая это руки, грудные, ягодицы, живот, или ноги. Иногда бывают вопросы про сон или какой у вас тип телосложения, что уже интересней, ведь по этому можно скорректировать подход к вашему телу, пусть и в общих чертах. Кстати, недавно видел в одном из аппов такой вопрос: Что вам мешает тренироваться?.
    На самом деле интересный вопрос, но кто может на него честно ответить? И да, это тоже вопросик для маркетинга, но не для того чтобы улучшить вам тренировки.
    Итог мы получаем картинку, которая соответствует нашим ожиданиям. Но соответствуют ли им тренировки? И как вообще понять хорошие они или нет и насколько в действительности занятия будут эффективны.


Давайте для начала проведем небольшой эксперимент.

Закройте глаза и представьте себе вашего друга или коллегу. Как бы он ответил на те вопросы, о которых мы говорили чуть выше? Продумайте или даже запишите ответы на листок бумаги.
Я, например, представляю своего соседа Андрея. Это мужчина лет 30, ростом 174 см и весом в 85-90 кг. Такой типичный мезоморф, средней степени активности. Он мало спит, и ведет не самый активный образ жизни. Говорит, что ему не хватает мотивации, но он готов тренироваться 3 раза в неделю. Его цель накачать мышцы, но какие точно, он не уверен. По итогу выбирает руки и живот как проблемные зоны. Ну и плюс он хочет тренироваться дома (это влияние карантина или просто любовь к домашним стенам никто не знает).
У вас мог получиться и совершенно другой образ. Вдруг это слегка пухленькая девочка, отчаянно желающая похудеть на 5 кг. Главное, теперь мы можем идти дальше. Давайте попробуем набросать программу нашему воображаемому подопечному (и вы попробуйте).

Хм, допустим первая тренировка для Андрея будет комбинацией различных скручиваний и отжиманий (он же не зря указал живот и руки в анкете). Попробуем для наглядности создать максимально простую тренировку:

  1. Набросаем разминку, раз грудь и скручивания добавим побольше упражнений на верхний плечевой пояс: вращения в плечевом, локтевом суставах и тд. Тут вроде бы все просто. Почти вся информация для создания разминки у нас есть.
  2. Собственно тренировка... Попробуйте определить, какие упражнения подойдут вашему подопечному. Может быть ему или ей подойдут отжимания на коленях (они достаточно простые и сойдут в качестве легкого разогрева. Хмм А сколько подходов нужно сделать, и самое важное, сколько повторений должно быть в этих подходах? Ну судя по описанию, мой образный юзер (сосед Андрей) сможет без труда сделать отжиманий 10-15 за раз (мы помним, что нам нужен легкий подход для разогрева).
    А если его максимум 40 раз? Подход наверное должен быть побольше около 20 повторений. Но блин, 20 отжиманий на коленях хватит для разогрева и более продвинутому пользователю приложения. Окей, берем 20, а дальше разберемся.
  3. А что будем делать с отдыхом? Все мы разные и нам нужно разное время, чтобы отдышаться и восстановить силы после упражнений разной сложности. Разве мы можем выбрать какую-то стандартную, фиксированную цифру и все время давать ее между подходами? ( Ну вот по мнению большинства аппов можем. Хотя это и не супер профессионально зато просто в реализации).


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

Итак, тяжелые тренировки это растяжимое понятие. Что вообще для человека сложно?



Ну, в нашем случае обычное отжимание наверное сойдет за сложное для моего подопечного? А наклонные отжимания (когда ноги ставятся выше плеч, чаще всего на стул, или скамью)? Может быть оптимально было бы сделать пару подходов отжиманий с хлопками, ведь они отлично задействуют быстрые волокна и прекрасно подходят под критерий тяжелый упражнений. И может ли он вообще выполнить такие упражнения? Этих данных у нас увы нет.

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

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

На самом деле приложение не знает о вас почти ничего, оно не знает сколько раз вы можете отжаться, и тем более, сколько раз вы отожметесь после нескольких подходов по N раз. Вспомните эти тренировки, где все количество раз всегда фиксировано. Присядьте 10 раз, отожмитесь 10 раз, теперь 10 повторений прыжков и наконец отдых (1 минута). Цифры, конечно, могут слегка меняться, но суть от этого не изменится. Человек просто запыхается и не заметит, что мышцы остались не проработаны. Вроде вспотел, мышцы болят значит тренировка работает.
А если не хватило? Ну держи тебе еще 10 приседаний.

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

Кстати, если прошелестить отзывы на Google play, то можно понять, как пользователи решают возникнувшие проблемы:
Если тренировка легкая, а другого апп предложить не может человек просто проходит ее несколько раз подряд. Согласитесь не самое увлекательное занятие. Но за неимением лучшего
Если слишком сложная можно попечалиться и попропускать половину упражнений.
Не думаю, что вы бы согласились заниматься с тренером, которому все время приходится говорить: Игорь, давай следующее упражнение, я так больше не могу.
И это я еще молчу про безумные упражнения типа приседаний на одной ноге со штангой (о да, такое тоже встречается).

Вот вам еще пару приемчиков негодования пользователей самых популярных приложений на рынке :)


Ну и что теперь? Удалить все фитнес приложения со своего телефона и потихоньку обрастать жиром? Или продолжать делать хоть какие-нибудь тренировки и не обращать внимание на язык на плечах после 30 берби в тренировке для новичков?

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

Мы поняли нужно искать решение. И, думаю, нашли :)

В начале тренировочного пути наше приложение предлагает пройти тест-тренировку. Она состоит из 4 упражнений на растяжку и 5 базовых упражнений на силу (при этом задействуются разные группы мышц). Всего за 60 секунд человек должен выполнить максимальное число повторений в одном подходе и сосчитать количество раз, которое у него получилось. Кто-то сможет сделать 70 отжиманий за минуту, а кто-то всего 15 (и те на коленках). Согласитесь, такая информация может оказаться куда более полезной, чем просто анкета о вашем образе жизни.
И как же понять на основе этих данных, сколько раз человеку стоит выполнять то или иное упражнение? (А их, на минуточку, в базе приложения почти 160 штук).

Тут в дело вступает немного (много) машинного обучения, замешанного на биомеханике. Мы создали систему, способную достаточно точно предсказывать на сколько повторений вас хватит в том или ином упражнений. Как должна выглядеть подходящая именно вам тренировка и как лучше комбинировать упражнения, чтобы вы могли точно достигнуть своей цели.

Небольшой пример (на одной группе мышц), как все это работает.
Делюсь скриншотами тренировки из моего личного аккаунта :)
Пару слов обо мне сейчас: рост 176 см, вес 75 кг. В школьные годы я был довольно дрыщавым мальчиком в очках. По типу телосложения, как вы уже поняли, чистый эктоморф. Цель в профиле увеличить мышечную массу. Поскольку примеры работы аппа будем показывать на тренировке груди, вам будет проще оценить ситуацию, зная мой уровень физ. подготовки: отжимаюсь 70+ раз за минуту, могу отжаться с хлопками 22-23 раза.



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

А теперь представим, что я неудачно сел в кресло и увидев на животе большую складку в панике переключил цель на похудеть. И снова создал тренировку на грудь (на самом деле я бы так не поступил, но наша с вами задача увидеть, как цель влияет на составление тренировки).



Итак, что мы видим? С довольно сложных упражнений акцент сместился на средние, такие как обычные отжимания широким хватом и изометрические отжимания ведь их я могу сделать больше :)
Тренировка получается довольно интенсивной за счет использования дроп-сетов (тут они используются чаще, чем в тренировках для набора мышечной массы) и небольшого отдыха между подходами. Мышцы не успевают израсходовать весь энергоресурс, так что отдых нам больше для отдышаться. Если вы тренируете несколько групп в тренировке начнут появляться суперсеты (комбинации из нескольких упражнений на разные группы мышц без отдыха).
Да, для меня эта тренировка не будет особо эффективной в плане мышечной гипертрофии, но отлично поможет потратить побольше калорий, а также после нее я быстрее восстановлюсь и смогу пойти тренироваться снова. И очень скоро избавлюсь от этой странной складки на животе :)

Так что, если вы хотите тренироваться эффективно, нажмите сюда, если у вас android, или сюда, если у вас ios и пройдите свою тест-тренировку. Да, еще какое-то время приложение будет бесплатным, но для первых 5к пользователей делаем подарок пожизненный доступ к индивидуальным тренировкам и всем новым продуктам сервиса AiforFit.
Подробнее..

Большие данные, хакатон с Норникелем и металлургия все смешать, но не взбалтывать

09.04.2021 18:04:19 | Автор: admin
Привет, Хабр! Тема этой статьи большие данные в металлургии. Конечно, если охватить вообще всю тему, то объема статьи не хватит да что там, информации хватит на целую энциклопедию, благо, технологии в промышленности развиваются очень активно. Поэтому расскажем лишь о том, как большие данные и машинное обучение используются компанией Норникель.

К чему это все? Дело в том, что Норникель вместе с хакатон-сообществом Russian Hackers с 16 по 18 апреля проведут онлайн-хакатон, посвященный поиску лучших решений для оптимизации процессов в индустрии добычи цветных металлов. К участию в хакатоне приглашаются разработчики, дата-сайентисты, аналитики и менеджеры и представители других специальностей. В хакатоне могут принять участие команды от 3 до 5 человек. Для того, чтобы лучше понимать суть хакатона, расскажем о технологиях компании, а потом подробности уже самого мероприятия, со ссылкой на регистрацию.

Коротко (на самом деле нет) про обогащение руды на обогатительной фабрике в Норникеле


Если точнее, то речь пойдет про обогатительные фабрики и способах оптимизации производства при помощи высоких технологий.

Что касается самого обогащения, то его основополагающие принципы не меняются десятилетиями. Технологии да, эффективность обогащения да. Принципы либо совсем не меняются, либо незначительно.

Представьте, что вы добыли руду. Содержание металла (неважно, какого, хоть железа, хоть никеля) там не очень высокое. Для того, чтобы получить этот металл, исходный материал требуется обогатить а именно увеличить концентрацию металла. Увеличение содержания металла идет за счет того, что то, что не является металлом, отделяется от руды и идет в хвостохранилище (по сути отходы производства).



Достигается это разными способами, в качестве примера приведем Талнахскую обогатительную фабрику:

  • Этап 1. Руду измельчают при помощи мельниц. После этого выполняется простой процесс разделения кондиционного продукта от слишком крупных элементов. На выходе из мельницы стоит решетка, все, что не проходит решетку отправляется в мельницу заново.
  • Этап 2. Флотация при помощи этого метода используется разделение пустой породы и полезного продукта. Метод флотации основан на разнице в смачиваемости исходных компонентов водой.
  • Этап 3. Сгущение, после чего продукт обогащения вместе с водой поступает на металлургические заводы.

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

Большие данные в обогащении


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



Сейчас реализовано уже 14 разных инициатив, из которых 2 внедрено, это управление производством в автоматическом режиме, 7 находится на стадии тестирования и 5 стадия R&D.

Длительность проектов R&D 2-3 месяца, пилот 2-3 месяца, внедрение занимает 2-6 месяцев.

Формировать команду специалистов компания начала в 2019 году, тогда в нее входило всего 2 человека. Сейчас это уже 5 человек 1 PM и 4 DS.

Используемые технологии:

  • Классическое машинное обучение
  • Компьютерное зрение

Текущий стек:

  • Python, SQL
  • 2 сервера в ЦОДе Норильска
  • 2 сервера на производстве (1 для компьютерного
  • зрения)

Вот несколько визуальных примеров проектов на обогатительных фабриках.



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

Не только обогащение


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

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

Еще один крупный проект Озеро данных. Это технологичная платформа для решения задач управления персоналом (HR)

Озеро данных дает уникальную возможность создать расширенный профиль сотрудника и на новом уровне осуществлять управление и прогнозирование в одной из стратегических областей для бизнеса в управлении персоналом (HR).

При этом информация может быть собрана из различных внутренних систем. Внедрение data-driven подходов в HR analytics является одним из самых перспективных трендов в AI transformation. Основная цель здесь повышение эффективности работы сотрудников, повышение промышленной безопасности, предотвращение несчастных случаев и т.д.

Ок, с технологиями понятно, а что там с хакатоном?


Он состоит из двух основных треков:

Пенная вечеринка определение по видео скорости потока пены с металлом и других параметров флотации для оптимизации работы оператора на производстве.

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

Общий призовой фонд хакатона составляет 500 000 рублей: по 250 000 рублей на каждый трек. Плюс каждый из участников получает мерч. Более того, за приз зрительских симпатий участники получают AirPods Pro, и доступны еще промокоды Яндекс.Плюс, Okko, Gmoji.

Что дает хакатон участникам:

  • Понимание внутренней кухни производства цветных металлов и важности data driven подхода в нем.
  • Прокачка хард-скиллов в компьютерном зрении и предиктивной аналитике.
  • Уникальную возможность поработать с закрытыми данными мирового лидера цветной металлургии.

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

Работа в этом направлении очень интересная и по-своему необычная она включает в себя одновременно и глубокое погружение в алгоритмы машинного обучения и в технологию производственного процесса. Хочется донести эту мысль до широкого круга людей и хакатон прекрасная возможность узнать, как устроен промышленный ML на настоящих примерах
", прокомментировал Антон Абраров, Руководитель data science проектов Норникеля

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

Зарегистрироваться для участия в хакатоне можно с 17 марта по 14 апреля.

Ну и для того, чтобы ответить на основные вопросы о хакатоне, кроме информации выше, мы задали несколько вопросов одному из организаторов Александру Малышеву из Russian Hackers.

Кто, как и почему решил взять и организовать хакатон с компанией Норникель?

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

Какие сейчас ожидания от него?

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

Есть ли что-то новое в организации/используемых технологиях, что не применялось ранее?

Мы любим экспериментировать с организацией например, у нас есть собственная платформа для проведения хакатонов, написанная на Angular. В одной из задач мы специально отказались от традиционного data-science формата убрали метрику и просим команды подойти к задаче в роли исследователя.

Насколько сильной должна быть команда, чтобы победить в хакатоне? Можно ли победить лишь за счет идеи? Или нужно показать прототип решения?

На этом хакатоне обе задачи про Data Science. Нужно немного разбираться в теме, чтобы было больше шансов завоевать призовое место. Просто показать презентацию не получится, т.к. 50% оценки именно техническая реализация. Однако, как организатор, могу сказать, что на хакатоны постоянно приходят новички с новыми свежими идеями и подходами, которые завоевывают призовые. Если говорить не только о призах, то все финалисты получат подарки от Норникеля, Russian Hackers и SberCloud.

Будут ли использоваться результаты хакатона на производстве? Или пока что это проба пера?

Мы как организаторы в первую очередь ставили задачу рассказать, какие бывают задачи в достаточно закрытой отрасли с точки зрения Data Science. Будет круто, если команды устроятся на работу в Норникель или запустят с ними пилот, но здесь как и в любом B2B нужно иметь крепкую силу воли, чтобы довести прототип с хакатона до реального результата на производстве. Посмотрим, как всё пройдет.

Что же, ждем участников хакатона. На всякий случай еще раз указываем ссылку для регистрации.
Подробнее..

Как проверить децентрализацию?

15.04.2021 10:21:55 | Автор: admin

Итак, спасибо всем за вопросы и интерес проявленный к NewNode.

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

Нам нужна ваша помощь, что бы сделать NewNode еще лучше.

Мы столкнулись с тем, что у всех оно работает по разному: где-то все работает, где-то нет это особенность растущей децентрализованной сети.

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

Спасибо!

Подробнее..

Настройка BGP для обхода блокировок, версия 3.1. И немного QampA

05.04.2021 22:14:08 | Автор: admin

Близится кожаная свадьба Роскомнадзора с Телеграмом, 16 апреля 2018 года начался крестовый поход, ставший фактически символом уничтожения интернета в России, хотя в глобальной войне, начавшейся в 2012 году, он был всего лишь ярким эпизодом.

Ковровые блокировки в исполнении РКН стали причиной появления на свет множества различных сервисов, помогающих пользователям сети выживать под бомбежками. Одним из них стал antifilter.download, позволяющий получать списки находящихся под блокировками IP-адресов. Далее пользователи сервиса могли использовать полученную информацию по своему усмотрению. Вариант усмотрений был описан в статье Настройка BGP для обхода блокировок, версия 3, без VPS, которая стала достаточно популярной в сети и породила несколько сотен пользователей сервиса.

Однако "Tempora mutantur et nos mutamur in illis". За прошедшие три года сервис пережил Alpharacks-gate, похоронивший вместе с собой практически все донаты, упирание в технические ограничения как следствие роста количества пользователей, упирание в те же ограничения как следствие взрывного роста количества ip-адресов в списке РКН... Да что только не пережил. Каждое из этих изменений приводило к небольшому устареванию предыдущей статьи и когда неделю назад один из хабраюзеров предложил мне поправить ее под текущие реалии, я понял, что проще родить нового, чем отмыть этого написать новую версию, заодно и ответив на часто задаваемые вопросы. Результат - ниже.


Зачем это всё

Выполнив описанные ниже действия на своем маршрутизаторе Mikrotik, вы сможете автоматически получать через уже имеющийся у вас VPN доступ к ресурсам, ip-адреса которых занесены в "Единый реестр доменных имен, указателей страниц сайтов в сети Интернет и сетевых адресов, позволяющих идентифицировать сайты в сети Интернет, содержащие информацию, распространение которой в Российской Федерации запрещено".

Мы используем протокол BGP для доставки списка IP-префиксов из "Единого реестра" на ваш маршрутизатор и дальнейшего перенаправления трафика к этим префиксам в VPN-туннель. Здесь и далее под общим термином IP подразумевается IPv4, IPv6-адреса сервисом не обрабатываются.

Если ваш маршрутизатор не Mikrotik, но умеет протокол BGP, вы, скорее всего, сможете использовать этот сервис, адаптировав настройки под своё оборудование. Вариант для Keenetic, например, приведен в полезных ссылках в конце статьи.

Что нужно для использования

  1. Маршрутизатор Mikrotik

  2. подключенный к интернету

  3. с VPN куда-то в зону, свободную от блокировок, и использующим протокол, создающий интерфейс (практически любой вариант, кроме чистого IPSEC - в примере используется GRE). В целом тема настройки VPN - отдельная и широкая, а поскольку я ни с одним таким сервисом не аффилирован, описывать на примере кого-либо из них не буду. Будем считать, что VPN у вас есть и работает.

Как настроить

Команды, приведенные в цитатах, необходимо выполнять в окне терминала Mikrotik. В целом никто не запрещает настраивать это всё и в Winbox, но разбирать, какие параметры в какое поле Winbox вводить, вам придется самостоятельно.

Предварительные ласки

Проверяем наш VPN. Крайне важно, чтобы он работал еще до внедрения сервиса.
Наиболее простым способом проверки будет посещение любого сайта, который показывает ваш внешний IP-адрес (например, 2ip.ru), с включенным и выключенным VPN и фиксированием факта, что отображаемый ip-адрес меняется.

Тут у нас лежит первая и частая засада. Очень часто люди с неэкспертной квалификацией настраивают подключение к VPN по шаблону из интернета с использованием routing mark, особенно когда параллельно используют multiWAN схему. В принципе, ничто не запрещает использовать BGP-префиксы и в такой конфигурации, но ее нужно тщательно продумывать и подстраивать под текущие настройки, что в статье "в общем" не описать. Так что в дальнейшем подразумевается, что вы используете только классическую маршрутизацию по префиксам.

Если у вас сильно зажаты правила файрвола, возможно вам потребуется создать отдельное правило для выпуска трафика BGP с маршрутизатора.

/ip firewall filter add action=accept chain=output protocol=tcp dst-address=163.172.210.8 dst-port=179 out-interface=gre-tunnel1

На место gre-tunnel1 нужно подставить имя вашего интерфейса VPN-туннеля.

Укрепи и направь

Прописываем маршрут до сервиса antifilter.download через ваш VPN. Это действие нам поможет от случая, когда где-то на пути какой-то из провайдеров фильтрует BGP (на удивление, таких в России достаточно много).

/ip route add dst-address=163.172.210.8/32 gateway=gre-tunnel1

На место gre-tunnel1 нужно подставить имя вашего интерфейса VPN-туннеля.

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

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

Глубокое проникновение

Настраиваем пиринг с сервисом.

/routing bgp instance set default as=64512 ignore-as-path-len=yes router-id=81.117.103.94 /routing bgp peer add hold-time=4m in-filter=bgp_in keepalive-time=1m multihop=yes name=antifilter remote-address=163.172.210.8 remote-as=65432 ttl=default
/routing filter add action=accept chain=bgp_in comment="Set nexthop to VPN" set-in-nexthop-direct=gre-tunnel1

Первой командой мы создаем процесс BGP на вашем устройстве. В ней:

  • 64512 - 16-битный номер автономной системы. Заменяем на любой по вашему желанию, кроме ASN сервиса (65432). В нашем конкретном случае нам не важно, какой там будет указан номер в диапазоне от 1 до 65534, но если делать все правильно - RFC6996 говорит нам, что для частного использования выделен диапазон 64512-65543.

  • 81.117.103.94 - router ID (32 бита) в формате IPv4-адреса. В общем случае нам, опять же, не важно, какой там будет указан ID, но чтобы уменьшить вероятность пересечения с другим пользователем - лучше использовать ваш текущий внешний IP-адрес (посмотрев его на том же 2ip.ru). При его изменении менять router ID совершенно не обязательно.

Второй командой мы создаем BGP соединение с сервисом antifilter.download. В ней ничего менять не надо.

Третьей командой мы указываем, что для всех маршрутов, полученных от сервиса, нужно установить в качестве next-hop интерфейс нашего VPN. В ней на место gre-tunnel1 нужно подставить имя вашего интерфейса VPN-туннеля.

... и обоюдный оргазм

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

То, что пиринг поднялся, можно посмотреть по пути Routing - BGP - Peers в Winbox:

State должен быть Established, а в поле Count - отличное от нуля количество полученных префиксов.

Также характерным признаком того, что префиксы получены, является следующая картинка по пути IP - Routes в Winbox:

По клику где указано можно раскрыть весь список полученных префиксов и увидеть что-то вроде:

Важно, чтобы в поле Gateway было указано имя вашего интерфейса VPN и слово reachable (Distance при этом у вас будет другим, это нормально).

Если что-то не работает - проверьте прежде всего доступность сервиса. Сервер откликается на пинг, так что команда ping antifilter.download вполне себе покажет, все ли хорошо со связностью. Если пинг проходит - проверьте соответствие IP-адреса в пинге 163.172.210.8, потому что вы вполне можете читать эту статью в момент, когда сервис уже куда-то мигрировал.

Далее перепроверьте настройки и прочитайте Q&A ниже. А потом спросите в комментариях здесь или на канале MikrotikRus, там я тоже иногда поддерживаю решение, да и кроме меня там очень много грамотных людей.

А поговорить? (Q&A)

  • Решение перекрывает не все проблемы с блокировками

    • Конечно нет. Нужно понимать, что поскольку действие (блокировка) лежит фактически на 7 уровне модели ISO/OSI, то и противодействие (обход блокировки) наиболее эффективно работает на том же уровне модели. Сервис же предоставляет возможность борьбы на 3 уровне модели, что автоматически означает неидеальное совпадение. Если хочется более точного варианта - плагин для браузера, автоматически отправляющий некоторые сайты через прокси-сервер (например, SwitchyOmega для Chrome), будет работать гораздо лучше.

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

    • Вероятно, РКН внес другой IP-адрес ресурса в реестр. Список IP-адресов генерируется полностью автоматически и не может редактироваться со стороны сервиса под каждый отдельный кейс вручную. Самое простое решение - прописать до любимого ресурса статический маршрут в VPN на маршрутизаторе.

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

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

  • После включения сервиса в VPN отправляется трафик на IP-адреса, отсутствующие в реестре. Дефолт в VPN я отключить не забыл

    • Вероятно, в реестре есть IP-адрес из той же IP-подсети /24. По BGP сервис отдает только суммаризованные вверх префиксы /24 (т.е. даже если в реестре есть только адрес 1.2.3.4 - вы получите префикс 1.2.3.0/24, перекрывающий весь диапазон от 1.2.3.0 до 1.2.3.255).
      Вы всегда можете исправить эту ситуацию для себя и конкретных адресов, прописав маршрут на них через провайдера в вашем роутере статически (статика по умолчанию побеждает динамику).

  • Раньше сервис можно было настроить для получения отдельных IP-адресов (по /32). Как получать их сейчас?

    • К сожалению, сервис банально уперся в проблему масштабирования. После появления нескольких сотен пользователей и заполнения реестра в отдельные моменты более чем 2 миллионами префиксов схождение BGP-процесса сервиса могло занимать десятки минут, со всеми вытекающими в виде разрыва сессий по таймауту. Many Bothans died to... Многие оптимизации были сделаны в попытках решить эту проблему, включая миграцию с VPS на выделенный сервер, разделения на фронт- и бэкенды и т.п., но кардинально проблема была решена только отказом от раздачи по BGP списка отдельных IP-адресов.

      Если вам необходим список отдельных адресов, вы можете получать их с сайта по HTTPS и далее внедрять в свое решение, например, как описано в статье Настройка BGP для обхода блокировок, или Как я перестал бояться и полюбил РКН. Мало того, с сайта доступно гораздо больше разных списков, в том числе и в формате Mikrotik Address List, что позволяет более гибко использовать решение.

  • РКН замедляет Twitter, решение может помочь?

    • По сути - нет, потому что все эти замедления не отражаются в реестре (хотя законность такого действия спорна, но who cares). Для замедления используются ресурсы расставленных у операторов связи ТСПУ (DPI от компании RDP.RU), управление которыми идет централизованно и закрыто от постороннего взгляда. И высока вероятность, что в недалеком будущем вся фильтрация уйдет в эту сторону и реестр перестанет быть источником данных для нас.

      Мысль о развитии кастомных списков "Вот эти IP-адреса надо сделать доступными для обхода замедления" есть, но для бесплатного пет-проджекта нахрапом это требует чересчур много постоянных инвестиций. Если удастся придумать форму, в которой я смогу тратить на этот сервис разумное количество собственных сил и средств - обязательно реализую и опишу. Кстати, если у кого-то есть идеи, как это сделать, пишите в комментариях, обсудим. Ибо одна голова - хорошо, а две - мутация.

  • У меня есть вопрос, ответа на который нет в Q&A

    • Задайте его в комментариях к статье. Постараюсь ответить на все там же, а если вопрос будет интересен большому числу читателей - добавлю в Q&A.

Заключение

Предполагаю, что реестр как источник IP-префиксов для обхода блокировок исчерпает себя в начале-середине 2022 года, поэтому вряд ли эта статья потребует новой версии, скорее просто уйдет в архив как неработающее решение.

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

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

Полезные ссылки

  • Прежде всего статья Настройка BGP для обхода блокировок, или Как я перестал бояться и полюбил РКН - она была наиболее полной и подробно описывающей логику решения. Если вам хочется более глубоко погрузиться в концепцию - эта статья практически идеальна (разве что сейчас уже имеет смысл внедрять это на bird v2, с соответствующей коррекцией конфигураций решения). И еще более полезны комментарии к ней.

  • Если вам интересно более глубоко понять, что такое и с чем едят BGP в частности и сетевые технологии вообще - не могу не порекомендовать "Сети для самых маленьких" от проекта LinkMeUp

  • Если вам хочется решение на Address List - NeoBeZопубликовал короткий скрипт для выгрузки нужного с сервиса. Не забудьте, что потом по этому листу нужно реализовать набор правил для перенаправления трафика.

  • Для роутеров Keenetic есть решение от Александра Рыжова. Оно, конечно, базируется на старой версии сервиса, но легко корректируется под новую.

Подробнее..

Обзор PocketBook 740 Color революционный E-Ink-ридер с цветным экраном 7,8 дюйма

17.06.2021 06:04:26 | Автор: admin
Появление букридеров в свое время (2006-2008 годы) было революцией. Наконец-то стало можно с комфортом читать на электронном устройстве, потому что оно достойно имитирует лист бумаги. Еще одной вехой в истории читалок стало появление черно-белой матрицы E Ink Carta в начале десятых годов у нее максимально светлая подложка, высокий контраст, высокое же разрешение. Имитация листа бумаги стала практически идеальной. Со временем ридеры стали обзаводиться подсветкой, беспроводными интерфейсами, тачскринами Казалось бы, чего не хватает до полного счастья?





Единственным нюансом было то, что электронные чернила не могли отображать цветной контент. Но это преподносилось как особенность, а не как недостаток. Мол, читать с цветных экранов смартфонов и планшетов вредно, читайте лучше с бумагоподобных дисплеев E Ink. А дисплеи эти есть только в ридерах. Так что покупайте ридеры! С одной стороны, ну не могут читалки показывать цветную картинку, велика проблема! Все равно в основном мы читаем черные буквы на светлом фоне. С другой стороны, иногда нам попадаются книги с картинками. И в этом случае поддержка цвета если не обязательна, то крайне желательна. Именно поэтому создатели электронной бумаги долго работали над тем, чтобы выпустить цветную матрицу. И выпустили в прошлом году E Ink Kaleido. Именно это можно назвать главной революцией за 15 лет развития ридеров как класса устройств. Если быть совсем точным, то цветные экраны E Ink существовали и раньше, но распространения не получили. Поэтому именно Kaleido можно считать первым массовым цветным экраном E Ink.

Первым производителем, внедрившим новую цветную матрицу E Ink, стал PocketBook. Удивляться этому не приходится, так как PocketBook крупнейший игрок рынка читалок в России. А значит, ему и нести бремя технологического лидера. Пионером стала модель PocketBook 633 Color. Она заметно отличалась от немногочисленных конкурентов в лучшую сторону, потому что экран в ней установили не как есть, а оптимизированный и тюнингованный. Инженеры PocketBook работали над ним вместе со специалистами E Ink. В результате изображение получилось несколько более насыщенным, чем у конкурентов.

PocketBook 633 Color выпускалась в классическом для E Ink-читалок формате с экраном 6 дюймов. Это идеальный вариант для большинства не большой и не маленький. Однако на 6 дюймах читать удобно разве что детские книжки с картинками. А вот если вы читаете комиксы, полноформатные журналы, бизнес-документацию с графиками или диаграммами, учебники, то экран нужен покрупнее, чтобы не пришлось часто масштабировать изображение. Постоянно сводить-разводить пальцы при чтении не очень удобно.

Именно поэтому в 2021 году PocketBook выпустил новинку PocketBook 740 Color первый в мире электронный ридер с цветным экраном E Ink Kaleido диагональю 7,8 дюйма. То есть заметно более крупным, чем у 633 Color.
У меня на руках побывали обе модели и 740 Color, и 633 Color. Ниже я коротко сравню их, но особое внимание уделю старшей 7,8-дюймовой модели. А здесь для затравки скажу, что после PocketBook 740 Color обычные черно-белые читалки в руки брать уже не хочется цветная модель дает совершенно новый пользовательский опыт.

Технические характеристики PocketBook 740 Color


  • Размеры: 195136,58 мм
  • Вес: 225 г
  • Экран: E Ink new Kaleido, диагональ 7,8 дюйма, 18721404 (E Ink Kaleido Plus), 4096 цветов, сенсорный, с подсветкой
  • Процессор: Allwinner B288 1 ГГц х 2 (двухъядерный)
  • Память: оперативная 1 ГБ, внутренняя 16 ГБ
  • Беспроводные интерфейсы: Wi-Fi 802 b/g/n, Bluetooth
  • Разъемы: USB Type-C, microSD (до 32 ГБ)
  • Операционная система: проприетарная PocketBook на базе Linux
  • Поддерживаемые форматы: ACSM, CBR, CBZ, CHM, DJVU, DOC, DOCX, EPUB, EPUB(DRM), FB2, FB2.ZIP, HTM, HTML, MOBI, PDF, PDF (DRM), PRC, RTF, TXT
  • Аккумулятор: Li-Ion, 3,7 В, 2900 мАч, до 25000 страниц без подсветки


Комплектация


В коробке помимо самой электронной книги вы найдете кабель USB Type-C, адаптер с USB Type-C на 3,5 мм для подключения обычных наушников, краткую инструкцию и гарантийный талон.



Дизайн


У PocketBook 740 Color сдержанный узнаваемый дизайн. Ридер выглядит изящно, солидно. Выполнен из прочного матового пластика, устойчивого к царапинам и отпечаткам пальцев. Цвет корпуса серебристый, оттенок приятный. Сборка монолитная.



Можно подумать, что ридер с экраном увеличенного размера будет чересчур большим, однако нет. Пусть диагональ 7,8 дюйма, однако рамки вокруг дисплея узкие. Разница в диагонали экрана с 6 дюймами очень ощутима, но ридер не назвать лопатой, он не громоздкий, его вполне удобно удерживать одной рукой. Способствует этому и небольшой вес всего 220 граммов. На рынке есть 6-дюймовые ридеры с почти таким же весом.



Дисплей несколько утоплен в корпус. Так сделано специально если устройство упадет или будет оставлено где-то экраном вниз, то вряд ли повредится. Экран защищен стеклом. Прошли те времена, когда E Ink-читалки были предельно хрупкими. Хотя если вы регулярно берете ридер с собой куда-то, лучше приобрести чехол.



На лицевой панели под логотипом производителя расположились клавиши управления домой, меню, перелистывание. Очень многие производители ридеров, перейдя на сенсорные экраны, отказались от клавиш. И зря, ведь есть немало людей, которым удобнее листать или возвращаться на рабочий стол клавишами. Кнопки удачного размера (на фото кажутся узкими, но в реальности никаких неудобств), имеют четкий ход. А еще клавиши можно весьма гибко настроить для вызова различных функций.



На нижнем торце корпуса PocketBook 740 Color располагается клавиша включения и выключения (имеет отключаемую белую подсветку), разъемы для карт памяти и зарядки / передачи данных. Радует, что в этой модели используется современный формат порта USB Type-C. Ведь немало читалок застряло в прошлом с допотопным MicroUSB.



Экран


Поговорим о самой интересной составляющей PocketBook 740 Color цветном экране. E Ink принципиально отличается от ЖК-экранов тем, что содержит в прямом смысле чернила. Они заключены в миниатюрные капсулы и благодаря законам физики формируют изображение. При этом не светятся как жидкие кристаллы, поэтому нет нагрузки на глаза, мерцания. Электронные чернила на примере экрана Kaleido отображают цвет не сами, а благодаря цветному фильтру, наложенному поверх.

Причем в 2020 году этот фильтр был еще не очень совершенен, некоторые критиковали изображение за мутность, а подложку экрана за серый оттенок. Однако в 6-дюймовых ридерах стояла первая версия Kaleido, а вот в PocketBook 740 Color уже вторая. Ее называют E Ink New Kaleido или E Ink Kaleido Plus. В этой версии проблему сероватости-мутноватости исправили. Теперь картинка практически такая же идеальная как у классического E Ink Carta. Но, разумеется, не черно-белая, а цветная.

Разница между E Ink Kaleido и E Ink new Kaleido хорошо видна на этом снимке:


PocketBook 740 Color (слева) и PocketBook 633 Color

А вот кроп из него. Очень хорошо видно, что 6-дюймовый экран все же не обеспечивает необходимую четкость при чтении тех же комиксов. Буквы мелкие и размытые. А вот на 7,8-дюймовом дисплее все уже хорошо. Плюс, повторюсь, цвета куда приятнее.


PocketBook 740 Color (слева) и PocketBook 633 Color

Вот аналогичная пара кадров с бизнес-документом.



Итог тот же: на 7,8-дюймовом цветном ридере с Kaleido этот документ комфортно изучать, на 6-дюймовом нет.


PocketBook 740 Color (слева) и PocketBook 633 Color

Если сравнить с черно-белым ридером, то результат будет вот таким. Цветной всяко предпочтительнее.


PocketBook 740 Color (слева) и PocketBook 633 Color

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


PocketBook 740 Color (слева) и PocketBook 633 Color

Я уже упоминал о том, что в PocketBook не берут стоковую версию матриц E Ink, а оптимизируют картинку. Поэтому изображение более четкое, чем у конкурентов, цветопередача лучше. Есть еще один момент грейды экранов. Это как яйца есть первый сорт, есть второй, есть третий. PocketBook получает только экраны высшего грейда от E Ink. Другим производителям, как правило, достаются матрицы с какими-то недочетами. Да, пусть большинство пользователей этого не заметит, но факт остается фактом.

При этом не надо думать, что цветной электронный ридер будет выдавать вам картинку как смартфон или планшет, отображающие миллионы оттенков. Это другая технология. Я бы сказал, что изображение как в цветной газете с хорошей полиграфией. Из-за особенностей фильтра у цветного контента разрешение несколько ниже, он не такой четкий как черно-белый текст. Но все это не принципиально, потому что основная задача восприятие цветного контента выполняется. Если вы читаете учебную литературу, отчеты с графиками и диаграммами, детские книги или комиксы, вас не так волнует сочность и насыщенность оттенков. В первую очередь важно, что перед нами все тот же E Ink, который имитирует печатную страницу. А значит абсолютно безвреден для зрения.



Конечно, можно читать и на планшете, и на телефоне, и даже на компьютерном мониторе, но ощущения будут совсем иными. LCD-дисплеи бликуют на свету, выцветают на солнце. А самое плохое их мерцание. Вы этот ШИМ можете даже не замечать, но если измерить специальным устройством, то в зависимости от модели мерцание может быть чрезмерным. В итоге усталые слезящиеся глаза, в теории севшее зрение.

У E Ink-ридеров экраны сами по себе не светятся. Подсветку к ним добавляют дополнительно, она боковая, не бьет в глаза и не напрягает. Отмечу, что опции регулировки цветовой температуры подсветки у PocketBook 740 Color нет. И это объяснимо изменение оттенка подсветки повлияет на отображение цветного контента и исказит цветопередачу, которая у E Ink Kaleido, будем смотреть правде в глаза, и так неидеальна. Так что в минусы я этот момент все же не записываю.



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

Железо


PocketBook 740 Color работает на базе 2-ядерного процессора с 1 ГБ ОЗУ. Для современного смартфона этого явно мало, а вот для электронного ридера на базе операционной системы Linux уже вполне достаточно, чтобы он работал молниеносно (учитывая особенности E Ink, который сам по себе не перезаливается мгновенно).

На первое открытие обычной книги тратится пара секунд, если тяжелая PDF-ка весом в 200-300 МБ до 3-4 секунд. Перелистывание страницы занимает долю секунды. На выход из сна требуется около секунды-двух, на полное включение около 7 секунд. За все это следует благодарить операционную систему на базе Linux. Конкуренты с Android гораздо более задумчивые (только включаются полминуты, большой файл могут открывать по 10-15 секунд), активно жрут батарейку в режиме ожидания (2-4% в день) и все это при том, что процессоры в Android-ридерах используются, как правило, 4-ядерные.

Встроенная память PocketBook 740 Color 16 ГБ. Этого хватит на 30 тысяч книг в текстовых форматах и на десятки аудиокниг. При желании всегда можно подключить карту памяти.

Софт


Установлена собственная ОС PocketBook на базе Linux. Не только шустрая, но и удобная. Версия прошивки конкретно в PocketBook 740 Color 6.1, в ней обновили элементы оформления, изменили порядок иконок в меню, добавили отображения заряда в статусную строку. Стало выглядеть более свежо и современно. У покетбуков по традиции продуманный софт. Не только библиотека и чтение, как у конкурентов, а развитая ОС. Полноценный рабочий стол, статусная строка, шторка с ярлыками, приложения (в том числе, игры, рисовалка, RSS-ридер, калькулятор, почтовый клиент, заметки)



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

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



Библиотека удобная с различными возможностями каталогизации книг / сортировки файлов.

Думаю, всем интересно, что стало с интерфейсом PocketBook при наличии цветного экрана. Ничего особенного не стало. На мой взгляд, и нет смысла раскрашивать каждый элемент как новогоднюю елку. Цвет используется только там, где он нужен. Например, при выделении текста разными маркерами. Или в приложениях Scribble (рисование), раскраска. Фотографии в галерее, конечно, тоже отображаются в цвете.

Чтение


Покетбуки по традиции всеядны (20 форматов). Вряд ли вы найдете такой формат текста, который они не знают. Файловая система открыта, можно загружать файлы в любую папку или в корневой каталог. Хотя сегодня передача книг по кабелю уже прошлый век. Так что в PocketBook 740 Color, как и у других моделей компании, есть Wi-Fi и поддержка облачного сервиса Dropbox и собственного облака PocketBook Cloud. Если вы пользуетесь на смартфоне приложением PocketBook, то оно позволит синхронизировать процесс чтения одной книги и на ридере, и на телефоне. Книги на читалку можно отправлять и по email.

А еще, конечно же, книги можно приобретать во встроенном книжном магазине. В 2021 году PocketBook запустили новую версию своего магазина, который также доступен по ссылке books.pocketbook.ru. Все файлы там проверены и будут идеально отображаться. А цены такие же как в других популярных интернет-магазинах вроде Литреса.

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



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

Не у всех покетбуков есть поддержка аудиофайлов, однако топовые модели, в том числе PocketBook 740 Color, без этого не обходятся. Поддерживаются форматы MP3, M4A, M4B, OGG, OGG.ZIP, MP3.ZIP. Зачем это нужно, если музыку удобнее слушать со смартфона? Не для музыки, а в первую очередь для аудиокниг есть удобное приложение с отображением глав и регулировкой скорости чтения. А еще можно одновременно читать и слушать книгу на иностранном языке. Это эффективная методика изучения языков.



Кроме того, в PocketBook 740 Color есть опция озвучивания текста (Text-to-Speech). Она позволяет превратить текстовую книгу в аудиокнигу совершенно бесплатно. Если еще несколько лет назад машинное чтение было неидеальным, то сейчас слушабельно. Да, могут быть запинки или неправильные удаления (второе, кстати, особенность великого и могучего русского языка, во многих иностранных такой проблемы нет), но не критично. Удобно в машине, например, или даже дома, если занимаетесь делами. Меняется скорость чтения, можно выбрать мужской или женский голос.

К ридеру можно подключить автомобильную аудиосистему, Bluetooth-колонку, беспроводные наушники. Также можно использовать проводные наушники с разъемом Type-C или подключить обычные через переходник на 3,5 мм. Хорошо, что в PocketBook позаботились о том, чтобы включить такой аксессуар в комплект поставки.



Автономность


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

У цветной модели есть свои нюансы. Батарею PocketBook 740 Color получил мощную (для такого типа устройств 2 900 мАч), однако от одного заряда работает до 1-1,5 месяцев вместо двух в случае черно-белых ридеров PocketBook с менее мощными аккумуляторами. Дело в том, что для более сочного отображения цветного контента приходится делать подсветку ярче. А она тратит заряд батареи. К слову, если не пользоваться подсветкой вообще, то PocketBook 740 Color и три месяца проработает до следующей зарядки.

Выводы


Да, можно признать, что PocketBook 740 Color это революция в мире ридеров на электронных чернилах с самого момента их появления. Первая модель, которая сделала чтение в цвете по-настоящему комфортным, без компромиссов. У цветного E Ink все те же преимущества, что и у обычного выглядит как книжная страница, нет нагрузки на зрение, пассивная подсветка, супер-экономичный расход батареи. Вдобавок к этому отображается цветной контент. Да, пусть не так сочно и ярко, как на смартфоне, но это не принципиально.

Большой цветной покетбук маст-хэв для тех, кто читает бизнес- или техническую литературу с графиками, диаграммами, детские книги (можно состояние сэкономить на покупке бумажных изданий), исторические книги с иллюстрациями, комиксы, журналы, учебники. PocketBook 740 Color с дисплеем 7,8 дюйма отображает любой цветной контент в комфортном виде, не придется зумить страницу или переворачивать девайс в ландшафтный режим. В случае 6-дюймовой модели все это придется делать, так что PocketBook 633 Color можно советовать разве что на роль детского ридера. У литературы для детей обычно такая верстка, что она нормально отображается на небольшом дисплее.



Другие плюсы 740 Color до полутора месяцев автономной работы (если редко использовать подсветку, то до 2-3 месяцев), широкий выбор способов загрузки книг, поддержка всех форматов, аудиофайлов и опция озвучивания обычных книг, изящный корпус, компактные размеры, минимальный вес, продуманный софт, разъем Type-C.

Короче говоря, перед нами топ-модель, да еще и с цветным E Ink. Цена в 21 999 рублей выглядит адекватной. Для сравнения почти аналогичный монохромный 7,8-дюймовый ридер PocketBook 740 Pro стоит 19 999 рублей. Две тысячи не такая уж и большая доплата за революцию. Радует, что в PocketBook не пытаются накрутить цену.

В обзорах принято упоминать недостатки, но я их не вижу. Ну разве что в 740 Color нет защиты от воды, хотя в принципе PocketBook с этой фишкой знакомы в некоторых других ридерах компании она есть. Но в остальном Нет смысла ругать цветной флагман за высокую цену. Цена оправдана. И я могу смело рекомендовать устройство к покупке.
Подробнее..

Почему свернули проект ядерного самолета, и чем закончилась попытка добыть нефть с помощью ядерных взрывов

20.02.2021 16:15:19 | Автор: admin


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

Ледоколы

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

Советский атомный ледокол ЛенинСоветский атомный ледокол Ленин

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

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

Затем в советское время стали интенсивно строиться серии ледоколов. И эта флотилия ледоколов работала до Карских ворот и дальше. Последний атомный ледокол 50 лет Победы был уже построен при Новейшей России. Сейчас он единственный, который находится в строю.

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

Российский атомный ледокол 50 лет ПобедыРоссийский атомный ледокол 50 лет Победы

Атомные автомобили

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

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

Nucleon первый проект атомобиляNucleon первый проект атомобиля

Саму идею поставить ядерный реактор на колеса специалисты оценивают скептически. Они считают, что это крайне опасно, потому что в случае поломки реактора придется эвакуировать всё население в радиусе тридцати-сорока километров.

Век без дозаправки!, с таким громким лозунгом несколько лет назад американская компания представила проект автомобиля на ториевом реакторе. Причём по конструкции он напоминает старый Nucleon: кабина тоже убрана подальше от атомного двигателя. Хотя торий не такой опасный и радиоактивный, как плутоний или уран (для создания ядерной бомбы он не годится), тем не менее без защиты для пассажиров и водителя в таком автомобиле не обойтись.

Проект Кадиллака на ториевом двигателеПроект Кадиллака на ториевом двигателе

Советский атомолёт

После Второй мировой войны супердержавы по разные стороны океана разрабатывали проект ядерного самолёта. Идея создать бомбардировщик с практически неограниченным радиусом полета была очень заманчивой. В СССР испытательную лабораторию сделали на базе ТУ-95.

Советский атомолет Ту-95 ЛАЛСоветский атомолет Ту-95 ЛАЛ

В США экспериментальный реактор установили на модифицированную версию стратегического бомбардировщика B-36. Атомная установка и система защиты экипажа составляли блок массой шестнадцать тонн, то есть полезной нагрузки было очень мало. Для какого-либо запаса бомб места практически не было.

Атомный стратегический бомбардировщик В-36Атомный стратегический бомбардировщик В-36

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

Бредовая идея канадских ученых

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

В Канаде собирались добывать нефть с помощью ядерных взрывовВ Канаде собирались добывать нефть с помощью ядерных взрывов

Для испытания подобрали место в провинции Альберта. Но такие новости вызвали панику среди местных жителей. Серия подземных ядерных взрывов в СССР и США показала, что подобные опыты опасны для окружающей среды. Так что одобренный правительством проект резко свернули.

Заключение

Давняя мечта фантастов и ученых создать эффективный термоядерный реактор. Топливо для него (дейтерий или водород) можно добывать из морской воды. Ядра этих элементов при слиянии выделяют огромное количество тепла. Сама реакция абсолютно безопасна, но пока создать установку, которая производит больше энергии, чем потребляет, не удалось.

Экспериментальные реакторы строят в США, Великобритании, Китае и во Франции. Вполне возможно, что в XXI веке вместо ядерной гонки начнется термоядерная.

Подробнее..

BitClout. Котики осваивают новую криптовалюту и соцсеть

28.03.2021 18:07:46 | Автор: admin

Добрый день, дорогие друзья.

Первое европейское котокафе и приют нового типа Республика Кошек, благодарит нашего друга писателя Алекса Кимена, за предоставленную возможность рассказать в его блоге на Хабре о нашем скромном опыте по освоению новой социальной сети и криптовалюты BitClout.

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

Так же мы подскажем, как можно зарегистрироваться в этой социальной сети и немного поэкспериментировать.

И так, что же такое BitClout?

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

Вот ссылка на whitepaper BitCloud на английском языке: https://drive.google.com/file/d/1nUA7ysEKhZntwpTPHR4JXTOo8P1hlex4/view?usp=sharing

Для работы в этой сети вам необходимо владеть минимальным объемом монет самого BitClout. Рыночная цена монеты на данный момент около $148. Для базовых действий с аккаунтом переименование, постинг и т.п. вам нужно владеть некоторой минимальной суммой. Обычно достаточно иметь эквивалент в $0.01.

Изначально, вы имеете в своем распоряжении именно BitClout (так же для понимания пишется цена в $).

Эти деньги вы можете:

1) Дарить

2) Покупать на них монеты других пользователей

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

Таким образом, у пользователей появляется гипотетическая возможность привлечь средства для своих проектов. Способы получения средств:

1) Продажа своей монеты. Чем больше у вас подписчиков, покупателей и т.п. тем выше стоимость вашей монеты. Таким образом имеет смысл развивать свой блог. Напомним, что BitClout соцсеть и там можно постить фотографии, ссылки и сообщения. Чем больше у вас подписчиков, тем выше цена вашей монеты и общая ваша капитализация. В перспективе это можно монетизировать через рекламные записи в вашем блоге.

2) Комиссия за продажу монету (чуть дальше расскажем подробнее)

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

4) Инвестирование или спекулятивная покупка монет тех пользователей, популярность (и цена монет) которых, как вы полагаете, будет расти.

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

1) Следует учесть, что на данный момент пользователям из некоторых регионов (США, Англия и каких-то других - точного списка нет, но наверняка это развитые страны) при регистрации дается бонусная сумма BitClout около $7.4. Если у вас есть такая возможность, регистрируйтесь через VPN от этих стран и укажите телефонный номер этих стран, для получения бонуса. Важно одновременно использовать ВПН и телефонный номер целевой страны. По отдельности бонус не начисляется. Телефон можно использовать только один раз. Если вы укажите американский телефон, но войдете с российского IP (или наоборот) - вы не получите бонус.

2) Регистрация возможна только по специальной ссылке: https://bitclout.com/?password=e6c71ab9a53127276d522e66f7856ffb50a1e6a9e9332fe42d5ace6745a3eddc

3) ОЧЕНЬ ВАЖНО: ЗАПИСАТЬ 12 КЛЮЧЕВХ СЛОВ (СИД-ФРАЗУ) ПРИ РЕГИСТРАЦИИ. БЕЗ ЭТОЙ ФРАЗ В ПОТЕРЯЕТЕ ДОСТУП К АККАУНТУ!!!

4) При регистрации можно пропустить ввод телефона и электронной почты. Это можно сделать позднее.

5) Когда вы пройдете 4 шага регистрации, система скажет, что без некоторой суммы, вы не сможете создать профиль и предложит вам купить BitClout.

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

ВАЖНО: сейчас отсутствует системы вывода денег обратно с BitClout!!! Отправив туда ваши деньги, вы не сможете сейчас их получить назад! Эту функцию обещают добавить, но сейчас вывода денег нет!

Альтернативный вариант получить стартовый бонус, привязав телефон. Но только для некоторых стран: США, Англия + возможно другие. На номера РФ бонусы не дают.

6) Что делать, если у вас нет телефона в США, и вы не готовы отправлять в систему ваши биткойны?

Ради этого и написана эта статья. Уже на этом этапе вы получаете публичный ключ. Он доступен при нажатии кнопки Wallet. Если вам интересно поиграть с этой соцсетью, но у вас нет возможности отправить туда деньги, вы можете в комментариях к этому сообщению опубликовать публичный ключ, полученный вами на этом этапе.

Мы постараемся отправить туда $0.01. Этого будет достаточно, для активации аккаунта. Так же мы призываем всех читателей, у кого есть возможность получить бонус поддержать тех пользователей, кому нужна минимальная сумма для активации аккаунта.

7) После получения денег у вас появится возможность заполнить ваш профиль. При этом важно обратить внимание на такой параметр, как Founder Reward Percentage процент вознаграждения пользователя. Это сумма (в BitClout) которую вы будете получать, каждый раз, когда кто-то покупает вашу монету. Она будет аккумулироваться на вашем счете BitClout см. верхний правый угол. Если вы укажете 0 то вы не получите ничего. Если вы укажете 100 то вы получите все, а покупатель ничего. По умолчанию стоит 10%. Тут важно соблюсти баланс. Но окончательный механизм работы и стратегия использования этого показателя пока окончательно неясна.

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

Мы будем очень благодарны вам, если вы подпишетесь на наш блог в BitClout. И поддержите нас.

О нас:

"Республика кошек" в Санкт-Петербурге первое в России котокафе и центр Котокультурной столицы страны с 2011 года.

Место для творческих персон Петербурга, любителей кошек, туристов;

Рупор и витрина для бездомных кошек, своеобразная альтернатива привычным формам приютов;

Ежегодно более 700 животных находят здесь новый дом, заведение посещает порядка 100 тысяч петербуржцев и гостей города;

Площадка для привлечения внимания общественности к проблемам бездомных животных и гуманного к ним отношения;

BK: https://vk.com/cats_republic

FB: https://www.facebook.com/CatsRepublicRus

Наш публичный ключ в BitClout:

BC1YLiGvMGoARwCaXgtxCTB48mSpeCZnboQS34UgoMsr73Dv1m5koe2

Наш юзернейм в BitClout: CatsRepublic

Большое спасибо за вашу поддержку!


Подробнее..

Эффективный email как суперсила рекрутера и эйчара

02.02.2021 18:09:11 | Автор: admin

История про рекрутера Марию

Жила-была девушка Мария.Маша работала в рекрутинге вот уже 3 с хвостиком года. Она была опытным и смелым рекрутером, и закрывала за месяц около 4-5 вакансий уровня Middle/Senior. Соискатели и кандидаты очень любили Машу за ее искренность, честность, ответственность и персональный подход к каждому. А Маше, в свою очередь, нравилось общаться с людьми, помогать им и ежедневно узнавать что-то новое. Уже с первого рабочего дня Маша знала, как важно написать правильно первое письмо или сообщение в LinkedIn, и сделать эффективный, персонализированный first touch. В ее понимании first touch = first impression.

По опыту знаю, что без ответа остаются шаблонные и не персонализированные письма.

Изучить информацию о получателе, да это время, но оно не зря потрачено, потому что это будут письма которые не останутся без ответа, и автор письма реализует свои цели деловой переписки! Плюс я всегда стараюсь вести себя честно в переписке и четко понимаю зачем я это делаю! На что обращаю внимание:

  • тема должна быть информативной кратко передавать суть письма;

  • структура и суть должна быть такими, что пробежав глазами было понятно о чем пойдет речь (особенно в мобильной версии);

  • и последнее обязательно "call to action", в надежде все таки получить ответ :)

Яна Разумова, HRD в Bergx2

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

82% соискателей отвечали Маше на email, сообщения в LinkedIn, а иногда и на Facebook. Половина из них с удовольствием соглашались на скрининг-интервью. И даже когда по итогу всех процессов выбрали не ее кандидата, Маша оставалась на связи со всеми соискателями, бережно храня новые контакты.

Наступили сложные времена COVID-19, и компания, в которой Маша работала последние несколько лет, не выдержала кризис. Сотрудникам пришлось искать свое место под IT солнцем. Маша не стала исключением из правил.

И вот, в конце 2020, за пару недель до нового года Маша получила оффер в большую и прогрессивную продуктовую компанию с центральным офисом в США!

Ура! Новые вызовы, новые правила, новые устои, и новый режим: теперь вся коммуникация на английском, и все события онлайн, знакомство с коллегами в Zoom. Спустя пару рабочих дней Маше на почту пришло следующее письмо:

Как думаете, понравилось ли оно Маше? А вам?

Как бы вы оценили это письмо? Как бы ответили на него?

Возможно, написали бы его иначе или перефразировали?

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

Письмо выглядит грамотным, структурированным и аккуратным. Можно поставить плюсы за:

  • пунктуацию,

  • Subject line,

  • приветствие и прощание,

  • ссылку на материалы.

И все же есть моменты, на которые стоило бы обратить внимание.

Hi, Marina!" составляете вы текст на английском, русском или же украинском, будьте внимательней с именами. Марина, возможно, была бы и рада получить такое дружественное письмо. А вот для Марии оно, скорее всего, было обидным.

Листи я формую або укранською, або англйською. Якщо у другому варант все однозначно (як спецалст вказу себе в LinkedIn), то укранський правопис вирзняться правилами. Наприклад, у мене була цла дискуся з скрншотами з нженером Олегом. Кличний вдмнок нового (вд 2019 року) правопису дикту як архачне звертання "Олеже", так "Олегу".

Люда Зюман, Recruiter в EvoTalents

There are a few CVs конструкция there is/there are сбивает с толку читателя и отводит от главной мысли письма.

Proposed можно случайно выйти замуж и даже не заметить этого.

"Are seen/ was opened/ can be found" пассивный залог в тексте, приводит в замешательство. Кто и что должен сделать? Предложения с пассивным залогом тяжелые, увесистые и трудно читаемы.

"CVs can be found here" ссылка это хорошо. В то же время, она должна быть физически больше и заметней. Это поможет читателям открыть письмо даже на телефоне и спокойно увидеть, куда нужно нажимать.

"Don't / might not" два отрицания, идущие одно за другим. Чем больше в письме или речи негативных слов, тем больше негативного отношения вызывает текст и человек на уровне подсознания.

"Don't hesitate to drop a line to Lena" реципиенту понадобится приложить дополнительные усилия, чтобы понять отправителя. Какое отношение to drop a line имеет к твоему отпуску? Что делать с этой информацией дальше?

"For a professional recruiter like you it won't be hard ;-)" и "Thanks in advance!" со стороны это может выглядеть как скрытые за смайлами и эмодзи пассивно-агрессивные манипуляции. Лучше используйте "I appreciate your help."

Subject: New tasks for the recruitment team хорошо, что есть subject line. В то же время, по нынешним стандартам лучше сократить его в два раза.

Hi, Marina та Best regards! несоответствие неформального и делового стилей.

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

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

Think, write, and think again.

Alexey Kovalenko, Managing Partner at Savvy

Но как выглядит хороший email? На что обращать внимание, составляя письмо кандидату, сотруднику, коллеге или клиенту? Предлагаю рассмотреть следующие 8 правил, и затем разберем каждое из них более детально.

8 правил хорошего письма

ХОРОШЕЕ ПИСЬМО ДОЛЖНО

быть ясным

одно письмо = одно дело

быть коротким

иметь subject line

быть простым

быть без грамматических ошибок

иметь четкую структуру

иметь call to action

Теперь давайте перейдем к детальному объяснению каждого из пунктов.

Что такое ясное (или 'clear' на англ.) письмо?

У письма должна быть цель. Не начинайте писать, пока не ответите себе на вопрос Что я хочу получить от читателя в итоге?.Реципиент хочет понять, что от него требуют, прочтя написанное всего один раз. Для этого ставьте цели, составляйте текст, используйте короткие слова и сокращайте длинные предложения.

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

Например, вы посылаете огромное сопроводительное письмо, и перегруженный подобными письмами рекрутер выбирает кандидата с письмом по сути. Вы копируете часть сообщения из другого источника и отправляете письмо с тремя разными не читаемыми шрифтами - и ваш собеседник закрывает сообщение без ответа, потому что это невозможно читать. Вы пишете сложным языком - и коллега откладывает ответ вам, чтобы разобраться позже, и больше не возвращается к диалогу. Вы не заботитесь кратко очертить суть в теме письма, и ваше письмо теряется в почтовом ящике среди других Re:Fwd:a quick question. Вы не пишете в письме, чего именно ожидаете в ответ от собеседника - и переписка останавливается. Вы пишете сухим языком - и коллега тянется за стаканом с водой вместо того, чтобы ответить вам. Нам выгодно заботиться о человеке по другую сторону экрана, потому что это сделает переписку эффективнее. And its a nice thing to do.

Саша Голубева, Internal Communications в Very Good Security

Какое письмо короткое, а какое нет?

Для стандартного делового письма будет достаточно 100 слов или 5 предложений.

Less than five sentences is often abrupt and rude, more than five sentences wastes time.

Guy Kawasaki, a Silicon-Valley based author, speaker, entrepreneur, and evangelist

Каким должно быть простое письмо?

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

У меня нет скриптов, всегда от человека иду. Но в целом коротко и по делу. Если совсем ничего не знаю о человеке, просто здороваюсь, почему написала (что предлагаю) и интересно ли? Иногда прошу коллег, если знаю, что они знакомы, сделать интро.

Светлана Рыбалка, Recruiter в AB Games

А что по структуре?

Приветствие

Hello

Персонализированная эмоция

Many thanks for your

Цель

I am writing to

Почему это важно

It is important because..

Call to action

Could you.. / It would help if you

Эмоция

I appreciate your help

Прощание

Best

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

Марина Попруженко, Recruiter в EvoTalents

Одно письмо = одно дело, но можно обо всем и сразу?

One thing at a time или Одно тело = одно дело. Каждое отправленное вами письмо должно быть посвящено только одному. Если вам нужно сообщить о другом вопросе, рассказать о новом проекте, или поделиться чем-то еще лучше написать новое письмо с новой Subject line.

Особенности Subject line

Первым делом ясность и четкость, а креатив и сюжетная линия потом.

Основатель компании Backlinko Брайан Дин в своей статье писал, что строки, где subject line не превышает 36-50 символов (или 4-8 слов), имеют значительно больший процент открытий.

В 2021-м году реципиенты будут читать имейлы в большинстве случае с iPhone. Он, в свою очередь, отображает 37-41 символ (примерно 4-7 слов) и затем обрезает строку. Итог прост: subject line около 20 символов или из 4-х, 3-х, 2-х, а может даже одного слова, увеличивает вероятность открытия и прочтения письма.

Какие основные правила построения Call to action?

Главное правило помнить о нем.

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

  1. Начинайте с глагола: Что человеку нужно сделать?

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

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

  4. Давайте не больше двух вариантов. Исследования в передаче Mind Field показали: чем больше у человека вариантов для выбора, тем дольше он думает и сильнее расстраивается, если что-то вдруг пошло не так. Более того, при наличии двух вариантов человек склонен принимать решение быстрее и уверенней.

Bang!

Воспользуйтесь этим чек-листом, чтобы создать письмо иностранному клиенту, коллеге, кандидату или партнеру правильно:

  1. Прежде чем писать, подумайте, зачем вы составляете письмо: что вы хотите, что человек должен сделать.

  2. Заполните Subject line. В идеале 3 и меньше слов, или до 20 символов.

  3. Напишите текст соответственно структуре.

  4. Отдельно проверьте на call to action поймет ли получатель, чего вы от него хотите?

  5. Правильно написали имя реципиента?

  6. Проверьте все сообщение на корректность языка через сервисы (такие как Grammarly и LanguageTool), словари и Google поиск. Сочетаются ли стиль начала и завершения друг с другом?

  7. Перечитайте текст второй раз, как еще можно его сократить?

  8. В случае, если отправляете файлы проверьте, прикрепили ли их?

  9. Внесите в строку отправителя его почту.

  10. Нажмите отправить.

И помните, каждое отправленное письмо ваш личный #TheSmartWayofLearning.

Ваша Марго Подлесная,

PR Manager в Savvy

Подробнее..

Kaspersky EDR для вашего бизнеса

16.02.2021 00:14:13 | Автор: admin


Давно прошли те времена, когда для проведения сложной хакерской атаки необходимо было привлекать серьезные ресурсы и компетентных специалистов. Сейчас продвинутое вредоносное ПО можно без особых усилий приобрести в даркнете, а то и вообще арендовать на время по модели MaaS (Malware-as-a-service).

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

Решения класса EDR


Шквал целевых атак привел к появлению особого типа инструментов обеспечения информационной безопасности, получивших название EDR (Endpoint Detection and Response). Активность EDR направлена на защиту конечных узлов корпоративной сети, которые чаще всего и становятся входными воротами атаки. Главными задачами EDR является обнаружение признаков вторжения, формирование автоматического ответа на атаку, предоставление специалистам возможности оперативно определить масштаб угрозы и ее источник, а также собрать данные для последующего расследования инцидента.

Функциональность EDR основана на способности этого типа ПО проводить подробный анализ событий и проактивный поиск угроз, автоматизировать повторяющиеся повседневные задачи по защите, проводить централизованный сбор данных мониторинга состояния конечных устройств. Все это помогает поднять производительность труда специалистов по ИБ, работающих, например, в SOC (Security operations center) крупной компании.



Kaspersky Endpoint Detection and Response


Несколько лет назад Лаборатория Касперского вышла на рынок EDR с собственным решением Kaspersky Endpoint Detection and Response (KEDR), которое успело заработать себе хорошую репутацию в глазах отраслевых экспертов. Компании, серьезно заботящиеся об информационной безопасности, как правило применяют KEDR в составе комплексного решения, в которое входят собственно сам KEDR, платформа Kaspersky Anti Targeted Attack (KATA) и сервис Managed Detection and Response (MDR).

Такая связка позволяет специалистам по кибербезопасности эффективно противостоять самым продвинутым и передовым типам современных атак. Как правило, к подобным решениям прибегают организации уровня Enterprise имеющие собственный SOC или хотя бы отдельный небольшой департамент безопасности. Стоимость необходимых лицензий на ПО и сервисы достаточно высока, но если речь идет, например, о банке национального масштаба, то потенциальные риски многократно превышают расходы на обеспечение ИБ.

Оптимальный EDR для среднего бизнеса


Зачастую компании среднего размера не могут позволить себе содержать собственный SOC или держать в штате несколько профильных специалистов. При этом они, конечно же, также заинтересованы в возможностях, предоставляемых решениями EDR. Специально для таких клиентов Лаборатория Касперского совсем недавно выпустила продукт Kaspersky EDR для бизнеса ОПТИМАЛЬНЙ.

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

Помимо вышеупомянутого Kaspersky EDR для бизнеса ОПТИМАЛЬНЙ, включающего технологии класса EPP (Endpoint Protection Platform) и базовые технологии EDR, в состав фреймворка входят также инструмент Kaspersky Sandbox и сервис Kaspersky MDR Optimum.

Перечислим ключевые возможности Kaspersky EDR для бизнеса ОПТИМАЛЬНЙ. Основной его функцией является мониторинг конечных устройств, обнаружение возникающих угроз и сбор сведений о них.

Для каждого выявленного инцидента составляется граф развития атаки, дополненный информацией об устройстве и активности его операционной системы. Для поиска угроз или следов прежних атак продукт может использовать индикаторы компрометации (IoC), выявленные в ходе проведенного расследования или загруженные из внешних источников.

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

Функциональность продукта может быть существенно расширена, благодаря средствам интеграции с другими продуктами Лаборатории Касперского облачным сервисом Kaspersky Security Network, информационной системой Kaspersky Threat Intelligence Portal и базой данных Kaspersky Threats. Данные технологии и сервисы входят в стоимость лицензии (KSN) или предоставляются бесплатно (OpenTIP, Kaspersky Threats).

Архитектура и развертывание


Для развертывания в корпоративной сети Kaspersky EDR для бизнеса ОПТИМАЛЬНЙ не требуется больших вычислительных ресурсов. На всех конечных устройствах должен быть установлен Kaspersky Endpoint Security с включенным компонентом Endpoint Agent, совместимый с любыми операционными системами Windows, начиная с Windows 7 SP1/Windows Server 2008 R2 и занимающий не более 2 Гбайт дискового пространства. Для его полноценной работы достаточно одноядерного процессора с тактовой частотой 1,4 ГГц и 1 Гбайт (x86), 2 Гбайт (x64) оперативной памяти.

Несколько выше системные требования к компьютеру, с которого будет осуществляться управление решением. Речь идет о локальном сервере Kaspersky Security Center, оснащенном консолью администрирования, но можно воспользоваться и облачным сервисом Kaspersky Security Center Cloud Console. В обоих случаях доступ к управлению продуктом осуществляется через веб-браузер. Для работы локального сервера Kaspersky Security Center потребуется доступ к СУБД Microsoft SQL Server или MySQL.

Развертывание Kaspersky Security Center происходит при помощи мастера инсталляции и не занимает много времени. В процессе установки создается папка для хранения установочных пакетов и обновлений, а также конфигурируется сервер администрирования.

Установка Kaspersky Endpoint Security с включенным компонентом Endpoint Agent выполняется централизованно, при помощи мастера развертывания защиты. В процессе инсталляции администратору предлагается определить перечень защищаемых хостов, скачать установочные файлы, настроить политику уведомлений о событиях безопасности и пр. После этого, собственно, начнется развертывание в соответствии с выбранными опциями.

Альтернативным способом распространения Kaspersky Endpoint Security с включенным компонентом Endpoint Agent по сети может быть использование групповых политик Windows.
С выходом Kaspersky EDR для бизнеса ОПТИМАЛЬНЙ компании получили возможность использовать современные инструменты обнаружения и реагирования на угрозы без необходимости инвестирования в собственную службу ИБ.

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

Scratch JR развитие логики и знакомство с основами программирования для дошкольников

06.04.2021 22:08:34 | Автор: admin

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

Один из лучших инструментов для знакомствадетей с программированием Scratch JR графическая среда для создания первых проектов в цифровом мире.

Интерфейс Scratch JR на планшете

Работает Scratch JR на большинстве популярных планшетов, на iPad, на Android и даже на Kindle. Также можноустановить Scratch JR на ноутбукна Macина PC).

Интерфейс Scratch JR на компьютере

Единственное отличие компьютерной версии главный персонаж не котенок, а смешной инопланетянин Тик. Главное дать ребенку для работы ноутбук с тачпадом, так-как с мышкой дошколята еще не справляются.

Учить детей программированию на Scratch JR совсем не сложно. Просто перетаскивайте разноцветные блоки вниз и соединяйте. Первым всегда идет желтый блок с условием выполнения. Посмотрите как запрограммировать персонажа чтобы он подпрыгивал, когда мы нажимаем на него (пальчиком на планшете, и мышкой на ноутбуке).

Соединение блоков

А вот так юный программист может запрограммировать перемещение персонажа на 10 клеточек вправо (клеточки включаются кнопкой вверху).

Включение сетки

Обратите внимание! Тик стоял на клеточке 4, а после перемещения вправо оказался на клеточке 14, таким образом, включая клеточки, мы превратили Scratch JR в идеальный математический тренажер для подготовки к школе!

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

Вот, посмотрите, чтобы взять яблоко, Тику надо сделать 10 шагов направо. А как мы это поняли? Мы от 15 (где лежит яблоко), отняли 5 (где стоит Тик), и получилось 10.

Устный счет

А на этой картинке Тику надо подпрыгнуть вверх на 8 клеточек, чтобы слопать персик. А как же мы это посчитали? Надо из 12 (высоты персика над полом), отнять 4 (высоту Тика над полом), и получится 8.

Изучение арифметики

Персик запрограммирован вот так, поэтому при касании Тика он уменьшится в 2 раза.

Скрипт персика

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

Добавление персонажа

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

Изменение фона

Таким образом программирование на Scratch JR позволяет ребенку не только прокачать математические способности и алгоритмическое мышление, но и важнейшее качество 21 века креативность, способность сочинять свои собственные истории и рассказывать их в цифровом мире.

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

Обязательно установите Scratch JR, и покажите его детям, я уверен, что они быстро освоятся и начнут креативить, а чтобы вам было немного проще, можете использовать мою книгу, в которой есть идеи 16 проектов для юных программистов.

Бестселлер про создание проектов на Scratch JR

Также можете использовать уроки по программированию на Scratch JR по ссылкеhttps://codim.online/ScratchJR

Подробнее..

Новинки 2021 года для разработчиков и администраторов информационных систем 1С

18.06.2021 10:22:12 | Автор: admin
Тебе, одинэсник! 1С с завидной регулярностью выпускает обновления для своих приложений, и вот, на мой взгляд, самые интересные из тех, которые вышли за первую половину этого года. Мы в WiseAdvice-IT постоянно отслеживаем обновления 1С, и делимся с читателями Хабра своими наблюдениями.



Тестовая версия платформы 1С: Предприятие 8.3.19


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

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

  • Помимо этого, ускорена работа функции выражения ограничения доступа к данным СтрСодержит(). Функция используется, в основном, в шаблонах ограничений в ролях, одним словом RLS. Присутствует в каждой типовой конфигурации, поэтому эта оптимизация может существенно ускорить работу пользователей с ограниченными правами.
  • Если у вас файловая база, в которой есть механизмы, получающие большое количество данных с упорядочиванием и индексацией, то в новом релизе данные запросы будут ускорены за счет оптимизации доработки оператора В.
  • Бывают случаи, что в клиент-серверном варианте по разным причинам необходимо загружать .dt-файл. Для этого был разработан механизм загрузки с использованием нескольких фоновых заданий сразу, а не последовательно, как было ранее.

Разработчикам будут полезны следующие изменения:

  • Обработчики событий ПередПечатью, ПередЗаписью и ПослеЗаписи теперь реализованы для всех элементов формы, поддерживающих возможность сохранять и печатать.
  • При настройке характеристик объектов конфигурации существует возможность определять, какие поля объектов содержат имена этих характеристик. В прошлых версиях при изменении представлений характеристик поля настроек стирались.
  • Полезное изменение коснулось планов обменов: методы ЗарегистрироватьИзменения() и УдалитьРегистрациюИзменений() теперь могут соответственно регистрировать и удалять изменения для произвольного набора объектов данных. Они передаются в виде определенного параметра, значением которого является массив данных. Действие для всех объектов, находящихся в переданном массиве, будут выполнены в рамках одной транзакции с минимальным количеством используемых запросов. Теперь, например, гораздо проще регистрировать/удалять, например, связанные регистры для справочников или документов.
  • Для отчетов появились методы для принудительной установки режима отображения результата исполнения отчета.

Материал подготовлен при поддержке Telegram-канала Новости из мира 1С

Анонс 8.3.20


Последняя версия 8.3.19, хотя пока и тестовая, стала важным шагом к появлению двадцатки, в которой обещает быть развитие расширений: поддержка определяемых типов, планов видов характеристик и общих реквизитов.

Именно этого часто не хватало для нормальной работы с расширениями при доработке типовых конфигураций, так как приходилось часть доработок вести в расширении, а часть в самой конфигурации, что не добавляло удобства. Не придется изменять процедуры, где описывались типы объектов конфигурации, например, Справочники.ТипВсеСсылки().Типы(), в будущей версии такие методы также будут включать объекты, созданные в расширениях.

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

1С: Исполнитель(X)


В первом полугодии 1С анонсировала развитие текущей версии 1C: Исполнителя 1C: Исполнитель(Х), имеющую архитектуру, позволяющую 1C: Исполнителю(Х) работать как родное приложение (native application) в операционных системах Windows и Linux (поддержка macOS планируется в дальнейшем), и не требующую предварительной установки JRE.

Напомню, 1C: Исполнитель оригинальный кроссплатформенный командный интерпретатор собственного строго типизированного и регистрозависимого сценарного языка, который вышел всего годом ранее в июне 2020 года.

В поставку 1C: Исполнителя входит собственная интегрированная среда разработки 1C:Executor IDE, имеющая в своей основе 1С:Enterprise Development Tools (EDT). Для 1C:Executor IDE требуется предварительная установка соответствующий среды выполнения Java Runtime Envinronment (JRE), созданной специально для выполнения приложений, разработанных с применением языка Java.



В рамках стратегии развития продукта вендор анонсирует его ускоренный вариант, который планирует развивать параллельно с универсальным:

  • 1С: Исполнитель(U) универсальный (U Universal) вариант продукта, требующий установки Java;
  • 1С: Исполнитель(X) редакция, поставляемая как X eXecutable файл исполняемый целевой операционной системой, лишь немного уступающая по функциональности универсальному варианту.

Архитектура 1С: Исполнителя(U) по-прежнему является наиболее оптимальной и производительной для выполнения скриптов, требующих большого количества вычислений.

Плата за скорость работы 1С: Исполнителя(Х) отсутствие динамической загрузки подключаемых библиотек. Соответственно, эта особенность его реализации не позволит пользователям их устанавливать и использовать самостоятельно.

Еще в описании релиза при выходе 1C: Исполнителя многие разработчики обратили внимание, что синтаксис его языка получил значительные отличия от встроенного языка платформы 1С. Возможно, одним из знаковых отличий явилась его строгая/статическая типизация, характерная для компилируемых языков более низкого уровня.

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

После анонсирования 1С: Исполнителя(Х), исходя из заявленного сценария его использования, видно, что вторая ступень в стратегии развития продукта также направлена в сторону повышения скорости выполнения операций и производительности. Тем не менее вопрос, для каких именно больших объемов вычислений готовят продукт, остается, на мой взгляд, открытым.

1С: КИП 2.1.8


1С активно продвигает пакет инструментов для тестирования и повышения производительности системы с позапрошлого года. В релизе 2.1.8 разработчики продукта основное внимание уделили Сценарному тестированию (3.0.24.1), у которого появилась функциональность, давно ожидаемая пользователями:

  • Можно создавать последовательности ручных операций с соответствующим описанием действий каждого шага.
  • Тестовые сценарии теперь могут автоматически обрабатывать появление диалоговых окон, выполняя заранее описанные шаги в активной Форме.
  • Появились новые типы шагов:
    Выполнить пакетную команду 1С позволяет выполнить пакеты действий командной строки 1С;
    Выполнить операцию с файлами автоматизирует взаимодействие с файловой системой.
  • Появился новый интерфейс для сравнения тестовых сценариев, который позволяет визуально увидеть их подобие и различия.



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

Помимо этого, новое обновление Агент КИП получило возможности для удаленного администрирования, и теперь ему доступен удаленный сбор данных, в частности, об установленных версиях платформы и доступных базах.

1С: Тестировщик


Для тех, кому Сценарное тестирование слишком сложно и вообще не надо, выпустили новую конфигурацию 1С: Тестировщик. Он позволяет без знаний в области программирования быстро начать тестирование небольших систем 1С по простым сценариям, задавая простые же ситуации тестирования.

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


Конвертация данных 3.1
Здесь скажу кратко, версия 3.1 обладает рядом преимуществ, самым важным из которых стала возможность разработки правил как в формате EnterpriseData, так и в формате XML. Теперь можно автоматически:

  • Загрузить описание конфигурации/метаданных (из хранилища 1С, из хранилища в формате EDT, каталога выгруженной конфигурации 1С в файлах XML);
  • Выгрузить разработанные правила обмена;
  • Разрабатывать правила обмена (на основе однотипных приложений, где сопоставляются внутренние метки).

Библиотека интеграции с 1С: Документооборот 1.1.18.3


Сразу напомню, что эта библиотека необходима тем, кто самостоятельно в свои конфигурации встраивает функционал работы с 1С: Документооборотом и кому требуются всегда актуальные возможности. Сейчас в версии 1C:ERP 2.5.6.17 до сих пор встроена версия библиотеки 1.1.15.1, а в версии 1C:ERP 2.5.7.78 даже предыдущая версия 1.1.17.2. Но вот в новой версии 1С: ЗУП 3.1.18, уже реализована возможность согласовывать заявку на подбор персонала через 1С: Документооборот, с которым теперь можно настроить бесшовную интеграцию по этому документу.

1С: Система проектирования прикладных решений 2.0.2


В новую СППР, в Органайзер добавили ни много ни мало систему планирования и учета рабочего времени, а также Мой календарь. Если у вас до сих пор нет системы планирования и учета рабочего времени, самое время начать использовать ее в СППР. Исправлено несколько ошибок, впрочем, их в этой конфигурации минимальное количество.

Помимо этого:

  • Значительной доработке подверглись также Разработка и Тестирование. Теперь возможно ведение различных веток разработки. Поддерживаются ветки, разрабатываемые как в хранилище конфигурации, так и в git-репозитории.
  • Добавлено чтение и запись сценариев тестирования через API git-сервера. Теперь можно хранить сценарии тестирования в разрезе веток git.
  • В связи с реализацией в Разработке веток, регистрация ошибок также доработана под данный функционал.
  • Существенно доработан механизм работы с патчами.
  • В задачах процессов каждой задаче добавили самостоятельные ресурсы, не зависящие от родительской задачи. В предыдущей версии было возможно только распределение ресурсов родительской задачи.
  • Также теперь можно загружать данные о результате выполнения сборок на CI-сервере в СППР. Добавлены отчеты для представления загруженных данных.

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

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

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru