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

Habr

Alert! Нашему блогу нужны добрые руки и умная голова

08.04.2021 14:12:31 | Автор: admin
Мы не будем предлагать дримтим, мы вам дримтим покажем. А если серьёзно, мы уже 5 с лишним лет на Хабре и стабильно занимаем первое место среди компаний. Это серьёзный труд и большой опыт для всех, кто причастен к статьям и концепции блога RUVDS. Ведение блога номер один это не марафон, это гонка на выживание с крутыми виражами: замедлился, тормознул, пропустил поворот и вот уже почти не первый, пора сдаваться. Но мы не сдаёмся и ищем сообщника, который возьмёт управление болидом в свои руки и не раз выпьет с нами из победного кубка.

Под катом расскажем, что у нас есть, что ждём и как это вообще работает.


Мы котики, честно

Кто мы?


RUVDS это крупный хостинг-провайдер, который предлагает своим клиентам безопасные и мощные VPS и связанные с ними услуги. Конечно, про хостинг всё написано до нас и нами, да и это не самая интересная тема, постоянно писать только лишь по этой теме несколько утомительно. Поэтому мы решили пойти другим путём и создать самый надоедливый блог на Хабре техноблог, который будет не только и не столько служить средством пиара, сколько нести познавательную и образовательную функцию. Мы принесли на Хабр множество крутых переводов, которые недоступны для тех, чей инглиш из бед, затем расширили контент-план и включили истории из жизни компании, затем выложили полезные шпаргалки для программистов, предложили читателям авторские серии об образовании, трудоустройстве, финансах и проч. В 2018-2019 гг. мы разошлись по полной и включили в свой блог интерактивы: отправляли сервер в космос, летали на воздушном шаре, бороздили море на парусной регате и всё это время как настоящие учёные таскали за собой банки с тихоходками экспериментальные сервера.

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


До сих пор, как вспомним, так вздрогнем зато обратите внимание, всё максимально удалённо и с социальной дистанцией

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

Что у нас есть?


  • Опыт работы с Хабром: мы расскажем вам об особенностях покорения топа компаний, а вы на основании наших публикаций и реакции на них сможете понять, что именно интересно аудитории и в каком направлении нужно двигаться.
  • Средства и возможности, чтобы реализовывать крутые и полезные задумки: эксперименты, квесты, конкурсы, интервью и т.д. Мы не отбиваем руки, а идём рядом с сотрудниками.
  • Длинная дистанция для вашего профессионального развития: если мы сойдёмся, вы ощутите, насколько прокачали свои скиллы.
  • Адекватное руководство: цепочка согласований статей и проектов не длинная, правки минимальные и корректные (точнее, сперва их будет наверняка больше, но как только вы погрузитесь в контентные задачи, мы уверены правки почти исчезнут).
  • Мы не расстреливаем за ошибки и факапы: не ошибается лишь тот, кто ничего не делает. Но это не значит, что мы готовы сделать блог нашей компании полем для необдуманных экспериментов.
  • У нас есть хороший и стабильный пул переводчиков и авторов, которые выдают поток контента в целом они работают в режиме автопилота, поэтому ваши руки и мозги будут свободны для развития блога. Но одной из ваших задач будет расширение пула авторов.
  • Главное, что у нас есть, это команда, продукты и услуги, за которые не стыдно и которыми можно гордиться. Если вы хоть когда-то касались технопиара или техномаркетинга, вы наверняка знаете, насколько много это значит.

Ну и ещё у нас есть офис, полная занятость, при желании удалёнка, классная команда, постоянная движуха, никакого насилия корпоративной культурой


Что мы думаем о Хабре?


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

Кого мы ждём?


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

Итак, кого мы ждём (примерный райдер, пишите смелей).

Обязательно


  • Самостоятельного и ответственного человека, который сможет в одиночку принять решение о публикации или удалении неудачного материала, поработает с авторами и сможет дойти до нас с готовым текстом в руках.
  • Честного человека, который отчётливо понимает, что тексты, созданные и размещенные в блоге компании, оплачены и принадлежат компании даже после ухода сотрудника, который их продюсировал и/или писал.
  • Грамотного человека, который способен найти грамматические, орфографические и пунктуационные ошибки и которому не чуждо понимание стилей текстов.
  • Редактора, который сможет работать внутренним редактором и собирать внутреннюю редакцию из сотрудников при необходимости: продумывать контент-планы, активности, встречи и интервью, организовывать участников и исполнителей, иногда взаимодействовать с контент-студией и командой спецпроектов Хабра.
  • Человека, который уверенно разбирается в технологиях: облака, сервера, хранение и обработка данных, сети, программирование, веб и всё, что с ним связано. Не обязательно спать с Танненбаумом под подушкой, базовых знаний без гугления вполне достаточно.
  • Вы предложите новые форматы работы с Хабром и другими площадками, ивенты и события, которые позволят расширить нашу аудиторию и увеличить узнаваемость (если что, до вас придумано уже много и вам придётся непросто).

Желательно


  • Пишущего автора, который может одинаково хорошо и, что немаловажно, быстро написать пресс-релиз, пост-анонс, статью по ИТ-тематике и по любой другой. Хочется, чтобы вас было приятно читать.
  • Сотрудника с опытом технопиара или маркетинга ИТ-компаний: нужно понимать и анализировать аудиторию, работать с метриками.
  • Того, кто уже работал с блогами компаний на Хабре или ведёт свой успешный блог на публичных площадках.
  • Навыки видеопродакшена и понимание основ написания сценариев, создания ивентов и т.д.
  • Не чистого гуманитария нам не надо на Нобелевскую премию по литературе и районный конкурс романов в Мневниках, нам нужны хорошие технологические и научно-популярные материалы. Любить Ильяхова тоже не обязательно.
  • Редакторский опыт работы, владение английским языком на уровне чтения, понимания и перевода технических текстов как плюс. Если умеете отличить отличный машинный перевод от плохого авторского как два плюса.
  • Желательно отсутствие техношовинизма, когда вы считаете, что Хабр это место исключительно для корутин, ардуино и ассемблера. Хабр читают совершенно разные люди, и важно быть понятным и доступным всем (что не исключает техно хардкора).
  • Чувство юмора и здоровый айтишный сарказм.

Не имеет значения


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

А ещё у нас есть небольшое и интересное тестовое задание. Также можете писать сразу на почту.

Возмущались, что надоели переводы RUVDS? Писали ехидные комментарии? Знаете, как обустроить блог компании на Хабре? Момент настал всё в ваших руках. Если получится, в эти руки дополнительно попадёт весьма неплохое ежемесячное вознаграждение.
Подробнее..

Хабр, давай поштурмим

12.05.2021 16:20:09 | Автор: admin
Мы написали почти 1800 статей в свой блог на Хабре: профессиональных авторских переводов, серий, статей, фан-контента, спецпроектов. Со стороны может показаться, что это очень просто: нашёл удачную идею и написал, нашёл классный пост и перевёл. Делов-то. Но кто писал на Хабр, тот в Форбсе не смеётся: важно провести фактчекинг, проверить корректность всех формулировок подобрать заголовок и изображение, сверстать, выпустить и F5, F5, F5 в ожидании плюсов минусов, комментариев, багрепортов в личку. И знаете, что самое интересное? Даже спустя пять лет эти ощущения не отпускают: каждый раз как в первый раз.

В общем, идеи начинают иссякать. Поэтому мы просим вас нам помочь.



Хочу помочь сразу


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

Бонус-трек: 8 реально проверенных методик генерации идей


Мозговой штурм


Вечно живая и неизменно работающая методика поиска новых идей. Работает максимально просто: собираются 2-12 человек (больше это уже базар), один из них становится модератором, который записывает все идеи и следит, чтобы не было попыток обсуждать, критиковать или одобрять чужие идеи. Всё общение хаотичный поток мыслей: бредовых, заумных, сложных, простых, дорогих в исполнении. Все зафиксированные идеи собираются в список и высылаются коллегам для голосования. Отобранные решения принимаются в работу и уже детально обсуждаются с точки зрения реальности, сроков, трудозатрат, стоимости, ресурсов и т.д. Фишка такого подхода в том, что никто не стесняется высказывать идеи, потому что такие правила игры и все ведут себя немного сумасбродно, а заодно подстёгивают мышление коллег. Среди предложенных идей всегда найдутся 3-5 пригодных и одна золотая мысль.

Обратный мозговой штурм


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

Думать синтетически


Представьте, вы написали 300 статей о JavaScript. Тупик. А вам нужно непременно ещё несколько и непонятно, что с этим делать. Разлинуйте таблицу (кстати, 2 и 3 колонки могут содержать любые вопросы: зачем, почему, как, с кем, кто, от кого):
Что? прописываете плотно связанные с вашим основным объектом понятия Где? прописываете неоднородные места (посмотрите вокруг) Когда? прописываете неоднородные ответы на вопрос (какие в голову пришли)
JavaScript В офисе Осенью
Web-разработка В кафе Ночью
Приложение На столе Когда закончится ковидла
Фронтенд В автомобиле В средние века

А теперь гуляете глазами по колонкам:

  • JavaScript в автомобиле когда закончится ковидла
  • Фронтенд на столе в средние века
  • Приложение в офисе ночью

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

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

Уже интересные темы, за которые можно браться и которые звучат небанально. То есть мы их синтезировали, соединив неожиданные свойства окружающих объектов.

На таких таблицах и основано синтетическое мышление, которое после 2-3 итераций начинает очень здорово работать.

Идеи вокруг нас


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

Стресс-спринт


Прекрасная идея для удалённой или частично удалённой команды. Метод работает на основе положительного стресса. Каждому сотруднику на связи даются 3-5 минут (можно меньше), за которые он должен набрасывать абсолютно любые идеи в нужном направлении: новые фичи, идеи для оформления или интерфейса и т.д. Его никто не перебивает, не комментирует, не критикует и не одобряет. Конференция записывается, все идеи затем оформляются в список и дальше он обрабатывается по тем же принципам, что и протокол мозгового штурма. Лучше, если это будет неожиданный опрос сотрудников, например, по ходу привычного созвона в стрессовой ситуации мозг активизируется и иногда случаются достойные идеи.

Конкурс внутри компании


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

Майнд-карты и стикеры


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

И подпись: аноним


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

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

А теперь сама просьба


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

Хочу помочь

Убедительно просим вас заполнять именно форму, а не писать в комментарии.


Друзья, спасибо, что читаете нас мы работаем и пишем для вас!

Подробнее..

Охоту на Макбук объявляем открытой

13.05.2021 16:14:30 | Автор: admin
Умеете хорошо писать по ИТ-теме? Можете объяснить своей бабушке, что такое DevOps на пальцах? Рассказываете коту про кортежи и полиморфизм? Хватит держать это в себе! Напишите классную статью в наш блог на Хабре и выиграйте Макбук с M1, с котором сможете делать ещё больше крутых штук. На старт, внимание а всё, вы уже в деле.

Кто победит: осмелевший и талантливый новичок или опытный и владеющий всеми фишками старожил?

Что происходит?


Компания RUVDS объявляет конкурс на лучшую статью для корпоративного блога компании на Хабре. До конца июня вы можете присылать свои публикации нашему редактору JohurN (или на почту dolina@rucloud.host) адекватные материалы будут опубликованы в корпоративном блоге компании RUVDS на Хабре. В конце мы подведём итоги самым честным способом: главный приз (MacBook Air на M1) получит тот автор, чья статья наберёт наибольший рейтинг, состоящий из оценок пользователей Хабра. Кроме этого, будет ещё один приятный приз симпатий редакции и сотрудников RUVDS. Его получит тот автор, чей текст заденет нас за живое. Ну и добровольный бонус: лучшим авторам мы предложим продолжить сотрудничество с компанией RUVDS в качестве автора блога.

Механика конкурса


Точные сроки


Продолжительность конкурса с момента размещения публикации-анонса о конкурсе на Хабре и до 23:59 МСК 30 июня 2021 года. То есть время уже пошло.

Призы


1 место Apple MacBook Air 2020 (M1, 8/256) или его денежный эквивалент, если по каким-то причинам выдача/доставка приза окажется невозможной.

image

Ещё одно место спецприз симпатий команды RUVDS.

Кто может принять участие?


Любой автор, который пишет на темы, предусмотренные потоками и хабами Хабра. То есть это могут быть:

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

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

А если я


выдам чужой перевод за свой материал?

скомпилирую хайповую статью из разных?

накручу себе рейтинг любым доступным способом?

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

А судьи кто?


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

Про что писать?


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

А как писать на Хабр?


От души и с экспертизой. А если серьёзно, то вот несколько ссылок:


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

И не забудьте: для публикации обращайтесь к нашему редактору JohurN или на dolina@rucloud.host

Подробнее..

Пишем расширение-читалку для Habr

12.02.2021 08:05:33 | Автор: admin

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

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

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

Автор туториалаАвтор туториала

Шаг 1. Определим состав расширения

Наше расширение будет состоять из нескольких частей:

  • манифест-файл manifest.json с описанием самого расширения, указанием его основных разрешений, прописыванием путей к иконкам, фоновым скриптами т.д.;

  • HTML-страница popup.html и CSS-файл style.css для popup-формы, на которой будет расположена панель управления воспроизведением аудио;

  • фоновый JavaScript-файл content.js, который будет обращаться к странице с открытым постом и воспроизводить её текстовое содержимое;

  • JavaScript-файл popup.js для popup-формы, с помощью которого фоновому скрипту будут передаваться команды пользователя, заданные через popup-форму;

  • иконки расширения 3 размеров: 128x128, 48x48, 16x16 пикселей.

В итоге получаем примерно такую структуру:

Структура проектаСтруктура проекта

Шаг 2. Подготавливаем манифест-файл

С помощью манифеста мы:

  • сообщаем о том, что мы сделали за расширение;

  • указываем, где хранятся его иконки;

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

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

  • указываем, какой popup мы будем использовать.

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

Содержимое manifest.json
{  "manifest_version": 2,  "name": "Habr Reader",  "description": "Расширение позволяет воспроизводить текст на странице со статьей на Хабре с возможностью изменения языка и скорости воспроизведения",  "version": "1.01",  "developer": {    "name": "Enji Rouz",    "url": "https://github.com/EnjiRouz/Habr-Reader-Extension"  },  "icons": {    "16": "res/icon16.png",    "48": "res/icon48.png",    "128": "res/icon128.png"  },  "permissions": [    "storage",    "http://*/*",    "https://*/*",    "tabs",    "contextMenus"  ],  "background": {    "scripts": ["js/content.js"],    "persistent": true  },  "browser_action": {    "default_icon": "res/icon128.png",    "default_popup": "popup.html",    "icon_128": "res/icon128.png"  },  "content_scripts": [{    "matches": ["<all_urls>"],    "js": ["js/content.js"]  }],  "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"}

Шаг 3. Делаем popup-форму для управления воспроизведением

С помощью данной формы мы будем ненапрямую:

  • запускать проигрывание синтезированной речи;

  • ставить воспроизведение на паузу;

  • полностью останавливать воспроизведение;

  • менять скорость воспроизведения;

  • менять язык речи с русского на английский, и наоборот.

Для этого нам потребуется сделать в popup.html несколько кнопок для управления воспроизведением, поле для ввода скорости и переключатель для языков. К странице мы привяжем файл стилей style.css, а также скрипт popup.js, который мы будем запускать после того, как форма полностью загрузится. Для этого добавим после его определения ключевое слово defer.

