Страницы

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

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

Как спарсить String?

Есть String path = "/storage/emulated/0/Android"; Как убрать все что находится после последнего "/" ? Будь то "/Android" или что то иное...


Ответ

Используйте lastIndexOf:
if (null != str && path.length() > 0 ) { int endIndex = path.lastIndexOf("/"); if (endIndex != -1) { String newstr = path.substring(0, endIndex); // not forgot to put check if(endIndex != -1) } } Либо в кратце:
String whatyouaresearching = path.substring(0, path.lastIndexOf("/")); Либо можете использовать apache.commons.lang.StringUtils.substringBeforeLast(str, separator)
StringUtils.substringBeforeLast(path, "/")
Пример на ideone
Источник.

Зачем нужны функции setjmp longjmp?

Здравствуйте, Этот вопрос остается не освещенным в учебниках по программированию на языкe С. Было бы интересно знать, зачем и как применяют функции setjmp и longjmp. Если возможно то приведите, какой нибудь, пример их использования. Спасибо.


Ответ

Пример использования longjmp из моей реальной жизни. Делал достаточно объёмную утилиту для тестирования железяки, которую мы производим. Там, в частности, был тест памяти. Требовалось, что бы тестирование выполнялось до нажатия Ctrl/C, после чего выполнялся переход на следуюий этап тестирования. Делал так:
// Задаём реакцию на нажатие комбинации клавиш Сtrl/C signal(SIGINT, sig_sigint); . . . // Перед началом цикла запоминаем положение: if (setjmp(jmpbuffer) != 0) { // Длинный переход из обработчика сигнала завершения printf("

Получен сигнал завершения работы
"); goto end_loop; } // Сам цикл тестирования do { . . . } while (do_work !=0); end_loop:
Таких этапов тестирования было несколько. И после каждого нажатия Ctrl/C программа переходила к СЛЕДУЮЩЕМУ этапу. Попробуйте сделать такое на try/catch! :-) И не надо говорить про оператор goto! В данном контексте, с переходом вперёд, его использование абсолютно уместно.

java как узнать по дате день недели?

java как узнать по дате день недели? Пример: 29.11.2016 нужно получить 29.11.2016 = "Вторник";


Ответ

Calendar c = Calendar.getInstance(); c.setTime(yourDate); int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);

Как убрать символ новой строки (\n) при чтении строк из файла

