Страницы

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

вторник, 4 июня 2019 г.

как скрыть блок для мобильных устройств и планшетов

Проблема в следующем: есть блок, который не нужно отображать на телефонах, планшетах. Как это сделать с помощью CSS?? Я понимаю, что вопрос может быть простейшим, но... Заранее благодарю.


Ответ

есть 2 метода
через css
пример
@media screen and (max-width: 600px) { #chto_ne_pozavivat { visibility: hidden; display: none; } }
через js
пример

Зачем придумали RFC5261, если существует XSLT?

RFC5261 - содержит описание формата для XML-патчей. Но в принципе, XSLT ведь тоже позволяет преобразовать один XML-документ в другой? Что помешало им использовать существующий стандарт? Это NIH-синдром?
При помощи XSLT можно выполнять замены: https://stackoverflow.com/questions/5351008/xsltcan-i-update-value-in-xml-node-using-xslt и это не у одного меня такой вопрос - https://stackoverflow.com/questions/1771351/xml-diff-how-to-generate-xml-diff-using-xslt


Ответ

RFC5261(An Extensible Markup Language (XML) Patch Operations Framework Utilizing XML Path Language (XPath) Selectors) - предложенный компанией Nokia декларативный формат на базе XML, созданный прежде всего для использования в HTTP-методе PATCH.
При помощи всего 3-х тегов-операторов, он позволяет приложению задавать инструкции, с помощью которых веб-сервис(REST) должен будет изменить некий документ на сервере.
Обработка этого простого формата занимает буквально пару сотню строчек кода, и при грамотной реализации, он позволяет выполнять сразу множество параллельных изменений в одном документе при обработке множества различных HTTP-запросов PATCH.

XSLT(XSL Transformations) - созданный консорциумом W3C формат на базе XML, предназначенный для описания инструкций по созданию из документов одного формата, документов в формате другом.
Это огромный, тяжело реализуемый формат, предназначенный для решения задач совсем другого рода, а именно - для массовых преобразований XML-документов из одного формата в другой.

Вызов счётчика jquery.countTo.js при попадание в область видимости экрана?

Добрый день. Есть js счётчик чисел jquery.countTo.js. При загрузки страницы он вызывается и сразу запускается, но счётчик находится в средине страницы и при скролле вниз страницы уже не видно того анимационного эффекта. Как сделать чтобы счётчик сработал только когда он попадёт в область видимости экрана?
Вызов счётчика сейчас:
(function ($) {
var o = $('.count');
if (o.length > 0) { include('js/jquery.countTo.js');
$(document).ready(function () { $(o).countTo(); }); } })(jQuery);


Ответ

Всем спасибо за ответы. Немного покумекав и поэкспериментировав, рабочий вариант получился такой:
(function ($) { var o = $('.count'); var cc = 1;
if (o.length > 0) { include('js/jquery.countTo.js');
$(window).scroll(function(){ var targetPos = o.offset().top; var winHeight = $(window).height(); var scrollToElem = targetPos - winHeight; var winScrollTop = $(this).scrollTop();
if (winScrollTop > scrollToElem) { if (cc < 2){
cc = cc + 2; $(document).ready(function () { $(o).countTo(); }); } } }); } })(jQuery);
Проверка
if (cc < 2){ cc = cc + 2; .... }
необходима, что-бы при дальнейшей прокрутке страницы счётчик не вызывался снова.

Выбор записей из таблицы по типу файла

В таблице upload_files содержится путь к фотографиям и текстовым документам. Я делаю выборку для фотографий так:
SELECT * FROM `uploаd_files` WHERE name_pos LIKE '%.jpg' OR (`name_pos` LIKE '%.png' OR `name_pos` LIKE '%.gif') AND `ip_users` = '$link' ORDER BY `name_pos` DESC
И для документов:
SELECT * FROM `upload_files` WHERE name_pos NOT LIKE '%.jpg' OR (`name_pos` NOT LIKE '%.png' OR `name_pos` NOT LIKE '%.gif') AND `ip_users` = '$link' ORDER BY `name_pos` DESC
Но результат получается неверный. Что я делаю неправильно?


Ответ

Ну а для решения проблемы, думаю, надо скобки переставить:
SELECT * FROM `uplod_files` WHERE (`name_pos` LIKE '%.jpg' OR `name_pos` LIKE '%.png' OR `name_pos` LIKE '%.gif') AND `ip_users` = '$link' ORDER BY `name_pos` DESC
и
SELECT * FROM `uplod_files` WHERE NOT (`name_pos` LIKE '%.jpg' OR `name_pos` LIKE '%.png' OR `name_pos` LIKE '%.gif') AND `ip_users` = '$link' ORDER BY `name_pos` DESC
И ещё, я бы исправил WHERE следующим образом:
WHERE RIGHT(`name_pos`, 3) IN ('jpg', 'png', 'gif') AND `ip_users` = '$link'
Ну и соответственно для документов:
WHERE NOT RIGHT(`name_pos`, 3) IN ('jpg', 'png', 'gif') AND `ip_users` = '$link'

Изменение цвета только у одного блока “wrap”

Есть такой вот HTML:

-
0
+

-
0
+

Есть такой код jQuery:
$('.wrap .minus').click(function() { $(this, ".colPrise").css("background","red"); });
Мне нужно, чтобы после click(), изменялся цвет только у одного блока "wrap".


Ответ

Менялся у colPrice?
$('.wrap .minus').click(function() { $(this).closest(".wrap").find(".colPrise").css("background", "red"); });

-
0
+
-
0
+

Присвоение значения переменной при объявлении в классе

Есть класс:
class A { public: static int count;
A() { count++; // При создании каждого объекта эта переменная должна увеличиваться } };
Надо присвоить значение этой переменной 0, до вызова конструктора. Но если это сделать вот так:
static int count = 0;
То компилятор ругается. Как обойтись в такой ситуации?


Ответ

Просто надо правильно определить эту переменную вне класса
class A { public: static int count;
A() { count++; // При создании каждого объекта эта переменная должна увеличиваться } };
//... int A::count = 0;
Вы также можете опустить инициализатор, так как переменная в любом случае будет инициализирована нулем:
int A::count;
Если определение класса помещено в заголовочный файл, то определение статической переменной нужно поместить в один из программных модулей.

Транспонировать матрицу, разбив на блоки

Требуется ускорить транспонирование большой матрицы, элементы размещены в памяти последовательно. Ускорить нужно за счет обработки матрицы блоками, чтобы из кэша необходимые куски памяти не успевали стираться.
Проблема возникла в написании кода самого транспонирования - выполнение затыкается и ничего не работает. Ниже сам кусок кода
void transposematrixblocked(int **src, int **dst, int size) { for (int i = 0; i < size; i + BLOCKSIZE) { for (int j = 0; j < size; j + BLOCKSIZE) { for (int ini = 0; ini < BLOCKSIZE; ini ++) { for (int inj = 0; inj < BLOCKSIZE; inj ++) { dst[i+ini][j+inj] = src[j+inj][i+ini]; } } } } }
где я оплошала и как сделать правильно?


Ответ

В цикле for 3-й параметр должен быть вида i += BLOCKSIZE
void transposematrixblocked(int **src, int **dst, int size) { for (int i = 0; i < size; i += BLOCKSIZE) { for (int j = 0; j < size; j += BLOCKSIZE) { for (int ini = 0; ini < BLOCKSIZE; ini ++) { for (int inj = 0; inj < BLOCKSIZE; inj ++) { dst[i+ini][j+inj] = src[j+inj][i+ini]; } } } } }

Реализация клиент-серверного приложения

Имеется следующая архитектура: клиентская часть(dll-ка на C#) отсылает определенное количество картинок на сервер(либо Windows Service, либо Web Service), где они обрабатываются, а потом отсылается ответ в виде XML файла результатов обработки.
Клиент - это просто автоматизированное приложение, без интерфейса и ввода вывода.
Сервер. На нем крутится движок, использующий многопоточность (с помощью ThreadPool) для обработки картинок. Соответственно, когда обращается новый клиент, сервер создает новый поток, в котором происходит обработка, по окончанию он отсылает ответ пользователю(xml-файл). Нагрузка на сервер планируется не очень большая 3-20 одновременных подключений.
Пока что я не могу понять какая архитектура взаимодействия лучше всего подойдет для моего случая. Есть несколько путей реализации, либо писать асинхронный сервер на сокетах, либо использовать WCF, или просто написать ASP.NET приложение и залить его на IIS(к этому варианту я склоняюсь больше всего).
Какой протокол передачи лучше всего использовать? Хватит ли HTTP для передачи большого количества картинок(тогда можно двигаться в направлении Web Service), или стоит задуматься о TCP/IP(здесь уже WCF)?
Кому интересно, несколько статей по созданию клиент-серверного приложения:
Example with ASYNC/AWAIT
Example with THREADS
Example with SOCKETS


Ответ

HTTP, WCF и голый TCP справляются с заливкой картинок примерно одинаково.
Особенно если учесть, что HTTP работает поверх TCP, а WCF - или поверх HTTP, или с собственным протоколом поверх TCP, в зависимости от настроек биндинга.
Никакой ощутимой разницы между реализациями с точки зрения производительности не будет.
То же самое с типом хостинга - между Self-Hosted и IIS нет практически никакой разницы (не при вашей нагрузке).
Вам стоит использовать то, что вам удобнее в написании и поддержке.

Рассчитать размер прямоугольника с текстом

В делегате func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat я должен высчитать высоту моего текста в UILabel. Какими путями мне это сделать, скажите, пожалуйста?
upd1(к первому комментарию) :
let text = self.posts[indexPath.row]["story"]! as NSString let sizeOfLabel = text.boundingRectWithSize( CGSize(width: <>, height: Int.min), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: ["NSFontAttributeName":UIFont.systemFontOfSize(17)], context: nil)


Ответ

Если я правильно понял, то у Вас проблема с размером UILabel в UITableView. При создании вашей UILabel в методе UITableViewDataSource нужно указать yourLabel.layoutIfNeeded(). Если это не то, опишите проблему точнее

Подшить к 1му массиву непропущенные значения со 2го в R

Основной массив
df1 <- data.frame(id = c(1,2,3,4,5), dig = c(2,3,NA,5,NA), let = c("a",NA,"c","g",NA))
id dig let 1 1 2 a 2 2 3 3 3 NA c 4 4 5 g 5 5 NA
Массив с новыми значениями
df2 <- data.frame(id = c(2,3,5), dig = c(NA,100,200), let = c("letter1",NA,"letter2"))
id dig let 1 2 NA letter1 2 3 100 3 5 200 letter2
Нужно по id подшить непустые значения из df2. То есть, результат должен выглядеть так:
id dig let 1 1 2 a 2 2 3 letter1 3 3 100 c 4 4 5 g 5 5 200 letter2


Ответ

repl <- which(is.na(df1[1:3, ]), arr.ind=T) df1[repl] <- df2[repl]
Главное - размерности таблиц (исходной и со значениями на замену) должны совпадать, тут я вручную укоротил df1. UPD Более универсальный вариант от автора вопроса:
repl <- which(is.na(df1[df1$id %in% df2$id, ]), arr.ind=T) df1[df1$id %in% df2$id, ][repl] <- df2[repl]

Транзакции в коде

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


Ответ

Попробуйте написать ваш код в стиле «опасные изменения — безопасный коммит» + иммутабельность.
// изменения локальные корабли' = создать корабли с дефолтными координатами и включённым щитом(); локальный космос' = космос.ДобавитьКораблиИВернутьНовыйКосмос(корабли'); ... локальные противники' = обнаружить противников в (космос');
// безопасный коммит космос = космос' противники = противники'
Если какая-то часть из изменений вылетит — она затрагивает лишь локальные объекты, которые съест garbage collector или RAII.

Если все объекты у вас иммутабельны, то новый локальный космос — не расходная штука: он делит большую часть своих объектов со старым космосом.

Разбить строку результата на две в MS SQL

Подскажите решение вот такой вот смарт-задачки: имеем результат выборки

В результате появляется строка, где в двух колонках и FixHours, и AddHours есть значения не равные нулю:
FixHours = 0,5 AddHours = 1,5 CalculatedValue = 16.5
Как ее можно разделить на две, чтобы получить строки:
FixHours = 0,5 AddHours = 0 CalculatedValue = 16.5
FixHours = 0 AddHours = 1,5 CalculatedValue = 16.5
Была идея находить только эту строку, затем искусственно создавать вторую с помощью Union. Но она провалилась, т.к. такие строки в таблице встречаются не один раз. В общем, any ideas?


Ответ

Если порядок не важен, то:
WITH SourceData AS ( SELECT FixHours, AddHours, CalculatedValue FROM SomeTable --тут ваша выборка ) SELECT FixHours, 0, CalculatedValue FROM SourceData WHERE FixHours <> 0 UNION ALL SELECT 0, AddHours, CalculatedValue FROM SourceData WHERE AddHours <> 0 UNION ALL SELECT 0, 0, CalculatedValue FROM SourceData WHERE FixHours = 0 AND AddHours = 0
Если важен - то нужно добавлять rownumber в SourceData, и сортировать результат union по нему.

Смена адреса iframe

После успешной отправки Ajax-запроса в функции success() нужно поменять адрес в
HTML:

JS:
success: function(data) { var new_page = "./news/news.html"; //$('#result').html(); }


Ответ

success: function(data) { var new_page = "./news/news.html"; $('#result').attr('src', new_page); }

Долгие задачи в IIS сервер

Есть задача разработать сервис для рассылки почты, которым будут пользоваться остальные сервисы/приложения/сайты внутри компании. Планирую сделать WEB-сервис. Схема примерно такая:
есть паблик метод который принимает на вход что рассылать и кому. метод получает пачку задач. Метод порождает поток, который берет задачи и рассылает потихонечку. Сам метод продолжает ожидать новых задач.
Есть минимум 2 проблемы:
До этого я всегда размещал сервисы в IIS. Однако, при наших объемах расылки, мы теоретически можем получить задачу которая будет длится часы. Насколько я понимаю IIS может сам прерывать задачи, которые длятся долгое время. Как мне этого избежать? Сервис работает в контексте IIS. Думаю (но не уверен), что реально мой метод будет не порождать потоки, а резервировать существующие внутри пула потоков IIS. Итого мы можем в результате залочить все потоки и полностью заблокировать сервис.
Какой наиболее простой выход из этой ситуации? Возможно, мне стоит использовать SelfHosting WCF?


Ответ

Нет, проблем с прерыванием задач не будет. Просто потому что у вас задача в отдельном потоке - IIS прерывает только те задачи, которые он запускал сам.
Кстати, без отдельного потока он бы тоже не стал прибивать задачу - WCF служба неподвластна IIS, даже если использует его для активации.
Если вы создаете поток через new Thread - то это будет именно отдельный поток, не имеющий никакого отношения к пулу IIS. В других случаях - да, такая проблема присутствует (кстати, у WCF и IIS тоже общие пулы).
Способы "украсть" поток из общего пула:
delegate.BeginInvoke ThreadPool.QueueUserWorkItem new Task BackgroundWorker Просто синхронная работа в операции WCF
и еще куча более редких способов.
Способы щадящей работы с общим пулом потоков:
new Thread Использование асинхронных методов (они будут выполняться в общем пуле - но не будут занимать его надолго).

На самом деле, проблемы вы ищите немного не там. Дело в том, что долгие операции рано или поздно захочется сделать еще и возобновляемыми, чтобы можно было, к примеру, выключить сервер для установки обновлений или для переезда на другой сервер - а потом продолжить все то, что не успело выполниться.
Отдельную службу можно настроить, чтобы она запускалась автоматически. А сайт IIS - нет. Когда перед вами встанет такая задача - переход на SelfHosting WCF будет хорошим решением.

Статическое внедрение dll в сборку

Нужно при старте Win-приложения загружать dll, но делать это необходимо изнутри сборки (именно потому статическая загрузка)!
Частичное решение уже есть: https://stackoverflow.com/questions/23971418/c-sharp-embed-dll-in-exe-filenotfoundexception
Но, что и закономерно, в моем случае также вылетает это же исключение:
An unhandled exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll Additional information: Не удалось загрузить файл или сборку "SevenZipSharp, Version=0.64.3890.29348, Culture=neutral, PublicKeyToken=20de82c62b055c88" либо одну из их зависимостей. Не удается найти указанный файл.
Пробовал добавлять эту dll и через ресурсы (тогда программа даже отказывается стартовать из-за того, что не находит в нужном месте эту dll, а именно в папке "bin/Debug/...") и через "Сборка - Add - Existing Item..." (так стартует, но до загрузки формы получаю вышеописанное исключение).
Код, находящийся в файле Program.cs, имеет вид (практически идентичен тому, который рассматривается по ссылке и оставлен без ответа; также я пробовал изменять его, следуя указаниям из различных источников):
namespace WindowsFormsApplication1 { static class Program { [STAThread] static void Main() { AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); }
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { string assemblyName = args.Name.Split(',').First(); using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("WindowsFormsApplication1." + assemblyName + ".dll")) { byte[] assemblyData = new byte[stream.Length]; stream.Read(assemblyData, 0, assemblyData.Length); return Assembly.Load(assemblyData); } } } }
Также пробовал в свойствах dll (добавленной через "Existing Item...") выбирать различные варианты "Build Action". Результат отрицательный.
Также вариант с программой ILMerge (http://habrahabr.ru/post/126089/) не подходит.
Как указать системе, что я хочу обратиться и загрузить dll по пути изнутри сборки, а не извне?


Ответ

Вот полные шаги:
Добавить SevenZipSharp.dll в проект через Add Existing Item, выставить Build Type = Embedded Resource Добавить SevenZipSharp.dll в References. Выставить у референса Copy Local = false - чтобы избежать копирования в bin. Упомнятуть класс где-то в Form_Load (чтобы произошла попытка подгрузки dll) - у вас это явно сделано:
private void Form1_Load(object sender, EventArgs e) { SevenZip.SevenZipCompressor c = new SevenZip.SevenZipCompressor(); } Аккуратно обработать CurrentDomain_AssemblyResolve
using System; using System.Reflection; using System.Windows.Forms;
namespace WindowsFormsApplication7 { static class Program { [STAThread] static void Main() { AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); }
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { var assemblyName = new AssemblyName(args.Name).Name; if (assemblyName == "SevenZipSharp") { using (var stream = typeof(Program).Assembly.GetManifestResourceStream( "WindowsFormsApplication7." + assemblyName + ".dll")) { byte[] assemblyData = new byte[stream.Length]; stream.Read(assemblyData, 0, assemblyData.Length); return Assembly.Load(assemblyData); } } else { return null; } } } }
Это минимальный рабочий пример. Если не работает - запускайте под отладчиком. Скорее всего вы не угадали с именем ресурса, и GetManifestResourceStream возвращает null. Убедитесь, что тип у айтема выставлен именно в Embedded Resource (а не просто в Resource). Просмотреть имена всех доступных ресурсов можно прямо в отладчике, вызовом
typeof(Program).Assembly.GetManifestResourceNames()
Проект целиком на гитхабе: https://github.com/PashaPash/SevenZipSharp-Embedded

Pycharm перестал видеть список управления модулями( pip, pip3)

Pycharm перестал видеть список управления модулями(pip, pip3) и не видит обновлени и не устанавливает не чего вот такая беда
os (Ubuntu 15.04)


Ответ

Друзья, коллеги, разобрался сам ,
Дело в том, что при обновлении с Pycharm 4.5.3 на 4.5.4, не обновился ssl для Java. Лог ругался как-то так:
Caused by: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty at sun.security.validator.PKIXValidator.(PKIXValidator.java:90)
Обновил так:
sudo update-ca-certificates -f
А для гарантии так:
sudo apt-get install --reinstall ca-certificates-java
И всё заработало. Всем Спасибо.

Ошибка выполнения при удалении элемента контейнера в цикле

Код собирается нормально но при выполнении получаю ошибку доступа:
#include #include #include
using namespace std;
int main(){ vector v;
v.push_back("-"); v.push_back("+"); v.push_back("-");
auto it = v.begin();
for (it; it != v.end(); it++) if (*it == "+"){ v.erase(it); // сдесь ошибка выполнения }
return 0; }


Ответ

После удаления элемента итераторы становятся не валидными. Правильно будет написать следующим образом (я заменил цикл for на while, так как вы итератор it объявили вне цикла, и цикл while в этом случае смотрится лучше. Хотя лучше использовать цикл for с объявлением итератора внутри цикла)
while ( it != v.end() ) if (*it == "+"){ it = v.erase(it); } else { ++it; }
Общий подход для такой задачи пишется в одну строчку
#include #include #include
//...
v.erase( std::remove( v.begin(), v.end(), "+" ), v.end() );
Если хотите удалить только один элемент, то можно записать следующим образом:
auto it = std::find( v.begin(), v.end(), "+" );
if ( it != v.end() ) v.erase( it );

Создать координатную сетку на Canvas

Есть Canvas. На него можно дропать изображения. Потом их двигать, изменять размеры и т.д. Вопрос. Как наилучшим образом создать и отобразить на Canvas сетку, размерами скажем 10 на 10 точек? И как потом к ней сделать "прилипание" расположенных на canvas контролов? При условии что:
свойство Background канвы занято цветом фона (что логично), и кисть туда не положишь. С DrawingBrush вообще проблемы, в том плане что на стареньком железе, на win XP, сетка нарисованная через DrawingBrush, не хочет рисоваться. А надо. На более современных компьютерах рисуется.
Уточняю по просьбам трудящихся. Нужен наиболее оптимальный способ (алгоритм) создать нарисованную сетку на элементе Canvas с использованием net3.5. И способ осуществить прилипание элементов канвы к ней. Я считал что простая отрисовка линий на канве будет подтормаживать.


Ответ

Если вам нужна сетка переменного размера, подпишитесь на изменение размеров Canvas'а и рисуйте вручную:


public YourControlConstructor() { InitializeComponent(); UpdateBackPattern(null, null); }
void UpdateBackPattern(object sender, SizeChangedEventArgs e) { var w = Background.ActualWidth; var h = Background.ActualHeight;
Background.Children.Clear(); for (int x = 10; x < w; x += 10) AddLineToBackground(x, 0, x, h); for (int y = 10; y < h; y += 10) AddLineToBackground(0, y, w, y); }
void AddLineToBackground(double x1, double y1, double x2, double y2) { var line = new Line() { X1 = x1, Y1 = y1, X2 = x2, Y2 = y2, Stroke = Brushes.Black, StrokeThickness = 1, SnapsToDevicePixels = true }; line.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased); Background.Children.Add(line); }
Для «прилипания» вам нужно проверять координаты перемещаемого объекта, и если они близки к сетке (то есть, x % <шаг сетки> < <расстояние прилипания> или x % <шаг сетки> > <шаг сетки> - <расстояние прилипания>) приводить его координату к кратной размеру сетки.

Как загрузить grub2 через pxe?

Есть ли способ подгрузить на машину grub2 через pxe, по типу того, как подгружается pxelinux?


Ответ

Необходимо создать загрузочный образ grub2 для pxe. Пример:
grub-mkimage -c grub.cfg -d /usr/local/lib/grub/i386-pc --format=i386-pc-pxe \ -o /tftpboot/grub.pxe pxe pxechain tftp http net \ part_bsd part_gpt part_msdos boot biosdisk ext2 xfs lvm drivemap \ gzio xzio lzopio cpio \ loopback linux iso9660 udf memdisk chain \ minicmd extcmd \ ahci ehci ohci uhci \ acpi lsacpi pci setpci reboot halt \ help echo gfxmenu gfxterm font date configfile ls search vga vbe png video videoinfo loadenv
grub.cfg - файл конфигурации загрузчика
Настройка DHCP и tftpd стандартно для любой аналогичной PXE загрузки

Изменение изображения при прокрутке

Как можно реализовать вот такую штуку: на сайте http://ginza.ru/msk в самом низу после "еще новости" - при прокрутке страницы изображение тоже прокручивается?


Ответ

Можно открыть страницу в developer tools и посмотреть:
.row-header-main-footer-picture { background-image: url([путь-к-картинке]); background-position: 50% 50%; background-attachment: fixed; background-size: cover; }
как видите фоновая картинка сделана с background-attachment: fixed;. Это заставляет картинку "стоять на месте" при прокрутке страницы. А сверху на нее наложены два блока, один с прозрачным фоном (тот, где дата-лого-телефон), второй с белым фоном (заказать доставка-поделитесь отзывом). Но главное- фон стоит на месте при прокрутке.
Еще раз - воспользуйтесь developer tools любого браузера.

Ввод Readline ограничен 266 символами. Как исправить

Использую для консоли следующий код (С#)
Console.Write("Код гугл "); string google_map = Console.ReadLine();
Нужно ввести код карты Google, он достаточно длинный и не влазит((( Очень долго искал ответ. Пожалуйста помогите


Ответ

Это, как оказалось, ограничение консоли
Попробуйте такой метод:
var bufsize = 320; Stream stream = Console.OpenStandardInput(bufsize); TextReader inReader = (stream == Stream.Null) ? StreamReader.Null : TextReader.Synchronized( new StreamReader(stream, Console.InputEncoding, false, bufsize, true)); Console.SetIn(inReader);
Выставьте размер буфера сколько нужно.
Код честно подсмотрен ILSpy'ем в методе Console.In
Реальное ограничение — 254 символа: 256 байт размер буфера, плюс два байта резервируется под CRLF. Аналогично в случае ручной установки bufsize реальный размер будет на два байта меньше.
В реальности, сделать буфер меньше, чем 256, у меня не получилось.

Если вы захотите правильно обрабатывать символы других языков и выставите Console.InputEncoding = Encoding.Unicode;, не забывайте, что ваш буфер будет расходовать по два байта на символ. Если вы, например, установите размер буфера в 320, то это даст всего лишь 160 юникодных символов (и будет поднято автоматически до 256).

Функция memset_word делает пропуск между словами

Пока писал учебную ОС, пришлось в качестве одной из функций стандартной библиотеки написать функцию memset_word. Проблема была тут же решена "в лоб":
void memset_word(uint16_t* mem, uint16_t value, size_t count) { uint16_t* addr; for(addr = mem; addr < mem + count * sizeof(uint16_t); addr += sizeof(uint16_t)) { *addr = value; } }
Но у этой функции было обнаружено неприятное свойство: она записывает слова через одно. Другими словами, память была такая:
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
а после вызова
memset((uint16_t*) 0, 0xCDAB, 3)
стала такая:
AB CD 00 00 AB CD 00 00 AB CD 00 00 00 00 00 00 00 00 00 00
хотя должна была стать такой:
AB CD AB CD AB CD 00 00 00 00 00 00 00 00 00 00 00 00 00 00
В принципе, помогает замена addr += sizeof(uint16_t) на addr++, но я не понимаю: ведь указатели в C - настоящие адреса, так почему же для того, чтобы перейти к следующему слову, нужно прибавлять 1, а не размер слова? Или же ошибка кроется где-то в коде функции? Прошу объяснить мне это.


Ответ

У вас эта функция
void memset_word(uint16_t* mem, uint16_t value, size_t count) { uint16_t* addr; for(addr = mem; addr < mem + count * sizeof(uint16_t); addr += sizeof(uint16_t)) { *addr = value; } }
некорректная. В ней неправильно используется арифметика указателей.
Я думаю, вы имели в виду следующее
void memset_word(uint16_t* mem, uint16_t value, size_t count) { for(uint16_t *addr = mem; addr != mem + count; ++addr ) *addr = value; } }
Вы должны перейти к следующему объекту. Увеличение указателя на 1 увеличивает его адрес на sizeof( uint16_t )
В этом состоит принцип работы оператора индексирования, когда вы пишите, например,
mem[1]
что эквивалентно выражению *(mem + 1) и в виду коммутативности операции сложения вы можете также записать
1[mem]

Определить, какие ключевые слова языка Java содержит файл

Нагуглил только contains, но он почему-то не работает.. видимо делаю что-то не так
keyWords - ArrayList
sortingList тоже, я так понимаю нужно каким-то образом сравнить все слова в файле со списком моих слов, а как чет не доходит
for (int i = 0; i < 50; i++) { if (sortingList.get(index).contains(keyWords.get(i))) { counter++; } }
Ответ ниже помог, но теперь проблема с повторяющимися словами. они не учитываются
for (String st : keyWords) { for (String g : sortingList) { if (st.contains(g) && g.length() > 1) {
sortedList.add(g); counter++; } } }


Ответ

Если честно я не совсем понял вопроса. Вы хотите в увеличивать counter за каждое совпадение слов? Если да, то лучше воспользоваться циклом for-each и сделать вот так.
for (String s : keyWords) { for (String g : sortingList) { if (s.contains(g)) { counter++; } } }

Killer-sequence для Quick Sort

Имеется код для Quick-Sort, представленный ниже. Здесь пивотом будет являться серединный элемент. А как построить пример, при котором данная сортировка будет работать за O(n^2)? Нашёл лишь статью http://www.cs.dartmouth.edu/~doug/mdmspe.pdf, но не разобрался, так как плохо владею английским. Можно ли ещё прикрепить пример кода, который будет генерировать killer-sequence за O(n)?
void qsort(int *a,int l,int r) { if(l>=r) return; int x = a[(l+r)/2]; int i = l,j = r; while(i<=j){ while(a[i] < x) ++i; while(a[j] > x) --j; if(i<=j){ swap(a[i],a[j]); ++i,--j; } } qsort(a,l,j); qsort(a,i,r); }


Ответ

Эх, тряхнём стариной :) Давайте-ка протрассируем индексы назад. Получается вот что:
void prepare_killer(int* a, int length) { int origidx[length]; for (int i = 0; i < length; i++) origidx[i] = i;
// эмулируем прохождение qsort по плохому пути // r будет всё время константой int r = length - 1;
// а l будет каждый раз увеличиваться на 1 for (int l = 0; l < r; l++) { // так будет выбран pivot: int p = (l + r) / 2;
// элементы с индексами l и p поменяются местами swap(origidx[l], origidx[p]); }
// имея позиции, куда придут данные, можно теперь их расставить: for (int i = 0; i < length; i++) a[origidx[i]] = i + 1; }
Для проверки напишем модифицированную версию qsort, которая будет проверять, что данные отправляют её всё время по «плохому» пути: одно из двух подзаданий будет всегда пустым.
bool qsort_check_failed = false;
void qsort_with_check(int *a, int l, int r) { if (l >= r) return; int x = a[(l + r) / 2]; int i = l, j = r; while (i <= j) { while (a[i] < x) ++i; while (a[j] > x) --j; if (i <= j) { swap(a[i], a[j]); ++i, --j; } }
if (!(l >= j)) { cout << "Mistake: have non-empty first subtask!" << endl; qsort_check_failed = true; } qsort_with_check(a, l, j); qsort_with_check(a, i, r); }
Проверка здесь: http://ideone.com/a9L22p

Авторизация пользователя vk с помощью cURL (PHP)

Добрый день.
Необходимо авторизировать пользователя vk с помощью PHP скрипта и библиотеки cURL. Были рассмотрены следующие решения:
https://forum.antichat.ru/threads/426901/ http://sauron.org.ua/post/938
На основе решений были составлены следующие скрипты.
Получение значений lg_h и ip_h (работает, получает):
$url = 'http://vk.com'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)"); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'content-type: application/x-www-form-urlencoded', 'origin: http://vk.com', 'referer: http://vk.com/', )); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$content = curl_exec($ch);
preg_match_all("/name=\"ip_h\" value=\"(.*?)\" \\//s", $content, $ip_h); preg_match_all("/name=\"lg_h\" value=\"(.*?)\" \\//s", $content, $lg_h);
Отправка запроса авторизации вида:
http://login.vk.com/? act=login& role=al_frame& _origin=http://vk.com& ip_h=$ip_h& lg_h=$lg_h& email=& pass=
Сам скрипт:
$url = 'http://login.vk.com/?act=login'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0"); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //curl_setopt($ch, CURLOPT_VERBOSE, 1); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_POST, true);
$data = array( 'act' => 'login', 'role' => 'al_frame', '_origin' => 'http://vk.com', 'ip_h' => $ip_h[0][1][0], 'lg_h' => $lg_h[0][1][0], 'email' => '', 'pass' => '' );
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'content-type: application/x-www-form-urlencoded', 'origin: http://vk.com', 'referer: http://vk.com/', ));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_COOKIEJAR, '/home//Development/vk/cookie.txt'); curl_setopt($ch, CURLOPT_COOKIEFILE, '/home//Development/vk/cookie.txt');
echo curl_exec($ch);
На выходе получаю следующее содержимое страницы:

В свою очередь куки принимают следующие значения:
Set-Cookie: remixmid=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com Set-Cookie: remixsid=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com Set-Cookie: remixsid6=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com Set-Cookie: remixgid=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com Set-Cookie: remixemail=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com Set-Cookie: remixpass=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com Set-Cookie: remixapi_sid=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com Set-Cookie: remixpermit=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com Set-Cookie: remixsslsid=DELETED; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain=.vk.com
Смею предположить, что не удается передать значение email, т.к. в коде JS именно на это и ошибка. При ручном составлении URL и перехода по нему — успешное возвращение хэша и содержимое страницы следующее:

Авторизация проходит успешно. После доступен профиль пользователя.


Ответ

Только что написал рабочий код авторизации во ВКонтакте — http://pastebin.com/5YecKuUs
Только учтите, каптча не поддерживается, поэтому сами уже её добавьте.
Тест успешно пройден на моём тестовом аккаунте ;)

Как прочитать очень большой текстовый файл?

Имеется текстовый файл содержащий всего одну строку, но размер файла 1 Гб. Каким образом прочитать файл целиком? File.ReadAllLines, File.ReadLines, File.ReadAllText завершаются с ошибкой о недостаточности памяти. На выходе нужно получить строку (объект типа string) с содержимым из файла. Файл одно строчный, но строка очень длинная.


Ответ

Нашел подробное описание причин этой ошибки вот здесь: ссылка. Всем спасибо за помощь, в данный момент использую такой код:
char[] buffer = new char[104857600]; string text = ""; FileStream fstream = new FileStream("document.txt", FileMode.Open, FileAccess.Read); using (var sr = new StreamReader(fstream)) { int bytesRead = 0; while ((bytesRead = sr.Read(buffer, 0, buffer.Length)) > 0) { text = new string(buffer); // обработка текста } }

Неравномерное движения объекта в Unity при помощи velocity

При перемещении физического объекта (Rigidbody) в Unity3d происходят некоторые рывки. Пытался изменить значение timeStep, но это мало чем помогло. Объекты начали двигаться плавнее, но при этом рывки сохранились. Как решить эту проблему?
Способы которые я пробовал:
Перемещал объект при помощи transform.Translate() (плохая идея, я знаю) Перемещал объект при помощи transform.postion = Vector3.Lerp() (идея ещё хуже)
Остановился на velocity. Рывки во всех случаях остались.


Ответ

Объект у вас с кинематикой(у Rigidbody признак IsKinematic) или динамический?
Если двигаете в физике динамический объект то прикладывают силу чтобы заставить объект двигаться плавно по законам физики(например Rigidbody.AddForce).
Если объект кинематика, то бишь вы управляете им из кода, то движение нужно рассчитывать самостоятельно через один из тех способов что вы описываете. Только надо принимать в расчет две вещи: где вы его вызываете и сколько времени прошло между вызовами. Так если вы меняете в Update() то учитываем Time.deltaTime(время между кадрами отрисовки) для того чтобы определить на сколько за кадр сдвинуть объект. А если вызываете в методе FixedUpdate() то используем время Time.fixedDeltaTime(время между расчетами отдельных итераций по физике) чтобы скорректировать движение объекта.
Кстати мы проводили эксперименты, вызов между FixedUpdate() выполняется не совсем по времени заданном в настройках TimeManager для Fixed Timestep. Все зависит от железа и тактовой частоты процессора. Если скажем компьютер делает расчеты с частотой 0.035 с, а Fixed Timestep выставлен 0.012 с, то между первыми двумя тактами вызов FixedUpdate() будет сделан дважды, причем выполняться они будут друг за другом без всякого перерыва. На следующем такте будет три вызова и т.д.

Наложение цветов, C#

У меня есть два изображения - А и Б, которые я хотел бы сложить.
Причем они должны складываться таким образом, чтобы получилось как "слои" в фотошопе/паинтнете - то есть изображение А позади изображения Б.
Беда в том, что в изображении Б используется прозрачность.
Как следствие пиксель должен трансформировать по какой то формуле, но я не смог вычислить самостоятельно как именно.
Если у изображения Б пиксель прозрачен, то мы юзаем пиксель А
Если у изображения Б пиксель сплошной, то мы юзаем пиксель Б
А как мы получаем пиксель например с половиной прозрачности?


Ответ

Почему бы не так: если alpha — прозрачность пикселя верхней картинки, то результирующий пиксель есть средневзвешенное пикселя верхней картинки с весом alpha, и нижней с весом (1 - alpha)?

setw задаёт разную ширину поля вывода строк

Привет! Есть таблица некоторых строковых переменных (string). Необходимо эту таблицу вывести в адекватном форматированном виде. Проблема заключается в том, что при использовании манипулятора setw () строки, разные по длине, занимают разную ширину поля, а не фиксированную.
#include #include #include
using namespace std;
int main () { string one = "Один", two = "Два", eight = "Восемь"; cout << setw (10) << one <Ожидаемый вывод:
один два восемь
Что выходит на самом деле:
один два восемь
Собственно вопрос - почему так? И как всё таки можно выводить строки выровненными - одну под другой?


Ответ

Эх. Судя по всему, это проблемы интернационализации и utf-8.
Дело в том, что C++ не знает об utf-8, и считает ширину поля в байтах, а не в реальных символах. А для utf-8 количество байт не равно количеству символов. Обратите внимание, что у вас ширина поля получилась не 10, а меньше — текст "Один" в utf-8 занимает больше четырёх байт, поэтому количество недостающих до 10 байт меньше.
Попробуйте перейти на широкие строки:
wstring one = L"Один", two = L"Два", eight = L"Восемь"; wcout << setw (10) << one << endl; wcout << setw (10) << two << endl; wcout << setw (10) << eight << endl;
Если вы работаете под Windows, вам придётся прибегнуть к небольшой акробатике, чтобы заставить консоль правильно понимать широкие строки. Под линуксом, кажется, достаточно в начале программы применить заклинание
setlocale(LC_ALL, "");
Заметьте, что консольный ввод/вывод приложения должен быть либо полностью «узкий», либо полностью «широкий»: переключиться после первого выведенного символа уже нельзя.

Почему перестал работать выход с сайта Rails (devise)?

Здравствуйте, скажите пожалуйста как исправить ошибку. При выходе с сайта выкидывает сообщение - Couldn't find Doctor with 'id'=sign_out и указывает на строку
@doctor = Doctor.find(params[:id])
в контроллере
class DoctorsController < ApplicationController before_action :set_doctor, only: [:show, :edit, :update, :destroy] def index @doctor = Doctor.all end
def show @length = User.where(doctor_id: params[:id]).size end
private
def set_doctor @doctor = Doctor.find(params[:id]) end end
Раньше с сайта выходил, но теперь такая возможность пропала. Использую гем Devise
UPDATE routes.rb
Rails.application.routes.draw do get 'contact/index'
resources :news resources :prices get 'healthy/index' get 'about/index'
resources :users resources :doctors
devise_for :doctors, :controllers => { registrations: 'registrations' } root 'users#main'
end
Ссылка на выход из сессии
<%= link_to 'Вийти', destroy_doctor_session_path %>


Ответ

Возьмите ваш маршрут GET /doctors/sign_out и смотрите по списку сверху вниз, по какому правилу он совпадёт первым.
И совпадает он с GET /doctors/:id, собранным из resources :doctors. Почему не GET /doctors/sign_out (из devise_for), если он подходит лучше? А неважно, он первый подходящий. Он и используется.
Решение простое — поместите вызов devise_for выше resources :doctors, тем самым изменив порядок этих маршрутов в списке так, чтобы первым совпадал GET /doctors/sign_out

Альтернативно, повышенной сложности: не меняя порядок, установите к параметру :id в маршруте требование состоять только из цифр, аналогично примеру из документации
get 'photos/:id', to: 'photos#show', constraints: { id: /[A-Z]\d{5}/ }
Это единственный выход, когда маршруты сильно перекрываются. Это не ваш случай, в вашем случае достаточно изменить порядок. Но только первого приёма для разруливания таких проблем в общем случае недостаточно.

Решение задач о рюкзаке методом ветвей и границ

Пытаюсь реализовать решение задач о рюкзаке методом ветвей и границ. По условию вместительность рюкзака ограничена, а предметы можно положить только один раз. Нужно получить максимальную суммарную полезность. Вот код метода, который ее вычисляет:
void GetMaxSumAvailability(List ItemList, int i, int currentWeight, int currentCost) { if(i <= ItemList.Count - 1) { // Если по весу проходит, то прибавляем стоимость и суммарный вес if (currentWeight + ItemList[i].Weight <= width) { ItemList[i].Use = true; GetMaxSumAvailability(ItemList, i + 1, currentWeight + ItemList[i].Weight, currentCost + ItemList[i].Availability); } // Иначе не берем и смотрим следующий элемент else { ItemList[i].Use = false; GetMaxSumAvailability(ItemList, i + 1, currentWeight, currentCost); } } if (maxCost < currentCost && width >= currentWeight) { ItemList.ForEach(delegate(Item item) { if (item.Use) maxCost += item.Availability; }); GetMaxSumAvailability(ItemList, i + 1, currentWeight, currentCost); } }
Проблема заключается в неправильном выводе. К примеру, пусть width (вместительность рюкзака) = 5. Есть три предмета:
Вес = 4; Ценность = 100 Вес = 2; Ценность = 60 Вес = 2; Ценность = 60
Тогда на выводе я получу 100, когда очевидно, что если взять 2 и 3 предмет, то суммарная стоимость будет 120.
Однако, следующий пример выполняется правильно: widht = 14
Вес = 5; Ценность = 3 Вес = 10; Ценность = 5 Вес = 6; Ценность = 3 Вес = 5; Ценность = 2
В итоге я получу 7, что подтверждает следующая пикча:


Ответ

Уберите GetMaxSumAvailability в else - не надо подменять накопленные параметры текущими. Оставьте только ItemList[i++].Use = false; Увы, не всё так просто.
В подобного рода задачах есть "жадная" стратегия, когда захватываются сначала более ценные предметы. Но данная реализация - точно не такая, поскольку набивает рюкзак первым, что туда может влезть. И обе эти реализации грешат отсутствием какого бы то ни было перебора.
Если говорить о графике, то горизонтальная линия при подобном подходе отсутствует, а ограничения лишь маскируют этот факт. Чтобы эта линия возникала, надо рассматривать вариант с false даже в том случае, когда предмет влезает. Потому что в приведённом виде алгоритм не проверяет, что могло бы оказаться в рюкзаке вместо текущего предмета. И, таким образом, не рассматривает все варианты.
В конечном итоге, все стратегии перебора ведут к одним и тем же допустимым наборам. Единственная внятная оптимизация состоит в той же "жадной" стратегии, позволяющей быстрее набить рюкзак и тем самым - отсечь недопустимые варианты. Метод ветвей и границ в данном случае ведёт только к тому, что рюкзак с вещами будет объявлен вершиной графа, а процесс набивания рюкзака - движением по его рёбрам.
Итак, рекомендаций две: 1. Упорядочить предметы по весу и начинать перебор с более тяжёлых (жадная стратегия). 2. Рассматривать вариант ItemList.Use = false даже и в том случае, когда предмет влазит в рюкзак. Поскольку рекурсия в конце концов приведёт к оценке, то достаточно просто сравнивать эти два варианта при их наличии (бинарный перебор).

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

Есть стандартная формула расчета угла между векторами:

И вот есть два вектора, угол между которыми никак не вычислить, так как правая часть уравнения меньше -1. Вот эти вектора:
var x1 = -0.045797169475341334, y1 = -0.9989507591808752; var x2 = 0.04579716947534099, y2 = 0.9989507591808753;
В итоге, выражение:
(x1 * x2 + y1 * y2) / Math.sqrt(Math.pow(x1, 2) + Math.pow(y1, 2)) * Math.sqrt(Math.pow(x2, 2) + Math.pow(y2, 2))
дает результат: -1.0000000000000002
И если взять арккосинус этого числа, то будет NaN, что и понятно, так как он определен на промежутке от -1 до 1
Как мне скорректировать формулу, чтобы этой ошибки не было?


Ответ

Варианта решения проблемы имеются как минимум 2. Оба они требует, чтобы оба вектора имели ненулевую длину, но для вектора с нулевой длиной сама постановка вопроса о каком-либо угле не вполне корректна, и как Вам обрабатывать такую ситуацию, Вам должно быть виднее.
1) вычисляем промежуточное значение:
r = (x1 * x2 + y1 * y2) / Math.sqrt(Math.pow(x1, 2) + Math.pow(y1, 2)) * Math.sqrt(Math.pow(x2, 2) + Math.pow(y2, 2))
Проверяем на попадание r в диапазон [-1, 1]:
if (r < -1) r = -1; if (r > 1) r = 1;
Вычисляем арккосинус. Так убираются ошибки округления, "выбивающие" r из диапазона.
2) Пользуемся функцией atan2
phi = Math.atan2(y2, x2) - Math.atan2(y1, x1);
При необходимости, приводим полученный угол в нужный диапазон (0-180град или -90 - +90)

Я бы написал так:
if (phi < 0) phi += Math.PI * 2; if (phi > Math.Pi) phi -= Math.PI;

Оба алгоритма выдадут ошибку при x1=y1=0 или x2=y2=0, о чем написано выше. Вариант с atan2, имхо предпочтительней, т.к., например при x1=y1=1e+10, x2=y2=1e-10 точность вычислений по первому варианту будет околонулевой (e10 взято просто для примера, м.б. нужно существенно больше).

Математические функции указаны для Java, для .NET названия содержат заглавную букву: Math.Sqrt, Math.Atan2 и т. д.

Как с qsort отсортировать массив так, чтобы нечетные числа остались на своем месте?

Привет! Не получается решить задачу (ниже есть моя попытка решения):

Напечатайте входную последовательность натуральных чисел, отсортировав ее по возрастанию четных чисел, нечетные остаются на своих местах с помощью страндартной функции языка с qsort
Входные данные
Целое число 0 < N ≤ 1000. Затем N натуральных чисел, не превышающих 30000, через пробел.
Выходные данные
Нечетные числа остаются на своих местах, четные отсортированы по возрастанию.

Написал такую функцию сравнения:
int cmp_int(const void * p1, const void * p2) { int s1 = *(int*)p1; int s2 = *(int*)p2; if ((s1 % 2 == 0) && (s2 % 2 == 0)) { if (s1 < s2) return -1; else if (s1 > s2) return 1; } return 0; }
Но она не проходит тест для массива "5 122 3 26 48". Получается "26 3 48 122 5", а должно "5 26 3 48 122". Не знаю, как пропустить нечетные числа: если писать "return 0" при встрече с нечетными, то программа случайно сортирует два числа, которые она в данный момент сравнивает. Что нужно исправить?


Ответ

Можно так, конечно: 1. Переписать чётные числа в отдельный массив. 2. Отсортировать полученный массив. 3. Последовательно заменить чётные числа исходного массива отсортированными числами из полученного массива.
Теоретически можно перегнать чётные элементы в один конец массива, а нечётные в другой. Но чтобы вернуть их назад, понадобится протокол инверсий. А это не быстрая и не сортировка.
P.S. Но можно и по полной программе: Алгоритм такой: 1. Создаём flip-массив (в котором ключи и элементы поменялись ролями), применяя flip-функцию к исходному массиву. 2. Проводим сортировку с дополнительной опцией: "если выполнены условия перестановки чётных элементов, то произвести обмен значениями для соответствующих элементов flip-массива". 3. Cортируем flip-массив, сохраняя связи между ключами и элементами. 4. Применяем flip-функцию к flip-массиву.
На PHP это выглядит так:
$common = array(5,122,3,26,48); $flip = array_flip($common); var_dump($common); var_dump($flip); $changes = array(); usort($common, function($a,$b) use(&$flip) { if($a==$b) return 0; if(!(($a|$b)%2) && ($a>$b)){ // при перестановке чётных элементов $temp = $flip[$a]; // обмениваем их ключи $flip[$a] = $flip[$b]; $flip[$b] = $temp; } return $a-$b; }); var_dump($common); var_dump($flip); asort($flip); $common = array_flip($flip); var_dump($common);
Результаты:
array (size=5) 0 => int 5 1 => int 122 2 => int 3 3 => int 26 4 => int 48 array (size=5) 5 => int 0 122 => int 1 3 => int 2 26 => int 3 48 => int 4 array (size=5) 0 => int 3 1 => int 5 2 => int 26 3 => int 48 4 => int 122 array (size=5) 5 => int 0 122 => int 4 3 => int 2 26 => int 1 48 => int 3 array (size=5) 0 => int 5 1 => int 26 2 => int 3 3 => int 48 4 => int 122
Благодарности: VladD, Mike

Как отрисовать часть Битмапа посредством метода DrawBitmap(Canvas)

Всем привет,имеется следующее: :
FrameLayout(отображен красным цветом) Исходный ImageView(черный) Квадричный объект(imageview) с прикрученным OnTouchListener'ом (оранжевый),он создан внутри FrameLayout'a.
Посредством Объекта с OnTouchListener"ом,я хочу показывать "часть" Битмапа,который установлен в исходный ImageView.
В общем я делаю что то подобное: Bitmap bt = Bitmap.createBitmap(sourceBitmap,event.getX(),event.getY(),250,250);
где:
SourceBitmap - изображение,которые установлено в исходный ImageView event.getX() / event.getY() координаты(квадричного объекта),с которого я начинаю рисовать "часть" Битмапа. 250250 - размеры "кусочка" Битмапа.
и полученный результат :

В общем проблема появляется,когда объект(с прикрученным OnTouchListener'ом),переходит за границу исходного ImageView(имеется такая возможность,т.е. половина длины,может уйти за границу).
Т.е. в этом случае : я ожидаю этот результат: конкретнее :
Часть битмапа. Вторая часть,это "пустота",то бишь цвет Framelayout(background).
Что я пытался на текущий момент:
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) { case MotionEvent.ACTION_MOVE:
//я хочу получить большую порцию,чем текущие координаты int CurrentX = (int)view.getX() - (view.getWidth()); int CurrentY = (int)view.getY() - (view.getHeight());
//случай когда изображение ушло за границы if(CurrentX <= 0) { Paint paint = new Paint(); paint.setStyle( Style.FILL ); paint.setColor( Color.RED );
mBitmap = Bitmap.CreateBitmap(sourceBitmap,(int)view.getX() + Math.abs(CurrentX),(int)view.getY(),250,250); Canvas canvas = new Canvas(mBitmap); canvas.drawBitmap(mBitmap,new Rect((int)view.getX()+Math.abs(CurrentX), (int)view.getY(),250-Math.abs(CurrentX),250),new RectF(Math.abs(CurrentX), 0, 250,250),paint); } break; }
return true; } }
И проблема заключается в том,что результат не тот,который я ожидаю. А так же,как можно получить "результат"(прямоугольник),без исходного изображения,т.к. из за canvas.drawBitmap результат рисуется поверх оригинального изображения.


Ответ

В моем случае, а именно,когда объект с прикрученным OnTouchListener, который может уходить за границы X,Y осей,относительно исходного ImageView,я сделал специальные правила(пост условия).
Условия:
Width = Ширина ImageView,в котором я буду показывать результат. Height = Высота ImageView,в котором я буду показывать результат.
Левая cторона:
X_Coord < 0 && Y_Coord - Height / 2 < 0 && Y_Coord < Bitmap.Height - это будет верхняя часть. X_Coord < 0 && Y_Coord - Height / 2 > 0 && Y_Coord < Bitmap.Height - это будет средняя часть. X_Coord < 0 && Y_Coord - Height / 2 > 0 && Y_Coord > Bitmap.Height - это будет нижняя часть.
Правая сторона:
X_Coord > Bitmap.Height && Y_Coord - Height / 2 > 0 && Y_Coord < Bitmap.Height - это будет средняя часть. X_Coord > Bitmap.Height && Y_Coord - Height / 2 < 0 && Y_Coord < Bitmap.Height - это будет верхняя часть. X_Coord > Bitmap.Height && Y_Coord - Height / 2 > 0 && Y_Coord > Bitmap.Height - это будет нижняя часть.
Стандарт(средняя часть,которая не доходит краев(правой \ левой стороны) исходного ImageView):
X_Coord - Width / 2 > 0 && X_Coord < Bitmap.Width && Y_Coord - Height / 2 < 0 && Y_Coord < Bitmap.Height - это будет верхняя часть. X_Coord - Width / 2 > 0 && X_Coord < Bitmap.Width && Y_Coord - Height / 2 > 0 && Y_Coord > Bitmap.Height - это будет нижняя часть. X_Coord - Width / 2 > 0 && X_Coord < Bitmap.Width && Y_Coord - Height / 2 > 0 && Y_Coord < Bitmap.Height - это будет средняя часть.
Посредством этих "Пост условий", я буду отрисовывать кусочек(порцию) Битмапа в случае MotionEvent.ACTION_MOVE.
Давайте рассмотрим пример:
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) { case MotionEvent.ACTION_MOVE:
int Width = ResultImgView.getWidth(); int Height = ResultImgView.getHeight(); //paint для красного бэкграунда Paint paint = new Paint(); paint.setStyle( Style.FILL ); paint.setColor( Color.RED ); Bitmap mBitmap = null; Canvas canvas = null;
//Наше условие if(view.getX() - Width / 2 >= SourceBitmap.getWidth() && view.getY() - Height / 2 > 0 && view.getY() + Height / 2 < SourceBitmap.getHeight()) { //Отлично! Мы зашли сюда,а это значит,что в данный момент времени, мы находимся в **Правой Стороне** и относимся к "Средней" Площади. //Теперь можно начать рисовать порцию битмапа. //Считаем наш отступ по Х int Difference = (int)((view.getX() - Width / 2 ) - SourceBitmap.getWidth(); //не забываем установить этот "отступ" mBitmap = Bitmap.createBitmap(SourceBitmap, ((int)view.getX() - Width / 2) - Difference, (int)view.getY() - Height / 2, Width,Height); canvas = new Canvas(mBitmap); //рисуем наш бэкграунд в виде прямоугольника canvas.drawRect(0,0,mBitmap.Width,mBitmap.getHeight(),paint); //рисуем порцию битмапа canvas.drawBitmap(mBitmap,new Rect(Difference, 0,mBitmap.getWidth(),mBitmap.getHeight()),new Rect(0,0,mBitmap.getWidth() - Difference,mBitmap.getHeight()),null); //на этом всем! }
//проделать такого же плана работу и для других условий. break; }

return true; }

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

Допустим у меня есть приложение с двумя таблицами. Каждая таблица имеет разные поля. В приложении есть форма для заполнения одной из таблиц. На форме есть такие элементы как dataGridView, contextMenuStrip. У каждого из этих элементов есть обработчики различных событий.
Как правильно поступить если нужно сделать вторую форму, с тем же функционалом, но для работы с другой таблицей? Первое, что приходит в голову - это создать еще одну форму, разместить те же элементы, написать те же обработчики. В крайнем случае скопировать и немного поправить код. Но, может есть более правильный подход? Ведь речь может идти не об одной-двух формах и таблицах, а о десятках.


Ответ

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

SqlConnection не реагирует на password

Имеется база данных на Sql Server 2012. В базе данных имеется пользователь TestUser, созданный таким образом:
CREATE LOGIN TestUser WITH PASSWORD = '123'; USE Банк; GO CREATE USER TestUser FOR LOGIN TestUser; GO
Я подключаюсь к базе через приложение на C#, используя SqlConnection.
String ConnectionString = "Data Source=Computer;Initial Catalog=Банк;Persist Security Info=False;Integrated Security=SSPI;User ID=TestUser;Password=123;"; SqlConnection con = new SqlConnection(); con.ConnectionString = ConnectionString; con.Open();
Проблема в том что даже если пароль неверный то соединение все равно будет установлено и можно отправлять запросы. Подскажите как это исправить.


Ответ

Попробуйте убрать "Integrated Security=SSPI". Кажется это логинит через системный логин и соосно игнорит юзера и пароль. То есть вы входите не как TestUser.

TОР игроков в игре.

Как в моей игре выводить ТОР-игроков без использования своего сервера? Возможно есть какие-то сторонние сервисы ?
Приложение, к примеру, кол-во тапов на кнопку. Кто больше тапнул - тот и в ТОРе на первом месте.
У Apple есть такая штука как Game Center и с помощью нее можно, на сколько я знаю, можно в приложении вывести топ по игрокам этого приложения, при этом не использовать свой собственный сервер.


Ответ

Все уже изобретено и приготовлено к употреблению - https://developers.google.com/games/services/android/leaderboards
То есть, Android Play предоставляет все необходимое, Вашему приложению только нужно будет отправлять статистику и достижения.

Как обновлять текст в Label`е с определенной частотой?

Как обновлять текст в Label`е с определенной частотой(1 сек. например)?.пробовал такой код:
for (; ; ) { Task.Delay(1000); countDownLabel.Content = String.Format(/*подстановка обновляемого текста*/); }
,но окно виснет.Как решить проблему?


Ответ

Виснет, потому что вы не ожидаете таск: метод Task.Delay возвращает управление сразу и вы т.о. сильно нагружаете UI перерисовкой. Правильнее так:
for (; ; ) { await Task.Delay(1000); countDownLabel.Content = String.Format(/*подстановка обновляемого текста*/); }
Возможно, что вам захочется уметь останавливать обновление:
private async Task UpdateLabel(CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { await Task.Delay(1000); countDownLabel.Content = String.Format(/*подстановка обновляемого текста*/); } }
private void Do() { // обновляем лейбл в течение 10 секунд var tokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(10)); UpdateLabel(tokenSource.Token); }

Если с async/await вы не очень знакомы, можете использовать таймер. Не забудьте про Control.Invoke для доступа к элементам интерфейса.
timer = new Timer(UpdateLabel, null, 1000, 1000); ... private void UpdateLabel() { if (countDownLabel.InvokeRequired) { countDownLabel.Invoke(UpdateLabel); } else { countDownLabel.Content = String.Format(/*подстановка обновляемого текста*/); } } ... timer.Dispose();

Непонятная реакция при использовании методов Win32_Process (WinForms)

Есть код вывода информации о процессах в массив:
var process = new StringBuilder(); ManagementObjectSearcher searcherProc = new ManagementObjectSearcher("root\\CIMV2", "Select Name, CommandLine From Win32_Process"); foreach (ManagementObject instance in searcherProc.Get()) { process.AppendLine(string.Format("Процесс: {0}", instance["Name"])); } /*foreach (System.Diagnostics.Process winProc in System.Diagnostics.Process.GetProcesses()) { processi.AppendLine(string.Format("Процесс: {0}, Имя: {1}.exe", winProc.Id, winProc.ProcessName, )); }*/ show_information(process.ToString());
Из методов работает только Name. При использовании Caption или OSName компилятор выдает ошибку:
Как можно исправить ошибку, или другими средствами языка вывести информацию о процессах (всех запущенных): Имя, ID, Путь, Память?


Ответ

В своём запросе:
Select Name, CommandLine From Win32_Process
Вы выбираете только поля Name и CommandLine. Соответственно получить значения полей Caption и OSName вы не сможете - вы их попросту не выбирали.
В внутреннем исключении об этом и сказано, но вы в него видимо не заглядывали.
Просто добавьте в запрос необходимые поля.

Без WMI информацию указанную вами информацию можно было бы получить, например, перебрав Process.GetProcesses():
var info = from process in Process.GetProcesses() select new { process.ProcessName, process.Id, process.WorkingSet64};
Но к сожалению, информацию о коммандной строке вы так не получите - если она нужна, то всё же придется прибегнуть к помощи WMI.

проблемы с выводом REST

Имеется 2 таблицы:
Встреча (id, тема, idPlace).
Место (id, адрес). Связаны по полю idPlace->id.
Созданы модели для этих таблиц:
public class Place { public int Id { get; set; } public string Address { get; set; } }
public class Meeting { public int Id { get; set; } public string Theme { get; set; } public Place FPlace { get; set; } }
Репозиторий:
public Meeting GetMeeting(int id) { using (var connection = new SqlConnection(_connectionString)) { connection.Open(); using (var command = connection.CreateCommand()) { command.CommandText = "SELECT m.id, m.theme, p.address " + "FROM [dbo].meeting AS m " + "INNER JOIN [dbo].place AS p " + "ON m.place_id = p.id " + "WHERE m.id = @id";
command.Parameters.AddWithValue("@id", id); using (var reader = command.ExecuteReader()) { if (reader.Read()) { return new Meeting { Id = (int)reader["id"], Theme = (string)reader["theme"], Time = (DateTime)reader["time"], Duration = (TimeSpan)reader["duration"], FPlace = new Place { Address = (string)reader["address"] } }; } return null; } } } }
Ну и сам Rest:
[HttpGet] [Route("api/meeting/get/{id}")] public Meeting GetMeeting(int id) { return _repository.GetMeeting(id); }
На мой взгляд, проблема кроется здесь
FPlace = new Place { Address = (string)reader["address"] }
При GET-запросе (api/meeting/get/{id}) выдает не только данные из таблицы Встреча, адрес из таблицы Place, а еще и Id = 0(из таблицы Place).
Как бы от него избавиться (Id)?


Ответ

Вариант А: как уже было сказано в комментариях
public class Place { [IgnoreDataMember] public int Id { get; set; } public string Address { get; set; } }
Вариант B
var meet = _repository.GetMeeting(id); return new { id = meet.Id, theme = a.Theme, place = meet.FPlace.Address};
получается плоский список без излишеств конечно неплохо было бы убедиться, что meet у нас не null

NIO блокирование файла

в примере я создаю 2 потока, которые пытаются получить лок на один и тот же файл , приведу пример 1 потока(2й аналогичный, с именем th2 и стартует сразу после 1го ):
Thread th1 = new Thread(new Runnable() { Object obj = new Object(); @Override public void run() { synchronized (obj) { FileLock lock = null; FileChannel fileChannel = null; try { fileChannel = FileChannel.open(new File("sample.txt").toPath(), StandardOpenOption.READ); lock = fileChannel.tryLock(0, 2, true); System.out.println("1acq by " + lock.acquiredBy()); System.out.println("1Lock acquired: " + lock.isValid()); System.out.println("1Lock is shared: " + lock.isShared()); System.out.println(" thread 1"); obj.wait(2000);
} catch (Exception e) { e.printStackTrace(); } finally { try { fileChannel.close(); lock.release(); } catch (IOException e) { e.printStackTrace(); } } } } });
th1.start();
Но на деле почему-то второму потоку не удается заполучить лок :
java.nio.channels.OverlappingFileLockException
Что за бред? в документации же написано, что shared lock на канале чтения можно взять одновременно и несколько!!!
PS файл существует и размер его достаточно большой
PPS удалось одновременно получить лок удалось только разным процессам! Почему!?


Ответ

в документации же написано, что shared lock на канале чтения можно взять одновременно и несколько!!!
Все правильно. С одной поправкой: блокировка файлов доступна только разным процессам. Т.е. пытаться взять лок на файл из разных потоков одного процесса -- некорректно. Если вы хотите гарантировать, что только один поток имеет доступ к файлу -- используйте обычный лок на объект. Из документации
File locks are held on behalf of the entire Java virtual machine. They are not suitable for controlling access to a file by multiple threads within the same virtual machine.
shared lock всего лишь означает, что другой процесс не сможет взять exclusive lock, а только shared. Из документации
A shared lock prevents other concurrently-running programs from acquiring an overlapping exclusive lock, but does allow them to acquire overlapping shared locks.

Как улучшить SQL запрос

Мне нужно сделать выборку с таблиц со следующим условием:
сделать запрос, который получает список всех продуктов, и цены на 2013-03-01
Я написал вот такой скрипт:
select st.[ProductID], st.[ProductName], [Price].Price from ( select [Product].[ProductID], [ProductName], MAX(OnDate) as [OnDate] from [Product] inner join [dbo].[Price] on [Product].[ProductID] = [Price].[ProductID] where [OnDate] <= '2013-03-01' group by [Product].[ProductID], [ProductName] ) st inner join [dbo].[Price] on st.[ProductID] = [Price].[ProductID] and [Price].[OnDate] = st.[OnDate] order by [ProductID]
И структура таблиц:
create table Product ( ProductID int not null identity(1,1) primary key, ProductName varchar(255), Description varchar(max), Color varchar(15) ) create table Price ( ProductID int not null, OnDate datetime not null, Price int not null )
Все работает отлично, но хотелось бы как то красивее все написать. Какие есть идеи?


Ответ

Проблема не столько в запросе, сколько в схеме базы.
В таблице Price нет PK. Совсем. Единственный способ, которым SQL Server может выбрать что-то из таблицы без PK - это перечитать ее целиком. На большом объеме это будет тормозить вне зависимости от красоты запроса. Добавьте ключ - или составной (ProductID + OnDate, или какой-нибудь PriceID identity).
После этого посмотрите план запроса и добавляйте индексы по необходимости. Я бы предсказал

CREATE NONCLUSTERED INDEX [NonClusteredIndex-OnDate_Prod] ON [dbo].[Price] ( [OnDate] ASC, [ProductID] ASC )
что (на паре сотен строк) приведет к плану вида

т.е. хоть вы и упомянули Price дважды, реально данные из нее будут вычитаны один раз - при чтении конкретной цены.
Если очень хочется - можно переписать запрос с одним JOIN:

;WITH PricesBeforeDate as ( SELECT * from Price WHERE [OnDate] <= '2013-03-01' ), IndexedPrices as ( SELECT ROW_NUMBER() OVER(PARTITION BY [ProductID] ORDER BY OnDate DESC) AS Row, ProductID, Price FROM PricesBeforeDate ), LastPrices as ( SELECT * FROM IndexedPrices WHERE Row = 1 ) SELECT LastPrices.ProductID, ProductName, Price FROM LastPrices INNER JOIN Product on LastPrices.ProductID = Product.ProductID
этот запрос дает чуть меньше чтений на тех данных, что я у себя навбивал, но всегда стоит сравнить на реальных значениях:

видно что есть Sort, кушающий CPU. Это сортировка по ProductID и OnDate, вызванная тем, что я использовал PriceID в качестве ключа. Если использовать ключ по ProductID ASC, OnDate DESC, то сортировка исчезнет

ALTER TABLE dbo.Price ADD CONSTRAINT PK_Price_1 PRIMARY KEY CLUSTERED ( ProductID, OnDate DESC )
план:

Но в целом выбирать между разными вариантами запроса и разными индексами стоит на реальных данных. Включаете

SET Statistics io on SET Statistics time on
и смотрите output и план. Все остальное - гадание.

Вставить пробел после цифр

Ранее написал валидацию для замены пробелов в строке, что бы валидацию проходило только определенное количество цифр, сейчас же нужно что бы после цифр автоматически вставлялся пробел (пришло 12b, заменил на 12 b)
Validation.add('number-validation', '', function(v) { var vReplace = v.replace(/\s+/g, ''); return Validation.get('IsEmpty').test(vReplace) || /^[0-9]{19,19}$/.test(vReplace);});


Ответ

var string = '12b 14d', result = string.replace(/(\d+)/g, '$1 ');
console.log(result); // > 12 b 14 d
Подробнее: Наборы и диапазоны

Инициализация std::unique_ptr в дружественном классе

Привет.
Вроде бы проблема проста, но я с ней никогда не сталкивался и простым поиском с ходу не нашёл, поэтому решил не терять сил и времени и задать вопрос.
Пример:
#include
struct A { protected: A() {} friend class B; };
struct B { std::unique_ptr a; B() : a( std::make_unique() ) {} };
int main() { B b; }
Этот пример не скомпилируется. Но если убрать protected или заменить std::unique_ptr на обычный указатель, то всё будет нормально.
Я же не хочу избавляться ни от того, ни от другого. Как быть?


Ответ

Еще можно так. Собственно, о чем и был мой второй комментарий два часа назад.
#include
struct A { protected: A() {} friend struct B; friend std::unique_ptr
std::make_unique(); };
struct B { std::unique_ptr
a; B() : a( std::make_unique() ) {} };
int main() { B b; }
Прув: https://ideone.com/uesddg
УПД: с этим вариантом мы по прежнему создаем экземпляр при помощи make_unique, но при этом не даем "не друзьям" доступ до создания экземпляра.
#include
struct A { protected: A() {} friend struct B;
static std::unique_ptr
Create() { return std::make_unique(); } };
struct B { std::unique_ptr
a; B() : a( A::Create() ) {} };
int main() { B b; }

Свой List из array

Пытаюсь создать свой list из array
есть структура
template struct Node { T data; Node* next; };
собственно функция
template Node* arrayToList(const T tab[], size_t size){
Node *node = new Node; for(int i=0;idata = tab[i]; node->next = new Node; } }
в main
int tabi[] = {2,1,4,3,6,5,7,8}; size_t sizei = sizeof(tabi)/sizeof(tabi[0]); Node *listAi = arrayToList(tabi,sizei);
так вот проблема в том что не могу править созданный экземпляр Node тут node->next = new Node; я создаю экземпляр , а как в него значение из массива занести ?


Ответ

Не понятно, в чем состоит ваша проблема
Поэтому я предложу код, который позволяет заполнить список элементами массива. Надеюсь, что если это не то, что вам нужно, то вы об этом сообщите мне в своем комментарии к ответу.
Вот демонстрационная программа
#include
template struct Node { T data; Node *next; };
template Node * arrayToList( const T a[], size_t n ) { Node *head = nullptr; Node **current = &head;
for ( size_t i = 0; i < n; i++, current = &( *current )->next ) { *current = new Node { a[i], nullptr }; }
return head; }
template void displayList( Node *head ) { for ( ; head; head = head->next ) std::cout << head->data << ' '; }
int main() { int a[] = { 2, 1, 4, 3, 6, 5, 7, 8 }; const size_t N = sizeof( a ) / sizeof( *a );
for ( int x : a ) std::cout << x << ' '; std::cout << std::endl;
Node *list = arrayToList( a, N );
displayList( list ); std::cout << std::endl; }
Ее вывод на консоль:
2 1 4 3 6 5 7 8 2 1 4 3 6 5 7 8
Если ваш компилятор не поддерживает список инициализации для оператора new, то предложение
*current = new Node { a[i], nullptr };
вы можете заменить на следующие предложения
*current = new Node; ( *current )->data = a[i]; ( *current )->next = nullptr;
Либо вы можете написать для класса Node конструктор, чтобы можно было бы опять записать все в одну строчку, как, например
*current = new Node( a[i], nullptr );

Как сравнить несколько бит данных?

Имеется байт данных, в bin: 11010000, как можно проверить что первые 3 бита - 110?


Ответ

Один из многих путей:
(bin >> 5) & 7 == 6
Что происходит:
Сдвигаем нужные биты влево
xxxxxxxx11010000 // было xxxxxxxxxxxxx110 // стало Применяем маску, которая вытащит только нужные биты:
xxxxxxxxxxxxx110 // было 111 // маска 0000000000000110 // стало Результат сравниваем с нужной комбинацией бит (бинарное 110 — это 6).

Обычно вам не должно хотеться сравнивать биты вручную, это слишком низкоуровневая операция. Для таких штук часто лучше приспособлены битовые поля:
struct Data { unsigned int p1 : 3; // первые три бита unsigned int p2 : 1; // следующий 1 бит unsigned int p3 : 4; // следующие 4 бита };
Data data; // ... if (data.p1 == 6) {
Здесь все сдвиги сделает за вас компилятор.

Загрузка файла на сервер - баги, уязвимости

На моем сайте есть форма для загрузки файла, в которой у пользователя есть возможность, написав комментарий, прикрепить файл. Загрузку файла я не контролирую: нет ограничения по размеру, по типу и т.п.
Что может злоумышленник сделать с такой загрузкой файла, где нет ни каких ограничений? Какие есть еще защиты кроме ограничения по размеру, типу?


Ответ

Злоумышленник при заливке произвольного файла к вам на сервер в принципе может все что угодно. Файл может быть скриптом php или другим видом cgi и дать злоумышленнику полный доступ на ваш хостинг. А может быть каким нибудь скриптом/выполнимым файлом, который сработает в браузерах ваших пользователей.
Защита:
Проверять тип файла и не по расширению, а по внутреннему содержимому. Если это картинки то в браузеры к пользователям они должны попадать только в виде Скрипт загружающий файлы должен исключить наличие символов / и .. в именах файлов. Что бы через него нельзя было залить файл в произвольную папку на сервере Папка в которую заливаются файлы должна быть защищена от выполнения скриптов из нее. Для этого надо в .htaccess в этой папке (для apache) написать следующее:
php_flag engine 0 RemoveHandler .php AddType "text/html" .php .cgi .pl .fcgi .fpl .phtml .shtml .php2 .php3 .php4 .php5 .asp .jsp Options -ExecCGI -Indexes

Обвертка над итератором для преобразования типа

Есть два типа A и B, между объектами этих типов установлено соответствие. Есть набор X значений типа А и итератор по этому набору. Необходимо с минимальными трудозатратами на основе итератора X получить итератор по значениям типа B.
В общем по-простому говоря, есть контейнер типа A, из итератора А нужно получить итератор B, потому что клиент принимает итераторы B.
Например:
typedef std::pair A; typedef float B;
B A2B(const A & item) // соответствие между A и B { return item.second; }
std::vector X; input_iterator bi = magic_iterator_wrapper(A2B, X.begin());
Чем может быть magic_iterator_wrapper?


Ответ

Можно использовать boost::transform_iterator
#include #include #include #include
using A = std::pair; using B = float;
float A2B(const A & item) { return item.second; }
template auto make_transform_iterator(I i, F f) { return boost::transform_iterator{i, f}; }
int main() { std::vector
v = {{0, 1}, {0, 20}};
auto first = make_transform_iterator(v.begin(), A2B); auto last = make_transform_iterator(v.end(), A2B);
std::cout << std::accumulate(first, last, 0) << '
'; }
>>> То же на реальном компиляторе <<<

Как растянуть по всей высоте несколько элементов, не изменяя их размера?

У меня есть компоновка: