Гарантированным признаком «энтерпрайзности» продукта является поддержка FTP. Этот мерзейший протокол там никогда не умрёт, наверное.
Слово «легаси» изначально никакой негативной коннотации не несёт. Просто почему-то стали называть старый говнокод словом «легаси» и понеслось.
Отличный текст в коммерсанте, как работает госуправление в РФ:
https://www.kommersant.ru/doc/4241879
Это отличный пример системы, которая работает по «контрольным показателям».
https://www.kommersant.ru/doc/4241879
Это отличный пример системы, которая работает по «контрольным показателям».
Коммерсантъ
Кто сшил костюм
Что стоит за призывами к усилению персональной ответственности управленцев и чиновников разного уровня?
Изотов_жизнь_и_творчество_генерального.pdf
41.6 MB
Очень рекомендую вот эту книгу, это биография С.П. Изотова, генерального конструктора двигателей (авиационных в том числе). В ней очень много подробностей, как именно был организован процесс в ОКБ Климова, как проходило внедрение продукции и взаимодействие с заказчиком-государством. (У книги кривое форматирование, из-за чего её сложно читать. Я на коленке переформатировал как смог, чтобы по одной странице на страницу было, но в итоге получился файл в два раза больше оригинала.)
На линкедине опубликовали статью с прогнозом на самые востребованные скиллы в компаниях. Вот картинка оттуда. Что характерно, почти все скиллы очень мутные и неконкретные.
Вообще, есть сильное подозрение, что под “blockchain” сейчас маскируются просто базы данных, например, или logs/events.
Есть прекрасный сервис shodan.io, который непрерывно мониторит ip-адреса интернета и находит там потенциальные и непотенциальные дыры. Сегодня попробовал там поискать серверы с открытой mongodb в России и нашёл их около 300 штук. Это жесть, конечно. Бо́льшая часть уже хакнута, конечно.
Это замечение к новости: В Сеть утекли данные более 44 тыс. желающих взять кредит россиян
Это замечение к новости: В Сеть утекли данные более 44 тыс. желающих взять кредит россиян
Оказалось, что в сертификате нельзя в поле
emailAddress указывать юникод:% openssl req -x509 -newkey rsa:2048 -keyout ca.key -nodes -out ca.crt -subj '/CN=домен.рф/L=Novosibirsk/C=RU/emailAddress=вова@домен.рф'
Generating a RSA private key
......................................+++++
....+++++
writing new private key to 'ca.key'
-----
problems making Certificate Request
140201646212288:error:0D07A07C:asn1 encoding routines:ASN1_mbstring_ncopy:illegal characters:../crypto/asn1/a_mbstr.c:115:
Собственно, RFC5280 определяет тип для emailAddress в DN как IA5String. Но всё равно неприятно, что придётся пуникодить. При этом в CN юникод вполне допускается, и даже записывается корректным типом UTF8String.Вообще, надо будет поэкспериментировать с генерацией невалидных SSL-сертификатов и попытаться их скормить разным продуктам. Есть серьёзные подозрения, что их соответствие стандарту особо не проверяется.
Стандартными средствами создать подобный сертификат невозможно, для этого нужно вручную из байтов собирать через ASN.1 библиотеки.
Стандартными средствами создать подобный сертификат невозможно, для этого нужно вручную из байтов собирать через ASN.1 библиотеки.
Your first 90 days as CTO or VP Engineering.
Очень хороший текст про первые девяносто дней на должности технического директора, ну или на другой высшей инженерной.
Очень хороший текст про первые девяносто дней на должности технического директора, ну или на другой высшей инженерной.
Изумительная (и поучительная) история про шифровальные устройства и бэкдоры в них.
tl;dr Швейцарская компания Crypto AG полвека продавала оборудование для шифрования Ирану, Ватикану, Ливии, южно-американским хунтам и другим прекрасным странам. Но никто из покупателей не знал, что настоящий владелец компании — ЦРУ в партнёрстве с западно-германскими спецслужбами. ЦРУ мониторило «секретную» переписку практически во всех знаковых событиях третьего мира во второй половине 20 века.
tl;dr Швейцарская компания Crypto AG полвека продавала оборудование для шифрования Ирану, Ватикану, Ливии, южно-американским хунтам и другим прекрасным странам. Но никто из покупателей не знал, что настоящий владелец компании — ЦРУ в партнёрстве с западно-германскими спецслужбами. ЦРУ мониторило «секретную» переписку практически во всех знаковых событиях третьего мира во второй половине 20 века.
Два текста про компанию ЭФКО — это лидер по производству масло-жировой продукции в РФ. Офигенное чтиво про крестьян Белгородской области, мотивацию и управление.
Первый текст о проблемах, с которыми столкнулась компания: Что подумает сосед Василий? (статья 2002 года из журнала «Эксперт»).
Второй текст, как эти проблемы были очень эффективно решены: Под прессом (статья 2006 года из журнала «Форбс»).
Первый текст о проблемах, с которыми столкнулась компания: Что подумает сосед Василий? (статья 2002 года из журнала «Эксперт»).
Второй текст, как эти проблемы были очень эффективно решены: Под прессом (статья 2006 года из журнала «Форбс»).
Есть распространённая теория, что до «экономики денег» существовала «экономика прямого обмена». Так вот это не так. У антропологов нет ни одного подтверждения, деньги существовали всегда, прямо с самого первого появления социума. Точнее даже сказать не деньги, а нечто вроде «кредитов», когда в роли денег выступали услуги или долги.
Люди (и я сам тоже) часть путают понятия архитектура и дизайн.
Ранее я уже писал про детальное определение понятия архитектуры. И так получилось, что рядом с ним всегда идёт понятие дизайна. Неформально можно отличие между ними выразить так: архитектура рассказывает, как устроено, а дизайн — как конкретно построить. Архитектура абстрактна, дизайн конкретен.
По сути дизайн является одним из аспектов рассмотрения системы.
Ранее я уже писал про детальное определение понятия архитектуры. И так получилось, что рядом с ним всегда идёт понятие дизайна. Неформально можно отличие между ними выразить так: архитектура рассказывает, как устроено, а дизайн — как конкретно построить. Архитектура абстрактна, дизайн конкретен.
По сути дизайн является одним из аспектов рассмотрения системы.
Расскажу, как я пользуюсь безопасным интернетом. Я практически не пользуюсь браузером на смартфоне, да и вообще основной потребитель трафика там — это стриминговые музыкальные сервисы. Вся работа с сетью идёт с компьютера.
Я не пользуюсь VPN, в том числе всякими VPN сервисами, в том числе бесплатными. Вместо этого у меня куплено несколько дешёвых виртуалок в разных частях мира, на виртуалках стоит линукс, openssh и авторизация по ключу. Для проброса трафика использую SSH-туннели с открытием порта SOCKS5-прокси на компе. Чтобы прозрачно пользоваться интернетом с одного браузера, использую файл proxy.pac для разделения ресурсов, выглядит он примерно так:
Запускать вручную туннели неудобно, а нормально гуёвой софтины я для этого не нашёл, поэтому написал свою, которой постоянно пользуюсь несколько лет. Софтину особо не пиарю, так как я её чисто для себя пишу, поддержкой не занимаюсь и чужие хотелки не жду. Софтина выглядит как иконка в notification area, клик по иконке открывает список настроенных серверов, клик по серверу стартует или останавливает соответствующий туннель.
Софтина скомпилена и устойчиво работает для линукса и макоси. Для винды однажды собрал, но в итоге забил, так как не пользусь совсем.
Так и живём.
Я не пользуюсь VPN, в том числе всякими VPN сервисами, в том числе бесплатными. Вместо этого у меня куплено несколько дешёвых виртуалок в разных частях мира, на виртуалках стоит линукс, openssh и авторизация по ключу. Для проброса трафика использую SSH-туннели с открытием порта SOCKS5-прокси на компе. Чтобы прозрачно пользоваться интернетом с одного браузера, использую файл proxy.pac для разделения ресурсов, выглядит он примерно так:
function FindProxyForURL(url, host)
{
if (false
|| shExpMatch(host, 'outline.com')
|| shExpMatch(host, 'telegra.ph')
|| shExpMatch(host, 'rutracker.org')
|| shExpMatch(host, 'lib.rus.ec')
) {
return "SOCKS5 127.0.0.1:4124;";
}
return "DIRECT";
}
Путь до этого файла прописан в настройках сети фаерфокса (в нём очень удобно, что он не использует системные настройки сети). И когда я иду, скажем, на rutracker, то коннект сразу делается на локальный порт 4124, на котором висит порт SOCKS5-туннеля до какой-то из дальних виртуалок.Запускать вручную туннели неудобно, а нормально гуёвой софтины я для этого не нашёл, поэтому написал свою, которой постоянно пользуюсь несколько лет. Софтину особо не пиарю, так как я её чисто для себя пишу, поддержкой не занимаюсь и чужие хотелки не жду. Софтина выглядит как иконка в notification area, клик по иконке открывает список настроенных серверов, клик по серверу стартует или останавливает соответствующий туннель.
Софтина скомпилена и устойчиво работает для линукса и макоси. Для винды однажды собрал, но в итоге забил, так как не пользусь совсем.
Так и живём.
Кто-то сказал: «Аристотель был последним человеком в истории, который знал всё».
Пишу по памяти, может и не Аристотель, но суть не меняется. Когда-то один человек мог узнать всё про мир, потом знаний становилось всё больше и больше, появилась специализация, когда человек знал, где найти книги, в которых написано искомое.
А теперь у нам уже мета-специализация светит, когда человек знает, где найти книги (или сайты), в которых написано, как искать и переваривать информацию по нужной тематике.
Пишу по памяти, может и не Аристотель, но суть не меняется. Когда-то один человек мог узнать всё про мир, потом знаний становилось всё больше и больше, появилась специализация, когда человек знал, где найти книги, в которых написано искомое.
А теперь у нам уже мета-специализация светит, когда человек знает, где найти книги (или сайты), в которых написано, как искать и переваривать информацию по нужной тематике.
Пара слов про кодировки. Казалось бы, эта тема уже лет пятнадцать как должна быть всем полностью известна, а нет. Каждый раз как новый и приходится бесконечно одно и то же рассказывать, распутывая адскую кашу в головах.
Эти слова в основном про юникод. Все примеры кода для простоты на третьем питоне (во втором работа с юникодом очень плохо представлена, а в C++ с юникодом всё очень плохо).
Юникод (unicode) — это стандарт для представления и кодирования текстов на разных языках, в том числе «текстов» на «языке смайликов», например. В юникоде внутри программы (это важно, в самом конце будет объяснение, почему я упомянул программу) есть два уровня: логический, который оперирует символами (буквами), и физический, который оперирует байтами. В питоне вы работаете на логическом уровне, когда используете строки (объекты класса str, литералы с кавычками по бокам):
Обратный процесс — из байтов в юникодную строку — называется декодированием. Содержимое переменной
Юникод — это центральный логический объект, для представления в байтах его нужно закодировать (encode), а набор байтов для использования нужно сначала декодировать (decode).
Кодировка utf8 позволяет закодировать любой юникодный символ. А вот, например, cp1251 — не любой, так как cp1251 — однобайтовая кодировка, то есть может использовать для кодирования символа только один байт, соответственно кодировка cp1251 понимает только очень ограниченный диапазон символов. Но это тема отдельного текста про ветхозаветные кодировки.
Мякотка — есть ещё третий уровень, который находится выше логического и физического — это визуальный. То, как символ или набор символов представляется на экране. Но это тоже тема отдельного текста, тут я и так увлёкся сверх меры.
Эти слова в основном про юникод. Все примеры кода для простоты на третьем питоне (во втором работа с юникодом очень плохо представлена, а в C++ с юникодом всё очень плохо).
Юникод (unicode) — это стандарт для представления и кодирования текстов на разных языках, в том числе «текстов» на «языке смайликов», например. В юникоде внутри программы (это важно, в самом конце будет объяснение, почему я упомянул программу) есть два уровня: логический, который оперирует символами (буквами), и физический, который оперирует байтами. В питоне вы работаете на логическом уровне, когда используете строки (объекты класса str, литералы с кавычками по бокам):
>>> t1 = 'жыр'
>>> len(t1)
3
Здесь мы видим строку в переменной t1, строка состоит из трёх русских букв, длина этой строки — 3. Это не три байта, это три символа! Юникодная строка (не только в питоне) — это по сути список юникодных символов, у каждого символа есть код в стандарте юникода. Для нашего примера коды символов можно посмотреть через функцию ord():>>> [ord(x) for x in t1]В таком виде юникодный текст может крутиться внутри программы, но если мы хотим его передать наружу в виде байтов, то должны его закодировать так, чтобы на другом конце смогли корректно раскодировать. Кодирование на английском — encode, декодирование — decode. Сейчас самый стандартный способ кодирования — utf8, если вы видите фразу типа «текст в кодировке utf8», то это означает, что перед нами список (массив) байтов, не букв языка, а именно байтов. Кодирование делается так:
[1078, 1099, 1088]
>>> u1 = t1.encode('utf8')
>>> len(u1)
6
Видим, что длина закодированного текста — шесть байтов. Как именно работает utf8, нам сейчас совершенно не интересно, главное, что после кодирования мы получаем байтовую строку, это по сути список чисел, каждое в диапазоне от 0 до 255 (этот тип называется bytes). При этом юникодная строка — это на самом деле список чисел в диапазоне от 0 до 1114111, только в питоне эта кухня скрыта, но вы должны понимать это, когда делаете len(s) на юникодной строке.Обратный процесс — из байтов в юникодную строку — называется декодированием. Содержимое переменной
u1 из примера выше такое:>>> u1Чтобы его преобразовать в юникод, его нужно декодировать (помним: кодируем в байты, декодируем из байтов), в аргументе передаём название кодировки:
b'\xd0\xb6\xd1\x8b\xd1\x80'
>>> u1.decode('utf8')
'жыр'
Помним главное, фраза «текст в кодировке utf8» означает, что у нас «текст» представляет собой список байтов, это ещё не юникодный текст, юникодным он станет после декодирования из кодировки utf8. Юникодная строка никак не закодирована, это строка из уже готовых для использования символов. В наш просвещённый 21 век в любой программе пора уже использовать тексты исключительно в юникоде. Юникод — это центральный логический объект, для представления в байтах его нужно закодировать (encode), а набор байтов для использования нужно сначала декодировать (decode).
Кодировка utf8 позволяет закодировать любой юникодный символ. А вот, например, cp1251 — не любой, так как cp1251 — однобайтовая кодировка, то есть может использовать для кодирования символа только один байт, соответственно кодировка cp1251 понимает только очень ограниченный диапазон символов. Но это тема отдельного текста про ветхозаветные кодировки.
Мякотка — есть ещё третий уровень, который находится выше логического и физического — это визуальный. То, как символ или набор символов представляется на экране. Но это тоже тема отдельного текста, тут я и так увлёкся сверх меры.
И отдельно вынесу рассуждения про семантику encode/decode. Этот момент вызывает жесточайшую путаницу в сознании разработчиков и каждый интерпретирует их по-разному.
Кодирование/декодирование (encode/decode) подразумевает, что есть некая «наша» область с чёткой границей, за которой дикая тундра. Внутри нашей области обитают единственно правильные и приручённые данные. А за границей области все данные не имеют семантики. Поэтому при пересечении границы изнутри наружу данные нужно закодировать (encode), а при обратном движении снаружи вовнутрь «дикие» данные нужно декодировать (decode).
Само понятие «кодированности» подразумевает аморфность и однородность, структура «закодированных» данных скрыта и неясна. Но наши данные внутри области структурны и понятны, они «декодированы».
Чтобы запомнить, сконцентрируйтесь прежде всего на понятии декодировать (decode), оно интуитивно подразумевает преобразование «сложного» в «простое». Внутри нашей системы — простое, за границами — сложное, поэтому декодирование применяется для преобразования внешних данных во внутренние. Противоположный процесс, таким образом, — это кодирование (encode).
Кодирование/декодирование (encode/decode) подразумевает, что есть некая «наша» область с чёткой границей, за которой дикая тундра. Внутри нашей области обитают единственно правильные и приручённые данные. А за границей области все данные не имеют семантики. Поэтому при пересечении границы изнутри наружу данные нужно закодировать (encode), а при обратном движении снаружи вовнутрь «дикие» данные нужно декодировать (decode).
Само понятие «кодированности» подразумевает аморфность и однородность, структура «закодированных» данных скрыта и неясна. Но наши данные внутри области структурны и понятны, они «декодированы».
Чтобы запомнить, сконцентрируйтесь прежде всего на понятии декодировать (decode), оно интуитивно подразумевает преобразование «сложного» в «простое». Внутри нашей системы — простое, за границами — сложное, поэтому декодирование применяется для преобразования внешних данных во внутренние. Противоположный процесс, таким образом, — это кодирование (encode).
У мозга есть два режима работы: когда он катается по уложенным рельсам и когда эти самые рельсы укладывает. Первый режим затрачивает мало энергии и позволяет развивать скорость, второй режим очень сильно затратный и работает медленно. Когда всякие умные люди говорят «Включи мозг!», они обычно имеют в виду второй режим, однако в нём долгое время работать невозможно, организм очень сильно устаёт. Поэтому у эффективных людей затратный режим используется для правильной укладки «рельсов», по которым потом в автоматическом режиме быстро катается мышление.
but we need to go deeper
Описанная выше идея была вброшена в книге Daniel Kahneman “Thinking, Fast and Slow”, однако научного подтверждения этой модели нет. И более того, ряд исследователей поставил под сомнение некоторые из представленных в книге тезисов.
Вывод: нет вывода, всё очень мутно и никому нельзя верить.
but we need to go deeper
Описанная выше идея была вброшена в книге Daniel Kahneman “Thinking, Fast and Slow”, однако научного подтверждения этой модели нет. И более того, ряд исследователей поставил под сомнение некоторые из представленных в книге тезисов.
Вывод: нет вывода, всё очень мутно и никому нельзя верить.