Страницы

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

понедельник, 27 мая 2019 г.

Отображение процесса происходящего внутри функции

Не знаю как точно сформулировать вопрос.
Есть функция, которая выполняет какие-то действия. Она находится в "библиотеке классов". Я подключаю эту библиотеку к своему приложению. Запускаю эту функцию и хочу, чтобы в ProgressBar отображался ход выполнения этой процедуры из библиотеки. Как это правильно реализовать в подходе MVVM?
UPD: Вот пример по методу Vlad: Функция в библиотеке:
using System;
namespace ClassLib { public static class Service { public static void Foo(IProgress progress) { progress.Report(1); string s; for (int i = 1; i <= 99; i++) { for (int j = 0; j <= 50000; j++) s = j.ToString(); progress.Report(i); } progress.Report(100); } } }
ViewModel:
public class MainWindowViewModel: INotifyPropertyChanged { private int _progr; public int Progress { get { return _progr; } set { _progr = value;OnPropertyChanged("Progress"); } }
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
public void StartFoo() { Service.Foo(new Progress(persent => Progress = persent)); }
}
View: XAML
...
c# code:
private void button_Click(object sender, RoutedEventArgs e) { MainWindowViewModel vm = (MainWindowViewModel)this.DataContext; vm.StartFoo(); }
Процесс отображается так : 0 пауза 100 %.


Ответ

Я бы посоветовал в следующее:
1.В библиотечный метод добавить параметр типа IProgress.
public class Service { public void Foo(IProgress progress) { progress.Report(1); DoSomeWork(); progress.Report(100); } }
2.В модель представления добавить свойство Progress и обработчик изменения прогресса
public class ViewModel { public int Progress { get; set; } // при установке значения вызывает PropertyChanged
private void HandleProgressChanged(int progress) { Progress = progress; }
private void StartFoo() { Service.Foo(new Progress(HandleProgressChanged)); } }
3.В представлении привязаться к свойству Progress.

