Страницы

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

четверг, 7 марта 2019 г.

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

Допустим есть class подключенный к проекту, в котором записаны все основные функции, которые я использую для построения приложений. Я просто вызываю нужную мне функцию, в нужный момент. Их в классе много. Вопрос заключается в том, что можно ли сделать так, чтобы компилятор компилил в приложение только те функции, которые вызывались из класса, а не весь класс? Заранее спасибо.


Ответ

Это нельзя сделать стандартными средствами компилятора. Можно сделать при помощи утилит, называемых обфускаторами - они, кроме запутывания кода, обычно умеют вырезать неиспользуемый код.
В мелких проектах это просто не имеет практического смысла - вы просто не можете написать достаточное количество кода, чтобы он значительно повлиял на размер результирующей сборки.
В крупных проектах такой подход сомнителен по некоторым причинам:
нельзя вырезать public методы - они могут вызываться из других сборок. нельзя вырезать реализации интерфейсов - для для таких методов не будет прямых вызовов в коде. нельзя вырезать вирутальные методы т.к. они всега вызываются неявно. вырезание может поломать вызов методов через reflection - опять же, из-за возможности вызова метода "по имени".
Крупный проект обычно подразумевает Interface Segregation (много интерфейсов) и использованием IOC/DI - вызов всего через интерфейсы, а не напрямую. Т.о. почти все методы становятся невырезаемыми или публичными, явно или неявно.
Т.е. безопасно из крупного проекта можно вырезать пару процентов кода, не больше. Никто не будет рисковать ради пары килобайт.
Кроме того, "неиспользуемый" код никак не влияет на производительность. Он просто лежит в виде пачки данных (IL) на диске на диске. В реальный (машинный) код методы преобразуется при первом вызове метода. Нет вызова - нет преобразования, нет затрат.

Русские символы XML в Python3

Пишу программу, которая работает с xml файлами. И возникла проблема с записью символов в файл. Функция для записи выглядит следующим образом:
def addPost(name, text): print(name + text) tree = ET.parse('db.xml') root = tree.getroot() post = ET.SubElement(root,'post') post.set('num', str(getCnt())) nameElem = ET.SubElement(post, 'name') nameElem.text = name textElem = ET.SubElement(post, 'text') textElem.text = text tree.write('db.xml')
Проблема заключается в следующем: при записи в файл в нём вместо обычной строки появляются следующие символы:
Работа
Плюс сам скрипт меняет кодировку xml файла с utf-8 на ansii. Как с этим справиться?


Ответ

parser = ET.XMLParser(encoding="utf-8") root = ET.parse("file.xml", parser=parser)
tree.write("out.xml", encoding="utf-8")

Как правильно указать время жизни ссылки в реализации трэйта

Как реализовать TraitFoo для структуры Foo?
#[derive(Debug)] struct Foo<'f>{ os: Option<&'f str> }
impl<'f> Foo<'f> { fn new(x:&'f str) -> Foo<'f>{ Foo{ os:Some(x) } } }
trait TraitFoo { fn foo(x:&str) -> Self; }
impl<'f> TraitFoo for Foo<'f>{ fn foo(x:&str) -> Foo<'f> { Foo{ os:Some(x) } } }

fn main() { println!("{:?}", Foo::new("one")); println!("{:?}", Foo::foo("two")); }
Этот код компилится с ошибкой:
G:\Work\Rust\test01\src\lf_trait.rs:21:12: 21:13 error: cannot infer an appropriate lifetime for automatic coercion due to conflicting requirements G:\Work\Rust\test01\src\lf_trait.rs:21 os:Some(x) ^ G:\Work\Rust\test01\src\lf_trait.rs:19:2: 23:3 help: consider using an explicit lifetime parameter as shown: fn foo(x: &'f str) -> Foo<'f> G:\Work\Rust\test01\src\lf_trait.rs:19 fn foo(x:&str) -> Foo<'f> { G:\Work\Rust\test01\src\lf_trait.rs:20 Foo{ G:\Work\Rust\test01\src\lf_trait.rs:21 os:Some(x) G:\Work\Rust\test01\src\lf_trait.rs:22 } G:\Work\Rust\test01\src\lf_trait.rs:23 }
Если добавить 'f в функции foo() то получим другую ошибку:
G:\Work\Rust\test01\src\lf_trait.rs:19:2: 23:3 error: method `foo` has an incompatible type for trait: expected bound lifetime parameter , found concrete lifetime [E0053] G:\Work\Rust\test01\src\lf_trait.rs:19 fn foo(x:&'f str) -> Foo<'f> { G:\Work\Rust\test01\src\lf_trait.rs:20 Foo{ G:\Work\Rust\test01\src\lf_trait.rs:21 os:Some(x) G:\Work\Rust\test01\src\lf_trait.rs:22 } G:\Work\Rust\test01\src\lf_trait.rs:23 }
Перепробовал еще кучу вариантов. Объясните как это правильно сделать.


Ответ

Вот ответ с английского форума от llogiq:
Нужно указать время жизни в определении трэйта
trait TraitFoo<'a> { fn foo(x: &'a str) -> Self; }
impl<'a> TraitFoo<'a> for Foo<'a> { fn foo(x:&'a str) -> Foo<'a> { Foo{ os:Some(x) } } }

Запуск тестов в разных браузерах одновременно

Как запустить один и тот же тест в нескольких браузерах одновременно?
Пытался использовать Selenium grid, но не хватило знаний и навыков гугления.
Запускаю на своей машине Windows 8.1 Использую JUnit Webdriver 2.0 maven


Ответ

Параллельный запуск тестов является одним из мощных средств для ускорения тестирования. Хорошо автоматизированные тесты должны быть независимыми, изолированными и воспроизводимыми, эти качества делают их идеальными для одновременного выполнения. Однако на практике не все тестовые классы разработаны с возможностью параллельного запуска. Такие аспекты, как общие изменяемые переменные, общий доступ к файлу и базе данных, или использование встроенного веб-сервера, могут сделать параллельный запуск тестов очень сложным или вообще невозможным. Тем не менее, одновременный запуск тестов, определенно, очень полезная вещь.
Начиная с версии 4.7 в JUnit была добавлена возможность параллельного запуска, для этого нужно настроить Maven следующим образом:
[...] org.apache.maven.plugins maven-surefire-plugin 2.12.3 methods [...]
Атрибут parallel может принимать значения «classes», «methods» или «both». При этом нельзя однозначно утверждать о количестве запущенных одновременно тестов, это напрямую зависит от параметров компьютера и настроек плагина по-умолчанию.
Во время запуска теста найдите следующую строку в консоли, она позволяет узнать параметры с которыми выполняется параллельный запуск:
------------------------------------------------------- T E S T S ------------------------------------------------------- Concurrency config is parallel='methods', perCoreThreadCount=true, threadCount=2, useUnlimitedThreads=false
Атрибут threadCount позволяет указать, сколько потоков должно быть выделено для запуска тестов (сколько тестов должно запускаться параллельно). Обратите внимание, что его использование с параметром perCoreThreadCount, установленным в true, может исказить реальное количество запускаемых одновременно тестов. В то же время perCoreThreadCount позволяет добиться большей гибкости при запуске тестов на разных машинах. Например, при запуске тестов со следующей конфигурацией на машине с 2-х ядерным процессором, одновременно будут выполняться 4 тестовых класса, а не 2:
[...] org.apache.maven.plugins maven-surefire-plugin 2.12.3 classes true 2 [...]
Существует еще такой атрибут как useUnlimitedThreads. При его использовании будет создаваться столько потоков, сколько классов или методов в Вашем проекте, и все тесты будут пытаться запуститься одновременно. useUnlimitedThreads отлично работает для юнит-тестов, но для функционального web тестирования его лучше не использовать.
Настройки конфигурации полностью зависят от характера Ваших тестов, поэтому стоит поэкспериментировать с различными конфигурациями и посмотреть, какой из вариантов настройки больше всего подходит для Вас.
Информация взята с Блога вебразработчика
В будущем советую все таки использовать Google. И не бояться эксперементировать со своим проектом. Надеюсь предоставленная информация Вам поможет, удачи в дальнейших трудах)

Как blob.sql конвертировать на String

Есть вывод с базы JDBC, и там прописан код
str += ("[" + "'" + rs.getInt("ID") + "', " + "'" + rs.getString("NAME") + "', " + "'" + rs.getString("TYPE") + "', " + "'" + rs.getString("DATA") + "', " + "'" + rs.getBlob("MESSAGE") + "', " + "'" + rs.getInt("ID2") + "', " + "'" + rs.getString("NAMEDOCUMENT") + "', " + "'" + rs.getInt("ID1") + "', " + "'" + rs.getString("STATUS") + "'],");
поля Message у меня типа blob, и когда я принимаю его в Ext JS то value у него ссылка на объект как конвертировать что бы на Ext JS выходило значения ??


Ответ

BLOB (binary large object) — это двоичные данные неспецифицированного формата. Не очень понятно, почему у вас Message (вероятно, текстовые данные) хранятся в виде BLOB. Для больших текстовых данных должен использоваться тип CLOB (character large object).
Если вы хотите вывести содержимое BLOB, интерпретируя его, как текст, вам надо знать, в какой кодировке этот текст был туда записан. Предположим, UTF-8. Тогда можно сделать так:
// ограничим максимальную длину блока данных, чтобы память не кончилась int LENGTH_LIMIT = 100_000; Blob blob = rs.getBlob("MESSAGE"); long length = blob.length(); // а лучше кидать исключение, если неожиданно слишком большая длина if(length > LENGTH_LIMIT) length = LENGTH_LIMIT; byte[] data = blob.getBytes(0, (int)length); String message = new String(data, StandardCharsets.UTF_8); // теперь используйте message
В заключение скажу, что формировать JSON конкатенацией строк очень плохо. Вы сильно попадёте на первой одинарной кавычке внутри текста сообщения. Есть много готовых библиотек для того, чтобы сделать это быстро и безопасно.

Сложный список angular

Есть массив типа =
[ {"name":"Name","dep":"Dep1"}, {"name":"Name","dep":"Dep1"}, {"name":"Name","dep":"Dep1"}, {"name":"Name","dep":"Dep2"}, {"name":"Name","dep":"Dep3"}, ]
Вопрос вот в чем. Как его правильно вывести с помощью ng-repeat или чего другого если нужно каждый новый отдел в списке отделять разделителем?
Примерно так:

Dep1
Name
Name
Name
Dep2
Name
Name


Ответ

function Controller($scope) { $scope.data = [ {"name":"Name","dep":"Dep1"}, {"name":"Name","dep":"Dep1"}, {"name":"Name","dep":"Dep1"}, {"name":"Name","dep":"Dep2"}, {"name":"Name","dep":"Dep3"} ]; } .is-other { border-top: 1px solid; } .is-other:first-child { border-top: none; }

  • {{item.dep}} -> {{item.name}}

