All streams
Search
Write a publication
Pull to refresh
192
0.8

Программист

Send message
Может быть не для всех языков поддерживалось?

Для С++ точно не было. Даже локальную переменную в функции нельзя было переименовать. пруф на msdn


Community Edition мало отличается от профессиональной версии.

Ого, действительно почти не отличается. Но отсутствие "Version Control using Git-based Repositories" выглядит очень странно.

Предложите мне удобную IDE под Linux, позволяющую одновременно отлаживать код на C++ и код на языке типа C#/Java, и я перейду на Linux. Мне нужно что-то типа Rider + Clion, но одной программой и бесплатные.

Продукты от jetbrains одинаково выглядят и работают в любой системе. (включая idea, pycharm, clion, rider). Ещё есть бесплатные универсальные netbeans и eclipse (могут в С++ и java как минимум), но я ими давно не пользовался.


Если вы намекаете на visual studio, то спешу напомнить, что бесплатная только самая урезанная версия. После регулярного использования вышеупомянутых ide visual studio лично у меня вызывает боль и ненависть. Например, переименование переменной было добавлено только в vs 2015.

Скажите, пожалуйста, а как с производительностью и энергопотреблением линукса?

В производительности по сравнению с виндой разницы не заметил. Потребление оперативной памяти меньше. Энергопотребление после некоторой настройки (ставил tlp) сравнимо с виндой в энергосберегающем режиме.


Давно задумываюсь о переходе на линукс.

Поставьте второй системой рядом с виндой и экспериментируйте потихоньку.

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

Можно. (делать, а не предсказывать)
Пример: есть 1 корова, пополнение появится через большое время t.
По оценке, самый выгодный тип покупателей придёт раньше чем t c большой вероятностью (Например, 0.9). В таком случае нет смысла прям сейчас продавать корову дёшево.

Дополнения к навигатору в стиле «через 500 метров скоро будет красный, рекомендую снизить скорость и попасть в зеленую волну».

Сейчас многие светофоры в Москве с таймером — показывает время до переключения. Очень удобно как автомобилистам (можно планировать действия заранее), так и пешеходам (нет смысла перебегать дорогу, если там осталось, например, 15 сек.)

Живу в общаге коридорного типа. Практически в каждой комнате стоит по роутеру и живут 2-4 человека (пусть в среднем на 1 студента к wifi подключен 1 телефон и 1 ноутбук). По вертикали пробивает 1-2 этажа — можно увидеть сети оттуда, по горизонтали сеть видно даже через 5 комнат, более-менее использовать можно через 2. Что меня удивляет — даже при такой плотности размещения wifi работает вполне нормально.
Если торрент качал что-нибудь из локалки (из неё нет ограничения скорости), скорость по wifi (2.4 Ггц )достигала 8 мегабайт/с (не мегабит, не вижу смысла измерять в последних). Если подключиться к роутеру по ethernet — доходило до 11 мегабайт/c — по-сути, большой разницы нет.

Я ради интереса скомпилировал тот кусок кода с gcc и посмотрел, что получилось.


Код
unsigned long long getHash(unsigned long long hash, int prime_index){
    switch(prime_index){
    case 0:
        return 0llu;
    case 1:
        return hash % 2llu;
    case 2:
        return hash % 3llu;
    case 3:
        return hash % 5llu;
    case 4:
        return hash % 7llu;
    case 5:
        return hash % 11llu;
    case 6:
        return hash % 13llu;
    case 7:
        return hash % 17llu;
    case 8:
        return hash % 23llu;
    case 9:
        return hash % 29llu;
    case 10:
        return hash % 37llu;
    case 11:
        return hash % 47llu;
    case 12:
        return hash % 59llu;
    case 13:
        return hash % 14480561146010017169llu;
    case 14:
        return hash % 18446744073709551557llu;
    }
    return 0;
}

собрать можно командой типа: gcc -O2 -o o2.o -c code.c
посмотреть objdump -d o2.o
Скомпилированный код с любой опцией, кроме -Os, вместо каждого взятия остатка содержит кучку инструкций:


objdump для o3
o3.o:     file format elf64-x86-64

Disassembly of section .text:

