Страницы

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

среда, 30 января 2019 г.

Button перехода на сайт

Нужно чтобы при нажатии на кнопку программа переводила на сайт компании.


Ответ

Добавьте в обработчик кнопки:
Uri address = Uri.parse("ссылка на сайт компании"); Intent intent = new Intent(Intent.ACTION_VIEW, address); startActivity(intent);

Процесс не может получить доступ к файлу (Исключение HRESULT: 0x80070020)

При попытке запустить сайт в IIS появляется окно с ошибкой:
Процесс не может получить доступ к файлу, так как этот файл занят другим процессом. (Исключение из HRESULT: 0x80070020)

Сайт развернут на 80 порту. Ранее такой ошибки не наблюдал. Около недели назад появлялась эта ошибка, но перезапуск Visual Studio решил проблему и больше ошибка не появлялась. Сейчас ошибка появилась вновь, но ни перезапуск Visual Studio, ни перезагрузка компьютера не решили проблему. Кто сталкивался с данной проблемой, подскажите, как решить? Нашел пару статей по похожим ошибкам, но везде не то.

Нашел вот эту статью: Ошибка 0x80070020 при использовании сайта Центра обновления Windows или Центра обновления Майкрософт для установки обновлений
Обновил систему, перезагрузил компьютер, очистил мусор, скопившийся в системе, перезагрузил компьютер - не решило проблемы. Да, понимаю, что ошибка в IIS, но на всякий случай проверил. Антивируса у меня на компьютере нет.


Ответ

Решение проблемы оказалось следующим:
Запустить командную строку и написать в ней команду:
netstat -aon | find ":80"
в результате, в окне командной строки будет видно следующее:

Необходимо найти процесс, который прослушивает необходимый нас порт. Здесь мы видим, что процесс 3544 прослушивает наш занятый 80 порт.
Открываем диспетчер задач и ищем там наш процесс по идентификатору(ИД):

Как видим - это программа Skype. Открываем Skype, и выполняем следующие действия:
Инструменты -> Настройки... -> Дополнительно -> Соединение
В появившемся окне будет несколько настроек, нас интересует «Для дополнительных входящих соединений следует использовать порты 80 и 443», поэтому убираем активную галочку:
Для дополнительных входящих соединений следует использовать порты 80 и 443
Сохраняем изменения. Перезапускаем Skype, заходим в Диспетчер служб IIS и запускаем сайт, который во время попытки запуска валился с ошибкой.
Подсказка для решения была найдена на MSDN: Ошибка 0x80070020 при запуске веб-сайта в IIS 7.0

Многопоточность, блокировка доступа

Есть приведенный ниже код, суть в том, что функции Add(), Read(), Modify(), Remove(), вызываются извне и в хаотичном порядке, с разным периодом во времени.
Уже сломал голову, подскажите с помощью какой технологии языка C# мне организовать одновременный доступ к разным элементам массива MyList? И чтобы во время удаления/добавления новых элементов, текущие процессы не сбивались с толку, например в потоке ReadThread в данную секунду обрабатывается 5ый элемент массива и в туже секунду потоком RemoveThread уничтожается 4ый, индекс 5ого измениться, как быть?
Делал объект Lock для каждой структуры свой и блокировал отдельные элементы MyList, но тоже не решило проблемы добавления, удаления.
class test { //переменные List MyList = new List(); //блокировка доступа Object Lock = new Object();
//буфер и поток для обработки событий Add BlockingCollection AddBuffer = new BlockingCollection(); Thread AddThread;
//буфер и поток для обработки событий Read BlockingCollection ReadBuffer = new BlockingCollection(); Thread ReadThread;
//буфер и поток для обработки событий Modify BlockingCollection ModifyBuffer = new BlockingCollection(); Thread ModifyThread;
//буфер и поток для обработки событий Remove BlockingCollection RemoveBuffer = new BlockingCollection(); Thread RemoveThread;
//конструктор public test() { if(!AddThread.IsAlive) { AddThread = new Thread(new ThreadStart(AddBufferReader)); AddThread.IsBackground = true; AddThread.Start(); }
if(!ReadThread.IsAlive) { ReadThread = new Thread(new ThreadStart(ReadBufferReader)); ReadThread.IsBackground = true; ReadThread.Start(); }
if(!ModifyThread.IsAlive) { ModifyThread = new Thread(new ThreadStart(ModifyBufferReader)); ModifyThread.IsBackground = true; ModifyThread.Start(); }
if(!RemoveThread.IsAlive) { RemoveThread = new Thread(new ThreadStart(RemoveBufferReader)); RemoveThread.IsBackground = true; RemoveThread.Start(); } }
//Добавляем internal void Add(string Name, string InputString) { //добавляем имя структуры которую надо добавить AddBuffer.Add(new MyStruct(Name, InputString)); } void AddBufferReader() { foreach(var MyStruct in AddBuffer.GetConsumingEnumerable()) { lock(Lock) { //некоторые условия, не все будет добавлено в MyList if(true) { //add, add MyList.Add(new MyStruct(MyStruct.Name, MyStruct.MyString)); } } } }
//Читаем internal void Read(string Name) { //добавляем имя структуры которую надо прочитать и вывести/обработать ReadBuffer.Add(Name); } void ReadBufferReader() { foreach(var Name in ReadBuffer.GetConsumingEnumerable()) { lock(Lock) { for(int i = 0; i < MyList.Count; i++) { if(MyList[i].Name == Name) { //долгие вычисления break; } } } } }
//Изменяем internal void Modify(string Name, string NewString) { //добавляем имя структуры которую надо прочитать и вывести/обработать ModifyBuffer.Add(new MyStruct(Name, NewString)); } void ModifyBufferReader() { foreach(var MyStruct in ModifyBuffer.GetConsumingEnumerable()) { lock(Lock) { for(int i = 0; i < MyList.Count; i++) { if(MyList[i].Name == MyStruct.Name) { //долгие вычисления MyList[i] = new MyStruct(MyList[i].Name, MyStruct.MyString); break; } } } } }
//Удаляем internal void Remove(string Name) { //добавляем имя структуры которую надо удалить из MyList RemoveBuffer.Add(Name); } void RemoveBufferReader() { foreach(var Name in RemoveBuffer.GetConsumingEnumerable()) { lock(Lock) { for(int i = 0; i < MyList.Count; i++) { if(MyList[i].Name == Name) { //remove, remove MyList.RemoveAt(i); break; } } } } }
struct MyStruct { internal string Name; internal string MyString;
public MyStruct(string Name, string MyString) { this.Name = Name; this.MyString = MyString; } } }


