• Есть ли название у алгоритма (трансформация матрицы кросс-курсов валют)?

    Griboks
    @Griboks
    Просто используйте векторные операции. Это даже алгоритмом назвать нельзя - 2 векторные операции обмена.

    Пример перестановки третьей строчки на последнее место на python/numpy:
    >>> import numpy as np
    >>> data
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14],
           [15, 16, 17, 18, 19],
           [20, 21, 22, 23, 24]])
    >>> data[:,[2,-1]] = data[:,[-1,2]]
    >>> data[[2,-1]]=data[[-1,2]]
    >>> data
    array([[ 0,  1,  4,  3,  2],
           [ 5,  6,  9,  8,  7],
           [20, 21, 24, 23, 22],
           [15, 16, 19, 18, 17],
           [10, 11, 14, 13, 12]])
    Ответ написан
    2 комментария
  • Почему в моем коде cpu быстрее gpu?

    Maksim_64
    @Maksim_64
    Data Analyst
    GPU не всегда быстрее CPU.

    1. Если будет много вызовов к памяти с небольшими объемами данных, CPU будет быстрее.
    2. Если операция не может исполнятся параллельно то эффективность GPU падает.

    В первом примере, у тебя даже тренировки модели нет, ты ее загружаешь., то есть основное место где gpu сильно быстрее cpu это операции с тензорами во время тренировки модели, его нет. Во втором примере есть тренировка модели, (операции с тензорами), то там GPU должен быть быстрее.
    Ответ написан
    Комментировать
  • Алгоритм для преобразование матрицы в треугольную?

    @AlexSku
    не буду отвечать из-за модератора
    Что интересно, так это то, что лучше сделать две треугольные матрицы, чем одну: так называемое LU-разложение (ролик Натана Куца). У метода Гаусса сложность О(N^3), а у LU - O(N^2), поэтому этот метод намного быстрее для огромных матриц.
    Там тоже можно переставлять неудачные строки (пример в ролике).
    Ответ написан
    Комментировать
  • Как одновременно прочитать построчно два файла?

    @Wirusnyy-chel
    Из комментариев под вопросом:
    нужно из файла взять подстроку после : и проверить существует ли подстрока из 1 файла в подстроке файла 2(до :) и если она есть, то записать строку в виде: подстрока из 1 файла: подстрока из 2 файла

    размеры файлов до 1гб


    Быстрым будет вариант с мапой из ответа выше, но он будет потреблять достаточно много памяти и ищет только прямые вхождения подстроки 1 в подстроке 2.

    Предлагаю вариант с меньшим потреблением памяти
    file1, err := os.Open(config.First_file)
    if err != nil {
      log.Fatalln("error")
    }
    defer file1.Close()
    file1Scanner := bufio.NewScanner(file1)
    
    file2, err := os.Open(config.Second_file)
    if err != nil {
      log.Fatalln("error")
    }
    defer file2.Close()
    file2Scanner := bufio.NewScanner(file2)
    
    // находим все доступные подстроки из файла 2
    file2SubSrings := make([]string,0)
    for file2Scanner.Scan(){
      file2SubSrings = append(file2SubSrings, strings.Split(file2Scanner.Text(), ":")[0])
    }
    
    for file1Scanner.Scan() {
      file1SubString := strings.Split(file1Scanner.Text(), ":")[1]
      for _, val := range file2SubStrings{
        if strings.Contains(val, file1SubString) {
          log.Println(file1SubString, ":", val)
          break
        }
    }
    
    if err := file1Scanner.Err(); err != nil {
      log.Fatalln(err)
    }
    
    if err := file2Scanner.Err(); err != nil {
      log.Fatalln(err)
    }


    UPD Вариант с параллельностью
    func scanFiles(file1, file2 *bufio.Scanner) {
    	// находим все доступные подстроки из файла 2
    	file2SubStrings := make([]string, 0)
    	for file2.Scan() {
    		file2SubStrings = append(file2SubStrings, strings.Split(file2.Text(), ":")[0])
    	}
    
    	wg := new(sync.WaitGroup)
    	valChan := make(chan string)
    	for i := 0; i < 5; i++ {
    		wg.Add(1)
    		go findIntersections(valChan, file2SubStrings, wg)
    	}
    
    	for file1.Scan() {
    		valChan <- strings.Split(file1.Text(), ":")[1]
    	}
    
    	wg.Wait()
    }
    
    func findIntersections(values chan string, file2SubStrings []string, wg *sync.WaitGroup) {
    	for {
    		file1SubString, ok := <-values
    
    		if !ok {
    			wg.Done()
    			return
    		}
    
    		for _, val := range file2SubStrings {
    			if strings.Contains(val, file1SubString) {
    				log.Println(file1SubString, ":", val)
    				break
    			}
    		}
    	}
    }


    UPD2
    строка из файла 2 - 663624e4aae0164132f10f09fdd9fcd2:liberty_
    строка из файла 1 - scherbakovatd@example.com:663624e4aae0164132f10f09fdd9fcd2
    на выходе должно выйти scherbakovatd@example.com:liberty_

    func scanFiles(file1, file2 *bufio.Scanner) {
    	scanWg := new(sync.WaitGroup)
    	scanWg.Add(2)
    
    	file1SubStrings := make(map[string]string)
    	file2SubStrings := make(map[string]string)
    
    
    	go func() {
    		var substr []string
    		for file1.Scan() {
    			substr = strings.Split(file1.Text(), ":")
    			file1SubStrings[substr[1]] = substr[0]
    		}
    		scanWg.Done()
    	}()
    	
    	go func() {
    		var substr []string 
    		for file2.Scan() {
    			substr = strings.Split(file2.Text(), ":")
    			file2SubStrings[substr[0]] = substr[1]
    		}	
    		scanWg.Done()
    	}()
    	
    	scanWg.Wait()
    	
    	
    	wg := new(sync.WaitGroup)
    	valChan := make(chan struct{k,v string})
    	for i := 0; i < 5; i++ {
    		wg.Add(1)
    		go findIntersections(valChan, file2SubStrings, wg)
    	}
    
    	for k, v := range file1SubStrings {
    		valChan <- struct{ k, v string }{k: k, v: v}
    	}
    
    	wg.Wait()
    }
    
    func findIntersections(file1Values chan struct{ k,v string}, file2 map[string]string, wg *sync.WaitGroup) {
    	for {
    		file1, ok := <-file1Values
    
    		if !ok {
    			wg.Done()
    			return
    		}
    		
    		if file2Value, ok := file2[file1.k];ok {
    			log.Println(file1.k, ":", file2Value)
    		}
    	}
    }
    Ответ написан
  • Есть ли статьи, которые приводят наглядные примеры того, как код на rust превосходит код на других языках?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В топике непонятно что автор имеет в виду под превосходством.

    Я думаю что если заказать статьи разным техно-писателям то они напишут каждый про свое. Один
    может писать про удобство процесса разработки (и это важно). Другой напишет про безопасность
    по memory safety. Третий может напишет про ФП и обобщенное программирование и может
    быть про автоматическое доказательство каких-то свойств которые есть у софта.

    Могу констатировать в живых примерах что ядро линукс уже содержит 55 исходников на rust (по состоянию
    на 5/13/2023) и следовательно кому-то это надо. Кто-то заказал внедрение нового компиллятора.
    Видимо язык С уже не устраивал. Я пытался просмотреть эти сорцы но моих знаний Rust и Linux kernel
    разработки пока не хватает чтобы дать хоть какой-то внятный комментарий по поводу. Ну раз коммитеры
    вкоммитили значит все таки было очень нужно.

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

    Про Mozilla тоже можно посмотреть. Возможно там найдуться примеры где было на С++ и стало на Rust.
    Ведь это по сути была главная причина возникновения самого языка Rust.
    Ответ написан
    Комментировать
  • Есть ли статьи, которые приводят наглядные примеры того, как код на rust превосходит код на других языках?

    vabka
    @vabka Куратор тега Rust

    Особенно там, где был использован язык Си или С++

    (если исключить memory safety и fearless concurrency)
    1. Хороших плюсовиков найти всё сложнее, ибо молодые разработчики часто хотят что-то более современное/простое/приятное.
    2. Переход с какого-нибудь более высокоуровнего языка на Rust гораздо легче, чем на C++
    3. DX у Rust на порядо лучше.
    4. Код на Rust на порядок более выразительный, чем код на Си

    За счёт этого поддержка кодовой базы на Rust заметно дешевле выходит

    Например вот что Тинькофф пишет:

    Наш Процессинговый Центр занимается разработкой финансовых систем, критичных к даунтайму и времени обработки. Изначально мы делали все свои продукты либо на чистом Си, либо на плюсах (C++14), однако пару лет назад мы переписали большой кусок нашего бэкенда на Rust, и нам настолько понравилось, что теперь все наши новые процессинговые сервисы пишутся на нём.



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

    Это можно будет определить только если ведётся статистика по багам и они классифицируются по причинам возникновения, но такую статистику ведут не все.
    В среднем статистика показывает, что багов связанных с неправильной работой с памятью в проектах на Rust на порядки меньше, чем в проектах на C++.


    ну тут все-равно unsafe

    В проектах на Rust он явный и от него можно избавиться, завернув в безопасную обёртку, которая будет гарантировать корректную работу с памятью и ffi.
    В проектах на C++ у тебя по факту всё является unsafe.

    ну, нам еще нужен подсчет ссылок

    В плюсах тоже активно пользуются подсчётом ссылок и всякими умными указателями, если по коду не очевидно, когда можно будет освободить память
    Ответ написан
    6 комментариев
  • Почему код в одном случае работает, а в другом - нет и выдает ошибку?

    @Wirusnyy-chel
    Канал done у вас в обоих случаях не буфферизированый - это значит что для выполнения операции записи в канал должны быть готовы и писатель (ch<-val) и читатель (<-ch).

    В первом варианте у вас писатель готов совершить операцию, но у него нет читателя и этот поток исполнения ставится на паузу, до тех пор, пока не появится читатель, а читатель определён в этом же потоке поэтому его никогда не будет. Программа зависнет и может упасть с ошибкой.
    Это можно поправить сделав канал буфферизированным
    done := make(chan book, 1)


    Второй случай работает, т.к. писатель и читатель в разных потоках и могут дождаться друг друга.
    Ответ написан
    Комментировать
  • Как сделать чат-бот на основе ИИ, обученный на собственной базе знаний?

    Maksim_64
    @Maksim_64
    Data Analyst
    Есть ощущение, что вы ожидаете очень сложного ответа, а ответ очень прост. Нет никакой математики в этой задаче, так же нету в этой задаче и архитектуры нейронных сетей. Есть лишь только работа с API, что оно предоставляет, таковы и возможности. Если бы мне нужно было решать такую задачу, я бы открывал статьи на medium (открывается с vpn) и естественно смотрел бы в стороны платных статей и от них бы отталкивался, потому что там множество пошаговых гайдов высокого качества для создания чат-ботов на базе GPT ( предполагаю вы свободно владеете английским).
    Ответ написан
    2 комментария
  • Какое решение лучше использовать для websocket'ов на laravel?

    JhaoDa
    @JhaoDa
    LaravelRUS Team
    Делать WS на ларавел, как ты сам понял, так себе затея, поэтому нынче советуют, например, https://github.com/centrifugal/centrifugo
    Ответ написан
    Комментировать
  • Как сохранять диалог react-chatbot-kit?

    @KateSin Автор вопроса
    Ок, сама спросила, сама же ответила, вдруг кому понадобится.

    В actionProvider.js необходимо добавить функцию saver, которая будет сохранять message при вызове в функциях, формирующих сообщения бота (при вызове передаем объект, сформированный вызовом createChatbotMessage):

    const saver = (message) => {
            if (localStorage.getItem('chat_messages')){
                console.log('SAVE BOT')
                const chat_messages = JSON.parse(localStorage.getItem('chat_messages'));
                console.log(chat_messages.history)
                chat_messages.history.push({id: message.id, message: message.message, type: message.type, loading: message.loading, widget: message.widget})
                localStorage.setItem('chat_messages', JSON.stringify(chat_messages))
            } else {
                console.log('ELSE SAVE BOT')
                var obj = {}
                obj.history = [{id: message.id, message: message.message, type: message.type, loading: message.loading, widget: message.widget}]
                localStorage.setItem('chat_messages', JSON.stringify(obj))
            }
        }


    Также прописываем в messageParser.js в функции parse сохранение сообщения пользователя:

    if (localStorage.getItem('chat_messages')){
                const chat_messages = JSON.parse(localStorage.getItem('chat_messages'));
                console.log(chat_messages.history)
                chat_messages.history.push({message: message, type: 'user', loading: false})
                localStorage.setItem('chat_messages', JSON.stringify(chat_messages))
            } else {
                var obj = {}
                obj.history = [{message: message, type: 'user', loading: false}]
                localStorage.setItem('chat_messages', JSON.stringify(obj))
            }


    в файле bot.js убираем функцию saveMessages (все равно она не срабатывает) и видоизменяем функцию loadMessages:
    const loadMessages = () => {
            if (localStorage.getItem('chat_messages')) {
                const messages = JSON.parse(localStorage.getItem('chat_messages'))
                return messages.history
            }
        }
    Ответ написан
    Комментировать
  • Какая сейчас в РФ ситуация касательно лицензирования ПО от Майкрософт?

    @LuchS-lynx
    инженер-ПТО
    Если кратко, то частник, с оговорками, и домашний Пользователь может использовать то что ему нравится, при условии что это куплено легально, или он неуловимый Джо.

    Что касается гос.органов, структуры Заказчиков, а так же всем тем кто работает на/с объектами критической информационной инфраструктуры закупать импортное ПО можно до 2025года только по согласованию, а с 2025года необходимо перейти на отечественное ПО в принудительном порядке (Здравствуй Линукс). Неофициально получено распоряжения и выделены деньги на закупку отечественного ПО уже сейчас, из знаковых - ВТБ закупился пакетом МойОфис на 100.000штук, Сбер объединился с Astra Linux для продвижения последней.

    Основание - Указ Президента РФ
    publication.pravo.gov.ru/Document/View/0001202203300001

    Резюме, даже если ВЫ закоренелый Виндузятник и ничего кроме не признаете, то это не означает и не гарантирует того что через некоторое время Вам придется на работе осваивать Линукс, как и ПО под него.
    Ответ написан
    8 комментариев
  • Какие задачи в реальной жизни решает блокчейн, какое его практическое применение?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Никакие.
    Никакое.

    Крайне специфичная вещь с крайне узкой областью применения. Но однажды тему раздули хайпом до размеров горы Фудзияма и с тех пор все пытаются впихнуть невпихуемое, пристроив блокчейн туда где и без него хорошо.
    Ответ написан
    Комментировать
  • Как монетизируются языки программирования и бесплатные фреймворки?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Вы, простите, много видели программистов 1С, работающих на языке программирования 1С без 1С? Я - ни одного. Закрытый "клуб по интересам", который генерит такие велосипеды, что диву даешься.
    Закрытый язык программирования никто не будет учить, на закрытом фреймворке никто работать не будет, даже если будут обучать. Для чего его учить, время тратить? Чтобы потом иметь возможность устроиться только в компанию Х? Потеря сообщества - это смерть любой технологии, любого языка, любой ОС.
    Была такая замечательная ось - OS/2. То, что она замечательная, я знаю не понаслышке - все-таки два года проработал под ней. Погубило ее как раз отсутствие поддержки - не было софта, не было программистов, не было сообщества - все постепенно разбегались кто куда. Где нынче OS/2 - да никто и не вспомнит. А отдал бы IBM ее в опен сорс - глядишь, нашлись бы пара-тройка энтузиастов.
    Продавать продукт невыгодно - его можно продать один раз. Гораздо выгоднее продавать поддержку - ее можно продавать постоянно.
    Ответ написан
    4 комментария
  • Почему исходный код языка программирования go написан на go?

    DevMan
    @DevMan
    google -> self-compiling compiler
    в частности https://ru.m.wikipedia.org/wiki/Раскрутка_компилятора
    Ответ написан
    Комментировать
  • Почему исходный код языка программирования go написан на go?

    includedlibrary
    @includedlibrary
    Язык программирования же, не может быть написан на своем же языке - это прям похоже на какую-то рекурсию

    Может. Сначала пишем компилятор для нового языка на языке, для которого компилятор уже есть, а потом переписываем его на новом языке. Вообще принято писать компиляторы на языках, для которых они сделаны. Это что-то вроде доказательства, что язык X уже дорос до того, чтобы его можно было использовать.

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

    Почему вы так думаете? Ничто не мешает написать компилятор для компилируемого языка на другом компилируемом языке. И опять же ничто не мешает написать интерпретатор на интерпретируемом языке
    Ответ написан
    2 комментария
  • Где лучше взять VPS?

    @GooDMaster
    Если хотите дёшево и сердито, то берите в каком нибудь Буффало. Можно найти на lowendbox.com примерно за 20-25$ в год за 2ядра 2-3гб. Пинг как не странно нормальный для сайтов.
    Если интересуют OVH, hetzner... то рекомендую наших ребят hostsuki.pro давно в этим занимаются, у них всего полно.
    Ответ написан
    Комментировать
  • Какие задачи в реальной жизни решает блокчейн, какое его практическое применение?

    @dmshar
    Три года прошло. Но в реальной жизни изменилось мало что.
    https://qna.habr.com/q/515731#answer_1193467
    Выводы делайте сами.
    Ответ написан
    Комментировать
  • Какого рода проекты можно перевести на блокчейн?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    С пользой - количество таких проектов исключительно мало.
    Блокчейн это такой buzzword в целом.

    Я согласен с ответом dmshar, но хочу его дополнить:

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

    @dmshar
    На блокчейн имеет смысл переводить проекты, в которых имеется:
    - распределенный источник информации,
    - запрет на изменение чего-либо, попавшего в систему,
    - связь (зависимость) предыдущий документов с последующими,
    - общедоступность или наличие открытой и закрытой частей.,
    - нежелание (нецелесообразность, невозможность) сосредоточить хранение информации в одном месте.
    К таким проектам можно отнести:
    - хранением документов, например - экономических договоров,
    - информация о владении недвижимостью,
    - историй болезни,
    - дипломы,
    - кадастровая информация,
    - информация о семейном состоянии, месте регистрации,
    - "трудовые книжки" или информация необходимая для пенсионных фондов,
    - информация о владении (или истории ремонтов) автомоблия,
    - ихранение информации о ходе/результатах выборов,
    и т.д.
    Ответ написан
    Комментировать