0000000000000000 <getHash>:
   0:   83 fe 0e                cmp    $0xe,%esi
   3:   77 0b                   ja     10 <getHash+0x10>
   5:   89 f6                   mov    %esi,%esi
   7:   ff 24 f5 00 00 00 00    jmpq   *0x0(,%rsi,8)
   e:   66 90                   xchg   %ax,%ax
  10:   31 c0                   xor    %eax,%eax
  12:   c3                      retq   
  13:   0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)
  18:   48 89 f8                mov    %rdi,%rax
  1b:   83 e0 01                and    $0x1,%eax
  1e:   c3                      retq   
  1f:   90                      nop
  20:   48 89 f8                mov    %rdi,%rax
  23:   48 ba ab aa aa aa aa    movabs $0xaaaaaaaaaaaaaaab,%rdx
  2a:   aa aa aa 
  2d:   48 f7 e2                mul    %rdx
  30:   48 89 d0                mov    %rdx,%rax
  33:   48 d1 e8                shr    %rax
  36:   48 8d 04 40             lea    (%rax,%rax,2),%rax
  3a:   48 29 c7                sub    %rax,%rdi
  3d:   48 89 f8                mov    %rdi,%rax
  40:   c3                      retq   
  41:   0f 1f 80 00 00 00 00    nopl   0x0(%rax)
  48:   48 89 f8                mov    %rdi,%rax
  4b:   48 ba cd cc cc cc cc    movabs $0xcccccccccccccccd,%rdx
  52:   cc cc cc 
  55:   48 f7 e2                mul    %rdx
  58:   48 89 d0                mov    %rdx,%rax
  5b:   48 c1 e8 02             shr    $0x2,%rax
  5f:   48 8d 04 80             lea    (%rax,%rax,4),%rax
  63:   48 29 c7                sub    %rax,%rdi
  66:   48 89 f8                mov    %rdi,%rax
  69:   c3                      retq   
  6a:   66 0f 1f 44 00 00       nopw   0x0(%rax,%rax,1)
  70:   48 89 f8                mov    %rdi,%rax
  73:   48 ba 93 24 49 92 24    movabs $0x2492492492492493,%rdx
  7a:   49 92 24 
  7d:   48 f7 e2                mul    %rdx
  80:   48 89 f8                mov    %rdi,%rax
  83:   48 29 d0                sub    %rdx,%rax
  86:   48 d1 e8                shr    %rax
  89:   48 01 c2                add    %rax,%rdx
  8c:   48 89 d0                mov    %rdx,%rax
  8f:   48 c1 e8 02             shr    $0x2,%rax
  93:   48 8d 14 c5 00 00 00    lea    0x0(,%rax,8),%rdx
  9a:   00 
  9b:   48 29 c2                sub    %rax,%rdx
  9e:   48 29 d7                sub    %rdx,%rdi
  a1:   48 89 f8                mov    %rdi,%rax
  a4:   c3                      retq   
  a5:   0f 1f 00                nopl   (%rax)
  a8:   48 89 f8                mov    %rdi,%rax
  ab:   48 ba a3 8b 2e ba e8    movabs $0x2e8ba2e8ba2e8ba3,%rdx
  b2:   a2 8b 2e 
  b5:   48 f7 e2                mul    %rdx
  b8:   48 89 d0                mov    %rdx,%rax
  bb:   48 d1 e8                shr    %rax
  be:   48 8d 14 80             lea    (%rax,%rax,4),%rdx
  c2:   48 8d 04 50             lea    (%rax,%rdx,2),%rax
  c6:   48 29 c7                sub    %rax,%rdi
  c9:   48 89 f8                mov    %rdi,%rax
  cc:   c3                      retq   
  cd:   0f 1f 00                nopl   (%rax)
  d0:   48 89 f8                mov    %rdi,%rax
  d3:   48 ba c5 4e ec c4 4e    movabs $0x4ec4ec4ec4ec4ec5,%rdx
  da:   ec c4 4e 
  dd:   48 f7 e2                mul    %rdx
  e0:   48 89 d0                mov    %rdx,%rax
  e3:   48 c1 e8 02             shr    $0x2,%rax
  e7:   48 8d 14 40             lea    (%rax,%rax,2),%rdx
  eb:   48 8d 04 90             lea    (%rax,%rdx,4),%rax
  ef:   48 29 c7                sub    %rax,%rdi
  f2:   48 89 f8                mov    %rdi,%rax
  f5:   c3                      retq   
  f6:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
  fd:   00 00 00 
 100:   48 89 f8                mov    %rdi,%rax
 103:   48 ba f1 f0 f0 f0 f0    movabs $0xf0f0f0f0f0f0f0f1,%rdx
 10a:   f0 f0 f0 
 10d:   48 f7 e2                mul    %rdx
 110:   48 89 d0                mov    %rdx,%rax
 113:   48 c1 e8 04             shr    $0x4,%rax
 117:   48 89 c2                mov    %rax,%rdx
 11a:   48 c1 e2 04             shl    $0x4,%rdx
 11e:   48 01 c2                add    %rax,%rdx
 121:   48 89 f8                mov    %rdi,%rax
 124:   48 29 d0                sub    %rdx,%rax
 127:   c3                      retq   
 128:   0f 1f 84 00 00 00 00    nopl   0x0(%rax,%rax,1)
 12f:   00 
 130:   48 89 f8                mov    %rdi,%rax
 133:   48 ba c9 42 16 b2 90    movabs $0x642c8590b21642c9,%rdx
 13a:   85 2c 64 
 13d:   48 f7 e2                mul    %rdx
 140:   48 89 f8                mov    %rdi,%rax
 143:   48 29 d0                sub    %rdx,%rax
 146:   48 d1 e8                shr    %rax
 149:   48 01 c2                add    %rax,%rdx
 14c:   48 89 d0                mov    %rdx,%rax
 14f:   48 c1 e8 04             shr    $0x4,%rax
 153:   48 8d 14 40             lea    (%rax,%rax,2),%rdx
 157:   48 c1 e2 03             shl    $0x3,%rdx
 15b:   48 29 c2                sub    %rax,%rdx
 15e:   48 29 d7                sub    %rdx,%rdi
 161:   48 89 f8                mov    %rdi,%rax
 164:   c3                      retq   
 165:   0f 1f 00                nopl   (%rax)
 168:   48 89 f8                mov    %rdi,%rax
 16b:   48 ba 1b 61 b9 a7 11    movabs $0x1a7b9611a7b9611b,%rdx
 172:   96 7b 1a 
 175:   48 f7 e2                mul    %rdx
 178:   48 89 f8                mov    %rdi,%rax
 17b:   48 29 d0                sub    %rdx,%rax
 17e:   48 d1 e8                shr    %rax
 181:   48 01 c2                add    %rax,%rdx
 184:   48 89 d0                mov    %rdx,%rax
 187:   48 c1 e8 04             shr    $0x4,%rax
 18b:   48 8d 14 c5 00 00 00    lea    0x0(,%rax,8),%rdx
 192:   00 
 193:   48 29 c2                sub    %rax,%rdx
 196:   48 8d 04 90             lea    (%rax,%rdx,4),%rax
 19a:   48 29 c7                sub    %rax,%rdi
 19d:   48 89 f8                mov    %rdi,%rax
 1a0:   c3                      retq   
 1a1:   0f 1f 80 00 00 00 00    nopl   0x0(%rax)
 1a8:   48 89 f8                mov    %rdi,%rax
 1ab:   48 ba 8b 7c d6 0d a6    movabs $0xdd67c8a60dd67c8b,%rdx
 1b2:   c8 67 dd 
 1b5:   48 f7 e2                mul    %rdx
 1b8:   48 89 d0                mov    %rdx,%rax
 1bb:   48 c1 e8 05             shr    $0x5,%rax
 1bf:   48 8d 14 c0             lea    (%rax,%rax,8),%rdx
 1c3:   48 8d 04 90             lea    (%rax,%rdx,4),%rax
 1c7:   48 29 c7                sub    %rax,%rdi
 1ca:   48 89 f8                mov    %rdi,%rax
 1cd:   c3                      retq   
 1ce:   66 90                   xchg   %ax,%ax
 1d0:   48 89 f8                mov    %rdi,%rax
 1d3:   48 ba 63 72 05 31 b9    movabs $0x5c9882b931057263,%rdx
 1da:   82 98 5c 
 1dd:   48 f7 e2                mul    %rdx
 1e0:   48 89 f8                mov    %rdi,%rax
 1e3:   48 29 d0                sub    %rdx,%rax
 1e6:   48 d1 e8                shr    %rax
 1e9:   48 01 c2                add    %rax,%rdx
 1ec:   48 89 d0                mov    %rdx,%rax
 1ef:   48 c1 e8 05             shr    $0x5,%rax
 1f3:   48 8d 14 40             lea    (%rax,%rax,2),%rdx
 1f7:   48 c1 e2 04             shl    $0x4,%rdx
 1fb:   48 29 c2                sub    %rax,%rdx
 1fe:   48 29 d7                sub    %rdx,%rdi
 201:   48 89 f8                mov    %rdi,%rax
 204:   c3                      retq   
 205:   0f 1f 00                nopl   (%rax)
 208:   48 89 f8                mov    %rdi,%rax
 20b:   48 ba 23 68 38 a9 fb    movabs $0x8ad8f2fba9386823,%rdx
 212:   f2 d8 8a 
 215:   48 f7 e2                mul    %rdx
 218:   48 89 d0                mov    %rdx,%rax
 21b:   48 c1 e8 05             shr    $0x5,%rax
 21f:   48 8d 0c 85 00 00 00    lea    0x0(,%rax,4),%rcx
 226:   00 
 227:   48 89 c2                mov    %rax,%rdx
 22a:   48 c1 e2 06             shl    $0x6,%rdx
 22e:   48 29 ca                sub    %rcx,%rdx
 231:   48 29 c2                sub    %rax,%rdx
 234:   48 29 d7                sub    %rdx,%rdi
 237:   48 89 f8                mov    %rdi,%rax
 23a:   c3                      retq   
 23b:   0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)
 240:   48 ba 91 1d 40 18 a4    movabs $0xc8f549a418401d91,%rdx
 247:   49 f5 c8 
 24a:   31 c0                   xor    %eax,%eax
 24c:   48 39 d7                cmp    %rdx,%rdi
 24f:   0f 93 c0                setae  %al
 252:   48 0f af d0             imul   %rax,%rdx
 256:   48 89 f8                mov    %rdi,%rax
 259:   48 29 d0                sub    %rdx,%rax
 25c:   c3                      retq   
 25d:   0f 1f 00                nopl   (%rax)
 260:   31 c0                   xor    %eax,%eax
 262:   48 83 ff c5             cmp    $0xffffffffffffffc5,%rdi
 266:   0f 93 c0                setae  %al
 269:   48 6b d0 c5             imul   $0xffffffffffffffc5,%rax,%rdx
 26d:   48 89 f8                mov    %rdi,%rax
 270:   48 29 d0                sub    %rdx,%rax
 273:   c3                      retq   
