Страницы

Поиск по вопросам

воскресенье, 2 февраля 2020 г.

Отправка данных с определенным интервалом

#cpp


Мне надо выполнять определенную функцию раз в 20 мс прошедших после выполнения её
же(например). Для этого я ставлю отметку после ее выполнения:
functime = std::chrono::high_resolution_clock::now(); Затем выполняются еще какие-то
действия (проверял, они выполняются за несколько микросекунд). Соответственно, перед
очередным вызовом этой функции делаю паузу следующим образом:

if (std::chrono::milliseconds(20) > (std::chrono::high_resolution_clock::now() -
functime))
{
    std::this_thread::sleep_for(std::chrono::milliseconds(20) - (std::chrono::high_resolution_clock::now()
- functime));
}


Но в результате проверки, оказывается, что она выполняется раз в 0.031201 секунды,
а не 0.020000. Почему так?

P.S. до того, как я внес изменения в код этой программы, но вообще никак не относящийся
к данному, все работало отлично. Работаю в VS2013.

UPDATE1 Эта функция, которая вызывается, является функцией отправки RTP пакетов,
которые должны отправляться каждые 20 мс. К программе подключено несколько "клиентов",
которые сами присылают такие же RTP пакеты (прием данных крутится в отдельных потоках
в количестве клиентов). отправка данных предполагалась в их родительском потоке, чтобы
не грузить ЦП проверкой наличия данных. Соответственно, перед отправкой происходит
обработка пришедших пакетов, а затем их отправка обратно всем клиентам также раз в
20 мс(соответственно нужна пауза только перед отправкой первому клиенту, что замораживает
следующую обработку данных тоже на 20 мс, что и требуется для нормальной работы). И,
хотя обработка данных происходит меньше чем за микросекунду, теперь у меня задержка
вместо 20 мс - 31,2.

UPDATE2 Выяснил, что тупит компьютер. В тестовом проекте:

int main()
{
    using namespace std::chrono;
    for (int i = 0; i < 100; ++i)
    {
        steady_clock::time_point t1 = steady_clock::now();
        std::this_thread::sleep_for(std::chrono::milliseconds(20));
        steady_clock::time_point t2 = steady_clock::now();
        duration time_span = duration_cast>(t2 - t1);
        std::cout << " " << time_span.count();
    }

    system("pause");
    return 0;
}


Пишет, что в b-a = 31. Иногда 32... Есть ли какой-то способ сделать тоже самое, но
без std::this_thread::sleep_for?

Попробовал заменить на boost::this_thread::sleep_for(boost::chrono::milliseconds(20));
результат случаен в диапазоне от 15 до 32.

Извращения вида (с различными методами реализации(steady_clock и прочее)):

int main()
{
    auto a = GetTickCount();
    while ((GetTickCount() - a) < 20) { ; }
    cout << GetTickCount() -a;
    system("pause");
    return 0;
}


Тоже выдает результат 31-32...

Установка приоритета реального времени только увеличила задержку.
    


Ответы

Ответ 1



Есть подозрение что Sleep и GetTickCount недостаточно точны для измерения столь малых интервалов времени. Как пример: #include #include #include int main() { LARGE_INTEGER Freq, Time, Current; QueryPerformanceFrequency(&Freq); int64_t Delay = Freq.QuadPart * 0.020; for (int i = 0; i < 20; i++) { int a = GetTickCount(); QueryPerformanceCounter(&Time); do { QueryPerformanceCounter(&Current); } while (Current.QuadPart - Time.QuadPart < Delay); printf("GetTickCount() - %dms, QueryPerformanceCounter() - %fms\n", GetTickCount() - a, (Current.QuadPart - Time.QuadPart) * 1.0 / Freq.QuadPart); } system("pause"); return 0; } Наглядно видно как скачут значения GetTickCount() при постоянном QueryPerformanceCounter(): GetTickCount() - 15ms, QueryPerformanceCounter() - 0.020000ms GetTickCount() - 32ms, QueryPerformanceCounter() - 0.020000ms GetTickCount() - 15ms, QueryPerformanceCounter() - 0.020000ms GetTickCount() - 31ms, QueryPerformanceCounter() - 0.020000ms GetTickCount() - 16ms, QueryPerformanceCounter() - 0.020000ms GetTickCount() - 31ms, QueryPerformanceCounter() - 0.020000ms GetTickCount() - 16ms, QueryPerformanceCounter() - 0.020000ms GetTickCount() - 31ms, QueryPerformanceCounter() - 0.020000ms ... Добавлено: Дальнейшее изучение вопроса выяснило, что Sleep() всё-таки относительно точный (по крайней мере на моей машине), а неточность именно в измерении временных интервалов: int main() { LARGE_INTEGER Freq; LARGE_INTEGER Times[501]; QueryPerformanceFrequency(&Freq); printf("Timer frequency: %lluHz, Resulution: %fmks\n", Freq.QuadPart, (1E6 / Freq.QuadPart)); QueryPerformanceCounter(&Times[0]); for (int i = 1; i <= 500; i++) { Sleep(20); QueryPerformanceCounter(&Times[i]); } int maxDiff = 0; int minDiff = 0x7fffffff; for (int i = 1; i <= 500; i++) { minDiff = std::min(minDiff, int(Times[i].QuadPart - Times[i-1].QuadPart)); maxDiff = std::max(maxDiff, int(Times[i].QuadPart - Times[i-1].QuadPart)); } printf("Sleep(20) accuracy is %f - %f ms\n", (minDiff * 1000) * 1.0 / Freq.QuadPart, (maxDiff * 1000) * 1.0 / Freq.QuadPart); system("pause"); return 0; } Timer frequency: 2929414Hz, Resulution: 0.341365mks Sleep(20) accuracy is 19.218178 - 20.040868 ms

Ответ 2



Вы вызываете now() два раза, что не совсем честно. Попробуйте так: auto functime = std::chrono::high_resolution_clock::now(); // ... auto delay = std::chrono::high_resolution_clock::now() - functime; if(std::chrono::milliseconds(20) > delay) { std::this_thread::sleep_for(std::chrono::milliseconds(20) - delay); } По поводу планирования советую понастраивать приоритеты потоков, то есть ваш поток должен получть больший приоритет чем остальные. Еще настоятельно рекомендую не выполнять в критических участках выделение/освобождение ресурсов (память, дескрипторы и т. д.) это довольно таки нестабильные по времени операции.

Ответ 3



