...

суббота, 17 апреля 2021 г.

«Сбер» опроверг утечку данных 500 тыс. клиентов программы «СберПремьер»

16 апреля 2021 года, по информации РБК, «Сбер» опроверг утечку данных 500 тыс. клиентов программы «СберПремьер».

14 апреля на форуме в даркнете появилось объявление о продаже данных клиентов «СберПремьер» — специальной программы Сбербанка для обслуживания постоянных клиентов на привилегированных условиях. Продавец базы утвержал, в ней содержится 500 тыс. записей о клиентах, а эти данные недавно выгрузил сотрудник банка. Издание РБК проверило пробник 20 записей из этой базы. Там были такие данные о клиентах: ФИО, номер телефона, адрес электронной почты, номер счета без одной цифры, номер клиента по порядку в базе банка, номер отделения и подразделение «Сбера», где обслуживался клиент.
Быстрая проверка журналистами РБК с помощью перевода через «Сбербанк Онлайн» показала, что данные клиентов из пробника совпадают с реальными. Потом путем прозвона шесть клиентов из списка в пробнике подтвердили РБК достоверность своих ФИО и номера телефона, а один рассказал, что является клиентом программы «Сбербанк Премьер».

Представители «Сбера» пояснили РБК, что СБ банка проверила этот инцидент и «никакой утечки данных или банковской тайны из банка в данном случае не было». «Сбер» утверждает, что «данный семпл — это компиляция из данных, которые гуляют в сети интернет уже достаточно давно, и эти данные не содержат банковской тайны».

2 октября 2019 года Сбербанк рассказал об утечке данных клиентов. Банк признал, что пострадали не менее 200 клиентов, их карты были перевыпущены.

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

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

В феврале 2021 года Красногорский городской суд Московской области опубликовал на своем портале приговор сотруднику Сбербанка, который смог похитить персональные данные клиентов банка в 2019 году. В данном документе подробно описаны действия злоумышленника, а также показания свидетелей и представителей пострадавшей финансовой организации. Сотрудник смог скопировать из банка архив с выгрузкой данных по клиентам себе на рабочий ПК, а потом перенести его на домашний компьютер, размер файла выгрузки составил около 5,7 ГБ.

Let's block ads! (Why?)

Краткая история мамонтенка Димы

Однажды, в далёком 1977 году, июньским днём в верховьях реки Колымы на территории Магаданской области, не покладая рук и не жалея сил бравые товарищи с лопатами и не менее бравые сотоварищи рабочие бульдозеристы из старательской артели под звучным названием «Знамя», расчищали площадку для промывки золота во имя светлого, великого и прекрасного будущего советского коммунизма [1].

Работа на приисках всегда кипит.
Работа на приисках всегда кипит.

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

Странный зверь, которого чуть не скинули в отвал.
Странный зверь, которого чуть не скинули в отвал.

Подумывая спустить её в отвал, как делал с подобной животиной до этого, он набирался сил покинуть свой служебный транспорт. "Всё, что не мамонт – то падаль не интересная" — именно так думал данный гражданин в тот день [2]. Естественно, что падалью могла быть древняя лошадь, товарищу знать было не дано.Как говорится лошадь не мамонт не вымрет.

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

Кладбище мамонтов на Юннюгене уничтожаемое чёрными палеонтологами.
Кладбище мамонтов на Юннюгене уничтожаемое чёрными палеонтологами.

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

Так наш герой, которого к слову звали Анатолий Владимирович Логачев, наконец-то спустился из кабины своей машины и подошёл к тёмному силуэту мёртвого тела животного. Недолго думая, он потрогал это тело руками и почувствовал, что местами оно было покрыто мягкой шерстью, которая явно не принадлежала известным ему животным [2]. Поскольку было темно и разглядеть нормально находку Анатолий не смог, то он решил оставить тело неизвестного животного до утра и уехать на своём бульдозере прочь.

Бульдозерист Анатолий Владимирович изучает мамонтёнка Диму
Бульдозерист Анатолий Владимирович изучает мамонтёнка Диму

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

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

Николай Алексеевич Шило (07.04.1913— 08.06.2008)— российский советский геолог, директор Северо-Восточного комплексного научно-исследовательского института Дальневосточного научного центра АН СССР, академик АН СССР и РАН. Герой Социалистического Труда. 
Николай Алексеевич Шило (07.04.1913— 08.06.2008)— российский советский геолог, директор Северо-Восточного комплексного научно-исследовательского института Дальневосточного научного центра АН СССР, академик АН СССР и РАН. Герой Социалистического Труда. 

Первой на место обнаружения находки вылетела бригада из трех ученых — А. Ложкиной, Ю. Шумиловой, и Э. Титовой, и с помощью сил рабочих артели в течение недели они смогли окончательно освободить слонёнка из плена льда. После этого учёные перевезли его в холодильную камеру Магаданского института [1;2;3]. Мамонтёнка назвали незамысловато: Димой, в честь одноимённого ручья, впадающего в Киргиляхскую реку [4]. Потом были отобраны пробы из места захоронения животного с целью реконструкции мира,