Каждый из вариантов — целое число по модулю на основе статической константы. Чем это хорошо? Если использовать константу, то компилятор применит кучу оптимизаций для ускорения вычисления. Для каждого из вариантов вы получаете кастомный ассемблерный код, который будет работать гораздо быстрее, чем целое число по модулю. Выглядит несколько безумно, но даёт огромный прирост скорости.

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

Считали бы что поезд просто набор джоинтов.

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


Удивительно то, что сейчас это практически не играет никакой роли…

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


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


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

Поэтому мы использовали меньшее значение трения и масштабировали его относительно времени, прошедшего после отсоединения вагона.

Например, я бы на их месте вместо Ейлера использовал интегрирование Верле — оно даёт второй порядок точности и позволяет легко накладывать ограничения (например, на максимальное и минимальное расстояния между вагонами), причём было бы достаточно фиксированного шага по времени без бинарного поиска моментов "когда было столкновение"

За пять минут робот-камикадзе может многое натворить. Представьте ощущения людей-противников, которые знают, что к ним может прибежать бешеная табуретка на ножках с гранатой, которую можно остановить, только уничтожив? Что эта табуретка может спрятаться в яме или ещё где-нибудь, перейти в "спящий" режим на сутки-двое, а потом при появлении врага внезапно выскочить?