Содержимое popup.html
<!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <link rel="stylesheet" href="css/style.css" type="text/css"/>     <script type="text/javascript" src="js/popup.js" defer></script>     <title>Habr Reader</title> </head> <body> <div class="tool-bar">     <ul>         <li>             <button id="play-button"></button>         </li>         <li>             <button id="pause-button"></button>         </li>         <li>             <button id="stop-button"></button>         </li>         <li>             <label for="speed">Speed</label>             <input type="number" name="speed" id="speed" placeholder="1" value="1" min="0.5" max="2.0"                    step="0.1">         </li>             <li>             <label><input type="radio" name="speech-language" value="ru-RU" id="ru" checked>ru-RU</label>         </li>         <li>             <label><input type="radio" name="speech-language" value="en-US" id="en">en-US</label>         </li>     </ul> </div> </body> </html>
Содержимое style.css
body{    width:180px;    height:60px;    font-family: arial, serif;    font-size: 12px;}.tool-bar{    display: block;    width: 180px;    height: 60px;    line-height: 30px;    background-color: #242424;}.tool-bar ul{    list-style-type: none;    margin: 0;    padding: 0;}.tool-bar ul li{    display: inline-block;    margin: 0;    padding: 0;}button{    background: none;    color: inherit;    border: none;    padding: 0;    font: inherit;    cursor: pointer;    outline: inherit;}.tool-bar ul li button, label{    padding: 0 4px;    text-decoration: none;    color: #FFFFFF;}.tool-bar ul li button:hover{    text-decoration: underline;}input {    width:30px;    padding: 6px 0 4px 10px;    border: 1px solid #9e9e9e;    background: #242424;    border-radius: 4px;    color: #FFFFFF;}

Итоговый вид нашей popup-формы довольно прост и лаконичен. Здесь продемонстрировано, как форма будет отображаться при нажатии на иконку расширения:

Раскрытая popup-форма расширенияРаскрытая popup-форма расширения

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

Упаковку самого расширения мы рассмотрим в конце.

Шаг 4. Передаём управление фоновому скрипту из popup-формы

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

Для этого на каждое событие мы добавим обращение к активной вкладке текущего окна, в котором передадим сообщение. В нём мы укажем следующее:

  • название команды, которую нужно выполнить, например, todo: "play", чтобы сообщить, что мы хотим начать либо продолжить воспроизведение;

  • значения переменных, которые нужны будут для выполнения этой команды, например, newSpeed: speed.value, lang: language,где мы передадим новое значение скорости и языка.

Содержимое popup.js
// определение кнопокconst playButton = document.getElementById("play-button");const pauseButton = document.getElementById("pause-button");const stopButton = document.getElementById("stop-button");// определение полей вводаconst speed = document.getElementById("speed");// назначение действий на соответствующие кнопки/поляif(playButton)    playButton.addEventListener("click", play);if(pauseButton)    pauseButton.addEventListener("click", pause);if(stopButton)    stopButton.addEventListener("click", stop);if(speed)    speed.addEventListener("input", changeSpeed);// применение настроек на странице происходит при помощи их передачи в сообщении,// предназначенном для background скриптаfunction play(){    // определение выбранного языка воспроизведения    let language = document.querySelector('input[name="speech-language"]:checked').value;    chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {        chrome.tabs.sendMessage(tabs[0].id, {todo: "play", newSpeed: speed.value, lang: language});    });}function pause(){    chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {        chrome.tabs.sendMessage(tabs[0].id, {todo: "pause"});    });}function stop(){    chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {        chrome.tabs.sendMessage(tabs[0].id, {todo: "stop"});    });}function changeSpeed(){    chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {        chrome.tabs.sendMessage(tabs[0].id, {todo: "changeSpeed", newSpeed: speed.value});    });}

Шаг 5. Пишем фоновый скрипт для синтеза речи

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

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

Вот, что будет происходить в нашем фоновом скрипте:

  1. При загрузке страницы, содержащей элемент с ID "post-content-body", скрипт будет рекурсивно складывать содержимое текстовых элементов внутри родительского, чтобы сформировать текст для будущего синтеза (это гораздо проще, чем запрашивать разрешение на использование Habr API, но стоит учитывать, что однажды этот ID может поменяться);

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

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

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

Далее вы можете модифицировать код на своё усмотрение.

Содержимое content.js
// создание средства синтеза речи и получение списка голосовconst synthesis = window.speechSynthesis;const voices = synthesis.getVoices();const utterance = new SpeechSynthesisUtterance();// текущий символ, который синтезируется в данный момент времениlet currentCharacter;// назначение события на момент, когда речь перестанет проигрыватьсяutterance.addEventListener("end", () => {    currentCharacter = null;});// получение символа, который синтезируется в данный моментutterance.addEventListener("boundary", event => {    currentCharacter = event.charIndex;});// переменные: язык речи, скорость проигрывания аудио, воспроизводимый текстlet speechLanguage = "ru-RU";let playerSpeed = 1;let textToPlay = "Открой статью, а потом уже нажимай сюда";/** * Рекурсивно прибавляет текстовое содержимое дочерних элементов для формирования текста поста * @param elementForSearchingIn - родительский элемент, в котором будет осуществляться поиск текстовых нодов */function joinTextNodes(elementForSearchingIn) {    if (elementForSearchingIn.hasChildNodes()) {        elementForSearchingIn.childNodes.forEach(function (node) {            joinTextNodes(node)        });    } else if (elementForSearchingIn.nodeType === Text.TEXT_NODE) {        textToPlay += " " + elementForSearchingIn.textContent;    }}/** * Поиск голоса для заданного языка речи * @param lang - заданный язык речи * @returns {null|SpeechSynthesisVoice} */function findVoice(lang) {    for (let i = 0; i < voices.length; i++) {        if (voices[i].lang === lang)            return voices[i];    }    return null;}/** * Проигрывание синтезированного высказывания */function playTextToSpeech() {    // если проигрывание речи было поставлено на паузу - происходит продолжение проигрывания    if (synthesis.paused && synthesis.speaking)        return synthesis.resume();    if (synthesis.speaking) return;    // определение параметров синтезируемой речи    utterance.text = textToPlay;    utterance.rate = playerSpeed || 1;    utterance.lang = speechLanguage;    utterance.voice = findVoice(utterance.lang);    // проигрывание речи    synthesis.speak(utterance);}/** * Установка проигрывания синтезированной речи на паузу */function pauseTextToSpeech() {    if (synthesis.speaking)        synthesis.pause();}/** * Остановка (прекращение) проигрывания синтезированной речи */function stopTextToSpeech() {    synthesis.resume();    synthesis.cancel();}/** * Изменение скорости речи в режиме реального времени */function changeSpeed() {    if (synthesis.paused && synthesis.speaking) return;    if (currentCharacter === null) return;    stopTextToSpeech();    playTextToSpeech(utterance.text.substring(currentCharacter));}/** * Осуществление взаимодействия pop-up формы с background скриптом при помощи отправки-получения сообщений * в активной вкладке с передачей в них необходимых для работы параметров. * Переданные параметры перезаписывают предыдущие настройки */chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {    switch (request.todo) {        case "play":            playerSpeed = request.newSpeed;            speechLanguage = request.lang;            playTextToSpeech();            break;        case "changeSpeed":            playerSpeed = request.newSpeed;            changeSpeed();            break;        case "pause":            pauseTextToSpeech();            break;        case "stop":            stopTextToSpeech();            break;    }    sendResponse({        response: "Message received"    });});// подготовка текста поста к чтениюwindow.onload = function () {    let contentBody = document.getElementById("post-content-body");    if (contentBody) {        textToPlay = "";        joinTextNodes(contentBody);        alert("Текст поста готов к чтению")    }};

Шаг 6. Упаковка и установка расширения

Я опишу упаковку и установку для Opera и Chrome. В других браузерах процесс, скорее всего, будет аналогичным, поскольку основные действия мы будем делать через стандартный раздел браузера "Расширения".

Для того, чтобы упаковать расширение, нужно проделать следующее:

  • Opera Меню Расширения Расширения включить Режим Разработчика Упаковка расширения

  • Google Chrome Дополнительные инструменты Расширения включить Режим Разработчика Упаковка расширения

На выходе вы получите crx-файл расширения, который, по факту, представляет собой архив с запакованным проектом.

Расширение можно установить через раздел "Расширения" двумя путями:

  • если модификация не требуется - для ряда браузеров достаточно перетащить подготовленный crx-файл из папки с проектом в окно с открытым разделом расширений и нажать на "Установить";

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

Заключение

На этом мой небольшой туториал подошёл к концу.

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

Кстати, мой хороший товарищ сделал на основе моего проекта расширение для того, чтобы оставлять для себя комментарии к объявлениям на Avito. Кому интересно - код и релиз вы найдёте на его GitHub.

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

Спасибо за внимание! До новых встреч!

Подробнее..

Очередной Хабро-хак для накрутки ретинга на сайте

26.03.2021 12:06:50 | Автор: admin


Почему очередной? Потому что первую мою статью о найденном способе обхода правил Хабра, прилетевшее НЛО принудительно скрыто в черновики, где она остается и по сей день.

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

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

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

Особенности начисления рейтинга


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

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

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

Как злоупотреблять?


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

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

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

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

Как НЕ злоупотреблять?


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

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

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

P.S.


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

Как за 25 дней мы вывели блог на главную Хабра, но всё ли так, ребята?

23.02.2021 20:21:55 | Автор: admin

Всё не так, как надо!

В. С. Высоцкий

Есть над чем задуматься. За некоторые статьи было стыдно. Кое-что пришлось не пропустить, а одну пропустив, тут же убрать. У себя в блоге мы гайки закрутили и будем закручивать ещё. Однако, Дзен лезет на Хабр. И мне это не нравится. Теперь обо всё по порядку.

В конце прошлого года мы решились купить корпоративный аккаунт на Хабре, так как:

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

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

  • появились деньги на поддержку Хабра и авторов, не всё же сливать Яндексу и Гуглу;

  • захотелось PRа :), да и мы посмотрели на конкурентов, которые лепят попсовые статьи далёкие от своего бизнеса и подумали: А чем мы хуже?!.

Так аккаунт мы купили, а дальше?! Надо же его наполнять. А я русский человек крайностей. Заставь дурака богу молиться Сначала думали надо взять в штат главного по контенту, и он нам всё сделает. Написали вакансию и повесили её на hh, vc, fb, Telegram и Хабр.Карьера.

Вакансия главного по контенту

100 000р.

Задачи

  1. Писать для нашего блога на Хабре, нашего сайта и других площадок.

  2. Писать про нас в соцсетях.

  3. Расширять список площадок для публикаций о нас.

  4. Превращать тезисы, идеи, разговоры со специалистами в статьи.

В отклике на вакансию укажите:

  1. Список публикаций.

  2. Кейсы.

  3. Условия по деньгам и работе.

  4. Результаты, которые вы планируете достичь.

  5. Прочее, что считаете нужным.

Условия

  1. Интересная работа с умными людьми.

  2. По ТК или ГК РФ.

  3. В офисе или удалённо.

  4. Повышение квалификации, книги, курсы от Хабра и др.

  5. Гибкий график.

  6. Оплата больничного листа 100% и частичная компенсация платных медицинских услуг и занятий спортом.

  7. В офисе еда, кофе, чай, корпоративы.

Откликов выше крыши. Толковых около нуля. Начали сомневаться, может с зарплатой не попали. Ребята из Хабра сказали нормальная сумма. Дальше, как вы увидите, вопрос отпал сам собой. А главное мы предполагали, что главный по контенту будет выпускать несколько статей в месяц, и уж точно никак не рассчитывали долететь с нуля до ТОП-10 рейтинга Лучшие компании и выйти на главную страницу Хабра.

Задачи

Изначально наметили следующее:

  1. найти главного по контенту;

  2. найти авторов, для интересных статей за рамками наших компетенций, т.к. мы максимум способны выдать порядка 24 статей в год;

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

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

Про цель нужно сказать Эх, честно отвечаю, что, конечно, хотелось бы увеличить продажи Но так же PR не работает в большинстве случаев. Если бы мы выпускали что-то уникальное, то тогда можно было бы ставить вопрос так.

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

Проверить себя. Отлично сработали статьи про договор, про устав, про суд с ВТБ. На их основе были получены ценные замечания, даже устав перерегистрировали.

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

Изменить мир к лучшему. Есть статьи, где мы делимся опытом в надежде помочь другим и упростить жизнь себе: правовые основы защиты данных и бизнеса при размещении серверов в дата-центре, как официально оплатить услуги фрилансера за границей, заплатить 0% налогов и не кормить платёжные системы, 860 000р субсидии от налогоплательщиков Москвы, террор авторского права и дизайн сайта, как создать отличную поддержку и повысить показатели, не демотивировав сотрудников.

Напомнить о себе. Стараемся подтянуть ещё интересный контент, куда по возможности добавить свои пять копеек: сотрудничество с самозанятыми: преимущества и подводные камни, есть ли будущее у Intel.

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

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

Как я искал авторов

Главный по контенту это хорошо, но он же главный, сам он статей много не напишет. Поэтому параллельно с главным искал писателей.

Искал их и ищу на hh, по базе авторов главред.ру, в ФБ, Телеграм и Хабр.Фриланс. В процессе текст предложения постоянно совершенствовался. Сначала запрашивал цены у авторов. Они колебались от 150 до 1000р за тысячу знаков. Потом быстро пришло понимание, что нам же не символы нужны. Нам нужны просмотры. Но на такие условия мало кто согласится. Да и просмотров может быть много у заминусованной статьи. Поэтому решил не изобретать велосипед и сделать модель оплаты на основе Программы Поддержки Авторов (ППА) Хабра. В итоге наше предложение выглядело так:

Ищу авторов для блога на Хабре

Статьи нужно писать или переводить для Хабра. Вот наш блог http://personeltest.ru/aways/habr.com/ru/company/itsoft/

Статьи выходят от вашего имени вы и себя пиарите и зарабатываете. Хабр самая авторитетная площадка.

У вас возможно есть и уже готовые статьи. Даже если они уже были ранее опубликованы - это не проблема.

Темы пока любые из имеющихся на Хабре http://personeltest.ru/aways/habr.com/ru/hubs/ там много тем не про ИТ.

Посмотрите про что пишут компании http://personeltest.ru/aways/habr.com/ru/companies/

В случае успеха обсудим более релевантные нам, с другими условиями оплаты.

Оплачиваем статьи, которые прошли модерацию и не были заминусованы читателями.

Если статья набрала итоговый балл до 12 2000р. Это неудовлетворительный результат.

Свыше 12 2000р. + 100р.(итоговый балл-12). Нам в идеале нужны статьи с рейтингом от 50.

Итоговый балл = количество лайков - количество дизлайков.

Хайповая небольшая статья набирает в среднем 50 баллов. Вознаграждение за неё 2000+100(50-12)=5800р.

При этом она может быть на 3000 символов, то есть получается по ~2р. за знак.

Желательно, чтобы вы были самозанятым или ИП или иностранцем.

Как написать статью с рейтингом от 50?! Посмотреть на статьи с рейтингом от 50 http://personeltest.ru/aways/habr.com/ru/all/top50/,

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

Пишите так же, и у вас получится.

Также см. http://personeltest.ru/aways/habr.com/ru/sandbox/start/

Как оформить http://personeltest.ru/aways/habr.com/ru/docs/companies/design/ http://personeltest.ru/aways/habr.com/ru/docs/authors/design/

