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

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Вопрос «от какой ветки» бессмысленен в Git, потому что ветки создаются только от какого-то коммита.
    И тут нет такого маразма, как в Mercurial, что каждый коммит намертво привязан к какой-то ветке.
    Вот типичная ситуация:
    A - B - C - - - - J     [master]
         \
          D - E - F - G     [branch-A]
               \
                H - - I     [branch-B]

    А чтобы найти начало ветки, нужно определиться, какую другую ветку мы хотим считать родительской.
    Тогда первый общий коммит находится легко, как мы видим на примере работы GitHub.

    Например так
    diff -u <(git rev-list --first-parent child_branch) <(git rev-list --first-parent parent_branch) | sed -ne 's/^ //p' | head -1
    Ответ написан
    Комментировать
  • Какой самый оптимальный способ ввести тестирование в готовый проект?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Баги в готовом функционале называются регрессом, соответственно нужно регрессионное тестирование. А какие слои приложения при этом нужно проверять - ну это от архитектуры приложения зависит. Любой слой может сломаться, после внесения изменений, значит по уму надо все слои проверять на регресс. Но на это жизни не хватит. Значит нужно сконцентрироваться для начала на ключевых самых жизненно важных проверках. Да, все функции жизненно важные, но например если корень апишки не отвечает то это суровее чем если не отвечает какой-то один ресурс. Раскидайте по рискам, и по этой иерархии покрывайте. Риск это насколько огромным будет WTF у пользователя если эта штука отвалится.
    Ответ написан
    Комментировать
  • Можно ли как то определить фамилию или имя определенными правилами?

    Adamos
    @Adamos
    https://github.com/seagullua/NameCaseLib - умеет в том числе и определять предполагаемые части ФИО
    Ответ написан
    Комментировать
  • Можно ли как то определить фамилию или имя определенными правилами?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    берете список русских имен, добавляете нужные национальные.
    Тоже самое с фамилиями.

    По именам получается 300-400
    По фамилиям я думаю 10 000 - 20 000

    Делаете сугрессор на вводе, плюс то что будут отсекаться опечатки сразу.
    Если форма не прошла хоть одно поле выводите сообщение мол точно уверены?

    Дальше по существующим контактам.

    У меня было такое код разбивал строчку по пробелам, и выводил первое и последнее значение.
    В некоторых случаях получалось неправильно.
    Пример John Deere MD.
    Я просто из базы в 2 миллиона выдернул приставки, отбросив нормальные имена.
    Получилось порядка 200 записей, все эти 200 записей были описаны 12 правилами реплайса.
    Ответ написан
    Комментировать
  • Можно ли как то определить фамилию или имя определенными правилами?

    New_Horizons
    @New_Horizons
    Бред:
    Посмотри сервис dadata, у них вроде есть нормализация какая-то
    Ответ написан
    4 комментария
  • Как вынуть публичный ключ из сертификата, для дальнейшей подписи и шифрования данных через библиотеку CryptoAPI?

    udjin123
    @udjin123
    PHP, Golang, React
    В КриптоПро SDK есть хорошие примеры работы с подписями на C++. Мне когда то очень помогли, когда в Golang делал работу с ЭЦП. Пришлось вставки на Си делать. Посоветую скачать и изучить.

    Вот пример от туда - открывается хранилище, получается сертификат, далее получает ссылку на закрытый ключ ну и создание и подписание хеша

    #pragma warning(disable : 4996)
    
    #include <iterator>
    #include <vector>
    #include <iostream>
    #include <wchar.h>
    
    #ifdef _WIN32
    #include <tchar.h>
    #else
    #include <cstdio>
    #include "reader/tchar.h"
    #endif
    
    #include "cades.h"
    
    /*
    Пример создания усовершенствованной подписи CADES_X_LONG_TYPE_1 с помощью
    упрощённых функций КриптоПро ЭЦП SDK по хэш-значению. Пример подписывает
    произвольные данные, которые формирует самостоятельно. Результат будет сохранен
    в файл sign.dat. Для подписи необходимо чтобы в хранилище сертификатов
    присутствовал сертификат с закрытым ключом и ссылкой на работающую OCSP службу
    */
    
    using namespace std;
    
    #include "../samples_util.h"
    
    int main(int argc, char *argv[]) {
        // Открываем хранилище сертификатов пользователя
        HCERTSTORE hStoreHandle = CertOpenSystemStore(0, _TEXT("MY"));
    
        if (!hStoreHandle) {
            cout << "Store handle was not got" << endl;
            return -1;
        }
    
        wchar_t *wa = NULL;
        if (argc > 1) {
            size_t len = strlen(argv[1]) + 1;
            wa = new wchar_t[len];
            mbstowcs(wa, argv[1], len);
        }
    
        // Получаем сертификат для подписания
        PCCERT_CONTEXT context = GetRecipientCert(hStoreHandle, wa);
        if (wa) delete[] wa;
    
        // Если сертификат не найден, завершаем работу
        if (!context) {
            cout << "There is no certificate with a CERT_KEY_CONTEXT_PROP_ID "
                 << endl << "property and an AT_KEYEXCHANGE private key available."
                 << endl
                 << "While the message could be sign, in this case, it could"
                 << endl << "not be verify in this program." << endl
                 << "For more information, read the documentation "
                    "http://cpdn.cryptopro.ru/" << endl;
            return -1;
        }
    
        HCRYPTPROV hProv(0);
    
        DWORD dwProvType = PROV_GOST_2012_256;
    
        // Получаем ссылку на закрытый ключ сертификата и дестриптор
        // криптопровайдера
        if (!CryptAcquireContext(&hProv, 0, NULL, dwProvType,
                                 CRYPT_VERIFYCONTEXT)) {
            CertFreeCertificateContext(context);
            cout << "CryptAcquireContext() failed" << endl;
            return -1;
        }
    
        // Задаем параметры
        CRYPT_SIGN_MESSAGE_PARA signPara = {sizeof(signPara)};
        signPara.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
        signPara.pSigningCert = context;
        signPara.HashAlgorithm.pszObjId = (LPSTR)szOID_CP_GOST_R3411_12_256;
    
        CADES_SIGN_PARA cadesSignPara = {sizeof(cadesSignPara)};
        cadesSignPara.dwCadesType = CADES_BES;
    
        CADES_SIGN_MESSAGE_PARA para = {sizeof(para)};
        para.pSignMessagePara = &signPara;
        para.pCadesSignPara = &cadesSignPara;
    
        // Формируем данные для подписания
        vector<unsigned char> data(10, 25);
    
        CERT_CHAIN_PARA		ChainPara = { sizeof(ChainPara) };
        PCCERT_CHAIN_CONTEXT	pChainContext = NULL;
    
        std::vector<PCCERT_CONTEXT> certs;
    
        if (CertGetCertificateChain(
            NULL,
            context,
            NULL,
            NULL,
            &ChainPara,
            0,
            NULL,
            &pChainContext)) {
    
            for (DWORD i = 0; i < pChainContext->rgpChain[0]->cElement - 1; ++i)
            {
                certs.push_back(pChainContext->rgpChain[0]->rgpElement[i]->pCertContext);
            }
        }
        // Добавляем в сообщение цепочку сертификатов без корневого
        if (certs.size() > 0)
        {
            signPara.cMsgCert = (DWORD)certs.size();
            signPara.rgpMsgCert = &certs[0];
        }
    
        // Получение хэша данных
        HCRYPTHASH hash(0);
        if (!CryptCreateHash(hProv, CALG_GR3411_2012_256, 0, 0, &hash)) {
            CryptReleaseContext(hProv, 0);
            CertFreeCertificateContext(context);
            cout << "CryptCreateHash() failed" << endl;
            return -1;
        }
    
        DWORD cbToBeSigned(0);
        DWORD cb = sizeof(cbToBeSigned);
        BYTE *pbToBeSigned;
    
        switch (CryptHashData(hash, &data[0], (DWORD) data.size(), 0)) {
            case TRUE:
                if (!CryptGetHashParam(hash, HP_HASHSIZE, (LPBYTE) &cbToBeSigned, &cb,
                                       0)) {
                    CryptReleaseContext(hProv, 0);
                    CertFreeCertificateContext(context);
                    CryptDestroyHash(hash);
                    cout << "CryptGetHashParam() failed" << endl;
                    return -1;
                }
    
                pbToBeSigned = new BYTE[cbToBeSigned];
    
                if (!CryptGetHashParam(hash, HP_HASHVAL, pbToBeSigned, &cbToBeSigned,
                                       0)) {
                    delete[] pbToBeSigned;
                    CryptReleaseContext(hProv, 0);
                    CertFreeCertificateContext(context);
                    CryptDestroyHash(hash);
                    cout << "CryptGetHashParam() failed" << endl;
                    return -1;
                }
                break;
            default:
                CryptReleaseContext(hProv, 0);
                CertFreeCertificateContext(context);
                CryptDestroyHash(hash);
                cout << "CryptHashData() failed" << endl;
                return -1;
        }
    
        PCRYPT_DATA_BLOB pSignedMessage = 0;
    
        string contentType(szOID_RSA_data);
    
        // Создаем подписанное сообщение
        if (!CadesSignHash(&para, pbToBeSigned, cbToBeSigned, contentType.c_str(), &pSignedMessage)) {
            delete[] pbToBeSigned;
            CryptReleaseContext(hProv, 0);
            CertFreeCertificateContext(context);
            CryptDestroyHash(hash);
            cout << "CadesSignHash() failed" << endl;
            return -1;
        }
    
         delete[] pbToBeSigned;
    
        vector<unsigned char> message(pSignedMessage->cbData);
        copy(pSignedMessage->pbData,
             pSignedMessage->pbData + pSignedMessage->cbData, message.begin());
    
        // Сохраняем результат в файл sign.dat
        if (SaveVectorToFile<unsigned char>("sign.dat", message)) {
            CryptReleaseContext(hProv, 0);
            CertFreeCertificateContext(context);
            CryptDestroyHash(hash);
            cout << "CryptHashData() failed" << endl;
            cout << "Signature was not saved" << endl;
            return -1;
        }
    
        cout << "Signature was saved successfully" << endl;
    
        // Освобождаем структуру с закодированным подписанным сообщением
        if (!CadesFreeBlob(pSignedMessage)) {
            CryptReleaseContext(hProv, 0);
            CertFreeCertificateContext(context);
            CryptDestroyHash(hash);
            cout << "CadesFreeBlob() failed" << endl;
            return -1;
        }
    
        // Закрываем хранилище
        if (!CertCloseStore(hStoreHandle, 0)) {
            CryptReleaseContext(hProv, 0);
            CertFreeCertificateContext(context);
            CryptDestroyHash(hash);
            cout << "Certificate store handle was not closed." << endl;
            return -1;
        }
    
        // Освобождаем ресурсы
        CryptReleaseContext(hProv, 0);
        CertFreeCertificateContext(context);
        CryptDestroyHash(hash);
    
        return 0;
    }
    Ответ написан
    2 комментария
  • Существует ли в Yii2 Behaviour изменяющий SELECT запрос в бд?

    Могу ошибаться, но кажется как то так
    public function actions()
        {
            $actions = parent::actions();
            $actions['index']['prepareDataProvider'] = [$this, 'prepareDataProvider'];
    
            return $actions;
        }
    
        public function prepareDataProvider()
        {
            return new ActiveDataProvider([
                'query' => MyModel::find()->andWhere(['some_field' => $fieldValue])
            ]);
        }
    Ответ написан
    2 комментария
  • Можно ли использовать модели из Yii2 в данном случае?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Второй вариант. Примеры на гитхаб
    Ответ написан
    Комментировать
  • Можно ли использовать модели из Yii2 в данном случае?

    @iproman
    Пишу на всём что движется.
    Есть наверное 2 пути, как я делаю с angular, думаю схоже и с vue.
    1. Yii2 отдает с помощью api результаты и далее уже работа отдельно на внешке angular'а
    2. Встраивать angular в виды yii2, контроллеры, стили и тд.

    И там и там есть свои плюсы, но мне по душе, 1 вариант.

    Создал по быстрому rest контроллеры, модели с связями, тесты с фикстурами, и полетело. Если нужно переопределяешь/создаешь действия помимо default crud.

    И ловишь это всё на фронте angular, и разруливаешь где какие данные нужны через сервисы с запросами на backend.

    Не ищи готовое, попробуй написать сам. И поймешь как, что, с чем варить, и прочие нюансы, которые при копировании не уловить.
    Ответ написан
    Комментировать
  • Почему не получается выполнить запрос к API Вконтакте?

    Dyaminigo
    @Dyaminigo
    Ну, в ошибке всё ясно сказано. Если же приложение, как Вы уверены, всё-таки существует и активно, тогда попробуйте:
    • Проверить доступность приложения, перейдя по ссылке вида vk.com/appXXX, где XXX — идентификатор проблемного приложения;
    • Убедиться, что Вы не ошиблись с ID приложения в client_id в API-запросе;
    • Удалить/забить на данное приложение, создать новое и использовать его.
    Ответ написан
    Комментировать
  • Можно ли нормально устроиться в сферу 1С, не имея опыта работы, и не имея высшего образования?

    @Dementor
    программист, архитектор, аналитик
    Чего вы боитесь? Составьте список интересующих вас по деньгам/плюшкам компаний и начинайте ходить по собеседованиям, где рассказывайте какой вы классный парень. Где-нибудь да зацепитесь. С опытом сможете сменить место работы.

    Фильтр по хардскилам (наличие вышки, оконченные курсы и т.д.) можно пробить крепкими софтскилами. Распространенная болезнь программистов - это боязнь прямого общения. Во многих технических компаниях ценятся люди, которые пусть и не гуру, но умеют слушать и "слышать" клиента, переводя их пожелания в ТЗ для своих коллег.
    Ответ написан
    Комментировать
  • Можно ли нормально устроиться в сферу 1С, не имея опыта работы, и не имея высшего образования?

    @Marat_Kh
    Сталкивался с организациями, где не требовали высшее образование, но там тесты. То есть, что-то надо знать.
    Ответ написан
    2 комментария
  • Можно ли нормально устроиться в сферу 1С, не имея опыта работы, и не имея высшего образования?

    @aru001
    Мелкие франчайзи часто набирают сотрудников без опыта, с минимальными знаниями. Можно устроится в такую компанию на какое то время, набраться опыта, и искать фирму по лучше.
    Ответ написан
    Комментировать
  • Как получить ID только что созданной записи (Laravel)?

    @otjog
    Если в таблице есть автоинкрементный ID, используйте метод insertGetId() для вставки записи и получения её ID:
    $id = DB::table('users')->insertGetId(
              ['email' => 'john@example.com', 'votes' => 0]
    );
    Ответ написан
    1 комментарий
  • Как обновить в торговом каталоге коэффициент единицы измерения?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    ProductTable::update должен возвращать объект класса Result. Посмотрите что в нём

    $updateResult = \Bitrix\Catalog\ProductTable::update(19612, Array('RATIO' => 2)); 
    
    print_r($updateResult);
    Ответ написан
    2 комментария
  • Как в PHP закрыть доступ к скрипту?

    Воу воу. В index.php создайте константу которую будете проверять, и после во всех подключаемых файлах проверяйте ее.

    // index.php - до подключения других файлов
    define('MY_CONSTANT', TRUE);


    // во всех подключаемых файлах делайте проверку
    <?php
    if (!defined('MY_CONSTANT')) exit('No direct script access allowed.');
    
    class MY_Class {
    ....
    }


    п.с. не посмотрел дату вопроса)) но может пригодится
    Ответ написан
    Комментировать
  • Как преобразовать правильный timestamp у vk?

    DevMan
    @DevMan
    это пхпешный таймстамп, прост умножте его на 1000.
    https://jsfiddle.net/qhj36uoL/
    Ответ написан
    1 комментарий