Как уже выше написали - функции sleep, std::this_thread::sleep_for не гарантируют точности. Почти у всех написано "будет не меньше чем указанно". Но пол беды с этим, допустим, получиться выжать и сделать оправку с заданным интервалом. А ещё есть сеть, на которую сложно влиять. Несколько лет назад я решал подобную задачу и решение получилось следующее. Первоначальный код был такой же как и у Вас - оправили пакет, рассчитали, сколько времени "поспать" и снова отправляем пакет. Но к этому был добавлен код, который подсчитывал, сколько пакетов было отправлено за последние несколько секунд (для ускорения работы был написан простенький класс с буфером типа кольцо, в результате вставка в него выполняется за О(1)). При отправке я смотрел, сколько реально пакетов удалось отправить за последние время. Если пакетов не хватало - то отпавлялся ещё один-два внеочереди. Также уменьшалось немножко время для "сна". Если пакетов отправилось больше, чем нужно наоборот - пропустить один пакет. Главное - не изменять резко, иначе система постоянно будет болтаться, переключаясь в режимах или залипнет в одном. У меня была в начале ошибка и когда клиент сильно тупил, то время уменьшалось до нуля и оправляло десятки пакетов. Исправлено было тем, что таким клиентов просто отключал. Возникает вопрос, а как же клиент? а клиенты держат буфер и складывают туда пришедшие пакеты. А воспроизводят с нужной им скоростью. Если проигрывается музыка, то размер буфера в 10 пакетов (0.2 секунды) абсолютно не мешает. При разговоре (VoIP) уже в 0.1 секунды может быть заметно на слух. Но некоторых даже секундная задержка не пугает - главное, что бы эта задержка не сильно плавала. Этот способ очень хорошо работает даже при плохих сетях, главное научиться правильно выбрасывать пакеты. Просто так выбросить пакет нельзя - на принимающей стороне с большой вероятностью будет "щелкать". Кстати, вместо sleep и подобных функций я использовал то, что у меня клиенты обслуживается в poll и просто корректировал таймаут для сокета. Плюс - не нужен дополнительный тред, минус - в этом треде было много ещё чего. Но оно работало. Да, я не изобретал этот алгоритм - так работают многие стримминговые сервисы.

Ответ 4



Вы определитесь, что именно Вам нужно. Или задержка в 20msec между временем завершения функции и следующим ее запуском, или запуск раз в 20msec. В первом случае, при большом числе итераций, неизбежно будут набегать лишние секунды. Во втором случае (его можно назвать "вызов по расписанию") надо планировать время запуска (конечно, на практике вычисляя величину задержки), отталкиваясь от времени первого вызова функции и количества итераций. Т.е. для запланированного интервала между вызовами равным plan_delay, задержка перед n-тым вызовом равна delay = t_start + n * plan_delay - t_now;

Ответ 5



Проблема оказалась в системном таймере, а точнее в разрешение аппаратного таймера. Иногда он слетал на значение по умолчанию 15,6мс, что и давало разброс. Решение: добавил первой строчкой в main: SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);//необязательно, но у меня приложение реального времени timeBeginPeriod(1);// устанавливаем разрешение 1мс

Как ограничить RAM для всех и вся?

#linux #ram #elementary_os #limit


Как ограничить RAM для всех и вся в ОС Linux?

elementary OS 0.3.2 Freya => Built on Ubuntu 14.04


К примеру, у меня установленно 6гб оперативной памяти, мне необходимо установить
лимит, дальше которого не подняться. К примеру, я установил лимит в 4гб, для ОС это
должно быть максимальным.

В Windows подобное устанавливается в MSconfig. К сожалению о аналогах в Linux мне
ничего не известно.
    


Ответы

Ответ 1



если вам на самом деле необходимо ограничить именно программу linux в использовании оперативной памяти, то следует передать ей в качестве параметра (при загрузке): mem=желаемый_размер например: mem=4G инструкция по передаче доп. параметров программе linux на примере дистрибутива ubuntu. обновление в связи с уточнением в комментарии. последний сектор памяти поврежден тогда вам, вероятно, лучше зарезервировать нужный блок памяти. это можно сделать с помощью параметра (при загрузке): memmap=nn[KMG]$ss[KMG] означающего: зарезервировать nn (кило-, мега-, гига-) байт памяти, начиная с адреса ss (кило-, мега-, гига-) байт. пример — исключить использование памяти с 0x18690000 по 0x1869ffff: memmap=64K$0x18690000 или memmap=0x10000$0x18690000

Java: наследование контркуктора

#java #наследование


Объясните дураку(в основном работаю с php), почему при наследовании исключений, не
наследуются все конструкторы.

Кейс №1
Есть класс расширяющий исключения(без конструктора)

package test.exceptions;
public class StatusException extends Exception {
    final public static String STATUS_NOT_EXIST = "Status: not exist";
}


Есть код выкидывающий исключение:

public static void test() throws StatusException {
    String message= StatusException.STATUS_NOT_EXIST;
    throw new StatusException(message);
}


При компиляции получаю ошибку о несоответствие сигнатур конструкторов

Error:(26, 15) java: constructor StatusException in class test.exceptions.StatusException
cannot be applied to given types;
  required: no arguments
  found: java.lang.String
  reason: actual and formal argument lists differ in length


Кейс №2
Исключение с конструктором принимающим String

package test.exceptions;
public class StatusException extends Exception {
    final public static String STATUS_NOT_EXIST = "Status: not exist";

    public StatusException(String message) {
        super(message);
    }
}


Код выкидывающий исключение:

public static void test() throws StatusException {
    String message= StatusException.STATUS_NOT_EXIST;
    throw new StatusException();
}


Ошибка

Error:(24, 15) java: constructor StatusException in class test.exceptions.StatusException
cannot be applied to given types;
  required: java.lang.String
  found: no arguments
  reason: actual and formal argument lists differ in length

    


Ответы

Ответ 1