Проще всего перевести готовую или написать новую на основе своих статей в других источниках.

Ещё поможет поиск на самом Хабре и в поисковиках за запросу "Как написать статью на Хабр".

Сроки написания статей любые. Мы сотрудничаем уже с рядом авторов.

Стоит задача нарастить количество публикаций.

Когда статья будет готова, присылаете ссылку на гугл.докс с правом комментировать.

До заголовка должны быть указаны Хабы, в которые планируете публиковать.

Даю замечания, они рекомендательные. Можете учесть, а можете не учитывать.

Регистрируетесь на Хабре. Присылаете ссылку на аккаунт. Даю права на публикацию в нашем блоге.

Публикуете в хабах и в нашем блоге.

Если модераторы пропускают и читатели не заминусуют, то выплачиваем согласно рейтингу.

Итоговый балл замеряется через 3 дня в первый рабочий день и производится оплата.

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

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

Неожиданный результат

Каково же было моё удивление, когда я понял что-то идёт не так.

Совсем левый контент уровня Дзена я отсеивал сам по формальным критериям. Какой-то существенно дорабатывался. Например, статьи Есть ли будущее у Intel и 3D-принтер из фанеры своими руками и его эволюция дорабатывались в несколько итераций, и конечные версии очень круто отличаются от первоначальных. По сути я и был главным по контенту, генерил авторам идеи как увеличить смысловую нагрузку, как подать, что переработать.

Первый сигнал уловил на статье Как управляли персоналом в Древнем Риме. Её минусанул даже. Автор прислал черновик, я нагенерил замечаний, было понятно как и что переработать, но автор не стал дорабатывать, а выложил как есть. У меня была полная уверенность, что его заминусуют. Потом без моей предварительной редакции вышла такая статья Почему свернули проект ядерного самолета, и чем закончилась попытка добыть нефть с помощью ядерных взрывов и там такой комментарий: В заголовке Сделаем из Хабра Дзен несколько опечаток. И тут мне стало очень стыдно. Тут же я попытался убрать статью из блога. Но на Хабре это сделать нельзя. Можно только совсем статью в черновики отправить. Пришлось просить автора. Он убрал именно из нашего блога. Статья у нас находилась минут 15. Сейчас с удивлением обнаруживаю, что статью и карму автору плюсуют. И данная статья рушит нашу модель. Карма 22 февраля была +5. Сегодня 23 февраля ничего не поняв, он решил продолжить, и, наконец-то ему заминусовали карму. Но вторая статья у него имеет рейтинг +29 при этом. Мне стыдно, что этот человек пришёл на Хабр прочитав моё объявление о поиске авторов.

Мы не можем позволить превратить Хабр в Дзен или даже VC. Тут стоит задуматься и команде Хабра. People хавает что-то не то.

У меня есть этому объяснение. Проблема в Хабах. Статья размещена в хабах: Читальный зал, Транспорт, Будущее здесь, где читатели настроены не так критически. Во многих других Хабах подобный низкий уровень не простили бы. С другой стороны статья появляется и на главной странице Хабра, и у неё сейчас уже 14 000 просмотров.

А в чём объективно проблема, если людям нравится?

Корпоративный блог на Хабре стоит приличных денег. Если Хабр превратится в VC или Дзен, то никто же не захочет платить такие деньги за блог на Дзене. И Дзен и VC с их срачами, матами, оскорблениями отталкивают аудиторию, которая не приемлет такое общение.

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

Перед Хабром стоит задача выделить из 1 200 000 зарегистрированных пользователей реально элиту. И усилить её вес. Да ещё так, чтобы эта элита не переругалась в спорах кто элита, а кто не очень. Хабр, конечно, решил пока этот вопрос лучше всех других площадок. Но если ничего не делать, то как мы видим тренд Дзен рвётся на Хабр.

Корректировка системы мотивации

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

Данное правило мы внесём теперь в сотрудничество с авторами. Если статья набирает за сутки больше 33.3(3)% минусов, то она снимается с публикации и не оплачивается. Не надо Хабр превращать в Дзен.

Планы по совершенствованию контента

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

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

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

Сколько это стоило

На выплаты авторам ушло порядка 50 000р. Могли бы и 100 000 бухнуть, и в два раза больше статей опубликовать.

Ещё какие-то деньги в пределах 10 000р. были потрачены на размещение вакансий.

Плюс моё собственное время. Но зарплаты у меня нет.

Помогите стать лучше и не опопсеть

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

Системы нужно строить win-win. Мы уже видели разложившиеся и смердящие примеры некогда цветущего телевидения.

Коллеги были против, чтобы я выпускал эту статью. Мол такую жилу ухватили, а я рублю сук на котором сидим. Возможно меня съедят. Но в умных книжках про маркетинг пишут, что необходимо атаковать самих себя. В России очень много застоя среди руководителей во всех сферах. Ректоры, главреды, худруки театров, политики предпочитают умирать на должности старыми и смешными. Мне это не нравится. Надо меняться. Прогресс рулит. Прогресс не остановить. Если меняться не можешь, то давать дорогу тем, кто лучше. Поэтому либо мы совершенствуемся либо не место нам в ТОП лучших компаний.

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

Подробнее..

Декоративная подсветка лестницы. Часть вторая. Программная

06.05.2021 12:20:25 | Автор: admin

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

Среда разработки

Пусть меня закидают грязными тряпками, но тут для меня однозначно лучшая - Keil uVision (4)5. Эта одна из самых мощных IDE для большого количества камней. Я даже не буду агитировать за нее и описывать все преимущества, поскольку мое мнение в данном вопросе крайне предвзято. Просто я давно работаю с этой IDE и она мне нравится. Самый большой ее минус - она платная и стоит очень конских денег. Но только не в данном случае. На наше счастье у Keil есть демо режим с ограничением в 32Кб. А в LPC11C14 всего 32Кб! Получается для этого камня можно вполне легально и полноценно использовать этот мощный инструмент! Достаточно скачать его с официального сайта. Заполняем простую анкету и получаем ссылку на скачку.

Остался открытым вопрос работы с "железом". Самый удобный - это использовать заводской программатор. Keil поддерживает большое количество отладочных систем и JTAG адаптеров. Такой подход позволит вести полноценную отладку проекта. А что делать, если нет отладчика\программатора и требуется только прошить контроллер? А на этот случай есть замечательная утилита Flash Magic, которая позволяет оживить устройство, используя вшитый в ARM загрузчик. Данная утилита работает только с контроллерами NXP. Загрузка происходит через UART. Эта замечательная прога не раз выручала меня в командировках, когда под рукой не было программатора или он выходил из строя. Замечу, что все необходимые сигналы у девайса уже выведены на разъем для программирования. Ссылка для скачивания Flash Magic здесь.

Сборка платы

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

Пустышки на столеПустышки на столе

Монтаж не заставил себя долго ждать и вот что получилось в результате:

Плата смонтированаПлата смонтирована

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

Подготовка софта

По началу тут было всё относительно просто. Пишем\адаптируем все необходимые драйверы для периферии, а именно:

  • драйвер датчика освещенности MAX44009EDT

  • драйвер датчика расстояния VL53L0X

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

  • драйвер CAN интерфейса

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

Тестовое включениеТестовое включение

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

Здесь хотел сделать небольшое техническое отступление, поскольку хронологически событие, с которым оно связано, именно здесь и наступило. Я раньше не работал с компонентами из ближайшего магазина и цели максимально снизить стоимость у меня на работе не стоит. Спрос идет за качество. А тут я в полной мере ощутил что значит "китайское электричество до конца не изучено". Просто все работало - работало, а в один не очень прекрасный день вдруг перестало. Причина была выявлена очень быстро. Сгорел линейный стабилизатор AMS1117-5.0. И не просто сгорел сам и все, а прикинулся перемычкой и утащил с собой всех, кто на него надеялся. Цензурных слов у меня в тот момент не было. Я, как человек, привыкший доверять техническому описанию на компоненты не мог понять, что не так. Стабилизатор работал в штатном режиме. А фраза из описания "The AMS1117 series have internal power and thermal limiting circuitry designed to protect the device under overload conditions" уже была похожа на издевку. Немного полазив по просторам инета я понял, что не у меня одного такие проблемы с этим стабилизатором. А что вы хотите? Дешево! Какой спрос? Короче, не имея никакого желания заново перепаивать половину схемы я поставил годами проверенный вариант - LM1117-5.0 (кстати, не в Чип-Дипе купленный). На мое счастье он встал на плату как родной.

Ну да ладно, плата восстановлена, можно двигаться дальше.

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

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

  • в темноте светится дежурная подсветка (первая ступень)

  • при пересечении датчика плавно разгорается центральная полоса подсветки вдоль всего пролета лестницы (видим линию по центру вдоль пролета)

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

  • между этими огнями начинает плавно по очереди разгораться подсветка ступеней

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

Что-же потребуется для реализации?

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

Перемычки из витой пары между фрагментами (ступенями)Перемычки из витой пары между фрагментами (ступенями)

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

Логическая организация ступенейЛогическая организация ступеней

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

Для того, чтобы проще было "рисовать" на таком "экране" и не требовалось каждый раз вычислять положение нужной LED-точки в программе подготавливается массив, содержащий "карту" их расположения:

// создание карты светодиодов (см. файл LED-карты)void CREATE_LEDS_MAP (void){static const uint8_t stepPerStair = STAIRS_NUM;static const uint8_t ledsPerStep = LEDGROUPS_FOR_STAIR;for (uint8_t step = 0; step < stepPerStair; step++){for (uint8_t led = 0; led < ledsPerStep; led++){if (step % 2 == 0){LedMap[led][step] = ((step) * ledsPerStep) + led + 1;            }            else            {LedMap[led][step] = ((step + 1) * ledsPerStep) - led;            }        }    }}

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

Не обращайте внимание на внешний вид ступени - это временный вариант Не обращайте внимание на внешний вид ступени - это временный вариант

В качестве заключения

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

Печатная плата

Программа

P.S. Если у кого-то будет желание доделать или внести что-то свое могу отдать два комплекта пустышек (по комплекту на лестницу) и процы к ним (как помните, у меня их много).

Подробнее..

Чем сейчас неудобен хабровый WYSIWYG-редактор

29.01.2021 18:07:40 | Автор: admin

На Хабре ввели новый WYSIWYG-редактор постов, а старый позже отключат. Идея в том, чтобы пользователям не требовалось иметь дела с HTML-тегами, и публиковать записи свободно мог любой не-айтишник. Но вот вопрос: не доставит ли это неудобств айтишникам?

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

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


Мой сценарий

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

Поэтому я давно радовался, что Хабр поддерживает Markdown и HTML. И поэтому полюбил писать хабрапосты в редакторе vim, он как раз про эффективную клавиатурную работу. Оформлял в основном с помощью Markdown, а где его возможностей не хватало, добавлял HTML-теги: например, чтобы текст обтекал картинку или для оглавления поста. Работа над постом может выглядеть так идеальный дзен, ничто не отвлекает, есть только я и текст:

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

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

Во многих случаях до публикации давал текст кому-то на ревью, тогда есть промежуточная стадия: сначала скопировать его вместе с Markdown-кодом в Google Docs (там людям проще), а уже оттуда после правок на Хабр.


В чём боль

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

1) Markdown-штуки срабатывают, когда пишешь в самом редакторе, но вот если хочешь скопипастить в него готовый текст с уже проставленной разметкой это как повезёт. То есть, если хочу использовать Markdown, желательно писать посты прямо на Хабре, а не в vim с его великой системой хоткеев. Меньше клавиатуры и терминала, больше мышки и браузера.

2) Даже в самом редакторе работает не всё из Markdown. Выделить жирным или сделать заголовок это пожалуйста, а вот поставить ссылку или разделитель у меня не получилось, это приходится делать через стандартные меню.

3) Если для Markdown хотя бы заявили поддержку, то в случае с HTML сказали только об уходе от него. А ведь с его помощью пользователи Хабра реализовывали целый пласт возможностей. Хочешь, чтобы текст обтекал картинку не справа, а слева? Хочешь подзаголовок определённого цвета? Хочешь сделать кликабельную картинку? Хочешь вручную задать ей размеры? Markdown всего этого сделать не даёт.

4) Каким-то из пропавших HTML-возможностей сделали альтернативные реализации, но порой неудобные. Например, оглавление поста. Раньше в vim писал тег <anchor> у каждого подзаголовка. Теперь предлагается делать в хабровском редакторе так: добраться в тексте до нужного места, вызвать меню, выбрать вариант якорь, затем ткнуть мышкой в сам якорь (с клавиатуры это сделать нельзя), а затем почему-то ещё раз ткнуть мышкой над ним в поле укажите id якоря (с клавиатуры это сделать тоже нельзя).

И повторить всё это по числу подзаголовков (например, 10 раз). Объём раздражающей мышиной возни ощутимо возрос.

5) Зачастую правлю мелочи уже после выхода поста. С новым редактором для этого требуется каждый раз прокликивать два экрана вместо прежнего одного, опять же увеличивая объём бессмысленной возни

Это всё не считая мелких багов, их-то можно просто репортить. Перечисленные выше вещи выглядят не столько багами, сколько ожидаемым поведением: не знаю, решат позже изменить ситуацию или нет. И в сумме они вызывают ощущение тебе с твоими vim и Markdown тут не рады, слушай песню "Валенки" и редактируй WYSIWYG в браузере.

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

Чего хотелось бы

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

С таким радикальным подходом я не согласен. Во-первых, на сайте есть разделы вроде дизайн и научпоп, так что польза WYSIWYG понятна: человек, далёкий от HTML, может при этом писать отличные тексты о космонавтике.

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

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

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

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


Нужен фидбек

Но тут у меня возник вопрос: нужно ли такое кому-то, кроме меня? Может быть, все рады новому редактору, а я со своим сочинением постов в vim выгляжу вот этим странным пользователем из комикса xkcd?

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

  • Пробовали ли вы новый редактор и как вам?

  • Подходит ли вам оформление в WYSIWYG-режиме, или предпочитаете Markdown/HTML?

  • Подходит ли вам писать пост прямо на Хабре, или предпочитаете отдельные текстовые редакторы?

  • При появлении у Хабра API стали бы вы пользоваться им, или взаимодействовали бы с сайтом только через браузер?

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

Я пишу здесь для блога компании JUG Ru Group. Мы делаем конференции для разработчиков, но сами далеко не все разработчики. И среди моих коллег, постящих что-то на Хабр, часть никогда не открывали vim и пишут тексты в человеческих редакторах вроде Google Docs. Казалось бы, вот они должны быть рады новому WYSIWYG-редактору: можно в Google Docs сделать всю вёрстку визуально, а потом просто скопипастить на Хабр.

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

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

Подробнее..

Чем неудобен хабровый WYSIWYG-редактор

29.01.2021 20:06:23 | Автор: admin

На Хабре ввели новый WYSIWYG-редактор постов, а старый позже отключат. Идея в том, чтобы пользователям не требовалось иметь дела с HTML-тегами, и публиковать записи свободно мог любой не-айтишник. Но вот вопрос: не доставит ли это неудобств айтишникам?

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

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


Мой сценарий

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

Поэтому я давно радовался, что Хабр поддерживает Markdown и HTML. И поэтому полюбил писать хабрапосты в редакторе vim, он как раз про эффективную клавиатурную работу. Оформлял в основном с помощью Markdown, а где его возможностей не хватало, добавлял HTML-теги: например, чтобы текст обтекал картинку или для оглавления поста. Работа над постом может выглядеть так идеальный дзен, ничто не отвлекает, есть только я и текст:

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

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