90 минут — это достаточно. Если предположить, что робот будет заряжаться за те же 90 минут внутри какой-нибудь переделанной БМП, то, например, внутри будет заряжаться пятеро и ещё пятеро будут бегать по округе хоть круглые сутки, сменяя друг друга для подзарядки.


Если будет реально необходимо, можно поставить в робота ДВС и генератор. (у boston dynamics некоторые роботы так и сделаны)

А всё остальное укладывается, по-моему, в «нет времени играть нормально, поэтому я испорчу игру другим».

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


Сужу по примеру wot/war thunder. Хочется поиграть на нормальной технике — качай всю предыдущую ветку. (если жалко времени или предыдущая техника принципиально не нравится — плати, переводи опыт).
Открыл новый танк — а он со стоковыми модулями (т.е., пушка, двигатель, рация, и вообще характеристики значительно хуже), страдай или снова плати, чтобы "проскочить" это состояние.
Жалко тратить 30 часов на прокачку? Плати за премиум и прокачивай за 20.
Дошёл до высокоуровневой техники — она неприбыльная, покупай прем или снова играй на низких уровнях.

Мало того, как бы грустно это не звучало, но кроме как максимализации цены использования авто в городе, проблему почти никак не решить. Да, в Москве просто по-идиотски настроены светофоры, и вполне могут гореть зеленым пустой дороге 3 минуты, а на дороге с пробкой выделяться 15 секунд. Но если это проблему исправить (а я все-таки надеюсь, что ее исправят), то просто авто пользоваться станет чуть выгоднее, что увеличит количество машин, что увеличит пробки.