function Controller($scope) { $scope.data = [ {"name":"Name","dep":"Dep1"}, {"name":"Name","dep":"Dep1"}, {"name":"Name","dep":"Dep1"}, {"name":"Name","dep":"Dep2"}, {"name":"Name","dep":"Dep3"} ]; } .dep { background: silver; }
{{item.dep}}
{{item.name}}

Как правильно собрать пакет с nginx-ом и сторонним модулем?

В отличие от apache, модули nginx-а компилируются непосредственно в саму программу.
Как правильно пересобрать пакет с nginx-ом в debian-основных дистрибутивах, включив в код программы какой-нибудь сторонний модуль?


Ответ

пример для модуля nginx-rtmp, но подойдёт и для любого другого. только исходники модуля надо будет брать по другой ссылке и распаковывать в каталог с другим именем (не nginx-rtmp-module).
установим необходимые для сборки пакеты:
$ sudo apt-get update $ sudo apt-get install build-essential $ sudo apt-get build-dep nginx создадим где-нибудь в домашнем каталоге «сборочный» каталог и «перейдём» в него:
$ mkdir -p ~/sborka/nginx $ cd ~/sborka/nginx скачаем и распакуем исходники дистрибутивного пакета nginx
$ apt-get source nginx помимо нескольких необходимых файлов появился и каталог с исходниками пакета — nginx-номер.версии. «перейдём» в него:
$ cd nginx-номер.версии в каталоге debian/modules хранятся каталоги с исходниками модулей, которые собираются в одно целое с программой nginx. туда и скачаем исходники дополнительного модуля, в каталог (к примеру) debian/modules/nginx-rtmp-module (т.к. нам не нужна вся история из репозитория, добавим опцию --depth 1):
$ git clone --depth 1 https://github.com/arut/nginx-rtmp-module.git debian/modules/nginx-rtmp-module теперь самое «сложное» — надо добавить опцию --add-module=путь/к/модулю в «правильном» месте, чтобы она была передана скрипту configure при сборке пакета.
делается это в файле debian/rules. это «обыкновенный» makefile, но «особого, debian-овского назначения». тут два варианта:
в более старых версиях пакета надо использовать переменную CONFIGURE_OPTS. если есть её упоминания, то добавьте где-нибудь в начале файла строку:
CONFIGURE_OPTS = --add-module=$(MODULESDIR)/nginx-rtmp-module в более новых есть переменная common_configure_flags. найдите строки вида:
common_configure_flags := \ --with-cc-opt="$(debian_cflags)" \ ... --with-http_realip_module \
и после последней добавьте нужную строку, чтобы выглядело примерно так (не забудьте про обратный слэш в конце строки и не удаляйте следующую пустую строку):
common_configure_flags := \ --with-cc-opt="$(debian_cflags)" \ ... --with-http_realip_module \ --add-module=$(MODULESDIR)/nginx-rtmp-module \ теперь можно собирать пакет (точнее, их соберётся несколько разных):
$ dpkg-buildpackage -b -us -uc
если последняя команда завершилась успешно (строкой типа dpkg-buildpackage: binary only upload (no source included)), то пакеты — собрались.
файлы с ними лежат на каталог выше текущего, т.е. непосредственно в нашем «сборочном» каталоге ~/sborka/nginx. там присутствуют файлы, включающие в названии буквы dbg — это пакеты с отладочной информацией, они обычно не нужны.
нужен как минимум пакет из файла nginx-common_версия.и.другие.буквы.deb и один из пакетов, начинающихся с: nginx-core (базовая функциональность, «умолчальная» версия) или nginx-light («облегчённая» версия) или nginx-full («навороченная» версия).
для начала удалите установленную версию nginx (если есть):
$ sudo apt-get remove 'nginx-*'
и поставьте собранные пакеты из файлов:
$ sudo dpkg -i ~/sborka/nginx/nginx-common_*.deb ~/sborka/nginx/nginx-core.*.deb
если в выводе команды появятся упоминания про неудовлетворённые зависимости, установите их, выполнив:
$ sudo apt-get -f install
теперь можно проверить, присутствует ли упоминание про тот модуль, который вы добавляли (пример был про rtmp, эту строку и ищем):
$ /usr/sbin/nginx -V |& sed 's/ /
/g' | grep rtmp --add-module=/home/.../sborka/nginx/nginx-версия/debian/modules/nginx-rtmp-module
есть такая буква в этом слове!™

Генерация нормально распределённой случайной величины в Python

Я хочу для генерации нормально распределённой случайной величины на языке Python воспользоваться методом random.normalvariate(mu, sigma) из модуля random. Однако я не сумел найти как этот метод реализован. Я надеюсь что там используется метод Бокса-Мюллера в одной из двух вариаций, расписанных на Википедии (потому что ещё есть методы, основанные на ЦПТ, которые мне не нравятся). Основной вопрос: это так или нет? Где можно посмотреть реализацию этого метода?


Ответ

В исходниках 2.7 и в 3.5 (ссылка есть в другом ответе) написано следующее:
def normalvariate(self, mu, sigma): """Normal distribution. mu is the mean, and sigma is the standard deviation. """ # mu = mean, sigma = standard deviation
# Uses Kinderman and Monahan method. Reference: Kinderman, # A.J. and Monahan, J.F., "Computer generation of random # variables using the ratio of uniform deviates", ACM Trans # Math Software, 3, (1977), pp257-260.

Как рисовать в Matplotlib в комплексных координатах?

Требуется изобразить вот такую функцию:
w(omega) = 1/(1 + 1j*omega)
в комплексных координатах. Как?


Ответ

Вот такой вариант вам не подойдет?
import numpy as np import matplotlib.pyplot as plt omega = np.linspace(0, 5, 100) w = 1 / (1 + 1j*omega) plt.figure(1) plt.scatter(w.real, w.imag) plt.show()

Как в скрипт на bash через консоль передать строку параметром?

Подскажите как можно передать строку параметром для bash скрипта.
Сам скрипт:
#!/bin/bash convert -font helvetica -fill white -pointsize 16 -draw 'text 10,50 "'$1'"' /var/www/img/display.jpg /var/www/img/comment.jpg
Пробовал вызвать так:
# ./display.sh "проверка текста"
И так:
# ./display.sh проверка\ текста
Скрипт воспринимает текст как два параметра, хочу разобраться как можно сделать, чтобы понимал как один параметр.


Ответ

Bash переменные вставляет всегда как один параметр внутри двойных кавычек и разбивает по пробелам если кавычек нет. У вас $1 стоит вне кавычек. Нужно написать так:
convert -font helvetica -fill white -pointsize 16 -draw 'text 10,50 "'"$1"'"' /var/www/img/display.jpg /var/www/img/comment.jpg

Проектирование базы данных при DDD (Domain-Driven Design)

Постараюсь кратко описать мой теоретический и не очень актуальный, но интересующий вопрос.
В подходе DDD при проектировании приложения отталкиваются от проектирования доменной логики. Если есть у кого-то опыт, посоветуйте, как тогда проектировать базу данных. А то подход DDD мне теоретически понятен когда незыблемая БД уже есть. А если ее нет и ведется командная разработка и когда одну часть системы делает одна команда разработчиков, а другую - другая, то уже совсем не понятно. Если сначала проектировать БД для всей системы, то название domain-dd не совсем себя оправдывает, так как отталкиваемся уже не от проектирования домена, а от проектирования БД...

Постараюсь теперь подробнее описать вопрос, с приведением простого теоретического примера конкретной ситуации, в которой этот вопрос может возникнуть.
В DDD есть два термина:
Ubiquitous language - повсеместный язык Bounded context - ограниченный контекст
То есть одна и та же сущность должна быть по-разному спроектирована в зависимости от того, в каком контексте она используется.
Например, если рассмотреть какую-нибудь систему ERP для планирования ресурсов предприятия, в котором сотрудники сидят и с помощью приборов делают работы. В этой системе могут быть следующие сущности:
Сотрудники Приборы Работы
У системы могут быть две функции:
Вести учет Приборов, то есть за каким сотрудником числится какой прибор. Вести учет Работ, то есть какие работы были или будут сделаны и какие сотрудники и приборы в этом участвуют.
На сколько я понимаю, понятие ограниченного контекста (bounded context) введено, чтобы разграничить проектирование приложения на части, чтобы отдать эти части для разработки разным командам программистов. На сколько я понимаю, в данном примере ограниченные контексты это и есть две функции системы: учет пользователей и учет приборов.
Понятие повсеместного языка - на сколько я понимаю это когда заказчик и разработчик разговаривают на одном языке. В нашем примере заказчика два: тот отдел организации, который следит за инвентарем и тот отдел, который следит за выполнением работ.
Если взять отдел инвентаризации, то Прибор в данном контексте должен иметь одни поля, например, модель, инвентарный номер, и т.д. А в контексте учета работ, у Прибора должны быть другие поля, но некоторые совпадают: так же модель, но еще и технические характеристики, и установленная ОС, ну а инвентарный номер здесь не нужен. Так же и у Сотрудника разные поля в разных контекстах.
То есть, ситуация такая, что одной команде разработчиков дали разрабатывать контекст инвентаризации, а другой - учета работ. При этом для одной команды прибор и сотрудник - это одно, а для другой команды прибор и сотрудник это другое.
Вопрос. Как двум командам разработчиков, работающим над разными частями системы и видящих логические сущности приложения по-разному, приступить к проектированию базы данных? Ведь если они сначала скооперируются и сделают общую базу данных, где есть сотрудники со всеми полями и дополнительными таблицами и приборы со всеми полями и дополнительными таблицами, то это уже будет не совсем DDD, так как отталкиваемся не от проектирования домена, а от проектирования данных.
Так же интересуют любые советы и если кто поделится своим опытом, о том, как проектировать БД когда над системой работают несколько разных групп людей с разным видением...


Ответ

На сколько я понимаю, понятие ограниченного контекста (bounded context) введено, чтобы разграничить проектирование приложения на части, чтобы отдать эти части для разработки разным командам программистов.
Мне кажется, что в первую очередь здесь имеет смысль разделение на модули, а возможность разработки различными командами это уже следствие такого разделения.
Так как у сущности может быть множество атрибутов которые, зачастую, используются небольшими группами в различных функциях проще сразу разделить такую сущность на эти группы атрибутов и использовать их независимо, чем везде таскать одну и туже сущность большая часть которой, в заданном контексте, не нужна и образует только лишнюю связанность кода.