Конструкторы не наследуются. Касательно первого примера - вы должны явно создать конструктор с параметром: public class StatusException extends Exception { final public static String STATUS_NOT_EXIST = "Status: not exist"; public StatusException(String message) { super(message); } } Касательно второго примера. Если явно не задан ни один конструктор, то по умолчанию создается пустой конструктор без параметров. То есть в первом примере у вас будет неявно создан такой конструктор. Если же явно определен хотя бы один конструктор, то конструктор без параметров следует так же явно указать. Следовательно, для второго примера нужно так: public class StatusException extends Exception { final public static String STATUS_NOT_EXIST = "Status: not exist"; public StatusException(String message) { super(message); } public StatusException() { //nothing or call super } }

Разница между функциями

#cpp


В чём разница между 3 функциями?

void main() {}
int main() {}
int main() {return 0;}

    


Ответы

Ответ 1



Если речь о глобальной функции, с которой начинается любая программа на C++, то первый вариант не соответствует Стандарту, но может восприниматься как расширение, например в msvc. Вторая и третья функции эквивалентны, т.к. отсутствие явного return 0; в main допустимо Стандартом.

Ответ 2



Формально - без разницы. main это такая особая функция, которая все равно возвратит 0, даже если ей это не сказать - поскольку возвращает она это значение не вызывающей функции, а операционной системе.

почему не работает мой код? [закрыт]

#javascript


        
             
                
                    
                        
                            Закрыт. Этот вопрос не по теме. Ответы на него в данный
момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы он соответствовал тематике «Stack Overflow на русском».
                        
                        Закрыт 2 года назад.
                                                                                
           
                
        
Объясните, пожалуйста, почему не работает код. Он выдаёт NaN:

function sum (a, b) {
    var c = this.a + this.b;
    return console.log(c);
}

sum(3+3);


я пробовал и так, всё равно не получается:

function sum (a, b) {
    var c = a + b;
    return console.log(c);
}

sum(3+3);


Чего я никак не пойму? 
    


Ответы

Ответ 1



Используйте второй вариант: function sum (a, b) { var c = a + b; console.log(c); return c; } И вызывайте его так: sum(3, 3); Почему? Потому, что у вас в методе 2 параметра: a, b. А вы вызываете его с одним параметром: sum(3+3);. 3+3 - это один параметр, перед тем, как передать его в функцию, будет произведено сложение 3+3, и будет вызвана функция в таком виде: sum(6, null).

Ответ 2



У вас ошибка в передаче параметра. Исправьте на: Sum(3,3)

Почему отсчет времени в функции time() в php начинается с 1 января 1970 года?

#php


Почему функция time() в php считает именно с 1 января 1970 года?
    


Ответы

Ответ 1



Официальная дата создания Unix - 1970 год. Поэтому ни 1 файл не может быть создан раньше 01.01.1970. Более полное описание можно найти в статье Wired News. Она объясняет, что инженеры Unix выбрали эту дату произвольно потому, что она необходима, чтобы установить единую дату начала времени, и начало 1970 года казалось наиболее удобным. Данный вопрос уже задавался на unix.stackexchange.com

Как обмануть сканер портов?

#linux #iptables


Возможно ли сканерам портов вернуть будто порт закрыт, но на самом деле он открыт??
    


Ответы

Ответ 1



Вынесено из комментария Один из вариантов скрытия портов от утилит сканирования и несанкционированных подключений - механизм port knocking. Суть его в том, что изначально порт защищаемого сервиса закрыт файрволом, демон port knocking'a ожидает получения пакетов на определенные порты в заданной последовательности, после чего открывает порт сервиса для доступа извне. Мануалы по настройке: https://wiki.archlinux.org/index.php/Port_knocking http://ashep.org/2010/zashhita-sistemy-pri-pomoshhi-port-knocking/ Преимущества/недостатки port knocking - вопрос обсуждаемый, но в любом случае, этот механизм нужно рассматривать как часть системы безопасности, а не ее единственный элемент. Основные неудобства в использовании: Требуется клиент для предварительной отправки последовательности пакетов перед подключением. Нет прямой поддержки в ядре Linux (хотя есть варианты решения целиком на iptables). Демон port knocking'a - это точка отказа, проблемы функционирования демона приведут к проблемам с доступом к защищаемым сервисам. Рекомендуется периодически менять последовательность "стуков".

Ответ 2



Такое возможно. Nmap, например, использует различные техники сканирования (через zombie, xtree), кроме того сами сервисы могут отличаться поведением или ждать специальных пакетов, поэтому nmap может допускать false-positive ошибки. Много зависит от глубины анализа nmap. См. также статью Но, я полагаю, это скорее случайное поведение. Сделать его более вероятным можно, выбрав нестандартный порт.

Python: 'charmap' codec can't decode byte 0x98

#python #windows #python_3x #console #unicode


Добрый день
Считываю utf8-файл и вывожу в консоль. При попытке вывести букву "И" возникает ошибка:

File "I:\ProgramFile\Anaconda\lib\encodings\cp1251.py", line 15, in decode  
    return codecs.charmap_decode(input,errors,decoding_table)  
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 1: character
maps to < undefined >


Воспроизводится на вот таком примере:

test_text_1 = "Задача\n"
test_text_2 = "Итератор"

file = open('temp.txt', 'w', encoding='utf-8')
file.write(test_text_1)
file.write(test_text_2)
file.close()

text = open('temp.txt', 'rb')

for byte_code in text:
    print(byte_code.strip())
    test_text = byte_code.decode('cp1251')
    print(test_text.strip())


Первое слово выводится нормально, а на втором - ошибка. Никак не могу найти способ
побороть проблему.

UPD: Видимо я описал проблему слишком широко, исправляюсь:

Как конвертировать "И" из utf-8 в cp1251? Для "А" всё работает, а для "И" - нет.

Код:

byte1 = 'А'.encode('utf-8')
byte2 = 'И'.encode('utf-8')
print(byte1, byte2)
test1 = byte1.decode('cp1251')
print(test1)
test2 = byte2.decode('cp1251')
print(test2)

    


Ответы

Ответ 1



Чтобы напечатать файл, содержащий текст в utf-8 кодировке, в консоль (аналог type filename в cmd.exe) в Питоне: #!/usr/bin/env python3 import shutil import sys with open(filename, encoding='utf-8') as file: shutil.copyfileobj(file, sys.stdout) Если хочется напечатать Юникодные символы, которые непредставимы в chcp кодировке (OEM code page), то см. Как из Python вывести на Windows-консоль строку в Юникоде?

Ответ 2



Если у вас файл записан в кодировке utf-8, то и декодировать нужно из кодировки utf-8: ... for byte in text: print(byte.strip()) text = byte.decode('utf-8') print(text.strip()) Результат: b'\xd0\x97\xd0\xb0\xd0\xb4\xd0\xb0\xd1\x87\xd0\xb0' Задача b'\xd0\x98\xd1\x82\xd0\xb5\xd1\x80\xd0\xb0\xd1\x82\xd0\xbe\xd1\x80' Итератор Когда вы записываете текст в файл в какой-то кодировке, вы фактически превращаете внутреннее представление текста в байты в указанной кодировке. Чтобы правильно декодировать эти байты обратно во внутреннее представление, при декодировании нужно указать ту же кодировку, что и при записи.

Два класса требуют экземпляры друг друга

#c_sharp


У меня есть два класса. В каждом их них нужен экземпляр другого класса.

SQLite sqllite = new SQLite(config);
FireBird fb = new FireBird(config, sqllite);


т.е. мне нужно 

SQLite sqllite = new SQLite(config,fb);


Но я так сделать не могу т.к. он еще не создан.

Местами классы менять не могу -- тоже самое получится. Что одному нужен другой, который
еще не создан.

Вот у меня класс SQLite. В нем есть меод public UserData GetData()
Метод берет данные из SQLite и должен передать их в экземпляр fb.InsertData(ud).

В свою очередь fb должен сделать тоже самое. Он должен иметь возможность взять из
FireBird данные и отправить их в экземпляр sqllite.InsertData(ud) 
    


Ответы

Ответ 1



То есть, вы пытаетесь связать два класса, отвечающих за разные базы данных, и скормить каждому экземпляр другого в конструкторе? Так не получится, какой-то из экземпляров вам придётся создавать первым. Можно, конечно, было бы «пробить силой», и заинжектить нужные экземпляры после создания. Но это всё равно плохой путь: эти классы в вашей архитектуре знают слишком много друг о друге. Я бы посоветовал делать так: Классы SQLite и FireBird друг о друге не знают. Логика получения данных из одного и передачи другому находится во внешнем по отношении к ним классе, который имеет ссылки на оба, и работает с ними.

Аннотация в Java EE

#java #java_ee #аннотации


Всем привет. Хотел узнать у знающих, что такое аннотации, и зачем они нужны. 
До того как начал изучать Java EE у меня было представление, что я знаю, что это
такое. Но как дошел до Java EE, увидел, что они применяются везде особенно в JAX-RS
и при написании веб сервисов. 

Зашел в документацию прочитать про @Context и посмотреть что там внутри. Вот то,
что увидел, если кто сможет объяснить синтаксис и саму логику данного кода буду признателен.
Если есть ссылки на объяснение буду рад почитать.   

 @Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 public @interface Context {
 }

    


Ответы

Ответ 1



Это просто объявление аннотации без какой-либо логики. Как объявить аннотацию, рассказывается в любом учебнике по Java. По-порядку: @Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD}) Аннотация @Target, объявляет элементы исходного кода, к которым можно применить создаваемую аннотацию. В данном случае это: параметры методов (ElementType.PARAMETER), сами методы (ElementType.METHOD) и поля классов (ElementType.FIELD). @Retention(RetentionPolicy.RUNTIME) Аннотация @Retention, говорит компилятору, как долго нужно хранить аннотацию в коде. Политика RetentionPolicy.RUNTIME заставляет компилятор сохранить аннотации в .class-файлах и делает их доступными во время выполнения программы через рефлексию. @Documented Аннотация @Documented включает создаваемую аннотацию в список элементов исходного кода, для которых генерируется документация (при использовании инструментов генерации документации). public @interface Context { } Это, собственно, непосредственно объявление новой аннотации @Context. Сами по себе аннотации - просто маркеры, никакой работы они не выполняют. Что касается логики ("магии") аннотаций то обычно это работает так: есть какой-то класс, отвечающий за инициализацию, он пробегает при помощи рефлексии по классам в определенном пакете и ищет какую-то аннотацию. Если находит - экземпляры этого класса подвергаются какой-либо обработке, например полям классов задаются некоторые значения. В случае с JAX-RS "магией" занимается поставщик реализации (напр. CXF, Jersey, RESTEasy). Где-то в его недрах есть класс, который анализирует аннотации, которыми вы украсили ваши ресурсы и выполняет действия в соответствии со спецификацией JAX-RS. Например, составляет карту соответствий URL-ов конкретным методам, на основе аннотаций @Path и @GET/@PUT/@POST/@DELETE.