Во многих случаях до публикации давал текст кому-то на ревью, тогда возникала промежуточная стадия: сначала скопировать всё в Google Docs (там людям удобнее), а уже оттуда после правок на Хабр.


В чём боль

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

1) Markdown-штуки срабатывают, когда пишешь в самом редакторе, но вот если хочешь скопипастить в него готовый текст с уже проставленной разметкой это как повезёт. То есть, если хочу использовать Markdown, мне желательно писать посты прямо на Хабре, а не в vim с его великой системой хоткеев. Меньше клавиатуры и терминала, больше мышки и браузера.

2) Даже в самом редакторе работает не всё из Markdown. Выделить жирным или сделать заголовок это пожалуйста, а вот поставить ссылку или разделитель у меня не получилось, это приходится делать через стандартные меню.

3) Если для Markdown хотя бы заявили поддержку, то в случае с HTML сказали только об уходе от него. А ведь с его помощью пользователи Хабра реализовывали целый пласт возможностей. Хочешь, чтобы текст обтекал картинку не справа, а слева? Хочешь подзаголовок определённого цвета? Хочешь сделать кликабельную картинку? Хочешь вручную задать ей размеры? Markdown всего этого сделать не даёт.

4) Каким-то из пропавших HTML-возможностей сделали альтернативные реализации, но порой неудобные. Например, оглавление поста. Раньше в vim писал тег <anchor> у каждого подзаголовка. Теперь предлагается делать в хабровском редакторе так: добраться в тексте до нужного места, вызвать меню, выбрать вариант якорь, затем ткнуть мышкой в сам якорь (с клавиатуры это сделать нельзя), а затем почему-то ещё раз ткнуть мышкой над ним в поле укажите id якоря (с клавиатуры это сделать тоже нельзя).

И повторить всё это по числу подзаголовков (например, 10 раз). Объём раздражающей мышиной возни ощутимо возрос.

5) Зачастую правлю мелочи уже после выхода поста. С новым редактором для этого требуется каждый раз прокликивать два экрана вместо прежнего одного, опять же увеличивая объём бессмысленной возни.

Это всё не считая мелких багов, их-то можно просто репортить. Перечисленные выше вещи выглядят не столько багами, сколько ожидаемым поведением: не знаю, решат позже изменить ситуацию или нет. И в сумме они вызывают ощущение тебе с твоими vim и Markdown тут не рады, слушай песню "Валенки" и редактируй WYSIWYG в браузере.

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

Чего хотелось бы

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

С таким радикальным подходом я не согласен. Во-первых, на сайте есть разделы вроде дизайн и научпоп, так что польза WYSIWYG понятна: человек, далёкий от HTML, может при этом писать отличные тексты о космонавтике.

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

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

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

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


Нужен фидбек

Но тут у меня возник вопрос: нужно ли такое кому-то, кроме меня? Может быть, все рады новому редактору, а я со своим сочинением постов в vim выгляжу вот этим странным пользователем из комикса xkcd?

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

А напоследок поделюсь уже имеющимся фидбеком, который показывает, что грань между айтишным и не-айтишным подходами вообще не такая строгая, как кажется. Я пишу здесь для блога компании JUG Ru Group. Мы делаем конференции для разработчиков, но сами далеко не все разработчики. И среди моих коллег, постящих что-то на Хабр, часть никогда не открывали vim и пишут тексты в человеческих редакторах вроде Google Docs. Казалось бы, вот они должны быть рады новому WYSIWYG-редактору: можно в Google Docs сделать всю вёрстку визуально, а потом просто скопипастить на Хабр.

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

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

Подробнее..

Как обновить все сцены Unity-проекта в один клик

30.05.2021 12:21:38 | Автор: admin
Танюшка - автор канала IT DIVA и данной статьи, кофеголик и любитель автоматизировать рутинуТанюшка - автор канала IT DIVA и данной статьи, кофеголик и любитель автоматизировать рутину

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

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

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

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

А далее вы уже сможете использовать и модифицировать приведённый в примере код под свои нужды.

Зачем нужен такой инструмент

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

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

Но что будет, когда их станет 10? 20? 50?

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

Как эту проблему решить?

На самом деле, довольно просто!

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

Нам такой вариант не подходит. Но знать о нём тоже полезно.

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

Чтобы это сделать, мы создадим новый класс в папке Editor:

Пример возможной иерархии для расширений движкаПример возможной иерархии для расширений движка

Обращаю внимание, на то, что название некоторых папок в Unity играет роль. В данном случае, в папке "Editor" мы будем хранить все скрипты, которые помогают нам расширить базовый функционал редактора Unity и, например, создавать диалоговые окна.

Далее добавим необходимые пространства имён, а также укажем, что наследоваться будем от Editor Window (а не от MonoBehaviour, как происходит по умолчанию):

using UnityEngine;using UnityEditor;public class SceneUpdater : EditorWindow{    [MenuItem("Custom Tools/Scene Updater")]    public static void ShowWindow()    {        GetWindow(typeof(SceneUpdater));    }        private void OnGUI()    {        if (GUILayout.Button("Update scenes"))    Debug.Log("Updating")    }}

С помощью атрибута [MenuItem("Custom Tools/Scene Updater")] мы создадим элемент меню с заданной иерархией в самом движке. Таким образом мы будем вызывать диалоговое окно будущего инструмента:

Новый элемент меню, через который мы будем использовать наш инструментНовый элемент меню, через который мы будем использовать наш инструмент

Далее мы добавим кнопку, с помощью которой будем запускать наш дальнейший код:

using UnityEngine;using UnityEditor;public class SceneUpdater : EditorWindow{    [MenuItem("Custom Tools/Scene Updater")]    public static void ShowWindow()    {        GetWindow(typeof(SceneUpdater));    }        private void OnGUI()    {        if (GUILayout.Button("Update scenes"))    Debug.Log("Updating")    }}

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

Быстрое добавление компонентов к объектам

Для добавления компонентов к объектам с уникальными именами можно написать вот такую функцию:

/// <summary>/// Добавление компонента к объекту с уникальным названием/// </summary>/// <param name="objectName"> название объекта </param>/// <typeparam name="T"> тип компонента </typeparam>private void AddComponentToObject<T>(string objectName) where T : Component{    GameObject.Find(objectName)?.gameObject.AddComponent<T>();}

Использовать её можно вот так:

AddComponentToObject<BoxCollider>("Plane");AddComponentToObject<SampleClass>("EventSystem");

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

Быстрое удаление объектов по имени

Аналогично можно сделать и для удаления объектов:

/// <summary>/// Уничтожение объекта с уникальным названием/// </summary>/// <param name="objectName"> название объекта </param>private void DestroyObjectWithName(string objectName){    DestroyImmediate(GameObject.Find(objectName)?.gameObject);}

И использовать так:

DestroyObjectWithName("Sphere");

Перенос позиции, поворота и размера между объектами

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

/// <summary>/// Копирование позиции, поворота и размера с компонента Transform у одного объекта/// на такой же компонент другого объекта./// Для корректного переноса координат у parent root объеков должны быть нулевые координаты/// </summary>/// <param name="objectToCopyFrom"> объект, с которого копируются части компонента </param>/// <param name="objectToPasteTo"> объект, на который вставляются части компонента </param>/// <param name="copyPosition"> по умолчанию позиция копируется, с помощью данного параметра это можно отключить </param>/// <param name="copeRotation"> по умолчанию поворот копируется, с помощью данного параметра это можно отключить </param>/// <param name="copyScale"> по умолчанию размер копируется, с помощью данного параметра это можно отключить </param>private static void CopyTransformPositionRotationScale(GameObject objectToCopyFrom, GameObject objectToPasteTo,     bool copyPosition = true, bool copeRotation = true, bool copyScale = true){    var newTransform = objectToCopyFrom.GetComponent<Transform>();    var currentTransform = objectToPasteTo.GetComponent<Transform>();            if (copyPosition) currentTransform.localPosition = newTransform.localPosition;    if (copeRotation) currentTransform.localRotation = newTransform.localRotation;    if (copyScale) currentTransform.localScale = newTransform.localScale;}    /// <summary>/// Копирование позиции, поворота и размера с компонента RectTransform у UI-панели одного объекта/// на такой же компонент другого объекта. Не копируется размер самой панели (для этого использовать sizeDelta)/// Для корректного переноса координат у parent root объеков должны быть нулевые координаты/// </summary>/// <param name="objectToCopyFrom"> объект, с которого копируются части компонента </param>/// <param name="objectToPasteTo"> объект, на который вставляются части компонента </param>/// <param name="copyPosition"> по умолчанию позиция копируется, с помощью данного параметра это можно отключить </param>/// <param name="copeRotation"> по умолчанию поворот копируется, с помощью данного параметра это можно отключить </param>/// <param name="copyScale"> по умолчанию размер копируется, с помощью данного параметра это можно отключить </param>private static void CopyRectTransformPositionRotationScale(GameObject objectToCopyFrom, GameObject objectToPasteTo,    bool copyPosition = true, bool copeRotation = true, bool copyScale = true){    var newTransform = objectToCopyFrom.GetComponent<RectTransform>();    var currentTransform = objectToPasteTo.GetComponent<RectTransform>();            if (copyPosition) currentTransform.localPosition = newTransform.localPosition;    if (copeRotation) currentTransform.localRotation = newTransform.localRotation;    if (copyScale) currentTransform.localScale = newTransform.localScale;}

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

var plane = GameObject.Find("Plane");var cube = GameObject.Find("Cube");CopyTransformPositionRotationScale(plane, cube, copyScale:false);

Изменение UI-компонентов

Для работы с интерфейсом могут быть полезны функции, позволяющие быстро настроить Canvas, TextMeshPro и RectTransform:

/// <summary>/// Изменение отображения Canvas/// </summary>/// <param name="canvasGameObject"> объект, в компонентам которого будет производиться обращение </param>/// <param name="renderMode"> способ отображения </param>/// <param name="scaleMode"> способ изменения масштаба </param>private void ChangeCanvasSettings(GameObject canvasGameObject, RenderMode renderMode, CanvasScaler.ScaleMode scaleMode){    canvasGameObject.GetComponentInChildren<Canvas>().renderMode = renderMode;    var canvasScaler = canvasGameObject.GetComponentInChildren<CanvasScaler>();    canvasScaler.uiScaleMode = scaleMode;    // выставление стандартного разрешения    if (scaleMode == CanvasScaler.ScaleMode.ScaleWithScreenSize)    {        canvasScaler.referenceResolution = new Vector2(720f, 1280f);        canvasScaler.matchWidthOrHeight = 1f;    }} /// <summary>/// Изменение настроек для TextMeshPro/// </summary>/// <param name="textMeshPro"> тестовый элемент </param>/// <param name="fontSizeMin"> минимальный размер шрифта </param>/// <param name="fontSizeMax"> максимальный размер шрифта </param>/// <param name="textAlignmentOption"> выравнивание текста </param>private void ChangeTMPSettings(TextMeshProUGUI textMeshPro, int fontSizeMin, int fontSizeMax, TextAlignmentOptions textAlignmentOption = TextAlignmentOptions.Center){    // замена стандартного шрифта    textMeshPro.font = (TMP_FontAsset) AssetDatabase.LoadAssetAtPath("Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset", typeof(TMP_FontAsset));    textMeshPro.enableAutoSizing = true;    textMeshPro.fontSizeMin = fontSizeMin;    textMeshPro.fontSizeMax = fontSizeMax;    textMeshPro.alignment = textAlignmentOption;}/// <summary>/// Изменение параметров RectTransform/// </summary>/// <param name="rectTransform"> изменяемый элемент </param>/// <param name="alignment"> выравнивание </param>/// <param name="position"> позиция в 3D-пространстве </param>/// <param name="size"> размер </param>private void ChangeRectTransformSettings(RectTransform rectTransform, AnchorPresets alignment, Vector3 position, Vector2 size){    rectTransform.anchoredPosition3D = position;    rectTransform.sizeDelta = size;    rectTransform.SetAnchor(alignment);}

Замечу, что для RectTransform я использую расширение самого класса, найденное когда-то давно на форумах по Unity. С его помощью очень удобно настраивать Anchor и Pivot. Такие расширения рекомендуется складывать в папку Utils:

Пример возможной иерархии для расширений стандартных классов Пример возможной иерархии для расширений стандартных классов

Код данного расширения оставляю для вас в спойлере:

RectTransformExtension.cs
using UnityEngine;public enum AnchorPresets{    TopLeft,    TopCenter,    TopRight,    MiddleLeft,    MiddleCenter,    MiddleRight,    BottomLeft,    BottomCenter,    BottomRight,    VertStretchLeft,    VertStretchRight,    VertStretchCenter,    HorStretchTop,    HorStretchMiddle,    HorStretchBottom,    StretchAll}public enum PivotPresets{    TopLeft,    TopCenter,    TopRight,    MiddleLeft,    MiddleCenter,    MiddleRight,    BottomLeft,    BottomCenter,    BottomRight,}/// <summary>/// Расширение возможностей работы с RectTransform/// </summary>public static class RectTransformExtension{    /// <summary>    /// Изменение якоря    /// </summary>    /// <param name="source"> компонент, свойства которого требуется изменить </param>    /// <param name="align"> способ выравнивания </param>    /// <param name="offsetX"> смещение по оси X </param>    /// <param name="offsetY"> смещение по оси Y </param>    public static void SetAnchor(this RectTransform source, AnchorPresets align, int offsetX = 0, int offsetY = 0)    {        source.anchoredPosition = new Vector3(offsetX, offsetY, 0);        switch (align)        {            case (AnchorPresets.TopLeft):            {                source.anchorMin = new Vector2(0, 1);                source.anchorMax = new Vector2(0, 1);                break;            }            case (AnchorPresets.TopCenter):            {                source.anchorMin = new Vector2(0.5f, 1);                source.anchorMax = new Vector2(0.5f, 1);                break;            }            case (AnchorPresets.TopRight):            {                source.anchorMin = new Vector2(1, 1);                source.anchorMax = new Vector2(1, 1);                break;            }            case (AnchorPresets.MiddleLeft):            {                source.anchorMin = new Vector2(0, 0.5f);                source.anchorMax = new Vector2(0, 0.5f);                break;            }            case (AnchorPresets.MiddleCenter):            {                source.anchorMin = new Vector2(0.5f, 0.5f);                source.anchorMax = new Vector2(0.5f, 0.5f);                break;            }            case (AnchorPresets.MiddleRight):            {                source.anchorMin = new Vector2(1, 0.5f);                source.anchorMax = new Vector2(1, 0.5f);                break;            }            case (AnchorPresets.BottomLeft):            {                source.anchorMin = new Vector2(0, 0);                source.anchorMax = new Vector2(0, 0);                break;            }            case (AnchorPresets.BottomCenter):            {                source.anchorMin = new Vector2(0.5f, 0);                source.anchorMax = new Vector2(0.5f, 0);                break;            }            case (AnchorPresets.BottomRight):            {                source.anchorMin = new Vector2(1, 0);                source.anchorMax = new Vector2(1, 0);                break;            }            case (AnchorPresets.HorStretchTop):            {                source.anchorMin = new Vector2(0, 1);                source.anchorMax = new Vector2(1, 1);                break;            }            case (AnchorPresets.HorStretchMiddle):            {                source.anchorMin = new Vector2(0, 0.5f);                source.anchorMax = new Vector2(1, 0.5f);                break;            }            case (AnchorPresets.HorStretchBottom):            {                source.anchorMin = new Vector2(0, 0);                source.anchorMax = new Vector2(1, 0);                break;            }            case (AnchorPresets.VertStretchLeft):            {                source.anchorMin = new Vector2(0, 0);                source.anchorMax = new Vector2(0, 1);                break;            }            case (AnchorPresets.VertStretchCenter):            {                source.anchorMin = new Vector2(0.5f, 0);                source.anchorMax = new Vector2(0.5f, 1);                break;            }            case (AnchorPresets.VertStretchRight):            {                source.anchorMin = new Vector2(1, 0);                source.anchorMax = new Vector2(1, 1);                break;            }            case (AnchorPresets.StretchAll):            {                source.anchorMin = new Vector2(0, 0);                source.anchorMax = new Vector2(1, 1);                break;            }        }    }    /// <summary>    /// Изменение pivot    /// </summary>    /// <param name="source"> компонент, свойства которого требуется изменить </param>    /// <param name="preset"> способ выравнивания </param>    public static void SetPivot(this RectTransform source, PivotPresets preset)    {        switch (preset)        {            case (PivotPresets.TopLeft):            {                source.pivot = new Vector2(0, 1);                break;            }            case (PivotPresets.TopCenter):            {                source.pivot = new Vector2(0.5f, 1);                break;            }            case (PivotPresets.TopRight):            {                source.pivot = new Vector2(1, 1);                break;            }            case (PivotPresets.MiddleLeft):            {                source.pivot = new Vector2(0, 0.5f);                break;            }            case (PivotPresets.MiddleCenter):            {                source.pivot = new Vector2(0.5f, 0.5f);                break;            }            case (PivotPresets.MiddleRight):            {                source.pivot = new Vector2(1, 0.5f);                break;            }            case (PivotPresets.BottomLeft):            {                source.pivot = new Vector2(0, 0);                break;            }            case (PivotPresets.BottomCenter):            {                source.pivot = new Vector2(0.5f, 0);                break;            }            case (PivotPresets.BottomRight):            {                source.pivot = new Vector2(1, 0);                break;            }        }    }}

