Страницы

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

среда, 13 марта 2019 г.

Установка pickle

В консоле windows ввожу команду pip install cpickle
Collecting cpickle Downloading cpickle-0.5.tar.gz Complete output from command python setup.py egg_info: Traceback (most recent call last): File "", line 1, in File "c:\users\kaz19\appdata\local\programs\python\python35\lib\tokenize.py", line 454, in open buffer = _builtin_open(filename, 'rb') FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\kaz19\\AppData\\Local\\Temp\\pip-build-nnts2rx3\\cpickle\\setup.py'
Как это исправить?


Ответ

Оказывается в python 3.5 он уже установлен и называется просто pickle

быстрый метод для создания анаграмм на JS без библиотек

есть код для поиска анаграмм, получаю массив всех анаграмм, сортирую его и беру индекс анаграмму из массива, которая соответствует исходному слову. Но есть проблема, для длинных слов код работает очень медленно, может кто-то уже сталкивался с такой проблемой? буду рад советам и помощи!
function listPosition(word) { var arr = [word]; var anagrams = {}; arr.forEach(function(str) { var recurse = function(ana, str) { if (str === '') anagrams[ana] = 1; for (var i = 0; i < str.length; i++) recurse(ana + str[i], str.slice(0, i) + str.slice(i + 1)); }; recurse('', str); }); var result = Object.keys(anagrams); return result.sort().indexOf(word) + 1; }
console.log(listPosition('BOOKKEEPER'));


Ответ

Для начала нужно научиться считать общее число анаграмм слова. Потом можно рекурсивно считать количество лексикографически меньших анаграмм.
const fact = n => n<2?n:n*fact(n-1); const wordletters = word => word.split('').sort() .reduce((res,letter) => (res[letter]=(res[letter]|0)+1, res), {}); const objVals = obj => Object.keys(obj) .map(key => obj[key]); // Общее число всех анаграмм // n! / (n₀!*n₁!*n₂!*...nₖ!) const anaCount = word => fact(word.length) / objVals(wordletters(word)) .map(fact) .reduce((c, a) => c*a, 1); const anaIndex = word => { let count = 0; let letters = Object.keys(wordletters(word)).sort(); let index = letters.indexOf(word[0]); let lesser = letters.slice(0, index); // буквы меньшие первой lesser.forEach(letter => { // Считаем все, начинающиеся на letter let set = word.split(''); // исключаем letter set.splice(set.indexOf(letter), 1); count += anaCount(set.join('')); }); // рекурсия от слова без первой буквы if (word.length > 1) count += anaIndex(word.substr(1)); return count; }; console.log(anaCount('BOOKKEEPER')); // 151200 console.log(anaIndex('BOOKKEEPER')); // 10742 console.log(anaIndex('BOOKKEEPERMASTER')); // 10991405956
ES5

чем отличаются green threads, task-based parallelilism от native threads?

Хочу уточнить некоторые моменты
Правильно ли я понимаю, что green threads это "эмуляция" нативных потоков с помощью корутин? например, генераторы в python или javascript это green threads? Правильно ли, что task-based параллелилизм это "эмуляция" потоков без создания своего стека? Если да, то как такое с нуля реализовать (сама идея).
Буду рад ссылкам, проясняющим эти моменты, возможно я чего-то сам не нашел.
p.s. возможно стоит изменить вопрос: fiber отличается ли от концепции task-based параллелизма?


Ответ

green thread - это реализация потоков на уровне приложения. То есть, с точки зрения операционной системы их нет. Поэтому, когда операционная система делает планирование переключения потоков, она не выделяет на каждый из них время. Если один зеленый тред заблокируюется в системном вызове - все заблокируется.
task-based параллелилизм - это когда мы создаем не треды (и мучаемся с их синхронизацией), а делаем мелкие задачи, которые приложение разбрасывает между тредами. Эти треды (потоки) входят в пул (набор) и их кол-во, запуск-останов полностью управляется приложением (фреймворком). При этом сами задачи об этом не знают. При мелких задачах можно получить хорошую производительность (относительно запуска потока на каждую мелкую задачу).
Генераторы в питоне вряд ли являются зелеными тредами. Хотя, это все зависит от того, как это все понимать.
Правильно ли я понимаю, что green threads это "эмуляция" нативных потоков
вот если так оборвать - то все ок.
корутины- это те же зеленые потоки. Но они могут быть и реальными потоками.
Правильно ли, что task-based параллелилизм это "эмуляция" потоков без создания своего стека?
нет. Это выполнение задач без понимая того, что есть вообще треды и сколько их. А при чем здесь стек - я не знаю. Может имелось ввиду стек потока?

Как правильно подключать стили в React

Собственно вопрос выше.Видел некоторые импортирую стили в компонент,можно ли просто в html подключать стили? Какой способ лучше?


Ответ

По большому счету единственная причина импорта css в компоненты — это уйти от одного глобального css-файла, решив все те проблемы, которые ему сопутствуют в больших проектах:
Пересечение имен классов Трудности навигации и поиска нужных классов в огромном файле Проблемы обнаружения "мертвого кода" в этих портянках
Если вы не уверены, делать ли вам "по старинке" с импортом всего нужного в index.html, или использовать, т.н. css-модули, то используйте первое: скорее всего перечисленные выше проблемы вас не касаются.

Не срабатывает required у select в модальном окне

Имеется следующая ситуация, есть на странице две кнопки, которые лежат рядом друг с другом Сформировать программу из краткосрочно плана и Сформировать отчет сравнение с краткосрочным планом по нажатию на которые открывается модальное окно:
HTML-код модального окна и кнопок открытия модального окна:


Если нажать на одну из кнопок, то модальное окно выглядит примерно так:

JavaScript код, который обрабатывает нажатия на кнопки на странице, в том числе и в модальном окне:
function fillChoisePlanSelector() { console.log('fillChoisePlanSelector');
$.get('@Url.Action("GetShortTermPlanList", "Programs")', { year: 2016 }) .done(function(result) { var parsedResult = JSON.parse(result); $.each(parsedResult, function(index, elem) { $('#choise-plan') .append($('

Binding ConverterParameter={Binding …}

Мне нужно в качестве параметра для конвертера указать Binding, но это невозможно, так как ConverterParameter не является DependencyProperty
Все решения, которые я нашел в сети, подразумевали использование MultiBinding и это работало. Пока мне не потребовалась обратная конвертация. Подскажите как быть.
UPD
Пришлось много чего писать в комментариях, перенесу это сюда на всякий случай.
Конвертер принимает V (Value) P (Parameter) а на выходе ждет R (Result)
Обратная конвертация устроена так же.
Если я использую MultiBinding, то конвертер будет принимать V[] (Values) и на выходе ожидать R (Result)
Обратная конвертация будет принимать V (Value) а на выходе ждать R[] (Results)
Но у меня на самом деле есть 3 переменные (a,b,c). a = b * c
То есть для вычисления любой из этих переменных мне нужны две другие. А в случае с мультибиндингом мне предлагает в обратной конвертации восстановить b и с из a


Ответ

ConverterParameter не является DependencyProperty, и не подхватывает изменения. Таким образом, простое использование ConverterParameter
Необходимо использовать более честный подход. Заведите отдельный класс, который будет заниматься отображением точек модели в пиксельные координаты. Экземпляр этого класса и можно передавать в качестве параметра в конвертер.
(реальный пример кода приведу позже)

Узнать, куда указывает символьная ссылка

Есть junction типа такого:
mklink /d /j some-link some-folder-that-never-existed
Насколько я понимаю, в линуксе чтобы по такой ссылке получить путь предназначена функция readlink из , а nodejs - функция fs.readlink (в windows она работает).
А какие функции следует использовать, чтобы на Си++ получить ту же функциональность?
Использовать CreateFile для получения хэндла, а затем GetFinalPathNameByHandle для получения имени файла не подходит, т. к. целевой файл не существует. А при использовании флага FILE_FLAG_OPEN_REPARSE_POINT получается путь к самой ссылке, а не к целевой папке.


Ответ

Стандартным путем для получения имени целевого файла/директории символических ссылок в Delphi используется метод TFile.getSymLinkTarget() из System.IOUtils. Однако, если ссылка некорректная (целевой файл отсутствует) то вызов сей функции вызывает исключение.
Использовать CreateFile и GetFinalPathNameByHandle для получения желаемого результата тоже не удалось.
В качестве тестового примера я создал файл d:\data.txt, создал на него ссылку mklink sl.txt data.txt, затем переименовал файл data.txt. Таким образом ссылка становится некорректной.
В качества альтернативного варианта для получения нужной информации можно воспользоваться функцией deviceIoControl(), позволяющей отправлять команды непосредственно устройствам, среди которых может быть файловая система. Среди управляющих команд работы с директориями есть код FSCTL_GET_REPARSE_POINT для получения сведений о ссылках и точках монтирования. В качестве результата вызова этой команды возвращается структура REPARSE_DATA_BUFFER в которой не совсем логичным образом представлены необходимые данные.
К сожалению мои навыки работы с delphi несколько утратились за последнее время когда я с ним не работал, так что код может быть несколько корявым. Структуру переписал следующим образом (она вроде есть в JVCL):
type REPARSE_DATA_BUFFER = packed record ReparseTag: Cardinal; ReparseDataLength: Word; Reserved: Word; SubstituteNameOffset: Word; SubstituteNameLength: Word; PrintNameOffset: Word; PrintNameLength: Word; Flags: Cardinal; PathBuffer: array[0..1000] of WideChar; end;
TReparseDataBuffer = REPARSE_DATA_BUFFER; PReparseDataBuffer = ^TReparseDataBuffer;
Не особо мне понятно, какого размера буфер для выходных данных необходимо передавать, но выделить место под него должен вызывающий код. В противном случае будет получена ошибка, что недостаточный размер структуры.
const SL_NAME = 'D:\sl.txt'; var h : THandle; path : string; rdb : TReparseDataBuffer; br : cardinal; res : Longbool; begin ZeroMemory(@rdb, sizeof(rdb));;
h := CreateFile(SL_NAME, FILE_READ_ATTRIBUTES, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT + FILE_FLAG_BACKUP_SEMANTICS, 0);
res := DeviceIoControl(h, FSCTL_GET_REPARSE_POINT, nil, 0, @rdb, sizeof(rdb), br, nil);
SetString(path, pchar(@rdb.PathBuffer[rdb.PrintNameOffset div sizeof(WideChar)]), rdb.PrintNameLength div sizeof(WideChar));
writeln('target:', path); CloseHandle(h);
readln; end.
При открытии файла добавляется флаг FILE_FLAG_OPEN_REPARSE_POINT, возвращающий дескриптор ссылки, а не файла назначения. Для ссылок на каталоги необходим FILE_FLAT_BACKUP_SEMANTICS (честно подсмотрено в кодe TFile.getSymlinkTarget()).
В структуре TReparseDataBuffer указывается смещение и длина начала имени файла назначения в буфере в байтах.