Страницы

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

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

async, await - это ключевые слова? С точки зрения модуля keyword - нет!

В Python 3.5 добавили ключевые слова async, await (согласно PEP 492 - Coroutines with async and await syntax). Но это не нашло отражения в модуле keyword. Так, код
import keyword for kword in keyword.kwlist: print(kword)
выдает следующее:
False None True and as assert break class continue def del elif else except finally for from global if import in is lambda nonlocal not or pass raise return try while with yield
То есть это ошибка или async, await не стали ключевыми словами?


Ответ

Соседний ответ не вполне верен. Это вовсе не ошибка. Они действительно не являются полноценными ключевыми словами до Python 3.7, и об этом прямо сказано в PEP 492
Deprecation Plans async and await names will be softly deprecated in CPython 3.5 and 3.6. In 3.7 we will transform them to proper keywords. Making async and await proper keywords before 3.7 might make it harder for people to port their code to Python 3.

Планы по устареванию Идентификаторы async и await будут мягко обозначены устаревшими в CPython 3.5 и 3.6. В 3.7 мы сделаем их полноценными ключевыми словами. Становление async и await полноценными ключевыми словами до 3.7 может обернуться для людей сложностями в портировании кода на Python 3.

Javascript. Формат времени

Добрый день. Бьюсь, не могу отобразить время в нужном формате: Нужно так - 2018-01-05T21:02:46.167030+02:00 Именно с такой последовательностью, с такими символами. Почему-то форматировать правильно не віходит.
Вот до чего дошел ( это без попыток форматировать, т.к. они ужасны ):
var date = new Date().toString().replace(/\s+/g,'').replace('(FLEStandardTime)', '');
Буду крайне благодарен, если поможете


Ответ

var date = new Date(); date.toISOString();
Необходимо доработать, чтоб окончание было таким как вам надо. Надо было изменить на стандарт ISO.
Также многие для простоты использования юзают Moment.JS

NodeJS - настройка live reload

Вопрос - как настроить сервер на NodeJS, чтобы при изменении моделей, контроллеров и других файлов приложение, изменения сразу вступали в силу, а не приходилось выключать dev-сервер с помощью Ctrl+C и заново его запускать?


Ответ

1) Один из таких скриптов supervisor
npm install -g supervisor. После установки сервер запускаете через него: supervisor app.js
Единственный нюанс - он не увидит вновь созданные файлы. Поэтому если в рабочей папке будет создан новый файл, сервер надо перезапустить
2) Вот нашел еще одну утилиту https://www.npmjs.com/package/pm2. Более мощная штука, чем supervisor.
После запуска pm2 start nameFile.js создает демона - и консоль, из которой происходил запуск можно закрыть (открепляет работу сервера от консоли). Так же, pm2 может самостоятельно создать файлы необходимой конфигурации для добавления в автозапуск сервера NodeJs (после перезагрузки ОС). Это очень нужная вещь, при работе сервера NodeJs на VPS. Для этого необходимо, после запуска сервера NodeJs, написать команду pm2 startup, а потом pm2 save

Youtube Api - iframe вместо div player

Нужно на html страницу вставить youtube iframe. Именно через тэг iframe
В официальной документации сказано, что есть 2 способа

заменить div тэгом iframe
Я заменил, но к сожалению события не работают когда вместо div на странице iframe
Событие onPlayerReady выводит сообщение ready, если iframe сменить на div будет работать, наоборот не хочет, не понимаю в чем проблема.
// 2. This code loads the IFrame Player API code asynchronously. var tag = document.createElement('script'); tag.src = "https://www.youtube.com/iframe_api"; var firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); // 3. This function creates an


Ответ

Уберите параметр origin из src iframe, либо подставь туда свой домен и будет вам счастье)

Как осуществляется контроль доступного пространства, в случае с базами данных?

Знаю что можно вызвать метод, который показывает доступное пространство будь то флешка или внутренняя память. Но если у меня пополняемая база данных, например sqlLite и записи в неё частые и невесомые по объему. Ставить проверку памяти при каждой транзакции? Такого приема я не видел и думаю это затратный способ. Или может обернуть в try процедуру записи и показывать пользователю toast , если выпало это исключение, вроде более дешевый вариант(кстати тогда приложите к ответу какой эксепшен ловит ошибку, которая выпадает при нехватке памяти.) Какая практика существует по этому поводу?


Ответ

Думаю ловить SQLiteFullException ничего постыдного нет

Генерация случайного числа, с неравномерным распределнием

Как можно получить случайное число в диапазоне [0, 100], так чтобы значения в основном получались рядом с центром диапазона?
То есть значения из диапазона [40, 60] должны получаться чаще чем остальные.
Равномерно распределённое число в этом диапазоне получаю так:
Math.random() * 100


Ответ