в котором оно жило, хоть и не долго, да и само животное также изучалось [1]. Изучение места, которое послужило «усыпальной колыбелью» для бедного древнего детёныша хоботного, открыло миру интересные особенности захоронения. Так, оказалось, что место, где покоился Дима находилось в древнем галечнике, который толстым слоем покрывал скальное дно долины Киргилях. В долине не нашлось места речным отложениям, зато массивно и величественно лежал приблизительно семиметровый пласт сплошного неокатанного щебня с глинистым заполнителем.

1) Песок с галькой и щебнем 2) песок с галькой и щебнем, выполняющим пространство бывшего ледяного клина, 3) суглинки с галькой
1) Песок с галькой и щебнем 2) песок с галькой и щебнем, выполняющим пространство бывшего ледяного клина, 3) суглинки с галькой

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

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

Пример ледяной жилы. Обнаружена в высокой пойме в среднем течении р. Амгуэмы
Пример ледяной жилы. Обнаружена в высокой пойме в среднем течении р. Амгуэмы

Эти сели пронизывали всю грязевощебневую толщу, что означало, что они не могли расти в теплое и влажное время. Дальнейшие исследование местности в стороне от «колыбели» Димы подтвердили эти данные обнаружением погребенного во льдах леса, который учёные нашли в одном из раскопов [3]. Перед их взором, возникнув из многовековой тьмы, показались свежие, густо пахнущие смолой, пни и стволы лиственниц. От их стволов в целых пять ярусов отходили добавочные корни.

Так всегда борется лиственница с поднимающейся мерзлотой. Замерзнут нижние корни — она дает следующий ярус корней в новой накопившейся почве. Учёные сделали вывод, что за время жизни одних и тех же деревьев, почва накапливалась как минимум пять раз. А по количеству годовых колец на спилах деревьев лиственницам на момент смерти было всего по 120—150 лет. Данная находка показывала, что осадки накапливались с чудовищной скоростью и в конечном итоге не позволили деревьям выжить. Их, как и Диму, надежно сберегла вечная мерзлота и их так же, как и его, засыпало грязью и щебнем [3].

Ещё одно архивное фото с мамонтёнком.
Ещё одно архивное фото с мамонтёнком.

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

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

Во времена последнего ледникового периода, но не последнего в современной ледниковой эре [6], Северный Ледовитый океан был покрыт сплошными льдами, а влажный воздух не поступал в районы, где обитали мамонты. Поэтому в регионе, где обнаружили мамонтёнка, как и всюду на Севере, было сухо.

Не тундра, а бескрайние высокотравные степи простирались в Арктике [2]. И шли сюда с низовьев Колымы, помимо стад бурых мохнатых мамонтов, и дикие горбоносые лошадки, а также и мощные сибирские бизоны, чьи кости теперь находят в вечномерзлой колымской земле.

Маленький мамонтёнок отстающий от своих больших родичей.
Маленький мамонтёнок отстающий от своих больших родичей.

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

Об слабости мамонтёнка свидетельствует и его полный прямой кишечник и сморщенный желудок [2]. По-видимому, мамонтенок некоторое время перед смертью не ел, зато до этого ел вволю, что собственно является характерным признаком для больных животных. Дальнейшие исследования тела мамонтёнка показали, что у него была также ранена нога. Предполагается, что незадолго до своей гибели мамонтёнок поранил ногу и отстал от остального стада, хромая и страдая от сильного заражения паразитическими червями [7]. Он мог свалиться в яму-мочажину, которая в результате селевых потоков позже быстро наполнялась водой и грязью [1], или он мог сначала умереть от голода [7], а уже потом провалиться в яму и быть в последствии заметённым слоем грунта и дёрна, сползающего по склону [1].

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

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

Степень сохранности туши оценивается как почти 100 %. Значит, смерть Димы происходила в эпохе очень сухого климата, с сухим и жарким летом и сухой морозной зимой [2]. Прижизненную массу тела мамонтёнка оценили в 100кг, отталкиваясь от роста мамонтёнка, который в холке равнялся приблизительно в метр высоту [1]. Его возраст на момент смерти оценивается в 6—7 месяцев. Сама смерть случилась по разным оценкам от 13 до 40 тысяч лет назад [1]. Кожа, внутренности и мягкие ткани мамонта прекрасно сохранились. Мягкие ткани и органы были извлечены. Шерсть также сохранилась, а при дальнейшем бальзамировании, можно сказать, пропала полностью, при этом и цвет мамонтёнка стал очень чёрным [1].

Фотография Димы сделанная в Зоологическом музее города Санкт-Петербурга.
Фотография Димы сделанная в Зоологическом музее города Санкт-Петербурга.

Таким образом, Дима после изучения СВКНИИ и консервации наконец-то обрёл покой. Его отправили самолетом в Ленинград и сейчас этого мамонтёнка Вы можете увидеть в Зоологическом Музее при Зоологическом Институте РАН в городе Санкт-Петербурге.

Данная статья была написана мной и опубликована в научно-популярном сообществе Фанерозой.

Источники
  1. https://planetguide.ru/academy/entry/994…

  2. Техника - молодёжи 1977-11, страница 12

  3. Техника - молодёжи 1977-11, страница 67

  4. Тихонов А. Н. Мамонт — (Серия «Разнообразие животных». Вып. 3) — М.—СПб.: Т-во научных изданий КМК, 2005.

  5. https://tomsk.mk.ru/science/2019/11/19/t…

  6. Ледниковый период / В. М. Котляков // Большая российская энциклопедия: [в 35 т.] / гл. ред. Ю. С. Осипов. — М.: Большая российская энциклопедия, 2004—2017.

  7. ПРИРОДА • №11 • 2009 стр. 3