Ответ 2



Пример на основе этой статьи: 1) Создаем новый класс-аннотацию: @Target(value= ElementType.TYPE) @Retention(value= RetentionPolicy.RUNTIME) public @interface ControlledObject { String name(); } 2) Используем эту аннотацию, т.е. аннотируем класс: @ControlledObject(name="biscuits") public class Cookies { ... } 3) Как работает аннотация: где-то в коде мы проверяем, аннотирован ли наш класс Cookies этой аннотацией, ControlledObject. Если да, то выполняются одни действия, если нет - другие: Class cl = Class.forName("Cookies"); if(!cl.isAnnotationPresent(ControlledObject.class)){ ... } else { ... }

Class или struct в Swift?

#swift #классы


Когда лучше использовать класс, а когда структуру в Swift?
    


Ответы

Ответ 1



Основное различие в том, что структуры передаются по значению, а классы — по ссылке. С точки зрения производительности важно, что экземпляры структур могут быть созданы в стеке, а экземпляры классов — только в куче. В соответствии с The Swift Programming Language: Структуры подходят, если выполняется одно или несколько условий: Инкапсуляция небольшого набора простых значений. Значения следует копировать, а не передавать по ссылке. Свойства самой структуры — value-типы, которые тоже передаются по значению. Структуры не наследует свойства или поведения. Хорошие примеры: Размеры фигуры: ширина и высота. Точка в пространства: x, y и z типа double. В большинстве случаев следует использовать классы.

Ответ 2



Предлагаю такие вопросы себе задавать: 1) Нужно ли мне наследование? 2) Нужно ли использовать классовые дженерики ('class SomeClass: ClassName')? 3) Нужно ли будет такое, чтобы инстанс объекта был доступен из нескольких мест и его можно было менять из них. (объект по ссылке, вместо копирования)? 4) Нужен ли деинициализатор? Если на все ответ нет, то используйте структуру.

Обновление Android-приложения без Play Market

#android


Пример: распространяю свое приложение на Android со своего сайта, пользователи установили
его. Аккаунта разработчика в Google Market нет. Если я сделаю новую версию приложения
- как мне обновлять уже установленное приложение? Как сделать так, чтобы при выходе
новой версии - устаревшая версия (которая установлена у пользователя) перестала работать
и писало уведомление: "Скачайте новую версию". Либо подскажите альтернативные способы.
    


Ответы

Ответ 1



Добавьте в приложение контроль версии при старте. Приложение при запуске(или по расписанию) делает запрос к серверу, получает номер текущей актуальной версии, сравнивает с установленной и действует по обстоятельствам

Ответ 2



Отвечаю сам. Нашел то, что искал здесь: https://m.habrahabr.ru/post/279553/ В этой статье описано, как небольшим куском кода добавить в приложение контроль версий.

Выровнять ссылки по центру с фиксированной шириной

#html #выравнивание


Ломаю голову над проблемой, есть блок скажем шириной 900px в него нужно поместить
кнопки шириной скажем 200px разместить их по центру ну и придать красивостей. делаю
с помощью такого кода








но ссылки расползаются по всему пространству дива. Если у кого нибудь есть варианты
как решить подобную проблему подскажите плз
    


Ответы

Ответ 1



добавляешь стиль, .buttons { text-align: center; } и твои ссылки выравниваются по центру

Ответ 2



text-align: center ?

Ответ 3



.buttons{ width: 500px; border: 1px solid gray; display: flex; flex-direction: column; align-items: center; } Как сделать подобное с помощью Flex.

Ответ 4



ul{ display:table; margin:auto; } ul li{ display:table-cell; width:20%; text-align:center; }

Что бы список раскрывался вверх (select, option)

#javascript #html #jquery #css


Подскажите, как сделать чтобы раскрывающийся список раскрывался вверх?



    


Ответы

Ответ 1



Со стандартным кастомизируется очень плохо. Несколько первых запросов гугла дают это ясно понять: тут и хабр. Особенно это касается оформления