Использовать данные функции можно так:

// изменение настроек отображения Canvasvar canvas = GameObject.Find("Canvas");ChangeCanvasSettings(canvas, RenderMode.ScreenSpaceOverlay, CanvasScaler.ScaleMode.ScaleWithScreenSize);// изменение настроек шрифтаvar tmp = canvas.GetComponentInChildren<TextMeshProUGUI>();ChangeTMPSettings(tmp, 36, 72, TextAlignmentOptions.BottomRight);// изменение RectTransformChangeRectTransformSettings(tmp.GetComponent<RectTransform>(), AnchorPresets.MiddleCenter, Vector3.zero, new Vector2(100f, 20f));

Аналогично, может пригодиться расширение для класса Transform для поиска дочернего элемента (при наличии сложной иерархии):

TransformExtension.cs
using UnityEngine;/// <summary>/// Расширение возможностей работы с Transform/// </summary>public static class TransformExtension{    /// <summary>    /// Рекурсивный поиск дочернего элемента с определённым именем    /// </summary>    /// <param name="parent"> родительский элемент </param>    /// <param name="childName"> название искомого дочернего элемента </param>    /// <returns> null - если элемент не найден,    ///           Transform элемента, если элемент найден    /// </returns>    public static Transform FindChildWithName(this Transform parent, string childName)    {        foreach (Transform child in parent)        {            if (child.name == childName)                return child;            var result = child.FindChildWithName(childName);            if (result)                return result;        }        return null;    }}

Для тех, кому хочется иметь возможность видеть событие OnClick() на кнопке в инспекторе - может быть полезна вот такая функция:

/// <summary>/// Добавление обработчика события на кнопку (чтобы было видно в инспекторе)/// </summary>/// <param name="uiButton"> кнопка </param>/// <param name="action"> требуемое действие </param>private static void AddPersistentListenerToButton(Button uiButton, UnityAction action){    try    {        // сработает, если уже есть пустое событие        if (uiButton.onClick.GetPersistentTarget(0) == null)            UnityEventTools.RegisterPersistentListener(uiButton.onClick, 0, action);    }    catch (ArgumentException)    {        UnityEventTools.AddPersistentListener(uiButton.onClick, action);    }}

То есть, если написать следующее:

// добавление события на кнопкуAddPersistentListenerToButton(canvas.GetComponentInChildren<Button>(), FindObjectOfType<SampleClass>().QuitApp);

То результат работы в движке будет таким:

Результат работы AddPersistentListenerРезультат работы AddPersistentListener

Добавление новых объектов и изменение иерархии на сцене

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

/// <summary>/// Изменение слоя объекта по названию слоя/// </summary>/// <param name="gameObject"> объект </param>/// <param name="layerName"> название слоя </param>private void ChangeObjectLayer(GameObject gameObject, string layerName){    gameObject.layer = LayerMask.NameToLayer(layerName);}/// <summary>/// Добавление префаба на сцену с возможностью определения родительского элемента и порядка в иерархии/// </summary>/// <param name="prefabPath"> путь к префабу </param>/// <param name="parentGameObject"> родительский объект </param>/// <param name="hierarchyIndex"> порядок в иерархии родительского элемента </param>private void InstantiateNewGameObject(string prefabPath, GameObject parentGameObject, int hierarchyIndex = 0){    if (parentGameObject)    {        var newGameObject = Instantiate((GameObject) AssetDatabase.LoadAssetAtPath(prefabPath, typeof(GameObject)), parentGameObject.transform);                    // изменение порядка в иерархии сцены внутри родительского элемента        newGameObject.transform.SetSiblingIndex(hierarchyIndex);    }    else        Instantiate((GameObject) AssetDatabase.LoadAssetAtPath(prefabPath, typeof(GameObject)));}

Таким образом, при выполнении следующего кода:

// изменение тэга и слоя объектаvar cube = GameObject.Find("Cube");cube.tag = "Player";ChangeObjectLayer(cube, "MainLayer");               // создание нового объекта на сцене и добавление его в иерархию к существующемуInstantiateNewGameObject("Assets/Prefabs/Capsule.prefab", cube, 1);

Элемент встанет не в конец иерархии, а на заданное место:

Цикл обновления сцен

И наконец, самое главное - функция, с помощью которой происходит вся дальнейшая автоматизация открывания-изменения-сохранения сцен, добавленных в File ->Build Settings:

/// <summary>/// Запускает цикл обновления сцен в Build Settings/// </summary>/// <param name="onSceneLoaded"> действие при открытии сцены </param>private void RunSceneUpdateCycle(UnityAction onSceneLoaded){    // получение путей к сценам для дальнейшего открытия    var scenes = EditorBuildSettings.scenes.Select(scene => scene.path).ToList();    foreach (var scene in scenes)    {        // открытие сцены        EditorSceneManager.OpenScene(scene);                    // пометка для сохранения, что на сцене были произведены изменения        EditorSceneManager.MarkSceneDirty(SceneManager.GetActiveScene());                    // проведение изменений        onSceneLoaded?.Invoke();                    // сохранение        EditorApplication.SaveScene();                    Debug.Log($"UPDATED {scene}");    }}

А теперь соединим всё вместе, чтобы запускать цикл обновления сцен по клику на кнопку:

Полный код SceneUpdater.cs
#if UNITY_EDITORusing System;using UnityEditor.Events;using TMPro;using UnityEngine.UI;using System.Collections.Generic;using UnityEngine.SceneManagement;using UnityEditor;using UnityEditor.SceneManagement;using System.Linq;using UnityEngine;using UnityEngine.Events;/// <summary>/// Класс для обновления сцен, включённых в список BuildSettings (активные и неактивные)/// </summary>public class SceneUpdater : EditorWindow{    [MenuItem("Custom Tools/Scene Updater")]    public static void ShowWindow()    {        GetWindow(typeof(SceneUpdater));    }    private void OnGUI()    {        // пример использования        if (GUILayout.Button("Update scenes"))            RunSceneUpdateCycle((() =>            {                // изменение тэга и слоя объекта                var cube = GameObject.Find("Cube");                cube.tag = "Player";                ChangeObjectLayer(cube, "MainLayer");                                // добавление компонента к объекту с уникальным названием                AddComponentToObject<BoxCollider>("Plane");                                // удаление объекта с уникальным названием                DestroyObjectWithName("Sphere");                                // создание нового объекта на сцене и добавление его в иерархию к существующему                InstantiateNewGameObject("Assets/Prefabs/Capsule.prefab", cube, 1);                // изменение настроек отображения Canvas                var canvas = GameObject.Find("Canvas");                ChangeCanvasSettings(canvas, RenderMode.ScreenSpaceOverlay, CanvasScaler.ScaleMode.ScaleWithScreenSize);                // изменение настроек шрифта                var tmp = canvas.GetComponentInChildren<TextMeshProUGUI>();                ChangeTMPSettings(tmp, 36, 72, TextAlignmentOptions.BottomRight);                // изменение RectTransform                ChangeRectTransformSettings(tmp.GetComponent<RectTransform>(), AnchorPresets.MiddleCenter, Vector3.zero, new Vector2(100f, 20f));                                // добавление события на кнопку                AddPersistentListenerToButton(canvas.GetComponentInChildren<Button>(), FindObjectOfType<SampleClass>().QuitApp);                // копирование настроек компонента                CopyTransformPositionRotationScale(GameObject.Find("Plane"), cube, copyScale:false);            }));    }    /// <summary>    /// Запускает цикл обновления сцен в Build Settings    /// </summary>    /// <param name="onSceneLoaded"> действие при открытии сцены </param>    private void RunSceneUpdateCycle(UnityAction onSceneLoaded)    {        // получение путей к сценам для дальнейшего открытия        var scenes = EditorBuildSettings.scenes.Select(scene => scene.path).ToList();        foreach (var scene in scenes)        {            // открытие сцены            EditorSceneManager.OpenScene(scene);                        // пометка для сохранения, что на сцене были произведены изменения            EditorSceneManager.MarkSceneDirty(SceneManager.GetActiveScene());                        // проведение изменений            onSceneLoaded?.Invoke();                        // сохранение            EditorApplication.SaveScene();                        Debug.Log($"UPDATED {scene}");        }    }    /// <summary>    /// Добавление обработчика события на кнопку (чтобы было видно в инспекторе)    /// </summary>    /// <param name="uiButton"> кнопка </param>    /// <param name="action"> требуемое действие </param>    private static void AddPersistentListenerToButton(Button uiButton, UnityAction action)    {        try        {            // сработает, если уже есть пустое событие            if (uiButton.onClick.GetPersistentTarget(0) == null)                UnityEventTools.RegisterPersistentListener(uiButton.onClick, 0, action);        }        catch (ArgumentException)        {            UnityEventTools.AddPersistentListener(uiButton.onClick, action);        }    }    /// <summary>    /// Изменение параметров RectTransform    /// </summary>    /// <param name="rectTransform"> изменяемый элемент </param>    /// <param name="alignment"> выравнивание </param>    /// <param name="position"> позиция в 3D-пространстве </param>    /// <param name="size"> размер </param>    private void ChangeRectTransformSettings(RectTransform rectTransform, AnchorPresets alignment, Vector3 position, Vector2 size)    {        rectTransform.anchoredPosition3D = position;        rectTransform.sizeDelta = size;        rectTransform.SetAnchor(alignment);    }    /// <summary>    /// Изменение настроек для TextMeshPro    /// </summary>    /// <param name="textMeshPro"> тестовый элемент </param>    /// <param name="fontSizeMin"> минимальный размер шрифта </param>    /// <param name="fontSizeMax"> максимальный размер шрифта </param>    /// <param name="textAlignmentOption"> выравнивание текста </param>    private void ChangeTMPSettings(TextMeshProUGUI textMeshPro, int fontSizeMin, int fontSizeMax, TextAlignmentOptions textAlignmentOption = TextAlignmentOptions.Center)    {        // замена стандартного шрифта        textMeshPro.font = (TMP_FontAsset) AssetDatabase.LoadAssetAtPath("Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset", typeof(TMP_FontAsset));        textMeshPro.enableAutoSizing = true;        textMeshPro.fontSizeMin = fontSizeMin;        textMeshPro.fontSizeMax = fontSizeMax;        textMeshPro.alignment = textAlignmentOption;    }    /// <summary>    /// Изменение отображения Canvas    /// </summary>    /// <param name="canvasGameObject"> объект, в компонентам которого будет производиться обращение </param>    /// <param name="renderMode"> способ отображения </param>    /// <param name="scaleMode"> способ изменения масштаба </param>    private void ChangeCanvasSettings(GameObject canvasGameObject, RenderMode renderMode, CanvasScaler.ScaleMode scaleMode)    {        canvasGameObject.GetComponentInChildren<Canvas>().renderMode = renderMode;        var canvasScaler = canvasGameObject.GetComponentInChildren<CanvasScaler>();        canvasScaler.uiScaleMode = scaleMode;        // выставление стандартного разрешения        if (scaleMode == CanvasScaler.ScaleMode.ScaleWithScreenSize)        {            canvasScaler.referenceResolution = new Vector2(720f, 1280f);            canvasScaler.matchWidthOrHeight = 1f;        }    }         /// <summary>    /// Получение всех верхних дочерних элементов    /// </summary>    /// <param name="parentGameObject"> родительский элемент </param>    /// <returns> список дочерних элементов </returns>    private static List<GameObject> GetAllChildren(GameObject parentGameObject)    {        var children = new List<GameObject>();                for (int i = 0; i< parentGameObject.transform.childCount; i++)            children.Add(parentGameObject.transform.GetChild(i).gameObject);                return children;    }    /// <summary>    /// Копирование позиции, поворота и размера с компонента Transform у одного объекта    /// на такой же компонент другого объекта.    /// Для корректного переноса координат у parent root объеков должны быть нулевые координаты    /// </summary>    /// <param name="objectToCopyFrom"> объект, с которого копируются части компонента </param>    /// <param name="objectToPasteTo"> объект, на который вставляются части компонента </param>    /// <param name="copyPosition"> по умолчанию позиция копируется, с помощью данного параметра это можно отключить </param>    /// <param name="copyRotation"> по умолчанию поворот копируется, с помощью данного параметра это можно отключить </param>    /// <param name="copyScale"> по умолчанию размер копируется, с помощью данного параметра это можно отключить </param>    private static void CopyTransformPositionRotationScale(GameObject objectToCopyFrom, GameObject objectToPasteTo,         bool copyPosition = true, bool copyRotation = true, bool copyScale = true)    {        var newTransform = objectToCopyFrom.GetComponent<Transform>();        var currentTransform = objectToPasteTo.GetComponent<Transform>();                if (copyPosition) currentTransform.localPosition = newTransform.localPosition;        if (copyRotation) currentTransform.localRotation = newTransform.localRotation;        if (copyScale) currentTransform.localScale = newTransform.localScale;    }        /// <summary>    /// Копирование позиции, поворота и размера с компонента RectTransform у UI-панели одного объекта    /// на такой же компонент другого объекта. Не копируется размер самой панели (для этого использовать sizeDelta)    /// Для корректного переноса координат у parent root объеков должны быть нулевые координаты    /// </summary>    /// <param name="objectToCopyFrom"> объект, с которого копируются части компонента </param>    /// <param name="objectToPasteTo"> объект, на который вставляются части компонента </param>    /// <param name="copyPosition"> по умолчанию позиция копируется, с помощью данного параметра это можно отключить </param>    /// <param name="copyRotation"> по умолчанию поворот копируется, с помощью данного параметра это можно отключить </param>    /// <param name="copyScale"> по умолчанию размер копируется, с помощью данного параметра это можно отключить </param>    private static void CopyRectTransformPositionRotationScale(GameObject objectToCopyFrom, GameObject objectToPasteTo,        bool copyPosition = true, bool copyRotation = true, bool copyScale = true)    {        var newTransform = objectToCopyFrom.GetComponent<RectTransform>();        var currentTransform = objectToPasteTo.GetComponent<RectTransform>();                if (copyPosition) currentTransform.localPosition = newTransform.localPosition;        if (copyRotation) currentTransform.localRotation = newTransform.localRotation;        if (copyScale) currentTransform.localScale = newTransform.localScale;    }    /// <summary>    /// Уничтожение объекта с уникальным названием    /// </summary>    /// <param name="objectName"> название объекта </param>    private void DestroyObjectWithName(string objectName)    {        DestroyImmediate(GameObject.Find(objectName)?.gameObject);    }    /// <summary>    /// Добавление компонента к объекту с уникальным названием    /// </summary>    /// <param name="objectName"> название объекта </param>    /// <typeparam name="T"> тип компонента </typeparam>    private void AddComponentToObject<T>(string objectName) where T : Component    {        GameObject.Find(objectName)?.gameObject.AddComponent<T>();    }    /// <summary>    /// Изменение слоя объекта по названию слоя    /// </summary>    /// <param name="gameObject"> объект </param>    /// <param name="layerName"> название слоя </param>    private void ChangeObjectLayer(GameObject gameObject, string layerName)    {        gameObject.layer = LayerMask.NameToLayer(layerName);    }    /// <summary>    /// Добавление префаба на сцену с возможностью определения родительского элемента и порядка в иерархии    /// </summary>    /// <param name="prefabPath"> путь к префабу </param>    /// <param name="parentGameObject"> родительский объект </param>    /// <param name="hierarchyIndex"> порядок в иерархии родительского элемента </param>    private void InstantiateNewGameObject(string prefabPath, GameObject parentGameObject, int hierarchyIndex = 0)    {        if (parentGameObject)        {            var newGameObject = Instantiate((GameObject) AssetDatabase.LoadAssetAtPath(prefabPath, typeof(GameObject)), parentGameObject.transform);                        // изменение порядка в иерархии сцены внутри родительского элемента            newGameObject.transform.SetSiblingIndex(hierarchyIndex);        }        else            Instantiate((GameObject) AssetDatabase.LoadAssetAtPath(prefabPath, typeof(GameObject)));    }}#endif

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