UPD
Ну да. Я слишком упростил пример. Ваш код синхронный. Он выполняется в UI-потоке. Поэтому подвисает интерфейс окна. Его нужно запускать асинхронно: сделать библиотечный метод async или запускать его через Task.Run. Например, так:
public static async Task Foo(IProgress progress) { progress.Report(1); string s; for (int i = 1; i <= 99; i++) { for (int j = 0; j <= 50000; j++) s = j.ToString(); await Task.Delay(1);// это просто имитация бурной деятельности progress.Report(i); } progress.Report(100); }
public async Task StartFoo() { await Service.Foo(new Progress(persent => Progress = persent)); }
private async void button_Click(object sender, RoutedEventArgs e) { MainWindowViewModel vm = (MainWindowViewModel)this.DataContext; await vm.StartFoo(); }
Еще я бы посоветовал использовать команды, а не обработчики нажатия кнопок.

Прерывание процесса и задержка на исполнение

Подскажите, как осуществить прерывание системного процесса на Винде из питона? Допустим, код выполняется до определенного момента, затем винда запускает внешний процесс, который надо остановить и лишь потом продолжить выполнение кода. Так же интересует вопрос, как добавить задержку перед выполнением следующего блока кода?


Ответ

Чтобы прервать внешнюю команду через заданный промежуток времени, можно передать timeout параметр при её запуске:
import subprocess
subprocess.check_call(command, timeout=timeout)
Если command не завершится через timeout секунд, то соответствующий процесс убивается и выбрасывается subprocess.TimeoutExpired исключение. Иногда этого не достаточно и необходимо руками убить всё дерево процессов, особенно если вы читаете вывод внешней команды. Вот пример кода, поддерживающий старые версии Питона (Python 2), который показывает как остановить "вечную" внешнюю команду через пару секунд, накапливая её вывод пока она выполняется. Если вы не хотите блокировать основной поток на время выполнения команды, то существует множество способов взаимодействия с командой асинхронно, чтобы найти примеры кода для разных случаев, следуйте по ссылкам
Если команда запущена вне Питона и вы хотите убить её через заданное время по имени:
process = get_process_by_name(name) try: process.wait(timeout) except TimeoutExpired: process.kill() process.wait()
.wait() завершается, если процесс вышел или время истекло—что раньше. Это очень близко к тому как subprocess.call() реализован
Существует множество других способов отложить запуск функции в Питоне, например, чтобы запустить функцию через timeout секунд, не блокируя основной поток всё это время:
import threading
threading.Timer(timeout, kill_process_by_name, [name]).start()
ещё: time.sleep(timeout) или time.sleep(interval - timer() % interval), или Event.wait(timeout), или используя методы из соответствующих циклов обработки событий (event loop)—что выбрать, зависит от конкретной задачи. В общем случае, чтобы прервать выполнение функции в Питоне, см. Timeout on a function call
Примеры реализаций как можно найти процесс по имени и убить его:
import psutil # $ pip install psutil
def get_process_by_name(name): for proc in psutil.process_iter(): try: if proc.name() == name: return proc except psutil.NoSuchProcess: continue raise KeyError("Process {name!r} not found".format(name=name))
def kill_process_by_name(name): get_process_by_name(name).kill()
def kill_process_tree_by_name_windows(name): subprocess.call(['taskkill', '/im', name, '/f', '/t'])

Stream API Java

Ребят, хочу с помощью Stream Api скрыть номер телефона, + 380 ** ** ** **3 примерно вот так, натолкните на верную мысль, как это можно правильно реализовать.


Ответ

Как "правильно" реализовать с помощью Stream API я не знаю. Думаю, что никак.
Но можно, например вот так:
AtomicInteger index = new AtomicInteger(0); String str = "+ 380 43 34 34 343"; str.chars() .mapToObj(i-> (index.getAndIncrement() >= 6 && index.get() < 18) && (i >= 49 && i <= 57) ? '*' : (char)i) .reduce(new StringBuilder(), (a, b) -> a.append(b), (a,b) -> a.append(b)).toString();
Но, на мой взгляд, лучше всего вашу задачу решить без Stream API, например вот так:
String str = "+ 380 43 34 34 343"; str = str.substring(0, 5).concat(" ** ** ** **").concat(str.substring(17,18));

Вся правда о символах

В одном из тестов наткнулся на такой вопрос:
Что из нижеследующего, сказанного о символах (symbols), является истиной? Выберите один или несколько вариантов: a. Несколько копий символа могут существовать одновременно b. Только одна копия любого символа может существовать в единицу времени. Таким образом экономится память. c. Символы -- неизменяемые объекты, т.е. они не может быть изменёны после создания. d. Символы-ключи быстрее строк-ключей
Согласно документации
Symbol objects represent names and some strings inside the Ruby interpreter. They are generated using the :name and :"string" literals syntax, and by the various to_sym methods. The same Symbol object will be created for a given name or string for the duration of a program's execution, regardless of the context or meaning of that name. Thus if Fred is a constant in one context, a method in another, and a class in a third, the Symbol :Fred will be the same object in all three contexts.
module One class Fred end $f1 = :Fred end module Two Fred = 1 $f2 = :Fred end def Fred() end $f3 = :Fred $f1.object_id #=> 2514190 $f2.object_id #=> 2514190 $f3.object_id #=> 2514190
Т.е. символ всегда существует лишь в одной копии, и из набора ответов [a, b], правильным является ответ b. Поправьте меня, если я ошибаюсь.
А вот что насчёт [c, d]? Правильно ли я понимаю, что из b вытекает и c? Я бы хотел увидеть развёрнутый ответ на эту тему с ссылкой на документацию. И верно ли утверждение, что символы-ключи в хеше работают быстрее?
От себя ещё хотел бы добавить ещё один вопрос: я привык использовать symbol в качестве ключа в hash. Но какое ещё применение им можно найти (в рамках Ruby-way, конечно)? Не исключено, что именно из непонимания предназначения символов вытекают все мои глупые вопросы.


Ответ

Прежде чем начать, напомню, что в Ruby держаться за объекты можно только по ссылке

Символы суть интернированные строки Ну, почти. На самом деле это уникальные идентфикаторы интернированных строк.
То есть, где-то в интерпретаторе есть глобальный мап { название => символ }. Значение символа само по себе не несёт никакого смысла, но поддаётся сравнению (причём, быстрому) на равенство и содержит ссылку на своё название
PrivateString это абстрактная деталь реализации: нечто очень похожее на строку и имеющее возможность сравнения со String, но недоступное из Ruby
Когда интерпретатору нужно получить символ с определённым названием (по явному указанию в программе или при встрече литерала символа), он смотрит в глобальный мап и либо берёт символ, который там есть (если это же название туда ранее было помещено), либо вставляет запрашиваемое название в этот мап, создаёт новый символ и возвращает его.
Таким образом, названия и символы находятся в отношении 1-к-1. Таким образом:
Только одна копия любого символа может существовать в единицу времени.
Можно ли изменять символы?.. После прочтения вышеизложенного должен возникнуть закономерный вопрос: "А что там менять-то?" Символ определяется своим object_id и указателем на PrivateString с его названием. И значение PrivateString получить невозможно. Так что:
Символы -- неизменяемые объекты, т.е. они не могут быть изменёны после создания.
Осталось последнее. Быстрее ли они в качестве ключей, чем строки? (Предполагаю, что речь о ключах в Hash) Принято считать, что да. Но что кто-то там считает неинтересно, верно?
Берём лопату и идём смотреть асимптотику.
Символы сравниваются за О(1), по object_id, но при условии, что оба символа встречаются не впервые: в противном случае их надо будет сначала поместить в глобальный мап. Один раз за время их жизни.
Время жизни это отдельная тема. В Ruby 2.2 символы, наконец, начали собираться сборщиком мусора! До этого символ, появившись в программе один раз, существовал до самого завершения. Поэтому делать символы с названиями из пользовательского ввода было опасно. Невинный params[:foo].to_sym мог случайно устроить вам Denial of Service. Наивное сравнение строк O(N.size). Но если использовать хэширование, ситуация усложняется. Хэши сравниваются за O(1), т. к. имеют фиксированную длину.
Брать хэши всё равно придётся за O(N.size), но их можно сохранять, они останутся актуальными до очередного изменения строки. Равенство хэшей значений не гарантирует равенство значений (коллизии!).
Но для заранее известных строк можно подготовить идеальную хэш-функцию, коллизии в которой отсутствуют. Используется ли это в Ruby, я не знаю, но учитывая мутабельность строк в Ruby, это было бы нерационально. В MRI используется библиотека gperf, но для этого ли, я не в курсе. Предполагаю, что она используется для мапа символов, но не ручаюсь. Когда объект сравнивается с самим собой... O(1) В сухом остатке, строки придётся сравнивать в худшем случае за O(N.size)
Уф. Так что быстрее? Смотря в какой ситуации.
Если множество ключей невелико (или редко меняется), символы прекрасно справятся: они будут быстренько добавлены в общий мап и далее все операции с ними будут молниеносными. И обычно множество ключей действительно известно заранее и невелико.
Если множество ключей потенциально велико (пользовательский ввод), то ситуация усложнятся (опять). Время добавления в глобальный мап всё-таки не нулевое, но если оперировать с обычными строками, любой выигрыш во времени устранится уже за несколько операций.
Поэтому...
Символы-ключи быстрее строк-ключей
...как правило. В каких-то искусственных условиях, вероятно, они могут вести себя медленнее, но на практике такие случаи малореальны.

Обновление: начиная с MRI 2.3 появился режим frozen string literals, который литералы строк в исходном коде воспринимает как замороженные, а потому неизменяемые, а потому к ним можно применить те же оптимизации, что и к символам.

Конфигурирование WCF-сервиса для передачи файлов, как и где это сделать?

Пришлось впервые столкнуться с WCF, ибо есть задача - посредством WCF-службы отдавать клиенту файлы по запросу клиента.
Предварительно была изучена теория, и выяснено, что файлы можно передавать:
Как есть, без предварительной настройки, разве что, выставив maxMessageLengthи executionTimeoutInSeconds в довольно большие значения. Включить MTOM в качестве кодировщика. Включить стриминг (потоковую передачу данных).
Точный размер передаваемых файлов я не знаю, но зато могу сказать, что на текущем этапе вряд ли будут передаваться большущие файлы типа дампов БД или потокового видео. Но всё же, в стандартном подходе меня смущает то, что будет постоянная сериализация-десереализация файлов в XML, а зачем лишние телодвижения?
Включение стриминга, в принципе, сейчас подходит, но, как говорит MSDN, будет ряд ограничений (связаны с шифрованим и буферизацией, подробнее — в статье), из-за которых, цитирую:
Из-за этих функциональных ограничений параметры безопасности для потоковой передачи можно использовать только на транспортном уровне, и невозможно реализовать надежные сеансы.
Если сейчас этим можно пренебречь, так как никакого шифрования нет и в помине, но в разрезе дальнейшего развития сервиса это смущает.
Пока в качестве наиболее подходящих путей пытался как включать поддержку MTOM, так и стриминг.
Итак, в качестве пути решения был выбран проект WCF Service Library, в котором был объявлен интерфейс службы, примерно так:
[ServiceContract] public interface IUpdaterService { [OperationContract] bool TestConnection(); ... [OperationContract] FileStream DownloadFile(string filename); ... }
Ага, тут я использую FileStream, значит нужно включить поддержку стриминга, но сложность в том, что я попросту не знаю, где и как это сделать. То же самое и с включением MTOM.
Ну, например, в попавшихся мне решениях говорят, "измените конфиг так":


Вроде всё понятно, что менять и на что, но где это делать?
Напоминаю, у меня DLL, в которой есть лишь App.config, и он - следующий:


Т.е. по сути, в App.config нет, например, раздела bindings, где можно было бы изменить эти параметры. При запуске родного WCF Test Client метод DownloadFile не доступен, так как используется тип FileStram, стало быть, протестировать его никак...
Конфиг клиента, в свою очередь, формируется такой, нужно, т.е. как раз с теми разделами, которые можно менять:


Но опять же - возникает вопрос - а где и как менять этот конфиг? Уверен, он генерируется автоматически, т.е. необходимо задать нужные параметры для моей DLL, но как верно это сделать? К сожалению, ответа на этот вопрос пока не нашел (может, плохо искал, конечно).
Спасибо.


Ответ

Начну с конфигов.
Во-первых, у DLL не бывает файла конфигурации. Тот, что у вас в проекте лежит - это мусор. Ну, некоторые настройки используются самой студией - на остальные же можно смотреть только как на пример.
Файлы конфигурации бывают только у исполнимых файлов и у веб-сайтов.
Далее - файл конфигурации не является автогенерируемым. Студия может в нем что-то менять - но как правило, это лишь пример. По-хорошему, вам надо пойти в msdn - и прочитать описание каждого тэга, используемого в вашем файле конфигурации.
Секция bindings используется на обоих сторонах соединения - т.е. и клиентом, и сервером. Но она опциональна - без нее будут браться настройки по умолчанию. Если вам надо поменять там настройки, но ее нет - значит, ее надо создать.
На разные привязки (bindings, "биндинги") ссылаются конечные точки (endpoint) через атрибуты binding и bindingConfiguration. Когда будете создавать свои привязки - не забудьте про эту связь, чтобы не удивляться потом что ничего не изменилось.

Теперь про передачу файлов. Не переживайте особо про расширение в дальнейшем - когда понадобится сделать по-другому, всегда можно все перенастроить.
По-меньше думайте "как сделать чтобы никогда не надо было переписывать" - а по-больше "какова моя задача сейчас?"
Сериализация бинарных данных в XML недостатком не является пока эти файлы не очень большие. Просто помните, что файлы от этого распухают на треть.
Шифрование на транспортном уровне не является проблемой если только вы не работаете с интеграционными шинами.

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

Как вызвать в абстрактном классе конструктор того класса, конкретно который его наследует? Типа такого:
public abstract class AbstractClass {
public Abstract foo() { //Когда метод foo вызовется наследником AbstractClass a = new this(); //здесь надо вызвать конструктор наследника a.bar(); //как-то меняем состояние, вызывая метод наследника return a; //и возвращаем экземпляр наследника }
public abstract void bar(); }
Но в данном примере выдает ошибку:
java: as of release 8, 'this' is allowed as the parameter name for the receiver type only, which has to be the first parameter


Ответ

Прежде всего в хорошем дизайне базовый класс ничего не должен знать о своих наследниках, иначе нарушается одна из основ ООП о программировании по контракту.
Сделайте еще один абстрактный метод и переопределяйте его в наследниках таким образом, чтобы они возвращали новые экземпляры своего типа:
public abstract class AbstractClass {
public AbstractClass foo() { AbstractClass a = createInstance(); a.bar(); return a; }
public abstract void bar();
protected abstract AbstractClass createInstance(); }
public class ConcreteClass extends AbstractClass { protected override AbstractClass createInstance() { return ConcreteClass(); } }
Если все-таки не хочется трогать наследников и пойти грязным путем, то можно использовать рефлексию (однако в таком случае у всех наследников должен быть конструктор без параметров):
public Abstract foo() { AbstractClass a = this.getClass().newInstance(); a.bar(); return a; }

Сколько места в памяти занимает numpy.array

Подскажите, есть ли какая-нибудь функция, которая позволяет узнать, сколько места в памяти занимает матрица или массив numpy?


Ответ

Можно воспользоваться методом nbytes
In [5]: a = np.random.rand(10**6)
In [6]: a.nbytes Out[6]: 8000000
In [7]: a.dtype Out[7]: dtype('float64')
это работает и для многомерных матриц:
In [11]: a = np.random.randint(0, 10, (10**3, 10**3, 10**3), dtype=np.int8)
In [12]: a.shape Out[12]: (1000, 1000, 1000)
In [13]: a.nbytes Out[13]: 1000000000
In [14]: a.dtype Out[14]: dtype('int8')
также можно воспользоваться стандартной функцией: sys.getsizeof()
In [33]: a = np.random.rand(10**6)
In [34]: sys.getsizeof(a) Out[34]: 8000096
которая вызовет __sizeof__ для вызываемого объекта:
In [35]: a.__sizeof__() Out[35]: 8000096
Из документации:
getsizeof() calls the object’s __ sizeof __ method and adds an additional garbage collector overhead if the object is managed by the garbage collector.

Явное приведение типов и lexical_cast

Пример кода:
#include #include
struct A { int a; explicit operator std::string() { return "<" + std::to_string(a) + ">"; }
};
void f(std::string s) { std::cout << s << std::endl; }
int main() { A a {1}; f(static_cast(a)); f(std::string(a)); f((std::string)a); // f(boost::lexical_cast(a)); return 0; }
Вопроса 2:
1) Можно ли запретить приведение типов в С-стиле, так, чтобы на вызов f(std::string(a)) или f((std::string)a) компилятор ругался, а f(static_cast(a)) работало?
2) Как "научить" срабатывать вызов f(boost::lexical_cast(a))?


Ответ

Что касается запрета приведения в стиле C, могу только посоветовать посмотреть в сторону опций компилятора. В GCC, например, можно добавить флаги -Wold-style-cast и -Werror, тогда приведение в стиле C будет вызывать предупреждение, а предупреждения будут трактоваться как ошибки.
С boost::lexical_cast все просто, нужно добавить специализацию шаблона. Ваш пример примет такой вид:
#include #include #include
struct A { int a; explicit operator std::string() const{ return "<" + std::to_string(a) + ">"; } };
namespace boost{ template<> std::string lexical_cast(const A& arg){ return std::string(arg); } };
void f(std::string s) { std::cout << s << std::endl; }
int main() { A a {1}; f(static_cast(a)); f(std::string(a)); f((std::string)a); f(boost::lexical_cast(a)); return 0; }

Пауза в цикле С# WindowsForms

Доброго времени суток, сообщество. Помогите начинающему программисту на С# WindowsForms. Есть задание: написать программу для подсчета
X=x1+x2+...+xn, xn=zn^3-bn+an^2/tan(Bettan).
На форме Form1 я ввожу n, и хочу чтобы для каждого xn открывалась форма для ввода z,a,b,betta. Решил сделать в цикле:
for (i = 0; i < n; i++) { Input.Show(); X[i] = Z[i] * Z[i] * Z[i] - B[i] + (A[i] * A[i]) / Math.Tan(Betta[i]); }
Но цикл открывает сразу n форм, это не удобно. Паузу в цикле я тоже реализовать не смог. Вопрос: "Как мне сделать так чтобы формы открывались по одной? Или может подскажите, как сделать удобный ввод данных другим способом?" Заранее спасибо всем кто откликнется.


Ответ

Для решения вашей задачи и ввода значений z, a, b, betta в цикле по очереди вы можете использовать (почти) любую форму, унаследованную от стандартной с полями (полем ввода), вызывая её через ShowDialog() а не через Show(). Например, если ваша форма Input унаследована от стандартной формы, то вызывайте ее так:
Input.ShowDialog();
Можно расширить функционал и обрабатывать какие-то дополнительные условия, если еще и обработать результат такого вызова, например, так:
if (Input.ShowDialog() == DialogResult.OK) {.......//Что-то делаем} else if (if (Input.ShowDialog() == DialogResult.Cancel)) { //Пользователь нажал отмену или просто закрыл форму }
Если вызывать именно ShowDialog(), то ваша форма вызывается как модальная форма, т.е. в вашем случае программа не продолжит свою работу (цикл), пока форма висит на экране и пользователь не закрыл ее тем или иным способом.
Вместо такой формы можно использовать InputBox
string input = Microsoft.VisualBasic.Interaction.InputBox("Prompt", "Title", "DefaultValue", -1, -1);
Или реализовать свою форму, как, например, предлагается сделать это тут
P.S. Я бы не использовал такой подход, разве что в целях отладки, да и то, если n достаточно невелико, а то если оно, к примеру, будет 50 или 100, то пользователь замучается вводить значения. Но это уже совсем другой вопрос.

Обработка ошибок: реализация текстовых сообщений и не только, поделитесь опытом, пожалуйста

Заранее прошу прощения за несколько размытый вопрос, который может иметь, пожалуй, несколько ответов, но всё-таки интересует прежде всего, практический аспект.
Итак, имеется некий не очень большой проект, состоящий из ряда независимых модулей, каждый вполне себе самостоятельный и написан разными людьми в разное время.
Часто в коде вижу различные (что естественно, imho) варианты отлова ошибок, от вполне годных и уместных до просто try{...} catch{MessageBox.Show("Ошибка!");} (Да, и не такое бывает), часто критичные места вообще без блоков try
Задача стоит привести это дело (обработку ошибок) к какому-либо стандарту, хотя бы в рамках данного проекта, и тут начинается веселье - во многих местах встречаются повторяющиеся операции, например, при работе с файлами и каталогами, и в таких местах часто приходится либо писать, либо уже есть конструкции вида:
if (string.IsNullOrEmpty(path)) { throw new ArgumentNullException(path, "Путь к каталогу должен быть задан."); }
Или же есть аналогичные конструкции, где при ошибочной ситуации возбуждается исключение какого-либо типа (например, IOException) с каким-то текстовым описанием. При этом внутри проекта нет (почти нет, честно говоря) какой-то своей иерархии классов для обработки ошибок, используются штатные ошибки в основном.
Так вот, изначально был интересен взгляд на общую инфраструктуру обработки ошибок, и подход в целом. Но этот аспект уже прояснил для себя.
Но пока не очень понимаю, каким был бы наилучший подход с генерацией текстовых сообщений ошибок как для модулей самого проекта, так и для логгера? (используется логгер, умеющий работать с экземплярами Exception).
Пока первое, что пришло на ум - вынести все сообщения в отдельный файл в виде констант и использовать их, подключая файл к каждому из модулей. Или может быть загнать всё в ресурсы?
Но в целом интересны мнения сообщества, какие еще практические реализации и подходы, методики были бы уместны и удобны в повседневном использовании с учетом описанного контекста? Возможно, есть какие-то более эффективные, удобные и проверенные способы или средства?
P.S.
Локализации проекта на несколько языков — пока нет. Вносить существенные изменения в код модулей не очень хотелось бы ("малой кровью" обойтись бы). Хотелось бы избежать сторонних решений, если, конечно они не решают задачу системно и применимы в дальнейшем (вспомнился EurekaLog в Delphi).
Спасибо за внимание к вопросу!


Ответ

Ошибки нужно отлавливать try/catch/finaly только в тех местах где они ожидаемы и только тех типов, которые ожидаются, банальный пример обращение к методу, в методе проверка на, к примеру, доступность этого вызова текущему пользователю, ожидаемое исключение скажем PermitionDeniedException, в блоке catch его и нужно отлавливать, остальное (например ArgumentNullException) должно пробрасываться на верх стека и обрабатывать "глобально", возможно тотальным крахом приложения.
[System.Serializable] public class PermitionDeniedException : System.Exception { public PermitionDeniedException() : base("Пользователю не доступен этот метод") { } public PermitionDeniedException(string message) : base(message) { } public PermitionDeniedException(string message, Exception inner ) : base( message, inner ) { } protected PermitionDeniedException(SerializationInfo info, StreamingContext context) : base(info,context ) { } }
try { SomeMethod(); } catch (PermitionDeniedException ex) { _logger.Error(ex, "Сообщение") }
private static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e) { var ex = e.ExceptionObject; if (ex.GetType() == typeof(ExceptionType1)) { _logger.Error(ex, "Сообщение"); // TODO: Уведомить пользователя } else if (ex.GetType() == typeof(ExceptionType2)) { _logger.Fatal(ex, "Сообщение"); // Экстренно завершить приложение } else { _logger.Fatal(ex, "Сообщение"); // Можно сделать дамп и завершить приложение } }
Для Winforms, где-то в методе Main наверное стоит подписать на AppDomain.UnhandledException Например так: System.AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper; В обработчике UnhandledExceptionTrapper можно получить тип исключения, проверить его критичность и в зависимости от нее (критичности) либо экстренно свалиться, сообщив пользователю что то вроде "Программа выполнила недопустимую ошибку и будет закрыта" или же продолжить работу, но опять же известив пользователя. Что касается мультиязычности, то тут нужны динамические ресурсы и словари ресурсов, в них можно хранить строки, которыми можно описать исключение.
П.С. Структуру исключении стоит продумать, она может быть и одноуровневой, что скорее даже плюс. Максимально общие (корни) необходимо наследовать от System.Exception, что писать в сообщении придумать тоже не сложно, если у вас продуманная структура исключений.
Для логирования ошибок лучше всего использовать готовые логгеры, или Trace. Последний не такой гибкий, зато ничего из nuget тащить не нужно. Из готовых последнее время сам пользуюсь NLog.
Несколько сумбурно на мой взгляд, поэтому буду рад критике.

Нужно ли разделять интерфейсы и абстрактные классы в С++

Как известно, отдельных языковых средств для объявления интерфейсов в С++, а их роль могут выполнять абстрактные классы. Но с идеологической точки зрения интерфейсы и абстрактные классы являются довольно разными сущностями. Интерфейсы описывают некий контракт того, как можно взаимодействовать с классом. Абстрактные классы являются корнем иерархии классов, используются для полиморфизма в духе
AbstractSuperClass* a = new SubClass;
и могут просто реализовывать общий функционал.
Нужно ли, программируя на С++, разделять эти понятия и писать интерфейсы, как в Java/C#? Или можно(нужно?) смешивать и использовать только абстрактные классы?


Ответ

В C#/Java нет множественного наследования классов, но есть множественное наследование интерфейсов. Поэтому в этих языках разделять интерфейсы и абстрактные классы приходится волей-неволей.
В С++ такого ограничения нет, поэтому нет особой надобности в выделении отдельного понятия "интерфейс", и отделения его от абстрактного класса. Интерфейсом может служить любой абстрактный класс, ему даже не обязательно иметь публичных виртуальных функций (ну, кроме деструктора, если нужно полиморфное удаление). Пример такого интерфейса - паттерн NVI
При желании более соответствовать ООП парадигме языков C#/Java можно давать интерфейсным классам имена, начинающиеся с буквы I, или даже добавить
#define interface struct
чтобы выделить интерфейсный класс при объявлении/определении. Такие подходы используются в MS COM.
Но в общем случае, этого не требуется, а проблему ромбовидной иерархии можно решить через виртуальное наследование.

Почему без ошибок выполняется этот код?

char * buf = (char*)calloc(0,0);
buf = "vygbubinon";
printf("%s
", buf);
Выводится "vygbubinon". Хотя по идее памяти выделено недостаточно


Ответ

Давайте последовательно рассмотрим предложения указанного вами фрагмента кода. В первом предложении
char * buf = (char*)calloc(0,0);
выделяется память нулевого размера. Согласно стандарту языка C (7.22.3 Memory management functions)
If the size of the space requested is zero, the behavior is implementation-defined: either a null pointer is returned, or the behavior is as if the size were some nonzero value, except that the returned pointer shall not be used to access an object.
То есть вы можете запрашивать выделение памяти нулевого размера, но результат будет зависеть от платформы, где компилируется и выполняется программа. Либо будет возвращено значение NULL, либо некоторый действительный адрес памяти, по которому однако вы не можете обращаться к объекту. Так что данное предложение корректно.
Далее в следующем предложении независимо от того, каков был результат предыдущего предложения (либо NULL, либо некоторый действительный адрес) указатель buf переприсваивается, и получает адрес первого символа строкового литерала "vygbubinon".
buf = "vygbubinon";
Строковые литералы имеют статическую память. Следовательно, указатель получает адрес первого символа данного строкового литерала, расположенного в статической области памяти. Память для строковых литералов резервируется компилятором на этапе компиляции. (Компиляторы обычно собирают все литералы, присутствующее в программе, в некоторый пул литералов.) Ничего некорректного в этом предложении нет. Единственная проблема, связанная с этим предложением состоит в том, что если в предыдущем предложении была выделена память, то вы уже не сможете ее удалить, так как адрес этой памяти за счет переприсвоения указателя был утерян. Произойдет утечка памяти, но никакой ошибки времени компиляции или времени выполнения не будет.
Ну, и, наконец, в этом предложении выводится на консоль данный литерал.
printf("%s
", buf);
Так что фрагмент кода совершенно корректный за исключением возможной утечки памяти, что представляет собой лишь логическую ошибку.

Какое преимущество кластера перед одним сервером?

Примерные данные по кластеру: 1 сервер - Балансировщик приложении 2 сервера - Сервер приложении 2 сервера - Сервер БД 1 сервер - Сервер поиска и хранении
Детальной разницы и преимущества не знаю, поэтому хотелось бы узнать у более компететных участников форума.
Что можно почитать на эту тему? Куда смотреть?


Ответ

Тема слишком обширная. Много чего можно посоветовать. Но банально.
Есть у вас 1 сервер БД, к примеру. Что будет, если он упадёт? Всё плохо. Во-первых, вы данные потеряете (по крайней мере данные с прошлого бекапа). Во-вторых, ваши сервисы остальные работать не смогут без базы.
Теперь же, предположим, у вас 3 ноды базы в кластере и настроена репликация (то есть, дублирование данных). Если 1 нода выйдет из строя, то кластер продолжит работу. Если у вас 5 нод, то кластер может выдержать потерю 2 нод.
Это, если кратно. Естественно, всё зависит от архитектуру СУБД. Что хорошо для riak, то не очень для mongodb и т.п. Но в целом кластеризация помогает сохранить работоспособность даже при потере каких-то узлов в системе.
Плюс, это даёт распределение нагрузки, если хорошо всё связать с loadbalancer'ом.
В плане репликации в целом там обычно две модели:
master-master. Сложно реализуемый вариант. Обычно при этом попираются принципы ACID. У нас, к примеру, использует RethinkDB, там как раз master-master. Как даунсайд - отсутствие транзакций и т.п. плюшек, которые обычно есть в реляционных базах. В таком варианте все ноды могут писать данные, от этого все проблемы. master-slave. Проще реализовать. Пишет только master и пушит в слейвы. Со слейвов можно только читать. Отсюда простота реализации. Если выходит из строя мастер, то обычно слейвы голосует за то, кто будет новым мастером. Если всё удачно, то слейв становится мастером, а все остальные слейвы переключаются на него.
Книги могу посоветовать в большей степени только на английском:
Highscalability (: NoSQL Guide от Мартина Фаулера. Best practices по архитектуре в облаке от Amazon Ещё советую читать статьи про конкретные реализации (по конкретной СУБД). Поможет этот сайт. Как уже сказал, лучше читать статьи про конкретные реализации: всё про репликацию в MaridDB, репликация и кластеризация в Postres Про Scalability

Git не делает push на другую ветку на сервере

$ git status On branch master Your branch is ahead of 'origin/master' by 3 commits.
...
$ git push origin Tim_Musharapov error: src refspec Tim_Musharapov does not match any. error: failed to push some refs to '...'
Почему не удается сделать push?


Ответ

error: src refspec Tim_Musharapov does not match any
Это означает, что в репозитории origin просто нет ветки с именем Tim_Musharapov. Её нужно создать. Для создания веток применяется такой синтаксис:
git push origin что:куда
Здесь что - это локальная ветка, которую вы хотите запушить, а куда - имя новой ветки на origin, в которую вы хотите запушить ветку что. А origin это название удалённого репозитория (remote), оно может быть другим, но по умолчанию используется такое.
Поэтому предложенный в соседнем ответе вариант git push origin master:Tim_Musharapov означает "Взять локальную ветку master и запушить во вновь создаваемую ветку Tim_Musharapov". Это работает, но появится несоответствие в названиях локальных и удалённых веток. А ещё ветка master у вас теперь занята под собственную работу и стало неудобно получать обновления ветки master репозитория origin
Your branch is ahead of 'origin/master' by 3 commits
В вашей ветке master есть три ваших коммита, так что git pull в эту ветку уже не получится.
Есть общепринятая практика: называть локальные и удалённые ветки одинаково. Это не обязательно (т.е. Git позволяет делать и по-другому), но удобно и практично. Соответственно, если вам нельзя изменять удалённую ветку master то не вносите изменений по ходу работы в локальный master.
Поэтому предлагаю такое решение:
Для начала нам нужна ветка, в которую будем коммитить результаты своей работы. Она может называться, например, Tim_Musharapov, но обычно ветку называют по решаемой задаче, а не по имени разработчика.
Если такой ветки ещё нет, её нужно создать так, чтобы она дублировала master (смотрела на тот же коммит).
git checkout -b Tim_Musharapov master
Если ветка уже есть, обновим её до текущего master:
git checkout Tim_Musharapov git merge --ff-only master # если конфликт, значит там есть какие-то изменения, которых нет в master # нужно смотреть и разбираться.
пушим её в origin, ключ -u сохраняет соответствие локальной и удалённой ветки
git push -u origin Tim_Musharapov:Tim_Musharapov
# в следующий раз из этой ветки можно будет пушить проще: git push
А ветку master вернём к состоянию как на remote
git checkout master git reset --hard origin/master
# В локальную ветку master мы будем получать обновления с origin git checkout master git pull
Ещё немного про синтаксис что:куда
git checkout somebranch # Оба варианта создают одноимённую ветку на origin git push origin -u somebranch git push origin -u somebranch:
# Запушить "ничего" в ветку - значит удалить её git push origin :otherbranch

Многострочный комментарий в VBA, Excel

Комментарии в тексте макроса начинаются с апострофа на каждой строчке программы, а существует возможность закомментировать сразу целый блок? Например, как в других языках - /* - начало блока, */ -конец блока?
P.S. Я нашла ответ, что
в редакторе VBA на панели Edit есть кнопки Comment Block, Uncomment Block
но я у себя не нахожу подобного:


Ответ

View -> Toolbars -> Customise
Commands tab -> Edit menu
Две иконки- Comment Block и Uncomment Block
Перетащите из в тулбар Edit menu
Profit.

Как правильно использовать Dagger2?

Нашел код и хочу разобраться как работает Dagger2
Вот я слепил такой простой пример и не могу понять как его соединить чтоб он работал
Есть MainActivity
public class MainActivity extends AppCompatActivity {
@Inject protected ApiInterface apiInterface;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
if (apiInterface == null){ Log.e("TAG", "apiInterface == null"); }else { Log.e("TAG", "apiInterface != null : " + apiInterface.value); } } }
Я хочу инжекнуть в переменную apiInterface ссылку на класс. Для этого я указываю ключевое слово @Inject
Теперь, чтоб Dagger знал что инжекать туда я слепил вот такой класс
@Module class ModelModule {
@Provides @Singleton ApiInterface provideApiInterface() { return ApiModule.getApiInterface(); } }
Теперь я так понимаю Dagger когда увидит в MainActivity слово @Inject и тип переменной(насколько я понимаю), то он пойдет искать кто ему возвращает такой тип и найдет класс ModelModule в котором метод provideApiInterface() возвращает то что нужно apiInterface
Вот кстати для ясности этот класс
class ApiInterface { int value;
ApiInterface() { this.value = 4; } }
Но теперь, чтоб все заработало нужно указать @Component в котором указывается от куда брать обьекты и куда внедрять...
Но это теория, так как я не понимаю зачем это нужно... Мы и так указали уже от куда брать обьекты, а словом @Inject мы указываем куда внедрять... Зачем еще что то нужно?
Вот тут и есть проблема, обьясните зачем нужен @Component и как его составить для конкретного примера, чтоб все заработало и я мог в MainActivity получить число 4...
ПРАВКА Вот я слепил вот такой компонент
@Singleton @Component(modules = {ModelModule.class}) interface AppComponent {
void inject(ApiInterface apiInterface); }
В MainActivity я все равно получаю null
Где ошибка?


Ответ

Вам надо создать AppComponent в MainActivity
appComponent = DaggerAppComponent.builder().modelModule(new ModelModule()).build();
и сделать appComponent.inject(this)

Не могу использовать QMap::iterator как параметр другого шаблона

Не пойму почему
Есть шаблон класса:
template class Container : public IContainer { //... };
Так НЕ работает:
template class MemoryContainer : public Container::iterator> { // ... };
Пишет:
error: type/value mismatch at argument 3 in template parameter list for 'template class Container' class MemoryContainer : public Container::iterator>
^

Так работает:
template class MemoryContainer : public Container::iterator> { // ... };
И даже так работает:
template class MemoryContainer : public Container> { // ... };
Почему же так НЕ работает???
template class MemoryContainer : public Container::iterator> { // ... };


Ответ

Напишите
template class MemoryContainer : public Container::iterator> { // ... };

Как правильно нужно писать кавычки в ресурсах

Нужно отобразить кавычки в тексте, как правильно, нужно прописать в ресурсах стринг, что бы кавычки отобразились на экране?
Есть такая строка:
Only when screen "on"
Пробовала:
Only when screen " on "
Но кавычки не отображаются.


Ответ

Для кавычек что одинарных, что двойных надо \" и \'
Only when screen \"on\"

Помогите разобрать код на Си

#include void CntTo3(int); void CntTo2(int); void CntTo1(int); int main() { int n; CntTo3(3); return 0; } void CntTo3(int p) { CntTo2(p-1); printf("%d
",p); } void CntTo2(int p) { CntTo1(p-1); printf("%d
",p); } void CntTo1(int p) { printf("%d
",p); }
После компиляции, показывается ответ как -
1 2 3
Получается, чтобы вывести 1 в функции CntTo3, нужно выполнить функцию CntTo2, которая будет равняться 2, ну и CntTo1 уже выводит без вычислений 3. Я правильно понял? Если да, то почему в main() определяется CntTo3(3) и зачем переменная n?


Ответ

int main() { int n; CntTo3(3); return 0; } void CntTo3(int p) { CntTo2(p-1); printf("%d
",p); } void CntTo2(int p) { CntTo1(p-1); printf("%d
",p); } void CntTo1(int p) { printf("%d
",p); }
Давайте просто подставлять код вместо вызова:
int main() { int n; CntTo2(2); printf("%d
",3); return 0; } void CntTo2(int p) { CntTo1(p-1); printf("%d
",p); } void CntTo1(int p) { printf("%d
",p); }
Следующая подстановка:
int main() { int n; CntTo1(1); printf("%d
",2); printf("%d
",3); return 0; } void CntTo1(int p) { printf("%d
",p); }
И последняя:
int main() { int n; printf("%d
",1); printf("%d
",2); printf("%d
",3); return 0; }
Так понятнее?
Переменная n нигде не работает (кстати, компилятор должен предупредить об этом).

Как на C# получить список процессов и запущенных служб Windows?

Как на C# получить список процессов и служб Windows?


Ответ

Список служб можно получить через SeviceController.GetServices
Список процессор через Process.GetProcesses
Не уверен на счет получения списка процессов Windows... Вроде, там какой-то нюанс с разрядностью, т.е x64 приложение не видит х32.

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

Необходимо сделать переадресацию на мобильную версию сайта расположенную по адресу site.com/m , но при этом, если заходит на site.com/full то не зависимо должен переадресовывать на site.com/ Нашел такое решение
set $mobile_request false; if ($http_user_agent ~* "(windows\smobile|windows\sce|iphone|ipod|midp|symbian|series\s60|s60|nokia|аndroid| blackberry|Android)"){ set $mobile_request true; } rewrite ^(/full)(.*)$ \#$2 permanent; if ($mobile_request = true) { return 301 /m$request_uri; }
но тут если зайти с телефона, то на site.com не переадресовывает. Подскажите какое-то решение.


Ответ

у меня получилось сделать, правда пришлось использовать для мобильной версии отдельный домен.
server { listen 443 ssl; server_name site.com;
location /full { set $mobile_request 0; rewrite ^/full(.*)$ $1 break; } }
location / { set $mobile_request 1; if ($http_referer ~* "https://(.*).site.com/") { set $mobile_request "0"; } if ($http_user_agent ~* "(windows\smobile|windows\sce|iphone|ipod|midp|symbian|series\s60|s60|nokia|аndroid| blackberry|Android)"){ set $mobile_request "${mobile_request}1"; } if ($mobile_request = 11) { set $mobile_request "0"; return 302 https://m.site.com/; }
}
} server { listen 443; server_name m.site.com;
location / { ...
} location /full { return 301 https://site.com$request_uri; } }
возможно кому-нибудь пригодится :)

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT (Retrofit 2)

Получаю такую ошибку java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT, когда получаю данные с сервера. Чем вызвана эта ошибка? И как ее исправить?
JSON, который приходит с сервера:
{ "group": [ { "name": "Group1", "description": "Test Group 1" }, { "name": "Group2", "description": "Group Name Updated" } ] }
Интерфейс API:
@GET("groups") Observable > getAllGroups(@Header("Authorization") String auth, @Header("Content-type") String contentType, @Header("Accept") String accept );
Метод, в котором получаю данные:
private void getAllGroups() { String group = "Group1"; String credentials = "admin" + ":" + "admin"; final String basic = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP); String contentType = "application/json"; String accept = "application/json"; Subscription subscription = App.service.getAllGroups(basic, contentType, accept) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(groups -> { groupList.addAll(groups); }, throwable -> { Log.e("All group error", String.valueOf(throwable)); });
addSubscription(subscription); }
Класс Group:
public class Group {
private String name; private String description; private String admins; private Member members;
public Group(String name, String description, String admins, Member members) { this.name = name; this.description = description; this.admins = admins; this.members = members; }
public Group(String name, String description) { this.name = name; this.description = description; } // getters setters }


Ответ

Сервер присылает JSONObject, в котором JSONArray, а вы пытаетесь парсить как JSONArray. Должно быть как то так:
public class GroupList { ArrayList group; //setters, getters }

public class Group {
private String name; private String description;
... }

Чем отличаются стандартные пути от не стандартных?

Часто замечаю что используют пути для поиска по разному, но чем они отличаются ( то есть работают на разные ОС как-то по разному или что)?
В чём разница между
string environmentVariable = Environment.GetEnvironmentVariable("temp");
или просто
string environmentVariable = Path.GetTempPath();
А так же интересуюсь:
Console приложение и WindowsForms от .Net 2.0 работают на всех ОС? : Начиная с XP и заканчивая Win 10?!


Ответ

Environment.GetEnvironmentVariable("temp") просто вернет значение переменной окружения с именем temp
Path.GetTempPath вернет первое существующее значение из следующего списка:
Путь, указанный в переменной среды TMP. Путь, указанный в переменной среды TEMP. Путь, указанный в переменной среды USERPROFILE. Каталог Windows.
... так что он надежнее и безопаснее, чем вызов GetEnvironmentVariable("temp")
Кстати, это прямо сказано в MSDN по методу Path.GetTempPath

Динамический перевод текста

Мне в приложении нужно динамически переводить текст с английского на русский, почитала, что есть Google Translate API, но он платный, есть какие-то альтернативные варианты?


Ответ

Яндекс переводчик - бесплатно переводит до 10 миллионов символов в месяц и не более 1 миллиона символов в сутки. Bing переводчик - бесплатная подписка до 2 миллионов символов в месяц.

Итерация по элементам строки: вытащить элемент, который будет числом и длина которого будет больше 4х символов

Добрый день. Подскажите, могу ли я итерироваться по элементам строки? Например есть строка а = 'qqqq 12qw3 12 12345', отсюда необходимо вытащить элемент, который будет числом и длина которого будет больше 4х символов. Возможно, стоит использовать модуль re, но я не могу понять, как задать в нём условие выбора элемента по его длине.


Ответ

Строка:
In [56]: a = 'qqqq a987654xx321aa 12qw3 12 12345 zz 1234567'
Если необходимо вернуть только первое число длина которого больше 4х символов:
In [72]: re.search(r'\b(\d{5,})\b', a).group(0) Out[72]: '12345'
Вариант не использующий RegEx
In [68]: [s for s in a.split() if s.isdecimal() and len(s) > 4][0] Out[68]: '12345'
Если необходимо вернуть все числа длина которых больше 4х символов:
In [57]: re.findall(r'\b(\d{5,})\b', a) Out[57]: ['12345', '1234567']
или так, если считать числом 987654 присутствующим в a987654xx321aa
In [58]: re.findall(r'(\d{5,})', a) Out[58]: ['987654', '12345', '1234567']

Как восстановить прошлый коммит без потери существующих

Допустим когда-то давно я сделал коммит и после него прошли ещё много коммитов. Вдруг я понял, что тот давний коммит мне не был нужен, но я сделал много с того момента. Как не потерять свои наработки
Было А - B - C (коммит, который не нужен ) - D - E
Должно быть A - B - D - E
Ну и чтобы, если я одумался, легко вернуть С


Ответ

Не совсем понятно, в какой ситуации вы находитесь.
Если "давний" коммит означает, что он уже запушен на сервер, то вам вероятнее лучше оставить всё как есть.
Да, будет некоторый излишний коммит, но зато вам не придётся делать команду git rebase (что автоматически влечёт за собой git push -f: а force обычно в командах не приветствуется).
Зато в результате вы видите настоящую историю проекта как она есть и это тоже порой важная вещь.
Если же вы несмотря на давность коммита ещё не запушили его на удаленный сервер, либо вы - единственный пользователь для этого гит-репозитория (скажем, маленький pet-project), то делайте команду git rebase
Если у вас простая линейная история (без -noff) то вам нужно сделать примерно следующее.
Даёте команду
$ git rebase -i HEAD~5 pick 44e62cc A pick 95efd4a B pick ea91c6a C pick 99cd517 D pick 008df96 E
# Rebase 5c79d06..008df96 onto 5c79d06 # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out "~/ansible/test/.git/rebase-merge/git-rebase-todo" 23L, 851C
(я указал коммит через HEAD~5, можете указывать SHA (id) предыдущего коммита перед тем, который вы хотите удалить)
Удаляете целиком строку pick ea91c6a C - приводите текст к виду:
pick 44e62cc A pick 95efd4a B pick 99cd517 D pick 008df96 E
После чего выходите с сохранением из редактора.
Далее всё очень сильно зависит от содержимого коммитов D и E.
В простейшем случае вы увидите сообщение о том, что rebase прошёл успешно (Successfully rebased and updated refs/heads/master.), в сложных случаях -- вам придётся вносить исправления в коммиты, которые невозможно автоматически применить к рабочему каталогу.
Простейший пример для понимания: в коммите C был создан новый файл adsf.txt, при этом в коммите D есть какая-то модификация этого файла, а применять изменения не к чему.
На каждом из коммитов, которые не могут быть автоматически применены гит будет останавливаться в состоянии Detached HEAD и будет ждать ваших корректировок. Скорректировали -- дали команду git rebase --continue и опять дальше применять коммиты, пока не дойдёте до последнего (и rebase закончится), либо опять остановитесь на одном из промежуточных.
Ещё по теме rebase я подробно описывал пошаговые действия: можете почитать тут
PS Update Вот что ещё. Я не дочитал про "если я одумался, легко вернуть С" и инструкция выше удалит коммит полностью и вы его после 30 дней (или чистки мусора git gc) уже не вернёте никак. Если хочется сохранить коммит -- то можете сделать отдельную backup-ветку перед выполнением rebase.

Из двоичного кода в символ ASCII в C#

В программу вводится двоичный код (Например: 10101001010100) нужно его перевести в символы(строку) ASCII


Ответ

Возможно, подойдёт что-то такое
http://ideone.com/14GcZQ
using System; using System.Text.RegularExpressions;
public class Test { public static void Main() { var a = "10101001010100"; Console.WriteLine(Regex.Replace(a, "[01]{7}", m => ((char)Convert.ToByte(m.Value, 2)).ToString())); } }
Но если важна поизводительность, стоит подумать о другом способе.

Как изменить дату на 1 день назад

у меня есть переменная
String date = "10.11.2016";
как мне преобразовать ее в
String date = "09.11.2016";
Нужно чтобы это делалось для любой даты. Как можно это реализовать?


Ответ

Сначала Вам нужно получить представление заданной даты в виде объекта класса, который предназначен для работы с датами. Этим классом является класс Calendar
Получаете экземпляр класса Calendar
Calendar calendar = Calendar.getInstance();
Создаете объект, который преобразует дату в виде строки (определенного формата) в объект класса Date
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
Получаете объект класса Date из Вашей строки и инициализируете им calendar
calendar.setTime(sdf.parse(date));
Изменяете объект calendar путем декремента даты:
calendar.add(Calendar.DATE, -1);
Получаете текстовое представление объект calendar
date = sdf.format(calendar.getTime());

Извлечь данные из массива при выборе радиокнопки

Есть массив:
$arr = [ ['id'=>101, 'note'=>'Содержание_1'], ['id'=>108, 'note'=>'Содержание_2'], ['id'=>258, 'note'=>'Содержание_3'] ];
На странице php генерируются радиокнопки значение которых равно элементу 'id' из массива $arr.
Вот примерный код:
101, 'note'=>'Содержание_1'), array('id'=>108, 'note'=>'Содержание_2'), array('id'=>258, 'note'=>'Содержание_3') ); ?> punkt 1 punkt 2 punkt 3


Сейчас у меня при выборе радиокнопки в div class="note" попадает значение 'id'.
Можно ли с помощью javascript извлечь значение 'note' из массива $arr, у которого 'id' равно значению выбранной радиокнопки и вывести в div class="note"


Ответ

Можно сделать таким образом, но все данные будут видны в DOM'e
punkt 1

Java. TDD. Как проверить в assertThat() что объект имеет определенный тип (как instanceof)

Надо в тесте проверить что определенный объект имеет определенный тип.
boolean res = (desc[2][7] instanceof Place); assertThat(res,is(true));
Что-бы вот так не писать... Есть ли какой-то метод в util?


Ответ

Нужно использовать org.hamcrest.CoreMatchers.instanceOf
Ответ: https://stackoverflow.com/a/12404813/4828657

Компилятор для С поддерживающий стандарт С11 для Windows 7

Какой компилятор языка С поддерживает стандарт С11 и может быть установлен в операционной системе Microsoft Windows Домашняя расширенная SP1 ?


Ответ

Компилятор gcc, который портирован под Windows в проекте MinGW-w64.
При компиляции нужно указывать флаг, какой конкретно использовать стандарт:
gcc -std=c11
Подробнее, про поддерживаемые стандарты gcc можно посмотреть тут: https://gcc.gnu.org/onlinedocs/gcc/Standards.html

C# и обобщенная (generic) лямбда

Есть ли в c# возможность создать обобщенную лямбду, например
static void Main() { Console.WriteLine(Fun(x => x * x, x => x + x, 3));
Func, Func, int, int> fun = (a, b, x) => a(b(x));
Console.WriteLine(fun(x => x * x, x => x + x, 3)); } static T Fun(Func a, Func b,T x) { return a(b(x)); }
Вот есть функция Fun, и она обобщенная, но есть ли возможность то же провернуть с лямбдой, например один раз я хочу вызвать лямбду fun с типом int, а другой раз с типом double
Заранее спасибо


Ответ

Нет, определять собственные обобщенные параметры лямбды не могут.

Как получить больше 1000 людей, лайкнувших пост, через VK API?

Пытаюсь получить всех пользователей, кто поставил лайк под записью, через likes.getList. Но есть ограничение: получить разом можно только 1000 человек. А как получить всех пользователей, если таковых является, например, 3500?
Вот так я получаю список первой 1000 лайкнувших:
$res = file_get_contents('https://api.vk.com/method/likes.getList?t‌​ype=post&owner_id=-1‌​111&item_id=111&exte‌​nded=1&count=1000&of‌​fset=0'); $resp = json_decode($res, true); foreach($resp['response']['items'] as $val) { echo $val['first_name'] . "

"; }


Ответ

Небольшая функция, которая работает рекурсивно, каждый раз смещая параметр offset на нужную величину (на offset в запросе + количество уже выбранных юзеров count) пока не придет пустой ответ. Это значит, что пора обрывать рекурсию.
Однако может еще прийти ответ error вместо response. Но эта обработка на вашей совести))
Еще также указывайте версию API, а то может вернуть не те данные, которые ожидаете или вообще ошибку вернуть.
$count = 1000; $offset = 0; $apiVersion = 5.60; $result = [];
getLikesData($result, $count, $offset, $apiVersion);
function getLikesData(&$output, $count, $offset, $apiVersion) { $query = 'https://api.vk.com/method/likes.getList?type=post&owner_id=-1‌​111&item_id=111&extended=1&friends_only=0&v='.$apiVersion.'&count='.$count.'&offset='.$offset; $resp = json_decode(file_get_contents($query), true);
if (!$resp['response']) return;
$items = $resp['response']['items'];
if (empty($items)) return;
foreach ($items as $item) { $output[] = $item; }
getLikesData($output, $count, $offset + $count, $apiVersion); }
echo '

';
print_r($result);
echo '
';

В функции находится цикл для заполнения результирующего массива по порядку. Если вместо этого воспользоваться array_push, то будет отрабатывать быстрее. Однако в результирующем наборе будет массив массивов.
Это я к чему... Выбирайте что нужно: меньшая скорость, но по порядку или большая скорость, но потом при выводе придется организовывать двойной цикл.

Не отображается floating action button на реальном устройстве , в режиме preview отображается

Ребилд делал,кэш чистил,ошибок в редакторе нет. использую navigationview.
Код activity_main
android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="start">



Код app_bar_main

app:bb_inActiveTabAlpha="0.8" app:bb_inActiveTabColor="@color/colorBacgroundContent" app:bb_showShadow="true" app:bb_tabXmlResource="@xml/bottombar_tabs"/>
android:layout_height="wrap_content" android:animateLayoutChanges="true" android:theme="@style/AppTheme.AppBarOverlay">
android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/AppTheme.PopupOverlay"/>

app:srcCompat="@android:drawable/ic_dialog_email"/>


Ответ

Нужно поменять местами контент и кнопку, т.к. контент перекрывает эту самую кнопку:

C# MVVM (WPF). как использовать Model?

Здравствуйте, попрошу помочь с пониманием использования MVVM патерна. Как представляю я его для себя:
Существует отдельный самодостаточный проект (или библиотека) в котором написан какой - то готовый функционал. Пользователю проекта предоставляется интерфейс в котором открыты свойства который определяют состояние сервиса и открыты события для оповещения сервисом (push/pull notification). Например для нотификации использовать ReactiveExt. Стоит задача использовать этот сервис, написать для него UI. Создаем новый WPF проект, для облегчения поддержки MVVM используем какой-нибудь фреймворк (я использую Caliburn.Micro). Создаем связку View-ViewModel. Используем Binding, code behind стараемся не использовать (используем только для функционала замкнутого на View). Отлаживаем отдельно UI-ый проект. Проверяем работу всех нотификаций, байндинга и т.д. Имеем 2 готовых не связанных проекта. Сервис и UI. Дальше... Самое простое получить экземпляр сервиса во ViewModel ( создать напрямую, передать в конструкторе, получить через DI). И подписать обработчики события на события сервиса. В теле обработчиков использовать свойства ViewModel которые участвуют в байндинге. Также ViewModel обращается за состоянием сервиса к открытым свойствам сервиса. Таким образом работа сервиса будет связанна с UI.
А где Model в этой структуре?
Если сделать Mapping сервиса на объект Model. Т.е. копия сервиса имеющая только нужные для UI свойства. И уже получать экземпляр модели во ViewModel.
Но ведь тогда придется дублировать и события (нотификацию).
Тут я немного запутался)))... Подскажите где же Model???


Ответ

Вы всё правильно описываете. Сервис — это и есть ваша модель.
Если вы считаете, что у сервиса свойства, готовые для отображения в UI, это чаще всего не так. Например, модель живёт в непонятно каком потоке (а то и в нескольких, как ей удобно), а VM должна жить в UI-потоке. VM должна выставлять INotifyPropertyChanged, а ваша модель выставляет Rx. Ну и вам наверняка не нужны все свойства вашего сервиса, а некоторые, возможно, вы хотите объединить или преобразовать как вам больше подходит для UI.
Да, это может быть некоторым дубляжом кода. Вот тут немного больше по этой же теме.

Виртуальная память процесса в windows, что из неё видно и как меняются адреса?

Вопрос по загрузке PE и распределению в адресов в режиме пользователя. Насколько я знаю, PE-секции выгружаются в общую для всех пользовательских программ область, в зависимости от доступности, и адреса задаются при загрузке в память, но тут вопрос - как происходит адресация внутри программы, раз мы не меняя кода получаем работоспособную программу и при этом можем через ту же память обращаться в адресное пространство других процессов? К примеру, у меня в программе по адресу 0x1 лежит mov ax,bx и когда происходит jmp 0x1 он перекидывает меня именно в мою программу, а не в чужую, при этом я могу прочитать тот же 0x1 другой программы как? И как бы мне выцепить user32 и kernel32 без таблицы импорта, но из своего pe-файла? И чего там ещё интересного можно найти?


Ответ

Насколько я знаю PE-секции выгружаются в общую для всех пользовательских программ область в зависимости от доступности и адреса задаются при загрузке в память
Так было до Windows 3.1 включительно, когда виртуальной памяти попросту не существовало, и разделение производилось по отовсюду доступным сегментам. В современных же операционных системах каждый процесс находится в собственном, изолированном адресном пространстве («песочнице»).
Согласен, если файл (в том числе исполняемый) отображается в несколько процессов в режиме только на чтение и без каких-либо изменений, то операционная система может (но не обязана) сэкономить немного ОЗУ и отобразить соответствующие страницы виртуальной памяти этих процессов в один и тот же регион памяти физической
Однако это всего лишь трюк на уровне отображения виртуальной памяти на физическую силами железа. С точки зрения самих программ никакого общего региона не существует.
к примеру у меня в программе по адресу 0x1 лежит mov ax,bx и когда происходит jmp 0x1 он перекидывает меня именно в мою программу а не в чужую
Перед тем, как переключить выполнение на какой-либо поток вашего процесса, операционная система производит определённую донастройку процессора. В частности, она извлекает из своих внутренних структур физический адрес карты отображения памяти и передаёт его специальному блоку процессора, мапперу
Маппер же использует указанную карту примерно следующим образом:

(Иллюстрация взята из ответа на вопрос «Какую модель памяти сегментную или страничную использует windows, linux, macos?»)
при этом я могу прочитать тот же 0x1 другой программы как?
Надо попросить операционную систему не выделять пустую страницу, как она это обычно делает, а создать привязку к уже существующей странице. Иными словами, как бы прорубить окно в чужое адресное пространство.
Однако отображаемый блок не должен накладываться на уже занятый регион виртуальной памяти вашего процесса. С другой стороны, это окно можно создать в любом месте памяти вашей программы.
Для этого необходимо вызвать системную функцию MapViewOfFileEx(), указав целевой процесс и адрес в его виртуальной памяти.
И как бы мне выципить user32 и kernel32 без таблицы импорта но из своего pe-файла?
LoadLibrary() + GetProcAddress(). Всё остальное — хаки и ненадёжно.