Задать вопрос
  • Как автоматически реализовать некие методы для всех типов, реализующих некий трейт?

    1. Можно создать новый трейт, который будет расширять стандартный:
    use std::io::Read;
    
    trait ReadOneByte: Read {
        fn read_one_byte(&mut self) -> Option<u8>;
    }
    
    impl<T: Read> ReadOneByte for T {
        fn read_one_byte(&mut self) -> Option<u8> {
            let mut buf = [0u8];
            match self.read(&mut buf) {
                Ok(count) if count == 1 => Some(buf[0]),
                _ => None,
            }
        }
    }


    2. А вообще-то лучше использовать обычные функции:
    fn read_one_byte<T: Read>(source: &mut T) -> Option<u8> {
        let mut buf = [0u8];
        match self.read(&mut buf) {
            Ok(count) if count == 1 => Some(buf[0]),
            _ => None,
        }
    }
    Ответ написан
    8 комментариев
  • Математически доказанная безопасность Rust - это как?

    Tyranron
    @Tyranron
    Процитирую humbug из комментов к недавней статье:

    Конкретно в https://people.mpi-sws.org/~dreyer/papers/rustbelt... формально доказывается, что система типов Раста, владение, заимствование и прочее — корректны. Доказывается, что программа безопасна, если написана на безопасном подмножестве Раст. Доказывается, что программа безопасна, если в ней есть вкрапления unsafe, в которых программист не допустил ошибки, UB.

    Кроме того, проект RustBelt на текущем этапе занимается формальной верификацией библиотеки std, но полная проверка требует времени. Поэтому библиотеку проверяют по кускам. Да, были найдены и исправлены 2 ошибки в unsafe коде (что показывает, что ребята делом занимались), тем не менее все эти thread, mutex, Arc/Rc формально безопасны.


    Собственно, сами математические доказательства смотрите в научных публикациях:
    RustBelt: Securing the Foundations of the Rust Pro...
    KRust: A Formal Executable Semantics of Rust
    K-Rust: An Executable Formal Semantics for Rust

    Сайт проекта RustBelt: plv.mpi-sws.org/rustbelt
    Ответ написан
    Комментировать
  • Rust подходит для новичка?

    Zoominger
    @Zoominger
    System Integrator
    Норм, простой и понятный язык:
    fn bar<'a>(p: &'a int) -> &'a int {
        return p;
    }

    Видите, как всё просто?
    Ответ написан
  • Почему говорят, что C# не подходит для WEB?

    Griboks
    @Griboks Куратор тега C#
    Отлично подходит, если руки из того места растут.
    Ответ написан
    Комментировать
  • Почему говорят, что C# не подходит для WEB?

    zorca
    @zorca
    C# не подходит для БЫСТРОЙ РАЗРАБОТКИ под WEB
    Ответ написан
    10 комментариев
  • Как и в каких случаях использовать DI в Yii2?

    SamDark
    @SamDark
    Yii2 core team
    DI именно в вашем случае не при чём. Это способ реализации, а не сама идея. Идея состоит в том, что вам нужно реализовать принцип инверсии зависимостей. То есть начать работать с интерфейсами, а не с конкретными реализациями.

    Чтобы быть универсальным и переносимым, модуль не должен знать о моделях извне себя. Вместо этого он должен выражать свои требования в виде интерфейса, а внешние модели этот интерфейс должны реализовывать.

    Для вашего примера делаем в модуле Article делаем интерфейсы:

    interface ArticleInterface
    {
        public function getTitle();
        public function getAuthor();
    }
    
    interface ArticleAuthorInterface
    {
        public function getName();
        public function getID();
    }


    Далее в пределах модуля используем только интерфейсы, а не сами модели:

    public function renderArticle(ArticleInterface $article)
    {
        return $this->renderPartial('_article', [
             'author' => $article->getAuthor(), 
             'title' => $article->getTitle()
        ]);
    }


    Вне модуля нам придётся реализовать интерфейсы в моделях:

    class Article extends ActiveRecord implements ArticleInterface
    {
       // ...
    }
    Ответ написан
    34 комментария
  • Как сделать подключение к базе 1С из PHP?

    shogunkub
    @shogunkub
    Программист+Инженер-электронщик
    Во-первых, неплохо бы версию 1С озвучить. Если это 8, то рекомендую поковырять в сторону Web-сервисов: v8.1c.ru/overview/Term_000000273.htm
    Если хотите работать напрямую с БД — то во-первых проблема с тем, что СУБД далеко не одна, в случае 8.2 может быть аж 5 различных:
    — MS SQL
    — PostgreSQL
    — IBM DB2
    — Oracle
    — Файловый вариант(собственный формат)
    С последним практически нереально работать напрямую, с остальным — в принципе возможна прямая работа, но курить придётся много — официальной документации по устройству таблиц нет. Хотя есть внутренний метод GetDBStorageStructureInfo(), который поможет несколько прояснить картину.
    В случае 7.7 всё с одной стороны сложней, с другой проще. Сложней — потому что современных средств интеграции нет, проще — потому что устройство таблиц давно расковыряли и документация есть вполне подробная: www.script-coding.com/v77tables.html
    Ну и вариантов СУБД меньше — DBF и MSSQL, других вариантов нет.
    Ответ написан
    Комментировать
  • VueJS + PHP. Как это всё подружить?

    be_a_dancer
    @be_a_dancer
    Backend/Fullstack Developer
    Рекомендую посмотреть, как это дело реализовано в Laravel, который по умолчанию содержит готовый и настроенный Vue.js модуль и тесную с ним интеграцию.
    Разделять стоит, хотя это и не обязательно.
    А почему именно PHP? Ты же знаешь JS. Можешь на ноде поднять свой сервер.
    Ответ написан
    8 комментариев
  • VueJS + PHP. Как это всё подружить?

    @marsdenden
    vue-router сам по себе, роутер на php - сам по себе, никак между собой не связаны. Если от бэкенда нужны только данные и никакого дополнительного функционала, я бы попробовал сделать сервер на ноде, благо модули готовые есть, по крайней мере писать на одном языке проще и эффективнее, чем на двух (имхо). А так все просто - фронт использует axios, в который передается url, параметры и callback для обработки ответа. Бэк обрабатывает вызов и отправляет JSON с данными и на этом его миссия закончилась, фронт в колбэке получает json и делает свое дело.
    Например, как я это сделал (метод - всегда POST)

    в App.vue в methods
    callApi(url,prms,callback){
      this.setServerError('',''); // это функция, которая в data выставляет определенные поля
      //в результате чего ошибки выводятся прямо на странице, удобно для отладки
      axios({
        method:"post",
        url:url,
        data:prms
      }).then((response) => {
        // в response.data получаем JSON, 
        // в моем случае сервер формирует обязательные поля success,error,buffer
        // в buffer  перед выдачей JSON снимается html-вывод, возможно это отладочная информация,
        // которую выдает backend, возможно PHP-warnings
        let dt=response.data;
        if(!dt.success){
           	this.setServerError(dt.error,dt.buffer);
        }else{
            // ну и, собственно, сам вызов колбека, который происходит только в случае успешного приема данных
            callback(dt);
        }
      }).catch((error) => {
        // эту часть вызывает сам axios при возникновении серверных ошибок, то есть все, что не 200 OK 
        // позволяет увидеть, в частности, ошибку 500, вернее сам факт ее возникновения, если она обрабатывается
        // "стандартным" методом апача - пустая страница и все
        this.setServerError(error.message,error.stack);
      });
    },



    далее в created создается подписка, можно использовать Bus.js, у меня по другому

    this.$root.$on('callApi',(url,prms,callback)=>{this.callApi(url,prms,callback)});


    ну и в компоненте или где еще в проекте делается вызов

    this.$root.$emit('callApi', '/api/goods', {action: 'getgoodsinfo', article: '12345678'}, (dt) => {
             this.articleinfo=dt.data.articleinfo;
          })


    на бэкэнде, соответственно, есть api.php, в котором происходит разбор url, чтение параметров и формирование результата

    заготовка api.php
    <?php
    // регистрируем функцию завершения, чтобы обрабатывать грубые ошибки, 
    //например вызов несуществующего метода у объекта
    register_shutdown_function(function () {
        $error = error_get_last();
        if ($error && ($error['type'] == E_ERROR || $error['type'] == E_PARSE || $error['type'] == E_COMPILE_ERROR)) {
            $res=array(
                'buffer'=>ob_get_contents(),
                'success'=>false,
                'error'=>"PHP Fatal: ".$error['message']." in ".preg_replace('/(.*)\/(.*)/', "$2", $error['file']).":".$error['line']
            );
            ob_clean();
            header('HTTP/1.1 200 Ok');
            header("Access-Control-Allow-Origin: *");
            echo json_encode($res);
            // ... завершаемая корректно ....
        }
    });
    
    // для кроссдоменного CORS, при необходимости - закомментировать или заменить звездочку на требуемое
    if($_SERVER['REQUEST_METHOD']=='OPTIONS' ){
        ob_clean();
        header("Access-Control-Allow-Origin: *");
        header("Content-type: application/json; charset=utf-8");
        header("Access-Control-Allow-Headers: X-Requested-With, Content-Type");
        header("Access-Control-Request-Method: POST");
        return true;
    }
    
    // /*
    // протокол обмена
    // - вход - команда по сегменту, например http://site.ru/api/goods - api - попали сюда, goods - команда REST
    // в php://input должен быть json, в котором обязателен параметр action, например getgoodsinfo
    // в результате формируется имя функции класса goods_getgoodsinfo, которая вызывается 
    // с параметром входящего json
    
    // функция класса должна вернуть массив с тремя полями - data & success & error
    // в поле data возвращается непосредственно результат функции, в нашем случае - реестр чеков
    // в поле success возвращается true | false - признак успешного выполнения
    // в поле error возвращается описание ошибки в случае неудачного выполнения функции
    // */
    
    $api=new ApiCls();
    
    // функция, проверяющая залогиненность юзера
    if(is_user_login()){ 
        $api->checkcommand();
    }else{
        $res=array('succes'=>false,'error'=>'Пользователь не авторизован','data'=>'');
        ob_clean();
        header("Content-type: application/json; charset=utf-8");
        header("Access-Control-Allow-Origin: *");
        header("Access-Control-Allow-Headers: X-Requested-With, Content-Type");
        echo json_encode($res);
    }
    
    return true;
    
    class ApiCls{
        function checkcommand(){ // точка входа для класса api, здесь первичный разбор, 
            //вызов метода и возврат результата
            // главное - определить второй сегмент в url, то есть в случае http://site.ru/api/goods
            $segment=????????; // в $segment должен оказаться 'goods'
    
            $res=array('success'=>false,'error'=>'Empty action'); // сразу проверка на наличие action в параметрах
            if(!$segment){
                $res['error']='Empty command';
            }else{
                if($_SERVER['REQUEST_METHOD']=='PUT' || $_SERVER['REQUEST_METHOD']=='POST'){
                    $reqdata = file_get_contents('php://input'); 
                    $b=json_decode($reqdata);
                    $b=get_object_vars($b);
                    if(isset($b['action'])){
                        $res['error']='no error';
                        $nm=$segment.'_'.$b['action'];
                        $r=$this->$nm($b); // вызов метода по action из пост и дальнейшая обработка результатов
                        // чё-то тут намутил, но работает - и ладно
                        if(!isset($r['success'])){
                            $res['success']=false;
                            $res['error']='No success flag in method '.$nm;
                        }else{
                            if(!isset($r['data'])){
                                $res['success']=false;
                                $res['error']='No result data in method '.$nm;
                            }else{
                                $res['success']=$r['success'];
                                $res['data']=$r['data'];
                                if(!$r['success']){
                                    if(isset($r['error'])){
                                        $res['error']=$r['error'];
                                    }else{
                                        $res['error']='Success is false, but no error message in method '.$nm;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            // непосредственная выдача данных
            $this->_printresponse($res);
        }
        function _printresponse($res){
            // проверяем наличие html-вывода (отладка или warnings)
            $res['buffer']=ob_get_contents();
            if($res['buffer']!=''){
                $res['success']=false;
                isset($res['error'])?$res['error']=implode(',',array('module error',$res['error'])):$res['error']='module error';
            }
            // очищаем буфер вывода и формируем свои заголовки
            ob_clean();
            header("Content-type: application/json; charset=utf-8");
            header("Access-Control-Allow-Origin: *");
            header("Access-Control-Allow-Headers: X-Requested-With, Content-Type");
            // ну и, наконец, выдаем результирующий JSON
            echo json_encode($res);
        }
        function __call($name,$post){
            // эта функция вызывается при попытке вызвать несуществующий метод класса, то есть при вызове '/api/blablabla' получим отлуп
            $info=array('method'=>$name,'post'=>$post,'error'=>'Method not found','success'=>false);
            return $info;
        }
        /*********************************************************/
        // начинаем блок методов api
        function goods_getgoodsinfo($prm){
            // формируем заготовку ответа
            $res=array('data'=>array(),'success'=>true,'error'=>'');
            // при необходимости здесь можно вставить проверку наличия полномочий у пользователя
            // и если что не так, то выключить success, прописать "облом!" в error и не возвращать данные
            $res['data']['articleinfo']= getArticleInfo($prm['article']); // вызов функции, 
            //которая собирает требуемые данные для определенного артикула и возвращает, опять же
            // в формате JSON
            return $res;
        }
    }
    ?>



    Вот как-то так... Дальше только вопрос - как прикрутить этот api.php к сайту и вопросы безопасности, но это уже другая тема
    Ответ написан
    1 комментарий
  • Как не тратить ресурс SSD на просмотр видео на YouTube?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Смотрите, можно так, хотя сам не сильно пробовал (переносил биткойн так):
    + почищаем всю апдата (или смотрим, где храниться кеш, посмотреть можно мониторищями утилитами на открытые handle файлов), однако здесь может быть трабла, что кто-то захочет файлы там, так что мб надо с live cd
    + монтируем раздел к AppData
    + !?!?
    + Профит
    Ответ написан
    Комментировать
  • Как не тратить ресурс SSD на просмотр видео на YouTube?

    XXX
    @XXX
    Решение где-то рядом
    @212th есть еще portable версии, которые хранят кеш в каталоге рядом с собой. Просто закините свой браузер на HDD. Например, вот Chrome (portableapps).
    Ответ написан
    1 комментарий
  • Какая админ-панель в Ruby on rails?

    POS_troi
    @POS_troi
    СадоМазо Админ, флудер, троль.
    Какую напишите такая и будет :)
    Ответ написан
    4 комментария
  • JSON тип данные в MySQL, в чем минус?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    JSON тип данные в MySQL, в чем минус?
    Основных минусов на мой взгляд несколько:
    0. Это MySQL (который в свою очередь стандарты SQL никогда особо не жаловал)
    1. JSON в MySQL - имеет не бинарный формат и не индексируется (ну разве что как текст?)
    2. В SQL-2016 появилась спецификация для нормальной работы с JSON и когда она будет реализована в MySQL (и будет ли реализована вообще когда-нибудь, с учётом того, что они и куда более старые стандарты реализовать не могут) - неизвестно
    3. и т.д.

    но мне интересно..в чем-то вредно использовать JSON тип данные? например при запросе в БД замедляет скорост работу?
    Нет, Вы же только что сами сказали, что:
    Я пробовал использовать JSON тип данные MySQL...вроде все в порядке.
    :)))

    я использовал жсон в место таблица релешин....то есть например в таблица постов есть поля категории и все категории в одном ячейке в формат жсон сохранено...
    Мне кажется, тут вообще вопрос в JSON'е не стоит ни разу... Глядя на то, как Вы обращаетесь с данными... При таком обращении с ними (данными) - по моему, вообще нет никакой разницы, что там будет, JSON или XML или ещё что-нибудь...
    Ответ написан
  • Как связать Vue.js с php?

    nexmean
    @nexmean
    погромист
    >Или лучше связать front с backend через ajax запросы к api?
    This.
    Ответ написан
    Комментировать
  • Sublime Text. Куда пропали команды Package Control?

    @Pega
    Preferences -> Settings-Users
    Проверьте что в ignored_packages нет Package Control
    Ответ написан
    6 комментариев
  • Что делать,если в вузе требуется изучать один язык програмирования,а тем временем ты изучаешь другой?

    delphinpro
    @delphinpro
    frontend developer
    я сейчас чувствую себя Капитаном очевидность, но тем не менее - ИЗУЧАТЬ НУЖНО ПРОГРАММИРОВАНИЕ, а не язык программирования. Так что что вам преподают в вузе -
    не особо-то и важно
    Ответ написан
  • Как синхронизируются потоки на низком уровне?

    @Mercury13
    Программист на «си с крестами» и не только
    Этого мало.
    Первое. Нужны особые операции, которые гарантированно выполняются атомарно. Например (из исходников Delphi)
    function InterlockedAdd(var Addend: Integer; Increment: Integer): Integer;
    asm
          MOV   ECX,EAX
          MOV   EAX,EDX
     LOCK XADD  [ECX],EAX
          ADD   EAX,EDX
    end;

    Здесь префикс LOCK (блокирование шины) и даёт атомарность. Также используют операцию XCHG (exchange) — единственная атомарная без префикса LOCK.

    На основе этого можно устроить объект, который называется spinlock. Крутим цикл, пока система не скажет: свободно. Из Википедии.
    mov eax, spinlock_address
    mov ebx, SPINLOCK_BUSY
    
    wait_cycle:
    xchg [eax], ebx  ; xchg - единственная инструкция, являющаяся атомарной без префикса lock
    cmp ebx, SPINLOCK_FREE
    jnz wait_cycle
    
    ; < критическая секция захвачена данным потоком, здесь идёт работа с разделяемым ресурсом >
    
    mov eax, spinlock_address
    mov ebx, SPINLOCK_FREE
    xchg [eax], ebx  ; используется xchg для атомарного изменения
    ; последние 3 инструкции лучше заменить на mov [spinlock_address], SPINLOCK_FREE -
    ; это увеличит скорость за счёт отсутствия лишней блокировки шины, а mov и так выполнится атомарно
    ; (но только если адрес spinlock_address выровнен по границе двойного слова)


    От спинлока до настоящего мьютекса остаётся один небольшой шаг. Спинлок потребляет ресурс процессора, не производя полезной работы. После того, как спинлок проработал несколько микросекунд и не освободился, мы говорим: не судьба — и передаём работу другому процессу. Надеюсь, вы в своей мини-ОС как-то научились переключать процессы.

    В однопроцессорном ядре никаких спинлоков нет. Если надо захватить ресурс, а он чей-то — сразу отдаём управление другому.

    UPD1. Почему не сразу отдавать работу другому процессу. Хороший тон — защищать мьютексом не системные вызовы (которые действительно долги) а какие-нибудь структуры данных вроде связных списков и атомарных struct. Так что вероятность, что объект просидит занятым долго, крайне мала. В настоящем мьютексе есть очередь с приоритетом, которая защищается, как ни странно, спинлоком. И этого достаточно.
    Ответ написан
    2 комментария
  • Операционная система для умного дома на C++ c полного нуля. Как?

    GavriKos
    @GavriKos
    А почему арм и малина? Это ж несолидно. Делайте свои микроконтроллеры! Добывайте кремний, разрабатывайте схему. А там и свой ASM и ось подтянутся.
    Вот ваш вопрос примерно из той же категории, если что.
    Ответ написан
    Комментировать
  • Операционная система для умного дома на C++ c полного нуля. Как?

    @LiguidCool
    По моему задавая подобный вопрос, даже не стоит начинать ... Просто "умный дом" это зоопарк из технологий, с кучей нюансов.

    Брать что-то за основу для подобного проекта - не солидно

    А с таким подходом стоит подумать о смене профессии. Серьезно.

    было решено делать свою ОС

    Еще один бред ... Хотя ноги оттуда же. ОС вам не нужна, пишите софт для готовой. В вашем случае под Linux.

    0) Определите бюджет конечного продукта (цена на выходе). Вы сюда будете часто возвращаться и тут ждет не мало не приятных сюрпризов.
    1) Как минимум определитесь с железом. Малина и аналоги конечно круто, но что будет исполнительным оборудованием? Выбор очень большой и не очевидный. А это как раз основной вопрос.
    2)
    - Как?

    Найдите ответ на этот вопрос. И тут вам кто-то врядли поможет, потому что не ясно что вы хотите получить на выходе.
    3)
    - Что учить?

    Ну раз собрались писать на сях, то их и учите. Много учите. МНОГО! Но я бы выбрал язык попроще типа PHP, Node JS, Go. В этом случае МНОГО будет несколько меньше.
    4) Раз вас много, постарайтесь разбиться по разным направлениям.
    5)
    - В каком направлении работать? (Дизайн --- Функциональность)

    Во всех, но по классике сначала пилят функционал, а потом уже натягивают картинку.
    Ответ написан
    3 комментария