Ответ

Я бы начал с ReaderWriterLockSlim или ReaderWriterLock
В этой документации приведён полноценный пример использования. Краткая суть в том, что читать могут сразу несколько потоков. Писать может только один. Читающий поток может захотеть писать и тогда он запрашивает блокировку на запись , что предотвращает появление новых читателей, пока объект не освободится и не завершится запись. Читатели, на время, пока объект заблокирован и происходит запись, ждут. Максимальное время ожидания регулируется вами.
Для реализации более гранулированной блокировки вы можете объявить "корзины" для элементов, которые находятся в процессе чтения и "корзину" для элементов, находящихся в процессе правки, то есть использовать не один а два или более экземпляров ReaderWriterLockSlim. Однако, будьте осторожны. Грануляция блокировок всегда черевата мёртвыми блокировками (deadlock).
Представьте, что в вашем MyList два объекта и вы решили блокировать их отдельно. К вам одновременно приходят два запроса. Один - на чтение, другой на запись.
Первый поток забрал первый элемент MyList на чтение. Второй поток забрать второй элемент MyList на запись. Первый поток начал ждать освобождения второго элемента. Он хочет его почитать. Второй поток начал ждать окончания чтения первого элемента. Он хочет его исправить.
Вы в ж... я хотел сказать в deadlock-е. Именно по этому так полезно указывать конечное значение timeout при обращении к ReaderWriterLockSlim
Ну или сразу согласиться, что экземпляр ReaderWriterLockSlim будет один и на запись будет блокироваться весь ресурс целиком. Тогда deadlock-и вам не страшны.

sql запрос средняя сумма

Помогите пожалуйста написать sql запрос вывести по каждому работнику среднею сумму по всем заказам. Пример:
Первая табличка ID_работника Фамилия 1 Иванов 2 Петров 3 Соколов 4 Сидоров
Вторая табличка номер заказа ID_работника date_time Сумма 1 2 2016-09-13 17:06:43.617 10 2 2 2016-09-13 17:06:43.617 20 3 4 2016-09-13 17:06:43.617 25


Ответ

SELECT t1.ID_работника ,AVG(t2.Сумма) FROM [Первая табличка] AS t1 INNER JOIN [Вторая табличка] AS t2 ON t1.ID_работника = t2.ID_работника GROUP BY t1.ID_работника
P.S. кириллица ЗЛО!!! Учите английский.

Как делать SVG резиновым?

Как делать SVG структуру резиновой ?К примеру на такое конструкции
* { margin: 0; } svg { display: table; margin: auto; }
Примерно что бы эта фигура тянулась..
Вырезать из фотошопа или сохранять как изображение не вариант


Ответ