Let's block ads! (Why?)

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

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

Потому занялся дополнительным поиском готовых реализаций, но к сожалению не смотря на обилие упоминаний идеи 1974 года[2], реализаций алгоритма, даже на законодателе моды в вычислительной математике Фортране я не обнаружил. В семинарах и лекциях да и в диссертациях описание не блистало целостностью, потому собрав с десяток статей и обсуждений в кучу появилось желание написать статью для тех кто простейшую реализацию поиска подстроки хочет "подержать в руках".

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

Собственно в чем ценность идеи: использование дискретного Фурье преобразования (DFT) сокращает сложность вычисления от "наивного" O(n*m) до O(n Log(n)), где n - размер текста а m - размер искомого образца. Более того расширения метода позволяют производить поиск с "Джокером", - символом обозначающим любой другой символ в алфавите, в то время как суффиксные реализации это сделать не позволяют.

Описание "наивного" подхода:

Для массива T размером n и образца P размером m, вычислим функцию квадратов разницы значений элементов. Нумерация в массиве начинается с нуля.

S_i^F = \sum\nolimits_{j = 0}^{m - 1} {({t_{i + j}}} - {p_j}{)^2} = \sum\nolimits_{j = 0}^{m - 1} {t_{i + j}^2} - 2\sum\nolimits_{j = 0}^{m - 1} } {p_j} + \sum\nolimits_{j = 0}^{m - 1} {p_j^2} = T{T_i} - 2P{T_i} +P{P_i}

Очевидно что в точке соответствия искомая сумма показывает минимум, если точнее обнуляется. После раскрытия квадрата под суммой получаются три слагаемых, последнее из которых имеет постоянное значение. Соответственно для поиска минимума необходимо вычислить только первые две суммы. Можно увидеть что прямое вычисление всех элементов S требует O((n-m+1)*m) операций, или оценочно O(n*m).

В качестве массива в котором будем искать образец используем строчку из картинки:

"Test.png"
"Test.png"

Произведем прямое вычисление искомой функции:

{S_i} = \sum\nolimits_{j = 0}^{m - 1} {t_{i + j}^2} - 2\sum\nolimits_{j = 0}^{m - 1} } {p_j} = T{T_i} - 2P{T_i}
Img = ColorConvert[Import["Test.png"], "Grayscale"];
{W, H} = ImageDimensions[Img];   

y = IntegerPart[H/2];                                (*Pattern width and coordinates*)
x = IntegerPart[W/4]; 
w = IntegerPart[W/8];            

L = Part[ImageData[ImageTake[Img, {y, y}]],1];       (*Stripe Array*)

T[i_] := Table[Part[L[[i + j - 1]], 1], {j, 1, w}] ;      (*Sample data*)
P[i_] := Table[Part[L[[j + x - 1]], 1], {j, 1, w}] ;      (*Pattern data*)

TT = Table[Sum[(T[i][[j]]* T[i][[j]]), {j, 1, w}], {i, 1, W - w + 1}];
PT = Table[Sum[(P[i][[j]]* T[i][[j]]), {j, 1, w}], {i, 1, W - w + 1}];

ListPlot[TT - 2 PT, Joined -> True, PlotRange -> All]
Результат вычисления квадрата разницы без постоянного слагаемого
Результат вычисления квадрата разницы без постоянного слагаемого

Как видно в точке (x=175), где был взят образец, функция показала минимальное значение и повторила его значение ведь изображение почти дублируется.

Свойства дискретного Фурье преобразования.

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

Вычисление PT

PolyT = {1, 2, 3, 4, 5};               LT = Length[PolyT];
PolyP = {1, 2, 3};                     LP = Length[PolyP];
PolyR = {};                            LR = LT + LP - 1;

eT = Table[If[i > LT, 0, PolyT[[i]]], {i, 1, LR}]
eP = Table[If[i > LP, 0, PolyP[[i]]], {i, 1, LR}]

PolyR = InverseFourier[
   Fourier[eT, FourierParameters -> {1, 1}]*
   Fourier[eP, FourierParameters -> {1, 1}]
  , FourierParameters -> {1, 1}]
PolyR[[LP ;; LT]]

результат действия такого кода:

{1, 2, 3, 4, 5, 0, 0}                                            (* PolyT *)
{1, 2, 3, 0, 0, 0, 0}                                           (* PolyP *)
{1., 4., 10., 16., 22., 22., 15.} (* PolyR = PolyT * PolyP *)
{10., 16., 22.}                   (* PolyR starting at LP to LT*)       

Итак, если массив значений представить полиномами, то получаемое значение тоже полином размером n+m-1.

\left( {1 + 2x + 3{x^2} + 4{x^3} + 5{x^4}} \right)\left( {1 + 2x + 3{x^2}} \right) = 1 + 4x + 10{x^2} + 16{x^3} + 22{x^4} + 22{x^5} + 15{x^6}

Более того, начиная с позиции m (если нумерация начинается с единицы) мы получаем сумму перекрестного произведения элементов для окна длинны m:

10 = 1*3+2*2+3*1
16 = 2*3+3*2+4*1
...