Волшебная кнопкаВолшебная кнопка

Заключение

Имея в своём распоряжении такой инструмент, вы сможете делать всё, что вам угодно за считанные клики: сериализовать поля, менять иерархию на сценах, настраивать Fuse/IClone/DAZ и других персонажей, а также менять Build Pipeline, но об этом как-нибудь в другой раз.

Главное, не забывайте использовать систему контроля версий и проверять запуск ваших модификаций сперва на одной сцене (т.е. без использования RunSceneUpdateCycle).

Запустить тестовый проект и получить полный код можно на моём GitHub.

Кстати, тех, кто планирует строить карьеру в IT, ябуду рада видеть на своёмYouTube-канале IT DIVA. Там вы сможете найти видео по тому, как оформлять GitHub, проходить собеседования, получать повышение, справляться с профессиональным выгоранием, управлять разработкой и т.д.

Спасибо за внимание и до новых встреч!

Подробнее..

Хочу больше годных профстатей, Хабр

21.06.2021 10:15:25 | Автор: admin

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

Ну, судите сами. Вот примерный список тем, которые превалируют на Хабре.

  1. Что там новенького у Илона Петровича Маска.

  2. Как с помощью Arduino, говна и палок сделать годный фаллоимитатор радиоприемник.

  3. Как я ушел с прошлой работы, и как мне было там плохо.

  4. Как я нашел свою текущую работу, и какая она крутая.

  5. Как живется специалисту X в стране Y.

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

  7. Обсуждение новомодной платформы для веб-разработки, которая через 3 года станет старомодной.

  8. Промываем косточки крупным компаниям.

  9. Исторические экскурсы в IT/технологии/медицину.

  10. Реклама компаний.

  11. Мнения обо всем отвлеченном на свете.

  12. И т. д.

Все эти темы и все статьи неплохие, интересные. Но я хотел бы другого.

Я давно программирую на С++/qt. Думаю, что могу создать с нуля любой программный продукт (desktop) . Могу набирать команды, могу выстраивать отношения с заказчиками и т.д. Периодически приходится запускать (создавать) новые направления/программные продукты. Однако время, затрачиваемое мной и командой на каждый новый продукт, остается примерно постоянным. Вернее, не совсем так. Время суммарной работы оказывается в прямой пропорциональной зависимости от сложности продукта (объема кодовой базы). То есть постоянной величиной оказывается производительность работ, или эффективность труда. На всякий случай оговорюсь, что речь не идет о новичках, в команде только опытные толковые сотрудники.

Так вот, эту самую производительность труда очень хотелось бы увеличить. Как и в чем мне может помочь Хабр? Или я зря надеюсь?

Мне хотелось бы поднимать свой профессиональный уровень серьезными профессиональными статьями по проектированию/созданию/ведению больших продуктов. Статьями, которые по легкости восприятия были бы такого же классного уровня, как и сейчас большинство статей на Хабре. Но статьями, которые по глубине и полезности были бы как классические книги Скотта Майерса, банды четырех, Алана Купера, Роберта Мартина и др. Знаете, читая эти книги, я прибавлял каждый раз в квалификации. К сожалению, читая статьи на Хабре, я этого не чувствую. Даже более того: не могу припомнить случая, когда я хотел изучить какой-то новый для меня (и обычно нетривиальный) нюанс и находил бы его на Хабре. Я находил его где угодно, но только не на Хабре. Или вообще не находил.

Посему я очень жду и буду приветствовать появление на Хабре статей по следующим направлениям.

Новые шаблоны проектирования (С++)

Да, я знаю, что шаблоны не догма и не панацея, и всё всегда можно придумать и самому. Но я также знаю, что это проверенная годами экономия времени архитекторов и программистов. Это кругозор, который (при его наличии) позволяет делать сложную работу быстрее, а то и вообще моментально. У меня сложилось ощущение, что в мире С++ развитие шаблонов практически остановилось на известной книге банды четырех. Там описано 23 шаблона, и еще примерно столько же можно накопать в интернете. Я хочу больше! В моей практике были случаи, когда приходилось создавать шаблоны, разительно непохожие на известные. И приходилось тратить довольно много времени на приведение их к товарному использованию, хотя бы даже на продумывание такой терминологии, которая бы естественно бы воспринималась коллегами. Уверен, что если бы мы имели возможность в нужный момент найти и прочитать описание свежего шаблончика, наша работа местами была бы намного быстрее.

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

Кстати, по шаблонам есть фундаментальный труд POSA: 5-томник на 2000+ страниц, перевода на русский язык до сих пор нет. Чем не непаханное поле?

Шаблоны ведения проектов в Git

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

  1. Я веду маленький проект на 20 тысяч строк кода, в нем задействовано 5 человек, с системой контроля версий мы работаем вот так (и описать конкретно, вплоть до команд командной строки).

  2. Я веду неплохой проект на 100 тысяч строк кода, в нем задействовано 10 человек, и мы работаем вот так: схемы, команды git.

  3. Мы с тремя командами по 10 человек развиваем проект на 1 миллион строк кода, продаем продукт разным клиентам в разных конфигурациях, и всё свое хозяйство мы покрыли регрессионным тестированием. И для этого мы делаем вот это: схемы, команды git.

  4. У нас работает 200 человек, и у нас 10 миллионов строк кода в монорепе на 5 продуктов, и каждый продукт ещё поставляется в трех разных версиях. Мы опытным путем пришли, что только так: схемы, команды git.

  5. А у нас очень много кода и много микросервисов, каждый в своем репозитории, впрочем, есть и подрепозитории (подмодули). Часть кода покрыта тестами, часть нет. Раньше мы работали вот так, а теперь перешли на вот это (схемы, команды), но по эффективности труда одинаково приемлемо.

GUI

Дизайн GUI, новые подходы, примеры удачных и неудачных виджетов, примеры плохих и хороших интерфейсов/решений. Эта область очень динамично развивается в плане того, что мы видим на экранах своих смартфонов и мониторов (причем на смартфонах более динамично, чем на мониторах). Однако в плане научного описания, осмысления и систематизации всё как-то вяло. То есть решений полно, но ими никто не делится. А если и делится, то как-то не очень доходит до конкретных исполнителей, и те пишут с нуля. Думаю, ситуация бы улучшилась, если бы появилась серия статей в таком духе:

  1. Камрады, я внедрил к себе гамбургер-меню на 500 строк (qt) вот отсюда (ссылка). Вот, смотрите: скриншот, gif-анимация. Работает чётко! Лицензия LGPL. Короче, пользуйтесь все.

  2. Я создал свой виджет ввода паролей. Он круче, чем другие по таким-то причинам. Делюсь! Ссылка на репозиторий, скриншоты.

  3. Я смог объединить панели меню и тулбаров в одной панели. Получился принципиально новый виджет, похожий одновременно и на меню, и на тулбары. Область применения вот такая, описываю. Скриншоты, описание даю, а вот код нет!

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

  5. Раньше у нас был такой интерфейс, и такие задачи. А потом добавилась еще одна, и мы в корне переделали интерфейс. Рассказываю, почему прошлый интерфейс был оптимален, а текущий супероптимален.

  6. Я создал свою библиотеку виджетов, да еще с библиотекой стилей. Ссылка. Область применения такая-то. Могу продать хорошим людям (или подарить).

  7. Я супермегадизайнер, и на примере 30 известных приложений за последний год объясню вам, что попало в тренд, что не попало, а что создает будущий тренд.

Успешный опыт решения важных и нетривиальных задач из самой близкой действительности

Знаете, меня не сильно цепляют новости, о том, какие планы у Джеффа Безоса на космос или как Boston Dynamics обучает своего пса. Это не увеличивает мою зарплату. Я хочу чего-то более близкого и понятного мне, но самое главное применимого в моей работе.

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

Сложные ли это задачи? Непростые, но решаемые. И некоторые из них решены многократно самыми разными производителями софта.

Давайте еще пример. Я запускаю приложение X и параллельно еще парочку для полного занятия вычислительных ресурсов (например, конвертор видео). И вот в приложении X вижу слайд-анимацию, который замечательно себя ведет (нисколько не тормозит) при том, что соседние приложения на 100% заняли мой процессор. Это неплохой результат для X, и, черт возьми, я хочу знать, как они этого добились.

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

Вместо послесловия

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

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

Подробнее..

Перевод 10 постулатов по улучшению таблиц

06.04.2021 20:05:58 | Автор: admin

Короткое резюме 10 постулатов по улучшению таблиц, опубликованных в Journal of Benefit Cost Analysis экономистом Jon Schwabish.

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

Итак, перейдем к правилам.

1. Отделяйте заголовки от тела таблицы

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

Без заголовковБез заголовковС заголовкамиС заголовками

2. Используйте ненавязчивые разделители вместо толстой сетки

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

Без разделителейБез разделителейВыделение цветомВыделение цветом

3. Выравнивайте числа и заголовки по правому краю

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

Выравнивание чисел и заголовков по левому краюВыравнивание чисел и заголовков по левому краю

4. Выравнивайте текст и заголовки по левому краю

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

Различные варианты выравнивания текстаРазличные варианты выравнивания текста

5. Выбирайте адекватный уровень точности

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

Различные варианты округленийРазличные варианты округлений

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

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

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

7. Избегайте повтора единиц измерения

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

Излишек единиц измеренияИзлишек единиц измеренияПравильное оформление единиц измеренияПравильное оформление единиц измерения

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

8. Выделяйте выбросы

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

Выделение выбросов цветом текстаВыделение выбросов цветом текстаВыделение выбросов заливкойВыделение выбросов заливкой

9. Группируйте похожие данные и отделяйте их пробелами

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

Без группировки по регионамБез группировки по регионамС группировкой по регионамС группировкой по регионам

10. Добавляйте визуализацию при необходимости

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

Голая таблицаГолая таблицаОтформатированная таблицаОтформатированная таблица

Эпилог

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

Разница в наглядности очевидна. Проведите ревизию своих ежедневных и финансовых отчетов - а у Вас все правила соблюдаются? ;)

Подробнее..

Как оформить резюме, чтобы его заметили и увеличить отклик в 3 раза

03.04.2021 10:09:09 | Автор: admin
  • Что учесть при составлении резюме разработчику, чтобы получить хорошие предложения уже в первые 3 дня поисков?

  • Как оценивать стоимость своих навыков и не продешевить?

  • Как описывать опыт и писать сопроводительные письма?

  • Чего никогда не нужно делать в резюме?

Эти и другие вопросы мы с вами обсудим в данной статье.

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

Кстати, если вам больше нравится формат видео, то предлагаю заглянуть ко мне на канал IT DIVA и ознакомиться с видео про составление резюме и прохождение собеседований. А любителям аудио-формата предлагаю воспользоваться расширением-читалкой для Habr'a из моей предыдущей статьи.

Начнём с простого.

Где искать работу?

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

Помимо стандартных HeadHunter, Работа.ру и Зарплата.ру, разработчикам стоит рассматривать варианты, где вакансии выставляются преимущественно для них, например, Хабр.Карьера и LinkedIn. На этих площадках за вами буквально охотятся. Так помогите вас найти ;)

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

Кстати, вы можете добавиться ко мне в сеть LinkedIn, чтобы через общих знакомых выходить на интересные вам компании и предложения.

Как повысить количество откликов на резюме и сопроводительные письма?

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

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

Например, я искала вакансию на C#, но из-за того, что у меня в навыках был описан опыт работы с Python и Machine Learning, мне предлагали несколько вакансий в компаниях, которые занимаются преимущественно машинным обучением, что на тот момент не было мне интересно. Я потратила время рекрутеров и своё таким образом. Не совершайте моих ошибок.

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

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

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

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

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

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

Если в вашей работе важны Soft-skills, то не забывайте подкреплять примерами не только свои навыки, но и свои положительные качества, например так: "Благодаря моей коммуникабельности мы смогли повысить продажи и за месяц привлечь 20 новых клиентов".

Пример описания опыта с выделением ключевых фраз

Я сократила ежемесячные расходы компании на 30% благодаря внедрению системы автоматической техподдержки. Система была написана мной на языке C# с использованием Razor для .ASP NET. В качестве базы данных была использована СУБД PostgreSQL.

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

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

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

Как написать хорошее сопроводительное письмо?

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

Напишите лучше сопроводительное письмо к своему резюме.

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

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

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

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

Вот пример моего отклика на реальную вакансию.

Пример вежливого сопроводительного письма

Здравствуйте!

Откликаюсь на вакансию Unity программиста DreamPort в Екатеринбурге: https://ekaterinburg.hh.ru/vacancy/43313459

Меня зовут Татьяна, мне 23 года, я выпускница направления "Программная инженерия" в УрФУ.

Последние 2 года занимаюсь кроссплатформенной разработкой на Unity под PC, Android и VR (мобильный и стационарный), и знаю особенности оптимизации контента под данные платформы.