Для этого достаточно обозначить координаты и размер холста за счет атрибута viewBox - и можно делать svg резиновым, за счет уже знакомого width: 100%
* { margin: 0; } .svg-responsive { width: 100%; }

undefined behavior или нет?

В одном из тестов в один из проектов от Mail.ru group встретил следующий код на языке С:
int b = 11; int a = ++b / 2 / 2 * 3 / 9 - b++ + 1;
Есть ли в этом выражении UB?
Если я правильно понимаю, то между двумя точками следования будет (++b / 2 / 2 * 3 / 9 - b++ + 1), где переменная b изменяется дважды. А такой случай не предусмотрен стандартом и результат зависит от реализации.


Ответ

Undefined.
В подтверждение этого утверждения могу привести диагностику:
warning: operation on ‘b’ may be undefined [-Wsequence-point]
от gcc (и g++) -Wall

Зачем нужна ViewModel в шаблоне MVVM, С#?

Недавно начал изучать паттерн MVVM и возникла дюжина вопросов. Один из них - зачем нужна ViewModel? (биндинг можно строить и в модели) Приведите, пожалуйста, примеры либо скиньте ссылки на статьи.


Ответ

Формально говоря, ViewModel - это еще один слой абстракции от реализации UI. Далее много букв.
Смысл её примерно в следующем. В стандартной парадигме MVC оставался открытым вопрос - как корректно "кодировать" логику взаимодействия с пользователем в той части, которая связана именно с пользовательскими действиями, а не с какой-то бизнес-логикой. Типичный пример - скрыть/показать группу полей при перещелкивании радио-батона, ну или, например, выполнить валидацию введенных данных при переходе на другую вкладку в рамках одного таб-контроля. Еще одним примером может быть отображение диалогового окна с запросом подтверждения действия при, например, изменении какого-то элемента.
Т.е. это действия, которые, с одной стороны, могут иметь под собой достаточно сложную логику, а с другой - вообще говоря, имеют к "модели" - цементирующей всю систему сущности, "отлитую в металле" и сохраняемую в базе - довольно отдаленное отношение. Да и с точки зрения архитектуры добавлять в модельный класс десяток булевых полей IsCheckboxSelected исключительно для сиюминутных нужд отображения - несколько некошерно.
До относительно недавнего времени мышки плакали, кололись, но продолжали есть кактус: это все размазывалось между контроллером и view, писались дополнительные классы и прослойки с репозиториями и архитектурная "красивость" решения приносилась в жертву функциональным требованиям.
Но технический прогресс, как известно, неумолим, интерфейсы стали становиться все сложнее и сложнее, асинхронность, юзабилити и все такое всякое стали доминировать. А с другой стороны еще и автоматизированное и юнит-тестирование начало триумфальное шествие по планете, и вопрос о том, как тестировать вьюхи, в которых логика взаимодействия пользователя гвоздями прибита к физическому "рендерингу" стал стоять все более и более остро.
Т.е. с одной стороны хочется иметь возможность писать (и изолированно автоматически тестировать, что тоже немаловажно) логику UI, а с другой - в ассертах очень не хочется завязываться на конкретные лейблы, тэги, контролы и т.д. и т.п.
Парадигма MVVM была разработана с целью разрешить это противоречие. В архитектуру был введен дополнительный слой - тот, что отвечает за взаимодействие с пользователем, но при этом он строится таким образом, чтобы, в идеале, было не важно отображается ли он в WPF-приложении под Windows, текстовой консоли а ля DOS или передается стуком тамтамов. Это достигается за счет того, что сами классы MVVM строятся на базе обычных POCO-объектов, логика - это методы этих же объектов, оперирующие данными в полях объектов + обработчики событий (UI все-таки по сути - штука асинхронная). А физическое отображение этих самых объектов на пользовательский интерфейс - это уже биндинги, шаблоны, конвертеры и прочие плюшки конкретной реализации - работают как производные от нашей вью-модели (т.е. привязываются к ней).
Плюсы - такие классы относительно легко (ну или хотя бы просто возможно) тестировать юнит-тестами, в целом архитектура получается более стройной, крупные приложения быстрее разрабатывать и проще поддерживать. Минусы - дополнительный оверхед на вью-модель и потребность в развитых средствах биндинга.
Как то так.

Загрузка очень большого числа строк в БД

Добрый день. Есть потребность вставить очень большое число строк в БД. В связи с этим два вопроса.
Какое количество строк целесообразно вставлять за один запрос? Есть ли для вставки больших массивов данных в БД способ лучше, чем делать большое число INSERT-запросов?


Ответ

