Как установить язык C в Visual Studio 2017?
Нужен именно C, а не C++ или C#. При установке просто нет обычного C.
Ответы
Ответ 1
Компиляцией С и С++ в студии занимается один и тот же компилятор. Файлы с расширением
.c автоматически компилируются как С код. Также это можно задать вручную посредством
параметра /TC
Ответ 2
Если хочется писать на чистом си, при этом не особо хочется устанавливать большие
пакеты студии, можно воспользоваться компилятором+IDE Pelles C - маленький, легенький,
поддерживает с99, можно писать консольные и оконные приложения.
Задача состоит в том, чтобы при каждом наведении на элемент, у него менялся background.
3 раза он должен меняться, и далее, снова с первого.
let getId = id => document.getElementById(id);
let check = 1;
if (check == 1) {
getId('colorBox').onmouseover = function() {
this.style.background = 'red';
}
getId('colorBox').onmouseout = function() {
this.style.background = 'purple';
}
check = 2;
}
if (check == 2) {
getId('colorBox').onmouseover = function() {
this.style.background = 'yellow';
}
getId('colorBox').onmouseout = function() {
this.style.background = 'purple';
}
check = 3;
}
if (check == 3) {
getId('colorBox').onmouseover = function() {
this.style.background = 'green';
}
getId('colorBox').onmouseout = function() {
this.style.background = 'purple';
}
check = 1;
};
Ответы
Ответ 1
let check = -1;
let colors = ["red", "yellow", "green"];
document.querySelector('.colorBox').addEventListener("mouseenter", function(e) {
this.classList.remove.apply(this.classList, colors);
this.classList.add(colors[check = ++check % colors.length]);
});
document.querySelector('.colorBox').addEventListener("mouseleave", function(e) {
this.classList.remove.apply(this.classList, colors);
});
.colorBox {
border: 1px solid black;
width:100px;
height:100px;
display:inline-block;
background:lightgray;
}
.red {
background:red;
}
.yellow {
background:yellow;
}
.green {
background:green;
}
Изменил строки
this.classList.remove('red','yellow','green');
на
this.classList.remove.apply(this.classList, colors);
чтобы содержимое массива colors было известно только одному месту в коде.
Всем привет!
Есть у меня JS код слайдера при помощи background-image.
Проблема в том, что он меняет изображения очень резко.
Помогите пожалуйста добавить плавность в это явление
var bgArr = [
"http://via.placeholder.com/250x250/ff00ff/000000",
"http://via.placeholder.com/250x250/000000/ff00ff",
"http://via.placeholder.com/250x250/ff00ff/cdfc11"
];
var i = 0;
// Start the slide show
setInterval(function() {
$("#demo").css("background-image", "url(" + bgArr[i] + ")");
(i < bgArr.length - 1) ? i++ : i = 0
}, 2000);
Ответы
Ответ 1
Задай блоку #demo transition: all 1s;
var bgArr = [
"http://via.placeholder.com/250x250/ff00ff/000000",
"http://via.placeholder.com/250x250/000000/ff00ff",
"http://via.placeholder.com/250x250/ff00ff/cdfc11"
];
var i = 0;
// Start the slide show
setInterval(function() {
$("#demo").css("background-image", "url(" + bgArr[i] + ")");
(i < bgArr.length - 1) ? i++ : i = 0
}, 2000);
#demo {
transition: all 1s;
}
Как найти положительные (то есть без знака "-" перед) целые (без знаков "." и ","
после) числа при помощи регулярного выражения?
Мой почти рабочий вариант: (?
Написал на Java следующую последовательность действий:
Получаю из строки с кириллицей массив байтов
byte[] bytes="новая строка".getBytes();
Получается следующий массив:
[-19, -18, -30, -32, -1, 32, -15, -14, -16, -18, -22, -32]
Передаю его на вход классу ByteArrayOutputStream
ByteArrayOutputStream baos=new ByteArrayOutputStream();
baos.write(bytes);
Выполняю обратное преобразование из массива байтов в строку
System.out.println(baos.toString());
Программа выводит в консоль текст новая строка
Вопрос: так как кириллица в юникоде имеет кодепойнты, превышающие 1 тысячу (кодепойнт
буквы А, к примеру, равен 1040), а байт в Java может принимать значения от -128 до
127, следовательно при попытке преобразовать строку в массив типа byte должна происходить
потеря информации, как следствие - при вызове метода toString() строка должна восстановиться
некорректно. Но этого не произошло. В чем тут причина?
Ответы
Ответ 1
Это не юникод. String.getBytes() использует кодировку по-умолчанию платформы:
Encodes this String into a sequence of bytes using the platform's default charset,
storing the result into a new byte array.
Кодировка по-умолчанию задается настройками Java, ее можно проверить с помощью:
System.getProperty("file.encoding");
Для получения байтов в юникоде, задайте кодировку явно:
byte[] bytes="новая строка".getBytes("UTF-8");
Получится больше 12 байтов.
Обновление по вопросам в комментарии:
Разве UTF-8 выдает байты, эквивалентные юникодовскому представлению?
У юникода бывают разные представления. UTF-8 — одно из них.
Я знаю, что char выдает кодепойнты юникода. Если вывести System.out.println((byte)'н'),
то это будет равно 61.
Здесь можно посмотреть как строчная кириллическая «н» представляется в разных кодировках:
https://unicode-table.com/en/043D/
UTF-8:
Десятичное значение: 53437
Байты: 208 189
UTF-16BE:
Десятичное значение: 1085
Байты: 4 61
Для char в Java, согласно спецификации (§3.1 Unicode) используется кодировка UTF-16.
Это тоже двухбайтовая кодировка. Соответственно, когда Вы приводите char к byte Вы
получаете младший байт в этой кодировке.
Получить байты в "UTF-16BE" можно так:
byte[] bytes="новая строка".getBytes("UTF-16BE");
Если вывести байты, как Вы предложили byte[] bytes="новая строка".getBytes("UTF-8"),
то там первый байт равен -48, а не 61.
Кодировка UTF-8, как указано ранее беззнаковые (от 0 до 255) байты: 208 и 189. Знаковые
байты, соответственно, -48 и -67.
На сайте используется ряд изображений с высоким разрешением от 2500px.
pageSpeed конечно же ругается, поэтому пытаюсь использовать современный атрибут srcset
для изображений:
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
img {
max-width: 100%;
margin: auto;
}
Для высоко разрешения так и использую в 2500px, а для обычного делаю эти же картинки
в уменьшенным в 2 раза разрешением.
Пример записи img для реального проекта:
В итоге по всем "возможностям" pagespeed ругается на эти изображения и ругается на
img-1-2x.jpg Т.е. на телефонах вместо того чтобы отображать img-1-1x.jpg отображается
большая картинка.
И такие проблемы только для моб. девайсов:
Для десктопа все отлично, скорость 90+!
По совету использую Echo.js lazy load, но этот lazy load на телефонах (особенно при
плохом интернете) не все фото грузит.
Update:
Как оказалось запись:
не валидна!
При использовании атрибута sizes запись должна быть подобна этой:
Просмотрев видеоурок с рекомендацией о сжатии изображения в squoosh.app, сделала
изображения с разрешением .webp. Подключила с использованием picture:
Изображения в формате .webp весят около 200-300 кб, это при том что в большом разрешении
около 2 Мб.
В итоге скорость на страницах упала до 10 - 13, и изображения отображаются только
в хроме. Стоит последняя версия firefox, но почему-то и в нем не отображаются картинки.
caniuse.com/#feat=picture
! Да и не всегда есть возможность оптимизировать все изображения, т.е. менять размеры
или разрешение, а таких картинок на сайте много.
Вопрос:
Почему срабатывает огромное разрешение для телефонов, а не уменьшенное при записи
Ответы
Ответ 1
Делайте картинки в формате webp и добавляйте их в ваш srcset, этого гугл от вас и
ждет, о чем вы бы и сами узнали, если бы развернули блок с ошибкой и прочитали что
там написано.
Для изображений в форматах JPEG 2000, JPEG XR и WebP используется более эффективное
сжатие, поэтому они загружаются быстрее и потребляют меньше трафика, чем изображения
PNG и JPEG.
Вариант с picture наиболее кроссбраузерный.
Сначала даете ему на съедение картинку в формате webp (как я вам в примере написал),
если он не поддерживает такой тип, то будет грузить jpg.
Но гугл пейдж спид это расценит как ХОРОШО.
Ответ 2
Вообще можете тестировать и оптимизировать изображения в gtmetrix, но если поищите
можете найти другие сайты для оптимизации, и еще в photoshop сохраните изображение
с таким качеством что бы было оптимально размер -> качество.
И еще один важный момент. Это для мобильного сайта.
Изображения которые не должны быть видны в мобильном. сделайте фоном блока(если это
возможно) в место тега img. И в определенный момент когда блок скрывается ОБЯЗАТЕЛЬНО
для этого разрешения экрана поставьте для этого блока с фоновым изображением background-image:
none;.
Вот таким образом в вы достаточно оптимизируете свою страницу.
Ответ 3
А если в src ставить уменьшенную картинку, или заглушку и после загрузки скриптом
менять из атрибута, причем можно и с проверкой разрешения окна и для мобильных брать
например из data-mobile меньшего размера? Не знаю такой вариант обманет ли pageSpeed.
Можно переписать на чистом JS
$(function() {
$('.big').html(function() {
$(this).attr("src", $(this).attr('data'));
});
});
Закрыт. На этот вопрос невозможно дать объективный ответ.
Ответы на него в данный момент не принимаются.
Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы на него можно было дать ответ, основанный на фактах и цитатах, отредактировав его.
Закрыт 2 года назад.
Как оценивать:
Цену за исполнение работы
Сроки исполнения
Как рассчитать цену/сроки, которые нужно сказать заказчику? Тем более, если раньше
не сталкивался с проектами относительно большого масштаба (раньше работал с более мелкими).
Ответы
Ответ 1
В сколько долларов в час ты себя оцениваешь?
В сколько часов ты оцениваешь обьем работ на проекте?
Умножь на коэфициэнт ошибки (1.2-1.5), т.к. с малым опытом сложно обьективно оценить,
сколько времени это займет.
Ну а дальше перемножь все эти числа.
По поводу сроков:
Оцени количество часов, которые тебе теоретически нужно работать
Умножь на 2
И объясни заказчику, что это с запасом, а не точный день сдачи. :)
Есть выделенный сервер на CentOS 7 на котором хостится муниципальный сайт на битриксе.
Проблема в том, что сайт (в основном, по ночам) становится не доступен и судя по логам
Nginx выдаёт ошибку 403. "Ложится" он на время от 5 до 50 минут и потом сам "поднимается".
Доступ для пользователей к директории с битрексом есть на чтение и запись. htaccess
(на сколько я могу судить) стандартный битрексовский. Наименование файлов корректное.
Думал, что это может быть из-за бэкапов, но "ложится" сайт по времени рандомно. Подскажите,
пожалуйста, что может быть?
Ответы
Ответ 1
Требуется для начала исследовать кто выдает ошибку 403: Nginx/Apache или PHP-код.
Найти это можно в логах nginx/apache и по заголовкам ответа (X-Powered-By).
Далее требуется разбиратся с логами конкретного сервера nginx/apache (и искать в
логе ошибок причину ошибки 403) либо при выдаче этого кодом php - разбиратся в нём
Ответ 2
Нашёл причину (точнее, помог коллега). Оказалось, всё было в банальном фишинге сайта
(использовали rk.php для перенаправления на свои сайты). По этой причине, сервер временно
блокировал балансировщик пересылающий эти запросы серверу. Решается это всё в настройках
Битрикса. Нужно зайти в интерфейс Битрикса, в раздел меню "Проактивная защита", дальше
в "Защита редиректов" и включить защиту редиректов. Битрикс будет подписывать ссылки
через rk.php.
Есть установочный компакт-диск Windows 7.
Как перенести файлы установки на флешку?
Ответы
Ответ 1
Судя по каментам я видимо уже опоздал, но тем не менее:
Windows USB/DVD Download Tool
Прекрасно пишет как 7, так и 10. Но убивает всё что на флэшке было, аккуратнее.
Ответ 2
Может кому пригодится и такой проверенный рецепт - при наличии уже установленной
Windows NT 6.x (Win7|8|8.1|10) с административными правами.
Запустить diskpart и начать исполнять следующие команды.
Вывести список всех подключенных дисков.
list disk
Найти номер нужного Вам флеш-диска из перечня (например 1).
Выбрать диск
select disk 1
Очистить флешку
clean
Создать основной раздел
create partition primary
Выбрать созданный раздел
select partition 1
Сделать активным созданный раздел
active
Форматировать раздел
format fs=FAT32 quick
либо
format fs=NTFS quick
смонтировать раздел
assign
Выйти из программы
exit
Скопировать целиком со структурой каталогов содержимое установочного компакт-диска
на форматированную флешку.
P.S.
Полученная флешка грузится на большом множестве компьютеров. Замечено, что загрузчик,
прописанный с помощью Windows 10, грузится даже на тех ПК, на которых не срабатывает
загрузчик от Win7.
Нужно сделать, чтобы пользователь мог выполнять C#-код на моем сервере (что-то вроде
dotnetfiddle.net). Приложение Asp.net Core.
Есть такой метод, который вполне нормально работает:
public static async Task> ExecuteScriptAsync(string code, IEnumerable
references,
IEnumerable usings)
{
var options = ScriptOptions.Default.WithReferences(references).WithImports(usings);
return await CSharpScript.RunAsync(code, options);
}
Проблема метода ExecuteScript в том, что такой код он уже не будет выполнять:
class Program
{
public static void Main()
{
throw new System.Exception();
}
}
Как сделать чтобы код выполнялся как в консольном приложении, т.е. метод Main был
точкой входа?
Update
Нашел такой код. Срабатывает, но если в скрипт дописать Console.WriteLine("hi"),
то он ломается с ошибкой "Имя Console не существует в текущем контексте".
var script = @"using System;
public static class Program
{
public static int Main(string[] args)
{
var x = 7 * 8;
return x;
}
}";
var assemblyPath = Path.GetDirectoryName(typeof(object).Assembly.Location);
var refs = new List
{
MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "mscorlib.dll")),
MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.dll")),
MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Core.dll")),
MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Runtime.dll")),
MetadataReference.CreateFromFile(Assembly.GetEntryAssembly().Location)
};
// Parse the script to a SyntaxTree
var syntaxTree = CSharpSyntaxTree.ParseText(script);
var options = new CSharpCompilationOptions(OutputKind.ConsoleApplication);
// Compile the SyntaxTree to a CSharpCompilation
var compilation = CSharpCompilation.Create("Script",
new[] { syntaxTree },
refs,
new CSharpCompilationOptions(
OutputKind.ConsoleApplication,
optimizationLevel: OptimizationLevel.Release,
assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default));
//CodeDomProvider codeDomProvider = new CodeDomProvider();
using (var outputStream = new MemoryStream())
using (var pdbStream = new MemoryStream())
{
// Emit assembly to streams.
var result = compilation.Emit(outputStream, pdbStream);
if (!result.Success)
{
return;
}
// Load the emitted assembly.
var assembly = Assembly.Load(outputStream.ToArray(), pdbStream.ToArray());
// Invoke the entry point.
var x = assembly.EntryPoint.Invoke(null, null);
Ответы
Ответ 1
Assembly.Load, тем более из массива байт - очень плохая идея, ведь она не дает возможности
впоследствии выгрузить сборку из памяти, т.е. при работе в серверном приложении память
рано или поздно исчерпается и сервер придется перезапускать. Кроме того, как ограничить
права для запускаемого кода, чтобы он не разрушил вам систему? Если вы ориентируетесь
под .NET Core, то домены приложений недоступны. Правильнее скомпилировать код в файл
и запускать его в новом процессе под пользователем с ограниченными правами и перехватывать
его вывод:
using System;
using System.Collections.Generic;
using System.IO;
using System.Diagnostics;
using System.Reflection;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
namespace RoslynTest
{
class Program
{
static void RunScript()
{
var script = @"using System;
public static class Program
{
public static int Main(string[] args)
{
var x = 7 * 8;
Console.WriteLine(x.ToString());
return x;
}
}";
var assemblyPath = Path.GetDirectoryName(typeof(object).Assembly.Location);
var refs = new List
{
MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "mscorlib.dll")),
MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.dll")),
MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Core.dll")),
MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Runtime.dll")),
MetadataReference.CreateFromFile(Assembly.GetEntryAssembly().Location)
};
// Parse the script to a SyntaxTree
var syntaxTree = CSharpSyntaxTree.ParseText(script);
var options = new CSharpCompilationOptions(OutputKind.ConsoleApplication);
// Compile the SyntaxTree to a CSharpCompilation
var compilation = CSharpCompilation.Create("Script",
new[] { syntaxTree },
refs,
new CSharpCompilationOptions(
OutputKind.ConsoleApplication,
optimizationLevel: OptimizationLevel.Release,
assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default)
);
var result = compilation.Emit("script.exe");
if (!result.Success)
{
throw new ApplicationException("Cannot compile script");
}
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "script.exe";
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardInput = true;
psi.UserName = "Vasya";
psi.Password = "123";
var process = new Process();
using (process)
{
process.StartInfo = psi;
process.Start();
while (!process.StandardOutput.EndOfStream)
{
string res = process.StandardOutput.ReadLine();
Console.WriteLine(res);
}
}
}
}
}
Код заточен под .NET Framework / Windows, но думаю, не составит труда переделать
под .NET Core, так как все используемые библиотеки есть в .NET Standard. Запуск процессов
от имени другого пользователя должен работать в .NET Core на всех ОС, начиная с .NET
Core 2.1.
Примечание. В .NET Core 3.0 появилась возможность выгрузки сборок из памяти, но это
все еще не решает проблему обеспечения безопасности.
Мне нужно, чтобы на моем сайте при клике по видеоотзыву открывался айфрейм с видео,
которое лежит на Ютубе (это уже реализовано). Причем, в зависимости от текущего языка
видео должно открываться с субтитрами и соответствующим языком. Реально ли это сделать?
Если бы можно было при открытии видео передать параметром язык и обязательность субтитров,
то было бы отлично.
Вопрос - это вообще реально? И если нет, то как можно выйти из положения?
Ответы
Ответ 1
Согласно официальной документации, язык интерфейса можно задать при помощи параметра
hl, а для включения субтитров используется параметр cc_load_policy со значением 1.
При необходимости можно использовать параметр cc_lang_pref, чтобы задать язык субтитров.
Этот параметр работает аналогично параметру hl.
Стоит иметь в виду, что cc_load_policy=1 не работает с автогенерированными субтитрами,
их нужно включать вручную.
Пример использования:
https://www.youtube.com/embed/QRS8MkLhQmM?hl=en&cc_load_policy=1&cc_lang_pref=ru&autoplay=1
Мне нужно только результат функции, который записывается в переменную existing.
Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions,
result: out Mutex _);
Могу ли я использовать "Пустую переменную" в этом коде? Вызовет ли она Dispose();
для этого обьекта автоматически?
Или правильным было бы обьявить переменную Mutex mutex и после вызова метода вызвать
mutex.Dispose(); ?
P.S. Кому не понятна суть вопроса, подробнее про пустые переменные тут: https://docs.microsoft.com/en-us/dotnet/csharp/discards
Ответы
Ответ 1
Сама документация описывает что "пустые переменные" просто ссылаются на некую "пустую"
область памяти. То есть не занимают места.
Что вряд ли означает что они будут вызывать Dispose() у IDisposable обьектов.
Я провел личное расследование даного вопроса и написал прогу для тестирования. Простая
винформс апликуха на старте которого вызывается метод:
public bool TestMethod(out Image bmp)
{
Thread.Sleep(3000);
bmp = Bitmap.FromFile(@"C:\Users\UKS\Desktop\2000x2000pixels.bmp");
Thread.Sleep(1000);
return true;
}
Выкладываю результаты:
public Form1()
{
InitializeComponent();
Image img;
var a = TestMethod(out img);
img.Dispose();
}
Как видно из картинки - Память возросла и освободилась т.к. мы использовали диспоуз
Теперь настал черед теста:
public Form1()
{
InitializeComponent();
var a = TestMethod(out _);
}
Как видим из картинки - память НЕ освободилась когда я использовал Discard-переменную.
Из чего делаем вывод что Дискарды не диспоузят данные. Теперь настал черед еще пары
тестов:
Конструкция:
var a = TestMethod(out _.Dispose());
Не сработает. Говорит что _ не существует в даном контексте.
Конструкция:
var a = TestMethod(out _);
_.Dispose();
Даст ровно тот же результат.
Вывод: пустые переменные использовать на IDisposable обьектах категорически нельзя.
Итак, самый коректный код в даном конкретном случае есть:
Mutex mutex;
Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions,
result: mutex);
mutex?.Dispose();//проверяем на null. Если не налл, то вызываем диспоуз.
Как на c# нарисовать звезду в круге используя picturebox?
private void OnPaint()
{
int n = 5; // число вершин
double R = 25, r = 50; // радиусы
double alpha = 0; // поворот
double x0 = 60, y0 = 60; // центр
Graphics e = pictureBox1.CreateGraphics();
PointF[] points = new PointF[2 * n + 1];
double a = alpha, da = Math.PI / n, l;
for (int k = 0; k < 2 * n + 1; k++)
{
l = k % 2 == 0 ? r : R;
points[k] = new PointF((float)(x0 + l * Math.Cos(a)), (float)(y0 + l
* Math.Sin(a)));
a += da;
}
e.DrawLines(Pens.Black, points);
e.DrawEllipse(Pens.Green, 60, 60, 200, 200);
}
private void button1_Click(object sender, EventArgs e)
{
OnPaint();
}
}
}
У меня получилось только вот это:
Ответы
Ответ 1
Вы вызываете DrawEllipse(), передавая вторым и третьим аргументом координаты центра:
double x0 = 60, y0 = 60;
^^ ^^
// ...
e.DrawEllipse(Pens.Green, 60, 60, 200, 200);
^^ ^^
Однако согласно документации функция ожидает там координаты верхнего левого угла:
public void DrawEllipse (System.Drawing.Pen pen, int x, int y, int width, int height);
^ ^
Можно, конечно, просто поправить числа. Но лучше вообще от них отказаться, динамически
подгоняя круг под звезду:
e.DrawEllipse(Pens.Green, x0 - R, y0 - R, R * 2, R * 2)
Народ, всем привет! Столкнулся с бедой - нужно натренировать сеть по приложенному
датасету (выше) и образцу с хабра (сам пост). Итоговый результат никак не похож на
изначальный набор значений. С чем я мог налажать: грешу на сигмоиду, но упустить что-то
важное из внимания мог и в любом другом месте. Огромное спасибо, если откликнитесь!
Описание сета
Данные
(Предварительно удалил строчки с вопросительными знаками и поместил сет в txt).
По-английски/in English
import numpy as np
# sigmoid func
def sigmoid(x, deriv=False):
if deriv:
# print(sigmoid(x) * (1 - sigmoid(x)))
return sigmoid(x) * (1 - sigmoid(x))
return 1 / (1 + np.exp(-x))
# input initialization
dataset = np.genfromtxt('dataset.txt', delimiter=',')
X = dataset[..., 0:12]
y = np.array([dataset[..., 13]]).T
# input normalization
Xn = X / X.max(axis=0)
yn = y / y.max(axis=0)
# random numbers initialization
np.random.seed(1)
syn0 = 2 * np.random.random((12, 1)) - 1
for i in range(50000):
# direct error propagation
l0 = Xn
l1 = sigmoid(np.dot(l0, syn0))
# error computing
l1_error = yn - l1
# multiply this by the slope of sigmoid
# using values of l1
l1_delta = l1_error * sigmoid(l1, True) # - !
# weights update
syn0 += np.dot(l0.T, l1_delta) # - !
print("Output data after training: ")
print(l1)
Actual result Required result:
[[8.25305827e-28] ~0
[9.99999908e-01] ~0.5
[5.25318843e-04] ~0.25
[2.41309677e-22] ~0
[2.09811612e-28] ~0
[2.37186828e-34] ~0
[1.43044972e-07] ~0.75
[6.83698176e-30] ~0
... ...
Ответы
Ответ 1
Дело в том, что это датасет для мультиклассовой классификации: y принимает значения
1, 2, 3, 4, 5. Для решения такой задачи нужна другая функция активации (softmax обычно)
и другая функция потерь (обычно crossentropy). Советую взять датасет с бинарным таргетом.
Хотя на сайте http://crypt-online.ru/crypts/base64/ всё дешифруется верно.
Вот пример кода:
import base64
s = input()
resault = base64.b64encode(bytes(s, 'utf-8')) #Шифровка
print(resault)
print(base64.b64decode(resault)) #Дешифровка
Ответы
Ответ 1
print(base64.b64decode(resault).decode())
и лучше
resault = base64.b64encode(s.encode())
Интересная ситуация, при попытке установки значения для BitmapImage.UriSource через
привязку данных, вот так:
После инициализации View происходит исключение:
InvalidOperationException: Необходимо задать свойство "UriSource" или
"StreamSource".
Т.е. в момент инициализации DataContext еще не установлен, но это произойдет немного
позже. Как с этим бороться т.к. игнорируется значение TargetNullValue а так же FallbackValue?
Ответы
Ответ 1
Смотрите (c).
TargetNullValue предназначен для случаев, когда привязка работает, но источник содержит
значение null, у вас же, пока DataContext не установлен, привязка оказывается в нерабочем
состоянии, но для BitmapImage это недопустимо, он обязательно должен иметь установленное
свойство UriSource или StreamSource.
Для случаев, когда привязка сломана или источник содержит недопустимое значение предназначена
именно фича FallbackValue, т. е. вроде бы ваш пример должен заработать если написать так:
Но он не заработает как нам нужно: заглушка для картинки появится, но когда мы установим
DataContext, она не поменяется на нужную нам. Тут есть еще одна загвоздка (читайте
комментарии в статье про BitmapImage на MSDN):
... После инициализации изменения свойств игнорируются.
т. е. созданное единожды BitmapImage навсегда останется таким.
Тут у вас есть несколько вариантов:
написать простой конвертер, который будет по строке (или Uri) создавать новый экземпляр
BitmapImage:
class UriToBitmapImageConverter : ConverterBase
{
public override object Convert(object value, Type targetType, object parameter,
CultureInfo culture)
{
var b = new BitmapImage
{
CacheOption = BitmapCacheOption.OnDemand,
CreateOptions = BitmapCreateOptions.DelayCreation
};
b.BeginInit();
b.UriSource = new Uri((string)value);
b.EndInit();
return b;
}
}
и воспользоваться им:
воспользоваться фичей PriorityBinding:
затем:
но здесь, конечно, BitmapImage создается автоматически с настройками по умолчанию.
В обоих вариантах получаем:
Есть вот такой простой код:
$file = 'http://site.ru/photo.jpg';
echo basename($file));
Как мне изменить название файла так, чтобы не менялось расширение?
В переменной file файлы меняются, поэтому нужно заменить название у всех других файлов,
а не просто заменой photo на другое слово.
Есть произвольная строка не больше 25 символов. Например "wo1fram"
Как преобразовать ее в массив char[255]?
Чтобы потом с char можно было работать как с полноценным массивом символов, оканчивающимся
нуль-символом.
Ответы
Ответ 1
Тут, видите ли, есть два решения.
Одно - если вам надо только читать эту строку, или там, поменять в ней пару символов
- но не менять ее размер (так что всякие strcpy отменяются) - то можно воспользоваться
функциями c_str() и data(). Очень рекомендую внимательно почитать описания, а главное
- ограничения, накладываемые этими функциями.
И другое - если нужно работать с ней как со строкой в стиле С со всеми возможностями
- то просто скопируйте ее в массив, типа
char buf[255];
strcpy(buf,s.c_str());
или
char * buf = strdup(s);
Примерно так.
Начал писать консольную змейку, сталкивался с многими проблемами, но данную проблему
не могу пока что решить. Проблема в том, что как только игра начинается всё в порядке,
края правильно рисуются, но стоит взять фрукт так сразу происходит какая-то ахинея
и правая сторона уходит на несколько клеточек вправо.
import threading
import random
import os
from pynput import keyboard
from time import sleep
def draw():
global score
global fruitX
global fruitY
global snake
os.system("clear")
# top
for i in range(0, width + 1):
print("#", end='')
print()
# all mid
for i in range(0, height):
for j in range(0, width):
if (j == 0) or (j == width - 1):
print("#", end='')
for k in snake:
if (i == k[1]) and (j == k[0]):
print("G", end='')
elif (i == fruit[0][1]) and (j == fruit[0][0]):
print('*', end='')
else:
print(' ', end='')
print()
# bot
for i in range(0, width + 1):
print("#", end='')
print()
print(f"Total score: {score}")
def input():
with keyboard.Listener(on_release=on_release) as listener:
listener.join()
def on_release(key):
global gameOver
global snake
ka = 0
if key == keyboard.Key.esc:
gameOver = True
if key == keyboard.KeyCode.from_char('w'):
for k in snake:
snake[ka][1] -= 1
ka += 1
if key == keyboard.KeyCode.from_char('s'):
for k in snake:
snake[ka][1] += 1
ka += 1
if key == keyboard.KeyCode.from_char('d'):
for k in snake:
snake[ka][0] += 1
ka += 1
if key == keyboard.KeyCode.from_char('a'):
for k in snake:
snake[ka][0] -= 1
ka += 1
def logic():
global score
global fruit
global snake
# Got a fruit
if (snake[0][0] == fruit[0][0]) and (snake[0][1] == fruit[0][1]):
score += 1
snake.append([snake[0][0] - 1, snake[0][1]])
fruit.pop()
if len(fruit) == 0:
fruit.append((random.randint(1, width - 1),
random.randint(1, height - 1)))
if __name__ == "__main__":
gameOver = False
width = 20
height = 20
snake = [[width / 2 - 1,
height / 2 - 1]]
fruit = [(random.randint(1, width - 1),
random.randint(1, height - 1))]
score = 0
t_input = threading.Thread(target=input, name='InputThread')
t_input.start()
# Main game
while not gameOver:
sleep(0.1)
draw()
logic()
Можете не кидать готовый код, можно просто объяснить что не так. Если всё уж так
плохо, то подскажите что переучить заново, или попрактиковаться снова. Учился по книге
Билл Любанович "Простой Python"
Ответы
Ответ 1
но стоит взять фрукт так сразу происходит какая-то ахинея и правая
сторона уходит на несколько клеточек вправо
Смотрите, у вас когда рисуется змейка заодно рисуются фрукт и пустое пространство,
что странно -- это ведь разные объекты.
...
for k in snake:
if (i == k[1]) and (j == k[0]):
print("G", end='')
elif (i == fruit[0][1]) and (j == fruit[0][0]):
print('*', end='')
else:
print(' ', end='')
...
Поэтому, когда змейка берет фрукт, у змеи становится два блока и тот цикл два раза
прогоняется и получается в два раза больше пространства
Решил другим подходом рисовать поле -- сначала составить матрицу, заполнить ее, а
после отрисовать:
import threading
import random
import os
from pynput import keyboard
from time import sleep
def clear():
if os.name == 'posix':
os.system('clear')
else:
os.system('cls')
def draw():
global score
global snake
board = []
for _ in range(width):
board.append([' ' for _ in range(height)])
# Top
for i in range(width):
board[0][i] = "#"
# Left
for i in range(height):
board[i][0] = "#"
# Right
for i in range(height):
board[i][width - 1] = "#"
# All mid
for i, j in snake:
board[j][i] = 'G'
for i, j in fruit:
board[j][i] = '*'
# Bottom
for i in range(width):
board[height - 1][i] = "#"
clear()
print()
for row in board:
print(''.join(row))
print(f"Total score: {score}")
def keyboard_listener():
with keyboard.Listener(on_release=on_release) as listener:
listener.join()
def on_release(key):
global gameOver
global snake
ka = 0
if key == keyboard.Key.esc:
gameOver = True
if key == keyboard.KeyCode.from_char('w') or key == keyboard.Key.up:
for k in snake:
snake[ka][1] -= 1
ka += 1
if key == keyboard.KeyCode.from_char('s') or key == keyboard.Key.down:
for k in snake:
snake[ka][1] += 1
ka += 1
if key == keyboard.KeyCode.from_char('d') or key == keyboard.Key.right:
for k in snake:
snake[ka][0] += 1
ka += 1
if key == keyboard.KeyCode.from_char('a') or key == keyboard.Key.left:
for k in snake:
snake[ka][0] -= 1
ka += 1
def logic():
global score
global fruit
global snake
print(f'snake={snake} fruit={fruit}')
# Got a fruit
if snake[0][0] == fruit[0][0] and snake[0][1] == fruit[0][1]:
score += 1
snake.append([snake[0][0] - 1, snake[0][1]])
fruit.pop()
if not fruit:
fruit.append((random.randint(1, width - 1),
random.randint(1, height - 1)))
if __name__ == "__main__":
gameOver = False
width = 20
height = 20
snake = [[width // 2 - 1, height // 2 - 1]]
fruit = [(random.randint(1, width - 1), random.randint(1, height - 1))]
score = 0
t_input = threading.Thread(target=keyboard_listener, name='InputThread')
t_input.start()
# Main game
while not gameOver:
draw()
logic()
sleep(0.1)
PS.
Вам нужно будет подумать как движение змейки организовать, пока только голова движется
PPS
Этот код с этим может выдать странный результат
snake = [[width / 2 - 1, height / 2 - 1]]
/ -- это деление с остатком, после него будет вещественное число. Поэтому, нужно
делить через //
Есть класс Person, в нем есть поле name. Я записываю эти данные в Mongo, но на выходе,
хочу получать не записанные по 1-у классы, а все поля name из них, но в List.
Вот код
@RestController
public class Post_Get {
@Autowired
private PersonRepository personRepository;
private List persons = new ArrayList<>();
@PostMapping("api/names")
public void post (@RequestParam("username") String name) {
Person person = new Person(name);
personRepository.save(person);
}
@GetMapping("api/names")
public List get () {
return personRepository.findAll();
}
}
Ответы
Ответ 1
@GetMapping("api/names")
public List getNames() {
return personRepository.findAll()
.stream()
.map(Person::getName)
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
Или без лишней конвертаций
public interface PersonRepository extends Repository {
Stream findByNameNotNull();
}
@GetMapping("api/names")
public List getNames() {
return personRepository.findByNameNotNull()
.map(Person::getName)
.collect(Collectors.toList());
}
Дан список:
list = [220.32, 205.1, 204.6, 203.2, 203.75, 203.25, 203.75, 203.5]
Необходимо сравнить элементы списка друг с другом в цикле и больший элемент
разделить на меньший. Но при этом не присваивать имена каждому элементу списка.
Мой код не дает сделать этого:
for i in list:
if list[i] > list[i + 1]:
a = (list[i] / list[i + 1] )
else:
a = (list[i + 1] / list[i] )
print(a)
Пользоваться библиотеками нельзя.
Выдает исключение:
Traceback (most recent call last): File "", line 2, in
TypeError: list indices must be integers or slices, not
float`
Ответы
Ответ 1
myList = [220.32, 205.1, 204.6, 203.2, 203.75, 203.25, 203.75, 203.5]
[ [myList[i-1]/myList[i] if myList[i-1]>myList[i] else myList[i]/myList[i-1]] for
i in range(1, len(myList)) ]
[[1.0742077035592394], [1.0024437927663734], [1.0068897637795275], [1.0027066929133859],
[1.002460024600246], [1.002460024600246], [1.0012285012285012]]
или так:
for i in range(1, len(myList)):
if myList[i-1]>myList[i]:
a = myList[i-1]/myList[i]
else:
a = myList[i]/myList[i-1]
print(a)
1.0742077035592394
1.0024437927663734
1.0068897637795275
1.0027066929133859
1.002460024600246
1.002460024600246
1.0012285012285012
Ответ 2
# a = [((a / b) if (a > b) else (b / a)) for (a, b) in zip(myList, myList[1:])]
# import operator, itertools
# a = list(itertools.starmap(operator.truediv, map(reversed, map(sorted, zip(myList,
myList[1:])))))
myList = [220.32, 205.1, 204.6, 203.2, 203.75, 203.25, 203.75, 203.5]
a = list(next(i)/next(i) for i in map(iter, map(reversed, map(sorted, zip(myList,
myList[1:])))))
print(a) # [1.0742077035592394, 1.0024437927663734, 1.0068897637795275, 1.0027066929133859,
1.002460024600246, 1.002460024600246, 1.0012285012285012]
Готовлю данные для модели, в частности заполняю пропуски для вещественных признаков
и преобразую категориальные. Исходные данные имеют размерность (40000, 230), из них
первые 190 признаков вещественные, остальные — категориальные.
Подготовим вещественные данные для анализа. Заполним пропуски средним
X_data = pd.DataFrame()
for column in data.columns[:num_of_numerical_vars]:
m1 = data[column].mean()
if np.isnan(m1):
m1 = data[column].notnull().mean()
X_data[column] = data[column].fillna(m1)
Подготовим категориальные признаки. Воспользуемся LabelEncoder в
связке с OneHotEncoder
label_encoder = LabelEncoder()
data_categorical_num = data_categorical.apply(lambda col: label_encoder.fit_transform(col))
hot_encoder = OneHotEncoder(handle_unknown='ignore', sparse=False)
encoded_categorical = hot_encoder.fit_transform(data_categorical_num)
Выводим размерность encoded_categorical
print encoded_categorical.shape
Вывод:
(40000, 143513)
То есть данных довольно много. Подскажите, как в этом случае объединить получившиеся
вещественные и категориальные признаки эффективно? Если написать что–то вроде:
pd_cats = pd.DataFrame(data=encoded_categorical)
X_data = pd.concat([X_data, pd_cats])
То на моем ПК не хватает памяти для данной операции. Как мне кажется, данные можно
объединить как–то без копирования данных.
Данные могут быть загружены отсюда ("small" dataset)
Ответы
Ответ 1
В данном случае стоит использовать разреженные матрицы / фреймы.
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer(sparse_output=True)
WORK_DIR = Path(r'D:\data\927487')
train = pd.read_csv(WORK_DIR / 'orange_small_train.data', sep='\t')
labels = pd.read_csv(WORK_DIR / 'orange_small_train_appetency.labels',
header=None, squeeze=True, dtype='int8')
categorical_cols = train.columns[train.dtypes.eq('object')]
train_cat = train[categorical_cols].copy()
train = pd.SparseDataFrame(train.drop(categorical_cols, axis=1))
train = train.join(
pd.SparseDataFrame(
mlb.fit_transform(
train_cat.T.apply(lambda c: c.dropna()
.str.cat(sep=' ')
.split())),
default_fill_value=0))
Результат:
In [242]: type(train)
Out[242]: pandas.core.sparse.frame.SparseDataFrame
In [243]: train.memory_usage().sum()
Out[243]: 27806864 # NOTE: sparse DF takes only 27 MiB in RAM
In [244]: train.shape
Out[244]: (50000, 71696)
Ответ 2
Несколько слов об обработке столбцов с преимущественно отсутствующими данными...
Если внимательно посмотреть на исходные данные, то можно заметить, что львиная доля
(154) столбцов состоит из NaN на 90+%:
train = pd.read_csv(WORK_DIR / 'orange_small_train.data', sep='\t')
labels = pd.read_csv(WORK_DIR / 'orange_small_train_appetency.labels',
header=None, squeeze=True, dtype='int8')
оценка количества столбцов состоящих преимущественно из NaN:
In [52]: (train.isna().sum() / len(train) > 0.9).sum()
Out[52]: 154
мне кажется стоит попробовать построить регрессионную модель в которой данные столбцы
не будут учавствовать вовсе и сравнить с той моделью, где такие данные заполнены средним
значением (с высокой долей вероятности эти столбцы/признаки не сильно повлияют на результаты
предсказываний):
In [54]: train = train.loc[:, train.isna().sum() / len(train) <= 0.9]
In [55]: train.shape
Out[55]: (50000, 76)
categorical_cols = train.columns[train.dtypes.eq('object')]
train_cat = train[categorical_cols].copy()
# drop categorical cols from the train DF
train = train.drop(categorical_cols, axis=1)
Чтобы заполнить NaN в оставшихся вещественных столбцах можно воспользоваться sklearn.imputer.SimpleImputer.
Кроме того стоит нормализовать данные, чтобы все признаки имели одинаковую шкалу величин
- для этого существует sklearn.preprocessing.StandardScaler:
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
impute = SimpleImputer(strategy='mean')
scale = StandardScaler()
train = pd.SparseDataFrame(
scale.fit_transform(impute.fit_transform(train)),
columns=train.columns,
index=train.index,
default_fill_value=0)
train = train.join(
pd.SparseDataFrame(
mlb.fit_transform(
train_cat.T.apply(lambda c: c.dropna()
.str.cat(sep=' ')
.split())),
default_fill_value=0))
In [82]: train.memory_usage().sum()
Out[82]: 21455996
In [83]: train.shape
Out[83]: (50000, 71542)
In [84]: train.info()
RangeIndex: 50000 entries, 0 to 49999
Columns: 71542 entries, Var6 to 71499
dtypes: float64(42), int32(71500)
memory usage: 20.5 MB
PS также стоит попробовать воспользоваться методом главных компонент (sklearn.decomposition.PCA)
для уменьшения размерности (уменьшить число признаков) выборки и сравнить результаты
регрессии. PCA позволяет значительно уменьшить число признаков, выбрав самые значимые.
Как работает MultilabelBinarizer:
In [104]: mlb = MultiLabelBinarizer()
In [105]: df = pd.DataFrame({
...: 'Col1': [10, 20, 30],
...: 'Col2': [['Apple','Orange','Banana'], ['Apple','Grape'], ['Banana']]
...: })
In [106]: df
Out[106]:
Col1 Col2
0 10 [Apple, Orange, Banana]
1 20 [Apple, Grape]
2 30 [Banana]
In [107]: df.join(pd.DataFrame(mlb.fit_transform(df['Col2']), index=df.index, columns=mlb.classes_))
Out[107]:
Col1 Col2 Apple Banana Grape Orange
0 10 [Apple, Orange, Banana] 1 1 0 1
1 20 [Apple, Grape] 1 0 1 0
2 30 [Banana] 0 1 0 0
я новичок в linux и мне нужно удаленно подключиться к ферме на ubuntu 18.04 TLS.
О варианте с приобретением белого ip знаю, но все же хочу узнать, есть ли бесплатные
способы установить стабильное удаленное соединение на linux, тк ставить буду на ферму
к которой не буду иметь физического доступа долгое время. Интересуют способы как подключиться
и с другого linux, и с windows 8/10. Спасибо!
Ответы
Ответ 1
Если оператор выдаёт белый динамический адрес, то dynamic dns + cron-скрипт на сервере
для обновления записи на DynDNS.
Если оператор не выдаёт белый адрес, а предоставляет доступ в интернет через NAT,
то Remote Port Forwarding SSH Tunnel на/с сервер(а) с белым IP. Как-то так:
Remote Port Forwarding SSH Tunnel (port ABCD):
UbuntuServer -> (Operator->NAT) -> Internet Server
ssh -R ABCD:localhost:10022 user@internet.server
Client (другой Linux / Windows)
ssh user@internet.server:ABCD // эта ssh-сессия будет проброшена на UbuntuServer:10022
При этом SSH-сервер, к которому нужен доступ, должен слушать порт 10022.
Дополняю ответ насчёт SSH Remote Port Forwarding.
Т.к. remote port forward сессия может обрываться/подвисать, надо а) настроить таймауты
для SSH и б) при необходимости перезапускать эту сессию.
Для этого делаем:
скрипт для (пере)запуска RemotePortForwarding-туннеля (для основного Ubuntu-сервера)
- скажем, /opt/scripts/sshtunn.sh:
(апостроф в начале первой строки не нужен)
'#!/usr/bin/env bash
CMD="ssh -f -N tunnel"
PID=`pgrep -f "$CMD"`
if [ -z "$PID" ]; then
$CMD
echo "[$(date '+%Y-%m-%d %H:%M:%S')] SSH tunnel (re)start" >> /tmp/ssh.tunnel.log
fi
исполняет его cron; для этого в /etc/cron.d нужно положить такой файлик:
(< user > - имя пользователя, под которым запускать скрипт)
* * * * * /opt/scripts/sshtunn.sh
Чтобы скрипт нормально сработал (а также, чтобы сессия не подвисала), должна быть
соответствующая настройка в ~/.ssh/config (в домашней директории того самого пользователя,
под которым запускается скрипт):
host tunnel
hostname
user
port 22
identityfile ~/.ssh/keys/tunnel.key
RemoteForward 10222 127.0.0.1:22
TCPKeepAlive yes
ServerAliveInterval 10
ServerAliveCountMax 6
ну и тот самый интернет-сервер должен принимать подключения по ключу ~/.ssh/keys/tunnel.key
Из DataSet выбираю события, которые произошли 2015 году, и хочу записывать тип Primary
Type в словарь, чтобы через class Counter посмотреть самые популярные.
Как правильно добавлять в словарь, а не перезаписывать значения?
import csv
import re
import collections
a = {"Primary Type": set()}
with open("Crimes.csv") as f:
reader = csv.reader(f)
for smt in reader:
if len(re.findall(r"\w+/\w+/2015\b", smt[2])) > 0:
a["Primary Type"] = smt[5]
print(a)
c = collections.Counter(a)
print(c.most_common(3))
Пример того что я получаю на выходе:
{'Primary Type': 'ASSAULT'}
{'Primary Type': 'DECEPTIVE PRACTICE'}
{'Primary Type': 'BURGLARY'}
{'Primary Type': 'DECEPTIVE PRACTICE'}
{'Primary Type': 'HOMICIDE'}
{'Primary Type': 'HOMICIDE'}
{'Primary Type': 'HOMICIDE'}
{'Primary Type': 'HOMICIDE'}
{'Primary Type': 'HOMICIDE'}
[('Primary Type', 'HOMICIDE')] # тут я ожидаю получить HOMICIDE DECEPTIVE PRACTICE и тд.
Ответы
Ответ 1
Поправил, сделал так:
import csv
import re
import collections
m = []
with open("Crimes.csv") as f:
reader = csv.reader(f)
for smt in reader:
if len(re.findall(r"\w+/\w+/2015\b", smt[2])) > 0:
m.append(smt[5])
c = collections.Counter(m)
print(c.most_common(3))
Ответ 2
Модуль Pandas гораздо лучше подходит для решение такого рода задач:
import pandas as pd
# читаем данные из CSV в Pandas DataFrame
filename = r'D:\download\Chicago_Crimes_2012_to_2017.csv'
df = pd.read_csv(filename, index_col=0)
# фильтруем данные - оставляем только 2015 год
df = df[df['Date'].str.contains('\d{2}/\d{2}/2015\s')]
показываем top-5 наиболее часто встречающихся в выборке за 2015г. преступлений:
print(df['Primary Type'].value_counts().head(5))
результат:
THEFT 57292
BATTERY 48904
CRIMINAL DAMAGE 28669
NARCOTICS 23833
OTHER OFFENSE 17534
Name: Primary Type, dtype: int64
тоже самое в виде словаря:
print(df['Primary Type'].value_counts().head(5).to_dict())
результат:
{'THEFT': 57292, 'BATTERY': 48904, 'CRIMINAL DAMAGE': 28669, 'NARCOTICS': 23833,
'OTHER OFFENSE': 17534}
Возможно ли добавить свои файлы в input type=file? Имеется ввиду, что записывается
в value, когда файлы были добавлены? Т.к. мне нужна возможность менять файлы, которые
я буду отправлять (У меня идет drag'n'drop и при drop'e файла я создаю свой массив
в который сохраняю fileList и нужно узнать, что из этого массива пойдет в value).
Ответы
Ответ 1
*Перевод данного ответа
*Это возможно если у вас есть dataTransfer или объект FileList
Раньше, Программное изменение файлов через поле input[type=file] было отключено из
соображений безопасности но это исправлено в современных браузерах.
Firefox, последним из основных браузеров, добавил возможность, позволяющую нам установить
файлы для input полей типа file. Так же согласно W3C тестированию, это осуществимо
в Google Chrome.
Соответствуюзий скриншот и текст из MDN:
Вы можете установить, а также получить значение HTMLInputElement.files во всех
современных браузерах.
Смотри совместимость здесь MDN
В Firefox обсуждениях ошибок и исправлений есть демо которое вы можете посмотреть
И также исходный код если вы хотите это поредактировать. Снизу представлен исполняемый
код из этой ссылки:
let target = document.documentElement;
let body = document.body;
let fileInput = document.querySelector('input');
target.addEventListener('dragover', (e) => {
e.preventDefault();
body.classList.add('dragging');
});
target.addEventListener('dragleave', () => {
body.classList.remove('dragging');
});
target.addEventListener('drop', (e) => {
e.preventDefault();
body.classList.remove('dragging');
fileInput.files = e.dataTransfer.files;
});
body {
font-family: Roboto, sans-serif;
}
body.dragging::before {
content: "Drop the file(s) anywhere on this page";
position: fixed;
left: 0; width: 100%;
top: 0; height: 100%;
display: flex;
justify-content: center;
align-items: center;
font-size: 1.5em;
background-color: rgba(255, 255, 0, .3);
pointer-events: none;
}
button, input {
font-family: inherit;
}
a {
color: blue;
}
JS Bin
Drag and drop files into file input
Supported in WebKit
and Blink. To test, drag and drop one or more files from your operating system
onto this page.
Важно:
Вы можете сделать это только если у вас есть объект FileList или dataTransfer который
вы можете установить для элемента входного файла(так как метод не принимает строки
в виде обычно текста).
Для больше информации смотрите здесь: How to set File objects and length property
at FileList object where the files are also reflected at FormData object?
Небольшой пример как установить значение для input после того как файл будет сброшен:
document.querySelector('.селектор-вашего-поля-для-дропа')
.addEventListener('drop', (ev) => {
ev.preventDefault();
document.querySelector('.селектор-вашего-input-елемента').files = ev.dataTransfer.files;
});
Суть лицензии в том что просто нужно вставить письмо.
В игре есть пользовательское соглашение и политика конфиденциальности. Также нажав
на правую кнопку перейти в папку source , можно посмотреть код игры, там можно указать
этот текст в текстовом файле.
А какое наказание может быть если эту лицензию не соблюсти?
Ответы
Ответ 1
Разместите ссылку рядом со ссылками на пользовательское соглашение, и прям так и
назовите "Лицензия MIT".
А какое наказание может быть если эту лицензию не соблюсти?
Такое же как и за любую другую: запрет на использование и компенсация судебных издержек
правообладателя. Возмещение убытка в данном случае не грозит, т.к. код и так предоставляется
бесплатно.
Сделал небольшой редактор изображений для изучения возможностей vuex с состояниями.
Никто не хочет в рамках инспекции кода высказать свои замечания к написанному?
Файл components/Main.vue
Mode: {{ $store.state.currentMode }}
X: {{ $store.state.cursor.X }}
Y: {{ $store.state.cursor.Y }}
Файл store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const ModeEnum = Object.freeze({
"PointerTool": "Pointer",
"LineTool": "Line (click canvas to choose start point)",
"LineToolStartPoint": "Line (click canvas to choose finish point)",
"CircleTool": "Circle (click canvas to choose center)",
"CircleToolCenterPoint": "Circle (choose radius)",
"RectangleTool": "Rectangle (click canvas to set top left corner)",
"RectangleToolTopLeftCorner": "Rectangle (click canvas to set bottom right corner)",
});
const state = {
cursor: {
X: 0,
Y: 0,
},
temporaryPoint: {
X: 0,
Y: 0,
},
currentMode: ModeEnum.PointerTool,
}
const mutations = {
coord(state, pos) {
state.cursor.X = pos.X;
state.cursor.Y = pos.Y;
},
setMode(state, mode) {
state.currentMode = mode;
},
savePointCoordinates(state, pos) {
state.temporaryPoint.X = pos.X;
state.temporaryPoint.Y = pos.Y;
},
drawLine(state, pos) {
var canvas = document.getElementById("cnv");
var context = canvas.getContext("2d");
context.beginPath();
context.moveTo(state.temporaryPoint.X, state.temporaryPoint.Y);
context.lineTo(pos.X, pos.Y);
context.stroke();
},
drawCircle(state, pos) {
var canvas = document.getElementById("cnv");
var context = canvas.getContext("2d");
context.beginPath();
var radius = Math.sqrt((state.temporaryPoint.X - pos.X) * (state.temporaryPoint.X
- pos.X) + (state.temporaryPoint.Y - pos.Y) * (state.temporaryPoint.Y - pos.Y));
context.arc(state.temporaryPoint.X, state.temporaryPoint.Y, radius, 0, Math.PI
* 2, false);
context.strokeStyle = "red";
context.stroke();
},
drawRectangle(state, pos) {
var canvas = document.getElementById("cnv");
var context = canvas.getContext("2d");
context.beginPath();
context.rect(state.temporaryPoint.X, state.temporaryPoint.Y, pos.X, pos.Y);
context.stroke();
},
}
const actions = {
coord({
commit
}, event) {
var canvas = document.getElementById("cnv");
var rect = canvas.getBoundingClientRect();
var pos = {
X: event.clientX - rect.left,
Y: event.clientY - rect.top,
};
commit('coord', pos);
},
setPointerMode: ({
commit
}) => commit('setMode', ModeEnum.PointerTool),
setLineMode: ({
commit
}) => commit('setMode', ModeEnum.LineTool),
setCircleMode: ({
commit
}) => commit('setMode', ModeEnum.CircleTool),
setRectangleMode: ({
commit
}) => commit('setMode', ModeEnum.RectangleTool),
canvas_left_click({
commit
}, event) {
var canvas = document.getElementById("cnv");
var rect = canvas.getBoundingClientRect();
var pos = {
X: event.clientX - rect.left,
Y: event.clientY - rect.top,
};
switch (state.currentMode) {
case ModeEnum.PointerTool:
console.log('Current state is: ' + state.currentMode);
break;
case ModeEnum.LineTool:
commit('savePointCoordinates', pos);
commit('setMode', ModeEnum.LineToolStartPoint);
break;
case ModeEnum.LineToolStartPoint:
commit('drawLine', pos);
commit('setMode', ModeEnum.LineTool);
break;
case ModeEnum.CircleTool:
commit('savePointCoordinates', pos);
commit('setMode', ModeEnum.CircleToolCenterPoint);
break;
case ModeEnum.CircleToolCenterPoint:
commit('drawCircle', pos);
commit('setMode', ModeEnum.CircleTool);
break;
case ModeEnum.RectangleTool:
commit('savePointCoordinates', pos);
commit('setMode', ModeEnum.RectangleToolTopLeftCorner);
break;
case ModeEnum.RectangleToolTopLeftCorner:
commit('drawRectangle', pos);
commit('setMode', ModeEnum.RectangleTool);
break;
default:
break;
}
},
destroy() {
var main = document.getElementById("cnv");
main.ctx = main.getContext("2d");
main.ctx.clearRect(0, 0, 600, 300);
},
}
const getters = {}
export default new Vuex.Store({
state,
getters,
actions,
mutations
})
Мои собственные заметки:
мне не нравится, что объект canvas фактически не является состоянием. Фактически
приходящие команды рисования изменяют его состояние, верно? Тогда можно было бы вынести
процедуру получения контекста
нормально ли сохранять промежуточные клики (промежуточные переменные между событиями)
во временную переменную, возможно есть какой-то более изящный способ?
Ответы
Ответ 1
Store предназначен только для хранения данных, которые нужны нескольким компонентам.
Все, что касается только лишь одного компонента, должно находиться в компонента. Т.е.,
все методы, которые касаются отрисовки, я бы перенес непосредственно в компонент. Context,
соответственно тоже может храниться в компоненте, и тогда не будет необходимости получать
его каждый раз.
Actions - предназначены для асинхронной работы с хранилищем. Те методы, которые используются
у Вас в actions этому не соответствуют. Поэтому я бы их тоже перенес в компонент.
Хотя... при работе с canvas, огромные функции, которые управляют холстом я выношу
в отдельные файлы и просто импортирую их в компонент.
Что касается моделуй в Store, то у меня это выглядит так:
файл modules/index.js
import person from './person';
import preview from './preview';
import grid from './grid';
import header from './header';
import bigData from './bigData';
import loading from './loading';
export default {
person,
preview,
grid,
header,
bigData,
loading,
};
файл index.js
import Vue from 'vue';
import Vuex from 'vuex';
import modules from './modules';
Vue.use(Vuex);
const store = new Vuex.Store({
modules,
});
export default store;
как пример, modules/loading.js Модуль отвечает за отображание лоадера при запросах
на сервер.
const loading = {
state: {
isLoading: false,
},
mutations: {
SHOW_LOADING: state => {
state.isLoading = true;
},
HIDE_LOADING: state => {
state.isLoading = false;
},
},
};
export default loading;
Но Vue очень гибок, и все что я сказал - это только лишь моя практика. Каждый может
делать так, как ему будет удобно.
Я использую компиляторы MinGW и не могу понять, в чем разница между названными функциями.
Попытался разобраться в комментариях заголовочных файлов MinGW, но смысл там написанного
от меня ускользает.
Например, использование Sleep() в MinGW часто приводит к повреждению кучи/стека,
поэтому рекомендуют использовать _sleep().
Функции _vsnprintf() и vsnprintf() тоже чем-то отличаются?
Ответы
Ответ 1
vsnprintf используется начиная с Visual Studio 2015 и соответствует стандарту C99;
_vnsprintf осталась для обратной совместимости со старыми версиями Visual Studio.
Источник
Мне нужно проверить/убедиться, что текст "(carrier specific)" существует и лежит
в нужном месте.
Я делаю
try: self.assertEqual("(carrier specific)", sel.get_table("//form/fieldset[4]/table.2.1"))
но он никак не хочет "подцепить" этот текст (обращается к пустому полю National prefix,
но не к тексту сразу за ним). Мне нужно как-то определить локейшн этого текста на страничке,
т.е. обратиться к этому элементу через xpath/css.