Наиболее простой способ — сгенерировать два числа в диапазоне [0, 50] и сложить их
Это даст распределение чисел с максимальной вероятностью получить число в центре, и постепенным уменьшением вероятности от центра к краям.
Увеличивая число случайных чисел и уменьшая диапазон их генерации (соответственно с двух случайных чисел и диапазона [0, 50] до n случайных чисел и диапазона [0, 100/n]) можно ещё больше увеличить вероятность получения чисел рядом с центром по сравнению с числами возле края:
// случайное число в диапазоне [0, maximum] // чем больше numberRandoms, тем с большей вероятностью получаются числа ближе к центру (числу maximum/2) function weightedRandom(maximum, numberRandoms) { let result = 0; for (let i = 0; i < numberRandoms; ++i) result += Math.random() * (maximum / numberRandoms); return result; } console.log(weightedRandom(100, 2));
График распределения получившихся чисел для разных n

Общий случай
Имеется генератор равномерно распределённых случайных чисел на отрезке [0, 1] Хочется получить генератор случайных чисел из некоторого распределения
Предполагаем, что распределение задано с помощью функции распределения
Тогда можно воспользоваться функцией квантилей, которая является обратной к функции распределения. А именно надо сгенерировать случайное число на отрезке [0, 1] и применить к нему функцию квантилей, получится случайное число, соответствующее имеющейся функции распределения.
Хотя код получается очень простым, генерация некоторых распространённых распределений (например, нормального) таким способом не является простой, из-за сложности нахождения функции квантилей.

Утечка памяти / out of memory (delphi)

Добрый день, уважаемые пользователи. Суть проблемы: При запуске процедуры идет работа в файле размеров в .... мегабайт. И после 5 секунд выскакивает окно out of memory. Хотя файлы до 200 мегабайт нормально.
procedure Tfrm_Main.Run; var afList: TStringDynArray; i, j, k: integer; L, rL, fL: TStringList; NewName, tmp: String; begin memo_Log.Lines.Add(Format('Начало обработки: %s', [DateTimeToStr(Now)])); memo_Log.Lines.Add('///'); memo_Log.Lines.Add(''); L := TStringList.Create; for i := 0 to memo_Folders.Lines.Count - 1 do
begin afList := TDirectory.GetFiles(memo_Folders.Lines[i], '*.txt', SO); for j := 0 to Length(afList) - 1 do L.Add(afList[j]); end; rL := TStringList.Create; rL.Text := Trim(memo_List.Text); k := 0; fL := TStringList.Create; for i := 0 to L.Count - 1 do
begin memo_Log.Lines.Add(Format('Обработка файлов %s', [L.Strings[i]])); fL.LoadFromFile(L.Strings[i]); tmp := ExtractFileName(L.Strings[i]); tmp := Copy(tmp, 1, Pos('.', tmp) - 1); NewName := Format('%s%s.%s', [ExtractFilePath(L.Strings[i]), tmp, FormatDateTime('ddmmyy_hhnn', Now)]);
if rg_Order.ItemIndex = 1 then for j := 0 to rL.Count - 1 do rL.Exchange(j, RandomRange(0, rL.Count)); for j := 0 to fL.Count - 1 do begin fL.Strings[j] := StringReplace(fL.Strings[j], edt_Word.Text, rL.Strings[k], RF); inc(k); if k = rL.Count then k := 0; end; fL.SaveToFile(NewName); memo_Log.Lines.Add(Format('Сохранение под именем %s', [NewName])); memo_Log.Lines.Add(''); end; memo_Log.Lines.Add('///'); memo_Log.Lines.Add(Format('Окончание обработки: %s', [DateTimeToStr(Now)])); fL.Free; rL.Free; L.Free; btn_Next.Enabled := false; LoadBMP(btn_Prev, 5); btn_Prev.Caption := 'С начала'; end;


Ответ