Потому для вычисления элементов PT искомый образец P разворачивается. Всего получается n-m+1 значений.

Вычисление TT

PolyT = {1, 2, 3, 4, 5};            LT = Length[PolyT];
PolyP = {1, 1, 1};                  LP = Length[PolyP];
PolyR = {};                         LR = LT + LP - 1;

eT = Table[If[i > LT, 0, PolyT[[i]]], {i, 1, LR}]
eP = Table[If[i > LP, 0, PolyP[[i]]], {i, 1, LR}]

PolyR = InverseFourier[
   Fourier[eT, FourierParameters -> {1, 1}]*
   Fourier[eP, FourierParameters -> {1, 1}]
  , FourierParameters -> {1, 1}]
PolyR[[LP ;; LT]]

результат действия кода:

{1, 2, 3, 4, 5, 0, 0}                 (* PolyT *)
{1, 1, 1, 0, 0, 0, 0}                 (* PolyP *)
{1., 3., 6., 9., 12., 9., 5.}         (* PolyR = PolyT * PolyP *)
{6., 9., 12.}                         (* PolyR starting at LP to LT*)   
6 = 1*1+2*1+3*1
9 = 2*1+3*1+4*1
...

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

Сборка и сравнение

Вычисление PP и TT с использованием DFT:

Tt = Table[If[1 <= i <= W, Part[L[[i]], 1], 0], {i, 1, Wt}] ;    (*Sample data*)
Ft = Fourier[Tt, FourierParameters -> {1, 1}];

Ts = Table[If[1 <= i <= W, (Part[L[[i]], 1])^2, 0], {i, 1, Wt}]; (*Sample squared data*)
Fs = Fourier[Ts, FourierParameters -> {1, 1}];

Es = Table[If[1 <= i <= w, 1, 0], {i, 1, Wt}] ;                  (*m size unit array*)
Fe = Fourier[Es, FourierParameters -> {1, 1}];

Pa = Table[If[1 <= i <= w, Part[L[[x + w - i]], 1], 0], {i, 1, Wt}];                                                             \
Fp = Fourier[Pa, FourierParameters -> {1, 1}];                   (*Inverse pattern data*)

TTf = InverseFourier[Fs*Fe, FourierParameters -> {1, 1}][[w ;; W]];
PTf = InverseFourier[Ft*Fp, FourierParameters -> {1, 1}][[w ;; W]];

Сравниваем полученные значения:

ListPlot[{TT - 2 PT, TTf - 2 PTf, TT - 2 PT - TTf + 2 PTf}, Joined -> True, PlotRange -> All]
Три графика, два совпадающих и один показывающий разницу между ними, совпадает с осью.
Три графика, два совпадающих и один показывающий разницу между ними, совпадает с осью.

Выводы

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

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

  1. https://habr.com/ru/post/266129/

  2. https://eduardgorbunov.github.io/assets/files/amc_778_seminar_08.pdf

Let's block ads! (Why?)

[Перевод] Если вы пишете код в Windows, вы заслуживаете лучшего терминала

Я хочу сделать признание. Когда дело доходит до моего компьютера, я оставляю все в значительной степени сыром виде. Конечно, у меня есть любимые маленькие инструменты. Я использую плагины Chrome, такие как Wappalyzer, и множество расширений VS Code, таких как Chrome Debugger и Live Server. Но я сознательно не использую темы, шрифты, средства форматирования и другие приятные для глаз настройки. В далеком прошлом, когда я только начинал программировать, я тратил слишком много времени на перестройку своей индивидуальной настройки на разных компьютерах и на новом оборудовании. Постоянные настройки устарели, поэтому я решил по возможности сократить до стокового.

Это мое оправдание, почему я провел много месяцев, по большей части игнорируя продукт Microsoft Windows Terminal. В конце концов, время, которое я провожу в командной строке, ограничено и ничем не примечательно. Я настраиваю свое приложение, устанавливаю пакеты npm или Nuget и двигаюсь дальше. Проводить время в окне терминала означает заходить в темный угол операционной системы и делать то, что нужно.

Но теперь я вынужден признать, что был неправ. Или, по крайней мере, есть еще один инструмент, для которого мне нужно освободить место. Поскольку Windows Terminal не просто заменяет скрипучую часть программного обеспечения ОС с кодовой базой 30-летней давности, он также добавляет некоторые действительно практичные функции.

«Кодовой базе Windows Console 30 лет… на самом деле она старше, чем разработчики, которые сейчас над ней работают». - Рич Тернер, менеджер по Microsoft

Терминал открыт

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

Терминал - это часть программного обеспечения, которое обрабатывает текстовый ввод и отображение. Вы вводите текст в командной строке терминала. Вы смотрите в окно терминала. Но за кулисами ваш терминал взаимодействует с программой оболочки, которая действительно выполняет эту работу. В современной Windows стандартная программа терминала - ConHost.exe, и, черт возьми, она старая.

Вы думаете, что запускаете PowerShell, но на самом деле вы запускаете интерфейс ConHost, который взаимодействует с PowerShell.

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

Вместо этого Microsoft начала создавать новый терминал под названием Windows Terminal. Он существует уже почти год, но еще не дошел до включения в ОС Windows. Это означает, что если вам нужен Терминал Windows, вы должны установить его из Windows Store. (Или вы можете загрузить его с GitHub и собрать самостоятельно, потому что новый терминал, естественно, имеет открытый исходный код.)

