Страницы

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

среда, 22 мая 2019 г.

Не отправляется письмо через smtp mail - время ожидания операции истекло

Написал маленькую прогу на WinForms с опцией отправки сообщения. Собсно код :
SmtpClient client = new SmtpClient("smtp.mail.ru", 465); client.Credentials = new NetworkCredential("vasiliy.aksenov.97@mail.ru", "11aa11aa"); client.EnableSsl = true; MailMessage mail = new MailMessage(); mail.From = new MailAddress("vasiliy.aksenov.97@mail.ru"); mail.To.Add("vasiliy.aksenov.97@mail.ru"); mail.Subject = "Получен новый заказ на " + OrderData.clothingTypeRuss; mail.Body = "test"; try { client.Send(mail); MessageBox.Show("Заказ успешно отправлен ", "Отправка"); } catch (Exception ex) { MessageBox.Show(ex.Message, ex.Source); }
не отправляет, пишет что время ожидания превышено. и тоже самое с smtp от gmail. Может что то в коде не правильно? Хотя по отладке видно что тормозит именно на client.Send(mail); Подскажите как решить проблему?


Ответ

Отлично, вы верно решили проблему. Сейчас давайте определимся с причинами такого поведения.
Существует два способа соединения по протоколу SMTP c использованием SSL:
Explicit SSL Implicit SSL
Explicit SSL использует порты 25 (или 587), или же, возможно, порт 2525 (не стандартный)
Explicit SSL означает, что клиент сначала подключается по незащищенному каналу, посылает команду EHLO, и если сервер сообщает о том, что шифрование поддерживается, то для включения шифрования клиент посылает команду STARTTLS, затем все дальнейшие коммуникации (включая аутентификацию) между клиентом и сервером уже защищены.
Implicit SSL использует порт 465 и отличается тем, что соединение сразу устанавливается по TLS/SSL.
В настоящее время класс SmtpClient поддерживает только Explicit SSL, потому что Implicit SSL до сих пор не стандартизирован.

Ввод в TextBox только цифр и английских символов

Как наиболее правильно запретить ввод в TextBox символов любой раскладки кроме английской и цифр. Желательно не сравнивая в цикле каждый символ строки с шаблоном.

