• Как организовать хранение аудиофайлов для серверного проекта?

    @ArgosX
    1) Хранить аудио в папках, сохраняя значения путей в БД (Что на мой взгляд не правильно!)

    именно ваш взгляд не правильный
    Ответ написан
    9 комментариев
  • ПО для демонстрации услуги?

    NeiroNx
    @NeiroNx
    Программист
    Можно сделать вебстраницу. И на любом устройстве просто открыть браузер.
    Ответ написан
    Комментировать
  • Как браузеру прочесть минифицированный css файл?

    @ar2rsoft
    PHP-developer
    Форматирование нужно только человеку, браузер прекрасно все прочитает.

    Html тоже можно минифициолвать, удалить пробелы, табудяции
    Ответ написан
    2 комментария
  • Почему разработка на Java под Android считается "нативной", а на том же Dart нет?

    Beshere
    @Beshere
    Разработчик
    Dart - это замена Java Script. А Java - это Java, ей на замену Kotlin придумали.
    Ответ написан
    2 комментария
  • Какой способ подключения к БД на C# правильный?

    @kttotto
    пофиг на чем писать
    Все, что выполняет поставленную задачу - правильно. Все, что позволяет потом поддерживать и масштабировать код - еще правильней.

    В бизнес проектах через конструктор никто, конечно, код для бд не пишет. Чаще всего для мапинга с бд используют какую-нибудь ORM (EF, Dapper), руками пишут модели, которые потом будут мапиться на таблицы бд, прописывают их связи.
    Ответ написан
    3 комментария
  • List c# нужно найти не одинаковые элементы, как это сделать?

    @lil_Toady
    Думаю подойдет Except:
    var diff = current.Except(expected);

    Это выдаст элементы из current, которых нет в expected.

    Можно так же и в обе стороны, чтобы получить элементы которые не пересекаются из обоих списоков:
    var diff = current.Except(expected).Union(expected.Except(current));


    Если для сравнения элементов нужна какая-то особая логика, то нужно будет так же внедрить IEqualityComparer и передавать аргументом в Except.
    Ответ написан
    1 комментарий
  • Есть SIP приложение для Android работающее в фоновом режиме?

    a13xsus
    @a13xsus
    Lazy developer
    Скорее всего энергосберегающий режим убивает фоновые процессы (не xiaomi случайно?). Должно всё работать, по крайней мере у меня вот Zаdarma SIP и Linphone отлично работают в фоне.
    Ответ написан
    Комментировать
  • Веса номенклатурной группы, что это?

    Jump
    @Jump
    Системный администратор со стажем.
    я не представляю что может означать веса номенклатурной группы
    Ну так спросите у того, кто задал, что он имел ввиду.
    Можете к гадалкам обратится - это их профиль. Какой смысл такие вопросы на IT ресурсе задавать?

    В планировании закупок есть такое понятие как вес вхождения в группу, используется при детализации плана. А что такое "веса" вообще неизвестно, даже в словаре такого слова не нашел. Может весы? Хотя каким боком они могут относится к номенклатурной группе непонятно.
    Ответ написан
    2 комментария
  • Кто/Как отвечает за синхронизацию объявлений между “.cpp” и “.h” файлами?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Если функция объявлена, но не определена, то будет ошибка линковки. Если даже не определена, или нет подходящих сигнатур, то ошибка компиляции.

    За синхронизацию изменений отвечает сам программист. Помогать ему в этом могут разные средства разработки, например IDE. Многие IDE строят модель кода, и могут показывать сообщения об ошибках ещё до сборки программы. Помимо этого, IDE обычно предоставляют всевозможные варианты рефакторинга: хотите что-то переименовать, используйте соответствующую функциональность среды разработки. В этом случае, имя функции изменится корректно везде или почти везде.

    На практике, если вы что-то забыли, то получите ошибку сборки программы (на одном из этапов). Если проект большой и сложный, то он может и собраться, но работать очень неожиданным образом, например если линковщик нашёл где-то символы, но не там где нужно :)

    Ну и рекомендую почитать любую книгу по C++, всё что я написал выше, будет в первых главах книги.
    Ответ написан
    1 комментарий
  • Можно ли на nfc метку скопировать данные банковской карты для оплаты покупок?

    deepblack
    @deepblack
    Нет.

    No, you can't. To oversimplify - wireless payments (NFC, RFID chips on cards, etc) aren't a simple 'what's your card number' transaction (because that would be insecure beyond belief), they are more of a 'here, encrypt this block of data with your secret numbers and return it' type of thing.

    The block of data to be encrypted changes for each transaction, and there's (supposed to be) no way to get the device to spit out it's secret numbers.

    So you can't EASILY clone your cards onto your phone (if you could, then so could anyone else who walked near you).

    That's not to say it can't be done at all (if, perhaps, you found a flaw in the way the crypto works, you could perhaps deduce the secret numbers of a device), but it's not something you're going be buying an app for.

    https://android.stackexchange.com/questions/21982/...
    https://www.taptrack.com/article/blog/you-cant-cop...

    Но можно расковырять карту, вынуть чип с антенной и поместить это всё допустим в кольцо.
    5d175e9c6aec4798664584.jpeg

    https://www.instructables.com/id/RFID-NFC-Tap-and-...
    Ответ написан
    1 комментарий
  • Как пишутся низкоуровневые библиотеки?

    SagePtr
    @SagePtr
    Еда - это святое
    Не обязательно на ASM. Можно на C, главное как-нибудь дёргать системные вызовы (которые в зависимости от ОС отличаются, например, для Windows используется WinAPI).
    Ответ написан
    4 комментария
  • FreePBX как настроить запись разговоров, исходящая маршрутизация?

    @Igor2208 Автор вопроса
    Спасибо за помощь, решил все путем через extensions_override_freepbx.conf :
    exten =>recordcheck,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT},abi(LOCAL_MIXMON_ID)${MIXMON_BEEP},${MIXMON_POST})
    Заменил abi на ai (просто удалил символ b)
    Результатом буыл:

    exten => recordcheck,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT},ai(LOCAL_MIXMON_ID)${MIXMON_BEEP},${MIXMON_POST})

    2.)
    var\www\html\admin\modules\callrecording\functions.inc.php
    Find string

    $ext->add($context, $exten, ‘’, new ext_mixmonitor(’${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT}’,‘abi(LOCAL_MIXMON_ID)${MIXMON_BEEP}’,’${MIXMON_POST}’));

    Весь готовый контекст :
    [sub-record-check]
    include => sub-record-check-custom
    exten => s,1,GotoIf($[${LEN(${FROMEXTEN})}]?initialized)
    exten => s,n,Set(__REC_STATUS=INITIALIZED)
    exten => s,n,Set(NOW=${EPOCH})
    exten => s,n,Set(__DAY=${STRFTIME(${NOW},,%d)})
    exten => s,n,Set(__MONTH=${STRFTIME(${NOW},,%m)})
    exten => s,n,Set(__YEAR=${STRFTIME(${NOW},,%Y)})
    exten => s,n,Set(__TIMESTR=${YEAR}${MONTH}${DAY}-${STRFTIME(${NOW},,%H%M%S)})
    exten => s,n,Set(__FROMEXTEN=${IF($[${LEN(${AMPUSER})}]?${AMPUSER}:${IF($[${LEN(${REALCALLERIDNUM})}]?${REALCALLERIDNUM}:unknown)})})
    exten => s,n,Set(__MON_FMT=${IF($["${MIXMON_FORMAT}"="wav49"]?WAV:${MIXMON_FORMAT})})
    exten => s,n(initialized),Noop(Recordings initialized)
    exten => s,n,ExecIf($[!${LEN(${ARG3})}]?Set(ARG3=dontcare))
    exten => s,n,Set(REC_POLICY_MODE_SAVE=${REC_POLICY_MODE})
    exten => s,n,ExecIf($["${BLINDTRANSFER}${ATTENDEDTRANSFER}" != ""]?Set(REC_STATUS=NO))
    exten => s,n(next),GotoIf($[${LEN(${ARG1})}]?checkaction)
    exten => s,n(recorderror),Playback(something-terribly-wrong,error)
    exten => s,n,Hangup
    exten => s,n(checkaction),GotoIf($[${DIALPLAN_EXISTS(sub-record-check,${ARG1})}]?sub-record-check,${ARG1},1)
    exten => s,n,Noop(Generic ${ARG1} Recording Check - ${FROMEXTEN} ${ARG2})
    exten => s,n,Gosub(recordcheck,1(${ARG3},${ARG1},${ARG2}))
    exten => s,n,Return()

    exten => recordcheck,1,Noop(Starting recording check against ${ARG1})
    exten => recordcheck,n,Goto(${ARG1})
    exten => recordcheck,n(dontcare),Return()
    exten => recordcheck,n(always),Noop(Detected legacy "always" entry. Mapping to "force")
    exten => recordcheck,n(force),Set(__REC_POLICY_MODE=FORCE)
    exten => recordcheck,n,GotoIf($["${REC_STATUS}"!="RECORDING"]?startrec)
    exten => recordcheck,n,Return()
    exten => recordcheck,n(delayed),Noop(Detected legacy "delayed" entry. Mapping to "yes")
    exten => recordcheck,n(yes),ExecIf($["${REC_POLICY_MODE}" = "NEVER" | "${REC_POLICY_MODE}" = "NO" | "${REC_STATUS}" = "RECORDING"]?Return())
    exten => recordcheck,n,Set(__REC_POLICY_MODE=YES)
    exten => recordcheck,n,Goto(startrec)
    exten => recordcheck,n(no),Set(__REC_POLICY_MODE=NO)
    exten => recordcheck,n,Return()
    exten => recordcheck,n(never),Set(__REC_POLICY_MODE=NEVER)
    exten => recordcheck,n,Goto(stoprec)
    exten => recordcheck,n(startrec),Noop(Starting recording: ${ARG2}, ${ARG3})
    exten => recordcheck,n,Set(__CALLFILENAME=${ARG2}-${ARG3}-${FROMEXTEN}-${TIMESTR}-${UNIQUEID})
    exten => recordcheck,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT},abi(LOCAL_MIXMON_ID)${MIXMON_BEEP},${MIXMON_POST})
    exten => recordcheck,n,Set(__MIXMON_ID=${LOCAL_MIXMON_ID})
    exten => recordcheck,n,Set(__RECORD_ID=${CHANNEL(name)})
    exten => recordcheck,n,Set(__REC_STATUS=RECORDING)
    exten => recordcheck,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT})
    exten => recordcheck,n,Return()
    exten => recordcheck,n(stoprec),Noop(Stopping recording: ${ARG2}, ${ARG3})
    exten => recordcheck,n,Set(__REC_STATUS=STOPPED)
    exten => recordcheck,n,System(${AMPBIN}/stoprecording.php "${CHANNEL(name)}")
    exten => recordcheck,n,Return()
    exten => out,1,Noop(Outbound Recording Check from ${FROMEXTEN} to ${ARG2})
    exten => out,n,Set(RECMODE=${DB(AMPUSER/${FROMEXTEN}/recording/out/external)})
    exten => out,n,ExecIf($[!${LEN(${RECMODE})} | "${RECMODE}" = "dontcare"]?Goto(routewins))
    exten => out,n,ExecIf($["${ARG3}" = "never" | "${ARG3}" = "force"]?Goto(routewins))
    exten => out,n(extenwins),Gosub(recordcheck,1(${RECMODE},out,${ARG2}))
    exten => out,n,Return()
    exten => out,n(routewins),Gosub(recordcheck,1(${ARG3},out,${ARG2}))
    exten => out,n,Return()

    exten => in,1,Noop(Inbound Recording Check to ${ARG2})
    exten => in,n,Set(FROMEXTEN=unknown)
    exten => in,n,ExecIf($[${LEN(${CALLERID(num)})}]?Set(FROMEXTEN=${CALLERID(num)}))
    exten => in,n,Gosub(recordcheck,1(${ARG3},in,${ARG2}))
    exten => in,n,Return()

    exten => exten,1,Noop(Exten Recording Check between ${FROMEXTEN} and ${ARG2})
    exten => exten,n,Set(CALLTYPE=${IF($[${LEN(${FROM_DID})}]?external:internal)})
    exten => exten,n,ExecIf(${LEN(${CALLTYPE_OVERRIDE})}?Set(CALLTYPE=${CALLTYPE_OVERRIDE}))
    exten => exten,n,Set(CALLEE=${DB(AMPUSER/${ARG2}/recording/in/${CALLTYPE})})
    exten => exten,n,ExecIf($[!${LEN(${CALLEE})}]?Set(CALLEE=dontcare))
    exten => exten,n,GotoIf($["${CALLTYPE}"="external"]?callee)
    exten => exten,n,GotoIf($["${CALLEE}"="dontcare"]?caller)
    exten => exten,n,ExecIf($[${LEN(${DB(AMPUSER/${FROMEXTEN}/recording/priority)})}]?Set(CALLER_PRI=${DB(AMPUSER/${FROMEXTEN}/recording/priority)}):Set(CALLER_PRI=0))
    exten => exten,n,ExecIf($[${LEN(${DB(AMPUSER/${ARG2}/recording/priority)})}]?Set(CALLEE_PRI=${DB(AMPUSER/${ARG2}/recording/priority)}):Set(CALLEE_PRI=0))
    exten => exten,n,GotoIf($["${CALLER_PRI}"="${CALLEE_PRI}"]?${REC_POLICY}:${IF($[${CALLER_PRI}>${CALLEE_PRI}]?caller:callee)})
    exten => exten,n(callee),Gosub(recordcheck,1(${CALLEE},${CALLTYPE},${ARG2}))
    exten => exten,n,Return()
    exten => exten,n(caller),Set(RECMODE=${DB(AMPUSER/${FROMEXTEN}/recording/out/internal)})
    exten => exten,n,ExecIf($[!${LEN(${RECMODE})}]?Set(RECMODE=dontcare))
    exten => exten,n,ExecIf($["${RECMODE}"="dontcare"]?Set(RECMODE=${CALLEE}))
    exten => exten,n,Gosub(recordcheck,1(${RECMODE},${CALLTYPE},${ARG2}))
    exten => exten,n,Return()
    exten => conf,1,Noop(Conference Recording Check ${FROMEXTEN} to ${ARG2})
    exten => conf,n,Gosub(recconf,1(${ARG2},${ARG2},${ARG3}))
    exten => conf,n,Return()

    exten => page,1,Noop(Paging Recording Check ${FROMEXTEN} to ${ARG2})
    exten => page,n,GosubIf($["${REC_POLICY_MODE}"="always"]?recconf,1(${ARG2},${FROMEXTEN},${ARG3}))
    exten => page,n,Return()

    exten => recconf,1,Noop(Setting up recording: ${ARG1}, ${ARG2}, ${ARG3})
    exten => recconf,n,Set(__CALLFILENAME=${IF($[${CONFBRIDGE_INFO(parties,${ARG2})}]?${DB(RECCONF/${ARG2})}:${ARG1}-${ARG2}-${ARG3}-${TIMESTR}-${UNIQUEID})})
    exten => recconf,n,ExecIf($[!${CONFBRIDGE_INFO(parties,${ARG2})}]?Set(DB(RECCONF/${ARG2})=${CALLFILENAME}))
    exten => recconf,n,Set(CONFBRIDGE(bridge,record_file)=${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT})
    exten => recconf,n,ExecIf($["${ARG3}"!="always"]?Return())
    exten => recconf,n,Set(CONFBRIDGE(bridge,record_conference)=yes)
    exten => recconf,n,Set(__REC_STATUS=RECORDING)
    exten => recconf,n,Set(CDR(recordingfile)=${IF($[${CONFBRIDGE_INFO(parties,${ARG2})}]?${CALLFILENAME}.${MON_FMT}:${CALLFILENAME}.${MON_FMT})})
    exten => recconf,n,Noop(${MIXMONITOR_FILENAME})
    exten => recconf,n,Set(CHANNEL(hangup_handler_push)=sub-record-hh-check,s,1)
    exten => recconf,n,Return()

    exten => recq,1,Noop(Setting up recording: ${ARG1}, ${ARG2}, ${ARG3})
    exten => recq,n,Set(MONITOR_FILENAME=${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME})
    exten => recq,n,MixMonitor(${MONITOR_FILENAME}.${MON_FMT},${MONITOR_OPTIONS}${MIXMON_BEEP},${MIXMON_POST})
    exten => recq,n,Set(__REC_STATUS=RECORDING)
    exten => recq,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT})
    exten => recq,n,Return()

    exten => parking,1,Noop(User ${ARG2} picked up a parked call)
    exten => parking,n,Set(USER=${ARG2})
    exten => parking,n,ExecIf($[!${LEN(${ARG2})}]?Set(USER=unknown))
    exten => parking,n,Set(RECMODE=${DB(AMPUSER/${ARG2}/recording/out/internal)})
    exten => parking,n,ExecIf($[!${LEN(${RECMODE})}]?Set(RECMODE=dontcare))
    exten => parking,n,Gosub(recordcheck,1(${RECMODE},parked,${USER}))
    exten => parking,n,Return()

    ;--== end of [sub-record-check] ==--;
    Ответ написан
    Комментировать
  • Как сделать event в wpf асинхронным?

    cyber_roach
    @cyber_roach
    UX дизайнер INEDIapps
    Стандартные методы не подошли?
    https://docs.microsoft.com/ru-ru/dotnet/csharp/pro...
    Ответ написан
    Комментировать
  • Как программно менять очередь queue?

    @pcdesign Автор вопроса
    Если делать в рамках asterisk не выходя на уровень FreePBX

    exten => s,n,GotoIfTime(8:00-10:00|*|*|*?ext-queues,111111,1) ; утренняя очередь
    exten => s,n(final),Goto(ext-queues,222222,1) ; обычная очередь
    Ответ написан
    Комментировать
  • Как программно менять очередь queue?

    Создайте 2 очереди, создайте временные правила и заворачивайте в одну или вторую очередь
    https://voxlink.ru/kb/freepbx/freepbx-time-conditi...
    Ответ написан
    Комментировать
  • Xiaomi убивает мой сервис. Что делать?

    Zoominger
    @Zoominger
    System Integrator
    Создал сервис, в котором в OnDestroy запускаю его заново, тем самым сделав его бесконечным.

    Очевидно, что разные версии Андроида по-разному относятся к этому безобразию. Xiaomi, например, относится правильно.
    Ответ написан
    1 комментарий
  • Как реализовать асинхронный прием сокетов в C#?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Пытался читать документацию, но ничего не понял. Везде примеры классической реализации, где сервер ждет запроса от клиента, и отвечает на него. Мне же нужно наоборот, отправить с сервера запрос на клиент, и получить от него ответ.

    После того как соединение установлено сокеты на его концах абсолютно равноправны. Нет различия между клиентом и сервером. Делай сервер так, как делал бы клиента. Простейший вариант -- рождать отдельный поток для каждого соединения и делать в нём всё синхронно.
    Ответ написан
    Комментировать
  • Будет ли этот код использоваться при компиляции?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Препроцессор работает на 4-й стадии трансляции кода.
    Препроцессор оперирует напрямую строками модуля трансляции в виде блоков памяти.

    Описание твоего макроса показывает что хоть debug и принимает аргумент, но вне отладочной конфигурации он этим аргументом не оперирует. В любом месте обращения к твоему макросу произойдет подстановка NULL вместо всего обращения.

    На самом деле тебе и этот NULL в качестве подстановки не нужен. Зачем тебе в коде программы обилие висящих NULL? Если описать макрос так:
    #ifdef DEBUG
    #define debug(n) Serial.println("***"+String(n)+"***")
    #else
    #define debug(n)
    #endif

    то препроцессор будет просто затирать строку обращения к макросу.
    Ответ написан
    1 комментарий
  • Могут ли звонить SIP-пиры через IAX-канал?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Клиент A обращается к своему серверу A по SIP
    Сервер A вызывает сервер B по IAX
    Сервер B вызывает своего клиента B по SIP
    Всего навсего вопрос правильной маршрутизации/диалплана.
    Ответ написан
    1 комментарий