Почему терминал Windows?

Из-за того, как работают терминалы, в них не так много очевидного волшебства. Фактически, «выполнение работы» выполняется любой программой оболочки, которую вы используете. Но оказывается, что новый терминал Windows содержит множество практических удобств, которые могут сделать вас более продуктивным (или, по крайней мере, менее раздражающим) при выполнении повседневной работы. Вот несколько причин полюбить Windows Terminal:

  • Несколько вкладок. Помните, когда в веб-браузерах была только одна вкладка? Как мы это ненавидели! Но мы терпели это в ConHost уже целое поколение. К счастью, Windows Terminal позволяет открывать столько вкладок, сколько нужно в одном окне.

    Иногда мелочи - это большие дела
    Иногда мелочи - это большие дела
  • Несколько панелей. Это похоже на несколько вкладок, но вы можете видеть разные экземпляры терминала в аккуратном порядке бок о бок или сверху и снизу. И вы управляете всем этим с помощью удобных нажатий клавиш. Удерживая Alt + Shift, нажмите +, чтобы открыть новую панель справа, или -, чтобы открыть новую панель внизу. Затем вы можете переходить с панели на панель, удерживая Alt и нажимая клавиши со стрелками. Круто!

  • Одновременное использование нескольких оболочек. Терминал Windows поддерживает любую стандартную программу оболочки. Вы можете использовать старую добрую PowerShell, почти устаревшую командную строку, Azure Cloud Shell (для управления онлайн-ресурсами Azure) и даже bash, если вы включили Windows Linux Subsystem. И вы можете запускать их все рядом, на разных вкладках или панелях одного и того же окна Терминала Windows.

    Оболочки сошли с ума
    Оболочки сошли с ума
  • Масштабирование, которое работает. Мое любимое сочетание клавиш масштабирования - удерживать Ctrl и вращать колесико мыши. Это работает и в ConHost, но при этом неудобно изменяет размер окна. Терминал Windows масштабирует более разумно, и он распознает удобное сочетание клавиш Ctrl + 0, чтобы вернуть все в нормальное состояние. И не повредит, что Windows Terminal поставляется с новым элегантным шрифтом Cascadia Code, который отлично смотрится при любом размере.

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

  • Изобилие настроек. Все они управляются через немного непонятный файл настроек JSON. Освойте его, чтобы управлять внешним видом окна терминала (размером, цветами, настройкой «всегда поверх») и добавьте свои собственные сочетания клавиш.

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

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

  • Настраиваемая прозрачность с размытием фона. Вы даже можете настроить его на лету, удерживая Ctrl + Shift и вращая кнопку мыши. Но зачем?

  • Цветовые схемы и пользовательские фоновые изображения.

  • Анимированные фоны в формате GIF. (Привет, Windows Plus примерно из 1998 года.)

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

Краткое примечание о терминале VS Code

Если вы используете Visual Studio Code, вы, вероятно, знакомы с его интегрированным терминалом. Вы можете выбрать, какую оболочку использовать (например, PowerShell или bash), но вы всегда используете терминал VS Code, а не ConHost.

Тем не менее, терминал VS Code довольно прост. Терминал Windows не может заменить встроенный терминал. Однако вы можете настроить Windows Terminal так, чтобы он работал как внешний терминал для VS Code. Таким образом, когда вы запускаете терминал из VS Code, вы откроете отдельное окно Windows Terminal, что даст вам больше места для передышки и современные функции, которые вам действительно нужны.

Последнее слово

Терминал Windows неуклонно продвигается к версии 2.0, которая ожидается этой весной, и в конечном итоге включение в Windows. Планируется длинный список новых функций, включая возможность отрывать вкладки и перемещать их из одного окна терминала. к другому, бесконечная прокрутка и приятный пользовательский интерфейс для управления настройками. Будет ли он вызывать безумную любовь, как VS Code или язык C #? Нет. Но иногда достаточно сделать жизнь менее болезненной.

Скачать Windows Terminal можно здесь.

Let's block ads! (Why?)

[Перевод] Кеширование гемов Ruby в GitHub Actions с использованием ruby/setup-ruby или actions/cache

Как, загружая гемы Ruby из кеша в GitHub Actions, ускорить запуск сборки проекта в этой системе непрерывной интеграции (CI)? Если суметь подготовить к работе все зависимости Ruby on Rails (RoR)-проекта в кратчайшие сроки, это позволит сократить время, необходимое на запуск тестов для такого проекта. Тут-то нам и пригодится кеширование. Гемы Ruby, нужные в проекте, можно кешировать средствами GitHub Actions, благодаря чему их, при запуске CI-конвейера, можно будет загрузить гораздо быстрее, чем прежде. Существует два способа кеширования гемов Ruby, применимых при использовании CI GitHub Actions. Один из них предусматривает применение ruby/setup-ruby, а второй — actions/cache.
  • actions/cache — это популярное решение для кеширования гемов Ruby.
  • ruby/setup-ruby — это решение, направленное на установку конкретной версии Ruby и на кеширование гемов Ruby с помощью бандлера. Фактически, речь идёт о двух возможностях одного «экшена» (того, что в терминологии GitHub Actions называется «action»).