я бы в данном случае воспользовался BCP (Bulk Copy Program), который был специально разработан для загрузки большого объема данных в MS SQL Server
Пример:
bcp WorlWideImporters.Warehouse.StockItemTransactions OUT D:\BCP\StockItemTransactions_native.bcp -m 1 -b 10000 -n -e D:\BCP\Error_out.log -o D:\BCP\Output_out.log -S -T
Если вам надо делать это программным путем воспользуйтесь BULK INSERT (Transact-SQL)
Пример:
BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail FROM 'f:\orders\lineitem.tbl' WITH ( FIELDTERMINATOR =' |', ROWTERMINATOR =' |
' );
По ссылкам можно найти больше примеров использования...

Установка Java в флешку

Возможно ли установить Java прямо на флешку чтобы написаны на Java запускались прямо с флешки и не требовали утановки Java в ОС на которой запускается? Если нет то можно ли найти локальный установщик без скачки Java потоком из установщика?


Ответ

JRE не требует установки и размножается методом Copy&Paste. Многие десктопные Java-программы распространяются как Java-программа со своей JRE в комплекте. Например - Maple.
Другое дело, что под каждую платформу нужна своя версия JRE.

Установить обложку для записи в WordPress

Здравствуйте. Каким образом в WordPress можно установить, скажем так, обложку для каждой записи? Чтобы на выводи записи было сначала изображение, а потом текст записи. Буду благодарен за полезную информацию.


Ответ

Для вывода миниатюр в теме оформления WordPress используется специальная функция the_post_thumbnail()

Как MessageBox останавливает выполенение кода?

Как MessageBox останавливает выполенение кода, до тех пор, пока пользователь не нажмёт на кнопку? Что-то типа _getch()?


Ответ

MessageBox — блокирующая функция. Поэтому он не может пользоваться внутри себя циклом сообщений (так как цикл сообщений висит в ожидании окончания работы MessageBox).
Поэтому внутри MessageBox запускается новый, вложенный цикл сообщений, на время работы функции. События от клавиатуры и мыши обрабатываются в этом новом цикле сообщений, так что диалоговое окно не зависает. По окончанию работы новый цикл завершается, и возобновляется обработка старого с той точки, в которой он был заморожен функцией MessageBox

Это, кстати, означает одну не очень приятную особенность: если у вас MessageBox показывается как часть обработки одного из оконных сообщений (возможно, косвенно), то во время его работы то же самое оконное сообщение может прийти ещё раз, и ваш код вызовется рекурсивно. Поэтому необходимо позаботиться, чтобы либо заблокировать такую вложенную обработку, либо оставить структуры данных в нормальном, консистентном состоянии.

Ошибка cannot resolve overloaded

Учусь программировать на c++. Возникла странная ошибка при работе с функциями:
cannot resolve overloaded function 'max' based on conversion to type 'double'
Сам код:
#include using namespace std; void maxi(double max) { int i; i=0; float y[5]={3,-2,0.9,0.5,1}; max = -999999; for(i=0; i<5; ++i) { if(y[i] > max) { max = y[i]; }
} }
int main() { cout <<"max value:"<< maxi(max); return 0; }
При очистке параметра max уже в функции main выдается другая ошибка.


Ответ

В этом предложении
cout <<"max value:"<< maxi(max); ^^^
вы используете имя max, которое вы не определили. С другой стороны, благодаря директиве
using namespace std;
вы вводите имена из пространства std в глобальное пространство имен. Видимо имя max, которое соответствует стандартному адноритму std::max в пространтсве имен std также было включено в глобальное пространство имен, и компилятор думает, что в предложении, показанном выше вы в качестве аргумента используете функцию max
Объявите переменную max в main
Обратите внимание, что в функции maxi значение аргумента не используется. Оно перезаписывается в функции
void maxi(double max) { int i; i=0; float y[5]={3,-2,0.9,0.5,1}; max = -999999; ^^^^^^^^^^^^^^
Так что нет никакого смысла объявлять параметр для функции, если его значение в функции не используется. Вы могли бы объявить локальную переменную в функции, как, например,
void maxi() { int i; i=0; float y[5]={3,-2,0.9,0.5,1}; double max = -999999;
^^^^^^^^^^^^^^^^^^^^^
Кроме того в предложении
cout <<"max value:"<< maxi(max);
вы пытаетесь использовать результат работы функции. Поэтому функция должна иметь возвращаемое значение отличное от void. Ее определение могло бы выглядеть следующим образом
double maxi() { int i; i=0; double y[5]={3,-2,0.9,0.5,1}; ^^^^^^ double max = -999999;
//... return max; }
Также нет никакого смысла объявлять переменную i вне цикла, так как она используется только в цикле.
Имейте в виду, что в C++ уже имеется стандартный алгоритм std::max_element, объявленный в заголовке , который позволяет находить максимальное значение заданной последовательности.