Архив за 09 октября 2017 - 8

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

Поиск файлов по тэгам в XMP / IPTC и операции с найденным
Читать полностью »

Сколько стоит космос - 1

Многие считают что космос — это дорого и непрактично. Но на самом деле это не всегда так. Поэтому сегодня я хотел бы на 20 примерах показать как соотносится стоимость космических миссий с чем-то более близким для нашей «земной» жизни.

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

Сколько стоит космос - 2

39,5 млн $ 69 млн $
Цена покупки Ferrari 250 GTO на аукционе в 2014 году Стоимость миссии «Чандраян-1» — первой индийской миссии по изучению Луны

Спутник отработал меньше года из планируемых двух, но всё же сделал сенсацию — с помощью него удалось найти воду на лунных полюсах (воду находили ещё миссии «Аполлонов», но посчитали что она была занесена в образцы уже на Земле). На спутнике находилось 10 различных приборов (включая камеру) и ударный зонд.Читать полностью »

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

Презентация Маска: дизайнеры и пиарщики по-прежнему побеждают инженеров - 1
Новый вариант BFR выводит спутник, рисунок SpaceX
Читать полностью »

Железнодорожно-ориентированное программирование. Обработка ошибок в функциональном стиле - 1

Как пользователь я хочу изменить ФИО и email в системе.

Для реализации этой простой пользовательской истории мы должны получить запрос, провести валидацию, обновить существующую запись в БД, отправить подтверждение на email пользователю и вернуть ответ браузеру. Код будет выглядеть примерно одинаково на C#:

string ExecuteUseCase() 
{ 
  var request = receiveRequest();
  validateRequest(request);
  canonicalizeEmail(request);
  db.updateDbFromRequest(request);
  smtpServer.sendEmail(request.Email);
  return "Success";
}

и F#:

let executeUseCase = 
  receiveRequest
  >> validateRequest
  >> canonicalizeEmail
  >> updateDbFromRequest
  >> sendEmail
  >> returnMessage

Отклоняясь от счастливого пути

Железнодорожно-ориентированное программирование. Обработка ошибок в функциональном стиле - 2

Дополним историю:

Как пользователь я хочу изменить ФИО и email в системе
И увидеть сообщение об ошибке, если что-то пойдет не так.

Что же может пойти не так?

Железнодорожно-ориентированное программирование. Обработка ошибок в функциональном стиле - 3

  1. ФИО может оказаться пустым, а email – не корректным
  2. пользователь с таким id может быть не найден в БД
  3. во время отправки письма с подтверждением SMTP-сервер может не ответить
  4. ...

Добавим код обработки ошибок

string ExecuteUseCase() 
{ 
  var request = receiveRequest();
  var isValidated = validateRequest(request);
  if (!isValidated) {
     return "Request is not valid"
  }
  canonicalizeEmail(request);
  try {
    var result = db.updateDbFromRequest(request);
    if (!result) {
      return "Customer record not found"
    }
  } catch {
    return "DB error: Customer record not updated"
  }

  if (!smtpServer.sendEmail(request.Email)) {
    log.Error "Customer email not sent"
  }

  return "OK";
}

Вдруг вместо 6 мы получили 18 строк кода с ветвлениями и большей вложенностью, что сильно ухудшило читаемость. Каким будет функциональный эквивалент этого кода? Он выглядит абсолютно также, но теперь в нем есть обработка ошибок. Можете мне не верить, но, когда мы доберемся до конца, вы убедитесь, что это действительно так.
Читать полностью »

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

Известный оверклокер Der8auer предлагает для таких пользователей готовое решение. На сайте Caseking можно приобрести процессоры Intel Core i7-8700K, которые уже проверены и гарантировано заработают на указанной в описании частоте. Для каждого CPU она своя, но в целом показатели варьируются от 4,8 ГГц до 5,2 ГГц. Конечно, процессор на такой частоте будет стабилен при соответствующем охлаждении, требования к которому также есть в описании к CPU.

Читать полностью »

image

Да, это реальное название нового ноутбука. Краткость — сестра таланта.Читать полностью »

Примечание переводчика

Приведённый в статье код скомпилирован с достаточно старыми версиями крейтов peg и peg_syntax_ext. Для текущих версий в исходники нужно внести минимальные изменения. Я вставил изменённые участки в спойлеры по тексту статьи. Для сборки кода установите компилятор nightly Rust.
Полный исходник с моими правками можно скачать здесь: https://github.com/arktur04/rust-llvm-toy-frontend

В настоящее время я работаю над компилятором, который написан на Rust, и порождает LLVM IR. LLVM API выглядит немного пугающе для новичков, и по нему не так много руководств (и все они на C++, поэтому не вполне очевидно, как сделать то же самое на Rust). Я бы хотел, чтобы кто-то протянул мне руку помощи, когда я начинал всё это, и эта статья является тем, что я хотел бы показать самому себе в то время.

Игрушечный фронтенд для LLVM, написанный на Rust: Руководство для начинающих - 1

В Rust наилучшая возможность взаимодействия с LLVM — через крейт llvm-sys. Один добрый человек разместил документацию к нему здесь. Конечно, вам следует также изучить руководство по LLVM, так как оно поможет вам понять, как LLVM “думает”. Этот пост, в основном, является переводом на Rust подмножества из этого руководства.

Полный исходный код для этого руководства находится здесь.
Читать полностью »

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

Определение

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

Пример

Lazy<T> — обертка для объекта, чье создание откладывается до первого обращения к нему.

Антипример

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

Еще антипример

Локатор сервисов — позволяет получить доступ к любому сервису приложения. Это описание без исчерпывающего списка сервисов заведомо неполное.

Назначение

Упрощение создания, анализа и модификации программных систем.

Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js