Это не утечка. TStringList имеет ограничение на работу с очень большими файлами (учитывая, что размер файла в памяти после загрузки увеличится вдвое). Как раз 5-10 секунд проходит до того момента, как он упирается в него. Используйте либо классический readln, либо перерабатывайте под себя TFileStream. Вот пример, давно использованный в нашей программе для работы с большими текстами, переработайте его под себя:
type
TTextFileStream = class(TFileStream) private FBuffer: string; public function Eof: Boolean; procedure WriteLn(Text: string); function ReadLn: string; function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override; function RowsCount: Integer; end;
implementation
{ TTextFileStream }
function TTextFileStream.Eof: Boolean; begin Eof := ((Position - Length(FBuffer)) = Size); end;
function TTextFileStream.ReadLn: string; const BufferLength = 10000; var NewBuffer: string; Readed: Integer; begin Readed := 1; while (Pos(#13, FBuffer) = 0) and (Readed > 0) do begin SetLength(NewBuffer, BufferLength + 2); Readed := Read(NewBuffer[1], BufferLength); SetLength(NewBuffer, Readed); FBuffer := FBuffer + NewBuffer; end; if Pos(#13, FBuffer) > 0 then begin Result := Copy(FBuffer, 1, Pos(#13, FBuffer) - 1); Delete(FBuffer, 1, Pos(#13, FBuffer) + 1); end else begin Result := FBuffer; FBuffer := ''; end; end;
function TTextFileStream.RowsCount: Integer; begin Result := 1; FBuffer := ''; Seek(0, soBeginning); while not Eof do begin ReadLn; Inc(Result); end; Seek(0, soBeginning); end;
function TTextFileStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; begin if Origin = soCurrent then Result := inherited Seek(Offset - Length(FBuffer), Origin) else Result := inherited Seek(Offset, Origin); FBuffer := ''; end;
procedure TTextFileStream.WriteLn(Text: string); const NewLine = #13#10; begin Seek(0, soCurrent); Write(Text[1], Length(Text)); Write(NewLine, 2); end;

Почему метод os.path.getatime не определяет время последнего доступа к файлу?

Почему метод os.path.getatime не определяет время последнего доступа к файлу? Я запускаю нужный файл, закрываю. А скрипт определяет, что последний доступ к файлу был вчера. (ОС Windows)
import os import time path = 'my_file.py' a = os.path.getatime(path) # время последнего доступа print(time.ctime(a))


Ответ

В современных версиях Windows (7, 8, 10) Last Access Time отключен по умолчанию:
c:\>fsutil behavior query disablelastaccess DisableLastAccess = 1
чтобы включить:
c:\>fsutil behavior set disablelastaccess 0 NOTE: Changes to this setting require a reboot to take effect. DisableLastAccess = 0
NtfsDisableLastAccessUpdate
Description
Determines whether NTFS updates the last-access timestamp on each directory when it lists the directories on an NTFS volume. This entry is designed to prevent the NTFS log buffer in physical memory from becoming filled with timestamp update records. If you have an NTFS volume with a very large number of directories (in excess of 70,000), and Windows 2000 does not respond quickly to dir commands, adding this entry to the registry might make directories list faster.

path сделать адаптивным

Есть такой svg в коде на фон, и он растягивается на всю страницу как положено, но path внутри него почему-то не заполняет весь экран:
html, body { width: 100%; height: 100%; margin: 0; padding: 0; } .bg { width: 100%; height: 100%; } .bg svg { width: 100%; height: 100%; }


Как сделать path внутри svg на всю ширину и высоту экрана?


Ответ

Чтобы понять, где находятся границы svg, добавляем бордюр в шапку svg файла
style="border:1px solid red;" После настройки пропорций и размеров эта красная рамка будет не нужна, сотрите её.
Чтобы svg занял всё пространство контейнера добавляем внутри svg файла width="100%", height="100%" и команду preserveAspectRatio="none"


Пауза консоли в C++

Какие функции в Visual Studio (помимо system("pause");) останавливают закрытие консоли.


Ответ

Если речь идет только о работе в IDE, для приостановки работы программы можно использовать обычные точки останова и отладчик, какие-то специальные вызовы в коде не нужны. Более того, использование вызовов типа system("pause") приведет к тому, что программу невозможно будет нормально вызывать из пакетных файлов: она будет каждый раз ждать ввода с реальной консоли, даже если стандартный ввод перенаправлен из файла и ожидалась работа без участия пользователя. Но, если все же действительно нужно приостановить консоль при любом запуске программы, есть несколько вариантов:
system("PAUSE");
Особенности:
Отображает приглашение ввода ("Нажмите любую клавишу") Прерывает работу программы до нажатия любой клавиши Работает только под Windows (в других ОС нет команды PAUSE) Внутренне вызывает командный интерпретатор, поэтому считается "тяжелым" вариантом (если производительность что-то значит в данном случае)
Есть миф, что такой вызов небезопасен, так как если поместить в папку с программой вредоносный файл pause.exe, он будет вызван вместо команды PAUSE. Это не так в современных версиях Windows.
system("PAUSE>nul");
То же самое, но не отображает приглашение ввода.
getchar(); //С cin.get(); //C++
Особенности:
Не отображает приглашение ввода Прерывает работу программы до нажатия клавиши Enter Стандартная функция - работает в любом окружении
В отличие от других вариантов, не ломает перенаправление стандартного ввода (достаточно поместить на вход строку любого содержания, и выполнение программы пойдет дальше).
#include getch(); //Традиционная _getch(); //Современный вариант
Особенности:
Не отображает приглашение ввода Прерывает работу программы до нажатия любой клавиши Нестандартная функция, доступна в DOS и Windows (в других ОС есть похожие аналоги)
Опять же, существует миф, что в Windows это какой-то DOSовский вызов и использовать его - дикий криминал. На самом деле, внутренне он реализуется как обычный вызов WINAPI-функции ReadConsoleInput, с предварительным отключением у консоли режима ENABLE_LINE_INPUT. Убедиться в этом можно, заглянув в исходники отладочной версии CRT, которые с некоторого времени частично открыты.

Раскрытие макросов

Есть маленький вопрос по раскрытиям макросов.
Например, этот код работает:
#define DEF_STRUCT(name, type) struct name {using t = type;}; DEF_STRUCT(hah, int)
И это:
#define DEF_STRUCT(name, type) struct name {using t = type;}; #define BUILD_STRUCT_1(name, type) DEF_STRUCT(name, type) BUILD_STRUCT_1(heh, char)
А вот этот ругается (Требуется спецификатор):
#define DEF_STRUCT(name, type) struct name {using t = type;}; #define BUILD_STRUCT_1(name, type) DEF_STRUCT(name, type) #define BUILD_STRUCT_2(name, type, ...) DEF_STRUCT(name, type) BUILD_STRUCT_1(__VA_ARGS__) BUILD_STRUCT_2(lol, bool, kek, unsigned) // Извини, не хочу работать
Вопрос: как он раскрывается и что следует поменять чтобы заработало как хотелось (Объявление 2-х структур подряд)?


Ответ

Код прекрасно компилируется GCC. В MSVC он не компилируется из-за нестандартного поведения препроцессора. Эту разницу в поведении препроцессора можно проиллюстрировать примером без __VA_ARGS__
#define M2(a, b) #define M1(x) M2(x) /* <- Считается ошибкой в MSVC */ #define A 1, 2 M1(A)
В качестве workaround можно предложить
#define BUILD_STRUCT_2(name, type, name2, ...) \ DEF_STRUCT(name, type) BUILD_STRUCT_1(name2, __VA_ARGS__)
или более общее
#define FIRST(x, ...) x #define TAIL(x, ...) __VA_ARGS__
#define BUILD_STRUCT_2(name, type, ...) \ DEF_STRUCT(name, type) BUILD_STRUCT_1(FIRST(__VA_ARGS__), TAIL(__VA_ARGS__))
Хотя не совсем понятно, зачем здесь ... и __VA_ARGS__ вообще.

Как расположить блоки div в несколько колонок через цикл?

Как расположить блоки div в несколько колонок через цикл?
Мне нужно такой колонок

Мой колонок в данный момент

var column_count = 4, columns = document.querySelectorAll('.column'), blocks = document.createElement('div'); blocks.innerHTML = '

Block 3
Block 4
Block 5
Block 6
Block 7
Block 8
'; for (var i = 0; i < blocks.children.length; i++) { columns[i].appendChild(blocks.children[i]); } body { padding: 0; margin: 0; } .columns { width: 100%; float: left; } .column { width: calc(25% - 10px); height: calc(100vh - 20px); padding: 5px; float: left; } .column:nth-child(1) { background: #ff6c6c; } .column:nth-child(2) { background: #c06cff; } .column:nth-child(3) { background: #6c77ff; } .column:nth-child(4) { background: #ff956c; } .column .block { width: calc(100% - 10px); margin: 5px; padding: 20% 0; float: left; background: #fff; text-align: center; color: #666; }
Block 1
Block 2


Ответ

Во первых нужно высчитывать столбец в который мы будем вставлять, во вторых аппендить копию ноды чтобы не нарушить структуру blocks.children и правильно проитерировать элементы.
var column_count = 4, columns = document.querySelectorAll('.column'), blocks = document.createElement('div'), curr_blocks = document.querySelectorAll('.block').length; blocks.innerHTML = '

Block 3
Block 4
Block 5
Block 6
Block 7
<
Block 8
'; for (var i = 0; i < blocks.children.length; i++) { columns[(i + curr_blocks) % column_count].appendChild(blocks.children[i].cloneNode(true)); } body { padding: 0; margin: 0; } .columns { width: 100%; float: left; } .column { width: calc(25% - 10px); height: calc(100vh - 20px); padding: 5px; float: left; } .column:nth-child(1) { background: #ff6c6c; } .column:nth-child(2) { background: #c06cff; } .column:nth-child(3) { background: #6c77ff; } .column:nth-child(4) { background: #ff956c; } .column .block { width: calc(100% - 10px); margin: 5px; padding: 20% 0; float: left; background: #fff; text-align: center; color: #666; }
Block 1
Block 2
Block 2.5

GIT: GitKraken vs SourceTree - что выбрать, или все в месте?

Добрый день!
Для работы с гитом я раньше использовал SourceTree, а на новой работе нужно использовать GitKraken. Я пытался понять, в чем разница между ними, ну кроме интерфейса, но гугл разницы не показал.
На одном ресурсе предлагали использовать их вместе, но там же в каждом нужно клонировать репозиторий, правильно?
Подскажите - есть ли смысл использовать обе эти программы, либо можно только 1 какую-то из них использовать? Да и в чем разница между ними, кроме интерфейса? Кроме того что кракен платный...
Спасибо


Ответ

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

Сделать анимированный SVG фон из квадратов

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


Ответ

Решение на основе библиотеки SVG.js
/* компоненты базового цвета */ var rgb = [255,201,218]; /* получаем холст */ var svg = document.getElementById("svg1"); /* добавляем квадрат с задаными параметрами */ function AddRect(x, y, width, height) { var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); /* вычисляем случайную компоненту цвета близкую к базовой */ function randomColorComponent(start,dist) { var rez = start + Math.floor(Math.random() * dist); if(rez > 255) { rez = 255; } return rez; } /* создаём случайный цвет близкий к базовому */ var rgb2 = rgb.map(x => randomColorComponent(x, 30)); var color = `rgb(${ rgb2.join(",") })`; rect.setAttribute("fill", color); /* кастомный атрибут, для восстановления цвета */ rect.setAttribute("mycolor", color); rect.setAttribute("stroke", "silver"); rect.setAttribute("x", x); rect.setAttribute("y", y); rect.setAttribute("width", width); rect.setAttribute("height", height); rect.setAttribute("class", "rect1"); /* случайный поворот */ var rot = Math.random() * 360; rect.setAttribute( "transform", " rotate(" + rot + " " + (x + width / 2) + " " + (y + height / 2) + ")" ); /* вешаем обработчик */ rect.addEventListener("mouseover", mouseOverSquare); /* добавляем на холст */ document.getElementById("svg1").appendChild(rect); } /* обработчик наведения мыши на квадрат */ function mouseOverSquare() { /* получаем объект SVG.js из текущего */ var rect1 = SVG.adopt(this); /* останавливаем анимацию которая могла быть запущена ранее с сохранением параметров */ rect1.finish(); /* перемещаем квадрат наверх холста для большей красоты анимации */ this.remove(); svg.append(this); var rot = (Math.random() - 0.5) * 90; /* извлекаем цвет для возврата из кастомного атрибута */ var color = this.getAttribute("mycolor"); /* заполняем новым цветом */ rect1.fill("rgb(87, 86, 255)"); /* анимируем варщение и возвращение цвета */ rect1.animate(1100, "-").rotate(rot).attr({ "fill": color }); } /* заполнение холста квадратами */ function FillArea() { var style = window.getComputedStyle(svg); var width = parseInt(style.width); var height = parseInt(style.height); var rectWidth = 24; var rectHeight = 24; var vxx = 27; var vyy = 27; for (var x = -7; x < width; x += vxx) { for (var y = -7; y < height; y += vyy) { AddRect(x, y, rectWidth, rectHeight); } } } FillArea(); #svg1 { width: 100%; height: 175px; background-color: rgb(255,201,218); }
Полный код примера - ссылка

Проверить AntiForgeryToken в ajax-запросе?

Изучаю особенности asp.net core 2.0 на небольших приложениях. Хочу например сделать небольшой ajax-запрос к списку контактов.
Вот есть у меня моделька
public class ContactSearchViewModel { public string Needle { get; set; } }
и формочка:



function getSummary(needle) { $.ajax({ type: "POST", url: '/Contact/Search/', data: "Needle=" + needle, success: function (data) { $('#results').html(data); } }); }
И всё прекрасно работает... есть только одна маленькая досада: мне пришлось закомментировать ValidateAntiForgeryToken:
[HttpPost] //[ValidateAntiForgeryToken] public async Task Search(ContactSearchViewModel model) { var contacts = await this.ContactService.SearchAsync(model.Needle); return View(contacts); }
Если строку раскомментировать - то запросы до action не доходят (брейкпойнт не срабатывает), заворачиваются с 400 Bad Request где-то раньше в недрах вебсервера.
Вопрос простой: как правильно создавать ajax-запросы в .core чтобы они проходили валидацию?


Ответ

Согласно документации в представлении нужно добавить метод получения токена и скрытое поле:
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf @functions { public string GetAntiXsrfRequestToken() { return Xsrf.GetAndStoreTokens(Context).RequestToken; } }

и добавить в запрос заголовок с полученным токеном:
$.ajax({ ... headers: { "RequestVerificationToken": $('#RequestVerificationToken').val() }, ... });

Android. Писать текст справа налево

Никак не могу решить проблему с "писать текст справа налево". Такая штука мне нужна для бинарного калькулятора, который нужен на одном из экранов) Видел такой тэг rtl - но он не работает. На английской части стека все говорят про gravity="right", но и это не помогло. Я в шаге от частного самодельного решения этой проблемы) Подскажите, как писать текст в TextEdit справа налево!?
P/S/ EditText обернут в Constarint Layout если это имеет значение.