Actions/cache — кеширование зависимостей и больше ничего


Actions/cache — это популярное решение, которое может быть использовано для размещения данных в кеше и для их извлечения из кеша при очередном запуске процесса сборки проекта в CI-системе. Часто этот экшен используют для RoR-проектов, в которых, кроме того, для управления версиями Ruby в GitHub Actions, используется экшн actions/setup-ruby.

Рассмотрим пример конфигурационного файла для организации кеширования в GitHub Actions, в котором используется actions/cache:

# .github/workflows/main.yml
name: Main
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - uses: actions/cache@v2
        with:
          path: vendor/bundle
          key: $-gems-$
          restore-keys: |
            $-gems-

      - name: Bundle install
        env:
          RAILS_ENV: test
        run: |
          bundle config path vendor/bundle
          bundle install --jobs 4 --retry 3

Разберём основные особенности этого файла:
  • Нужно указать путь к директории, которую требуется кешировать. В нашем случае это — vendor/bundle.
  • Кроме того, тут мы генерируем уникальный ключ (key) кеша, применяя при этом сведения о версии операционной системы и о файле Gemfile.lock. Изменение версии операционной системы или установка нового гема, из-за чего изменяется Gemfile.lock, приводит к генерированию нового значения key.
  • Далее, надо настроить бандлер так, чтобы он устанавливал бы все наши гемы Ruby в директорию vendor/bundle.
  • Тут можно использовать следующие параметры бандлера:

Если вам интересно взглянуть на полные YAML-файлы с настройками GitHub Actions для Rail-проектов — вот, вот, вот и вот — несколько наших статей на эту тему.

Ruby/setup-ruby — установка Ruby и кеширование гемов


Выше мы упоминали о том, что в RoR-проектах часто используется actions/setup-ruby. Но экшен actions/setup-ruby был объявлен устаревшим. Вместо него в наши дни рекомендуется пользоваться экшеном ruby/setup-ruby. В нём, помимо прочих возможностей, имеется и возможность кеширования данных. Вот как выглядит конфигурационный файл, рассчитанный на использование ruby/setup-ruby:
# .github/workflows/main.yml
name: Main
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2

    - uses: ruby/setup-ruby@v1
      with:
        # Не нужно при наличии файла.ruby-version
        ruby-version: 2.7
        # запускает 'bundle install' и автоматически кеширует установленные гемы
        bundler-cache: true

    # запуск RSpec-тестов
    - run: bundle exec rspec

Как видите, этот вариант организации кеширования гемов проще того, что мы описали в предыдущем разделе. И тут, кроме того, в нашем распоряжении оказывается система управления версиями Ruby. В сущности, если говорить о кешировании гемов, всё сводится к добавлению в конфигурационный файл строчки bundler-cache: true.

А вот что можно узнать, обратившись к документации по ruby/setup-ruby:

Можно, кроме того, кешировать гемы вручную, но поступать так не рекомендуется. При таком подходе, во-первых, увеличиваются объёмы конфигурационных файлов, а во-вторых — вручную очень сложно настроить кеширование правильно. В расчёт нужно принять много всего, а это значит, что actions/cache никогда не бывает достаточно для кеширования гемов (например — речь идёт о неполных ключах кеша, об удалении старых гемов при восстановлении данных с использованием ключа, отличающегося от текущего, о корректном хешировании .lock-файлов, сведения об изменениях которых не внесены в систему контроля версий, об учёте версии ОС, о принятии во внимание вопросов ABI-совместимости для ruby-head и так далее). Поэтому, пожалуйста, вместо ручной настройки кеширования, пользуйтесь опцией bundler-cache: true…

Итоги


Мы рассмотрели два способа кеширования гемов Ruby в CI GitHub Actions. Надеемся, что тот, кто нуждается в ускорении сборки Ruby-проектов, нашёл здесь пищу для размышлений. Но, конечно, есть и другие способы ускорения CI-конвейеров, например — параллельное выполнение тестов.

Пользуетесь ли вы GitHub Actions?

Let's block ads! (Why?)

Встроенная поддержка FTP будет удалена в Firefox 90

Mozilla объявила о планах удалить встроенную поддержку FTP из браузера с релизом Firefox 90.

Поддержка в настоящее время уже отключена на каналах Nightly и Beta, а в стабильной версии будет отключена 19 апреля 2021 года с выходом Firefox 88. Полностью поддержка будет удалена в Firefox 90. После отключения FTP Firefox будет делегировать открытие ссылок ftp://на внешние приложения так же, как это происходит с другими протоколами.

После прекращения поддержки настройка browserSettings.ftpProtocolEnabledперейдет в режим «только чтения».

Расширения и дальше смогут без ошибок передавать запросы «ftp» при использовании фильтров для proxy или webRequest, но эти API больше не будут обрабатывать запросы таких типов.

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

Код, отвечающий за поддержку FTP, еще полностью не удален в Firefox 88, и поддержку можно временно вернуть до выхода Firefox 90, когда она будет полностью удалена из браузера.

  • Откройте about:config

  • Установите network.ftp.enabled на true

Let's block ads! (Why?)

Оптические иллюзии: Стрелочка, которая всегда права

image