Как сделать блеск на кнопке

#html #css #css3 #градиент


Подскажите пожалуйста как сделать что бы при наведении на кнопку появлялся эффект
блеска. Я думал что этого можно достичь таким способом 

a{
transition: all 1s ease 0s; 
}
a:hover
{
background: linear-gradient(45deg, red, white);
}

Кнопки сделаны в виде списка со ссылками (схематично ниже) Выходит что градиент накладывается на всю область сразу, а по тексту идёт с задержкой(Что очень не приятно :( ) В идеале нужно что бы узкая полоска градиента прошла от левого нижнего до правого верхнего углов. Помогите реализоваться пожалуйста. Любые идеи принимаются!


Ответы

Ответ 1



Легко гуглится в интернете, например такие кнопки, не важно ссылка это или див, ссылке же тоже можно применить блочную модель: http://jsfiddle.net/jLhgve2j/ /** * Icon */ .icon { position: relative; overflow: hidden; width: 50px; height: 50px; display: inline-block; margin: 25px 0 25px 25px; border-radius: 5px; color: #fff; text-decoration: none; text-align: center; line-height: 50px; font-size: 12px; font-family: sans-serif; } .icon:nth-child(1) { background: cornflowerblue; } .icon:nth-child(2) { background: salmon; } .icon:nth-child(3) { background: gray; } /** * The "shine" element */ .icon:after { content: ""; height: 200%; left: -230%; opacity: 0; position: absolute; top: -20%; transform: rotate(-30deg); width: 200%; background: rgba(255, 255, 255, 0.13); background: linear-gradient(to right, rgba(255, 255, 255, 0.13) 0%, rgba(255, 255, 255, 0.13) 77%, rgba(255, 255, 255, 0.5) 92%, rgba(255, 255, 255, 0.0) 100%); } /* Hover state - trigger effect */ .icon:hover:after { left: -50%; opacity: 1; top: -50%; transition-duration: 0.7s, 0.7s, 0.15s; transition-property: left, top, opacity; transition-timing-function: ease; } /* Active state */ .icon:active:after { opacity: 0; } let it shine

Как в linux определить процессы ядра и пользовательские процессы

#linux #bash


Как в linux определить процессы ядра и пользовательские процессы.
    


Ответы

Ответ 1



В современном linux, в отличие от многих других Unix есть так называемые "процессы ядра". По суди это просто части самого ядра, функции общего кода ядра, работающие в том же адресном пространстве и с теми же привилегиями, что и остальной код ядра. Единственное их отличие от других частей ядра, для них создаются отдельные записи в таблице процессов. Процессами они сделаны для того, что бы их выполнение происходило независимо от остальных частей ядра, с более низким приоритетом. Их выполнение происходит под контролем планировщика, как и все остальные процессы в системе. Процессы ядра linux запускаются самим ядром, при этом родительским процессом якобы их породившим, назначается процесс kthread, с PID=2. Таким образом процессами ядра надо считать сам процесс с PID=2, а так же процессы у которых PPID (т.е. pid родителя) равен 2. sudo ps --ppid=2 --pid=2 Пользовательские процессы - все остальные: sudo ps -N --ppid=2 --pid=2 Так же по умолчанию pstree без параметров показывает только дерево процессов порожденных init, т.е. пользовательских процессов. Процессы ядра покажет sudo pstree 2.

В чем различие, в плане устройства, между виртуальным и не виртуальным деструкторами? [дубликат]

#cpp


        
             
                
                    
                        
                            На этот вопрос уже даны ответы здесь:
                            
                        
                    
                
                        
                            Виртуальный деструктор
                                
                                    (2 ответа)
                                
                        
                                Закрыт 3 года назад.
            
                    
Как работает виртуальный деструктор при наследовании мне известно. Мне интересен
механизм работы.

Указатель на виртуальный деструктор также хранится в vtable? Если да, то порядок
такой же как и у остальных виртуальных методов класса в таблице внутри vtable? или
оно устроено как-то по-другому, есть отличие от виртуальных методов в способе хранения?

И как обстоит дело с обычным деструктором, он хранится как обычный метод?
    


Ответы

Ответ 1



Разница в том, что если у вас планируется хоть какое-то наследование, то скорее всего будет создан объект потомка, на который будет указывать указатель на базовый класс. Base * b = new Derived; ... delete b; И вот тут, если деструктор не виртуальный, будет вызван деструктор ~Base(), что очень плохо... А если виртуальный - будет вызван деструктор ~Derived(), что и требуется... Так что главное правило - планируете наследование - делайте деструктор виртуальным!

Ответ 2



Деструктор в интересуемой Вами части ничем не будет отличаться от обычной функции-члена. Если Вы используете объект производного класса через указатель на базовый класс в процессе его удаления через delete, то деструктор базового класса должен быть виртуальным. Вот и всё.

Как вставить текст посередине границы блока?

#html #css


Здравствуйте! Как сделать подобное?



Есть идея использовать рамку как background-image и поверх писать текст на html.

Есть ли какие-то еще варианты?
    


Ответы

Ответ 1



Этого можно добиться с помощью комбинации тегов
и : legend { text-align: center; }
Заголовок Текст текст текст


Ответ 2



Ну, думаю так. html:
Заголовок

Куча вашего текста

css: fieldset { width: 910px; height: 294px; } legend { padding-left: 40px; /* Свои значения */ padding-right: 40px; /* Свои значения */ } Ну и ваш текст и его стилистика внутри.

Ответ 3



Еще как вариант *{ padding: 0; margin: 0; box-sizing: border-box; } body{ background: url('http://zellox.com/wp-content/uploads/2016/02/best-nature-background-desktop.jpg') no-repeat center top; -webkit-background-size: cover; background-size: cover; } .b{ overflow: hidden; padding: 25px 0; max-width: 400px; margin: 25px auto; } .b-inner{ border: 3px solid #fff; border-top: none; color: #fff; font-size: 16px; position: relative; background: rgba(0,0,0,0.3); } .b-text{ padding: 25px; } .b-title{ position: absolute; top: -12px; left: 0; width: 100%; text-align: center; font-size: 18px; } .b-title > span{ position: relative; display: block; } .b-title > span:before, .b-title > span:after { content: ""; display: inline-block; background-color: #fff; height: 3px; position: relative; vertical-align: middle; width: 50%; } .b-title > span:before { right: 0.5em; margin-left: -50%; } .b-title > span:after { left: 0.5em; margin-right: -50%; }

title text

text text text text text text text text text text text text text text text text text text text

title text title text

text text text text text text text text text text text text text text text text text text text


Почему не принимает параметр?

#java #android


Использую AsyncTask в который как параметр передаю массив Field[]. 

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

Field[] raw = R.raw.class.getFields(); 
go(raw); 

private void go(Field[] field) { 
    new AsyncTask() { 
        @Override 
        protected Void doInBackground(Field[]... params1) {   

            for (Field aRaw : params1) {     <---- вот тут params1 подчеркивает и
говорит что ожидает Field[] а получает Field
                ...
            } 
            return null; 
        } 
    }.execute(field); 
}


Что я делаю не так? Вроде ж все правильно... Передаю массив, бекграунд получает массив,
но когда этот массив ставишь в цикл то говорит, что это не массив...
    


Ответы

Ответ 1



Конструкция Field[]... params1 подразумевает, что вы передадите неопределенное количество элементов, params1 - это массив этих элементов, в вашем случае получается массив массивов Field. @Override protected Void doInBackground(Field... params1) { for (Field aRaw : params1) { ... }

display:block при нажатии на radio

#html #css


Нужно, чтобы при наведении или нажатии на radio

.open2 img {display: none;} менялся на {display: block;}

css .open2 img {display: none;}


Ответы

Ответ 1



пример с js document.querySelector('.open1 input').onmouseenter = function() { document.querySelector('.open2 img').style = 'display: block'; } document.querySelector('.open1 input').onmouseleave = function() { document.querySelector('.open2 img').style = 'display: none'; } .open2 img {display: none;}
пример с css (mini hack) .open2 img {display: none;} .open1 {display: block;} .open1:hover + .open2 img {display: block;}


Ответ 2



Т.к. CSS, в отличиие от JS, не может подняться вверх под DOM, то возможны два варианта: размещать эти блоки рядом и использовать "соседние селекторы": img { display: none; } input:hover ~ img { display: inline-block; }
использовать :hover не целевого элемента, а его родителя: .open2 img { display: none; } .open1:hover + .open2 img { display: block; }
Если всё же интересует вариант с JS: активацию радио можно обработать вот так: document.querySelector('.open1 input').onchange = function() { if (this.checked) { document.querySelector('.open2 img').style.display = 'block' } } .open2 img { display: none; }
наведение вот так: document.querySelector('.open1 input').onmouseenter = function() { document.querySelector('.open2 img').style.display = 'block' } document.querySelector('.open1 input').onmouseout = function() { document.querySelector('.open2 img').style.display = 'none' } .open2 img { display: none; }


Ответ 3



Не выйдет чисто на CSS. Для получения значения #iphone_4, нужно зайти глубже, чем потомок с картинкой. В CSS нету селектора выше по древу, так что выше не подняться.

Как работать с gui из Async потока? [дубликат]

#c_sharp #многопоточность #асинхронность #async_await


        
             
                
                    
                        
                            На этот вопрос уже даны ответы здесь:
                            
                        
                    
                
                        
                            Работа с контролами из фонового потока
                                
                                    (2 ответа)
                                
                        
                                Закрыт 3 года назад.
            
                    
Как работать с gui из Async? Ну вот например : есть progressbar и есть button у которого
на событии Async onclick лежит следующий код Await Task.Run((){progressbar.value =
77}) и он конечно же "вылетает", так вот, что мне делать?
    


Ответы

Ответ 1



Самый простой вариант — если вы уж находитесь в async-функции, то не вызывайте Task.Run раньше времени. Например, вы можете сделать как-то так: async void OnClick(object sender, RoutedEventArgs e) { button.IsEnabled = false; for (int i = 0; i < 10; i++) { // выгружаем в фоновый поток ту операцию, которая должна быть асинхронной bool isGood = await Task.Run(() => ComputePart(i)); // остаток кода продолжает бежать в UI-потоке if (isGood) progressBar.Value = i; } button.IsEnabled = true; } Ещё три варианта описаны в отличном ответе @Lightness.

Ответ 2



Как вариант можно использовать SynchronizationContext. Пример: private async void ChangeProgressBar() { var uiSync = SynchronizationContext.Current; await Task.Run(() => { uiSync.Send(state => { progressbar.value = 77 }, null); }); } Также можно использовать Progress< T>. Пример: private async void ChangeProgressBar() { IProgress progress = new Progress(value => { progressBar.Value = value; }); await Task.Run(async () => { for (int i = 0; i < 100; i++) { progress.Report(i); await Task.Delay(20); } }); } Еще один вариант это использование Dispatcher. Пример: private async void ChangeProgressBar() { await Task.Run(() => { progressBar.Dispatcher.Invoke(() => progressBar.Value = 77, DispatcherPriority.Background); }); }

Android верстка отображется только верхний TextView

#android #textview


В layout присутствуют несколько вертикально расположенных TextView но отображается
только один,верхний.

Что не так, как исправить?

  



    



    


Ответы

Ответ 1



android:layout_height="match_parent" изменить на android:layout_height="wrap_content" или какое-то значение в dp. Первый элемент у Вас растягивается на весь экран и остальные, соответственно, уже сжаты в 0.

В чем отличие двух функций?

#python


def foo1(x=[]):
    x.append(1)
    print(x)

def foo2():
    x  = []
    x.append(1)
    print(x)


Почему при неоднократном вызове функции foo1() (без аргументов) получается вывод:

[1]
[1, 1]
[1, 1, 1]
...

    


Ответы

Ответ 1



Разница в том, что первая функция может принимать 1 агрумент, вторая не принимает аргументов. Советую прочитать краткую информацию о функциях в Python. Поведение, о котором Вы спрашиваете, происходит по такой причине, что значение по-умолчанию (пустой список) вычисляется единожды, когда функция была скомпилирована, затем оно используется при каждом вызове функции. Чтобы избежать такого поведения и получать пустой список при каждом вызове, измените код следующим образом: def foo1(x=None): if x is None: x = [] x.append(1) print(x)

Ответ 2



Почему при неоднократном вызове функции foo1() (без аргументов) получается вывод Аргументы по умолчанию создаются однажды и живут пока жива сама функция. Не используйте изменяемые объекты (такие как списки, словари) в качестве аргументов по умолчанию. Если вы в foo1() ничего не передаёте, то у вас есть только один список x куда вы при каждом вызове добавляете новые элементы. foo2() при каждом вызове создаёт новый список и прибавляет к нему один элемент.

Ответ 3



Если в двух словах, то так: Аргумент по умолчанию будет тем же самым объектом, даже при разных вызовах функции. То есть, если вы изменяете этот объект в одном вызове функции, то он сохранит это новое значение при следующем вызове. Это никак не проявляется, когда в качестве умолчания вы используете неизменяемые объекты (числа, строки, кортежи и т.п.) Но это становится заметным, если в качестве умолчания вы используете изменяемые объекты (списки, множества и т.п.) Поэтому обычно крайне не рекомедуется использовать изменяемые объекты как аргумент по умолчанию.

Как вывести полученный ответ в TextView?

#java #android #vkontakte_api


Я делаю запрос на получение информации о пользователе(имя фамилия):

VKRequest username = VKApi.users().get(VKParameters.from(VKApiConst.FIELDS,"first_name,last_name"));


И как мне вывести полученный ответ в TextView?

Помогите пожалуйста, я ещё новичок в программировании и на stackoverflow впервые:)
    


Ответы

Ответ 1



Если я правильно понимаю, то вы делаете запрос на получение юзеров, тоесть в ваш VKRequest username приходит список пользователей, я полагаю что то похожее на это: response: [{ id: 210700286, first_name: 'Lindsey', last_name: 'Stirling', city: { id: 5331, title: 'Los Angeles' }, photo_50: 'https://pp.vk.me/...f6e/4-funfNRMwg.jpg', verified: 1 }] Возможно ваш запрос должен выглядеть так final VKRequest request = VKApi.users().get(VKParameters.from(VKApiConst.FIELDS, "first_name,last_name")); request.executeWithListener(new VKRequest.VKRequestListener() { @Override public void onComplete(VKResponse response) { VKApiUserFull user = ((VKList)response.parsedModel).get(0); //устанавливаем имя пользователя в TextView yourTextView.setText(user.first_name); } });

Ответ 2



Из Request username, Вам нужно достать в String first_name и last_name потом передать их в TextView //находите textView TextView textView = (TextView) findViewById(R.id.colorText); //устанавливаете нужный текст textView.setText("Ваши string first_name и last_name");

Ответ 3



TextView tvUserName = (TextView) findViewById(R.id.tvUserName); tvUserName.setText("имя пользователя");

Ответ 4



У себя в приложении данные я получаю так: private void getMeInfo() { VKApi.users().get().executeWithListener(new VKRequest.VKRequestListener() { @Override public void onComplete(VKResponse response) { try { JSONObject r = response.json.getJSONArray("response").getJSONObject(0); Intent intent = new Intent(); intent.putExtra("provider", "vkontakte"); intent.putExtra("access_token", access_token.accessToken); intent.putExtra("uid", r.getString("id")); intent.putExtra("email", ""); intent.putExtra("first_name", r.getString("first_name")); intent.putExtra("last_name", r.getString("last_name")); setResult(RESULT_OK, intent); } catch (JSONException ignored) { } finish(); } @Override public void onProgress(VKRequest.VKProgressType progressType, long bytesLoaded, long bytesTotal) { super.onProgress(progressType, bytesLoaded, bytesTotal); } @Override public void onError(VKError error) { new AlertDialog.Builder(VkontakteActivity.this).setMessage(error.errorMessage).show(); } @Override public void attemptFailed(VKRequest request, int attemptNumber, int totalAttempts) { } }); }

Многопоточный доступ к данным

#cpp #cpp11


Один поток пишет в структуру, другие потоки читают. Требуется обеспечить транзакционность
записи (т.е. чтобы при обновлении двух полей, потоки чтения не могли получить возможность
прочитать наполовину обновленные данные).
В идеале для чтения иметь метод const Foo& get() const;.

В текущей реализации используется подход с мьютексами и хранением отдельных для каждого
потока копий в std::map.

void ConfigUpdater::set(const Config& config)
{
    MutexGuard mutexGuard(mutex);
    this->config = config;
}

const Config& ConfigUpdater::get() const
{
    MutexGuard mutexGuard(mutex);
    return copies.emplace(boost::this_thread::get_id(), config).first->second;
}


Возможно есть лучшее решение, подскажите в какую строну копать.
    


Ответы

Ответ 1



Можно воспользоваться std::shared_lock для чтения и std::unique_lock для записи, это позволить избежать копирования. std::shared_timed_mutex доступен в C++14, в C++17 есть std::shared_mutex.

Ответ 2



Если ваша структура тривиально копируема, оберните ее в std::atomic<> Каждая специализация шаблона std::atomic определяет атомарный тип. Только объекты атомарных С++ типов могут безопасно использоваться в нескольких потоках одновременно. Когда один поток сохраняет данные в объекте атомарного типа, а другой хочет их прочитать, поведение программы определено стандартом. #include //......... struct Foo { int alpha; char* beta; }; using AFoo=std::atomic;

Арифметика в bash

#linux #bash


Делаю простой калькулятор на bash:

#!/bin/bash

while [ 1 -eq 1 ]
do
    read arg1 op arg2
    if [[ "$arg1" -eq "exit" ]]
    then    
        break
    fi

    flag=0
    for ops in + - * / % **
    do
        if [[ "$op" = "$ops" ]]
        then
            flag=1
        fi  
    done 

    if [[ $flag = 1 ]]
    then
        let "result = $arg1 $op $arg2"
        echo "$result"
    else
        echo "error"
    fi


done

echo "bye"


Смысл в том, что на вход я подаю 3 значения, аргументы и операция между ними. Например,
12 + 5.

Все хорошо работает, кроме операций * и **.

В чем может быть дело?
    


Ответы

Ответ 1



for ops in + - * / % ** заключите по крайней мере * и ** в кавычки. а лучше — все аргументы: for ops in '+' '-' '*' '/' '%' '**' тогда оболчка не будет пытаться делать какие-либо подстановки.

Ответ 2



Или можно поставить экранирование for ops in + - * / % ** вот так for ops in + - \* / % \*\*

Как объединить в один файл проект с функциями require?

#javascript #nodejs #javascript_faq


Как объединить в один файл js несколько файлов в которых присутствует функция:

require('./main')
require('./result')
require('./solution')


После установки npm пакета на локальном сервере файлы правильно обрабатываются браузером. 
А когда цепляю main.js файл в котором присутствуют require() к html. То на другом
сервере он пишет ошибки


  Uncaught Error: Mismatched anonymous define() module: 


Есть ли какие нибудь инструменты, чтобы получить один js файл где уже все зависимости
включены на месте?

Нужно прицепить js код в файл на сервере где нельзя ставить node или что то подобное.
То есть js должен обрабатываться чисто на клиенте и всё. Он ничего не должен подгружать.
    


Ответы

Ответ 1



Такие инструменты есть, и их много. Этот класс инструментов называется "системы сборки". Суть их работы сводится к построении AST дерева по JS коду для поиска всех зависимостей и подмене require функций на специфичный для сборщика код. На выходе вы получаете один JavaScript файл, со всем вашим кодом (и зависимостями) внутри. В качестве примера приведу пример использования двух популярных систем сборки: Browserify и Webpack. (Есть и другие, но про них Google расскажет вам лучше меня.) Browserify появился раньше чем Webapack и решает несколько более узкий круг задач (см. описание Webpack ниже). Для глобальной установки достаточно выполнить команду: npm install -g browserify Для сборки проекта нужно выполнить: browserify main.js -o bundle.js где main.js - точка входа вашего приложения, а bundle.js - имя результирующего файла. Webpack в отличии от Browserify создавался не только для сбора JavaScript кода. Эта среда сборки расширяет применимость функции require позволяя вам использовать ее для подключения: картинок CSS файлов файлов, написанных для CSS препроцессоров (LESS/SASS/...) исходном коде на языках, компилируемых в JS (CoffeeScript и др.) шаблонов Каждый тип зависимостей обрабатывается по своему в зависимости от конфигурации Webpack. На выходе вы получаете набор файлов, готовых к непосредственному подключению к HTML странице. Если говорить только о JS приложениях, то Webpack может работать аналогично Browserify. Для глобальной установки вам достаточно выполнить команду: npm install webpack -g Для сборки проекта нужно выполнить: webpack ./entry.js bundle.js где ./entry.js - точка входа вашего приложения, а bundle.js - имя результирующего файла. Замечание Дополнительно, вы можете почитать о распространенных модульных системах в JS в другом моем ответе.

Не вводится пароль в git bash

#git


Когда я в git bash выполняю команду $ git push origin master, то после этого мне
нужно вводить мои логин и пароль от GitHub. Проблема в том, что логин вводится, а пароль
нет. В чем может быть проблема? 
    


Ответы

Ответ 1



Пароль при вводе просто не отображается. Но вводится.

Ответ 2



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

Подготовка данных для распознавания речи нейронной сетью

#алгоритм #аудио #нейронные_сети


Разбираюсь с распознаванием речи с помощью нейронных сетей. Нашел довольно много
информации об устройстве самих сетей, а вот с примерами их работы посложнее.

Допустим есть у меня какая-то сеть с N входами и M выходами. И есть звуковой сигнал
с каким-то текстом. Как все это заставить работать вместе?

Получили мы, допустим, с помощью преобразования Фурье спектр. Ну можем как-то нарезать
звуковой сигнал на какие-то мелкие кусочки. Опять же, как их выбрать длину куска? И
что делать дальше? Что подавать на вход сети? И что сеть на выходе обычно дает? Буквы,
соответствующие звукам или еще что-либо? (Допустим, стоит задача получить произнесенное
предложение в текстовом виде)

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


Ответы

Ответ 1



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

Как отслеживать изменения файлов и копировать изменённые файлы в другую папку?

#python #python_3x


Суть программы: проверить файлы на последнее изменение, и если они были изменены,
то копируем их в другую папку.

Так вот проблема в том, что у меня есть список файлов, полученный с помощью функции
**os.listdir(path)*. Но его содержимое - всего лишь текст. Как я могу привязать элементы
к реальным файлам?
    


Ответы

Ответ 1



Для полноты картины не хватает ответа с https://pypi.python.org/pypi/inotify import logging import inotify.adapters _DEFAULT_LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s' _LOGGER = logging.getLogger(__name__) def _configure_logging(): _LOGGER.setLevel(logging.DEBUG) ch = logging.StreamHandler() formatter = logging.Formatter(_DEFAULT_LOG_FORMAT) ch.setFormatter(formatter) _LOGGER.addHandler(ch) def _main(): i = inotify.adapters.Inotify() i.add_watch('/tmp') try: for event in i.event_gen(): if event is not None: (header, type_names, watch_path, filename) = event _LOGGER.info("WD=(%d) MASK=(%d) COOKIE=(%d) LEN=(%d) MASK->NAMES=%s " "WATCH-PATH=[%s] FILENAME=[%s]", header.wd, header.mask, header.cookie, header.len, type_names, watch_path, filename) finally: i.remove_watch('/tmp') if __name__ == '__main__': _configure_logging() _main() i.event_gen() yield-ит события о изменении файлов в каталоге.

Ответ 2



Как-то так: import os import time for fname in os.listdir(): t = os.path.getmtime(fname) print ("modification time of '{}' is {}".format(fname, time.ctime(t))) current_mtime[fname] = t if t > last_mtime[fname]: do_something(fname) last_mtime = current_mtime

Ответ 3



Сидя на Linux, можно не городить костыли, а воспользоваться возможностью, предоставляемой ОС - inotify и специальным демоном, который облегчает работу - incron. Работает incron крайне легко и приятно. Например, строчка из incrontab файла: /home IN_CREATE /home/user/my_cool_python_script.py $# означает, что, когда в каталоге /home создан каталог или файл, будет вызван указанный скрипт с параметром, означающим имя файла, с которым произошло наблюдаемое событие.

Ответ 4



Вот рабочий вариант с использованием Watchdog. Я слегка модифицировал этот пример (c) Bruno Rocha watch_for_changes.py: from __future__ import print_function import os import sys import time import shutil from watchdog.observers.polling import PollingObserverVFS from watchdog.events import PatternMatchingEventHandler class MyHandler(PatternMatchingEventHandler): #patterns = ["*.*", ".*"] def __init__(self, target_dir, **kwargs): PatternMatchingEventHandler.__init__(self, **kwargs) self._target_dir = target_dir def process(self, event): """ event.event_type 'modified' | 'created' | 'moved' | 'deleted' event.is_directory True | False event.src_path path/to/observed/file """ if not event.is_directory: # the file will be processed there print('{} {} --> {}'.format(event.src_path, event.event_type, self._target_dir)) shutil.copy(event.src_path, self._target_dir) def on_modified(self, event): self.process(event) def on_created(self, event): self.process(event) if __name__ == '__main__': args = sys.argv[1:] source_dir = args[0] target_dir = args[1] observer = PollingObserverVFS(stat=os.stat, listdir=os.listdir, polling_interval=30) observer.schedule(MyHandler(target_dir, patterns=['*.*','*','.*']), path=source_dir) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join() Как вызывать: python watch_for_changes.py c:\source_dir c:\target_dir PS в теории это должно работать на любой платформе где поддерживается Python, на практике я проверил только под Windows...

Ответ 5



Если к речь о файлах то можно сделать с помощь словаря: import os fdict = {} path = "путь_к_директории_с_файлами" files = os.listdir(path) for i in files: if isfile(path+i): fdict[i] = open(path+i,'r') Этот скрипт создаёт словарь файлов с ключами - их названиями. Пример выбора файла из него: fdict["имя_файла"]

Замостить изображение цветом CSS

#javascript #html #css


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


Вот как этот кусок карты.
    


Ответы

Ответ 1



Делаешь картинку в svg. Складываешь интересующие регионы в группы g с некоторым классом. По этому классу на :hover в css меняешь fill для path. Примерно так (класс не стал делать, т. к. карту нагуглил - и так его ещё ужимать пришлось): html, body, svg { height: 100%; width: 100%; display: block; margin: 0; } .c {fill: #fff;} .d {fill: #c30;} .e {fill: #8b0000;} .f {fill: gold;} .g {fill: #f66;} path:hover { fill: blue; }

Ответ 2



Предлагаю обойтись area Есть плюс в том, что можно использывать href= вот пример: Пример при навидении Как создавать map area: Генератор для создания при помощи наложения рисунков Наберите в гугле или яндексе map area html и найдёте кучу примеров