Ответ

Используйте следующее решение:
xml:
android:textDirection="rtl" android:gravity="right"
Программно:
textview.setTextDirection(View.TEXT_DIRECTION_RTL);
или
textview.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
начина с API 17+
Добавлять текст в начало textView
textview.setText(number + textView.getText());

Преобразование строки “false” в логическое false

Есть ли в JS метод наподобие parseFloat, который бы мог преобразовать строку "false" в Boolean false?
История вопроса: в БД MongoDB поле имеет логическое значение: visible: true || false. В админке сайта этому полю соответствует select со значениями true и false. Но эти значения являются строками. Надо перевести их в boolean тип. С помощью if это сделать легко, но может быть есть метод специальный?


Ответ

Воспользуйтесь JSON.parse, правда это достаточно специфичный метод, необходимо чтобы приходило точно "true" или "false" (именно в нижнем регистре). Неверная переданная строка вызовет ошибку.
JSON.parse("true") // true JSON.parse("false") // false

Нужна анимация анимированной колибри на css или js [закрыт]

Нужна анимация летающей колибри на css или js


Ответ

Такая еще svg колибри:
#colibri { width: 300px; height: 300px; margin: auto; animation: c 5s ease-in-out infinite; } .fly { transition: all .5s ease-in-out; transform-origin: 45% 45%; animation: f 2s ease-in-out infinite; } .d { animation: d 2s ease-in-out infinite; } @keyframes f { 0% { transform: rotate(20deg); } 50% { transform: rotate(-45deg); } 100% { transform: rotate(25deg); } } @keyframes c { 50% { transform: translateY(50px); } } @keyframes d { 50% { transform: translateX(-55px); } }