Kokichi Sugihara — японский математик и художник, мастер по созданию трехмерных оптических иллюзий. Постоянный победитель во всемирном конкурсе оптических иллюзий: первое место — в 2010, 2013, 2018 и 2020 году, второе место — в 2015 и 2016 году.

Его интерес к иллюзиям проистекает из его исследований в 1980-х годах по автоматизации анализа рисования перспективы, которые он опубликовал в книге MIT Press 1986 года «Machine Interpretation of Line Drawings». Когда он попросил свою компьютерную систему интерпретировать невозможные объекты, такие как в картинах Эшера, он обнаружил, что они могут быть интерпретированы как рисунки реальных объектов неожиданной формы.

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

Под катом — самые интересные работы Kokichi Sugihara, его лейкции и файлы для распечатывания на 3д-принтере невозможных объектов.
image

«Impossible Motion: Magnet Slopes», 2010


«Rotation Generated by Translation», 2013


«Ambiguous Garage Roof», 2015


«Ambiguous Cylinder Illusion», 2016


Topology-Disturbing Objects, 2016


«Triply Ambiguous Object», 2018


Ambiguous Tiling, 2020


3D Schröder Staircase


Ролик с интервью и примерами работ Kokichi Sugihara

(они построили гигантсукую невозможную снежную горку!)

Лекции и обучающие видео Kokichi Sugihara


Канал Kokichi Sugihara

Лекция про «всегда правая стрелочку»:

Фамильное дерево невозможных объектов:

Лекция про «трижды двусмысленный объект»:

Лекция про «невозможное движение»:

Лекция про «невидимую курицу»:

Лекция про «невозможные тени»:

Эволюция невозможных объектов:

Файлы для распечатывания


image

Large model (120width, 80depth, 54height), Small model (60width, 40depth, 27height)

image

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

image

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

image

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

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

Читать еще




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

Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

Let's block ads! (Why?)

Шведский аккумулятор из углеродных волокон произведет революцию в дизайне автомобилей


К концу января 2021 года количество электроавтомобилей в России превысило отметку в 10 тысяч единиц, представленных 18 моделями 14 различных марок. При этом еще в январе 2020 года их количество не превышало 6 тысяч. Несмотря на значительный прирост, Россия еще не входит в топ-25 стран-лидеров по объему продаж электромобилей. Что обусловлено в первую очередь отсутствием на территории России официального представительства крупнейших производителей электрокаров и мировых брендов электромобилей. Также в России слабая мотивационная база, предоставляемая покупателям электромобилей. Поэтому автовладельцы все еще склоняются в пользу приобретения автомобиля с ДВС.

В правительстве уже принимаются меры для того, чтобы автовладельцы пересели на «электрички». Пакет мер для Федерального закона об экологичном транспорте разрабатывается уже несколько лет, при этом, по разным оценкам экспертов, будет принят не ранее 2023 года. Тогда как во многих странах Европейского Союза (ЕС) уже несколько лет существует ряд льгот и преференций для владельцев электрокаров. Но водителей отпугивает не только цена на электромобили, но и страх перед разряженной батареей за сотни, а иногда и тысячи километров от крупного города, в котором еще должна быть заветная зарядная станция, тем более в зимнее время при температурах в ряде регионов 30–40 градусов ниже нуля.

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

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


Батарея из углеродного волокна в виде крышки багажника

Задача


Главный технический директор Volvo Хенрик Грин говорит: «Как наиболее эффективно интегрировать аккумуляторную батарею в автомобиль? Ну, если вы делаете это традиционным способом, вы помещаете батарею в модуль; затем вы помещаете несколько модулей в коробку. Потом вы помещаете коробку в автомобиль, и тогда у вас есть стандартизированное решение, которое можно масштабировать в течение 10 лет.

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

.

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


Демонстрация тестовых батарей из углеродного волокна

Что это и с чем едят?


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

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


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

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


Тесты


Исследователи протестировали различные типы стекловолокна, в результате чего были получены элементы с номинальным напряжением 2,8 В, и достигли лучших результатов с точки зрения производительности батареи с более тонким полотняным переплетением. Элементы, использующие эту конструкцию, имели удельную емкость 8,55 Ач/кг, плотность энергии 23,6 Втч/кг (при 0,05°C), удельную мощность 9,56 Вт/кг (при 3°C) и толщину 0,27 мм. Для сравнения, это 4680 ячеек, которые Тесла помещает в свои машины, чтобы иметь плотность энергии 380 Втч/кг. Однако этот показатель плотности энергии для цилиндрических ячеек не включает массу структурной матрицы, которая их окружает (при использовании в качестве структурных панелей).
image

Батарея из углеродного волокна от Tesla

Что касается структурных нагрузок, то наибольшая жесткость была также достигнута при использовании простого стекловолоконного переплетения — 25,5 ГПа. Это примерно похоже на пластик, армированный стекловолокном, тогда как пластик, армированный углеродным волокном, даст результат в 10 раз больше, в зависимости от того, сделан трансферным формованием или является ткаными листами, предварительно пропитанные смолой (известные как pre-preg).

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


Перспективы


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

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



На правах рекламы


Наши эпичные серверы — это как Tesla в автомобилестроении. Используем новейшие процессоры от AMD, исключительно быстрые NVMe накопители от Intel и никогда не экономим на железе — только брендовое оборудование и самые современные решения на рынке!