У Вас есть сервер приложений где описана модель Ваших данных и бизнес-логика которая умеет менять состояние этой модели. Модели должно быть все равно где и как хранится ее состояние.
В Вашей ситуации главное то, как выглядит модель данных на сервере приложений и то, как реализована ее бизнес-логика. Ведь описание сущностей и их атрибуты ровно как и методы этих сущносетй должны быть понятны всем участникам процесса и соответсвовать тому как они все себе это представляют опираясь на общий язык.
На сколько я понимаю, DDD подразумевает длительный процесс выработки модели предметной области в течении которого она будет достаточно часто меняться пока более менее не устаканится. В таком случае сразу скооперироваться и сделать общую базу данных так просто не получится, так как модель еще толком не ясна. Поэтому, в первую очередь, Вы будете создавать и менять модель данных на сервере приложений и уже во вторую очередь придумывать как она будет хранится. Но это не означает то, что в процессе изменения модели данных так же сильно должно меняться и хранилище данных (может меняться только слой абстракции в виде представлений).

Что касается БД - то тут можно пойти по разному. У вас есть база данных которая хранит состояние Вашей модели и осуществляет проверку целостности данных. На БД часто налагают различные технические требования так, что вопрос распределения данных по таблицам может, в большей степени, относится к решению этих технических проблем, а не к соответствию 1 в 1 с Вашей моделью данных.
То, что у сотруника в разных контекстах есть как общие атрибуты так и частные напоминает наследование. А для наследования придумали различные способы хранения данных в таблицах, такие как Single Table Inheritance, Class Table Inheritance и Concrete Table Inheritance
В Вашем случае вполне может быть подходящим второй способ. Тогда Вы сможете определить и выделить общие черты нужных сущностей и положить их в одну таблицу позволив разным командам создать таблицы для атрибутов этой сущности относящихся только к их задачам. Или даже третий способ для начала, чтобы быть полностью независимыми друг от друга. У каждого подхода будут как свои плюсы так и минусы как в плане добавления\удаления атрибутов так и в плане взаимопересечения команд и дублирования данных.
Независимо от варианта со структурой таблиц стоит использовать дополнительный слой абстракции над этими таблицами в виде представлений. Такой подход позволит склеить разные или разделить одну таблицы. В дальнейшем, когда сама модель данных перестанет сильно меняться, можно будет рассмотреть первый вариант. Это должно будет упростить логику приложения и, возможно, снизить размер сохраненного состояния.

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

Что означают числа ошибок в выводе badblocks?

Что означают эти цифры 139/0/0 ?
Testing with pattern 0xaa: done Reading and comparing: 99.12% done, 2:05:16 elapsed. (139/0/0 errors)


Ответ

согласно этому ответу три цифры расшифровываются как:
num_read_errors, num_write_errors, num_corruption_errors corruption means comparison with previously written data
или:
количество_ошибок_чтения, количество_ошибок_записи, количество_ошибок_повреждения «ошибка повреждения» означает — в сравнении с записанными перед этим данными.

При добавлении класса анимация с keyframes работает, а при удалении нет, хотя transition задано

В этом примере все достаточно очевидно и отрабатывает правильно
$('div').click(function() { $('div').toggleClass('wide'); }); div { width: 80px; height: 30px; background-color: green; transition: all 0.4s ease-in-out; } .wide { width: 140px; background-color: blue; }


Но мне необходимо усложнить анимацию, как это сделать правильно? При добавлении keyframes анимация отрабатывает только при добавлении класса, а при удалении все происходит без анимации.
$('div').click(function() { $('div').toggleClass('wide'); }); div { width: 80px; height: 30px; background-color: green; transition: all 0.4s ease-in-out; } @keyframes blue { 50% { background-color: blue; } 100% { width: 200px; background-color: blue; } } .wide { animation-name: blue; animation-duration: 0.4s; animation-fill-mode: both; }

Как мне необходимо организовать код, чтобы анимация по клику отрабатывала "в обе стороны"?


Ответ

Анимации (animation), в отличие от переходов (transition), работают только в одну сторону. Переключение направления нормально не поддерживается.
Вообще-то существует свойство animation-direction, но оно не поможет, потому что, если имя анимации не меняется, то элемент продолжает "проигрывать" одну и ту же последовательность. Если изменить направление, то анимация будет всё ещё в завершённом состоянии, и просто изменится конечное значение, которое браузер и применит моментально. И удаление имени анимации animation-name не поможет, потому что в этом случае сбросится и конечное значение, что вас не устроит (animation-fill-mode у вас both). Что касается переходов, то они существуют отдельно от анимаций, анимировать одни и те же свойства двумя способами бессмысленно, а свойства переходов на анимации не влияют.
Если хотите анимировать в обе стороны, то нужно использовать или анимации с двумя отдельными @keyframes для каждого направления, или переходы, которые поддерживают изменение направления.
См. также:
Reverse Keyframe animation with Javascript Possible to reverse a css animation on class removal?

Роуты и категории rails

Есть post и post_category, post_category связана с post по post_category_id
class Post < ActiveRecord::Base belongs_to :post_category end
class PostCategory < ActiveRecord::Base has_many :posts end
Есть категория к примеру Еда, при добавлении категории есть поле seo_url
К примеру:
"Еда" seo_url "food"
Я хочу для начала получить ссылку на посты вида^
site.ru/food/13
Как это сделать?


Ответ

Я так понимаю, вас больше интересует разбор ссылок, то есть, роутинг
Если делать наивно, рельсово, ресурсно, то получится поначалу такое (чтобы было удобнее смотреть вывод rake routes, я добавил only: [:show], можно потом убрать):

resources :post_categories, only: [:show] do resources :posts, only: [:show] end # Категория: /post_categories/:id # Пост: /post_categories/:post_category_id/posts/:id
Сначала уберём хвосты, ресурсы в множественном числе. Это просто, resources принимает опцию :path, которая отвечает именно за это. По умолчанию это имя ресурса. А если поставить там пустую строку, то весь сегмент "схлопнется":
resources :post_categories, path: '', only: [:show] do resources :posts, path: '', only: [:show] end # Категория: /:id # Пост: /:post_category_id/:id
Это довольно опасно, поскольку под эти две маски подходит вообще любой путь из одного и двух сегментов соответственно. Именно поэтому path по умолчанию непустой, он служит "маркером" того, что ссылка относится к ресурсу. Если его убрать — удостоверьтесь, что этот паттерн не "съел" (сделал недоступными) другие ваши маршруты. Для этого, например, можно разместить этот блок как можно ниже, ведь чем выше маршрут, тем выше его приоритет и тем раньше проверяется совпадение с ним.
Косметика
В рельсах принято под идентификатором/ключом вида <...>_id хранить значение первичного ключа обозначаемой модели. Поскольку на категорию вы будете ссылаться по её "хвосту" (предпочитаемый мной перевод slug), есть смысл переименовать соответствующий параметр. Запросто. Опция называется, неожиданно, :param
resources :post_categories, path: '', param: :name, only: [:show] do resources :posts, path: '', only: [:show] end # Категория: /:name post_categories#show # Пост: /:post_category_name/:id posts#show
Мелкие детали
В модели есть смысл реализовать to_param для генерации ссылок хелперами. В контроллерах есть смысл выделить получение записи в before_action friendly_id полезен для генерации "хвостов" из пользовательского ввода.

Перебирать порты для соединения по ssh в Ansible

Есть, к примеру, хост:
[api] 10.0.0.1 ansible_connection=ssh ansible_ssh_user=root ansible_ssh_port=22
Здесь мы указываем 22 порт для ssh. Но на некоторых серверных стоит другой порт, скажем 220
Возможно как-то задать дополнительный порт для соединения по ssh на случай, если не смог присоединиться по 22? Каким-нибудь списком, чтоб Ansible по очереди перебирал.


Ответ

Частично воспользовался примером от Nick Volynkin.
Вначале плейбука проверяем порты, выбираем тот, что доступен и устанавливаем в ansible_ssh_port, после чего Ansible будет уже подсоединяться к машине по этому порту. Единственный минус - использованием wait_for. То есть, в данном случае мы ждём 15 секунд (т.к. проверяем 3 порта), пока порты проверятся.
- name: just test hosts: server gather_facts: false vars: list_of_ssh_ports: [22, 220, 234] tasks: - name: test ssh on port sudo: no local_action: wait_for port={{item}} timeout=5 host={{inventory_hostname}} register: ssh_checks with_items: "{{list_of_ssh_ports}}" ignore_errors: true - debug: msg = "{{item}}" with_items: "{{ssh_checks.results}}" - name: set available ansible_ssh_port sudo: no set_fact: ansible_ssh_port={{item.item}} when: ssh_checks is defined and {{item.elapsed}} < 5 with_items: "{{ssh_checks.results}}" - hosts: server roles: - остальные таски

Как сделать фигуру Shape в форме правильного круга при отображении на всех экранах

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


Ответ

UPD . Для создания виджета с фоном в форме правильного круга, картинкой (здесь res/drawable/rating.png) и подписью снизу, произвольного размера, используется такая конструкция:
res/drawable/image_in_circle.xml


размер круга будет подгонятся под размер вложенной картинки с отступами 5dp
использование:

Результат на всех экранах одинаков:
так же нелишним будет указать, что за фигуру вы рисуете (android:shape="oval"), так как Shape рисует и прямоугольник и дуги и др.
PS: в вашей разметке цвет, указанный первым (#FFFFFF) ни на что не влияет

WebView vs Chromium. В чем разница?

Какая разница между "обычным" WebView и WebView основанном на Chromium? Чем второй лучше/хуже?


Ответ

Обычный WebView - старый, основаный на Chromium - новый. По сути это вся разница между ними. Новый поддерживается на новых девайсах, умеет больше стандартов, быстрее, что-то устаревшее удалено и т.п. Просто новая версия.
http://developer.android.com/guide/webapps/migrating.html - здесь различия на уровне кода
https://www.timroes.de/2013/11/23/old-webview-vs-chromium-webview/ - здесь разница в скорости
http://www.mobilexweb.com/blog/android-4-4-kitkat-browser-chrome-webview - здесь обзор ситуации

AutoScroll при поиске в DataGridView (WinForms)

У меня в гриде показываются данные из БД, и когда я делаю поиск по номеру ID, то соответствующая строка помечается в списке зеленым цветом, но когда эта строка находится не в видимой части грида, то не делается AutoScroll, чтобы показать строку, а только помечает.
Как написать код для AutoScroll, чтобы помечал строку и сразу же показал??


Ответ

В подобных ситуациях обычно помогает свойство CurrentCell у грида. Возьмите любую ячейку из найденной строки и назначьте её этому свойству. Тогда грид автоматически "перемотает" таблицу в нужное место.
dataGridView1.CurrentCell = dataGridView1[i, j];
i-номер колонки;
j-номер найденной строки.

Условия в шаблоне Django, вывести Div только на главной

Добрый день, подскажите, пожалуйста, как вывести div в шаблоне Django только на главной странице сайта. Мне кажется что должно быть какое-либо условие в шаблоне.
Заранее большое спасибо!


Ответ

У вас сейчас один общий шаблон на все страницы? Если да то у вас, как минимум, два варианта: дополнять(extend) базовый шаблон шаблоном для главной страницы; или контролировать контекст передаваемый именно для главной страницы.
Ссылки на тег {% extends %}
tangowithdjango.com/book/chapters/templates tutorial.djangogirls.org/en/template_extending
Для более полного ответа - нужен более развернутый вопрос.

Анимация FloatingActionButton

Подскажите как сделать анимацию как в этом примере
Смысл: После нажатия на FloatingActionButton, она расширяется на весь view, заполняя его цветом самой FloatingActionButton
Возможно есть готовые примеры?


Ответ

Данная анимация называется CircularReveal. Я скину Вам свой пример, а там уж подгоните под себя по размерам.
Сначала в build.gradle прописываем compile 'com.github.ozodrukh:CircularReveal:1.1.1'
Вот 4 основных метода
private void animateFab() {
fabButton.animate().translationXBy(0.5f).translationY(-60).translationXBy(-0.9f) .translationX(-220).setDuration(150).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); animateReavel((int) fabButton.getX(), 50); } });
}
private void animateFabBack() { fabView.setVisibility(View.INVISIBLE); fabButton.setVisibility(View.VISIBLE); fabButton.animate().translationXBy(0.5f).translationY(0).translationXBy(-0.9f) .translationX(0).setDuration(150).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); isFabOpen = false; } }); }
private void animateReavel(int cx, int cy) { float finalRadius = hypo(fabView.getWidth(), fabView.getHeight());
SupportAnimator animator = ViewAnimationUtils.createCircularReveal(fabView, cx, cy, 0, finalRadius); animator.addListener(new SupportAnimator.AnimatorListener() { @Override public void onAnimationStart() { fabButton.setVisibility(View.INVISIBLE); fabView.setVisibility(View.VISIBLE); isFabOpen = true; }
@Override public void onAnimationEnd() { }
@Override public void onAnimationCancel() { }
@Override public void onAnimationRepeat() { } });
animator.setInterpolator(new AccelerateDecelerateInterpolator()); animator.setDuration(400); animator.start();
}
private void animateReavelBack() { float finalRadius = hypo(fabView.getWidth(), fabView.getHeight());
SupportAnimator animator = ViewAnimationUtils.createCircularReveal(fabView, (int) fabButton.getX(), -50, finalRadius, fabButton.getWidth()); animator.addListener(new SupportAnimator.AnimatorListener() { @Override public void onAnimationStart() { }
@Override public void onAnimationEnd() { fabView.setVisibility(View.INVISIBLE); animateFabBack(); }
@Override public void onAnimationCancel() { }
@Override public void onAnimationRepeat() { } });
animator.setInterpolator(new AccelerateDecelerateInterpolator()); animator.setDuration(200); animator.start();
}
Примечания:
animateFab() - метод анимации кнопки, которая под конец вызывает анимацию новой вьюшки.
fabButton - собственно, сама кнопка. fabView - та самая вьюшка в которую "размывается" fabButton. тут сами ее настроите.
animateRevealBack() - в примере нигде не вызывается. Тут уж прикрутите куда надо. Собсна вся анимация наоборот.

Защита от Self-XSS

Есть ли какие-нибудь защитные алгоритмы от этой атаки?


Ответ

Self-XSS - один из видов социальной инженерии, при котором словами от жертвы добиваются того, что он/она самостоятельно выполняет вредоносный javascript-код, путем его копирования в адресную строку или консоль разработчика.
Бороться можно пробовать только путем инструктажа пользователей. Наподобие:
Дорогие пользователи! Пожалуйста не верьте личным сообщениям, сулящим смерть вашему любимому актеру, ежели вы немедленно не скопируете в адресную нижеприведенный код, и не нажмете enter.
По другому - никак. Это психология - техническими средствами уж точно тут не поможешь.