private void validationTextBox_KeyDown(object sender, KeyEventArgs e) { TextBox a = (TextBox)sender; if (e.Key < Key.D0 || e.Key > Key.F) e.Handled = true; //code }


Ответ

У меня работает код, основанный на этом ответе


void OnPreviewTextInput(object sender, TextCompositionEventArgs e) { e.Handled = !e.Text.All(IsGood); }
private void OnPasting(object sender, DataObjectPastingEventArgs e) { var stringData = (string)e.DataObject.GetData(typeof(string)); if (stringData == null || !stringData.All(IsGood)) e.CancelCommand(); }
bool IsGood(char c) { if (c >= '0' && c <= '9') return true; if (c >= 'a' && c <= 'f') return true; if (c >= 'A' && c <= 'F') return true; return false; }
Вставка работает, если в ней нет запрещённых символов.

Как создать общий List<> для всех форм?(WinForms, C#)

У меня есть две формы, одна добавляет в лист данные, вторая считывает, как можно это реализовать?


Ответ

как-то так
static class InnerData { static public List AllData = new List(); }
добавление
InnerData.AllData.Add(data);
чтение
foreach(Data data in InnerData.AllData) { //something }

Зачем windows позволяет создавать приватные кучи?

Каждый процесс в ОС Windows имеет по умолчанию свою кучу, размер которой в будущем может быть изменен. Более того, каждый процесс способен так же создавать кучу с определенным, наперед заданным начальным и максимальным размером (такая куча будет называться приватной). Зачем такая возможность существует в Windows? Чтобы оптимизировать реаллокации? Но тогда не достаточно ли в таком случае использования обычной кучи по умолчанию?


Ответ

При создании кучи можно задавать наличие следующих параметров:
HEAP_CREATE_ENABLE_EXECUTE — разместить кучу на страницах с правом на исполнение. Подобное можно использовать для JIT-компиляции небольших фрагментов кода, когда выделение целой 4КБ страницы на фрагмент было бы излишним. HEAP_GENERATE_EXCEPTIONS — выбрасывать SEH-исключения из функций управления кучей. HEAP_NO_SERIALIZE — разменять поддержку многоточности на скорость выделения/высвобождения блоков кучи.
В куче по умолчанию ничего из вышеперечисленного не включено.

Неправильная ориентация .JPG в браузере

Проблема: обнаружено, что картинки в формате .JPG (именно прописными буквами, с обычным .jpg - всё в порядке) в браузере меняют свою ориентацию.

https://jsfiddle.net/vzLgay5a/1/
То есть одна картинка может быть отражена по вертикали, а другая повёрнута на 90°. Чем и как в таком случае повернуть её в ту ориентацию, в какой она отображается локально на машине.
Был бы также признателен, если кто-нибудь объяснил бы, почему вообще это происходит.


Ответ

Дело в EXIF.
При просмотре в теле страницы показывает перевернутой, а при "открыть картинку в новой вкладке" показывает картинку повернутой правильно. Т.е. современные браузеры когда показывают только картинку берут ее (в моем случае повернутую набок) смотрят на EXIF и поворачивают как надо.
Первый вариант - при загрузке фото удалять все данные EXIF Второй вариант - при загрузке фото если есть данные EXIF - повернуть фото согласно данных.
2 вариант
$img = new Imagick($uploaded_img); $orientation = $img->getImageOrientation(); switch($orientation) { case imagick::ORIENTATION_BOTTOMRIGHT: $img->rotateimage("#000", 180); // rotate 180 degrees break; case imagick::ORIENTATION_RIGHTTOP: $img->rotateimage("#000", 90); // rotate 90 degrees CW break; case imagick::ORIENTATION_LEFTBOTTOM: $img->rotateimage("#000", -90); // rotate 90 degrees CCW break; } $img->setImageOrientation(imagick::ORIENTATION_TOPLEFT); $img->writeImage($uploaded_img); $img->clear(); $img->destroy();
Первый вариант был бы примерно так:
$img = new Imagick($uploaded_img); $img->stripImage(); $img->writeImage($uploaded_img); $img->clear(); $img->destroy();
https://toster.ru/q/267428

Разбиение кода на функции. С++

Есть код программы, которая позволяет ввести динамический массив, а затем 1. Упорядочивает элементы массива по возрастанию. 2. Находит сумму отрицательных элементов массива. 3. Находит произведение элементов массива, расположенных между максимальным и минимальным элементами. Не получается грамотно разбить код на многофайловый проект.
#include "stdafx.h" #include using namespace std; double *p, n; double pr = 1; int sum, min = 1000000, max = -1000000, i_, j_;
int main() { setlocale(LC_ALL, "Russian"); cout << "Введите количество элементов: "; cin >> n; p = new double[n];
cout << "Введите элементы массива: "; for (int i = 0; i < n; i++) cin >> p[i];
for (int i = 0; i < n; i++) { if (p[i] < 0) sum += p[i]; if (max < p[i]) { max = p[i]; i_ = i; } if (min > p[i]) { min = p[i]; j_ = i; } }
if (i_ > j_) swap(i_, j_); for (int i = (i_ + 1); i < j_; i++) pr *= p[i];
for (int i = 0; i < n; i++) for (int j = i; j > 0 && p[j - 1] > p[j]; j--) swap(p[j], p[j - 1]);
cout << "Отсртированный массив: "; for (int i = 0; i < n; i++)
cout << p[i] << " "; cout << endl; cout << "Сумма отрицатльных элементов: " << sum < system("pause"); return 0; }


Ответ

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

Как вытаскивать из стека нужные значения?

Я сначала сохраняю PUSH EAX, потом PUSH EAX, то есть значения двух регистров. Возможно, есть специальная инструкция, которая позволяет взять самое нижнее значение стэка? Вершиной стэка - значение EAX, дно стэка значение ECX. Как взять значение из "дна", изменить его и положить обратно на дно? Благодарю за ответы!


Ответ

Машинный стек - это просто участок памяти, с ним можно работать как с любым другим участком памяти, например с помощью команды mov можно обратиться к любому адресу выше текущей вершины (адреса, лежащего в esp).
Действия из вопроса можно выполнить так:
push eax push ecx mov edx, [esp+4] ; берем значение, которое было добавлено в стек предпоследним ... ; как-то меняем mov [esp+4], edx ; кладем обратно
Дном стека для процедуры условно можно считать значение указателя стека, которое он имеет в момент входа в процедуру. Есть стандартный прием, когда это значение сохраняется в регистр ebp, потом в стеке выделяется память под локальные переменные (указатель стека просто уменьшается на размер локальных переменных), а потом в процессе работы процедуры от ebp в большую сторону ([ebp+N]) рассчитываются адреса аргументов процедуры, а в меньшую сторону ([ebp-N]) - адреса локальных переменных. При этом значение esp в процессе работы процедуры может меняться, а значение ebp остается одним и тем же. Код процедуры будет выглядеть примерно так:
; Стандартный пролог для создания стекового фрейма push ebp mov ebp, esp sub esp, M ; M - размер локальных переменных
... ; основной код процедуры
; Стандартный эпилог mov esp, ebp pop ebp ret

Зачем var app = app || {} в начале пишут?

Зачем в начале скрипта пишут var app = app || {}; ? Ссылка на весь файл
P.S. Можно ли подключать JSX скрипты (чтобы они потом работали) без помощи сторонних библиотек? Например, через ?


Ответ

var app = app || {};
Таким образом, избегают переопределения уже инициализированного объекта, при множественной загрузке разных модулей приложения.
Эквивалент:
if (!window.app) { // Если app не определена window.app = {}; // Инициализируем её объектом }
Остальные скрипты будут работать с уже определённым объектом, расширяя и дополняя его.

Как проверить разрядность системы?

Имея данный алгоритм, почему-то большую часть показывает x32. У меня стоит x64

private static bool Is64Bit() { return IntPtr.Size == 8; }
public static string CheckOS() { if (Is64Bit()) return "x64"; else return "x32"; }
[DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool IsWow64Process([In] IntPtr hProcess, out bool lpSystemInfo);

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


Ответ

Решил проблему так:
internal class OSCheckBit { private static bool Is32BitProcessOn64BitProcessor() { IsWow64ProcessDelegate fnDelegate = GetIsWow64ProcessDelegate(); if (fnDelegate == null) return false; bool isWow64; bool retVal = fnDelegate.Invoke(Process.GetCurrentProcess().Handle, out isWow64); if (retVal == false) return false; return isWow64; } private static IsWow64ProcessDelegate GetIsWow64ProcessDelegate() { IntPtr handle = LoadLibrary("kernel32"); if (handle != IntPtr.Zero) { IntPtr fnPtr = GetProcAddress(handle, "IsWow64Process"); if (fnPtr != IntPtr.Zero) return (IsWow64ProcessDelegate)Marshal.GetDelegateForFunctionPointer((IntPtr)fnPtr, typeof(IsWow64ProcessDelegate)); } return null; } public enum SoftwareArchitecture { Unknown = 0, x32 = 1, x64 = 2 } static public SoftwareArchitecture OSBits { get { SoftwareArchitecture osbits = SoftwareArchitecture.Unknown;
switch (IntPtr.Size * 8) { case 64: osbits = SoftwareArchitecture.x64; break; case 32: if (Is32BitProcessOn64BitProcessor()) osbits = SoftwareArchitecture.x64; else osbits = SoftwareArchitecture.x32; break; default: osbits = SoftwareArchitecture.Unknown; break; }
return osbits; } } [DllImport("kernel32", SetLastError = true, CallingConvention = CallingConvention.Winapi)] public extern static IntPtr LoadLibrary(string libraryName); [DllImport("kernel32", SetLastError = true, CallingConvention = CallingConvention.Winapi)] public extern static IntPtr GetProcAddress(IntPtr hwnd, string procedureName); private delegate bool IsWow64ProcessDelegate([In] IntPtr handle, [Out] out bool isWow64Process);
Вызов: Console.WriteLine($"Версия Вашей ОС: {OSCheckBit.OSBits}");

Заменить группу в регулярном выражении python

Нужно заменить в строке совпадение с группой в регулярном выражении. Пусть есть foo42buz, нужно получить foobarbuz Очевидно, я сразу пытаюсь написать что-то такое
string = 'foo42buz' pattern = re.compile(r'(\d+)buz') re.sub(pattern,'bar',string)
Но это возвращает ту же foo42buz
Гуглю как заменить совпадение именно с группой и пытаюсь делать так
string = 'foo42buz' pattern = re.compile(r'(\d+)buz') re.sub(pattern,r'\1bar',string)
и так
string = 'foo42buz' pattern = re.compile(r'(\d+)buz') re.sub(pattern,r'\g<1>bar',string)
и даже так
string = 'foo42buz' pattern = re.compile(r'(?P\d+)buz') re.sub(pattern,r'\gbar',string)
Но re.sub ведет себя очень неочевидным для меня образом, возвращая foo42buz

Попробую еще раз. Есть строка, есть регулярка с группой. Необходимо в строке подстроку совпадающую с группой заменить на другую подстроку. Есть строка foo42buz, есть регулярка (\d+)buz, где группа (\d+) совпадает с подстрокой 42. Нужно заменить это совпадение другой строкой bar, чтобы получилась в итоге строка foobarbuz


Ответ

Еще 1 вариант, но это экзотика :)
>>> re.sub(re.findall(r'(\d+)buz', string)[0], 'bar', string) 'foobarbuz'

DispatcherTimer первый вызов Tick сразу при старте C#

Как сделать, чтобы при запуске таймера он сразу выполнил код в прикрепленном методе, а не дожидаться отсчета интервала.
Например:
var makeWorkTimer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(15) };
makeWorkTimer.Tick += (sender, args) => { Console.WriteLine("Hello"); };
makeWorkTimer.Start();
Как сделать, чтобы cw выполнился сразу, не дожидаясь 15 секунд интервала на первый запуск метода?


Ответ

var makeWorkTimer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(15) };
EventHandler handler = (sender, args) => { Console.WriteLine("Hello"); };
makeWorkTimer.Tick += handler; makeWorkTimer.Start(); handler(null, null);

JSON.stringify даёт не те данные, что нужно

var One = 1; var Two = 2; alert(JSON.stringify({One:Two})); // Вывод - {"One":2}
А надо {1:2}
Как получить нужный формат?


Ответ

Для того, чтобы в качестве ключа было значение переменной One нужно использовать Computed property name
var One = 1; var Two = 2; console.log(JSON.stringify({ [One]: Two })); // Вывод - {"One":2}
Альтернативное решение - сохранить объект в переменную, добавив ему необходимые свойства и лишь затем вызвав JSON.stringify
var One = 1; var Two = 2; var obj = {} obj[One] = Two console.log(JSON.stringify(obj)); // Вывод - {"One":2}

Почему $_POST всегда существет?

Проверяю в коде php, задан ли $_POST через isset($_POST)
Заметил, что выражение всегда возвращает true, даже когда никаких данных не передовали, при этом $_POST является пустым массивом. Почему так происходит и зачем так сделано? Или это только при определенных условиях?
Вопрос чисто теоретический, проблемы тут никакой нет.


Ответ

$_POST, как и другие суперглобальные переменные (встроенные переменные всегда доступные во всех областях видимости) PHP ($GLOBALS, $_SERVER, $_GET, $_FILES, $_COOKIE, $_SESSION, $_REQUEST, $_ENV), изначально инициализируется пустым массивом, а потом заполняется соответствующими значениями.
За исключением $_SESSION, которую нужно явно инициализировать вызовом session_start()
Сделано так, скорее всего, по каким-то внутренним соображениям для удобства.
Так же, так как в большинстве случаев в получении всего содержимого суперглобальной переменной нет необходимости, а нужно лишь получить значение или проверить наличие определенного ключа, и зная что переменная всегда массив, удобно использовать конструкцию isset($_VAR[$key]); без дополнительных проверок самой переменной.

Асинхронная загрузка изображений без остановки ui wpf

Есть стэк, который биндится к списку изображений.

Как мне асинхронно подгружать в него изображения (Большой объем), чтобы ui не останавливался? Пробовал в коллекцию через асинхронный метод добавлять, но поток все равно останавливается. Во view добавлял объекту IsAsync, тоже не помогает.
private async void GenerateTop() { Screenshots = new ObservableCollection(); await Task.Run(() => { LastAdded.Add(...)... } }


Ответ

Вы должны разделить модель и представление.
Функции загрузки модели должны бежать в неосновном потоке, и там пусть загружают что угодно как угодно медленно. Представление (в случае, если вы используете MVVM, это ваша VM) получает от модели любым способом извещение о том, что данные загрузка произошла и есть новые данные для показа, и (в главном потоке!) обновляет VM-список изображений.
Таким образом ваш UI не будет подвисать, ваш код будет будет асинхронным, а волосы — мягкими и шелковистыми.

Если подвисает загрузка картинки, попробуйте и правда использовать IsAsync в привязке. Единственная тонкость — у вас сейчас IsAsync грузит асинхронно строку, а конверсия в картинку выполняется в UI-потоке. Попробуйте указать конвертер:
class ImageSourceLoadingConverter : IValueConverter { public object Convert(object value, Type targetType, object p, CultureInfo ci) => new BitmapImage(new Uri((string)value));
public object ConvertBack(object value, Type targetType, object p, CultureInfo ci) => throw new NotSupportedException(); }
в этом случае, кажется, конверсия будет производиться асинхронно.

SASS, задать высоту изображению, исходя из его ширины

Изображение должно занимать 100% ширины блока. Блок резиновый, до определённых моментов. Мне нужно, чтобы высота изображения была в 3,3 раза меньше, чем ширина. Как это задать в SASS?


Ответ

Вариант с img {position: absolute;}
.container { max-width: 400px; width: 100%; } .image { height: 0; padding-bottom: 30%; position: relative; width: 100%; } img { display: block; height: 100%; left: 0; object-fit: cover; position: absolute; top: 0; width: 100%; }


Или смотреть на jsfiddle
Вариант с инлайновым background-image
.container { max-width: 400px; width: 100%; } .image { background-position: 50% 50%; background-size: cover; height: 0; padding-bottom: 30%; position: relative; width: 100%; }

Или смотреть на jsfiddle

Влияние на производительность

Вопрос скорее для профи, на удовлетворение моей любопытности. Допустим у нас есть:

TEST

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ea maiores impedit magni animi quos fugit ex odit non tenetur, doloribus doloremque cum accusamus, nisi eius!


и допустим я хочу обратится через css к классу .url-con я это могу сделать разными способами: .url-con или .lvl-1 > .con > .url-con или .con > .url-con... и т.д. Зависит ли способ обращения к элементам на скорость обработки страницы?


Ответ

Зависит, но разница настолько ничтожна, что никто ее не заметит, даже на старом по нынешним меркам железе.
Браузер обрабатывает селекторы, начиная с конца. В случае с .url-con - он найдет все ноды с таким классом, и применит к ним стили.
В случае с .con > .url-con браузер точно так же, как в первом случае, найдет все ноды с классом .url-con, а потом среди них оставит только те, у которых есть предок с классом .con. И применит к ним стили.
В случае с .lvl-1 > .con > .url-con
Найдет все ноды с классом .url-con Из них оставит только ноды с предком с классом .con Из них оставит только ноды с предком с классом .lvl-1 И применит к ним стили.

Плавное появление элемента из display:none в inline

Интересует такая штука – как заставить блок расширяться плавно при наведении, то есть иконка становится видимой по мере того, как в течение анимации до конца выезжает кнопка справа?
body { font-family: "Roboto"; font-weight: 100px; } .cat-block { position: relative; display: inline-block; } .cat-block .category { background-color: rgba(255, 255, 255, 0); padding: 3px 8px 3px 8px; box-shadow: 0px 0px 35px 0px rgba(1, 2, 4, 0.25); float: left; -webkit-transition: .2s ease-out; -o-transition: .2s ease-out; -moz-transition: .2s ease-out; transition: .2s ease-out; margin: 0; z-index: 3; } .cat-block .category img { width: 13px; padding-right: 5px; display: none; } .cat-block .category:hover img { display: inline; } .cat-block .category a { font-size: 16px; font-weight: 300; color: #3b3b3b; text-align: right; text-decoration: none; } .cat-block .category:hover { box-shadow: 0px 0px 21px 0px rgba(1, 2, 4, 0.25); background-color: rgba(255, 255, 255, 1); } .cat-block .category:active { background-color: rgba(255, 255, 255, 1); } .cat-block .category:nth-of-type(1) { border-radius: 10px 0 0 10px; padding-left: 14px; } .cat-block .category:nth-of-type(4) { border-radius: 0 10px 10px 0; padding-right: 14px; }



Ответ

@andrey-fedorov прав, сделать плавность с помощью css/display:none невозможно, это можно сделать при помощи jQuery например. А вот если изменять ширину от 0 до заданной, то с помощью css это сделать можно вот так:
body { font-family: "Roboto"; font-weight: 100px; } .cat-block { position: relative; display: inline-block; } .cat-block .category { background-color: rgba(255, 255, 255, 0); padding: 3px 8px 3px 8px; box-shadow: 0px 0px 35px 0px rgba(1, 2, 4, 0.25); float: left; -webkit-transition: .2s ease-out; -o-transition: .2s ease-out; -moz-transition: .2s ease-out; transition: .2s ease-out; margin: 0; z-index: 3; } .cat-block .category img { width: 0; padding-right: 5px; transition: .3s; } .cat-block .category:hover img { width:13px } .cat-block .category a { font-size: 16px; font-weight: 300; color: #3b3b3b; text-align: right; text-decoration: none; } .cat-block .category:hover { box-shadow: 0px 0px 21px 0px rgba(1, 2, 4, 0.25); background-color: rgba(255, 255, 255, 1); } .cat-block .category:active { background-color: rgba(255, 255, 255, 1); } .cat-block .category:nth-of-type(1) { border-radius: 10px 0 0 10px; padding-left: 14px; } .cat-block .category:nth-of-type(4) { border-radius: 0 10px 10px 0; padding-right: 14px; }


Перенос строки в .properties файле

Вот у меня типичный формат properties файла: name=value а что если у меня value довольно длинное я хочу использовать перенос строки? Это возможно?
Как-то так:
name=val ue
Может какие специальные символы есть для того чтобы сказать что ue это не новый ключ, а продолжение значения?


Ответ

Да вы можете это сделать, экранируя обратным слешем:
name=val\ ue
Источник: http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html

Как задать значение для переменной типа string от пользователя

Как в C# можно задать значение для string, что бы пользователь при работе с программой ввел к примеру свое имя в эту переменную. В С++ у меня получалось так.
string name; getline(std::cin, name); cout << name;
В С# все иначе как я понимаю. Пробовал вот так:
string name; name = Convert.ToString(Console.ReadLine()); Console.Write(name);
и так
string name; Console.ReadLine(name); Console.Write(name);
Ничего не получается. На MSDN примеры все указаны с учетом того, что я заранее уже что то записал в строку. Как тогда в С# работать с словами? Мне элементарно надо в программе, что бы пользователь ввел свое имя по запросу и потом уже вывести приветствие и имя.


Ответ

Функция ReadLine считывает строку с консоли и возвращает ее пользователю функции.
Поэтому достаточно написать, например,
string name; name = Console.ReadLine(); Console.WriteLine( name );

Как узнать IP адрес устройства?

Сервер, на который я отправляю запрос определяет мой IP, а как получить этот IP программно, чтобы потом сравнить?


Ответ

WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE); String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
И добавьте разрешения в манифест:

Ссылка

Как защитить файл от фиксации изменений?

Я работаю с системой GIT, и заметил, что использую некий паттерн, который хотел бы немного оптимизировать чтобы избежать ошибок в дальнейшем. Например у меня имеется некоторый файл настроек Settings.h, который мне требуется изменить на некоторый период моей работы. После окончания работы я хочу откатить изменения в этом файле, и я хочу найти способ, чтобы предотвратить себя от случайной фиксации изменений в этом файле (может конечно звучит немного странно, я понимаю что перед фиксацией изменений нужно постоянно следить за тем, что коммитишь, просто интересно может есть какой нибудь способ облегчить немного этот способ)


Ответ

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

Как подключить In-app Billing для своего приложения?

Как добавить покупки в приложение? Как это вообще будет осуществляться? Нужен ли собственный бэкэнд? Есть ли хорошие гайды на русском? Какие библиотеки для покупок вы бы могли посоветовать?
Если кто-нибудь может, необходимо расписать пошагово внедрение покупок в приложении. Заранее спасибо!
(Просто за 2 недели необходимо правильно внедрить покупки)


Ответ

Лучшей, таковой либой по in-app-billing, я считаю (IMHO, конечно) либу android-inapp-billing-v3 в написании коей я принимал скромное участие :)
Как использовать - в README проекта все расписано.

git не видит изменений в ветке

git не видит изменений в ветке, после git push origin remote_branch и сравнением с master не показывает изменений, хотя было сделано множество изменений в файле но сравнивая с мастером не выводит никаких различий.
Есть подозренее что эти изменения уже были закомичены на этой ветке и удалены, а теперь git не видит этого коммита и соответвенно его изменений.
Вот такая картина:
git checkout -b new_branch
git commit -m "some commits"
git push origin new_branch
git checkout -b my_new_branch_2
git pull origin new_branch
На этом моменте я получаю все коммиты которые были в ветке new_branch и удаляю некоторые изменения в файлах test.txt
git push origin my_new_branch_2
git checkout master git merge my_new_branch_2
Тут я смержился с мастером.
Теперь когда пытаемся сделать мерж с матером с ветки new_branch с которой я ранее сделал pull то говорит что нет изменений в файле test.txt


Ответ

Что такое "ветка"
Это просто указатель на какой-то коммит. Все коммиты организованы в граф, в котором у каждого коммита (кроме первого) есть предок. Так за один коммит можно вытащить целую цепочку — до самого первого. Все коммиты, которые вот так вытаскиваются, называют «коммитами в ветке X» или «принадлежащими ветке X».
Предположим, было так:
A - B - C master \ D new_branch
Что делает git checkout -b
Эта команда создаёт новую ветку, указывающую на тот же коммит, на который указывает текущая ветка:
git checkout -b my_new_branch_2
A - B - C master \ D new_branch, my_new_branch_2
То есть после выполнения этой команды ветки new_branch и my_new_branch_2 идентичны.
Что делает git pull origin имяветки
Команда git pull производит мерж ветки из удаленного репозитория в текущую ветку. Если замержить коммит, который уже принадлежит текущей ветке (т.е. доступен по цепочке предков), то слияние не произведёт изменений.
Если никто кроме вас не пушит в ветку new_branch, то она указывает на тот же коммит D, что и ветка my_new_branch_2, так что эта команда ничего не делает:
git pull origin new_branch
Мерж предка
Если после этого сделать ещё коммиты в my_new_branch_2, но не менять new_branch, то вторая фактически будет «частью» первой. Ветка new_branch указывает на коммит D, который является предком E, а следовательно принадлежит ветке my_new_branch_2
A - B - C master \ D new_branch \ E my_new_branch_2
Когда вы мержите my_new_branch_2 в master, в составе этой ветки приходят и коммиты ветки new_branch. Мерж скорее всего у вас происходит по модели "fast-forward" – когда указатель master просто перемещается вперёд на указатель my_new_branch_2
A - B - C - D new_branch \ E my_new_branch_2, master
Поэтому попытка повторно замержить new_branch в master не приносит результата.

Как посчитать количество цифр в содержимом текстового файла?

static void Main(string[] args) { string s = ""; //объявляем строковую переменную, в которую будет считываться весь текст из файла string[] textMass; //объявляем массив строк textMass, который будет считывать каждую цифру из строки s StreamReader sr = new StreamReader("1234.txt"); //чтение файлов if (sr.EndOfStream != true) //цикл { s = sr.ReadToEnd(); } textMass = s.Split(' '); Console.WriteLine("Количество цифр:"); Console.WriteLine(textMass.LongLength); sr.Close(); Console.ReadLine(); }
Нужно считать содержимое текстового файла и подсчитать число цифр в нем. Как это сделать?


Ответ

Вы можете использовать регулярные выражения:
static void Main(string[] args) { string s = "";//объявляем строковую переменную, в которую будет считываться весь текст из файла StreamReader sr = new StreamReader("1234.txt");//чтение файлов if (sr.EndOfStream != true)// цикл { s = sr.ReadToEnd(); } // "\D" - символы не цифры заменяем на "" string digits = Regex.Replace(s, @"\D", ""); Console.WriteLine("Количество цифр:"); Console.WriteLine(digits.Length); sr.Close(); Console.ReadLine(); }
Или воспользоваться методом IsDigit
char[] digits = s.Where(char.IsDigit).ToArray(); Console.WriteLine(digits.Length);
https://stackoverflow.com/a/2634761/7099599

Как определить, из какой формы была открыта текущая?

Из одной формы запускается другая при помощи подобного кода (по сути, стандартного):
private void Show_Click(object sender, EventArgs e) { Child form1 = new Child(); form1.ShowDialog(); }
Как узнать тип той формы, которая запустила Child? На основе этого должно определяться содержимое формы Child


Ответ

Ну раз @VladD считает не зазорным ответ с "отлупом" :)
Старайтесь придерживаться одно-направленного потока информации: форма/класс, которая создает Child знает про Child, а Child не знает про форму/класс, которая его создает.
(Что будет, если Child создается в методе класса, который не является формой? Подумаем.)
Подавайте в конструктор класса Child, или устанавливайте как его свойство, индикатор поведения Child

.c_str() возвращает какой-то бред

День добрый! На C++ считываю данные из файла. В конце имею string, которую мне надо представить в виде const char*, для чего использую .c_str(). Но возвращает он какой-то бред (не только с кириллицей проблемы, а вообще с любым текстом). Файл сохранены в кодировке ANSI. Как можно решить проблему? Код чтения:
ifstream ifs(path); if (ifs.is_open()) { string s; s.assign((istreambuf_iterator(ifs.rdbuf())), istreambuf_iterator()); cout << s; ifs.close(); return s.c_str(); } else return "";


Ответ

Ну, начнем с того, что вы возвращаете указатель локального объекта, который после вашего return уничтожается, и указатель указывает... куда?
Дальше не пояснять?

Объявление и определение функции (порядок размещения)

В каждой единице трансляции, объявление функции обязано предшествовать её вызову. Если это условие выполняется, то порядок размещения определения уже не имеет особого значения.
Какой вариант предпочтительней и почему? (сначала функция объявлена, а затем определена или наоборот)
void someFunction(); // declaration void someFunction() { cout << "hello" << endl; }
int main() { someFunction(); // function call return 0; }
или
void someFunction() { cout << "hello" << endl; } void someFunction(); // declaration
int main() { someFunction(); // function call return 0; }


Ответ

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

Хотелось бы узнать причину именно такого порядка размещения. Что это? удобство восприятия программы, отдельное положение стандарта языка, код в этом случае быстрее компилируется или есть ещё какая-то причина?
Причина та же самая, по которой вообще в язык добавлена возможность объявлять функции без их определения.
Представьте что возможности объявить (без определения!) функции нет. И вам надо написать две функции, вызывающие друг друга:
void SomeFirstFunction(int n) { cout << n << endl; SomeSecondFunction(n); }
void SomeSecondFunction(int n) { if (n > 0) { SomeFirstFunction(n - 1); } }
int main() { SomeFirstFunction(5); }
Компилятор разбирает файл сверху вниз. Он доходит до строки
SomeSecondFunction(n);
В этот момент он понятия не имеет, что это за SomeSecondFunction и какие параметры она принимает - она ведь еще не определена. И он падает с ошибкой:
In function 'void SomeFirstFunction(int)': error: 'SomeSecondFunction' was not declared in this scope
Перестановка местами SomeSecondFunction и SomeFirstFunction, очевидно, не поможет.
Поэтому в язык добавлен хак - вы можете сказать компилятору "SomeSecondFunction - это функция вот с такими параметрами, и она будет определена где-то ниже. Или даже не ниже, а вообще в другом файле - вобщем, смело считай это функцией, генерируй код для ее вызова, потом линковщик разберется где эта функция на самом деле лежит".
// предупредили компилятор void SomeSecondFunction(int n);
void SomeFirstFunction(int n) { cout << n << endl; // компилятор спокойно сгенерировал вызов еще не определенной (но объявленной!) функции SomeSecondFunction(n); }
void SomeSecondFunction(int n) { if (n > 0) { SomeFirstFunction(n - 1); } }
При этом нет никакого смысла в объявлении SomeFirstFunction после ее определения - компилятор и так знает что это за функция, ему от еще одного объявления уже известного факта лучше не станет.

А вот в примерах из вашего вопроса объявление полностью избыточно. Т.е. ни один из этих вариантов не предпочтительней - они оба бессмысленны, т.к. эквивалентны варианту вообще без declaration:
void someFunction() { cout << "hello" << endl; }
int main() { someFunction(); // function call return 0; }

Функции GitHub : Issues, Projects, Pull Requests

Здравствуйте! Помогите, пожалуйста, разобраться с такими функциями GitHub как Issues, Projects, Pull Requests. Для чего они нужны и как правильно с ними работать. У меня есть репозиторий, в котором 2 текстовых файла. И к этому репозиторию надо применить эти функции. Заранее, огромное спасибо!


Ответ

Issues — это система учёта ошибок, по-английски bugtracker
Конечно, она не такая навороченная, как, к примеру Jira. Однако разработчики Github-а считают эту простоту преимуществом благодаря гибкости и отсутствию визуального мусора.
Так как у Github Issues отсутствуют такие важные поля, как «Категория», «Серъёзность», «Статус» и «Компонент», их приходится заменять проставлением различных меток. Вот как это предлагает делать некто Zach Dunn:

Интересной особенность GitHub является то, что нумерация сообщений в Issue Tracker-e является общей с Pull Requests, хотя эти два понятия не пересекаются и находятся в разных категориях.
Более подробно о Github Issues можно прочитать в официальной справке Projects — это хранилище заметок. Больше о нём и сказать нечего, кроме упоминания возможности упорядочивать заметки по столбцам (категориям) и строкам. Вот, собственно, и всё. Можете хоть хранить напоминания, хоть организовать доску для канбана
Pull Requests — это заявка на принятие ваших изменений в центральный репозиторий. Является неотъемлемой частью Github Flow

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

Как положить лямбду в List

Есть список задач List.
Не могу разобраться как правильно положить в него лямбду. Таким образом как у меня сейчас отрабатывает неправильно и на консоль выводится только "one";
Почему вторая таска не отрабатывает?
static void Main() { var tasks = new List(); tasks.Add(TestMethod("one")); tasks.Add(new Task(async () => await TestMethod("two"))); Task.WhenAll(tasks);
Console.ReadKey(); }
private static async Task TestMethod(string msg) { Console.WriteLine(msg); }


Ответ

Все верно. Вы же её создали, но не запустили. Чтобы вторая отработала - запускайте ее с помощью Task.Run()
tasks.Add(Task.Run(async () => await TestMethod("two")));
Тестить!

Помогите советом, как с html и css сделать такие блоки?

Все выполняю с помощью bootstrap. Нужно выполнить блоки в точности как на прилагаемом изображении. Самые главные моменты:
чтобы изображение залезало на рамку чтобы при наведении на блок, внизу появлялась полоса красная.Причем это полоса должна быть НЕ со скошенными краями, как если бы мы просто изменяли цвет нижнего бордера на красный. и чтобы все было адаптивно и не сыпалось при изменении размера экрана.
Возможно есть какой-то простой способ реализации этой штуки. У меня пока все с жуткими костылями, и сыпется верстка. Испробовал уже самые разные вариации


Ответ

section { box-sizing: content-box; height: 64px; border-bottom: 3px solid transparent; margin: 1em 0; } img { height: 100%; float: left; } div { box-sizing: border-box; height: 100%; overflow: hidden; padding: .5em; border: 3px solid silver; border-left: none; } section:hover { border-color: red; }

Тут какое-то описание
Тут какое-то описание
Тут какое-то описание

WPF, DataGrid. Растягивание колонок при появлении свободного места

В окне есть DataGrid, при нехватке места для отображения данных появляется скрол, но если места становится больше чем необходимо появляется пустой столбец. Необходимо сделать так, чтобы при нехватке места появлялся скрол, но при появлении свободного места столбцы равномерно растягивались на всю доступную таблице ширину. Текущий код таблицы:

Вид при нехватке места:
Вид при избытке места:


Ответ

Установите свойство ColumnWidth в *. Это приведет к равномерному растягиванию всех столбцов таблицы. Также в сочетании с этим свойством можете установить каким-то столбцам свою ширину.

столбцы 2 и 3 поделят между собой всю свободную ширину, тем самым не будет видно "пустого столбца".
UDP: Если таблица имеет фиксированную ширину то, для появления горизонтального скрола, можно сделать так:

Как правильно задать тег meta og:image?

Подскажите как правильно прописать свойства на тег: У меня лого 1200*1200, а в facebook 1200x630
style="max-width:auto; height:50% ;">
Правильно ли я прописал? мне нужно чтоб картинка 1200 на 1200 разместилась на 1200x630


Ответ

Любые css для meta неприменимы в принципе, как и для других элементов внутри head. Подготовьте превью для соц.сетей программно.

Проблемы с кодировкой на ideone

Как известно, ideone компилирует исходники на Си++ в utf8. Однако, мне нужна строка в utf16 (wstring). Попытался сконвертировать, но получилось что-то не то (причём конвертация из wstring в utf8 работает верно):
wstring_convert < codecvt_utf8_utf16 , wchar_t> convert;
const char *s = "еёЁжикЕст"; wstring str = convert.from_bytes(s);
for (int q=0; s[q]; ++q) cout << (int)s[q] << ' '; cout << endl; for (int q=0; q
-48 -75 -47 -111 -48 -127 -48 -74 -48 -72 -48 -70 -48 -107 -47 -127 -47 -126 13572 20740 260 13828 14340 14852 5380 16644 16900
но должно было получиться
1077 1105 1025 1078 1080 1082 1045 1089 1090
Вот проверка:
var s = decodeURIComponent( "-48 -75 -47 -111 -48 -127 -48 -74 -48 -72 -48 -70 -48 -107 -47 -127 -47 -126" .split(" ").map(x => "%" + (x & 255).toString(16)).join("") ) console.log(s) console.log(s.split("").map(ch => ch.charCodeAt(0)).join(" "))
К тому же, если сделать
wchar_t bin[] = {1077, 1105, 1025, 1078, 1080, 1082, 1045, 1089, 1090, 0}; str = bin; cout << convert.to_bytes(str.c_str()) << endl;
то вывод верный.
Код полностью: http://ideone.com/ut7Nsg


Ответ

Однако, мне нужна строка в utf16 (wstring).
Это неверно, кодировка std::wstring в стандарте не указана, на Windwows/MSVC sizeof(wchar_t) 2, и там кодировка utf-16, на Linux/gcc sizeof(wchar_t) 4 и кодировка utf-32, ideone использует gcc, отсюда очевидные проблемы, переносимый способ получить код в utf-16 (c++11):
#include #include #include #include
int main() { std::wstring_convert < std::codecvt_utf8_utf16, char16_t> convert;
const char *s = "еёЁжикЕст"; std::cout << "Input: " << s << "
"; std::u16string str = convert.from_bytes(s); for (int q=0; s[q]; ++q) std::cout << (int)s[q] << ' '; std::cout << '
'; for (int q=0; q'; }

Как получить иконку папки?

Как получить иконку папки?
Например
Control Panel
Shell:::{5399E694-6CE5-4D6C-8FCE-1D8870FDCBA0}


Ответ

Проще всего использовать Windows API Code Pack, чтобы не возиться с interop'ом и COM-объектами. Если у вас Visual Studio версии до 2017, вам нужно будет вручную подключить nuget-пакет Windows API Code Pack - Shell. (2017-ая студия найдёт и предложит подключить пакет сама, увидев незнакомый тип.)
Подключив пакет, мы сможем работать с типами ShellObject или ShellFolder. Для того, чтобы получить сам каталог, нам нужно написать, например,
(ShellFolder)ShellObject.FromParsingName("shell:::{4234d49b-0245-4df3-b780-3893943456e1}");
ShellFolder является списком своих подобъектов, поэтому перечислить подобъекты можно просто так:
var sf = (ShellFolder)ShellObject.FromParsingName( "shell:::{4234d49b-0245-4df3-b780-3893943456e1}"); Console.WriteLine(sf.Name); foreach (var item in sf) { Console.WriteLine(item.Name); ShellThumbnail t = item.Thumbnail; }
Иконка подкаталога содержится в объекте ShellThumbnail. Сам объект содержит иконки в различных форматах (icon, WPF System.Windows.Media.Imaging.BitmapSource и WinForms System.Drawing.Bitmap) и различных размерах. Для отображения нам понадобится графическое приложение. Я воспользуюсь более простым WPF.
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = ShellObject.FromParsingName( "shell:::{4234d49b-0245-4df3-b780-3893943456e1}"); } }


Результат:

Атрибут __next__ не переопределяется

У меня есть класс в котором я переопределяю метод __next __ после его первого вызова, но проблема в том что работать продолжает старый __next __.
class I: def __init__(self, head): self.head = iter(head)
def __iter__(self): return self
def __next__(self): self.__next__ = self.head.__next__ return 'a'
i = I((1, 2, 3)) i_it = iter(i) print(next(i_it)) #выводит 'a'. Все ок print(next(i_it)) #снова 'a'. Почему не 1? print(i_it.__next__) # вроде __next__ переопределен
P.S Если переопределять что-то другое то все работает:
def __next__(self): self.__next__ = self.head.__next__ self.x = 1 return 'a'
После вызова next(self) x будет 1. Ссылка на онлайн компилятор: https://repl.it/HVOC/17
P.P.S: В коментариях говорят что если вызывать i_it.__next __() то все будет работать так как надо, я это знаю, но штука в том что в любом итераторе(цикл for например) работает next(self), а не self.__next __().


Ответ

На сколько я понимаю, в cpython встроенная функция next() определяется тут: builtin_next(). Можно увидеть, что при вызове имеется следующая конструкция:
res = (*it->ob_type->tp_iternext)(it);
Полагаю, что она равносильна примерно такой конструкции на Python:
next(i) --> i.__class__.__next__(i)
что сходится с тем, что видно на практике.
Как дела происходят в других интерпретаторах мне не известно.

Несколько вопросов по ASP.MVC и AJAX

Я только разбираюсь в ASP.MVC и может быть задаю глупые вопросы. В данном случае вопросы будут не "как сделать", а "почему так происходит". Делаю проект, суть которого заключается в том, что он обходит сайт, собирает ссылки на его страницы и измеряет время отклика. Потом, собранную информацию выводит в табличном виде (пока). Проект состоит из двух страниц. На первой - в соответствующем инпуте водится поле и по нажатию кнопки идет переход на другой контроллер (ToolController), который производит замеры и выводит результаты.
Код метода первого контроллера (HomeController):
public ActionResult Submit(string Url) { if (CheckUrl(Url)) { ViewBag.Error = ""; return RedirectToAction("Index", "Tool", new { Url }); } else { ViewBag.Error = "Некорректный адрес!"; return RedirectToAction("Index"); }
}
Валидацию пока можно не смотреть, это буду отдельно разбираться.
Представление (фрагмент):
@using (Html.BeginForm("Submit", "Home", FormMethod.Post)) {

@Html.Label("Введите адрес сайта в поле ввода и нажмите кнопку")
@Html.TextBox("Url") @ViewBag.Error
}
Во ToolController есть поле private поле класса VMManager, методы которого реализуют бизнес-логику. В классе VMManager есть поле вью-модели (VM), потому что все дальнейшие действия будут крутиться вокруг один раз построенной VM (сохранение в БД - пока не реализовано). Представление выводит таблицу, состоящую из ссылок на страницы сайта (Ajax.ActionLink), по нажатию на которые должно подгружаться partialView с графическим представлением информации. До графического представления мне пока далеко, пока разобраться бы что в табличном происходит.
Фрагмент контроллера (ToolController):
private static VMManager manager = new VMManager();
public ToolController() { // manager = new VMManager(); } // GET: Tool public ActionResult Index(string url) { // manager = new VMManager(); manager.VM = (SiteVM)manager.GetVM(url);
return View(manager.VM); }
public ActionResult ShowPageResultInChart(string pattern) { if (pattern == "test") return null; Thread.Sleep(1000); return PartialView("ShowPageResultInChart"); }
Фрагмент представления:
@Html.Action("ShowPageResultInChart", new { pattern ="test" })


@foreach (var item in Model.PageResults) { @Ajax.ActionLink(item.PageAddress, "ShowPageResultInChart", new {pattern= item.PageAddress }, new AjaxOptions { UpdateTargetId = "ChartData", LoadingElementId = "LoadingIndicator" } )

@item.MinTime @item.AverageTime @item.MaxTime }
В частичном представлении пока смотреть нечего: строчка "Сработал Ajax" Теперь вопросы:
Если верить отладчику, то при первичной загрузке основной страницы запускается метод ShowPageResultInChart. Хотя он предполагался к запуску только при нажатии на Ajax.ActionLink. Почему, что я сделал не так? От этой беды я избавился условием в методе ShowPageResultInChart, но почему он срабатывает? Я правильно понимаю, что это противоречит смыслу Ajax? Разместить его ниже таблицы я не могу по условиям задания. Причем у меня сложилось впечатление, что запускается он как минимум 2 раза, но может я ошибаюсь. Судя по всему, у меня запускается несколько экземпляров второго контроллера. Это я понял по тому, что VM в процессе обнуляется и при нажатии на Ajax.ActionLink на входе метода ShowPageResultInChart VM = null. Такое впечатление, что первый экземпляр создается при выводе таблицы, второй - при нажатии на Ajax.ActionLink. От этой беды я избавился сделав поле менеджера статическим, но почему так происходит?


Ответ

1) ShowPageResultInChart вы вызываете не только с помощью @Ajax.ActionLink, а также с помощью @Html.Action, отсюда он и выполняется при загрузке страницы.
@Html.Action("ShowPageResultInChart", new { pattern ="test" })
2) При каждом запросе создается отдельный экземпляр класса Controller через ControllerFactory
Обратите внимание, что Html.Action Html Helper создаст другой экземпляр контроллера.
В общем, ControllerActivator.Create вызывается (для каждого запроса), чтобы создать контроллер (который создает новый контроллера или через DependencyResolver или через Activator, если не Resolver не был установлен):
public IController Create(RequestContext requestContext, Type controllerType) { try { return (IController) (_resolverThunk().GetService(controllerType) ? ? Activator.CreateInstance(controllerType)); }

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

//hashtable.h #pragma once #include #include #include using namespace std;
template class hashtable { private: map *table; public: hashtable(kType k, vType v); ~hashtable(); };

//hashtable.cpp #include "hashtable.h"
template hashtable::hashtable() { // ??? Compiler Error C2955 ('hashtable': use of class template requires template argument list) }
Could you tell me what is wrong there? Возможно ли вообще и если да, то как записать map в качестве поля класса? Так чтобы можно было написать hashtable и получался ассоциативный массив с ключем в виде char* и параметром int, но чтобы была возможность задать и другие типы?
по ТЗ, использовать map надо обязательно


Ответ

Ваша функция должна быть определена как
template hashtable::hashtable(kType k, vType v) ^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ чтобы соответствовало объявлению в классе

json.net Как сериализовать такой объект?

json.net обычно сериализует словарь в коллекцию:
{"a":{"b":{"c":"d"}}}
Вот так:
class A { public Dictionary a{get; set;} }
class C { public string c{get; set;} }
class Program { public static void Main(string[] args) { A a = new A(); a.a = new Dictionary(); C c = new C(); c.c = "d"; a.a.Add("b", c);
string json = JsonConvert.SerializeObject(a); Console.WriteLine(json);
Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } }
Но я хочу сериализовать словарь в массив:
{"a":["b":{"c":"d"}]}
Есть ли простой способ сделать это?


Ответ

Ответ на ваш вопрос "Есть ли простой способ сделать это?" - нет. Нет никаких легальных способов сделать это. Все потому что требуемый вами формат невалиден
Вы можете только это сделать вручную, но вопрос уже будет в другом - надо ли вам это? Ведь никакой JSON парсер не сможет распарсить невалидную JSON-строку...
P.S проверить валидность JSON-строки можно на https://jsonlint.com/

Использование вначале переменных при вызове программы

Не знаю переменные ли это или нет, но что это такое и как прочитать их в программе?
$ FOO=1 BAR=2 python3 ./make.py
Что за FOO и BAR?
P.S. Python


Ответ

$ FOO=1 BAR=2 python3 ./make.py
такой синтаксис используется в posix-совместимых оболочках для присвоения значений переменным окружения.
обратиться к переменным окружения внутри скрипта, написанного на python, можно с помощью os.environ
import os print os.environ['FOO'] print os.environ['BAR']

Помогите инициализировать TextView

Итак, есть layout, содержащий 2 объекта — RecycledView и TextView. RecyclerView работает через адаптер, который передаёт значение в TextView. Выглядит это так. Фрагмент, содержащий TextView
public class FragmentCharts extends Fragment {
//объявляем TextView TextView chartDetailsHeader;
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_charts, container, false);
RecyclerView rationsChart = (RecyclerView) view.findViewById(R.id.rations_chart); rationsChart.setHasFixedSize(true);
LinearLayoutManager rationsChartLayoutManager = new LinearLayoutManager( getContext(), LinearLayoutManager.HORIZONTAL, true); rationsChart.setLayoutManager(rationsChartLayoutManager);
ChartAdapter chartAdapter = new ChartAdapter(); rationsChart.setAdapter(chartAdapter);
//инициализируем TextView chartDetailsHeader = (TextView) view.findViewById(R.id.chart_details_heading); chartDetailsHeader.setTypeface(CommonSettings.getRobotoCondLight()); return view; }
//метод для изменения значения TextView public void setChartHeader(Date date) { SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM", Locale.US); String s = dateFormat.format(date); chartDetailsHeader.setText(s); } }
Изменение TextView происходит отправкой метода из адаптера:
new FragmentCharts().setChartHeader(archivesForCharts.get(0).get(0).getDate());
Как я понимаю, при создании new FragmentCharts() должна происходить инициализация TextView, но в методе setChartHeader() значение TextView почему-то null
Пытался инициализировать TextView повторно в setChartsHeader(), но где взять view для инициализации?
В общем, как обычно, нужна помощь.


Ответ

Ваш код new FragmentCharts().setChartHeader(archivesForCharts.get(0).get(0).getDate()); каждый раз создаёт новый фрагмент. Но так как он ни куда не аттачится и не отображается, соответственно у него не вызываются никакие методы жизненного цикла, в том числе и onCreateView, в котором вы инициализируете TextView. Поэтому он и null
Как решить? Не создавать новый объект фрагмента, а вызывать метод у существующего. То есть, например, добавить в конструктор адаптера параметр FragmentCharts fragment, и обращаться уже к нему. Во фрагменте у вас будет:
ChartAdapter chartAdapter = new ChartAdapter(this);
А в адапрере:
private FragmentCharts fragment;
public ChartAdapter(FragmentCharts fragment) { this.fragment = fragment; } ... fragment.setChartHeader(archivesForCharts.get(0).get(0).getDate()); ...

Где можно найти документацию по VK Streaming API?

С лета этого года ВКонтакте ужесточает лимиты на вызов методов newsfeed.search, wall.search и wall.get и предлагает использовать их новый Streaming API для интерактивного получения данных по этим методам, но нигде нет информации по использованию этого API. Кто знает где можно почитать документацию по Streaming API (в разделе для разработчиков у них пока ничего нет)?
Также интересуют данные по новым лимитам. Пока есть информация по количественному ограничению вызова метода newsfeed.search (до 100.000 запросов в сутки) с 07.06.2017. Кто-нибудь знает про другие ограничения?
Судя по новостям, разработчики VK планируют выпустить несколько версий Streaming API (основную и "расширенную"). Кто знает чем они будут отличаться (сейчас есть только информация, что "расширенная" версия будет выдавать "100% данных")?
Сама новость в Roadmap: https://vk.com/dev/data_limits


Ответ

Появилась документация по Streaming API:
https://vk.com/dev/streaming_api_docs
Но там реально жесть, в базовой версии максимальное количество запросов (правил), по которым поступают данные = 10 штук, в ответе выдается 1% от всей доступной информации (говоря русским языком не выдается практически ничего)).
Также сервер должен держать постоянное соединение через WebSockets, которое сервер может произвольно разорвать по прошествии определенного времени (в общем, это весьма неудобно).
Из текущего, с 21.06.2017 начинают действовать следующие ограничения по методам newsfeed.search, wall.search и wall.get:
метод newsfeed.search можно вызывать не более 25000 раз в сутки; метод wall.search можно вызывать не более 2500 раз в сутки; метод wall.get можно вызывать не более 500000 раз в сутки.
Из личной переписки с разработчиками стало ясно, что в итоге сильно урежут суточное количество запросов, будет гораздо ниже вышеуказанных. Пока не ясно, будут ли вводить review (ручную модерацию) приложений по типу instagram, но в свете "борьбы со злоупотреблениями обхода ограничений" мне это видится единственным реальным шагом со стороны разработчиков VK, чтобы эти "злоупотребления" прекратить.

Не могу разобраться ObservableCollection с ListBox

Проблема скорее всего в привязке. В ListBox не прибавляются элементы.

В чём состоит отличие между различными workflow? [дубликат]

На данный вопрос уже ответили: Правильное именование веток 3 ответа Слышал о существовании большого количества workflow (процессов разработки) — git flow, github flow, gitlab flow.
В чём их сущность и чем они отличаются? Ведь ветвление происходит во всех трёх случаях.


Ответ

Да, все workflow имеют много общего, поскольку предназначены для работы с одними и теми же инструментами (в данном случае с git-ом, распределённой системой контроля версий, обладающей возможностью лёгкого ветвления).
Однако у них имеются весьма существенные различия в том, как с этими ветками обращаться.
Git Flow
Есть две фиксированные ветви, «стабильный» master и «развивающийся» develop. При появлении необходимости внесения изменений в код происходит одно из двух:
от develop отпочковывается тематическая ветка, если это внесение функционала или подготовка к выпуску новой версии, либо ветка отпочковывается прямо от master, если это исправление ошибки.
После окончания работ тематическая ветвь вливается в её родителя, а в ряде случаев — и в master
GitHub Flow
То же, что и Git Flow, но фиксированная ветка всего одна — master; всё остальное принадлежит тематическим ветвям. Тематические ветви, в свою очередь, создаются в форках — клонированных копиях репозитория. То есть центральный репозиторий тематических веток не содержит. В том числе и после слияния, так как метки веток при этом снимаются и их головы становятся анонимными.
GitLab Flow
Как и в GitHub Flow, фиксированная ветка всего одна — master; всё остальное принадлежит тематическим ветвям. Однако, если в том случае релизы размещались в коммитах master-a, то здесь для каждого релиза создаётся своя, отдельная ветка. Причём никакого слияния этих веток с родителем не производится. Если ветка отпочковалась, значит она будет жить своей жизнью, получая исправления ошибок в виде отдельных коммитов (возможно, портированных из головы мастера с учётом накопившейся разницы в функционале между ветками).


Иллюстрации были взяты из статьи «잘 밤에 쓸데없는 생각하기...». В корейском я не смыслю, но картинки красивые.

найти количество уникальных чисел в массиве java

Напишите метод uniqueCount, который будет находить количество уникальных чисел в массиве. Если число повторяется больше одного раза, то его стоит учитывать, но только один раз. Длина массива > 0.
Пример:
Входящие данные {11, 12, 10, 5, 4, 44, 100, 44, 11, 10, 11} Ответ 7 Объяснение Массив без повторений будет выглядеть 4, 5, 10, 11, 12, 44, 100 - длина 7.
Помогите с решением задачи.
Мой вариант:
public static void main(String[] args) { int[] array = {11, 12, 10, 5, 4, 44, 100, 44, 11, 10, 11, 3}; System.out.println(uniqueCount(array)); }
static int uniqueCount(int[] array) { int result = 0; int countUnique = 0; int count = 0; for (int i = 0; i < array.length; i++) { countUnique++; for (int j = i + 1; j < array.length; j++) { if (array[j] == array[i]) { count++; } } } return result = countUnique - count; }
Но ответ на единицу меньше, чем должен быть. Не понимаю где ошибка моя. Наверное неправильно задаю j, откуда начинать сравнивать элементы.


Ответ

Ваш алгоритм не учитывает, что числа могут повторяться больше, чем два раза - 11 в Вашем случае.
for (int j = i+1; j < array.length; j++) { if (array[j] == array[i]) { count++; break; } }

Страница доступная по IP адресу сервера

Есть VPS с установленной на нём Plesk панелью (хотя панель, вероятно, значения не имеет). На сервере висит несколько сайтов, если перейти не по одному из доменов, а по IP-адресу сервера, то открывается по-умолчанию тот сайт, который был добавлен на сервер последним.
Как установить сайт/страницу открываемую по-умолчанию при переходе напрямую по IP-адресу сервера? Сервер Linux (Apache + Nginx)


Ответ

В общем-то ответ в случае с Plesk прост:
Необходимо зайти в "Инструменты и настройки" (Tools & Setting) Перейти в "IP-адреса" (вкладка "Инструменты и ресурсы") Открыть нужный IP-адрес Выбрать подписку по-умолчанию.
При попытке изменить конфигурацию Nginx сервер выдаст ошибку (так как в Plesk эта настройка уже существует).

Как узнать, применяется ли схемы оформления (Vcl.Styles)?

D 10.1 starter. Стандартное приложение. В опциях включены схемы оформления. Вопрос: Как программно узнать, применяется ли сейчас какая-то схема оформления или стиль оформления стандартный?
если схема применяется, то в файле проекта видим (например):
... TStyleManager.TrySetStyle('Amethyst Kamri'); * ...
если в опциях проекта схемы выбраны, но дефолтное оформление выбрано "Windows", то в проекте ничего (*) такого нет
Нужна функция примерно такая
Function IsAppThemed:boolean; begin Result := <..?..> end;


Ответ

Нашел:
function IsAppThemed: Boolean; begin Result := TStyleManager.Enabled and TStyleManager.IsCustomStyleActive; end;

не отправляется Notification

Есть сервис, по расписанию качает новости, после загрузки отправляет уведомление - Notification. В последнее время начал замечать что сервис отрабатывает, однако уведомление не отправляет. Повесил логи в аналитику, метод отправки сообщения вызывается - однако сообщение не доходит (Причем может через раз отправлять, может день не отправлять а потом день все нормально). Что может быть не так, код прилагается.
public void sendMessage(int countNews){ Resources resources = getResources(); Intent i = NewsListActivity.newIntent(this); PendingIntent pi = PendingIntent.getActivity(this, 1, i, 0);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setTicker(resources.getString(R.string.get_new_news)) .setSmallIcon(R.drawable.ic_notif_logo) .setLargeIcon(BitmapFactory.decodeResource(res, R.mipmap.ic_launcher)) .setNumber(countNews) .setContentTitle(resources.getString(R.string.get_new_news)) .setContentText(resources.getQuantityString(R.plurals.news_plurals, countNews, countNews)) .setContentIntent(pi) .setAutoCancel(true);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(1, mBuilder.build()); }
Не может это быть из-за того что PendingIntent у Notification по requestCode совпадает с PendingIntent сервиса - последний для периодического запуска через AlarmManager
чтобы не пересекались ID у PendingIntent исправил код:
public void sendMessage(int countNews){ Resources resources = getResources(); Intent i = NewsListActivity.newIntent(this); PendingIntent pi = PendingIntent.getActivity(this, NOTIFICATION_INTENT_ID, i, PendingIntent.FLAG_CANCEL_CURRENT);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setTicker(resources.getString(R.string.get_new_news)) .setSmallIcon(R.drawable.ic_notif_logo) .setLargeIcon(BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher)) .setNumber(countNews) .setContentTitle(resources.getString(R.string.get_new_news)) .setContentText(resources.getQuantityString(R.plurals.news_plurals, countNews, countNews)) .setContentIntent(pi) .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) .setAutoCancel(true);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(NOTIFICATION_ID, mBuilder.build()); }
сутки сообщения отправлялись отлично, все работало, ночью новости скачались - сообщения нет, днем еще подгрузились - опять сообщение не пришло. Как будто аппарат очень крепко "уснул" и не принимает уведомления... Причем на втором аппарате с Android 5.1 уведомления приходят - на Android 6.0 вышеописанная картина.


Ответ

С 6 андроида из-за Doze для точных уведомлений следует использовать методы:
If you need to set alarms that fire while in Doze, use setAndAllowWhileIdle() or setExactAndAllowWhileIdle(). https://developer.android.com/training/monitoring-device-state/doze-standby.html

Странности при работе с двумерным массивом в си

#include "stdio.h"
int main(void) { int a[3][2] = {{10,2}, {2,3}, {3,4}}; printf("%p
", a[0]); printf("%p
", (int *)a); printf("%p
", *a); printf("%p
", a); printf("%p
", &(a[0][0])); return 0; }
Код выдает одно и то же число... Особенно поражает то, что равны a и *a. Что происходит? И еще когда смотрю на *(int *)a, то получаю 10...


Ответ

Вас не должно удивлять равенство a и *a в данном контексте. Нечего удивительного в этом нет. В языке С "двумерный массив" - это просто обычный одномерный массив, элементами которого тоже являются одномерные массивы.
Одномерный массив, скажем, double d[10] - это просто плоский непрерывный компактный блок памяти, размера 10 * sizeof(double), состоящий из десяти плотно лежащих друг за другом элементов типа double. При этом адрес всего массива &d численно совпадает с адресом его нулевого элемента &d[0], ибо "начинаются" они в одной и той же точке памяти. Ситуация полностью аналогична равенству указателей вот в таком вот примере
struct S { int a; } s;
printf("%p %p
", (void *) &s, (void *) &s.a); // Оба указателя совпадают численно
Адрес всего объекта struct-типа численно совпадает с адресом самого первого поля внутри этого объекта. Совершенно аналогичным образом адрес всего массива численно совпадает с адресом самого первого (нулевого) элемента этого массива.
При этом в языке С выражение d типа "массив double [10]" в большинстве контекстов (не во всех) неявно приводится к типу double * - указателю, указывающему на нулевой элемент массива. Т.е. в большинстве контекстов выражение d ведет себя эквивалентно выражению &d[0], т.е. массив внешне ведет себя как указатель. Это явление называют array type decay. (Именно по этой причине массивы в С часто путают с указателями, хотя на самом деле это разные типы и никаких указателей в массивах нет.)
Все это немедленно применимо и к двумерным массивам (и многомерным массивам), ибо, как сказано выше, в языке С "двумерный массив" - это рекурсивная по своему устройству структура: это просто одномерный массив, элементами которого являются одномерные массивы. Вышеупомянутое явление array type decay работает неизменным образом на любом уровне этой рекурсии.
Выше выражение a изначально имеет тип int [3][2], но в данном контексте неявно приводится к типу "указатель на нулевой элемент массива a". Этот указатель имеет тип int (*)[2] и указывает на подмассив a[0] типа int [2] в составе a
Выражение *a изначально имеет тип int [2] - это подмассив a[0] в составе a, но в данном контексте *a неявно приводится к типу "указатель на нулевой элемент массива a[0]". Это указатель типа int *, который указывает на самый первый int в составе подмассива a[0], т.е. на a[0][0]
И сам a, и a[0], и a[0][0] начинаются в одной и той же точке памяти, по каковой причине числовые представления этих указателей совпадают
printf("%p %p %p
", (void *) &a, (void *) a, (void *) *a); // Все три указателя совпадают численно

Как обратиться к переменной с id в имени? JS

Здравствуйте, есть такой код:
var colors1234 = { qwe: qweq }, colors1212 = { qwe: qweq };
console.log(colors/*id*/);
Можно ли как-то обратится к такой переменной, если id динамическое?


Ответ

За счёт того, что ваша переменная лежит в глобальной области видимости, можно использовать скобочную нотацию -
var colors1234 = { qwe: 'qweq1234' }, colors1212 = { qwe: 'qweq1212' }; const id = 1234; console.log(window[`colors${id}`]);
Но лучше вместо пачки переменных формата имя+id сделать такой объект -
имя{ id1: ...value... id2: ...value... }

Добавить хеш git в исходный код

Как заставить Visual Studio автоматом при сборке присваивать макросу GIT_HASH значение хеша git, без использования дополнительных утилит/установки поддержки дополнительных языков. Чтобы на чистой машине, с установленным Visual Studio и git можно было собрать такой код:
std::cout << "git hash: " << GIT_HASH << std::endl;


Ответ

Используйте Pre-Build Event, в нем выполняйте echo и git rev-parse:
echo | set /p _=#define GIT_HASH > rev.h git rev-parse --short=12 HEAD >> rev.h
В свойствах проекта можно задать сразу несколько команд отдельными строчками. Конструкция echo | set /p _= позволяет убрать перевод строки.
Пример использования rev.h :
#include "rev.h" #define STRINGIFY_(x) #x #define STRINGIFY(x) STRINGIFY_(x) #define GIT_HASH_STR STRINGIFY(GIT_HASH)
int main() { std::cout << GIT_HASH_STR << '
'; }

Можно ли в Delphi, вызвать функцию по имени, которое хранится в строке?

Есть строка, которая может принимать разные значения,
можно ли вызвать функцию, имя которой, равно значению строки,
а если, допустим, такой функции нет, то ничего не произойдет
Что бы не использовать много раз if str = 'myfunc' then myfunc(a);


Ответ

как следует из комментариев, от того, что у вас используется классовая функция, ничего особо не меняется (при использовании RTTI для решения задачи)
type TTest = class(TObject) public class function myFunc(x : integer): integer; end;
class function TTest.myFunc(x: integer): integer; begin result := x*100; end;
метод TRttiMethod.invoke() имеет несколько перегруженных вараинтов, и может принимать как экземпляр класса так и мета-класс (class of ..).
function invokeClassFunction(cls: TClass; funcName: string; args: array of TValue): TValue; var ctx: TRttiContext; t: TRttiType; m: TRttiMethod; begin ctx := TRttiContext.Create(); try t := ctx.GetType(cls); m := t.GetMethod(funcName); if (m = nil) then raise Exception.Create('Method not found');
result := m.Invoke(cls, args); finally ctx.Free(); end; end;
Поэтому при вызове вы просто указываете нужный класс:
var r : TValue;
try r := invokeClassFunction(TTest, 'myFunc', [1]); writeln('result: ', r.AsInteger); except on e: Exception do writeln('ничего не проиозошло'); end;

Снятие галочек с других checkbox-ов по условию

Есть три чекбокса. Нужно сделать так, чтобы если активен первый чекбокс, то убирались галочки со второго и третьего, а если второй или третий активный - убиралась галочка с первого.
Вот что у меня получилось:
$('.food_in_tour input:checkbox').change(function() { if ($('#eat_all').prop('checked')) { if ($('#not_meat').prop('checked') || $('#not_sugar').prop('checked')) { $('.food_in_tour input:checkbox:not(#eat_all)').prop('checked', false); } } else if ($('#not_meat').prop('checked') || $('#not_sugar').prop('checked')) { if ($('#eat_all').prop('checked')) { $('#eat_all').prop('checked', false); } } });


В чем ошибка, и как это можно реализовать?


Ответ

Нужно проверять какой checkbox был нажат, а не состояние checkbox-ов после нажатия. Если нажали на #eat_all, то убираем выделение с других checkbox-ов. Если нажали на какой-то другой - убираем с #eat_all Проверку можно делать, например, с помощью ID checkbox-a:
$('.food_in_tour :checkbox').change(function() { if (this.id == "eat_all") { $('.food_in_tour :checkbox:not(#eat_all)').prop("checked", false); } else { $("#eat_all").prop("checked", false); } });


Провайдинг зависимостей “перепрыгивая” через компонент

Имеется три пакета: a, b и c. Каждый из этих пакетов включает в себя интерфейс с буквой, реализацию интерфейса, компонент, модуль и Scope (не знаю, как правильно переводится). В результате, выходит вот такая структура проекта:
│ │ ├───a A.java │ AComponent.java │ AImpl.java │ AModule.java │ AScope.java │ ├───b B.java │ BComponent.java │ BImpl.java │ BModule.java │ BScope.java │ └───c C.java CComponent.java CImpl.java CModule.java CScope.java
Application.java
CComponent имеет зависимость (dependencies) на BComponent, а BComponent - на CComponent.
BModule требует класс A для создания класса B, а CModule требует классы A и B для создания класса C
@AScope @Component(modules = AModule.class) public interface AComponent { A a(); }
@Module public class AModule { @Provides @AScope public A provideA() { return new AImpl(); } }

@BScope @Component(modules = BModule.class, dependencies = AComponent.class) public interface BComponent { B b(); }
@Module public class BModule { @Provides @BScope public B provideB(A a) { return new BImpl(a); } }

@CScope @Component(modules = CModule.class, dependencies = BComponent.class) public interface CComponent { C c(); }
@Module public class CModule { @Provides @CScope public C provideC(A a, B b) { return new CImpl(b, a); } }

При попытке собрать проект, Dagger 2 начинает ругаться, что CComponent не может найти провайдера класса A
Error:(9, 7) java: com.dugin.rostislav.a.A cannot be provided without an @Provides-annotated method. com.dugin.rostislav.a.A is injected at com.dugin.rostislav.c.CModule.provideC(a, …) com.dugin.rostislav.c.C is provided at com.dugin.rostislav.c.CComponent.c()

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


Ответ

Проблема была в том, что компонент BComponent должен был явно указать компонентам, имеющим на него зависимости, какие реализации он может провайдить из нижестоящих компонентов. То есть он должен указать, что может дать класс A
@BScope @Component(modules = BModule.class, dependencies = AComponent.class) public interface BComponent { A a(); B b(); }
Для того, чтобы пробрасывать зависимости неявно — можно использовать Subcomponent

Очень хорошая статья на хабре про Component Dependencies и Subcomponents, где раскрывается данный вопрос - Dagger 2. Часть вторая. Custom scopes, Component dependencies, Subcomponents

Вызов диалога “Обзор папок”

Как вызвать точно такое же окно выбора папки?
Использовал эту функцию:
var chosenDirectory: string;
SelectDirectory('Выберите папку', '', chosenDirectory);
Как сюда добавить кнопку создания папки?


Ответ

Для Delphi 7 находится вот такое (не очень красивое) решение:
uses ShlObj, ActiveX;
//global variables var lg_StartFolder: String;
//functions //no need to declare these anywhere at the top of the unit function BrowseForFolderCallBack(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM): Integer stdcall; begin if uMsg = BFFM_INITIALIZED then SendMessage(Wnd,BFFM_SETSELECTION, 1, Integer(@lg_StartFolder[1])); result := 0; end;
function BrowseForFolder(const browseTitle: String; const initialFolder: String =''): String; var browse_info: TBrowseInfo; folder: array[0..MAX_PATH] of char; find_context: PItemIDList; begin FillChar(browse_info, SizeOf(browse_info), #0); lg_StartFolder := initialFolder; browse_info.pszDisplayName := @folder[0]; browse_info.lpszTitle := PChar(browseTitle); browse_info.ulFlags := BIF_RETURNONLYFSDIRS or BIF_EDITBOX or $40; browse_info.hwndOwner := Application.Handle;
if initialFolder <> '' then browse_info.lpfn := BrowseForFolderCallBack; find_context := SHBrowseForFolder(browse_info); if Assigned(find_context) then begin if SHGetPathFromIDList(find_context,folder) then result := folder else result := ''; GlobalFreePtr(find_context); end else result := ''; end;
Пример использования:
procedure TForm4.Button3Click(Sender: TObject); begin BrowseForFolder('Select Dir', 'C:\'); end;

C++ std::thread. Как обратить и завершить поток

Всем привет,
Как обратиться к потоку по id и попросить его "завершиться"?
Использую стандарт С++11 и библиотеку
Спасибо)


Ответ

Никак. std::thread такое не предусматривает.
Используйте atomic, [shared_]future::wait_for или другие примитивы чтобы просигнализировать коду внутри потока о том что он должен завершиться.