Pull to refresh
6
0
Сергей @cs0ip

User

Send message
Но там разница в считанные символы, что никак нельзя назвать каким-то существенным улучшением. К тому же, чаще всего, добавляют сразу несколько функций, и в этом случае вараинт scala уже выглядит лучше, чем в kotlin.
По остальным пунктам, которые вы приводите к качестве плюсов:
— inline функции: в scala для этого есть аннотация @inline
— удобные функции стандартной библиотеки: вполне присутствует в scala
— скорость компиляции: здесь конечно scala медленне почти всех существующих языков, но инкрементальный компилятор, который будет перекомпилировать отдельные функции (или даже блоки кода, не помню точно), в значительной степени уберет эту проблему.

Вообще хотелось развернутого сравнения от того, кто разбирается в обоих языках, потому что сейчас совершенно не понятно, зачем kotlin вообще нужен.
Вообще в scala давно уже добавлены implicit class'ы, которые позволяют писать более аккуратный код:
implicit class RichInt(val x: Int) extends AnyVal {
  def square: Int = x * x
}
object App  {
   def print(): Unit = {
      val two = 2
      println(s"The square of 2 is ${two.square}")
  }
}
Я сейчас прочитал ответ на этот вопрос в комментариях к предыдущей статье. Но он появился параллельно с моим вопросом здесь. В общем, как выяснилось, бинарник приходит с сервера порезанным и не может в таком виде запуститься. И этот крайне важный момент был изначально не понятен.
А будет ли работать вариант, если просто получить исходный бинарник до того, как его подпишут? Возможно это было бы проще?
С CEG понятно, что не прокатит. Я тут просто отошел от темы поста и начал рассуждать о том, как можно было бы организовать альтернативную защиту.
А про CEG, конечно же пишите ещё. Оно хоть пока и не решает свою задачу, но я до этого вообще не знал, что в valve подобная «защита» есть.
Вот если это бизнес, то мой способ точно не работает, т.к. потери ощутимы только для частного лица. Но в чем он может заключатся? Я вижу только внедрение каких-нибудь зловредов на клиентские компьютеры. Однако раздачи с популярными таблетками в таком не замечены. Поэтому мне не совсем понятно, что это может быть.
В подразумеваемом мной способе файлы у одного клиента получаются идентичными.
— Вообще конечно да, имея два купленных экземпляра можно найти примитивно встроенный id. Но уже это отсекает некоторое количество тех, кто не хочет всё покупать в двух экземплярах. Но как мне кажется, есть способы встраивания id такие, что дифы будут показывать всегда на часть функционального кода, без которого собственно программа работать не будет.
— Как раз от подхода с новым аккаунтом по идее может защищать, т.к. речь идет о постоянной потере денег и на эту потерю должна быть мотивация. Кроме того можно вести какой-нибудь черный список кредиток, а их уже сложнее менять.
— А вот с воровством чужих бинарников действительно сложнее. Опять же, ломать кого-то только ради игры кажется странным. Хотя всякое бывает и не хотелось бы в один момент обнаружить, что тебя заблокировали ни за что.
На счет защиты в стиме, давно интересует вопрос, почему встраивают фактически неработающую защиту вместо такой схемы:
1) В исполняемый файл на стороне сервера перед загрузкой встраиваем id клиента. Причем для каждой игры можно встраивать уникальный id и в уникальное место, чтобы было труднее вычислить, где его искать. Это не очень дорогая операция и сервера её потянут.
2) Через некоторое время взломанную игру выкладывают в виде торрентов.
3) Правообладатель качает игру и выясняет кто же её слил.
4) Аккаунт слившего со всеми играми блокируется.
На мой взгляд, со временем это сделает невозможным выкладку игр в самых популярных для этого местах, а в непопулярных по определению будет совсем немного народа. Плюс ко всему, если сравнивать с тем же гугл-плей, где можно купить левый аккаунт, чтобы на нем потом отработать потраченное, здесь с заработком сложнее и мотивации соответственно меньше.
В общем, не то чтобы мне хотелось, чтобы такая схема начала работать, но мне очень интересно почему она уже не работает. Наверное о ней уже подумали и почему-то отказались?
Мы говорим о совершенно разных вещах. Наверно пора заканчивать этот бессмысленный диалог.
Очень мило, что вы уделили столько внимания опечатке и даже умудрились перейти на личности. Правда это не меняет того факта, что рабочие места программистов и до прихода туда мужчин не принадлежали женщинам. Т.е. оккупировать они их не могли. Ну и заодно может расскажете своими словами коротко что же вы прочитали на этом графике? То что мужчины заменяли женщин на их рабочих местах или же то, что количество рабочих мест с тех пор постоянно росло, но на них мужчины приходили активнее женщин? Мы ведь всё ещё про оккупацию говорим, вы помните?
Я вижу на этом графике не желание женщин работать программистами. А где именно здесь искать захват мужчинами не принадлежащих им территорий?
На самом деле этот вопрос интересовал многих scala-разработчиков (как я понимаю, сейчас эту штуку убрали, или переместили...).
И благодаря поисковику по подобным операторам я таки вышел на вопрос на SO. Если его долго читать, то наверно можно разобраться.
symbolhound.com/?q=%3C|*|%3E
stackoverflow.com/questions/2545248/function-syntax-puzzler-in-scalaz
А вот тут исходник сего оператора: github.com/scalaz/scalaz/blob/release/6.0.4/core/src/main/scala/scalaz/MA.scala#L52
Но вообще, это скорее пример того, как scala использовать не нужно.
Многим компьютерным программам нужна сборка мусора, из-за чего попрой их даже приходится перезапускать. Так что ещё не известно как пойдет эволюция.
Меня в другом посте поправили, что вектор на RRB Tree реализован. Делаю пометку, чтобы никого не вводить в заблуждение.
Да, действительно. Как-то перепутал их из-за корзин по 32 элемента. А т.к. код читал поверхностно, то так и осталось это заблуждение. Спасибо за исправление.
Ну просто у вас в коде я вижу такие фрагменты
genList(sz - 1, sz +: res)

Т.е. вы добавляете элементы в начало вектора. Это как раз тот случай, когда нужно использовать List.
Возможно вы пропустили такой момент, что операторы, заканчивающиеся на: выполняются на втором аргументе, а не на первом.
Дороже и по времени и по памяти. Т.к. Vector построен на Array Mapped Trie (AMT) и при каждой «модификации» создается не один элемент, а целый массив + дерево перестраивается периодически.
А при работе с List в Scala элементы добавляются в начало, а не в конец (в этом отличие от java, например), что обеспечивает сложность операции O(1) (благодаря персистенстности), но при этом гораздо более дешевое, чем в Vector.
Хотелось только отметить, что для той работы со списками, которая делается в этих примерах, надо использовать List, а не Vector, т.к. Vector в разы дороже.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Registered
Activity