Запутанность фреймворков

Начал бороться с тем, что Unity отказывается видеть System.Numerics. Сделал всё как мне посоветовали. В папке mono в версии .net 4.0 нужное пространство имён есть. Далее, исследуя проблему, я наткнулся на то, что у меня всь код в .net 3.5

При смене на .net 4.0 оно вроде как меняется, код в Visual Studio перестаёт святиться красным, но Unity всё ещё ругается. При перезаходе всё откатывается.
Вопрос: Как изменить .NET framework на котором работает проект Unity с 3.5 на 4.0?
Всё что может понадобится:
Unity 2017.3.0f3 Ошибка в Unity: The type or namespace name Numerics does not exist in the namespace System. Are you missing System.Numerics assembly reference?

Немного больше информации если пригодиться


Ответ

File -> Build Settings -> Player Settings -> Other Settings -> Scripting Runtime Version -> выбрать Experimental (NET 4.6). Таким образом вы смените версию фреймворка, которую использует Unity.

Не инициализировать объект без необходимости

Есть строка, в которой я заменяю значения.
Допустим, string str = "${1} ${2} ${3}"
Для замены на слова использую
if (str.Contains("${1}")) str = str.Replace("${1}", "один");
Однако, иногда встречаются такие замены, на которые нужен объект, который собирает нужную инфу. На это у него уходит большое кол-во времени.
QQ qq = getQQ(); if (str.Contains("${2}")) str = str.Replace("${2}", qq.first); if (str.Contains("${3}")) str = str.Replace("${3}", qq.second);
Соответственно, если такие замены не требуются, то и создавать и тратить время на объект qq не нужно.
Например, при работе приложения, какая-нибудь переменная типа int i = 1 не будет создана до тех пор, пока не понадобится в работе.
А можно сказать компилятору "молодой компилятор, не задействуй строку QQ qq = getQQ(); пока она не понадобится", или что-то типа того?