Имею опыт разработки клиент-серверных приложений. Умею настраивать UI, работать с системой контроля версий Git и настройкой SteamVR.

На текущем месте работы выполняю роль руководителя проекта:

  • занимаюсь постановкой задач команде и прогнозированием сроков;

  • разрабатываю архитектуру приложения и расширяю его функциональные возможности;

  • провожу код-ревью и контроль качества продукта (тестирование);

  • занимаюсь наставничеством и мотивированием команды.

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

До работы в текущей компании реализовала игровой проект на Unity с использованием языка С# в рамках командной работы: https://github.com/EnjiRouz/2D-Fantasy-Game .

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

К данному письму прикладываю резюме, где вы сможете более детально ознакомиться с моими проектами и опытом: Татьяна Бабичева, резюме для вакансии Unity программист.pdf

Буду рада продолжить общение, если я вам подхожу.

Татьяна Бабичева, /*телефон или телеграм*/

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

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

Как формировать зарплатные ожидания?

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

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

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

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

Сразу отмечу, что людям без опыта работы релокацию оплачивать с высокой вероятностью не будут, так что пожалуйста, не нужно писать рекрутерам сообщения из серии "Возьмите меня, я хочу жить в Питере/Москве". Без шуток, люди так делают О_О

Тем, кто только начинает свой карьерный путь в роли стажёра или Junior, я рекомендую сразу снизить свои зарплатные ожидания до 25-35 тыс. рублей, особенно в регионах. В самом лучшем случае ваша зарплата может достигать 45 тыс. рублей на старте до вычета налогов. Также, новичкам лучше искать первую работу в рамках своего места жительства, если, конечно, у вас нет опыта удалённой работы на стороннего заказчика.

Возможно, кто-то спросит, почему мы часто видим у вакансий такой большой диапазон зарплат, например, от 80 тыс. рублей до 150 тыс. рублей?

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

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

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

Чего не нужно делать в резюме?

  • писать чужое имя или использовать чужое фото (да, такое бывает);

  • использовать вульгарное, плохоосвещённое или слишком личное фото (например, с поездки на шашлыки или с ребёнком на руках);

  • писать личную информацию, не относящуюся к работе (фразы типо "мать троих детей" или "в свободное время хожу по ночным клубам", информация о семейном положении и т.д.);

  • рассказывать тупые шутки и невероятные истории из жизни (не отнимайте время у рекрутера);

  • манипулировать рекрутерами (в письме такие фразы "Если ты уделишь всего 2 минуты этому резюме, то убедишься, что лучше кандидата быть не может" только раздражают).

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

Напоследок, небольшая хитрость: выставляйте работы из портфолио в стиле предпочтительных компаний.

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

Заключение

На этом всё. Надеюсь, теперь вы сможете быстрее найти работу мечты.

Кстати, тех, кто планирует строить карьеру в IT, ябуду рада видеть на своём YouTube-канале IT DIVA. Там вы сможете найти ещё больше полезных материалов по тому как проходить собеседования, получать повышение, справляться с профессиональным выгоранием, управлять разработкой и продумывать архитектуру ПО.

Подробнее..

Recovery mode IT-стыд 2020

04.06.2021 04:18:40 | Автор: admin
Каин послеубийства своего брата Авелявзгляда на российское айти в 2020 коллаж автораКаин послеубийства своего брата Авелявзгляда на российское айти в 2020 коллаж автора

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

Привет, Хабр! В конце каждого года, на многих сайтах принято подводить различные итоги и Хабр не стал исключением. Лента наполняется темами типа топ ЯП по итогам 2020, топ 10 технологий, топ 20 работодателей, тысячи их. Но чего нет так это списка зашкваров года, которые подарили нам IT-компании и которые вызывают чувство испанского стыда. Надо сделать, подумал я и составил такой топ сам. Почему, зачем и собственно сами герои под катом. И прошу не судить строго, это мой первый, чисто развлекательный и субъективный пост. Сразу предупрежу о моей довольно специфичной манере изъясняться, которая возможно напомнит вам те времена, когда рунет был юн, дик и более-менее свободен.


Это уже было в Симпсонах

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

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

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

Зачем

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

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

Опенсорсеры года Wargaming

Ещё 17 декабря 2019 года картофельная танковая фабрика оскандалилась тем, что начала юридически преследовать своих бывших сотрудников в судах Беларуси, Кипра и США за работу над опенсорс проектом движка Framework/DAVA Engine, который она официально развивала до весны 2018 года. Поддержка проекта в качестве опенсорс официально декларировалась Wargaming на многих конференциях, в статьях, интервью и других источниках (пруф). Но потом, пять незадачливых выходцев из Wargaming, которые на данный момент работают в белорусской компании БлицТим, получили персональные иски и требование компенсации в виде $1 690 000.

Вышеупомянутые сотрудники ранее работали в минском центре разработки кипрской группы компаний Wargaming и принимали непосредственное участие в разработке игры World of Tanks Blitz и движка DAVA Framework/DAVA Engine. Затем после ухода данных сотрудников в собственный проект, картофельная фабрика золотых снарядов, предъявила им иск за размещение на гитхабе копий исходных текстов DAVA Framework и создание форков от этих копий на личные аккаунты в GitHub. Такой вот суровый опенсорц.

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

Работники года ДИТ

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

Криво работающие Цифровые пропускаполучающие разрешениена отправку рекламы на следующие 10 лет, забагованный Социальный мониторинг, наспех собранный из кодатрекера мусоровозови обязывающий людей раз в 3 часа делать селфи и отсылать на проверку, откровенно шпионское Госуслуги СТОП Коронавирус (это реальное название от богов нейминга) все это поделки этих ребят. При этом их бюджет в 2020 составил 80 млрд руб. Как говорится, делайте выводы господа. Что забавно, по собственной оценке бракоделов из ДИТ все это позволило Москве избежать самого опасного сценария, который был в Италии и других европейских странах. Ага, конечно, особенно если отчётность по заболевшимможно подкручивать.

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

Перевозчики года Яндекс.Такси

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

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

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

Чуть позже, главарь пресс-службы ЯТ Вова Исаев заявил, что бумажный запрос таки был. Но в виду аффиляции Яши с госами я лично склонен думать, что им никто не мешает выдать данные хоть по свистку, не то что по запросу с личной почты на мейлру, а бумажный запрос можно и задним числом сделать. Тем более, что бумагу эту можно никому не показывать, ведь раскрывать содержание таких запросов запрещает, например, статья 161 УПК.

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

Клиентоориентированность года Яндекс.Go

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

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

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

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

Связисты года Yota

Можно как угодно относиться к деятельности ФБК и их фюреру-блогеру (мне, например, нравится их развлекательный бложик на YouTube), но в 2020 с их подачи в этом посте можно упомянуть компанию Yota, котораянезаконно отключила связьодному из самых известных сотрудников ФБК Руслану Шаведдинову в момент, когда силовики ломали дверь в его квартиру, чтобы не дать ему возможности оповестить родных или адвоката о происходящем, и спустя несколько дней даже не удосужилась прокомментировать эту постыдную историю. Позже стало известно, что Yota ещё и установила особый режим для номера Шаведдинова, при звонке, на который сообщается, что абонент находится не в сети. Также к номеру прикреплена плашка с пометкой обо всех действиях по номеру сообщать в PR.

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

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

Карьерная возможность года Wildberries

Случай, который на Хабре не освещен был вообще. В конце сентября закрыли крупный (по их меркам) проект с командой из 30 человек, а от руководства поступило указание сократить на некоторых проектах 30% штата. Такое случается, конечно, но это было лишь начало.

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

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

Стыд и срам года Рамблер

В этой номинации и не могло быть другой компании, ведь инциденты подобные этому происходят чуть ли не раз в несколько лет. Данная история была широко освещена на самом Хабре и за его пределами, поэтому я не буду детально ее пересказывать. Кратко напомню, что в декабре 2019 Рамблер спустя 18 лет начал судебное преследование своих бывших сотрудников Игоря Сысоева и Максима Коновалова, пытаясь отжать у них права на самый популярный в мире веб-сервер Nginx, который был создан в 2002, когда Сысоев работал в Рамблере сисадмином. Незадолго до этого Nginx был куплен американской корпорацией F5 Networks за $670 млн. Узнав об этом, в Рамблере жутко возбудились, и посчитав что Nginx был создан в служебное время, и заявили о своих правах на проект. Немедленно было возбуждено уголовное дело, а в офисе у Сысоева и Коновалова даже прошли обыски. Претензии предъявила компания Рамблер, хотя формально обвинителем стала Lynwood Investments CY Ltd, которой передали на это права. Последняя связана с совладельцем группировки Rambler Сашей Мамутом.

Реакция общественности не заставила себя долго ждать и IT-аудитория облила Рамблер таким потоком говна, что долетело даже до самого Германа Грефа, который был вынужден вмешаться в ситуацию через своего зампреда Льва Хасиса, который на тот момент был председателем совета директоров Рамблера. В итоге в 2020 Рамблер попросил прекратить уголовное дело о правах на Nginx, исключив себя из числа потерпевших. Правда теперь истцом станет кипрская Lynwood,продолжив разбирательствоуже в международном суде.

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

Что забавно, сам Хабр показал себя в этой истории довольно неоднозначно. Ситуация с Nginx сподвигла написать осуждающий пост самогоДенискина, редакция велахронологию инцидента, а на главной была даже специальная ссылка, позволяющая держать руку на пульсе ситуации. Но это всё не помешало пригласить Рамблер в марафон удалёнки. Как говорится, вы не понимаете, это другое. В целом понятно желание быть IT-Швейцарией, но тут либо крестик снимите, либо трусы наденьте.

Заключение

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

Спасибо, что прочитали этот пост и увидимся в следующем году. Если я упустил кого-то, за кого тоже в 2020 было стыдно пишите о них в комментариях. Также буду рад почитать вашу объективную критику, с ней получится делать Хабрастыд-2021 менее стыдным. Всех с Новым Годом и Рождеством!

Подробнее..

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

22.03.2021 20:04:15 | Автор: admin

Imposter Phenomenon это когда человек считает свой успех или результаты работы удачным стечением обстоятельств и не приписывает их своим стараниям или личным качествам. В результате он не готов об этом говорить и делиться полученным опытом.

Среди разработчиков и айтишников достаточно распространенное явление. По тем источникам, которые мне попадались, да и по собственным наблюдениям, себя недооценивают 60-75% активных и талантливых людей. Та же Википедия со ссылками на различные статьи говорит нам о том, что синдромом самозванца страдали Альберт Эйнштейн, Шерил Сэндберг (исполнительный директор Facebook), ну и Эмма Уотсон в том же списке. Подборка забавная, но да ладно. Давайте лучше зададимся вопросом, кто бы как не относился к этим людям (я сейчас не про Эйнштейна), им же в любом случае есть что рассказать другим исходя из своего опыта? И у этих рассказов будет своя благодарная аудитория. Причем очень большая. Но не будем забегать вперед. Пойдем по порядку.

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

В чем проблема у айтишников

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

Проблема эксперта-самозванца

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

Проблема перфекциониста-самозванца

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

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

Как избавиться от синдрома самозванца

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

1. Будьте объективны с самим собой и своим позиционированием

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

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

2. Не пытайтесь быть идеальным

Ошибаются все, и нужно дать себе право на ошибку. У редакторов есть такая шутка, когда заказчик приносит текст и просит найти в нем ошибки, редактор тут же спрашивает: сколько ошибок надо найти? Смысл в том, что профи в своем деле может наковырять сколько угодно ошибок и у кого угодно. Хоть у Ильяхова с Норой Галь. Но это не отменяет того, что они молодцы. Хотя бы потому, что первыми подняли свои темы.

3. Позвольте себе говорить о своих успехах

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

4. Ориентируйтесь на принцип достаточно хорошо

Каждый, кто сегодня выпускает масштабный продукт, знает, что будет шлифовать и патчить его вплоть до EOL. Является ли это причиной не выпускать его вовсе? Нет. И обязательно настает момент, когда продукт станет достаточно хорош, и его можно зарелизить. Он отрабатывает большинство кейсов, хотя при этом идеальным не будет никогда. По крайней мере, не для всех.

5. Помните, что на протяжении всей своей жизни человек учится

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

И вот это классическое: ну кто я такой чтобы о чем-то рассказывать

Мол на Хабре уже полно умных людей, которые всем все давно рассказывают. На самом деле вы один из вот этих товарищей:

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

Чтобы не тратить время, не стану рассказывать про тех двух умников, что справа. А вот survivor и the called отличные запасные варианты. Это выживший и призванный. Они пригодятся, например, когда у вас нет достаточного количества времени, чтобы сделать из своей темы энциклопедический лонгрид, но при этом хочется поделиться чем-то интересным.

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

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

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

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

Еще одна подсказка из серии куда податься, когда вокруг все умные на слайде, который я вытащил из курса лекций Как писать на Habr:

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

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

Подробнее..

Дорогой Хабр, формат GIF устарел, включи пожалуйста H.264

15.06.2021 16:19:06 | Автор: admin
image
Анимированная GIF. Файл весит 4МБ

Эта анимированная гифка весит 4МБ, хотя может весить В ДЕСЯТЬ РАЗ МЕНЬШЕ 380кб! Это ужасно, потому что нагружает интернет-каналы в десятки раз больше, чем должно.

Почему GIF должен умереть



  • Вес файла GIF ровно 10 раз больше чем H264
  • Анимированный GIF поддерживает только 256 цветов
  • Формат H264 поддерживают ВСЕ современные браузеры
  • Так как H264 это по сути видео, к нему опционально можно добавить элементы управления: перемотку, паузу.


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

Пример анимации H264




Анимация в формате h264 весит в 10 раз меньше

Та же самая гифка в формате H264 залитая на imgur весит в десять раз меньше. Но вставлять ее через oembed неудобно, imgur добавляет кучу лишнего мусора. Поэтому я прошу Хабр добавить нативную поддержку mp4 контейнеров, чтобы их можно было вставлять сразу в тело статьи без сторонних сервисов.

Вставка медиа через iframely




Есть такой сервис iframely.com. Через него можно слепить oembed элемент для вставки на хабр. Но у меня не получилось слепить mp4 видео с автовоспроизведением.

Помогите, страдаю!
Подробнее..

Стереотипам вопреки коллекция вдохновляющих корпоративных постов

30.04.2021 22:19:48 | Автор: admin

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


В массе своей хорошие корпопосты делятся на четыре крупные категории.

  • Посты о текущих или завершённых проектах, в которых компания показывает чем и как занята.

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

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

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

Мы пройдёмся по всем категориям и покажем конкретные примеры.

Проекты и оптимизация

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

Как Яндекс применил компьютерное зрение для повышения качества видеотрансляций. Технология DeepHD

Яндекс научил нейросети апскейлить видео до 720p. И речь не только о старых фильмах и мультиках: сетка справляется и с трансляциями в прямом эфире. Пока в нейроапскейле можно посмотреть только хиты Союзмультфильма. Но ценность статьи прежде всего в том, что здесь поэтапно рассказано, как учили нейросеть. Для тех, кто хочет сам собрать что-то подобное на досуге и отреставрировать старые шедевры.

Как раздвинуть кости черепа, чтобы легче дышалось: место, где в стоматологии сошлись сразу три новые технологии

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

Создание виртуальной волны

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

Остроумие и отвага: как мы много раз ошибались, создавая iFunny

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

