Как стать автором
Обновить
97
0
Семен Попугаев @senia

Пишу код и помогаю другим

Отправить сообщение
У меня на одном линуксе (гента, десктоп) скайп работает (правда поиск по отдельному чату сломали, но то такое), а на другом линуксе (гента, ноут) скайп тупо вылетает с сегфолтом при старте уже год как и это не меняется с обновлениями.
Так что как повезет.
А что бы вы порекомендовали вместо Лего? Я слышал еще только про fischertechnik и «Знаток».
Знаток мне очень понравился тем, что он очень прост даже для пятилетнего ребенка и при этом достаточно увлекателен, но дальше базовых наборов там все печально.
Компании могут обучать, как это EPAM делает.
У программиста 3 выхода: смена города, удаленка и внедрение скалы на текущем рабочем месте. У меня третий вариант в свое время не прошел (не нашел единомышленников), но я видел команды, стартовавшие новый проект на scala по инициативе разработчиков.
Количество вакансий постепенно растет. В столицах несколько лет назад было не найти вакансию, сейчас же людей разбирают.
Может и другие города подтянутся.
Спасибо за пересказ. Даже начал болеть за героя. Но конец оказался немного предсказуем: www.furfur.me/furfur/heros/heroes-furfur/214717-trip

Дальнейшие приключения персонажа искать не рекомендую — лучше там не становится.
У меня он окно перекрывает — по 2 раза вдень сматываю и разматываю. Пока не морщится.
И по размерам этот мне идеален — у него корпус на 2 см короче ширины комнаты — идеально встал.
У меня белый потолок и светлые стены. И ночник не выключаю — мне ок. Каждому свое. Я взял HCG покрытие экрана — в рекламе утверждалось, что оно снижает влияние паразитной засветки, но не сравнивал.
Весной купил EH-TW6700 и экран Digis ELECTRA HCG DSEH-16280. Доволен как слон.
На мой взгляд проектор дает хорошую картинку на экономичных настройках даже без полного затемнения.
Но несколько разных экранов попробовать не было возможности.
Но именно так работает async/await в Scala/C# и JS — вешает весь код дальше в колбек. На Future, Task и Promise соответственно.
Не находите, что все ваши рассуждения в этой ветке теряют смысл?
Вот только второй и третий — синтаксический сахар над первым.
Второе — синтаксическая конструкция, преобразующаяся компилятором к первому, третье — макрос, преобразующийся к первому.
По сути здесь 3 записи абсолютно одного и того же. Какой смысл разделять их терминологически? Или вы считаете, что асинхронность — термин, описывающий способ записи действий в исходном коде?
Да все 3 примера делают абсолютно одно и то же (во втором считайте, что каждая стрелка — flatMap). Мне просто интересно как будет обосновываться не асинхронность первого примера или разный ответ для каких-либо 2 из них.
С чем знакомы? Java? Haskell? Знаете что такое монада?
Просто первый и последний примеры должны читаться и без знания scala. Достаточно понимать, что — Future — аналог CompletableFuture из Java или Task из C#. Методы map и flatMap работают так, как предполагается у монады.
Второй можно пропустить (аналог do-notation из haskell).
Я бы хотел разобраться в вашей терминологии:
1. Вот это асинхронный код? Если нет, то что здесь блокируется?
def getBonusesByPersonEmail(email: Email): Future[List[Bonus]] = {
  val person: Future[Person] = db.findPerson(email)

  val purchases: Future[List[Purchas]] =
    person.flatMap(p => storeRestServce.getPurchases(p.id))

  val bonuses: Future[Seq[Bonus]] =
    purchases.flatMap(ps => Future.sequence(
      ps.map(p => bonusesSoapService.getBonus(p.promoCode))
    ))

  val validBonuses: Future[Seq[Bonus]] = bonuses.map(_.filterNot(_.expired))
  return validBonuses
}


2. А этот? Если нет, то где здесь «блокировки»?
def getBonusesByPersonEmail(email: Email): Future[List[Bonus]] = for {
  person <- db.findPerson(email)
  purchases <- storeRestServce.getPurchases(person.id)
  bonuses <- Future.traverse(purchases)(p => bonusesSoapService.getBonus(p.promoCode))
} yield bonuses.filterNot(_.expired)


