Обновить
34
0

Пользователь

Отправить сообщение

Вы хотите, чтобы я за вас проверил?)

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


Пишите параметры колбэков, как не-опциональные:
/* OK */
interface Fetcher {
getObject(done: (data: any, elapsedTime: number) => void): void;
}

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

Что-то не работает.


class A implements Fetcher {
    getObject(done: IGetObjectCallback) {}
}

const a = new A
a.getObject((x: any, y: number) => {})
// TS2345: Argument of type '(x: any, y: number) => void' is not assignable to parameter of type 'IGetObjectCallback'.

Официальные доки советуют использовать опциональные параметры вместо перегрузок: https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html#use-optional-parameters

Посмотрите https://github.com/trailofbits/algo. Может быть, все что нужно будет — перевести ридми.

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

Чужие монеты нельзя забрать даже с 90% хешрейта.

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

В js сами начали: core-js

Что это за приложения, которые необходимо написать быстро, причем выбирать для этого руби? Лично я на коленке леплю скрипты на PHP

Специально не отвечал вечером, т.к. думал что с утра перечитаю эти фразы по-другому, как-будто вопрос с интересом написан. Но нет… :)


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

Я выше тоже писал, чем хорош руби по-моему: https://habrahabr.ru/post/341516/#comment_10503278. Интересное обсуждение с несколькими хорошими примерами было в этой ветке: https://habrahabr.ru/post/341516/#comment_10509174.


Что это за приложения...

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


Не знаю насчет рельсов

Если действительно интересно, то сначала изучите то, что хотите критиковать (например: http://guides.rubyonrails.org/, https://www.ruby-lang.org/en/documentation/quickstart/).


Касательно вашего вопроса: все, что вы перечислили, можно написать на руби.

Уже даже привык к такому поведению аудитории на Хабре, но все-равно как-то вымораживает

Что это за приложения, которые необходимо написать быстро, причем выбирать для этого руби? Лично я на коленке леплю скрипты на PHP

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


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

В ubuntu (про другие дистрибутивы не уверен) в пакете nginx сразу идет файл /etc/nginx/proxy_params:


proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

С ним для каждого хоста достаточно include proxy_params;

https://ruby-doc.org/core/Enumerable.html для примера. Если класс предоставляет метод each, то include Enumerable добавит filter, find, inject/reduce, .... Это не кто-то посторонний делает, а автор класса: метод include — private.


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

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

Логгер — абстрактный пример, пусть будет 1 инстанс на тред :) С contextmanager все ок получается.


contextmanager пробовал, забыл про него. Для меня это еще 1 минус языка — чтобы не добавлять многострочные лямбды, добавили сомнительную конструкцию языка и к ней костыль. Во мне негодует Оккам. Возвращать значения из with все равно нельзя вроде, поэтому мне этот способ не подошел в реальной ситуации.


Не очень понял какой будет ответ на мой вопрос

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


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


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

О, то есть получается...

¯\_(ツ)_/¯


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


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

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


в сообществе Питона больше заботятся о читаемости текста

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


Касательно Python, по-моему, большое колличество особенных методов вида __len__ — это более магически. Даже их вид настораживает. При этом их необходимо использовать, чтобы пользоваться основными конструкциями языка. Мне особенно не нравится with с __enter__ и __exit__. Были бы многострочные лямбды, было бы лучше, наврное:


Заголовок спойлера

Дисклэймер! Я не гуру питона, может все не так надо делать :)


class Pool:
  def __enter__(self):
    # Нельзя передать аргументы :(
    connection = self.checkout()
    return connection

  def __exit__(self, тут, какие-то, аргументы, еще, надо, знать):
    if need_to_check_always:
      self.checkin(one_of_args)
    # return? неееет

value = None
with pool as connection:
  prepare_something
  value = connection.get('some')

vs


class Pool
  def with(timeout)
    connection = checkout(timeout: timeout)
    begin
      yield connection
    ensure
      checkin(connection)
    end
  end
end

value = pool.with do |connection| 
  prepare_something
  connection.get('some') 
end

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


class Logger
  def with_level(new_level)
    old_level = level
    self.level = new_level
    yield
  ensure
    self.level = old_level
    flush
  end
end

logger.with_level(:debug) do
  something
  more
end

logger.with_level(:error) do
  again
  and_again
end

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

$ man irb
...
     -m             Bc mode (load mathn, fraction or matrix are available)

# С других источников:
Sets bc mode [...]
See Command line options at IRB and the unix manpage bc(1) for more information.

$ man bc
bc - An arbitrary precision calculator language

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


Почему он в stdlib? Мне кажется, он очень похож "private" модуль для такого режима, который никто не должен реквайрить в обычных приложениях. Но если очень хочется, то можно, как и private метод вызвать, только вся ответственность уже на разработчике, который это использует.

https://github.com/ruby/mathn:


Deprecated library that extends math operations.

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


# Without mathn:
#
#   20 / 9 * 3 * 14 / 7 * 3 / 2 # => 18
#
# With mathn:
#
#   20 / 9 * 3 * 14 / 7 * 3 / 2 # => 20

Библиотека для специфичной аудитории, видимо. Для тех, кому нужно решать математические задачи, не задумываясь о том, что у программистов есть какие-то там integer (3/2 = 1).

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


a = Money.new(1, 'usd')
b = Money.new(2, 'usd')

a + b
# не хуже, а может и лучше, чем
a.add(b)

# и, по мне, в разы лучше чем
import add from money.math
add(a, b)

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

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


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


PPS. Я изначально обратил внимание только на то, что другие языки с указанными особенностями получили меньше негатива. Т.е. это негатив — не от этих особенностей. Немного подробнее написал в другом комментарии: https://habrahabr.ru/post/341516/#comment_10503278

Я не пытаюсь сравнивать с с++, это просто пример, где метапрограммирование еще больше "уменьшает предсказуемость поведения просматриваемого в данный момент кода".

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

Информация

В рейтинге
Не участвует
Работает в
Зарегистрирован
Активность