Как настроить командную работу и сохранять спокойствие в чатах Телеграма, если всё горит, и все в аду

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

Новый плацкарт в вагоне габарита Т: помните ту обратную связь, что вы давали на 1-ВМ?

Статья от Туту.ру про редизайн плацкартных вагонов. Завезли комфортные широкие полки, вместительные шкафы и даже душ в вагоне. Но это не просто любование, а мастер-класс по работе с фидбэком. Ведь редизайн ответ на 500+ пожеланий клиентов. К каждому нововведению приписка: здесь всем угодили, тут пока нет. А ещё после прочтения ты сможешь отфидбечить уже сам редизайн. Чтобы потом было комфортнее кататься.

Свершилось: ценники, которые всегда актуальны, пилот на 79 тысяч штук в магазине

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

Работа с людьми

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

Сгоревшие сотрудники: есть ли выход?

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

Профессиональное выгорание айтишников: 15 ответов психиатра Максима Малявина

А вот если ты сам грустный Игнат и в гробу видел помощь от менеджеров, то для тебя Southbridge поговорили о выгорании с профессиональным психиатром. Ответы на все важные вопросы и набор советов для каждого работника, у которого вдруг надолго загостила осенняя хандра. Читай, сверяйся. Спасение выгорающих дело рук самих выгорающих.

Мы тратим годы на то, что делается неделю потому что все ларьки заигрались в IT-гигантов

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

Как это работает, или Технопорно

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

Эмулятор RFID

Эксперт из RUVDS, страшный гибрид радиолюбителя и программиста, подробно рассказывает, как работают RFID-карты и брелки. И ладно бы просто объяснял теорию! Но он ещё и поясняет, как собрать полноценный эмулятор RFID из пары радиодеталей и Assembler-кода. С многочисленными фото собственного кустарного эмуля, конечно же. Читать интересно уже потому, что чувствуется интерес и мастерство автора, даже если от сложных объяснений слегка пухнет голова.

Дата-центр ВКонтакте

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

Flipper Zero пацанский мультитул-тамагочи для пентестера

Но не одним же мегакорпорациям хвастаться достижениями! Небольшая Flipper Devices Inc., например, создала уникальный карманный хакерский мультитул. С экраном, как на старенькой Nokia, и дельфином-тамагочи. Статья про то, почему этот уникальный девайс умеет всё необходимое для полноценного пентеста, что у него внутри и зачем он задизайнен под милитари-киберпанк. Рекомендуется всем фанатам инфобезопасности.

Мечтают ли андроиды об электропанке? Как я учил нейросеть писать музыку

Тем временем программист ЛАНИТ в свободное время учит нейросети плохому: играть панк и регги. Помимо весёлых шуток про три роботских аккорда, в статье есть подробный, глубокий анализ того, как сейчас работают музыкальные нейросетки и как обучить свою собственную. С траблшутингом типичных проблем, примерами кода и, конечно, получившимися в итоге взрывными рок-хитами в MIDI.

Забавы и развлечения

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

Тапочки для гика: ищем позитив во временных закрытиях офисов

Комфорт на удалёнке превыше всего! Вот и Leader-ID пытаются помочь: написали материал о разнообразных моделях тапочек для гиков от слипперов с поп-культурным принтом до пугающих плюшевых робобутсов с аудиосопровождением из Терминатора. Пригодится каждому, кто хочет сменить наконец старые стёртые шлёпанцы на что-нибудь приличное. Или просто поугорать с необычных тапок.

Как я использую AirDrop вместо Тиндера

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

Хороший договор короткий договор

Корпораты тоже люди. Их, как и всех нас, бесит нечитаемый юридический спич в договорах. Айтишник из ITSOFT повествует, как он с коллегами составил короткий, понятный и точный договор об услугах. У них получилось вместить всё нужное на три страницы легко считываемого текста. Получится и у тебя. Долой казёнщину!

Ход конём по битам. Шахматный Bitboard

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

Заключение

И это только верхушка айсберга, полтора десятка из сотен хороших корпоративных статей на Хабре. Чтобы отметить подобные статьи и их авторов, мы создали конкурс Corp Blog Awards. Подать заявку и поучаствовать в нём может любой из корпоблогов на сайте. Победителей ждут призы и вечная слава. Регистрация заканчивается 30 апреля, но ты, читатель этой статьи, можешь по промокоду LuckyFriday (его нужно ввести в любое поле при оформлении заявки) зарегистрировать свой блог на конкурсе до 11 мая. Мы с нетерпением ждём интересных и необычных статей!

Подробнее..

Recovery mode Хабру нужна большая красная кнопка

24.02.2021 18:11:35 | Автор: admin
В ответ на этот пост.

Я читаю Хабр. Пусть нерегулярно (банальная нехватка времени), но очень давно. И я считаю, что Хабру нужна большая красная кнопка со следующим текстом:

Нажав на меня и заплатив всего один доллар в месяц ты сможешь:
  1. Убрать из своей ленты все посты размещённые во всех корпоративных блогах и прочий низкопробный Яндекс.Дзен.
  2. Убрать из своей ленты весь мусор, все новости, вопросы и ответы, самое читаемое, минуточку внимания, заказы, карьера и остальной информационный хлам.
  3. Убрать КДПВ во всех постах под кат, чтобы не мешали читать ленту.

Я готов платить Хабру этот один доллар в месяц, готов платить даже десять. Сто не готов, не нужно наглеть. За сто проще будет нанять студента, который станет копипастить посты мне в Телеграм.
Подробнее..

Сказ про реальные собеседования и знатного клиента

20.05.2021 14:22:33 | Автор: admin

Верьте аль не верьте,

Сможете проверьте,

Байка эта круче саг!

Дело, значит, было так.

В дом к HRщице однажды

Постучался дядька важный

И заказ принёс тот некто:

Сбить команду для проекта.


А проект - без юр. лица

У лихого молодца,

Без внимания к нюансам

Без системы по финансам

По названию - намётки

Стек не выбран разработки

Но команду Вы ищите,

Офис будет в Москва-Сити!

ДМСа вовсе нет,

Не учтён и страх пакет,

Релокационку тоже

Предоставить мы не сможем

Да, З/П - чуть ниже рынка,

Но стартап у нас - новинка!

Потому все кандидаты

Быть труда должны фанаты:

Не курить, совсем не пить,

Внешне Брэдом Питтом быть.

Не сейчасошним, а юным,

Гибким, креативным, умным!


Выслушав HR всё это

Не смогла сдержать совета:

Предложила одного

В прОдакт взять и СиТиО.


Гость прислушался ко слогу,

А HR скорей в дорогу:

По морям, лесам скакать,

Кандидата чтоб сыскать.


СОБЕСЕДОВАНИЕ РАЗ

ТУТ НЕ В БРОВЬ, ДА И НЕ В ГЛАЗ

В резюме читалось чётко:

Опыт есть по разработке

Дел коммерческих а-ля

И команды сбор с нуля.

Но при собеседе в зуме

Было всё не столь разумно,

Кандидат на связь на эту

Вышел прямо с туалета.

Восседая на горшке,

Шторку теребил в руке.

Просьбам созвониться позже

Молвил он патом ни сможу

На вопрос о частой смене

Мест рабочих ел пельмени,

Ртом набитым отвечая,

Что виной судьбина злая.

Говорил он языкасто

Что на корпоратах часто

Много выпимшы буянил,

Громко пел и хулиганил.

Но при этом заявлял,

Что в труде он - идеал!

Просто темперамент пышный

В тех компаниях был лишним.

За последние полгода

В десяти местах работал.

Да уж, образец редчайший,

Что ж, спасибо, ищем дальше.

СОБЕСЕДОВАНИЕ ДВА

ТОЖЕ ТА ЕЩЁ БОТВА

Эта часть про тех, кто в крайность

Впал, уйдя в неординарность.

Сногсшибательный эффект

Произвёл второй объект:

Кандидат пришёл активный

Симпатичный, позитивный

Жизни выдал где-то треть

И сказал, что любит петь!

Не дождавшись интереса

В полный голос начал песню

О коллегах и работе,

О товарообороте

О делах своих сердечных

Да о ставках ипотечных.

Взяв в конце лихую ноту

Спел про то, как шпилил в Доту.

Занимательный мужчина

Но, похоже, тоже мимо:

Не Брэд Питт, но Лепс ярчайший!

Что ж, спасибо, ищем дальше.


СОБЕСЕДОВАНИЕ ТРИ

НЕ ВЕЗЁТ, ЧЁРТ ПОБЕРИ!

Третий кандидат цветущий

Всех уделал предыдущих

На вопрос о хобби выдал

Что он Бог ваще и идол,

Потому, средь увлечений

Вина, карты, без сомнений,

Ну, и взгляды самых страстных

Юных женщин распрекрасных.

Мотивацией к работе

Выходной назвал в субботу

И корпоративный праздник,

Где он завсегда участник.

Мда, повеса и распутник.

Гедонист, а не сотрудник.

Это точно не прокатит

Что ж, спасибо, дальше хватит.


От таких вот приключений

У HR всегда мигрени

Выход есть, но он не прост:

В соц. сетях калякать пост.

Написала, разместила,

Экспертизу получила

Откликом от кандидата

С опытом уже богатым.

Разложил он всё детально

Четко, профессионально

Что с заказчиком таким

Далеко не улетим.

Что с таким работать - ад

Всё не сделать наугад.

Нужно закрывать вопросы

Оформления и спроса,

Понимать финансы ясно,

Всё простроить сообразно

Ну а тут - одни слова,

И вакансия мертва.


Вывод сам собой назрел,

Что пора закрыть пробел.

В собеседах чтобы шпарить

Методику б надо справить

Для заказчиков различных

Разложить всё лаконично

И для кандидатов точки

Обозначить нужно точно.

Чтобы все, кто обратились

Понимать бы научились

Как в лицо смотреть друг другу

А не бегать так по кругу.

Репутацию не портить

А по делу слово молвить.

Быть HRом - труд не малый

Словно мост меж двух реалий.

Если это вдруг понять

Можно результатов ждать.

И тогда найдутся люди

Всё легко и просто будет

Для заказчиков успех,

И для кандидатов всех.


Верьте аль не верьте,

Сможете проверьте,

Но проблем тех больше нет,

Методичка вышла в свет!

Подробнее..

Как развивалось тестирование на ковид

31.05.2021 10:13:24 | Автор: admin

31 ноября 2019 Муниципальная комиссия здравоохранения Уханя передала информацию о вспышке новой вирусной инфекции. 3 января 2020 года власти КНР официально уведомили об этом ВОЗ, и уже 9 января в качестве этиологического фактора развития инфекции определен коронавирус нового типа.

11 января в КНР зарегистрирован первый летальный случай, связанный с ковид, а уже через неделю выявляются первые зараженные за пределами Китая - в Тайланде и США. 22 января власти Китая закрывают Ухань, вводятся жесткие карантинные мероприятия. 31 января обнаружен первый зараженный ковид в РФ, и через несколько дней фиксируется первая смерть от ковид за пределами КНР на Филиппинах.

11 февраля ВОЗ присваивает официальное наименование новому коронавирусу COVID-19, и через месяц объявляется пандемия. Центром пандемии ВОЗ определяет Европу, где в геометрической прогрессии нарастает число заболевших, но к концу марта США выходит на первое место в мире по количеству зараженных ковид. При этом Китай заявляет о том, что эпидемия внутри страны остановлена, в то время как в мире за два месяца число заболевших вырастает с 1 до 10 миллионов человек, и число умерших от ковид переваливает за 200 тысяч. Вместе с тем, опасения в связи с упадком экономик стран преобладают над боязнью пандемии, и летом 2020 года почти все страны снимают жесткие ограничения, введенные в марте-апреле, открывается авиа сообщение между государствами, что приводит к резкому росту числа зараженных в мире с 10 миллионов человек в конце мая до более чем 30 миллионов к концу сентября и 40 миллионов к середине октября 2020 года. При этом в мире фиксируется более 1 миллиона ковид-ассоциированных летальных случаев. Объявляется 2-я волна новой коронавирусной инфекции, продолжающаяся до настоящего времени страны вновь вводят ограничительные мероприятия разной степени строгости, частично приостанавливается авиа сообщение между государствами, где-то объявляют полные локдауны.

В течение всего описанного периода способы и регламенты выявления подозрения, подтверждения или не подтверждения новой коронавирусной инфекции претерпевали определенную эволюцию. Так, если в начале пандемии, ввиду отсутствия разработанных и разрешенных к применению тестов на ковид, основное значение имели клинические данные о пациенте и эпидемиологический анамнез, то на сегодняшний день существует определенное разнообразие диагностических лабораторных методик. Темпы развития лабораторной диагностики COVID-19 в течение последних полутора лет оказались беспрецедентными, и на первое место вышли молекулярно-генетические методы - золотой стандарт диагностики вирусных инфекций. Первые наборы для ПЦР отличались низкой чувствительностью не более 10^4 копий РНК возбудителя в образце, что снижало их диагностическую значимость и способствовало получению ложноотрицательных результатов. В последующем чувствительность наборов достигла оптимальных 10^3 копий на образец, в настоящее время существуют сверхчувствительные наборы - 10^2 копий.

Параллельно с появлением новых наборов для ПЦР велась разработка и внедрение методик экспресс-тестирования, направленных на выявление антигенов вируса SARS-CoV-2 участков оболочки патогена, способных вступать в реакцию с субстратом полоски экспресс-теста. Надежды на применение экспресс-тестов были связаны, прежде всего, с массовым скринингом, так как их использование не подразумевает ограничений, характерных для ПЦР-исследований (наличие специализированной полноценной лаборатории, укомплектованной оборудованием и персоналом, длительное, до 4-5 часов для ПЦР-тестов первого поколения, время выполнения анализа). Однако разработчикам пока не удалось достичь 100% чувствительности и специфичности экспрессов, в связи с чем, их применение по-прежнему ограничено определенными задачами пользователей. В то же время появляются новые наборы для ПЦР, основанные на так называемой изотермической амплификации, позволяющие сократить время анализа до 30 минут. Единственным недостатком этой методики является низкая пропускная способность оборудования, ограниченная 8 пробами в одной постановке, что исключает возможность применения на потоке. Тем не менее, изотермическая ПЦР с успехом применяется в аэропортах и на некоторых промышленных предприятиях.

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

Естественные мутации генома COVID-19 приводят к возникновению новых штаммов, вирулентность которых вызывает интерес. В связи с этим популярным становится генетическое тестирование (секвенирование), но это исследование недоступно для пациентов. На этом фоне разработчики наборов для ПЦР выпускают тест-системы, позволяющие дифференцировать, пока только, британский штамм.

На сегодняшний день (май 2021) количество зараженных COVID-19 в мире с начала пандемии составляет около 170 млн человек, всего зарегистрировано ковид-ассоциированных смертей более 3,5 млн, в настоящий момент болеют более 14 млн, суточный прирост вновь заразившихся составляет 284 656 человек. Вместе с тем активно продвигается прививочная компания, в некоторых странах (например, Израиль) процент лиц, получивших обе дозы вакцины, приближается к 60. С учетом числа переболевших формируется существенная иммунная прослойка, что способствует все возрастающему интересу к наборам реагентов, определяющим антитела к SARS-CoV-2. Появляются тест-системы, оценивающие количество выявляемых антител в мл исследуемого образца, это позволяет отследить их концентрацию в динамике, что особенно интересно после вакцинации.

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

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    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