django. отправка email на localhost`e

Подскажите, каким образом я могу отправить письмо на почтовый ящик на локальном сервере. джанго работает на localhost:8080 для отправки (как прочитал в документации) нужен SMTP сервер. Запускаю тоже локальный
python -m smtpd -n -c DebuggingServer localhost:1025
получаю localhost:1025 во вьюхе
send_mail('theme', 'my messege', 'admins@studio.ru', ['a@a.ru'])
ловил разные ошибки, например с getaddrinfo(host, port) добавил во вьюху
import socket socket.getaddrinfo('localhost', 8080)
сейчас ошибка [Errno 11004] getaddrinfo failed
(code, msg) = self.connect(host, port)
я вообще не знаю как настраивать (новичек) и написал в сеттингс:
EMAIL_HOST = 'localhost:8080' EMAIL_HOST_USER = 'username@domain.ru' EMAIL_HOST_PASSWORD = '' EMAIL_PORT = 1025
у верен в сеттингс проблема. Подскажите как все правильно настроить?


Ответ

Для разработки мне подходит решение в одну строчку. Все отправленные письма будут просто выводится в консоль(stdout).
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
Если вам все же необходимо настроить работу почты через отправку сервером. Запускаем питоновский почтовик
python -m smtpd -n -c DebuggingServer localhost:1025
В файл настроек приложения
EMAIL_HOST = 'localhost' EMAIL_PORT = 1025
Всё :)
Подробнее:
Ссылка на документацию Stackoverflow Test sending email without email server

Динамическое создание tab

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


Ответ

Вам надо пользовать самое свежее решение: TabLayout из android.support.design либы от гугла
Добавляем библиотеку в build.gradle вместе с библиотекой поддержки:
compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' Создаём/находим в разметке TabLayout
TabLayout tabLayout = ...; На лету создаём и добавляем табы:
tabLayout.addTab(tabLayout.newTab().setText("Tab 111111111111")); tabLayout.addTab(tabLayout.newTab().setText("Tab 222222222222")); tabLayout.addTab(tabLayout.newTab().setText("Tab 333333333333"));

Проблемы с permissions на Android 6

При первом запуске приложения делаем запрос разрешения Manifest.permission.READ_EXTERNAL_STORAGE, одобряю его, и пытаюсь получить изображение из галареи. При попытке что-то сделать с файлом, получаю
java.io.FileNotFoundException: /storage/emulated/0/Download/temporary_file.png: open failed: EACCES (Permission denied)
Если перезапустить приложение, то разрешение повторно не запрашивается, так как оно уже подтверждено, и все работает как надо, файлы из галереи нормально достаются.
На текущий момент "проблема одного девайса", воспроизводится только у меня, и еще у одного человека. Но что-то мне подсказывает, что будут еще устройства с повторяющейся проблемой.
Воспроизводится на Nexus 5 c android 6.0 и 6.0.1 На нексусе 6 все ок работает.
UPD Так же сделал тестовый проект, на котором воспроизводится проблема


Ответ

В общем я выяснил, что это баг в прошивке. Подробное описание
Пока я обошелся не совсем крутым решением, но рабочим. Если выставить targetSdkVersion 22, то пермишены начинают работать постаринке.

Пользовательские классы, композиция

Файл tree.h:
#pragma once #include "node.h" class tree { node *rootNode;
public: tree(); ~tree(); };
Файл node.h:
#pragma once #include "tree.h" #include class node { public: std::string fromTree;
private: int valueint; int numberint; int parentint; int leftChildint; int rightChildint;
public: node(); ~node(); int value(); void value(int getV); int number(); void number(int getN); bool isRoot(); bool isEmpty(); int parent(); void parent(int getP); int leftChild(); void leftChild(int getLC); int rightChild(); void rightChild(int getRC); bool hasLeftChild(); bool hasRightChild(); };
На строчке
node *rootNode;
выдает ошибки:
error C2143: синтаксическая ошибка: отсутствие ";" перед "*" error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
Причем каждую по два раза. node цветом помечает, как положено. Не могу понять, что не так, учитывая, что в других программах аналогичная конструкция работает.
Visual Studio 2013


Ответ

У Вас файлы друг друга подключают, получается циклическая зависимость, что недопустимо. При подключении в файле node.h заголовочного файла с классом tree класс node еще не определен.
Вообще, непонятно, для чего он подключается, потому что он в файле node.h не используется.
Если все же нужно будет при объявлении классов, чтобы они использовали друг друга, лучше не подключать заголовки, если они не нужны (например, при использовании только указателей на класс без вызова методов класса), а использовать forward declaration. На примере файла tree.h это будет выглядеть так:
class node; class tree { node *rootNode;
public: tree(); ~tree(); };

Автоматическое создание поддомена

Могу ли я сделать так? Существует некий юзер на сайте, у него есть функция создать компанию. После нажатия необходимо на сервере создать новый поддомен такого вида: nameCompany.site.ru При переходе по ссылке nameCompany.site.ruнеобходимо отображать frontend, но если такого не существует кидать ошибку?


Ответ

Да, можете. Настраиваете любой веб-сервер, что бы запросы всех поддоменов шли на один входной php скрипт, в котором уже реализуете проверку поддоменов и свой роутинг.
UPD
Как мне правильно напомнили, забыл написать про обязательную конфигурацию так же DNS, что бы запросы на все поддомены в принципе доходили до сервера.

отладочная консоль и windows 10

Раньше, когда я не перешел на "вин 10", я всегда использовал в своих программах вот такой простенький код для создания консоли в не консольных приложениях(код работал в вин 7,8,8.1):
void createConsole() { setlocale(0, "Russian"); int hConHandle; long lStdHandle; FILE *fp; AllocConsole(); lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE); hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); fp = _fdopen(hConHandle, "w"); *stdout = *fp; setvbuf(stdout, NULL, _IONBF, 0); }
Выводил в консоль данные с помощью обычного "printf", далее я перешел на вин 10 и испробовал скомпилировать свой проект на этой платформе - со старым кодом. К моему удивлению в не консольном приложении нечего в консоль не вывелось, а в консольном посредством функции "printf" вывелось - но я не смог вывести русский шрифт не смотря на то, что я задал кириллицу "setlocale(0, "Russian");". Далее погуглив на счет кодировки я все же смог выставить "русскую кодировку" в консольном приложении:
//Устанавливаем русский язык if (system("chcp 1251")) { message("Не удалось установить русский язык в консоле!"); }
SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода setlocale(LC_ALL, "Russian");
Проблема заключалась в следующем, мне консоль очень нужна в "не консольном" приложении и погуглив я нашел другой код для создания и вывода данных в консоль на "msdn":
HANDLE handle; void createConsole(){ AllocConsole(); handle = GetStdHandle(STD_OUTPUT_HANDLE); }
bool write(std::string description, ...) { char buf[1024]; memset(buf, 0, sizeof(buf));
va_list vaList; va_start(vaList, description); vsprintf_s(buf, (description + "
").c_str(), vaList); va_end(vaList);
if (WriteConsoleA(handle, buf, strlen(buf), 0, 0) == 0) {
return false; }
return true; }
Консоль работает- все данные выводятся - но я не могу выводить русские символы в консоль, даже этот код не помогает и не могу выводить информацию через "printf":
//Устанавливаем русский язык if (system("chcp 1251")) { message("Не удалось установить русский язык в консоле!"); }
SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода setlocale(LC_ALL, "Russian");
Собственно вопросы:
Почему в вин 10 перестал работать старый код для создания консоли? Почему я не могу выводить кириллицу в новую консоль и может ли это зависеть от языкового пакета установленного на мою винду 10? Почему не могу выводить данные через printf в не консольном приложении?
Так как я начинающий программист, хотелось услышать мнение профи о том нужна ли вообще отладочная консоль и если нет то что тогда используют профи или может я не правильно работаю с консолью, как вообще нужно делать правильно и грамотно?


Ответ

О том как выводить русский текст в консоль написано тут - Русский язык в консоли
Однако, судя по всему Вы используете консоль только для логов. В Windows для этого есть система отладочного вывода, а именно функция OutputDebugStringW, вывод которой можно смотреть в отладчике, или в утилите DebugView
Способ, который используется в промышленном программировании - это библиотеки логов. Развитые системы логирования поддерживают различные приемники логов, в т.ч. stdout/stderr и OutputDebugString

Временные файлы при клонировании git репозитория

При клонировании большого git репозитория на диске начинает кончаться место. Это логично. При этом папка где должен лежать репозиторий в размерах не меняется. Из этого я делаю вывод что git где-то хранит временные файлы при закачке репозитория. Проблема в том, что если возникает ошибка (которая собсвенно и возникла), то эти файлы висят мертвым грузом где-то на диске. Как их найти?
Я проверял размер именно папки .git. При процессе клонирования репозитория она в размерах не меняется. Если отменить клонирование, то через некоторое время она приобретает такой размер, какой и должен быть. По логике ведь если все сохраняется туда то и размер с течением времени должен меняться? А так получается словно файлы из временной папки которые успели склонироваться перемещаются после отмены процедуры в git папку. Как это объяснить еще?
ОС — Windows 7.


Ответ

Все внутренние файлы git хранит в папке .git. Она скрытая и лежит в той папке, куда происходит клонирование. Если произошла ошибка и вы хотите клонировать заново — просто найдите и удалите эту папку.
Как правильно удалить Git tracking (контроль версий)?
При процессе клонирования репозитория она в размерах не меняется. Если отменить клонирование, то через некоторое время она приобретает такой размер, какой и должен быть.
Если в папку пишутся достаточно большие блобы (Binary Large OBject), то её размер на диске будет меняться ступенчато, хотя запись происходит непрерывно. То есть файл какое-то время открыт на запись и пишется, но его размер не пересчитывается. Потом запись прерывается (либо от ошибки, либо потому что файл завершен) и регистрируется новый размер файла
Кстати, файлы — не временные. Это постоянное внутреннее хранилище гита. Иного хранилища для временных или постоянных файлов нет. Git же работает на разных ОС и на одном диске могут быть сотни и тысячи репозиториев. Представьте, что придумано какое-то единое место для временных файлов. Это C:\TEMP\GIT\ или /tmp/git? Как не путать между собой временные файлы от разных репозиториев? Можно ведь и клонировать много сразу. Всё это внесло бы ненужную сложность

Многопоточный парсинг страниц

Для онлайн-игры пишу прогу, которая позволит получать полезные данные. Есть два метода, которые возвращают стоимость конкретного оружия на рынке для одной страны и для всех стран (74) вместе.
public void getCheapestWeapon(Weapon weapon) { //long result = 0; Map countryAndId = allCountries.getCountryAndId(); for (Map.Entry item : countryAndId.entrySet()) { //long start = System.currentTimeMillis(); getCheapestWeapon(item.getKey(), weapon); //long finish = System.currentTimeMillis(); //System.out.println(finish - start); //result += finish - start; } //System.out.println(result); }
public void getCheapestWeapon(String country, Weapon weapon) { long start = System.currentTimeMillis(); String link = MARKET_LINK + allCountries.getCountryId(country) + "/" + weapon.getPlaceOnMarket() + "/" + weapon.getQuality() + "/" + ADDITIONAL_LINK; try { Document page = Jsoup.connect(link) .userAgent("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36") .cookies(cookies) .timeout(1000) .get(); Elements table = page.getElementsByClass("price_sorted"); Element row = table.select("tr").first(); Elements columns = row.getElementsByTag("td"); Element priceCell = columns.get(3); String priceStr = priceCell.text(); double price = Double.parseDouble(priceStr.substring(0, priceStr.length() - 4)); System.out.println(country + " - " + price); } catch (IOException e) { e.printStackTrace(); } //long finish = System.currentTimeMillis(); //System.out.println(finish - start); }
Проблема в том, что при получении данных для всех стран, время на парсинг составляет в среднем 16-18 секунд что, согласитесь, очень много. Пробовал в первом методе засунуть getCheapestWeapon(item.getKey(), weapon) в отдельный поток. Ничего хорошего это не дало. Как можно реализовать одновременный парсинг всех 74-х страниц?


Ответ

В текущем виде (результаты работы getCheapestWeapon просто выводятся на консоль) проще всего использовать стандартный ExecutorService
public void getCheapestWeapon(Weapon weapon) { final int THREADS = 4; ExecutorService pool = Executors.newFixedThreadPool( THREADS );
Map countryAndId = allCountries.getCountryAndId(); for (Map.Entry item : countryAndId.entrySet()) { pool.execute( () -> getCheapestWeapon( item.getKey(), weapon ) ); }
pool.shutdown(); }
Если операция не разовая, то нужно вынести создание и остановку сервиса из метода. Т.к. основная задержка, скорее всего из-за сети (74 запроса, даже если пакет идет от клиента до сервера 50мс, съедят 7 секунд), число процессов в сервисе может превышать количество ядер (подберите экспериментально).
В качестве альтернативы, попробуйте получать у сервера больше данных меньшим количеством запросов, например убрав фильтр по странам, если вам нужна самая низкая цена.

Как вызвать статический метод класса возврающающий экземляр для использования Unity?

Есть базовый интерфейсIViewModel для всех моих ViewModel. Все ViewModel используют DevExpress POCO механизм:
public static EfCaseCollectionViewModel Create(IUnitOfWorkFactory unitOfWorkFactory = null) { return ViewModelSource.Create(() => new EfCaseCollectionViewModel(unitOfWorkFactory)); } protected EfCaseCollectionViewModel(IUnitOfWorkFactory unitOfWorkFactory = null) : base(x => x.Cases, unitOfWorkFactory ?? UnitOfWorkSource.GetUnitOfWorkFactory(),projection:t=>t.Where(x=>x.Removed==false)) { }
Во ViewModel не используется без параметрический конструктор.
Unity контейнер я создаю при старте в статическом классе:
UnityContainer unityContainer = new UnityContainer(); unityContainer.RegisterType("CaseCollection");
Во View
public EfCaseCollectionView(IUnityContainer container) { this.DataContext = GetViewModel(container); InitializeComponent(); }
private IViewModel GetViewModel(IUnityContainer container) { if (container.IsRegistered("CaseCollection")) { return container.Resolve("CaseCollection"); } return container.Resolve(); }
Но без конструктора без параметров это не работает. (MissingMethodException:'System.MissingMethodException: No parameterless constructor defined for this object.). Как правильно использовать Unity в этой ситуации?


Ответ

Спасибо за ссылку, помогла как пища для размышлений.
Честно, часть вопроса связанная с Exception не связана с основной частью тем что я просто не уследил что в CodeBehind'е View UserControl нету конструктора без параметров.
По поводу основной части. Сделал так:
public static readonly UnityContainer UnityContainer = new UnityContainer();
public static void Resolve() { UnityContainer.RegisterType("CaseCollection", new InjectionFactory(c => EfCaseCollectionViewModel.Create())); }
Этот метод вызывается в App.xaml.cs
А в View Так:
public EfCaseCollectionView() { InitializeComponent(); this.DataContext = GetViewModel(Bootstrapper.UnityContainer); }
private IViewModel GetViewModel(IUnityContainer container) { if (container.IsRegistered("CaseCollection")) { return container.Resolve("CaseCollection"); } //if not found, get default factory return container.Resolve(); }
Я не уверен что решение правильное, но мою текущую задачу оно выполнило.

В WPF приложении в Windows 7 шрифт Palatino Linotype не отобажает верхний индекс

Проблема с OpenType шрифтом Palatino Linotype в WPF приложении. На windows 8 приложение работает нормально, а вот в windows 7 верхний индекс отображается обычно. Я заметил, что проблема касается только цифр - буквы нормально отображаются в верхнем индексе. Я пробовал внедрить шрифт в приложение - ничего не меняется.

Дополнение.
С таким кодом:
145k
получается правильно:

А вот с таким (разница в содержимом индекса)
145
неправильно:


Ответ

Прошло не мало времени с момента публикации вопроса. Проблема с верхним индексом была давно была решена мной. Возможно кому-нибудь будет полезно решение. Вместо Run.Typography.Variants="Superscript", следовало использовать Run.BaselineAlignment = BaselineAlignment.Superscript. В этом случае глюк пропадает. Следует помнить, что Run.BaselineAlignment = BaselineAlignment.Superscript не меняет размер шрифта, а как известно размер шрифта верхнего индекса должен быть меньше основного шрифта. Меняйте сами размер для верхнего индекса, иначе получится неразбериха.

datatables search configure

У меня есть столбик с номерами телефонов, где они отображаются в отформатированном виде, как: +7 499 879-94-24. Поиск DataTables ищет по значению, то-есть с пробелами надо вводить номер.
Как мне сделать, чтобы при вводе в поиск без пробелов, находило номер, например: (+7499..)?


Ответ

Установите плагин для фильтрации. Этот плагид при поиске удаляет лишные значения
jQuery.fn.DataTable.ext.type.search.phoneNumber = function ( data ) { return ! data ? '' : typeof data === 'string' ? data + data.replace(/[ \-]/g, '') : data; };
пример таблицы
$(document).ready(function() { $('#example').dataTable( { columnDefs: [ { type: 'phoneNumber', target: 4 } ] } ); } );
JS в CDN: //cdn.datatables.net/plug-ins/1.10.10/filtering/type-based/phoneNumber.js
источник

Android. immortal Thread

Как известно, система может убить сервис (Service), если ей будет не хватать памяти. Но в наших силах сделать так, чтобы наш сервис ожил, когда проблема с памятью будет устранена. Делается это в методе onStartCommand возвращением соответствующей константы.
В своем приложении, к сожалению, я НЕ могу использовать сервис. Я использую обычный поток.
@Override public void run() { Looper.prepare(); // code Looper.loop(); }
Он так же как сервис работает в фоновом режиме и выполняет соответствующие команды, но так же и падает при нехватке памяти.
Ну так вот, знает кто, есть ли возможность этого избежать? Или каким-нибудь образом реализовывать логику немедленного восстановления убитого потока? Пробовал повышать приоритет у потока, так же прописывал в манифесте
android:largeHeap="true"
Не помогает.
Другой сервис использовать для поддержания потока так же нельзя =) Все что приходит на ум - использовать какой-нибудь системный receiver, который можно прописать в манифесте. При этом он должен принимать команды постоянно, хотя бы раз в минуту.


Ответ

Скорее всего вам может помочь только рассылка собственных Intent через AlarmManager. Эти интенты принимайте в собственном ресивере и запускайте сервис.
Вариант с системным интентом, рассылаемым каждую минуту, не подойдёт, т.к. его нельзя ловить в ресивере, определённом в манифесте. Только через Context.registerReceiver(). А, значит, нужен кто-то работающий, чтоб среагировать на интент.

Запуск консольной команды и получение её ответа с помощью Python 3 [дубликат]

На данный вопрос уже ответили: Python 3 и командная строка 1 ответ Как можно написать программу на Python 3 для линукса, чтобы она вбивала в терминал команду и считывала ответ?


Ответ

Для этого можно использовать функцию check_output из модуля subprocess
subprocess.check_output('ls file; exit 0', shell=True)
Здесь shell=True нужно использовать, если вся команда идёт в виде одной строки, а ; exit 0 добавлено для того, чтобы не бросалось исключение в случае, если команда вернёт не нулевой код.
Можно контролировать код возврата, используя блок try-except, отлавливая ошибки запущенных команд:
try: subprocess.check_output('ls file', shell=True) except subprocess.CalledProcessError as e: print('Команда
> {}
завершилась с кодом {}'.format(e.cmd, e.returncode))
Если нужно учитывать и поток stderr, то документацией предлается следующий способ:
subprocess.check_output("ls file; exit 0", stderr=subprocess.STDOUT, shell=True)
Здесь мы явно получаем нулевой код возврата, подавляя поднятие исключения, а также перенаправляем поток stderr на stdout

Сессия пользователя

Пишу небольшой проект на связке flask + tornado. На flask написан общий функционал (на данный момент авторизация + регистрация пользователей, также создана модель), на торнадо пытаюсь написать чат.
Как tornado научить понимать, под каким пользователем мы сейчас авторизованы, и от его имени писать в чат сообщения?
P.S. Если кто желает поучастовать в разработке данного проекта - милости прошу. Хочу сделать нечто для голосового общения в веб. Цель - получения опыта в подобного рода разработке.


Ответ

Очень интересный и актуальный вопрос для Tornado. Способов реализации много, торнадо тем и хорош что из коробки нет никакого навязанного решения, можно дать волю фантазии и заточить все максимально вкусно для своего проекта.
Предлагаю такой вариант (опускаю лишний код, чтобы показать только суть):
class BaseHandler(tornado.web.RequestHandler):
...
def get_current_user(self): user = None user_json = self.get_secure_cookie("mysite_cookie_user") if not user_json: return None logging.info("User ID:%s is get response", str(user_json)) try: user = tornado.escape.json_decode(user_json) except Exception: logging.info("Error get user cookie") return user
def get_visiter_settings(self): settings_json = self.get_secure_cookie("mysite_cookie_settings") try: cur_settings = tornado.escape.json_decode(settings_json) logging.info("Visiter settings:%s is get response from cookie.", str(cur_settings)) except Exception: logging.info("Error get settings from cookie.") logging.info("Init new cookie settings.") cur_settings = { "visitor_uuid": str(uuid.uuid4()), "option1": "foo",
...
"option10": "bar"} self.set_secure_cookie("mysite_cookie_settings", json.dumps(cur_settings)) logging.info("New cookie settings initialize.") finally: return cur_settings
class MainHandler(BaseHandler):
@tornado.web.asynchronous @tornado.gen.coroutine def get(self,*args, **kwargs): current_user = self.get_current_user() visiter_settings = self.get_visiter_settings()
Хеши сессий можно хранить например в Redis.
В хендлерах состояние сессий можно получать и обновлять по ключам сформированным от current_user и visiter_settings["visitor_uuid"].
Например, для гостей сессии определять по visitor_uuid, для авторизованных по current_user + можно их линковать к их уже существующей сессии по visitor_uuid.

Обновление slug в django

category_name = models.CharField(max_length = 220) slug = AutoSlugField(populate_from='category_name', unique=True, db_index=True)
Есть поле slug. И там уже записано значение которое соответствует названию. Но когда я меняю название, slug не меняется. Подскажите что делать? Как обновить slug?


Ответ

Нужно добавить always_update= True Вот так будет:
slug = AutoSlugField(populate_from='category_name', unique=True, db_index=True, always_update=True)
А чтобы вручную править то можно еще добавить: editable=True

Обрабатывать нажатия на картинки

Есть масив
PictureBox[,] picture = new PictureBox[20, 20];
Создаю 20 картинок в масиве и вывожу их на панель
for (int j = 0; j < 20; j++) { picture[i, j] = new PictureBox();
picture[i, j].BackColor = Color.Azure; picture[i, j].Location = new Point(40 * i, 40 * j); panel1.Controls.Add(picture[i, j]); }
Как мне узнать и сменить цвет той картинке из массива, на которой кликнут мышкой?


Ответ

for (int j = 0; j < 20; j++) { ... picture[i, j].Click += PictureBoxClick; }
private void PictureBoxClick(object sender, System.EventArgs e) { if (sender is PictureBox) { ((PictureBox)sender).BackColor = Color.Red; } }

Сетевое взаимодействие в Андроид приложениях

Как в Андроид-приложениях программно реализуется сетевое взаимодействие между устройствами?
Например: есть приложение Шахматы. Играют два человека на разных устройствах (соединенных (как-то) через интернет/wi-fi) Один делает ход - движение фигуры отображается у другого и наоборот. Т.е. между устройствами передается какой-то объем данных, который обрабатывается и отображается.
Собственно, вопрос в чем: как и через что реализуется подобное взаимодействие? (как его запрограммировать)
с чего вообще начать в этом разбираться? начал изучать Google Cloud Messager, но есть сомнения, что это шаг в верном направлении. Рассмотрел возможность создания своего сервера под такие нужды, но понял, что пока не готов вкладывать время в его изучение.
Буду благодарен любым (особенно) русскоязычным ссылкам на то, что можно прочесть касательно программирования сетевого взаимодействия Андроид, и советам в каком месте интернета/девелопер гайда стоит покопаться.


Ответ

Без сервера никак не обойтись. У вас должна быть информация и логика игры написана на сервере, с которого клиенты должны получать данные в свои телефоны. Как это реализовать? Например, своровать код из гугла по созданию чата и переделать под свои нужды. Для сетевого взаимодействия здесь всё так же используется класс Socket

Асинхронный вызов метода в WPF

У меня имеется WPF-приложение, работающее с базой данных. Количество записей в базе довольно большое и постоянно растёт. В проекте используется ORM(EF 6). Имеется некий класс, работающий непосредственно с контекстом базы данных:
public class Store : IStore {...}
В интерфейсе класса определён ряд методов, код в которых обращается непосредственно к базе через EF-контекст, соответственно, выполнение метода занимает довольно длительное время, что может вызвать простой интерфейса пользователя, если я всё правильно понимаю. Следовательно, нужно вынести операции получения данных из базы в отдельные потоки. Так, скажем, в Store определен метод:
public ICollection GetAllProducts() {...}
Если я правильно понимаю, мне необходимо добавить его асинхронную реализацию:
public async Task> GetAllProductsAsync() { return await Task>.Factory.StartNew(GetAllProducts) }
Как правильно воспользоваться таким методом в самом приложении в ViewModel, Скажем, чтобы, пока данные загружаются, в StatusBar отображался прогресс загрузки данных, а DataGrid отобразил результат как только данные загрузятся?


Ответ

Окей, давайте начнём с Task.Factory.StartNew. Это нужно только если ваш запрос к базе данных не поддерживает асинхронность сам, и требует выделения отдельного потока (кстати, лучше писать просто Task.Run).
Для свежего Entity Framework это не так, асинхронные функции поддерживаются правильно, из коробки: Entity Framework tutorial: async query and save
С асинхронностью на уровне базы данных вам не нужно создавать отдельные потоки.

По поводу прогресса, с этим хуже. EF не поддерживает информацию о прогрессе операции, так что вы можете просто вывести состояние «читаю», и считывать до тех пор, пока не закончите.
В случае, когда/если будет имплементирована поддержка прогресса, вам можно будет воспользоваться интерфейсом IProgress

Таким образом, код в VM будет выглядеть так:
IsLoading = true; var localData = await model.LoadDataAsync(); IsLoading = false; Data = localData;

Скорее всего, вы не захотите выкладывать модельные классы для View, поэтому вам понадобится обёртка, создающая VM-объекты для ваших entity:
// в модели IQueryable GetData();

// в VM IsLoading = true; var localData = new List(); await model.GetData().ForEachAsync(entity => localData.Add(new EntityVM(entity)); IsLoading = false; Data = localData;
Ну и, как верно отмечает @Pavel Mayorov, возможно вы захотите ловить исключения, так что вам понадобится try:
IsLoading = true; var localData = new List(); try { await model.GetData().ForEachAsync(entity => localData.Add(new EntityVM(entity)); Data = new ObservableCollection(localData); } catch { IsFailed = true; throw; } finally { IsLoading = false; }
Или, если вы хотите, чтобы данные появлялись не все вместе, а по мере подгрузки, наверное подойдёт просто
await model.GetData().ForEachAsync(entity => Data.Add(new EntityVM(entity));
(но здесь я не уверен, т. к. ни разу не пробовал).

Почему всегда threadPoolExecutor.getActiveCount() <= maximumPoolSize/2?

Есть очередь задач, создана следующим образом:
LinkedBlockingQueue queue = new LinkedBlockingQueue(); ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(maximumPoolSize, maximumPoolSize, 50000L, TimeUnit.MILLISECONDS, queue);
Значение maximumPoolSize равно 200. Во время работы в queue попадает большое количество потоков (больше тысячи), но значение, возвращаемое методом threadPoolExecutor.getActiveCount() всегда меньше либо равно 100. Например, значения threadPoolExecutor.getActiveCount() и queue.size() логируются следующим образом:
logger.debug("Активные потоки: " + threadPoolExecutor.getActiveCount() + ". В очереди " + queue.size() + " потоков.");
и в итоге мы получаем следующую картину:
Активные потоки: 1. В очереди 0 потоков. Активные потоки: 2. В очереди 0 потоков. Активные потоки: 3. В очереди 0 потоков. Активные потоки: 4. В очереди 0 потоков. Активные потоки: 5. В очереди 0 потоков. ... Активные потоки: 86. В очереди 0 потоков. Активные потоки: 87. В очереди 1 потоков. Активные потоки: 88. В очереди 1 потоков. Активные потоки: 89. В очереди 1 потоков. Активные потоки: 90. В очереди 1 потоков. ... Активные потоки: 99. В очереди 1 потоков. Активные потоки: 100. В очереди 1 потоков. Активные потоки: 100. В очереди 2 потоков. Активные потоки: 100. В очереди 3 потоков. Активные потоки: 100. В очереди 4 потоков. ... Активные потоки: 100. В очереди 1874 потоков. Активные потоки: 100. В очереди 1875 потоков. Активные потоки: 100. В очереди 1876 потоков. Активные потоки: 100. В очереди 1877 потоков. Активные потоки: 100. В очереди 1878 потоков. Активные потоки: 100. В очереди 1879 потоков. Активные потоки: 100. В очереди 1880 потоков. Активные потоки: 100. В очереди 1881 потоков. Активные потоки: 100. В очереди 1882 потоков. Активные потоки: 100. В очереди 1883 потоков.
В документации написано, что метод threadPoolExecutor.getActiveCount() возвращает приблизительное количество потоков с активно выполняющимися задачами. Но почему максимальный порог этого приблизительного значения тут равен maximumPoolSize/2?
P.S. Это логи не с моего компьютера, у меня такую ситуацию воспроизвести не удалось - у меня в данном случае количество активных потоков равняется 200, как и ожидалось. Может ли это быть зависимость от количества процессоров/количества ядер процессоров/какой-либо конфигурации ПО?


Ответ

"Есть очередь задач, создана следующим образом: ... new ThreadPoolExecutor(maximumPoolSize, maximumPoolSize, .."
Вы уверены, что maximumPoolSize - это одна переменная, и она имеет одно значение? Полагаю, что причина в том, что corePoolSize равен 100, а maximumPoolSize равен 200 и у Вас происходит следующее?
При добавлении нового потока в пул выполняет следующие действия последовательно:
Проверяет достигнут ли предел потоков, задаваемых переменной corePoolSize если можно еще запустить поток - запускает его. Если количество потоков равно или больше corePoolSize переходит к следующему шагу. Проверяет не заполнена ли очередь и если в ней еще есть место добавляет туда поток. Если очередь заполнена переходит к следующему шагу. Пытается увеличить количество работающих потоков до значения maximumPoolSize если можно добавить еще поток, то он добавляется и в нем и запускается задание. Если количество работающих потоков равно maximumPoolSize то выбрасывается исключение java.util.concurrent.RejectedExecutionException или вызывается перехватчик отклонения задачи определяемый программистом.
В вашем случае в виду того, что очередь увеличивается без ограничений к третьему шагу алгоритм никогда не переходит. Но можно «изменить» порядок следования шагов 2 и 3. Для этого необходимо создать очередь в которой мы переопределим вызываемый ThreadPoolExecutor метод offer так, чтобы он возвращал всегда false (очередь заполнена). Теперь нам нужно задать собственный перехватчик RejectedExecutionHandler. В перехватчике мы добавляем полученный поток в очередь. Пример изложенного выше в виде кода:
LinkedBlockingQueue queue = new LinkedBlockingQueue (100){ public boolean offer(Runnable e) {return false;} };
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(100, 200, 1, TimeUnit.MINUTES, queue, new RejectedExecutionHandler() { public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { try { executor.getQueue().put(r); } catch (InterruptedException e) { e.printStackTrace(); } } });

Django. Как вывести тэги в шаблоне?

Подключил django-taggit к блогу. Хочу вывести определенный набор тегов под каждой статьей, используя {{ article.tags.names }}. В шаблоне - получаю список тэгов под статьей ['linux', 'python', 'english']. Как можно исправить это?
views.py
def index(request): lastet_articles_list = Article.objects.order_by('-pub_date') list_of_tags = [] for obj in lastet_articles_list: list_of_tags += obj.tags.names() list_of_tags = list(set(list_of_tags)) context = { 'lastet_articles_list': lastet_articles_list, 'list_of_tags': list_of_tags, } return render(request, 'article/index.html', context)
(list_of_tags здесь использую, чтобы просто вывести имеющиеся тэги на сайте)
index.html

{% if lastet_articles_list %} {% for article in lastet_articles_list %}
{{ article.title }}

{% endfor %} {% endif %}

models.py
from taggit.managers import TaggableManager
class Article(models.Model): title = models.CharField(max_length=50) pub_date = models.DateTimeField('date published') text = models.TextField() tags = TaggableManager()


Ответ

Все правильно, метод names возвращает массив имен тэгов. Выводите их по одному в вашем блоге.

Эксперимент, чтобы понять как это работает:
>>> from Tasks.models import Post >>> p = Post.objects.get(pk=1) >>> p.tags >>> p.tags.add('cat', 'dog') >>> p.save() >>> p.tags.names > >>> p.tags.names() ['cat', 'dog'] >>> for name in p.tags.names(): ... print(name) ... cat dog >>> p = Post() >>> p.title = 'Post 2' >>> p.text = 'second post' >>> p.save() >>> p.pk 2 >>> p.tags.add('cat') >>> p.save() >>> Post.objects.filter(tags__name__in=["cat"]) [, ] >>> Post.objects.filter(tags__name__in=["dog"]) []

Как определить текущее местоположение пользователя и что лучше использовать?

Есть интернациональный проект. При совершении пользователем определенных действий, необходимо получать данные о его местоположении (страна, город, улица(если возможно)), и после уже отсылаем эти данные на наш сервер. Я видел примеры от гугл и яндекс карт, там можно получить координаты. Я все же более склонен к использованию гугла.
Есть ли пример получения этих данных при этом сделав как можно меньше запросов?
P.S. При этом мне не нужно что-либо отрисовывать на карте и рисовать саму карту


Ответ

Силами HTML5 — navigator.geolocation.getCurrentPosition(). Браузер спрашивает у пользователя разрешение и в случае согласия отдает ОЧЕНЬ (в большинстве случаев) точные данные в виде широты и долготы. Потом это можно скормить https://developers.google.com/maps/documentation/geocoding/intro без карты. upd 2018: данный способ работает для https-сайтов Определять по IP. Есть бесплатная (но не самая полная) база — https://dev.maxmind.com/ru/geolite2/ Вот есть библиотека под нее — https://github.com/maxmind/GeoIP2-php В этом случае данные доступны сразу, но они не точные (Страна, город).

Динамическое добавление методов к объекту в Python 3

Допустим у меня есть класс
class A: x, y = 1, 2
и объект для этого класса
a = A()
Как добавить к a новый метод?
Если сделать так
a.f = lambda self: self.x + self.y print(a.f())
то получаю ошибку
Traceback (most recent call last): File "python", line 8, in TypeError: () missing 1 required positional argument: 'self'
А если так
a.f = lambda: "body"
то внутри лямбда функции у меня нет доступа к объекту.


Ответ

https://stackoverflow.com/questions/972/adding-a-method-to-an-existing-object-instance
import types
class A: x, y = 1, 2
a = A() a.f = types.MethodType(lambda self: self.x + self.y, a) a.f() # --> 3
Разница в следующем:
a.g = lambda self: self.x + self.y a.f # --> of <__main__.A object at 0x7f4de50d5978>> a.g # --> at 0x7f4de51babf8>
Но:
>>> A.h = lambda self: self.x + self.y >>> a.h() 3

Косвенное присвоение значений переменным

Скрипт:
#!/bin/bash test1="" test2="" t_array=( "test1" "test2" )
index=$((${#t_array[@]}-1)) while [ $index -gt -1 ] do ${t_array[index]}="1" index=$(($index-1)) done
echo $test1 $test2
возвращает ошибку.
Как реализовать присвоение значений заранее заданным переменным?


Ответ

если запустить ваш скрипт, получаем ошибки в девятой строке (содержащей ${t_array[index]}="1"):
/tmp/s: line 9: test2=1: command not found /tmp/s: line 9: test1=1: command not found
т.е. сформированная строка интерпретируется как буквальное выполнение строки test2=1 как команды. такой команды, конечно, нет, о чём интерпретатор и сообщает.
судя по содержимому скрипта, в этом месте необходимо интерпретировать эту строку, чтобы она воспринималась интерпретатором как присвоение значения переменной. это можно сделать, например, добавив команду eval перед выражением, формирующим строку:
eval ${t_array[index]}="1"
тогда скрипт вернёт строку
1 1
что, вероятно, и ожидается.

Решение интеграла в преобразовании Фурье

Есть формула

1-ая это собственно преобразование Фурье,а 2-ая нижняя это формула нахождения спектральной плотности(формула на основе 1-ой),то что я пытаюсь запрограммировать и решить.
Отдельно добавлен класс комплексных чисел чтобы не засорять главную форму.
Такой вопрос,каким методом я могу решить интеграл во 2-ой формуле?
Все поиски увенчались ссылками на alglib,но им запрещено пользоваться(антиплагиат и запрет кафедры на пользование готовыми ресурсами и библиотеками)
Фрагмент кода написанный ниже,это мои попытки воссоздать решение задачи по шагам и по формуле. Но вопрос один,как описать в своей программе интеграл по 2-ой формуле и после записать его в свою функцию.
public double calculate1(double u) { int nmax = 512; int k=0,t=1; double [] Rex=new double[nmax/2+1]; double [] Imx= new double[nmax/2+1]; double[] x = new double[nmax]; double f, w,ur=0,uit=0 ; Complex ct; int U = Convert.ToInt32(textBox1.Text); int T = Convert.ToInt32(textBox2.Text); Rex[k]=0; Imx[k]=0;
for (double j = 0; j <= nmax / 2; j++) { f = 1 / T; w = 2 * Math.PI * f; u=U * Math.Exp( -j * w * t); } uit = U * T;//расчёт значения спектральной плотности амплитуд на нулевой частоте return u; }


Ответ

не буду оценивать верность приведенных формул (и применимость их к решаемой задаче). Допустим тут все норм. А дальше - любой определенный интеграл можно посчитать численным интегрированием. Т.е. интервал [0...тау] разбиваешь на много отрезков (чем больше, тем результат точнее). Далее в цикле вычисляешь значение подинтегральной функции в точке t (например первой точке каждого отрезка), умножаешь на длину отрезка, т.е. получаешь площадь соответствующего прямоугольника, и накапливаешь эти значения. По окончании цикла эта сумма и будет результатом. Ну и для производительности - все значения, которые не зависят от переменной цикла, т.е. от t - вычислять вне цикла, один раз (например в приведенном автором вопроса примере это f и w )

алгоритм поиска в массиве строк наиболее отличающуюся от первой

Я ищу наиболее быстрый алгоритм для поиска строки в массиве строк, которая сильнее всего отличается от первой строки массива. Строки все одинаковой длины. Позиция символов и их ASCII код имеет принципиальное значение. Если решать задачу в лоб, то нужно перебрать каждую строчку массива и сравнить каждый ее символ с символом первой строки с тем же индексом. Если они отличаются, то счетчик для этой строки массива увеличивается. Самый большой счетчик дает нам строку, которая наиболее отличается от первой.


Ответ

Можно использовать следующий алгоритм:
std::vector strings ... std::vector distances; for(size_t i = 1; i < strings.size(); ++i) { std::deque tmp(strings[i].size()); for(size_t j = 0; j < tmp.size(); ++j) tmp[j] = static_cast(strings[i][j] == strings[0][j]); auto distance = count(begin(tmp), end(tmp), false); distances.push_back(distance); } auto idx = distance(begin(distances), max_element(begin(distances), end(distances))) + 1; auto result = strings[idx];
Этот код очень легко переписать под векторные инструкции и его скорость может вырасти многократно, но для этого надо знать размер строк(Вы его знаете, я — нет)

Вариативность функций во FreePascal

Первая ситуация: Есть класс, в котором объявлена процедура
procedure SetDefaultValue(DefValue:integer); procedure SetDefaultValue(DefValue:real); procedure SetDefaultValue(DefValue:string); procedure SetDefaultValue(DefValue:char); procedure SetDefaultValue(DefValue:boolean);
Аналогичные конструкции можно видеть и в родных подключаемых модулях Lazarus, например fpjson. При этом, как я понимаю, будет вызвана та подпрограмма, в аргументах которой указана переменная того же типа, что и переданная в вызове процедуры. Почему это работает, несмотря на отсутствие директивы overload? Когда эту директиву нужно использовать, а когда можно (или нужно) опустить?
Вторая ситуация: Процедуры объявлены в родительском классе
procedure SetDefaultValue(DefValue:integer);dynamic;abstract; procedure SetDefaultValue(DefValue:real);dynamic;abstract; procedure SetDefaultValue(DefValue:string);dynamic;abstract; procedure SetDefaultValue(DefValue:char);dynamic;abstract; procedure SetDefaultValue(DefValue:boolean);dynamic;abstract;
И по одной переопределены в пяти классах потомках, с дерективой override. Будет ли работать такая конструкция и, если нет, то почему?


Ответ

Почему это работает, несмотря на отсутствие директивы overload? Когда эту директиву нужно использовать, а когда можно (или нужно) опустить?
Как нам сообщает документация FreePascal (здесь и далее перевод мой, а ссылки отсюда, в квадратных скобках спорные участки перевода):
Директива overload уведомляет компилятор, что эта функция перегружена. Главным образом, в целях обеспечения совместимости с Delphi, все функции и процедуры во FreePascal могут быть перегружены без использования данной директивы.
Однако, это не означает, что директива overload не используется. Другой раздел той же документации сообщает следующее:
До версии компилятора 1.9 все [объявления] перегруженной функции должны были находиться в одном модуле. Сейчас компилятор продолжает поиск соответствия в других модулях, если не нашёл его в текущем, а функция имеет директиву overload
То есть, директиву overload необходимо использовать только для функций, объявленных в разных модулях вашей программы.
Будет ли работать такая конструкция и, если нет, то почему?
Да, будет.
Однако, не следует использовать подобные конструкции, кроме случаев, когда абстрактные методы объявлены в мета-классах, то есть классах, единственное предназначение которых - хранить поля, свойства и методы, общие для всех классов-потомков мета-класса. Проще говоря, мета-класс - это класс, который никогда не заявляется как тип переменной и экземпляры которого никогда не будут создаваться.
var Meta: TMyMetaClass; //Так с мета-классами делать нельзя.
begin Meta := TMyMetaClass.Create; //И так тоже. end.
Нарушение этого правила однажды закончится для вас страшным геморроем и неуловимыми, как ковбой Джо, ошибками, и вот почему (спасибо Grundy за разъяснения):
Предположим, мы объявили родительский мета-класс A
Type A = Class public val: integer; vals: string; public procedure SetDefaultValue(DefValue:integer);virtual;abstract; procedure SetDefaultValue(DefValue:string);virtual;abstract; end;
И два его класса-потомка, B и C
B = Class(A) public procedure SetDefaultValue(DefValue:integer);override; end; C = Class(A) public procedure SetDefaultValue(DefValue:string);override; end;
Описали наши два метода
procedure B.SetDefaultValue(DefValue:integer); begin val := DefValue; end;
procedure C.SetDefaultValue(DefValue:string); begin vals := DefValue; end;
А затем решили: "А зачем нам объявлять переменные двух разных типов, когда есть наследование?" И написали...
var bb, cc: A;
...получив на свою голову кучу проблем. Потому что такой код:
begin bb := B.Create; bb.SetDefaultValue(10); cc := C.Create; cc.SetDefaultValue(10); end.
Великолепно скомпилируется, чтобы, затем, вызвать ошибку выполнения. Что произошло? Сейчас, на маленьком коде-примере, это понять легко, но словив такую ошибку в многомодульном приложении на три тысячи строк вы рискуете искать её часами, без гарантии, что вообще найдёте. Следите за руками: Мы создали экземпляр класса С
cc := C.Create;
В котором, ранее, переопределили один метод
procedure SetDefaultValue(DefValue:string);override;
Принимающий, в качестве аргумента, переменную типа string. А затем вызвали метод
cc.SetDefaultValue(10);
Передав ему аргумент типа integer. "Но это же должно вызвать ошибку компилятора, почему, тогда программа успешно запустилась?", - спросите вы. Неверно, компилятор не видит в вашем коде ошибки, потому что, формально, её там нет. Напомнить, какого типа переменная cc?
cc: A;
А у класса A есть метод:
procedure SetDefaultValue(DefValue:integer);virtual;abstract;
К которому вы и обращаетесь. Но этот метод - абстрактный, он является лишь указанием для программы искать в области видимости экземпляра класса такой же метод с директивой override, которого она не находит, так как он определён только в классе B, но не C, о чём, при компиляции, вас предупредил Lazarus:
Warning: Constructing a class "С" with abstract method "SetDefaultValue"
Что и вызывает ошибку выполнения. В то же время, такой код:
var bb: B; cc: C;
begin bb := B.Create; bb.SetDefaultValue(10); cc := C.Create; cc.SetDefaultValue(10); end.
Просто вызовет ошибку компиляции на предпоследней строке, которую всегда легко найти и устранить.
Примечание для внимательных читателей: директива dynamic семантически эквивалентна virtual. Первая оптимизирована для памяти, вторая - для скорости.

Работа атрибута ThreadStatic в асинхронных вызовых

Есть библиотека, переделанная под многопоточное выполнение атрибутами ThreadStatic. Есть желание сделать ее асинхронной. Но, как быть со статическими полями и методами? Ведь новый поток не будет создан, и контекст не поменяется...
Это продолжение к прошлому вопросу о атрибуте: ThreadStatic атрибут, тонкости использования


Ответ

Решение можно найти в статье Стивена Клири Implicit Async Context. Я попробую пересказать суть.

Итак, в обыкновеном, не-async-коде, любая цепочка вызовов функций находится всё время в одном и том же потоке. Таким образом, thread static-переменные представляют собой вариант глобальных переменных, которые не подвержены многопоточным проблемам (но имеют проблему с рекурсивным вызовом, конечно).
В случае async-функции, выполнение может «прыгать» между потоками, таким образом, thread local нам не подходит. Что же у нас есть в замену? Что сохраняется при смене потока?
Ответ такой: это «логический контекст вызова», который можно использовать при помощи CallContext.LogicalGetData и CallContext.LogicalSetData. Эти вызовы позволяют записать и считать объект по его строковому имени.
Обычный контекс вызова, доступный через CallContext.GetData и CallContext.SetData, по сути работает как thread local-данные, что не подходит для async-методов.
Логический контекст вызова прикреплён к ExecutionContext'у. Это означает, что на него не влияет ConfigureAwait(continueOnCapturedContext: false). Возможности «отписаться» от сохранения логического контекста нет, он всегда будет передаваться по всем продолжениям (continuations) асинхронного метода.
Когда async-метод начинает выполняться, он сигнализирует логическому контексту вызова активировать отложенное копирование (копирование при фактических измениях). Это значит, что текущий логический контекст не подменяется в реальности немедленно, но как только ваш код вызовет CallContext.LogicalSetData, логический контекст копируется в новый, который становится текущим, и изменения происходят уже на новом контексте. (Обратите внимание: такое поведение имеет место только начиная с .NET 4.5.)
Это значит, что логический контекст работает как стек: изменения в контексте (на верхнем уровне!), внесённые вызываемой функцией, не видны в вызывающей функции. Напротив, изменения, сделанные вызывающей функцией, видны в вызываемой функции.
Копирование логического контекста вызова не глубокое. Проще всего думать о логическом контексте как об IDictionary; при копировании создаётся копия словаря с теми же ключами и ссылками на объекты-значения. Новый словарь ссылается на старые объекты.
Вследствие этого важно не изменять значения внутри объектов, полученных из контекста! Если вам нужно изменить значение, создайте новый объект, и запишите его в контекст при помощи CallContext.LogicalSetData. Лучше всего использовать неизменяемые типы данных, чтобы не поменять значение случайно.
Разумеется, если вы хотите получить данные, изменённые во вложенной функции, вы должны делать всё наоборот: передать изменяемый объект, и изменять значения, записанные в нём. Но такое скорее всего не нужно.
Напоследок: помните, что вы можете попасть в ситуацию, когда изменения видны там, где не должны быть, в двух случаях: (1) версии .NET старше 4.5 не копируют контекст (и значит, локальные изменения становятся глобальными), (2) копирование происходит лишь на верхнем уровне (не рекурсивно), и значит, изменение внутри объекта становится глобальным. Это приведёт к проблемам для кода, в котором поток выполнения ветвится (например, с Task.WhenAll). Поэтому пользуйтесь .NET 4.5+ и неизменяемыми данными!

Как подсказывает @Monk, в .NET Core на текущий момент (Core 2.x) нету аналога CallContext. Используйте в этом случае AsyncLocal, который доступен в .NET Framework 4.6+ и .NET Core 1+. (Вот тут об отличиях между CallContext и AsyncLocal.)