Let's block ads! (Why?)

[Перевод] Как мой простой проект в Github стал вирусным

В прошлом месяце я создал простой проект, разошедшийся по различным техническим сообществам и социальным сетям. В Github он за 7 дней получил с 0 до 4 тысяч звёзд и более 200 форков. Github примерно в течение пяти дней рекламировал его в разделе Trending repositories of day.

Clone Wars

70 с лишним open-source-клонов или альтернатив популярных сайтов наподобие Airbnb, Amazon, Instagram, Netflix, Tiktok и т.д. В списке содержится исходный код, ссылки на демо, технологический стек и количество звёзд в GitHub.

Ссылка на проект: https://gourav.io/clone-wars

Ссылка на Github: https://github.com/gorvgoyl/clone-wars


Trending в Github — 13 марта 2021 года

Что меня мотивировало на создание этого проекта


Я технарь и часто сижу в популярных сообществах программистов на Reddit, таких как r/webdev, r/reactjs и т.п., следя за тем, что создают другие разработчики и узнавая о новых JS-фреймворках. Я заметил, что многие разработчики для изучения программирования создают клоны популярных сайтов наподобие Instagram, Trello, Spotify, и т.п., а потом делятся с другими, чтобы получить отзывы о качестве кода и рекомендации.

Разработчики делятся своими проектами в r/reactjs

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

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


1. Скрейпинг Reddit


Я хотел найти все посты, содержащие ключевое слово «clone». Сначала я пользовался стандартным поиском Reddit: reddit.com/r/reactjs/search/?q=clone&source=recent&restrict_sr=1&sort=new (это значит искать все посты в сабреддите reactjs с ключевым словом «clone» и отсортировать по новизне). Этот запрос возвращал все посты, в том числе и низкокачественные, с рейтингом 0, вопросами о том, как создать клон какого-то сервиса, и т.д. Из этого дампа сложно было бы найти хорошие проекты клонов. Поэтому я воспользовался сайтом redditsearch.io, предоставляющим расширенные возможности фильтрации Reddit, например, возврат постов, имеющих хотя бы 10 «лайков», опубликованных в определённый промежуток времени, и т.д.

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

Также я загуглил запрос «open-source alternatives» и нашёл несколько полнофункциональных клонов Slack, Airtable, Bit.ly, Evernote, Google analytics, и т.п. Их я тоже добавил в список.

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

Придумываем название проекту


Я назвал свой проект в честь телевизионного мультсериала 2008 года Star Wars: The Clone Wars («Звёздные войны: Войны клонов») и сохранил похожую цветовую схему.

Мультсериал Star Wars: The Clone Wars

Github-проект Clone Wars

2. Красивое отображение таблицы


Я уже работал с markdown раньше, но мне впервые довелось создавать markdown-таблицы и оказалось, что таблица на странице проекта Github выглядит ужасно. Особенно если это длинная таблица с множеством столбцов. Я хотел сделать её красивее (с постоянно висящим сверху заголовком), то есть проект нужно было развернуть где-то ещё. Но он всё равно должен был находиться на Github, чтобы с ним могли удобно работать другие люди. Я решил хостить его на своём личном сайте https://gourav.io.

Мой сайт создан с помощью NextJS, и я уже использовал markdown (mdx) для написания постов, поэтому достаточно было просто скопипастить markdown-файл из моего Github-проекта на новую страницу https://gourav.io/clone-wars. Кроме того, я использовал Tailwind CSS с плагином «typography», повышающим удобство чтения таблиц и другого текста.

Я думал над повышением автоматизации до следующего уровня, например, при внесении изменения в Github-проект или слиянии пулл-реквестов (PR) можно было бы обновлять таблицу на моём сайте https://gourav.io/clone-wars. Но я решил не переусложнять систему, потому что изменения были не такими уж частыми.

Делаем проект виральным


Я опубликовал пост в 2-3 сабреддита, и он взлетел.

reddit.com/r/reactjs

reddit.com/r/webdev

Последствия


После того, как проект получил определённую популярность, многие разработчики начали использовать PR для добавления в список своих проектов-клонов. Когда я запустил проект, там было примерно 75 клонов, но теперь их больше 120, и я часто получаю новые PR.

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

Люди начали писать твиты о Clone Wars. @nickbulljs предложил идею для разработчиков, ищущих работу.


Рекрутёры устали от погодных приложений и калькуляторов расходов.

Вот более умная идея для разработки:

1. Выберите один сайт из 70 с лишним open-source-клонов популярных сайтов типа Netflix, Instagram и прочих по ссылке ниже.
2. Изучите кодовую базу.
3. Создайте собственный клон.

gourav.io/clone-wars

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

А ещё один человек задонатил мне 5 долларов по ссылке BuyMeACoffee, которую я добавил в своей проект. Спасибо тебе, незнакомец.

За 30 дней после запуска проекта мой личный сайт посетило более 40 тысяч человек, а проект получил более 80 тысяч просмотров.

Вот часть статистики по пользователям (первые 30 дней после запуска, т.е. после поста в Reddit):


Реферальные сайты

Пользователи по странам

Пользователи по ОС

Пользователи по браузерам

На данный момент проект имеет GitHub repo stars и GitHub forks.



На правах рекламы


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

Let's block ads! (Why?)