Обновить
35

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

3
Подписчики
Отправить сообщение

Arel решает часть проблем, которые вы решаете с помощью quoted_table_name, избавляя при этом от необходимости писать sql:


scope.
  where(arel_table[:some_date].gt(3.days.ago)).
  where(OtherModel.arel_table[:some_number].lteq(smth))

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


Конечно, разные базы данных имеют разный функционал и даже свое надмножество SQL. При этом есть много проектов, которые действительно поддерживают разные СУБД. Например, Redmine. При разработке не публичных приложений будет странно, если команда собирается менять СУБД, при этом использует специфичный функционал. ActiveRecord тут вообще не причем.


По остальным моментам я упустил мысль уже на таймстэмпах — из кода непонятно, какие задачи решает приведенный код. Почему обновлять (updated|created)_at в базе "сильно проще"? touch тоже имеет свой контракт для разработчика, если следовать ему, то все будет работать.

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

Пример с 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

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

Информация

В рейтинге
6 030-й
Работает в
Зарегистрирован
Активность