3. А вот этот? (Тот же вопрос про «блокировки»)
def getBonusesByPersonEmail(email: Email): Future[List[Bonus]] = async {
  val person = await{ db.findPerson(email) }
  val purchases = await{ storeRestServce.getPurchases(person.id) }
  val bonuses = await{
    Future.traverse(purchases)(p => bonusesSoapService.getBonus(p.promoCode))
  }
  bonuses.filterNot(_.expired)
}

Скорее всего везде, где подобная запись вообще имеет смысл.
Эта запись чаще является частным случаем частичного применения.
Рассмотрим общий случай частичного применения (scala):
arg0.method(arg1, _, arg3, _)

Здесь на основе метода, принимающего 5 параметров (this + 4 явных), определяем лямбду, принимающую 2 параметра.

И даже если в языке нет полного синтаксиса частичного применения, работает та же логика: если указан параметр, то он применяется. Java:
Runnable r = counter::increment // без параметр (this применен)
Consumer с = Сounter::increment // 1 параметр


Проблема здесь в прототипном наследовании. В JS просто нет способа получить метод класса, не указывая конкретный экземпляр (так как нет классов в привычном понимании).
И в каком-то смысле поведение JS консистентно и логично — функция — это еще 1 поле объекта и, в данном случае, поведение такое же, как и со всеми другими полями. Но this в таком случае имеет смысл совершенно иной, нежели в большинстве других языков.
С `++:=` как раз всё просто — для immutable коллекций (где этого метода нет) запись `a ++:= b` — это `а = a.++:(b)` или без точек — `a = b ++: a` (В общем случае `a operator= b` — `a = a.operator(b)`). То есть добавление `b` в начало `a`. От `b ++ a` это отличается в частности тем, что `b ++: a` — это метод объекта `a`, а не `b` и сохраняется тип `a`.
В случае же с изменяемой коллекцией `a` это метод, добавляющий `b` в начало `a`, но уже с модификацией `a` вместо создания новой коллекции.

А вот совсем мозговзрывающие методы — это `/:` и `:\` — мне кажется только Одерски может ими пользоваться свободно.
Вы хотите, чтобы я (например) специально для Вас выложил здесь (кстати, а как здесь можно вставлять картинки?) фотографии прямо «с земли»?
Вы несколько припозднились с комментарием. Выше уже это обсудили и я даже успел съездить проверить и выложил фотографии.
Вчера прокатился там: башня видна со всего Троицкого моста и с Дворцовой набережной от Троицкого моста до зимней канавки. Вот для сравнения фото башни и кранов с середины моста: https://goo.gl/photos/Xv4X6yKPWozanhiP6.
А здесь вид с набережной: https://goo.gl/photos/r1ff1TuWNPe1We2L7. Все фото с телефона без обработки.

От Эрмитажа уже надежно загорожена застройкой Васильевского острова.

Еще видно с Биржевого моста, но там башня теряется за стадионом.

Лично мое ощущение: стеклянная башня смотрится на фоне неба не контрастно и внимания к себе не привлекает. Вот если там сделают яркую подсветку, то могут сильно испортить ночной вид на Петропавловку с моста.
Судя по карте это Седова 58. 18 км от башни.
Хороший объектив — глазами с такого расстояния башню надо еще найти.
Вот я не сомневался ни секунды, что фото, аналогичное первому, появится.
Собор — 100 метров, башня сейчас — ~300. Тут она раза в 2 выше собора. Для этого снимать надо с 10 км от собора. То есть снималось это с володарского моста или дальше с фокусным расстоянием на бесконечность. И явно не с земли. И самое забавное: при такой съемке достаточно сместиться на пару градусов в сторону, чтоб башня исчезла с фона собора.

Таким способом можно вообще любые 2 высотные точки в городе снять, чтоб они казались близкими. Переместите точку съемки севернее и получите собор на фоне мостов ЗСД или в окружении кранов порта.

За второе фото спасибо. Снималось скорее всего с Троицкого моста — съезжу посмотреть. Но вообще вполне реалистично — и угол правильный и фоновой застройки нет из-за зоопарка.

Информация

В рейтинге
Не участвует
Откуда
Санкт-Петербург, Санкт-Петербург и область, Россия
Дата рождения
Зарегистрирован
Активность