Не в первый раз встречаю такую точку зрения, из которого почти всегда делают вывод о том, что автомобилистов надо угнетать. Хотя реальная проблема в другом — в неразвитом общественном транспорте.
Если путь из А в Б на общественном транспорте занимает 2 часа, то автомобилист будет готов эти два часа простоять в пробке — потому что сидеть в машине с кондиционером явно комфортнее, чем стоять в битком набитой электричке.


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

Как Вы думаете, насколько просто это написать и потом искать баги, возникновение которых будет зависеть от взаимного сочетания разнообразных логик?

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

А ещё win10 умеет просыпаться из спящего режима для установки обновлений. Отключается в настройках режима энергосбережения.

Можно вместо putFields просто писать данные в поток.


private fun writeObject(s : ObjectOutputStream) {
    s.putObject(strField as Any?)
    s.putInt(intFieldChanged)
  }

В этом случае имена полей не сохраняются, сохранённый класс будет занимать меньше места, а сериализация будет работать в несколько раз быстрее.
Конечно, я не призываю всё время делать так, но это очень удобная возможность: можно использовать сначала стандартную сериализацию, а потом при необходимости "ускорять" только медленные классы, не трогая всё остальное.

Поиграл немного, нашёл простую и эффективную стратегию, задолбался тыкать кнопочки, написал бота — он набрал 412830 очков за 21544 шага. Мог бы и дальше набирать, но стало лень ждать.


стратегия

двигать вверх, влево, вниз, вправо и так пока не надоест

Откуда у Вас столько мотивации? Иногда с кровати трудно встать, не то что делать игру после рабочего дня. У меня почему-то не получалось писать игры дольше 2-3 месяцев — разочаровываюсь в идее, возникает желание переделать и т.п.

Ого. Я с помощью глубины делал — но у меня "источник" был только один. Рисовал объекты уровня на глубине 0, а у четырёхугольников-теней две вершины имели z=-1, и такой четырёхугольник "перекрывал" все другие объекты. маленькое видео

При желании можно написать вершинный шейдер, который будет переводить (х, у) в полярные координаты, (r, phi) и использовать r как глубину. (Хотя у меня есть подозрение, что люди не заморачиваются и просто рисуют в 4 камеры с углом обзора 90 градусов каждая)

Information

Rating
1,829-th
Location
Белград, Сербия
Registered
Activity

Specialization

Software Developer, ML Engineer
Kotlin
Scala
Java
Python
Neural networks
Algorithms and data structures
Android development
OpenGL