Ответ

(После дискуссии в комментариях изменил ответ)
Если создание объекта дорогое, вам нужно использовать ленивую инициализацию. Проще всего получить её при помощи класса Lazy
var lazyqq = new Lazy(getQQ, isThreadSafe: false); if (str.Contains("${2}")) str = str.Replace("${2}", lazyqq.Value.first); if (str.Contains("${3}")) str = str.Replace("${3}", lazyqq.Value.second);
Объект будет создан при первом его использовании.

Если в функцию нужно передать параметры, проще всего оформить это при помощи замыкания:
var lazyqq = new Lazy(() => getQQ(x, y, z), isThreadSafe: false);

Принцип локализации на Android

Как правильно локализовать приложение на андроид, чтобы можно было в настройках например кликнуть на radiobutton или checkbox и устанавливался выбранный язык. Я себе это как представляю, сделать, либо замещать весь текст в активити текстом другого языка при выборе, либо создать новые активити с другими языками и уже при выборе другого языка менять просто активити, либо еще какие-то есть мне не известные способы. Может кто-то сможет посоветовать рабочий способ.


Ответ

Если необходимо менять язык на лету, делайте следующее.
1) Создаете ресурсы в string.xml
Change Language Hello Welcome,
потом ресурсы для второго языка, например Французский values-fr/string.xml
Changer de langue Bonjour Bienvenue,
2) Создаете класс помощник
package devdeeds.com.changelanguage;
import android.annotation.TargetApi; import android.content.Context; import android.content.SharedPreferences; import android.content.res.Configuration; import android.content.res.Resources; import android.os.Build; import android.preference.PreferenceManager;
import java.util.Locale;
public class LocaleHelper {
private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";
public static Context onAttach(Context context) { String lang = getPersistedData(context, Locale.getDefault().getLanguage()); return setLocale(context, lang); }
public static Context onAttach(Context context, String defaultLanguage) { String lang = getPersistedData(context, defaultLanguage); return setLocale(context, lang); }
public static String getLanguage(Context context) { return getPersistedData(context, Locale.getDefault().getLanguage()); }
public static Context setLocale(Context context, String language) { persist(context, language);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { return updateResources(context, language); }
return updateResourcesLegacy(context, language); }
private static String getPersistedData(Context context, String defaultLanguage) { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); return preferences.getString(SELECTED_LANGUAGE, defaultLanguage); }
private static void persist(Context context, String language) { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences.Editor editor = preferences.edit();
editor.putString(SELECTED_LANGUAGE, language); editor.apply(); }
@TargetApi(Build.VERSION_CODES.N) private static Context updateResources(Context context, String language) { Locale locale = new Locale(language); Locale.setDefault(locale);
Configuration configuration = context.getResources().getConfiguration(); configuration.setLocale(locale);
return context.createConfigurationContext(configuration); }
@SuppressWarnings("deprecation") private static Context updateResourcesLegacy(Context context, String language) { Locale locale = new Locale(language); Locale.setDefault(locale);
Resources resources = context.getResources();
Configuration configuration = resources.getConfiguration(); configuration.locale = locale;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
return context; } }
3) Меняете язык
public class MainActivity extends AppCompatActivity {
private String mLanguageCode = "fr";
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
//меняем Английский на Французский по клику на кнопку findViewById(R.id.btnChangeLangView).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //Change Application level locale LocaleHelper.setLocale(MainActivity.this, mLanguageCode);
//Пересоздаем Активити с новым языком. recreate(); } }); } }
Если надо, можете запомнить выбранный язык в SharedPreference и в onCreate() сетить методом LocaleHelper.setLocale(MainActivity.this, mLanguageCode).
первоисточник

Увеличение textarea по мере заполняемости - javascript

Как можно увеличить textarea по мере заполняемости с помощью javascript?


Ответ

Первый вариант: P.S. С помощью атрибута contenteditable
div { border: 1px solid; }


Второй вариант:
var textarea = document.getElementsByTagName('textarea')[0]; textarea.addEventListener('keydown', resize); function resize() { var el = this; setTimeout(function() { el.style.cssText = 'height:auto; padding:0'; el.style.cssText = 'height:' + el.scrollHeight + 'px'; }, 1); } textarea { width: 100%; resize: none; }

Как заменить черно-белую .png на цветную?

Есть такая картинка в формате ".png" :

На одном сайте увидел, что при наведении на изображение подобного формата, изменяется его состояние (при наведении изображение становится цветным).
Как это реализовать без grayscale-фильтра в css?


Ответ

Использовать картинку в качестве background, а затем при наведении менять расположение(background-position):
.block { display: inline-block; width: 5rem; height: 5rem; background-image: url("https://cdn-images-1.medium.com/max/924/1*ECSuMpJxNLViTxUOounYlw.png"); transition: 0.5s; } .v2 { background-position: -85px 0px; } .v3 { background-position: -170px 0px; } .v1:hover { background-position: 0 -86px; } .v2:hover { background-position: -85px -84px; } .v3:hover { background-position: -170px -84px; }


Отслеживание действия garbage collector в java

Есть ли какой нибудь способ отслеживать в программе действия garbage collector? например писать в логи все его похождения. вот он запустился, прошелся по классу, что затронул? young/old и пр. типы памяти.


Ответ

Вы можете включить логирование сборок мусора передав JVM параметр -Xlog:gc* при запуске программы.

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

Почему такая конструкция работает:
let outputData = document.querySelector('#outputData'); outputData.innerHTML = 'Введите значение';
А вот такая уже нет:
let outputData = document.querySelector('#outputData').innerHTML; outputData = 'Введите значение';
Складывается впечатление, что методы нельзя добавлять в переменную. Или возможно я не до конца понимаю особенности присваивания переменной.
Кто может объяснить эту ситуацию?


Ответ

Складывается впечатление, что методы нельзя добавлять в переменную.
Методы можно добавлять в переменную, однако, в данном случае в коде нет методов.
innerHTML - это свойство, возвращающее строку.
возможно я не до конца понимаю особенности присваивания переменной.
Особенностей нет: присваивая что-то в переменную, никак не влияет на предыдущее значение переменной.
var a = {}; a = 'a'; a = 3;
Во всех трех случаях предыдущее значение теряется и никак не меняется.

Почему работает первый вариант?
В первом варианте: outputData.innerHTML = 'Введите значение';
Нет присваивания переменной. Есть изменение значения свойства объекта.
При этом, .innerHTML еще и особое свойство, которое разбирает переданную строку и генерирует нужный html, который затем и отображается.

Как найти в тексте слова с нечетным количеством букв и удалить из них среднюю букву?

Нужно на C# с помощью регулярных выражений в введенном тексте найти слова с нечетным количеством букв, а потом удалить из них среднюю букву.


Ответ

Возможно, это будет проще и понятнее:
string input = "aaa bbbb ccccc dddddd"; string pattern = @"\w+"; string RemoveCentralSymbol(string s) => s.Remove(s.Length / 2, s.Length % 2); var result = Regex.Replace(input, pattern, match => RemoveCentralSymbol(match.Value)); Console.WriteLine(result);
Используем перегрузку Regex.Replace, принимающую MatchEvaluator (делегат, который составит строку для замены)

Не создается структура проекта ItelIiJ IDEA

Каждый раз когда я создаю проект, не создаются некоторые папки из проекта, такие как resource, main, даже когда жму галочку "создать с главным классом".
Структура проекта:

Как можно это исправить?


Ответ

Щелкните правой кнопкой мыши на модуль, выберите «Добавить поддержку фреймворка ...» и используйте технологию Maven. Это преобразует проект в Стандартный макет Maven
Это также создаст pom.xml для вас, чтобы вы могли потом изменить его.

Spring Value: почему некорректно видит переменные?

Я вынес все данные в properties, например, с такими полями:
email.content.charset=utf-8
Я создал отдельный класс с пропертями, ResourcesProperties, в котором у меня есть это поле и геттер:
import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;
@Component public class ResourcesProperties {
@Value("${email.content.charset}") private String emailCharset;
public String getEmailCharset() { return emailCharset; } }
Проперти-файл сканируется спрингом:
@PropertySource({"classpath:/properties/mail.properties"})
Я автовайрю класс проперти в нужный мне класс:
@Autowired private ResourcesProperties properties;
и вывожу на экран:
System.out.println(properties.getEmailCharset());
Результат:
${email.content.charset}
Делаю то же самое через Environment:
System.out.println(environment.getProperty("email.content.charset"));
Результат:
utf-8
Подскажите, что я делаю не так?


Ответ

Добавьте в ваш класс ResourcesProperties след код.
@Bean public static PropertySourcesPlaceholderConfigurer propertyConf() { return new PropertySourcesPlaceholderConfigurer(); }
Если не инициализировать PropertySourcesPlaceholderConfigurer то считыватся через аннотацию property не будет

Обработка динамического JSON в Retrofit2

Имеется метод в сервисе:
@DELETE("api/rest/dir/{dir_path}/") Call delete(@Path("dir_path") String dirPath);
В виде ответа могут придти разные JSON.
{ "dir": { "status": "success" } }
или
{ "dir": { "error_code": "{error number}", "error_message": "{description or error}" } }
Соответственно имеются классы:
public class BaseResponse { }

public class Error extends BaseResponse { @SerializedName("error_code") private int errorCode;
@SerializedName("error_message") private String errorMessage;

public class Status extends BaseResponse { @SerializedName("status") private String status;
Как правильно обрабатывать ответы? А то всегда в response находится BaseResponse и не приводится ни к одному из двух наследующих его типов.


Ответ

Классы менять не нужно, класс остаётся один и тот же, только в случае успешного ответа в status возвращается success, а ваши error будут null, и наоборот в случае ответа с ошибкой - status == null, а в error будут данные:
public class AwesomeResponse extends ErrorResponse {
@Nullable @SerializedName("status") public String status;
// сколько угодно полей
}
public class ErrorResponse {
@Nullable @SerializedName("error_code") public Integer errorCode;
@Nullable @SerializedName("error_message") public String errorMessage;
}

Роль организации GNU

Не могу понять роль организации GNU. Переводится как некий проект ***not Unix. Эм...ну если not Unix, то почему тогда их проект gdb это отладчик под Unix системы?


Ответ

Проект GNU (англ. The GNU Project) — проект по разработке свободного программного обеспечения (СПО), является результатом сотрудничества множества отдельных проектов. Проект был запущен программистом и сторонником СПО Ричардом Столлманом 27 сентября 1983 года в Массачусетском технологическом институте. Изначальной целью проекта было «разработать достаточно свободного программного обеспечения, чтобы можно было обойтись без программного обеспечения, которое не является свободным».
Текущая работа проекта GNU включает в себя разработку программного обеспечения, повышение осведомлённости, проведение политических кампаний и раздачу новых материалов.
Пожалуй, в контексте твоего вопроса, интереснее всего фраза
является результатом сотрудничества множества отдельных проектов
Манифест
Лицензии
Программы. Уверен, тебя заинтересует список.

Философию происходящего в этом проекте хорошо иллюстрирует существование нежно мною любимой LibreJS
дополнение к Firefox, позволяющее отказаться от выполнения несвободного JavaScript-кода. По мнению Ричарда Столлмана, проблема с JavaScript состоит в том, что код загружается без ведома пользователя, не давая возможности оценить степень его свободности перед загрузкой и воспрепятствовать выполнению проприетарного JavaScript-кода. Определение применяемой в JavaScript-коде лицензии производится через указание на сайте специальных меток или через анализ наличия упоминания лицензии в комментариях к коду. Кроме того, по умолчанию допускается выполнение тривиального JavaScript-кода, известных библиотек и кода с сайтов, занесённых пользователем в белый список.