При использовании file.readlines() получаем что-то вроде этого:
>>> file.readlines() ['12
', '10
', '9
', '15
', '10
', '120']
Как убрать
?


Ответ

>>> l = ['12
', '10
', '9
', '15
', '10
', '120'] >>> l = [line.rstrip() for line in l] >>> l ['12', '10', '9', '15', '10', '120']

Универсальный контейнер: одновременно вектор, стек и очередь

Подскажите как правильно реализовать на С++ контейнер, который одновременно может работать как вектор (список), LIFO-стек и FIFO-очередь, максимально используя фичи STL "из коробки" ?
Применение: хочу универсальный тип-контейнер, который может не только хранить вложенные структуры (пока справляется class Obj { string val; vector nested; }), но и уметь специфичные для каждого перечисленного контейнера фичи одновременно
vector: произвольное чтение/вставка/замена по индексу stack: push/pop queue: put/get


Ответ

deque - он же double-ended queue
Поддерживает все, что вы перечислили. Названия функций-членов немного не такие, но это, думаю, не принципиально :) push_back, push_front - вставка с любого конца, pop_back, pop_front - снятие.
Словом, смотрите более детальное описание

Дружественный шаблонный класс

Почему gcc выдаёт ошибку?
[Error] specialization of 'template class A' must appear at namespace scope
template class A { template friend class A; };


Ответ

В С++ нет возможности использования частичной специализации для того, чтобы "очертить" только какое-то подмножество специализаций шаблона в качестве друзей.
14.5.4 Friends 8 Friend declarations shall not declare partial specializations. [ Example:
template class A { }; class X { template friend class A; // error };
—end example ]
То есть другом может быть либо шаблон (со всеми его специализациями), либо конкретная специализация (т.е полная специализация) шаблона.

Enum. Как определить, что значение перечисления не определено?

Как определить, что значение перечисления не определено? К примеру ,результат = 3
public enum ResultCode { Success, Error }


Ответ

Для определения того, что значение перечисления входит в список констант с указанными значениями применяется метод IsDefined
public ResultCode PerformAction() { int result = ResultCodeFromDataSource();
if (!Enum.IsDefined(typeof(ResultCode), result)) { throw new InvalidOperationException("Дружище, выход за диапазон"); }
return (ResultCode) result; }
Справочная информация: enum (Справочник по C#)

Сколько раз встречается каждое слово в тексте

Задача :
В единственной строке записан текст. Для каждого слова из данного текста подсчитайте, сколько раз оно встречалось в этом тексте ранее. Словом считается последовательность непробельных символов идущих подряд, слова разделены одним или большим числом пробелов или символами конца строки.
Мой ход решения :
Считываем строку с клавиатуры, определяем сколько слов в строке, создаем массив типа String. Длина массива равна количеству слов в строке. В индексы массива сохраняем каждое слово. После сравниваем между собой все элементы и ведем счётчик.
Мой код :
import java.util.Scanner;
public class Semnadcat1 { public static void main(String[] args) { System.out.println("Введите текст"); Scanner in = new Scanner(System.in); String s = in.nextLine(); int a = s.split(" ").length; int i; String[] b = new String[a]; for (i = 0; i < a; i++) { for (String retval : s.split(" ")) { b[i] = retval; System.out.println(b[i]); } } } }
Ошибки:
Не удается поместить слова в элементы массива.


Ответ

Метод split возвращает массив String (слов в данном случае), поэтому нет необходимости вручную добавлять слова в массив. Для упрощения подсчета количества вхождений каждого слова можно хранить пары "слово - количество" в HashMap
public static void main(String[] args) { System.out.println("Введите текст"); Scanner in = new Scanner(System.in); String string = in.nextLine(); String[] words = string.split("\\s+"); HashMap wordToCount = new HashMap<>(); for (String word : words) { if (!wordToCount.containsKey(word)) { wordToCount.put(word, 0); } wordToCount.put(word, wordToCount.get(word) + 1); } for (String word : wordToCount.keySet()) { System.out.println(word + " " + wordToCount.get(word)); } }
Также split сделан по "одному или нескольким пробельным символам" с помощью регулярного выражения, что помогает избежать проблем с пустыми словами из-за идущих подряд пробелов.

Отписка от событий(слабые события)

Здравствуйте!
Подскажите пожалуйста равносильны ли будут по значению эти 2 события.
Событие 1: Создаем windows form, подписываемся с помощью делегата на событие о её закрытии: form.onClose += incomeCloseEvent; после закрытия будет вызвана функция incomeCloseEvent() в которой я обнуляю ссылку: form.onClose -= incomeCloseEvent;
Событие 2: Создаем windows form, подписываемся с помощью делегата на событие о ее закрытии: form.onClose += incomeCloseEvent; после закрытия формы в её деструкторе я обнулю ссылку: this.onClose = null;


Ответ

Во-первых, нет никакого смысла отписываться от событий уничтожаемого объекта.
Во-вторых, если под onClose вы понимаете стандартное событие - то присвоить ему null вы не сможете. А заводить свое событие - смысла мало.
В-третьих, начиная с .NET 4.5 появилось новое удобное средство для отслеживания однократных событий - задачи (точнее, они появились в 4.0, но удобными стали в 4.5).
Если форма предназначена для однократного показа, то можно сделать примерно так:
private readonly TaskCompletionSource tcsClosed = new TaskCompletionSource();
protected override void OnClosed(object sender, System.EventArgs e) { base.OnClosed(sender, e); tcsClosed.SetResult(true); }
public Task ShowAsync() => ShowAsync(CancellationToken.None);
public async Task ShowAsync(CancellationToken token) { if (tcsClosed.Task.IsCompleted) throw new InvalidOperationException("Форма уже была показана"); using (token.Register(Close, useSynchronizationContext: true)) { Show(); await tcsClosed.Task; } token.ThrowIfCancellationRequested(); }
Теперь в асинхронном методе можно показать форму и дождаться ее закрытия при помощи одного оператора await form.ShowAsync()
Если одну и ту же форму можно показывать несколько раз - надо перенести инициализацию поля tcsClosed в первую строчку метода ShowAsync, заменив условный оператор.
Никаких событий и отписки от них!

По теме же вопроса - очевидно, вариант -= incomeCloseEvent отписывает один обработчик, а вариант = null отписывает все обработчики.
Если гарантируется, что обработчик будет только один - эти два варианта эквивалентны. Но тогда и подписку лучше делать тоже через оператор присваивания: form.onClose = incomeCloseEvent, чтобы никому не пришло в голову что обработчиков может быть несколько.

Перегрузка оператора < в c#

У меня есть такой код:
public class Foo { public static bool operator<(Foo l, Foo f) { Console.WriteLine("Foo!"); return false; } //public static bool operator>(Foo l, Foo f) //{ // return f < l; //} }
Я удивился, что в c# он не компилируется (сам пришел в с# после изучения с++). Соответсвенно возник вопрос, почему компилятор требует "парную" реализацию операторов <, >. Например в с++ такой код будет работать. Не могу понять причины такого дизайна в с#.


Ответ

Потому что C#, в отличие от плюсов, заточен не на максимальную эффективность, а на максимальную предсказуемость.
Он сам реализует операторы комбинированного присваивания, гарантируя, что a+=b будет работать так же, как a=a+b
И он требует чтобы парные операторы были реализованы в паре. Если я могу написать aa, причём, я буду ожидать, что эти условия эквивалентны. Не знаю, почему они не стали генерировать второй оператор сами, но причины его необходимости кажутся достаточно понятными - программист будет интуитивно ожидать, что второй ему тоже доступен.

Оператор try c ресурсами

Зачем нужен усовершенствованный и появившийся в JDK 7 оператор try-c-ресурсами?
try (спецификация_ресурса) { //использование ресурса {


Ответ

Оператор try-c-ресурсами реализует принцип автоматического управления ресурсами, целью которого является избежать, например, утечек памяти, в случаях когда ресурс по каким-то причинам не освобождается, если он больше не нужен.
Неудачный исход закрытия файла может привести к "утечкам памяти", поскольку неиспользуемые ресурсы оперативной памяти останутся выделенными.(стр 365)
try ( FileInputStream res = new FileInputStream(args[O])) {
//использование ресурса
}
Оператор try-c-ресурсами позволяет объявить и проинициализировать ресурс (в круглых скобках после оператора try), создав переменной ресурса локальный контекст в блоке try. По завершении этого блока переменная удаляется, а значит и ресурс автоматически закрывается.
Отсюда отпадает необходимость явного закрытия ресурса методом close() в блоке оператора finally

Работа со вложенными Generic - типами

Доброго времени суток.
Есть Класс.
///

/// Класс, являющийся "Номер Телефона". /// /// Тип, в котором хранится Тип Номера Телефона. // Кстати string не может быть ограничителем.
public class TelNumber where T : string { /// /// ID Номер Телефона. /// public int TelNumberID { get; set; } /// /// Тип Номер Телефона. /// public TypeTelNumber TypeTelNumber { get; set; } }
Я хочу, чтобы тип телефона мог быть мог быть либо string, либо TypeTelNumber
Пишу так:
/// /// Класс, являющийся "Номер Телефона". /// /// Тип, в котором хранится Тип Номера Телефона. public class TelNumber where T : string, TypeTelNumber { /// /// ID Номер Телефона. /// public int TelNumberID { get; set; } /// /// Тип Номер Телефона. /// public T TypeTelNumber { get; set; } }
Вопрос: Ругается на I, мол не такого типа (понятно и логично). Но как тогда сделать задуманное?


Ответ

Ваш код where T : string означает, что Т может быть только string, поскольку класс System.String объявлен как sealed
Чтобы скомпилировалось, достаточно объявить параметр I
public class TelNumber where T : string, TypeTelNumber { ///

/// ID Номер Телефона. /// public int TelNumberID { get; set; } /// /// Тип Номер Телефона. /// public T TypeTelNumber { get; set; } }
Но это не то, что вам нужно: в C# нет discriminated union-типов. Код where T : string, TypeTelNumber означает, что T должен быть одновременно и string, и TypeTelNumber. А поскольку string есть sealed, это означает, что ваш код не скомпилируется ни с каким типом.
Имеет смысл объявить просто два отдельных класса, реализующих общий интерфейс.
interface class ITelNumber { /// /// ID Номер Телефона. /// int TelNumberID { get; set; } /// /// Тип Номер Телефона. /// T TypeTelNumber { get; set; } }
class StringTelNumber : ITelNumber { public int TelNumberID { get; set; } public string TypeTelNumber { get; set; } }
class CustomTelNumber : ITelNumber> { public int TelNumberID { get; set; } public TypeTelNumber TypeTelNumber { get; set; } }
А ограничения на типы налагать уже вашей бизнес-логикой, а не системой типов: в C# система типов такого (пока) не умеет.

Почему нужно возвращать ссылку на объект iostream

При перегрузке оператора вывода, зачем возвращать ссылку на объект iostream, а не просто объект iostream?
class A { public: int m_a; }; ostream& operator<<(ostream left, A a) { cout << a.m_a; return left; }


Ответ

Объекты класса std::ostream не являются копируемыми. У этого класса конструктор копирования и копирующий оператор присваивания определены как удалённые. Поэтому если из определения оператора вы уберете ссылку на поток, то компилятор сообщит об ошибке.

Расшифровка пиктограмм в Visual Studio 2015

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

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


Ответ



Добавлю сюда, на всякий случай. Т.е в моем случае, это "запечатанное поле", так Field of variable в первой таблице, и соответствует sealed сигнал из второй.

Как отправить картинку через ajax?

Суть в том, что на страницу save.php посылается POST запрос с картинкой и парочкой полей, а на странице main.html, с которой это сделали (form target="_blank" - присутствует на форме) выполняется:
$('#obj_d').html('Сохранено успешно');
Думаю можно как-то отправить картинку через $.ajax(), но не знаю как. ID картинки cat_img_t. Что делает PHP: скрипт в файле save.php ловит картинку, изменяет размер, кодирует в base64 и заносит в БД. Как отправить картинку через ajax?


Ответ

На отправку данных с формы пишем обработчик:
$(document).ready(function (e) { $('#-идентификатор формы написать сюда-').on('submit',(function(e) { e.preventDefault(); // делаем отмену действия браузера и формируем ajax var formData = new FormData($('#-идентификатор формы написать сюда-')[0]); // данные с формы завернем в переменную для ajax
$.ajax({ type:'POST', // тип запроса url: $(this).attr('action'), // куда будем отправлять, можно явно указать data:formData, // данные, которые передаем cache:false, // кэш и прочие настройки писать именно так (для файлов) // (связано это с кодировкой и всякой лабудой) contentType: false, // нужно указать тип контента false для картинки(файла) processData: false, // для передачи картинки(файла) нужно false success:function(data){ // в случае успешного завершения console.log("Завершилось успешно"); // выведем в консоли успех console.log(data); // и что в ответе получили, если там что-то есть }, error: function(data){ // в случае провала console.log("Завершилось с ошибкой"); // сообщение об ошибке console.log(data); // и данные по ошибке в том числе } }); })); });
Кстати, для url по идее можно оставить вот так, если изначально все правильно вызывается:
url: this.action,
Либо написать явный путь url, как Вам удобнее.
А еще, к примеру, если Вам нужно вызвать отправку данных с формы после выбора Вашей картинки, то после выбора можете написать вот это:
$("#-идентификатор формы написать сюда-").submit();
Атрибут target - после того, как обработчик формы получает данные, он возвращает результат в виде HTML-документа. Вы можете определить окно, в которое будет загружаться итоговая веб-страница. Для этого используется атрибут target, в качестве его значения используется имя окна или фрейма. Если target не установлен, возвращаемый результат показывается в текущем окне.
У Вас в коде написано:
form target="_blank" - загружает страницу в новое окно браузера.
Если не хотите новых страниц - уберите просто аттрибут и все. Вы переделаете на ajax и никаких вкладок не будет, при желании можете сделать скрытый

Можно ли использовать volatile переменную для арифметических операций?

Допустим, есть несколько потоков, они прибавляют некоторые значения в volatile-переменную (типа синглтон), и выводят значения этой переменной после суммирования в реальном времени (ну должно быть в реальном времени). Все операции - только с целыми числами.
Можно ли так делать? Какие возникнут проблемы?


Ответ

Так делать нельзя. Операции с volatile-переменной не являются атомарными. Ключевое слово volatile лишь сообщает компилятору о том, что переменная может быть изменена либо извне программы, либо другим потоком и нельзя кэшировать её значение, т.е. значение всегда должно считываться/записываться напрямую в ячейку памяти.
В качестве примера рассмотрим выполнение кода
i = i + 1;
Пусть i == 0 и у нас есть два потока, одновременно выполняющих этот код. Тогда возможна следующая ситуация (regX - регистр процессора):
Поток 1 Поток 2 Результат
mov regA, [i] | | regA == 0 | mov regB, [i] | regB == 0 | add regB, 1 | regB == 1 | mov [i], regB | i == 1 add regA, 1 | | regA == 1 mov [i], regA | | i == 1
То есть, код выполнился два раза, но переменная i тем не менее увеличилась только на единицу.
Если Вам нужен потокобезопасный счётчик, используйте AtomicInteger

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

Подскажите, можно ли как-то передать управление программы на C/C++ в произвольный доступный участок памяти?
Сделал тестовый пример (mingw, Windows), но не работает, программа аварийно завершается при вызове pw3(5)
#include using namespace std;
void work1(int value){ cout << "work1 " <void work2(int value){ cout << "work2 " <void (*pw1)(int) = work1; void (*pw2)(int) = work2; unsigned char data[100]={}; unsigned char *funcData = (unsigned char *)pw1;
int main() { cout << "start test programm" << endl;
work1(1); work2(2);
pw1(3); pw2(4);
cout <<(void*)pw1 << endl; cout <<(void*)pw2 << endl;
void (*pw3)(int) = (void (*)(int))data;
for(int i=0;i<100;i++){ data[i] = funcData[i];
} pw3(5);
cout <<"end work"<< endl;
return 0; }


Ответ

Можно или нельзя это сделать зависит не только от "правильности" конвертации указателей, но и от свойств подлежащей платформы. Ни одна современная [интерактивная] ОС не позволит вам просто так передавать управление в область данных. Это один из столпов обеспечения безопасности системы. Защита подобного рода (Data Execution Prevention) реализована как на уровне ОС, так и на уровне процессора.
Возможно, ваша ОС предоставляет средства для отключения этой защиты. Без отключения этой защиты вам необходимо ОС-зависимыми средствами пометить ваши данные, как выполняемый код, и только после этого передавать туда управление. Но для доступа к соответствующему API ваша программа должна обладать необходимыми (весьма высокими) привилегиями.
Отдельно стоит заметить, что вам никто не обещал, что код функции располагается в памяти неким компактным непрерывным образом. Т.е. ваше верование в то, что ваш цикл for копирует в массив funcData именно код функции, ничем не обосновано.
Также нет гарантии, что код функции является позиционно-независимым. Если вы специально не обеспечили генерации позиционно-независимого кода, то может получится, что даже в случае успешного копирования кода функции в массив funcData, это код на новом месте все равно не будет вести себя так, как вы ожидаете.

Как использовать git на Windows в Rubymine?

На линуксе всё понятно, сгенерировал ssh ключ, соединил его с гитхабом и всё нормально. А вот на винде в таком софте как rubymine как китом воспользоваться? После того как я пытаюсь пушить:
git push -u origin master
мне выдаёт
Permission denied (publickey).
У меня есть приложение рельсовое. В нём уже гит установлен всё нормально. Как слить через терминал теперь в репозиторий? ssh-key команды не пашут.
Я так предполагаю мне надо как то наверное тоже сгенерировать ключ ssh или типо того и его в гитхабе вписать в профиле?


Ответ

Чтобы работала авторизация по ключу (без пароля):
Если ещё не установили git для Windows – установите Через git bash сгенерируйте ключ Добавьте публичную часть ключа в свою учётку на GitHub.
Если хотите открывать git bash из среды RubyMine, нужно её настроить (инструкцию перевёл с enSO):
Меню File (Файл) → Settings (Настройки) → (Введите 'Terminal' в строку поиска). В открывшемся окне настроек поменяйте значение Shell path на:
"C:\Program Files (x86)\Git\bin\sh.exe" --login -i

json_encode возвращает объект вместо массива

Если я удаляю из массива с целочисленными индексами элемент, а затем применяю к нему функцию json_encode то получаю строку с JavaScript объектом вместо строки с массивом.
Вот пример кода:
$a = [1, 2, 3]; unset($a[0]); echo(json_encode($a)); // {"1":2,"2":3}
Как получить на выходе строку с массивом?
В случае с примером выше, вывод должен быть вот таким:
[2,3]


Ответ

Почему это происходит:
При удалении элемента (не являющегося последним) в ключах массива появляется "дырка". При этом, функция json_encode обрабатывает такой массив не как массив с целочисленными ключами, а как ассоциативный массив (которому ставится в соответствие объект JavaScript).
Что делать:
Для того, чтобы получить на выходе массив, нужно нормализовать его ключи, например с помощью функции array_values
$a = [1, 2, 3]; unset($a[0]); $a = array_values($a); echo(json_encode($a)); // [2,3]

Google считает письма спамом

Добрый день, у меня проблема с регистрацией пользователей на сайте, гугл все письма подтверждения считает спамом, из за этого я вижу многие пользователи просто забивают на регистрацию и уходят. Какие заголовки нужно передавать что бы все было ок, или что делать? Двиг сайта самописный, на php.
Delivered-To: *******@gmail.com Received: by 10.25.208.143 with SMTP id h137csp471735lfg; Thu, 23 Feb 2017 06:55:46 -0800 (PST) X-Received: by 10.28.236.93 with SMTP id k90mr2954531wmh.40.1487861746329; Thu, 23 Feb 2017 06:55:46 -0800 (PST) Return-Path: Received: from *******.freedomain.thehost.com.ua ([176.114.3.106]) by mx.google.com with ESMTPS id 196si6753159wmw.120.2017.02.23.06.55.45 for (version=TLS1_2 cipher=AES128-SHA bits=128/128); Thu, 23 Feb 2017 06:55:46 -0800 (PST) Received-SPF: softfail (google.com: domain of transitioning no-reply@mysite.net does not designate 176.114.3.106 as permitted sender) client-ip=176.114.3.106; Authentication-Results: mx.google.com; spf=softfail (google.com: domain of transitioning no-reply@mysite.net does not designate 176.114.3.106 as permitted sender) smtp.mailfrom=no-reply@mysite.net Message-ID: <58aef7f2.cd161c0a.52af6.98a5SMTPIN_ADDED_BROKEN@mx.google.com> X-Google-Original-Message-ID: <172562218.20170223165545mysite.net> Received: from *********.freedomain.thehost.com.ua ([176.114.3.106] helo=mysite.net) by *********.freedomain.thehost.com.ua with esmtpa (Exim 4.82) (envelope-from ) id 1cguo5-0002y0-GN for myEmailName@gmail.com; Thu, 23 Feb 2017 16:55:45 +0200 Date: Thu, 23 Feb 2017 16:55:45 +0200 From: "Робот сервера mysite.net" X-Mailer: The Bat! (v3.99.3) Professional Reply-To: "Робот сервера mysite.net" X-Priority: 3 (Normal) To: "myEmailName" Subject: Создание аккаунта(mysite.net) MIME-Version: 1.0 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit

Добро пожаловать на mysite.net

Ваш аккаунт "LADUSHKA" создан. Для завершения регистрации Вам необходимо в течение 3 дней перейти по ссылке. https://mysite.net/index.php?id=verification&hash=065f5117caeacc8642434e0024af61e0


Ответ

Received-SPF: softfail говорит о том, что не настроен SPF.
Добавьте в файл DNS зоны(mysite.net), запись:
mysite.net. IN TXT "v=spf1 +a +mx -all"
Также стоит настроить DKIM.
Настройка для Ubuntu сервера:
sudo apt update sudo apt install opendkim opendkim-tools vim /etc/opendkim.conf
Правим конфиг:
Syslog yes UMask 002 Domain mysite.net KeyFile /etc/mail/dkim.key Selector mail SubDomains yes OversignHeaders From Socket inet:8891@localhost
Генерируем ключи:
opendkim-genkey --domain=mysite.net --selector=mail --verbose sudo mv mail.private /etc/mail/dkim.key sudo chown root:root /etc/mail/dkim.key sudo chmod 400 /etc/mail/dkim.key cat mail.txt # Публичный ключ для записи домена
Настраиваем sendmail:
cd /etc/mail echo "INPUT_MAIL_FILTER(`opendkim', `S=inet:8891@localhost')dnl" >> sendmail.mc m4 sendmail.mc > sendmail.cf service opendkim restart service sendmail restart
Добавляем TXT запись mail._domainkey:
v=DKIM1; g=*; k=rsa; p=MIGfMA0GCSqGSIb3D...

Указанная в Content-type кодировка не относится к заголовкам письма. Как следствие Subject нужно кодировать. На php это делается так:
$subject = mb_encode_mimeheader($subject, 'UTF-8', 'B', "
", strlen('Subject: '));

регистр слов в R

Есть вектор с словами
# текст text <- c("R is a very essential tool for data analysis. While it is regarded as domain specific, it is a very complete programming language. Almost certainly, many people who would benefit from using R, do not use it") # разбиваю текст на вектор сo словами с пом. пакета stringr text <- unlist( stringr::str_match_all(text , '\\w+\\b') )

text [1] "R" "is" "a" "very" "essential" "tool" "for" [8] "data" "analysis" "While" "it" "is" "regarded" "as" [15] "domain" "specific" "it" "is" "a" "very" "complete" [22] "programming" "language" "Almost" "certainly" "many" "people" "who" [29] "would" "benefit" "from" "using" "R" "do" "not" [36] "use" "it"
Я хочу найти в нем слово "using"
text[text=="using"] [1] "using"
все нормально, все находит но если немножко изменить регистр
text[text=="Using"] character(0)
то слово найти уже не получиться
Вопрос как сделать поиск слов не чувствительным к регистру?


Ответ

Можно использовать функцию grep
grep("Using",text,ignore.case=TRUE,value=TRUE)
ignore.case=TRUE- игнор регистра
value=TRUE - Возврат значения из вектора, а не позиции найденного слова
UPD
grep будет искать вхождения. Поэтому поиск "it" вернет не совсем верный результат:
grep("it",text,ignore.case=TRUE,value=T,useBytes = T)
[1] "it" "it" "benefit" "it"
в этом случае функция regexpr отработает лучше:
match<-regexpr("IT$",text,ignore.case=TRUE) text[match==1]
[1] "it" "it" "it"

JQuery поиск обработчика события объекта

Мне нужно найти, какие обработчики событий записаны на объекте.
Например:
$("#el").click(function() {...}); $("#el").mouseover(function() {...});
На $("#el") записаны события click и mouseover
Есть ли функция, чтобы узнать это, и можно ли выполнить итерацию по обработчикам событий?
Если это невозможно в объекте jQuery с помощью правильных методов, возможно ли это для обычного объекта DOM?
Переведено с: https://stackoverflow.com/questions/2518421/


Ответ

Начиная с jQuery 1.8, информация о событиях больше не доступна из «public API» для данных. Прочтите это сообщение в блоге jQuery. Теперь, для того чтобы узнать список событий записанных на объекте, нужно использовать это:
jQuery._data( elem, "events" );
elem должен быть элементом HTML, а не объектом jQuery или селектором.
Обратите внимание, что это внутренняя, «частная» структура, и ее не следует изменять. Используйте это только для целей отладки.
В старых версиях jQuery вам может потребоваться использовать старый метод:
jQuery( elem ).data( "events" );

Пример:
$('#el').click(function() { $(this).text('Нажали!'); }) $('#el').mouseover(function() { $(this).text('Поводили мышкой!'); }); // Получаем события var elem = $('#el').get(0); console.log( $._data(elem, "events") );

Текст

Почему я могу выполнить div для числа с точкой и Варианта в Делфи?

С удивлением обнаружил, что числа с точкой могут быть целочисленно поделены на Variant в Delphi. Простой пример:
var v: Variant; begin v := 2.3; Tag := 5.1 div v; // 2 Tag := 5.1 mod v; // 1 Tag := 5.1 div 2; // [dcc32 Error] E2015 Operator not applicable to this operand type Tag := 5.1 mod 2; // [dcc32 Error] E2015 Operator not applicable to this operand type end;
Похоже, что Delphi округляет левую и правую часть выражения перед выполнением div/mod операторов.
Я полагал, что вышенаписанный код вызовет ошибку при компилировании всех 4 строк, т.к. в моем понимании, операторы div/mod не применимы к числам с точкой от слова "совсем". Похоже что это не так.
Почему Delphi дает мне целочисленно поделить число с точкой на Variant, для чего нужна эта возможность?


Ответ

В справке по типу Variant есть следующее
If an expression combines variants with statically-typed values, the statically-typed values are automatically converted to variants.

Если в выражении используются переменные вариантных типов и статически-типизированные значения, статически-типизированные значения автоматически приводятся к вариантному типу.

В справке по операторам
Except for ^, is, and in, all operators can take operands of type Variant;

Все операторы, кроме ^, is и in могут принимать операнды с типом Variant.
Из этого следует, что в выражениях
Tag := 5.1 div v; // 2 Tag := 5.1 mod v; // 1
число 5.1 было приведено к типу Variant

При использовании типа Variant в операциях, если исходное значение не подходит для операции оно конвертируется в подходящее по определенным правилам. Правила указаны в специальной таблице.

Единый код (для расчета цены) на JS и PHP

На чем можно записать алгоритм, который должен отрабатывать единым образом в JS и в PHP (чтобы избежать дублирования кода)?
На сайте есть код, который рассчитывает стоимость заказа. Стоимость зависит от многих параметров, которые выбираются посетителем на сайте. Посетителю демонстрируется итоговая стоимость, которая рассчитывается с помощью JS. Потом параметры заказа отправляются на сервер.
На сервере (php) расчет стоимости по заданным параметрам происходит заново, для оформления заказа и записи в БД.
Получается дублирование кода - один и тот же алгоритм реализован и на JS, и на PHP. При изменении приходится вносить правки и туда, и туда. Это проблема.
Получать стоимость с сервера через AJAX во время изменения параметров пользователем нельзя, так как это происходит несколько раз в секунду (посетитель перетаскивает ползунок и в зависимости от его положения изменяется стоимость).
Вопрос в том, как записать этот алгоритм расчета в коде, едином и для JS и для PHP. Я уже думал использовать v8js, но на хостингах такое пока не поддерживается.
Что еще можно попробовать для описания алгоритма, чтобы это можно было выполнять и в PHP, и в JS без изменений?


Ответ

Решение "в обход" — выкидывание реализации на JS
"Каноническая" реализация на сервере однозначно должна быть, так что выкинуть можно только если реализацию на JS, вместо неё получать результат с сервера.
Решение "в лоб" — язык над обоими
Мне известен ровно один язык, способный собираться и в JS, и в PHP — Haxe. Но это добавление в проект ещё одного языка. Стоит ли оно того?
Решение "боком" — преобразовать одну в другую
Если алгоритм использует совсем мало фич языка, преобразовать одно в другое может быть возможно даже регулярными выражениями. Тут народ Паскаль в Си переводит препроцессором, может и у вас получится. Но этот костыль, скорее всего, будет одноразовым и после сколько-нибудь существенных правок потребует доработки. Повезёт ещё, если сообщит о проблемах преобразования (хотя бы падением результата), а не просто по-тихому поведёт себя иначе.

Как анимировать точки SVG полигона?

Я создал линейную диаграмму с SVG (точками полигона), которые я хотел бы анимировать.
Мне нужно, чтобы все точки начали анимацию вверх от оси X, и когда анимация закончится, результат выглядел бы следующим образом, как на рисунке ниже.
Кажется, что нет простого способа найти это решения с помощью поиска в Google, который я сделал. Любые советы будут наиболее ценными, спасибо.

Перевод вопроса: How to animate SVG polygon points? @Keith Donegan


Ответ

Также не стоит забывать, что свойство clip-path можно анимировать.
UPD: + SVG-fallback для фаерфокса, однако в этом браузере анимации не будет.
.graph { background-image: linear-gradient(to right, #000 20%, #666 20%, #666 40%, #bbb 40%, #bbb 60%, #ccc 60%, #ccc 80%, #eee 80%); height: 200px; animation: graph 2s forwards; -webkit-clip-path: polygon(0% 100%, 20% 100%, 40% 100%, 60% 100%, 80% 100%, 100% 100%, 100% 100%, 80% 100%, 60% 100%, 40% 100%, 20% 100%, 0% 100%); clip-path: url('#clip-start'); clip-path: polygon(0% 100%, 20% 100%, 40% 100%, 60% 100%, 80% 100%, 100% 100%, 100% 100%, 80% 100%, 60% 100%, 40% 100%, 20% 100%, 0% 100%); } @keyframes graph { to { -webkit-clip-path: polygon(0% 90%, 20% 80%, 40% 50%, 60% 30%, 80% 60%, 100% 0%, 100% 100%, 80% 100%, 60% 100%, 40% 100%, 20% 100%, 0% 100%); clip-path: url('#clip-finish'); clip-path: polygon(0% 90%, 20% 80%, 40% 50%, 60% 30%, 80% 60%, 100% 0%, 100% 100%, 80% 100%, 60% 100%, 40% 100%, 20% 100%, 0% 100%); } }


Как правильно оформить модели SQLAlchemy?

Попробую сформулировать вопрос.
Сейчас я изучаю Python и SQLAlchemy делая проект для себя. Создал таблицу User
Model = declarative_base()
class User(Model): __tablename__ = "users"
id = Column(Integer, primary_key = True) nickname = Column(String) email = Column(String) password = Column(String)
Добавил туда несколько записей.
Допустим теперь я хочу проверить - существует ли какой либо пользователь с указанным email? Я делаю следующее:
bool(session.query(exists().where(User.email == email)).scalar())
Как по мне - этот код абсолютно не читаем. Поэтому я вынес его (и другие подобные функции работы с базой) в отдельный класс Users. И вызываю их по мере необходимости в логике приложения.
class Users: def exists(email): return bool(session.query(exists().where(User.email == email)).scalar())
def add(nick, email, password): pass # Тут код
def email_exists(email): pass # Тут код
def update(id, nick, email, password): pass # Тут код
Теперь я хочу понять. Насколько я продвинулся в велосипедостроении? Как нужно делать "по хорошему"? Я открыл несколько проектов с открытым исходным кодом и не встретил там ничего подобного. Поэтому у меня закрадывается мысль, что это не совсем верный путь.


Ответ

Я когда-то делал подобным образом. Как по мне - нормальная реализация методов моделей. Неплохим решением будет создать базовый класс, от которого можно наследовать другие модели, а в самих методах добавлять нужную логику.
Для своих нужд, работая с фреймворком Flask, написал такую такую штуковину:
from ._base import db from sqlalchemy.exc import IntegrityError, InterfaceError from flask import flash from sqlalchemy import event from sqlalchemy.event import listen from sqlalchemy.orm.interfaces import MapperExtension from ..utils.redis import redis_store from sqlalchemy import inspect from sqlalchemy.ext.declarative import as_declarative, declared_attr from pickle import dumps, loads
@as_declarative() class BaseExtension(MapperExtension):
def after_insert(self, mapper, connection, instance): row = instance.query.filter_by(id = instance.id).first() payload = {'model': instance.__class__.__name__, 'data': instance.id, 'type': 'INSERT', 'row': row} redis_store.publish('realtime', dumps(payload))
def after_update(self, mapper, connection, instance): row = instance.query.filter_by(id = instance.id).first() payload = {'model': instance.__class__.__name__, 'data': instance.id, 'type': 'UPDATE', 'row': row} redis_store.publish('realtime', dumps(payload))
def after_delete(self, mapper, connection, instance): row = instance.query.filter_by(id = instance.id).first() payload = {'model': instance.__class__.__name__, 'data': instance.id, 'type': 'DELETE', 'row': row} redis_store.publish('realtime', dumps(payload))

class Base(db.Model):
__abstract__ = True __mapper_args__ = { 'extension': BaseExtension() }
id = db.Column(db.Integer, primary_key=True) created_at = db.Column(db.DateTime, default=db.func.current_timestamp()) modified_at = db.Column(db.DateTime, default=db.func.current_timestamp(), onupdate=db.func.current_timestamp())
@classmethod def create(cls,**kwargs): c = cls(**kwargs) db.session.add(c) try: db.session.commit() flash((c.__tablename__).capitalize() + u' created successfully!', 'success') except IntegrityError: db.session.rollback() flash((c.__tablename__).capitalize() + u' created failed!' + u' IntegrityError', 'error') except InterfaceError: db.session.rollback() flash((c.__tablename__).capitalize() + u' created failed!' + u' InterfaceError', 'error') return c
def __repr__(self): mapper = inspect(self).mapper ent = [] object_data = {col.key: getattr(self, col.key) if not col.key == 'created_at' and not col.key == 'password' and not col.key == 'modified_at' else None for col in mapper.column_attrs}
return "{0}".format(object_data)
Сейчас я вижу, сколько тут всего ненужного и неправильного, но во всяком случае, для саморазвития, это был хороший опыт.
Во-первых, те поля, которые повторяются во всех моделях (id, created_at, modified_al) описываются единожды.
Во-вторых, наследуемый create(), с обработкой некоторых исключений.
В-третьих, события ORM (мой метод реализации которых считается устаревшим) after_insert, after_update, after_delete обрабатываются, и данные отдаются в redis. Я это делал для "real-time" передачи данных (нотификации, обновления данных в дашборде и пр.)
В-четвёртых, __repr__, который так же универсален для всех моделей.
Так же, сюда можно добавить так называемый 'soft-delete', который позволит не удалять данные из БД насовсем, а так же методы, чтобы доставать из базы "не удалённые", все и только удалённые.
Кучу всего можно придумать при необходимости.
В конечном счёте, один раз реализованный базовый класс сэкономит много времени и места в моделях.

Как фиксировать заголовок сверху, пока видна секция

Я пытаюсь создать эффект,- когда пользователь прокручивает страницу, заголовок h1 прилипает к верхней части окна.
Когда родительский div прокручен, h1 затем освобождается и снова прокручивается как обычно.
Когда появится следующий раздел, я хотел бы снова закрепить в верхней части окна следующий h1 и так далее.
Пример: fiddle
jQuery
$(document).ready(function(){ $(window).scroll(function(){ $('section h1').addClass('fixed'); }) })
Я также пробовал:
var section = $('section'); distance = section.offset().top, $window = $(window);
$window.scroll(function() { if ( $window.scrollTop() >= distance ) { section.find('h1').addClass('fixed'); } });
Перевод вопроса: Fix title to top when section is visible @Liam


Ответ

Потребуется position: sticky и полифилл к нему.
Demo
section { position: relative; } h1 { position: sticky; margin-bottom: 0; top: 0; background: #fff; border-bottom: 1px solid; } h1 + p { margin-top: 2em; }

Header

On teada-tuntud fakt, et lehe kujunduse vaatamisel juhib selle loetav sisu lugeja tähelepanu kõrvale. Lorem Ipsumi kasutamise mõte seisneb selles, et sellel on enam-vähem normaalne jaotus tähti, mitte nagu korduvatel sõnadel "sisu siin, sisu siin", nähes välja nagu tavaline loetav tekst. Paljud tekstiredaktorid ja veebilehtede valmistamise programmid kasutavad Lorem Ipsumit vaikimisi mudeltekstina, ja trükkides otsingusse "lorem ipsum" võib leida veebilehti, mida ei ole veel nende õige sisuga täidetud. Aastatega on tekkinud mitmeid versioone, mõnikord kogemata, mõnikord meelega (huumori sisestamisega jne).

Header

On teada-tuntud fakt, et lehe kujunduse vaatamisel juhib selle loetav sisu lugeja tähelepanu kõrvale. Lorem Ipsumi kasutamise mõte seisneb selles, et sellel on enam-vähem normaalne jaotus tähti, mitte nagu korduvatel sõnadel "sisu siin, sisu siin", nähes välja nagu tavaline loetav tekst. Paljud tekstiredaktorid ja veebilehtede valmistamise programmid kasutavad Lorem Ipsumit vaikimisi mudeltekstina, ja trükkides otsingusse "lorem ipsum" võib leida veebilehti, mida ei ole veel nende õige sisuga täidetud. Aastatega on tekkinud mitmeid versioone, mõnikord kogemata, mõnikord meelega (huumori sisestamisega jne).

Header

On teada-tuntud fakt, et lehe kujunduse vaatamisel juhib selle loetav sisu lugeja tähelepanu kõrvale. Lorem Ipsumi kasutamise mõte seisneb selles, et sellel on enam-vähem normaalne jaotus tähti, mitte nagu korduvatel sõnadel "sisu siin, sisu siin", nähes välja nagu tavaline loetav tekst. Paljud tekstiredaktorid ja veebilehtede valmistamise programmid kasutavad Lorem Ipsumit vaikimisi mudeltekstina, ja trükkides otsingusse "lorem ipsum" võib leida veebilehti, mida ei ole veel nende õige sisuga täidetud. Aastatega on tekkinud mitmeid versioone, mõnikord kogemata, mõnikord meelega (huumori sisestamisega jne).

Header

On teada-tuntud fakt, et lehe kujunduse vaatamisel juhib selle loetav sisu lugeja tähelepanu kõrvale. Lorem Ipsumi kasutamise mõte seisneb selles, et sellel on enam-vähem normaalne jaotus tähti, mitte nagu korduvatel sõnadel "sisu siin, sisu siin", nähes välja nagu tavaline loetav tekst. Paljud tekstiredaktorid ja veebilehtede valmistamise programmid kasutavad Lorem Ipsumit vaikimisi mudeltekstina, ja trükkides otsingusse "lorem ipsum" võib leida veebilehti, mida ei ole veel nende õige sisuga täidetud. Aastatega on tekkinud mitmeid versioone, mõnikord kogemata, mõnikord meelega (huumori sisestamisega jne).

Header

On teada-tuntud fakt, et lehe kujunduse vaatamisel juhib selle loetav sisu lugeja tähelepanu kõrvale. Lorem Ipsumi kasutamise mõte seisneb selles, et sellel on enam-vähem normaalne jaotus tähti, mitte nagu korduvatel sõnadel "sisu siin, sisu siin", nähes välja nagu tavaline loetav tekst. Paljud tekstiredaktorid ja veebilehtede valmistamise programmid kasutavad Lorem Ipsumit vaikimisi mudeltekstina, ja trükkides otsingusse "lorem ipsum" võib leida veebilehti, mida ei ole veel nende õige sisuga täidetud. Aastatega on tekkinud mitmeid versioone, mõnikord kogemata, mõnikord meelega (huumori sisestamisega jne).


Шаблонная функция

Есть шаблонная функция:
template void function(T1 a, T1 b, T2 c) { ... }
Требуется, чтобы 3 параметр имел дефолтное значение. То есть хочется, чтобы было как-то так:
template void function(T1 a, T1 b, T2 c = С) { ... }
Но при вызове функции от 2 аргументов выдает ошибку. Как я понимаю дело в втором параметре шаблона. Нужно как-то тоже ему придать дефолтное значение.


Ответ

Как бы это выразиться... Вы вызываете f(a,b) - и что должен делать компилятор, не имея никакой информации о типе третьего параметра? Тип тоже надо умолчать...
Что-то вроде:
template void f(T a, T b, U c = U(0)) { cout << a << " " << b << endl; cout << typeid(c).name() << endl; cout << c << endl;
}
int main() { f(0,1,3); f(0,1,3.0); f(0,1); }

Как сделать документацию к функции?

Как сделать документацию к функции? Как автоматически сохранить документацию в файл? Также как получить документацию из какой-либо функции?


Ответ

Документировать функции очень важно. Это помогает не только узнать что делает функция, но и подсказывает какие именованые аргументы она принимает и что в следствии может возвращать. Документировать функции очень просто. Просто и обращаться к документации каждой функции.
Чтобы создать описание функции, внутри функции перед её телом нужно сделать многострочный комментарий(делается он с помощью трёх знаков '''). Этот комментарий будет рассматриваться, как аттрибут .__doc__ и будет появляться при вызове help(), но об этом чуть позже.
Давайте сделаем небольшую функцию:
def to_str_smth(smth, step=1): smth = str(smth) return smth[::step]
Функция есть, давайте сделаем к ней описание для тех, кто будет, например, импортировать модуль с ней.
def to_str_smth(smth, step=1): """ to_str_smth(smth, step=1) Makes the input data string and return it sliced with step """ smth = str(smth) return smth[::step]
Теперь вызовем нашу документацию:
print(to_str_smth.__doc__)
Документацию можно вызвать и с помощью команды help(), но тогда свернётся весь наш аутпут и откроется что-то типа подокна (если вы знакомы с редактором nano, то вам будет проще понять), из которого можно выйти, нажав q
help(to_str_smth)
Почему не вызывем документацию у to_str_smth(), указывая скобки? Потому что так функция затребует аргументы, если они обязательны. К тому же, таким образом мы можем вернуть документацию подфункции, если она указана в return.
Посмотрим, например, на эту функцию:
def plus(a, b): """ plus(a, b) Return a + b, typed float """ return float(a + b)
Давайте попробуем вывести на экран документацию для неё, указав скобки:
print(plus().__doc__)
Как мы видим, функция запросила аргументы. Теперь давайте попробуем их передать и снова вызывать документацию:
print(plus(2.3, 2.7).__doc__)
Не совсем то, что хотелось бы видеть...
Важно соблюдать одинаковое форматирование при написании документации, как и при написании кода. Ознакомиться с рекомендациями по тому, как стоит документировать функции и классы, можно в справке PEP257. Кстати, всё, что заключённо между парой ''' игнорируется интерпретатором и таким образом можно спрятать блоки кода при его тестах.
Если мы хотим сохранить документацию, сделать это можно с помощью программы, которая идёт в комплекте с Python под названием pydoc. Для каждой версии есть свой pydoc, так что убедитесь, что вы запускаете ту версию pydoc'а, иначе может возникнуть конфликт импорта модулей.
Сделать это можно следующим образом (подразумевается, что запуск идёт из директории с модулем):
pydoc3.6 -w ./mymodule # также подойдёт pydoc -w ./mymodule.py
Таким образом будет создан html файл с вашей документацией для модуля mymodule. Дизайн не очень, зато быстро. Для стартапов пойдёт. К тому же, помимо pydoc есть множество программ, которые генерируют документацию в файл. Вот некоторые из них:
HappyDoc pudge epydoc
Обращаясь к документации с помощью help() или .__doc__, мы можем разрешить множество вопросов, связанных с импортируемыми модулями, а документируя свой код - не забыть что он делает, возвращает и для чего он нужен спустя долгое время.

Нейросети и машинное обучение - это два разных понятия?

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


Ответ

Вы задали слишком философский вопрос. Вероятно, каждый на него ответит по-своему. Моём мнение Вы можете узнать ниже.
К сожалению, сейчас нейросети (НС) воспринимаются многими как панацея. Приведу пример. Если Вы спросите: "Как можно решить какую-либо задачу, поставленную нечётко?" Например, как узнать, в какой момент произойдёт отток клиентов в банке, либо же, в какой момент Петечкин Василий Петрович перестанет платить кредит. Скорее всего Вас отошлют к нейросетям и скажут: а возьмите-ка ваши данные подайте на вход нейронной сети и будет Вам счастье. Этот подход имеет место быть и он неплох, особенно, когда следует получить быстрый результат в условиях ограниченного времени. Скорее всего Вы получите приемлемое качество при наличии небольшой сноровки работы с НС.
Но вот на вопрос, что можно использовать помимо НС, скорее всего Вы получите в ответ задумчивое молчание. После чего, вероятно, человек выпалит фразу, в которой будет фигурировать слово "регрессия" или "метод главных компонент". Да, всё это прекрасные методы, но часто люди ими и ограничиваются.
Многие модели эквивалетны друг другу. Так, регрессию можно представить нейросетью, а нейросеть регрессией. И ничего здесь странного нет. Также и с другими методами.
Что касается панацеи. То сейчас забывают о многих чудесных вещах. Например, о дифференциальных уравнениях, которые могут очень неплохо описывать разного класса задачи. О теории групп, посредствам которой можно очень здорово упрощать всеми любимые НС и повышать качество так называемого обучения, которое явлется решением оптимизационной задачи.Что касается НС, то всё это сводит к введению целевой функции, которую следует оптимизировать.
Отвечая на Ваш вопрос про машинное обучение и НС. Машинное обучение -- это набор математических методов прикладной математики, которые, в большинстве своём проходят в курсах высшей школы (численные методы, методы оптимизации, статистика, анализ, дискретная математика и другие). НС -- есть метод прикладной математики, который направлен на решение определённого класса задач. Следовательно, НС -- это семейство алгоритмов, являющихся частью машинного обучения, которые, как правило, можно отнести к численным методам и методам оптимизации.

Как найти местоположение модуля Python?

Скрипт на Python использует некий модуль. С помощью какой команды можно найти его местоположение на диске машины?


Ответ

module.__file__
В общем случае, модуль на Питоне не обязан быть в файле на диске. Модуль может быть в zip-архиве, налету создаваться.
В зависимости от того зачем вам нужен путь к модулю, есть разные API (наивный обход директорий из sys.path не нужен и может быть недостаточным). К примеру: Можно ли загрузить содержимое модулей пакета, если __init__ пуст? или чтобы ресурсы получить, лежащие в директории с модулем: Текущая директория в Python

CheckBox с тремя состояниями

Возможно ли создать CheckBox с тремя состояниями: не установлено, включено, исключено? Что-то вроде того, что ниже:


Ответ

Есть свойство специально для этого IsThreeState
MainWindow.xaml

MainWindowXaml.cs
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); }
private void CheckBox_Indeterminate(object sender, RoutedEventArgs e) { this.Title = "Неопределено"; }
private void CheckBox_Checked(object sender, RoutedEventArgs e) { this.Title = "Выбран"; }
private void CheckBox_Unchecked(object sender, RoutedEventArgs e) { this.Title = "Не выбран"; } }
Если нужно с картинками, задаем свой стиль

sqlite. Как создать атрибут типа Date

Глядя на уроки на просторах интернета вижу, что добавляют данные в базу используя ContentValues. Но конструктора принимающего тип Date там нет. Там небольшой список типов данных. Я хотел создать таблицу, в которой есть столбец с датой и столбец с текстом. Думал поделить дату на 3 столбца. В одном год, в в другом месяц и в третьем дни. Но мне порекомендовали создать один столбец с атрибутом Date. Но как я понял sqLite не поддерживает подобных типов данных. Хочу уточнить так ли это и как мне лучше поступить, если я создаю таблицу в которой есть разный текст на каждый день в течении нескольких лет. Есть подозрение, что если добавить дату в таком формате ГГГГ-ММ-ДД в один столбец, то sqlite сможет делать выборку по дате.


Ответ

Дата в контексте программирования на Java - число миллисекунд после 01.01.1970 00:00 UTC
Именно его и храните в БД для дат. После извлечения из БД объект Date можно получить просто - Date dateFromDb = new Date(longValueFromDb)
Делать все возможные выборки по дате будет просто - вы будете делать выборки не по каким-то строкам в разных столбцах, но по числу в одном столбце.

Как передать аргументы в конструктор при выделении памяти для массива объектов?

Есть структура:
struct A{ char * buf;
A(int size){ buf = new char[size]; } };
Хочу создать массив объектов A с указанным размером.
A * a = new A[10](10); // 10 объектов, должны конструироваться через A(int size)
но никак не получается.


Ответ

Если нет уж очень принципиальной потребности полагаться на сырые new, то можно использовать std::vector и один из его конструкторов:
std::vector v(10, A(10));
Правда в этом случае объект создается указанным конструктором один раз, а далее уже происходит копирование. То есть нужно написать подходящий копирующий конструктор.

Добавление элементов управления в проект WPF

Всем доброго времени суток. Работаю над проектом курсовой работы: разработка windows-приложения на языке C# в среде разработке Visual Studio 2017 с помощью WPF. На сайте (https://modernuicharts.codeplex.com/) я нашел архив с элементом управления от Torsten Mandelkow. Всё бы хорошо, но сколько бы я не мучился не смог его добавить в свой проект, помогите пожалуйста! Конкретно мне нужен BarChart, подскажите как его добавить в своё решение в виде элемента управления?


Ответ

Скачайте бинарники здесь: https://modernuicharts.codeplex.com/releases/view/106190 ссылка "Binaries.zip", извлеките из архива файл \Binaries\WPF\De.TorstenMandelkow.MetroChart.dll
Подключите его к проекту: щелкнуть правой по References - AddReference... - Browse - Browse... - Выбрать тот файл, поставить на нем галочку - OK
Теперь в разметке окна добавьте пространство имен:
xmlns:tm="clr-namespace:De.TorstenMandelkow.MetroChart;assembly=De.TorstenMandelkow.MetroChart"
Можно пользоваться, я взял класс TestClass и коллекцию ObservableCollection Errors из примера там же:

Получилось вот что:

Повторение кода через разные промежутки времени Javascript

Здравствуйте. Мне нужно реализовать следующую логику: 1 этап: пользователи что-то делают на сервере - 40 секунд 2 этап: выполняется процесс - случайное кол-во секунд (от 3 до 10) 3 этап: кулдаун - пользователи любуются результатом - 2 секунды и все повторяется с начала и так вечно
setInterval не подходит, так как в нем код повторяется через РАВНЫЕ промежутки времени, а время окончания работы моего кода становится известно только в процессе. Если же использовать время интервала с запасом, то 3 этап будет выполняться то 2 секунды, то 15 - неприемлемо.
Такое решение (рекурсия)
function round() { var delay = 20000 * Math.random(); //узнаем, через сколько в этот раз должен сработать код setTimeout(function () { console.log('Hellow world!');//что-то тут делаю round(); //и перезапускаю }, delay); } round();
не подойдет, так как при каждой новой рекурсии будут накапливаться временные переменные и будет забиваться память, а перезагружать сервер постоянно не получится
явно ведь должно быть красивое и правильное решение? что в таком случае использовать? Нужно сделать так, чтобы была какая-то асинхронная функция с примерно таким содержанием:
-сообщить о начале 1 этапа (использую socket.io) -ждать 40 секунд -сообщить о начале 2 этапа -ждать случайное кол-во секунд -сообщить о начале третьего -ждать 2 секунды
потом функция должна запуститься заново но не рекурсией. И хотелось бы без вложенных друг в друга setTimeout. И не подобным "Войне и Миру" кодом.


Ответ

Вложеные setTimeout стек не забивают, так как выполняются асинхронно, их бояться не надо.
Для решения вашей ситуации вам надо написать самому какую-то timing микро библиотеку, позволяющую создавать цепи событий с таймаутами. Это что-то типа промисов в fetch.
Выглядеть этот код будет примерно так
TimeoutChain.PlusOne(() => { /*...*/ },2000) .PlusOne(() => { /* ещё код*/ },3000).StartChain();
Реализация будет на основе setTimeout. Но это будет выглядеть красиво, так как она инкапсулирована в эту функцию, так же из-за её асинхронности стек она не будет забивать. Так как каждая функция вызывает свой setTimeout а сама завершается.
Тут в примере пауза явно задаётся в цепи, но можно её значение просто например возвращать из самой лямбды.

Изменение значение индекса в map

Как поменять значение индекса в map. С обычным значением понятно, обращаться через индекс.
map factor; /*Имеем в нем значения factor[2]=4; factor[6]=7*/ auto it=factor.begin();
Поменять значение понятно, как:
factor[it->first]=0;
А как поменять индекс, т.е. надо, чтобы было:
factor[45]=99; factor[32]=56
Понимаю, что легче просто новые создать, но останутся старые элементы map. Как их убрать, тогда?
Имею такой map: [2]=2 [3]=2
Пытаюсь так сделать:
ps[pow(it->first, it->second)] = ui; if(pow(it->first, it->second) !=it->second) ps.erase(it->first); it++;
При первом проходе у нас заносится запись [4]=2 и удаляется [2]=2.И почему-то итератор становится it=end. Где проблема?


Ответ

Создать новые - убрать старые. Удаление элемента std::map по ключу (по "индексу") делает метод erase
map factor;
// Добавляем factor[2]=4; factor[6]=7;
// Удаляем factor.erase(2); factor.erase(6);

Чем заменить Suspend и Resume при работе с потоками?

Есть такой метод в одном стареньком компоненте:
procedure TTangentThread.SetActive(Value: Boolean); begin if Value <> FActive then begin FActive := Value; case FActive of False: begin FThread.Suspend; if (IsRuntime) and (Assigned(FOnSuspend)) then FOnSuspend(self); end; True: begin FThread.Resume; if (IsRuntime) and (Assigned(FOnResume)) then FOnResume(self); end; end; end; end;
И он, в общем то, работает, но компилятор говорит, что Suspend и Resume устарели и их лучше не использовать. Как это нынче правильно переписать, не используя "устаревших" методов?


Ответ

Suspend и Resume на самом деле выполняются операционной системой. Для Windows внутри этих методов вызываются SuspendThread и ResumeThread
Функции "живее всех живых", но... использовать их действительно не стоит. Проблема в том, что они работают с потоком "здесь и сейчас". То есть - если команда Suspend застала поток посередине выполнения оператора (например - присвоения строки) то именно в этой точке поток заснет.
Естественно, такая "произвольность" не способствует качественному выполнению приложения, особенно - если дополнительный и основной поток работают над разделяемыми (совместными) данными. Например, дополнительный поток начал изменять массив (строку, список и т.п.), в это время его "заснули", основной поток обнулил массив и разбудил дополнительный. В дополнительном потоке штатная проверка размерности уже пройдена, поэтому он не узнает о том, что того элемента, над которым поток пытается работать, уже нет. В результате - гарантированная порча памяти со всеми вытекающими последствиями.
Именно поэтому нужно использовать объекты синхронизации: TCriticalSection, TMutex, TEvent, TSemaphore, TMultiReadExclusiveWriteSynchronizer, которыми ограждается доступ к разделяемым ресурсам и / или посылаются "правильные", в "нужные моменты времени" управляющие сигналы. Альтернатива (не кросс-платоформенная) - использовать механизм сообщений
В качестве примера: дополнительный поток по команде должен выполнить какую-то работу и ожидать новую команду:

uses System.SyncObjs; type TmyThread = class(TThread) private FEvent: TEvent; // "синхронизатор"
procedure DoWork; // в этом методе будет выполняться полезная работа protected procedure Execute; override; public constructor Create; destructor Destroy; override;
procedure StartSingleWork; // этот метод вызывается "извне" end;
{ TmyThread }
constructor TmyThread.Create; begin inherited Create(False); FEvent := TEvent.Create; // создаем сигнальное событие end;
procedure TmyThread.Execute; begin while not Terminated do begin FEvent.WaitFor; // ожидаем, пока взведут событие FEvent.ResetEvent; // сбрасываем событие,чтобы // опять войти в ожидание на WaitFor
if not Terminated then // и если поток не уничтожают DoWork; // делаем свое дело. end; end;
procedure TmyThread.StartSingleWork; begin // кто-то извне хочет, чтобы поток выполнил свою работу FEvent.SetEvent; // выводим поток из спячки. // поток будет выведен из ожидания в WaitFor, // выполнит полезную работу и опять заснет. end;
procedure TmyThread.DoWork; begin // здесь выполняется какая-то полезная работа // в контексте нашего дополнительного потока. end;
destructor TmyThread.Destroy; begin Terminate; // начинаем уничтожение
FEvent.SetEvent; // выводим поток из спячки while not Finished do // ждем, пока он завершится Sleep(0); FreeAndNil(FEvent); // и уничтожаем содержимое потока.
inherited; end;
В дополнение: на мой взгляд, лучшая из статей про многопоточность в Delphi (и не только). К сожалению - только в web.archive...
Upd. Старый форум Винграда ожил, прямая ссылка на статью

Последовательность вычислений на Си

Массив char m[] надо превратить в строку, заменив последний элемент нулём. Количество элементов в массиве i. Будет ли правильно написать
m[--i]=0;
или i будет уменьшено уже после присвоения и произойдёт выход за границы массива? Как написать правильно?


Ответ

m[--i]=0;
Сначала будет выполнен декремент, а потом присваивание, как если бы код был
--i; m[i]=0;
И наоборот:
m[i--]=0;
Сначала будет выполнено присваивание, а потом декремент, как если бы код был
m[i]=0; i--;

В книге Шилдта опечатка или нет?

Читаю книгу Шилдта Java 8, главу "Ссылки на статические методы".
Вопрос про класс MyStringOps - видно, что объявлен класс, а не интерфейс, но в книге почему-то написан интерфейс. Это опечатка? Или чего-то недопонимаю?
// Продемонстрировать ссылку на статический метод // Функциональный интерфейс для операций с символьными строками
interface StringFunc { String func (String n); } // в этом интерфейсе определяется статический метод strReverse () class MyStringOps { // Статический метод, изменяющий порядок // следования символов в строке static String strReverse (String str) { String result = " " ; int i; for (i = str.length()- 1; i >= О; i--) result += str.charAt (i) ; return result; } } class MethodRefDemo { // В этом методе функциональный интерфейс указывается в качестве // типа первого его параметра . Следовательно, ему может быть передан // любой экземпляр этого интерфейса , включая и ссылку на ме тод static StringstringOp (StringFunc sf, String s) { return sf.func(s) ; public static void main (String args[]) { String inS tr = "Лямбда- выражения повышают эффективность Java "; String out Str; // Здесь ссылка на метод strRaverse () передается методу stringOp() outStr = stringOp ( MyStringOps::strReverse, inStr); System.out.println (" Иcxoднaя строка : "+ inStr); System.out.println ("Oбpaщeннaя строка : "+ outStr); } }


Ответ

Да, действительно, опечатка. В оригинале Java The Complete Reference (Ninth Edition)

Экранирование специалных символов для аргументов SSH команды

Задача:
Переменная, содержит в конце $$
$ a='SYS_$$'
$ echo $a
SYS_$$ Тут разворачивает $$ в конце строки как номер процесса, а надо отобразить строку "SYS_$$", передаваемую как параметр.
$ echo "echo \$1" | ssh another_host "/bin/sh -s $a"
SYS_18992


Ответ

Попробуйте так:
$ a='SYS_$$' $ echo 'echo $1' | ssh another_host "/bin/sh -s '$a'"
SYS_$$
При вызове ssh, внутри двойных кавычек одиночные кавычки тетряют своё специальное назначение и переменная $а будет замещена её значением, т.е. $SYS_$$ Далее, при вызове sh на удалённом хосте, одиночные кавычки вновь приобретают своё специальное назначение и препятствуют замещению $$ текущим pid.

Присвоение в описании класса

В какой момент времени во время исполнения произойдет присвоение int a = 5?
class B { private: int a = 5; public: B(); ~B(); }


Ответ

Это никакое не "присвоение". Это инициализатор и использоваться он будет для инициализации B::a, а не для присваивания. Альтернативной (и эквивалентной) формой записи будет
class B { ... int a{ 5 }; ... };
Этот инициализатор будет использован для инициализации по умолчанию этого члена класса в конструкторах этого класса. Если вы "забудете" явно проинициализировать B::a в списке инициализации конструктора класса B
B::B() // Инициализация для `a` отсутствует {}
то B::a будет неявно проинициализировано значением 5. Как будто кто-то за вас тихонько написал
B::B() : a(5) {}
Если же вы сами явно проинициализируете B::a в конструкторе
B::B() : a(42) {}
то указанный вами выше инициализатор 5 будет просто проигнорирован.
У вас в классе B может быть много разных конструкторов. Какие-то из них могут явно инициализировать B::a, а какие-то - не делать явной инициализации для B::a. В последнем случае в дело будет вступать ваше 5
class B { private: int a = 5; public: B(int) : a(42) // Здесь есть явная инициализация `a` { // Здесь `a` равно 42 }
B(double) // Здесь нет явной инициализации `a` { // Здесь `a` равно 5 } };

Функциональность таких инициализаторов не сводится только к конструкторам. Они учитываются и в "бесконструкторных" формах инициализации. Например, если класс является агрегатом и инициализируется при помощи агрегатной инициализации, то такие инициализаторы тоже принимаются во внимание компилятором
struct S { int x; int y = 42; int z; }; ... S s = { 5 }; // Агрегатная инициализация // Здесь `s.x` равно 5, `s.y` равно 42, `s.z` равно 0

Кавычки в C и C++

Собственно хочу понять механизм того что происходит с компилятором в C и C++ если объявить символ вот так 'a' и вот так "a". Весь смысл изложен в этой программе
#include
int main() { printf("This is %s
", (sizeof('a') == sizeof(char)) ? "C++" : "C"); return 0; }
в принципе понятно что происходит по факту, но не всовсем понятно как это работает изнутри.


Ответ

Пример в коде - классический пример различия между с и с++. В с++ символ в кавычках - это char. И размер его - 1. В си все приводится к int и размер 4.
А различие между одинарными и двойными кавычками просто - в одинарных - символ, в двойных - строка (массив char).
Самое интересное, что об этом даже в википедии написано:)
И почитать у Alena cpp

Вызов метода у нулевого указателя

Сегодня состоялся следующий спор с коллегами. Они утверждали, что в таком коде нет никаких проблем, и все будет работать везде одинаково:
#include
struct S{ int a; void foo(){ std::cout << "hello"; } };
int main(){ S *p = nullptr; p->foo(); //hello }
Мол к данным мы не обращаемся => В память по адресу 0 не лезем => Проблем нет. Я им с пеной у рта доказывал что если вызывать любой не статический метод у nullptr это сразу неопределенное поведение, и не важно что там в этом методе происходит.
Вопросы:
Кто прав? Где в стандарте об этом написано? Есть ли в стандарте что-то о том, как должен быть реализован this?


Ответ

В "классическом" С++ (C++98) ситуация однозначная - разыменование нулевого указателя приводит к неопределенному поведению. Соответственно вызов нестатического метода объекта через нулевой указатель приводит к неопределенному поведению. Не имеет никакого значения, выполняет ли этот метод доступ к членам класса или не выполняет. Такова позиция спецификации языка. С этой точки зрения вы совершенно правы, а аргументы ваших оппонентов на тему "все везде будет работать" - не более чем следствие "уличного образования" из разряда "смотрю в книгу ассемблер, вижу фигу".
В то же время уже довольно давно делаются попытки формирования более гибкой/тонкой спецификации в этом вопросе. В частности
DR#232: Is indirection through a null pointer undefined behavior?
Однако работа в этом направлении перманентно зависла в состоянии drafting с 2005 года. Честно говоря, создается впечатление, что какого-то внятного толкования текста нынешнего стандарта на эту тему никто дать не может, возможно именно потому, что тема до сих пор является "подвешенной".
Как вы сами понимаете, стандарт не будет заводить отдельную спецификацию на именно ваш частный случай. А как только мы переходим к более общему случаю, то сразу возникают такие ситуации, как преобразование указателя this при вызове метода в условиях [множественного] наследования.
struct A { int a; };
struct B { int b;
void foo() { // К данным мы не обращаемся // Но чему здесь равно `this`??? if (this == nullptr) ; // ??? } };
struct C : A, B { };
int main() { C *c = nullptr; c->foo(); }
Не ясно, должен ли компилятор при преобразованиях указателя this в процессе вызова метода базового класса придерживаться правила "null преобразовывается в null"? Вот именно из-за таких тонкостей изначально было принято решение запретить вызовы нестатических методов через нулевой указатель. Что же будет (и есть) сейчас и каковы намерения авторов языка - надо ждать и разбираться.
Обратите внимание, кстати, что 8.5.1.2/4 требует, чтобы скрытый параметр this при вызове метода класса инициализировался при помощи explicit type conversion. То есть в вышеприведенном примере с множественным наследованием в вызове c->foo() указатель this типа B должен инициализироваться как (B *) c. Такое преобразование работает по правилу null-в-null и результат (B *) c тоже будет нулевым указателем. Однако в GCC и Clang this внутри foo во время вызова будет иметь значение 0x4. То есть эти компиляторы не выполнили требований 8.5.1.2/4. Это сразу говорит о том, что GCC и Clang по-прежнему трактуют такой вызов как неопределенное поведение.
P.S. При этом в языке С разыменование нулевого указателя строжайше запрещено.

Как передать id через select?

Как передать id категории?


Ответ

Чистый код: Switch

Корректно ли выносить цепочку Switch в отдельный метод, если цепочка довольно большая? Или можно оставить ее в том же методе? Какой вариант выглядит лучше/красивее/чаще используется?


Ответ

Вы подходите не совсем правильно. Разбивать функцию на части нужно не по формальным признакам («длинный switch»), а по логическим. Вы должны задать себе вопрос: имеет ли ваш кусок кода самостоятельный смысл? (Например: можно ли сказать несколькими словами, что именно этот кусок делает?)
Если ответ на этот вопрос положительный, вынесите этот кусок в функцию, и назовите её этими самыми словами. Если отрицательный — оставляйте всё как было.

Небольшое дополнение. Кодировать switch можно по-разному. Можно оставить его как switch. Если это отображение одного объекта на другой, можно закодировать его как выборку из std::unordered_map. А возможно, ваш switch лучше представить в виде вызова виртуальной функции.
Когда именно и как правильно — снова-таки зависит от смысла. Пример:
string text; switch (code) { case 100: text = "Continue"; break; case 101: text = "Switching protocols"; break; case 200: text = "OK"; break; case 301: text = "Moved permanently"; break; case 404: text = "Not found"; break; }
по идее лучше закодировать так:
unordered_map message_text { { 100, "Continue" }, { 101, "Switching protocols" }, { 200, "OK" }, { 301, "Moved permanently" }, { 404, "Not found" } };
и в коде
string s = message_text[200];
или там
string s; auto it = message_text.find(200); if (it != message_text.end()) s = it->second;
(и выделить в отдельную функцию GetHttpMessageByCode).

Пример того, когда switch разумно заменить на иерархию классов:
switch (employee_kind) { case EmployeeKind::regular: salary = get_base_salary(); bonus = total_profit * bonus_ratio / number_of_employees; break; case EmployeeKind::external: salary = get_work_hours * get_hourly_rate(employee_id); bonus = 0; break; case EmployeeKind::manager: salary = get_base_salary(); bonus = bonus_fund / number_of_managers; if (salary < 100) bonus += 100 - salary; break; }
Такой код можно заменить на иерархию классов:
class employee { protected: int get_base_salary() { return 0; } public: virtual void compute_salary_and_bonus() = 0; };
class regular_employee : public employee { public: virtual void compute_salary_and_bonus() { salary = get_base_salary(); bonus = total_profit * bonus_ratio / number_of_employees; } };
class expernal_employee : public employee { public: virtual void compute_salary_and_bonus() { salary = get_work_hours() * get_hourly_rate(); bonus = 0; } };
class manager : public employee { public: virtual void compute_salary_and_bonus() { salary = get_base_salary(); bonus = bonus_fund / number_of_managers; if (salary < 100) bonus += 100 - salary; } };

Кнопка вызова функции python flask

Как с помощью библиотеки jinja2 при нажатии кнопки можно вызвать функцию в python, передав параметр id этой кнопки? Долго просматривал документацию и искал похожие вопросы, но так и не нашел ничего схожего.
Имеется следующие части кода:
main.py
def json_load(num): with open('db/pub_keys.json', 'r', encoding='utf-8') as file: file_dumps = json.load(file) for elem in file_dumps: if elem.get('id') == num: print(f'
PK user with num {num}:') print(elem.get('meta').get('pub_key'))
file.html

Нужно, чтобы при нажатии на кнопку вызывалась функция json_load() с передачей в ней аргумента id нажатой кнопки. пытался использовать {{ }} внутри onclick и action, но это не помогло.
Возможно ли реализовать это по средствам jinja2?


Ответ

Jinja2 – это всего лишь библиотека для упрощения генерации HTML страниц. А нужная Вам задача решается средствами простых HTTP запросов, которые можно сделать и с помощью чистого HTML, и с помощью более управляемого JavaScript'a.

1.1. Чистый HTML + скрытые параметры
В обоих случаях нужен обработчик запросов на стороне сервера. Однако чистым HTML'ем можно передать только обычный HTTP запрос, без JSON'а. На странице нужно сделать такие формы:



А на серваке ловить эти действия и параметры:
@app.route('/process_data/', methods=['POST']) def doit(): index = request.form['index'] # ... обработать данные ...

1.2. Чистый HTML + параметры в адресе
Фласк позволяет легко обрабатывать аргументы как часть пути:


А на серваке так:
@app.route('/process_data//', methods=['POST']) def doit(index): # ... обработать данные ...

1.3. Чистый HTML + JSON форма
Форме можно поставить тип формата, тогда поддерживающие этот JSON браузеры отправят данные в нужном формате, а не поддерживающие вернутся к классическому form url encoded


Больше подробностей и реально интересных примеров с формой JSON доступны внизу по ссылке №5.
На сервере ловить JSON тоже достаточно легко:
@app.route('/process_data/', methods=['POST']) def doit(): data = request.get_json(silent=True) index = data["index"] # ... обработать данные ...

2. HTML + JavaScript
Очевидно, что способы выше предполагают много повторяющегося HTML кода, что явно не удобно, особенно если захочется что-то поменять. JavaScript может значительно упростить код предоставив большую гибкость, а также позволит не перезагружать страницу при отправке данных:

Теперь конкретный формат запроса будет определён лишь в одном месте. В самом скрипте можно поступить по-разному.
2.1. Вариант для сервера из 1.1, где данные передаём HTTP аргументами:
function process(index) { $.post("/process_data/", {'index': index}, function (data, status) { alert("Data: " + data + "
Status: " + status); }); }
2.2. Вариант для сервера из 1.2, где данные передаём как часть пути:
function process(index) { $.post("/process_data/" + index + "/", {}, function (data, status) { alert("Data: " + data + "
Status: " + status); }); }
2.3. И, наконец, вариант для сервера из 1.3, c JSON на борту:
function process(index) { $.ajax({ url: "/process_data/", type: "post", dataType: "json", success: function (data) { alert(data); }, data: {"index": index} }); }
Для простоты здесь используется JS в связке с библиотекой jQuery.

Полезные и использованные ссылки
Документация Flask (в которой, вообще-то, есть всё необходимое) jQuery AJAX get and post Пример AJAX с JSON Про использование JSON во Flask'e Отправка JSON формы чистым HTML