Страницы

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

вторник, 7 мая 2019 г.

Как лучше всего рассчитывать прогресс выполнения и задавать его цену?

Есть некая операция, которое состоит из последовательности действий.
void MyOperation { Action1(); Action2(); Action3(); }
Потребовалось повесить на это просмотр текущего прогресса. Причем на случай изменения действий (добавления, удаления, изменения цены действия), управление прогрессом не должно быть сложным и требовать пересчеты на калькуляторе.
void MyOperation { [CostAttribute(30)] Action1(); [CostAttribute(40)] Action2(); [CostAttribute(30)] Action3(); }
А в самих функциях должен посчитаться общий прогресс (30 + 40 + 30) и текущий для действия (общий/текущий).
То есть если программист добавляет новое действие (Action4), он примерно оценивает, сколько оно будет выполняться и выставляет свою цену, например 100, не меняя остальные цены и соотношения.
Как такое можно сделать?
UPD:
Сначала мне пришло в голову сделать так. Поставить атрибут с ценой над каждым определением действия. Но действие может иметь разную цену в зависимости от контекста. Например, действие копирует файлы. В этом случае оно может использоваться в операции несколько раз, и цена его будет разная. Программист примерно представляет, сколько файлов имеется для копирования, а потому в одном случае это действие будет стоить 10 (примерно 1000 файлов), а в другом - 20 (примерно 2000 файлов). Короче не знаю как это сделать красивее и удобнее в понимании и программировании.


Ответ

Как вариант, можно обернуть MyOperation и Action в классы. В этом случае MyOperation хранит набор Action и выполняет их поочередно. После выполнения действия можно пересчитать прогресс выполнения, используя параметр action.Weight (он же цена).
public class MyOperation { List actions=new List()
public void Run() { foreach(var action in actions) { action.Execute(); this.ResearchProgress(action.weight); } } }

Анимация Transform в ControlTemplate

Как анимировать ScaleTransform кнопки в шаблоне, и какой тип анимации необходимо применить?


Ответ

Вам нужно анимировать не всю трансформацию, а свойства ScaleX и ScaleY этой трансформации. Так как тип этих свойств double, соответственно, нужно использовать DoubleAnimation

Передать два значение в Ajax на сервер

Есть Ajax который должен передавать два значения. Сделал только со одним.
$.ajax({ type: 'POST', url: "/ajax/search_bid_country", data: "city_from="+city_from, success: function(answer) { $(".result_article").empty(); $(".result_article").append(answer); $(".result_article").fadeIn(); $(".load").css({display:"none"}); } });
Но вот второй не могу передать пишит ошибку,
data: "city_from="+city_from, "city_whre="+city_where,
Как быть


Ответ

все просто
data: "city_from=" + city_from + "&city_whre=" + city_where,
теперь должно сработать

Крестики нолики

Пытаюсь реализовать своими силами игру крестики-нолики на Java. Все вроде работает так как задумывалось, но продолжение игры вообще не идет.
Суть в том что метод Exit() зацикливается. при вводе "n" все работает хорошо, а при вводе "Y" Спрашивает по новой.
Подскажите,пожалуйста, в чем ошибка.

package tic_tac_toe;
import java.util.Scanner;
public class XO {
public static void Game(){
Scanner in = new Scanner(System.in); // Подключение класса считывания инф-и (аля Read) String hole; // переменная местоположения
String[][] field = new String[3][3]; // Заполняем массив пробелами, для последущего замещения их Х или О for (int i = 0; i < 3; i++){ System.out.println(); for (int j = 0; j < 3; j++){ field[i][j] = (" [ ] "); System.out.print(field[i][j]); } }
int i = 2; int quit=0; while((i<11) & (quit == 0)){
if (i % 2 == 0){ System.out.println("
Ходит Х"); } else{ System.out.println("
Ходит О"); } System.out.print("Введите клетку:> "); // Считывание ввода, и ход. switch (hole = in.next()){ case "7":{ if (field[0][0] == (" [ ] ")){ if (i % 2 == 0){ field[0][0] = (" [X] "); i++; break; } else { field[0][0] = (" [O] "); i++; break; } } else{ System.out.println("Эта клетка занята, введите другую."); break; } }
case "8":{ if (field[0][1] == (" [ ] ")){ if (i % 2 == 0){ field[0][1] = (" [X] "); i++; break; } else { field[0][1] = (" [O] "); i++; break; } } else{ System.out.println("Эта клетка занята, введите другую."); break; } } case "9":{ if (field[0][2] == (" [ ] ")){ if (i % 2 == 0){ field[0][2] = (" [X] "); i++; break; } else { field[0][2] = (" [O] "); i++; break; } } else{ System.out.println("Эта клетка занята, введите другую."); break; } } case "4":{ if (field[1][0] == (" [ ] ")){ if (i % 2 == 0){ field[1][0] = (" [X] "); i++; break; } else { field[1][0] = (" [O] "); i++; break; } } else{ System.out.println("Эта клетка занята, введите другую."); break; } } case "5":{ if (field[1][1] == (" [ ] ")){ if (i % 2 == 0){ field[1][1] = (" [X] "); i++; break; } else { field[1][1] = (" [O] "); i++; break; } } else{ System.out.println("Эта клетка занята, введите другую."); break; } } case "6":{ if (field[1][2] == (" [ ] ")){ if (i % 2 == 0){ field[1][2] = (" [X] "); i++; break; } else { field[1][2] = (" [O] "); i++; break; } } else{ System.out.println("Эта клетка занята, введите другую."); break; } } case "1":{ if (field[2][0] == (" [ ] ")){ if (i % 2 == 0){ field[2][0] = (" [X] "); i++; break; } else { field[2][0] = (" [O] "); i++; break; } } else{ System.out.println("Эта клетка занята, введите другую."); break; } } case "2":{ if (field[2][1] == (" [ ] ")){ if (i % 2 == 0){ field[2][1] = (" [X] "); i++; break; } else { field[2][1] = (" [O] "); i++; break; } } else{ System.out.println("Эта клетка занята, введите другую."); break; } } case "3":{ if (field[2][2] == (" [ ] ")){ if (i % 2 == 0){ field[2][2] = (" [X] "); i++; break; } else { field[2][2] = (" [O] "); i++; break; } } else{ System.out.println("Эта клетка занята, введите другую."); break; } } default: System.out.println("
Ошибка ведите еще раз!"); break; } // Вывод поля на экран for (int p = 0; p < 3; p++){ System.out.println(); for (int l = 0; l < 3; l++){ System.out.print(field[p][l]); } } for (int t = 0; t<3 ; t++){ // Проверка прямых if (((field[t][0]) == " [O] " & (field[t][1]) == " [O] " & field[t][2] == " [O] ") || ((field[0][t]) == " [O] " & (field[1][t]) == " [O] " & field[2][t] == " [O] ")) { System.out.print("
Победил О "); quit++; Exit(); } else if (((field[t][0]) == " [X] " & (field[t][1]) == " [X] " & field[t][2] == " [X] ") || ((field[0][t]) == " [X] " & (field[1][t]) == " [X] " & field[2][t] == " [X] ")) { System.out.print("
Победил Х "); quit++; Exit(); } else {} } // Проверка диагоналей if (((field[0][0]) == " [X] " & (field[1][1]) == " [X] " & field[2][2] == " [X] ") || ((field[0][2]) == " [X] " & (field[1][1]) == " [X] " & field[2][0] == " [X] ")) { System.out.print("
Победил Х "); quit++; Exit(); } else if (((field[0][0]) == " [O] " & (field[1][1]) == " [O] " & field[2][2] == " [O] ") || ((field[0][2]) == " [O] " & (field[1][1]) == " [O] " & field[2][0] == " [O] ")) { System.out.print("
Победил О "); quit++; Exit(); } else {} } System.out.println(); } public static void Exit(){ // Отсутствует продолжение игры Scanner ex = new Scanner(System.in); String re; do { System.out.print("Хотите продолжить игру? "); re = ex.next(); if (re == "Y"){ Game(); } else if(re == "n") { break; } } while (re == ("Y") || re == "n"); } public static void main(String[] args) { Game(); //Exit(); } }


Ответ

Строки сравнивают методом equals(String str) То есть у Вас должно быть:
do { System.out.print("Хотите продолжить игру? "); re = ex.next(); if (re.equals("Y")) { Game(); } else if (re.equals("N")) { break; } } while (re.equals("N") || re.equals("Y"));
А при вводе "n" поток выходит из цикла лишь потому, что Вы воспользовались досрочным выходом break из цикла.

Binding color to constants class

Не могу прибиндить цветовую константу, которая находится в другой dll-ке.
"/>
Студия ругается на плохой код и не хочет ничего делать. И принимает только объект, а стринг не хочет. Как я понял, нужен конвертер.
Есть ли стандартный, или самому писать? (если можно, пример).


Ответ

Ссылки на статические свойства нужно давать не через Binding, а через x:Static

При этом у вас, разумеется, должно быть правильно объявлено пространство имён constants, что-то вроде
xmlns:constants="clr-namespace:Namespace.In.Assembly;assembly=Your.Assembly.Name"
Не забудьте убедиться, что ваша сборка с константами называется Your.Assembly.Name, в ней в пространстве имён Namespace.In.Assembly находится public-класс ColorConstants, у которого есть статическое свойство (а не поле!) Black, у которого хотя бы getter объявлен как public

Для случая, когда ваш x:Static обладает неправильным типом (у вас строка, а ожидается Color), вам нужно применить конвертер. Самый простой синтаксически способ — написать свой MarkupExtension в замену x:Static, который заодно конвертировал бы значение в нужный тип стандартным конвертером.
Итак:
public class SmartStaticExtension : StaticExtension { public SmartStaticExtension(string member) : base(member) { }
public override object ProvideValue(IServiceProvider serviceProvider) { // получим значение стандартного x:Static object value = base.ProvideValue(serviceProvider);
// попытаемся вычислить тип, к которому надо привести IProvideValueTarget target = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget; if (target != null) { Type targetType = typeof(object); // если целевое свойство - DependencyProperty DependencyProperty dp = target.TargetProperty as DependencyProperty; if (dp != null) { targetType = dp.PropertyType; // берём тип у него } else { // целевое свойство - обыкновенное свойство, используем рефлексию PropertyInfo pi = target.TargetProperty as PropertyInfo; if (pi != null) targetType = pi.PropertyType; }
// получаем стандартный конвертер: TypeConverter converter = TypeDescriptor.GetConverter(targetType); // и конвертируем value = converter.ConvertFrom(value); }
return value; } }
Имея такой конвертер, можно написать

(разумеется, пространство имён local должно указывать туда, где определён SmartStaticExtension).
Работает как со строками ("LightCyan") так и с RGB-константами ("#708090").

Как посмотреть размер раздела на диске?

Допустим у меня есть диск sda. Мне нужно посмотреть занимаемый размер на sda6.
Есть команда df -h, но она показывает всю информацию по дискам, а мне нужен только раздел sda6 на диске sda.


Ответ

если раздел примонтирован, то можно посмотреть его размер, указав путь к нему:
$ df /dev/sda6
если же раздел не примонтирован, программа df бессильна, и можно посмотреть лишь информацию о всех разделах данного блочного устройства. пара вариантов:
$ sudo fdisk -l /dev/sda $ sudo parted /dev/sda print all

Аргументы методов в C# по ссылке или по значению?

Насколько я знаю в сишарпе аргументы передаются по значению. Но тогда я не понимаю вот чего. Я сейчас смотрю код, в котором присутствует такой метод:
public static string GetRequest(string Url, string UserAgent = "", CookieDictionary Cookies = null, ProxyType ProxyProto = ProxyType.None, string ProxyString = "") { ...
try { HttpResponse response = request.Get(Url); Cookies = response.Cookies; response_html = response.ToString(); }
}
То есть он получает куки, а потом добавляет в них те что получены из ответа. Если переменные передаются по значению то так по-идее работать не должно, но я проверил вот так:
CookieDictionary cookies = new CookieDictionary(); string url = "http://mail.ru"; string resp = Web.GetRequest(url, "", cookies, Web.ProxyType.HTTP, "127.0.0.1:8888"); resp = Web.GetRequest(url, "", cookies, Web.ProxyType.HTTP, "127.0.0.1:8888");
При втором запросе передаются куки, которые получены при первом. Кроме того в методе я пробовал добавлять свои куки через Cookies.Add() и они присутствовали в следующих вопросах. Почему это работает?


Ответ

В C# действительно аргументы передаются по значению. Вопрос только, что это за аргументы.
Если это аргументы — числа или похожие объекты (они называются типами-значениями), то они передаются таки как есть — передаётся их копия
А если аргументы — объекты классов (они называются ссылочными типами), то по значению передаётся ссылка (то есть как бы указатель, если вы знакомы с C) на объект, а не копия самого объекта. По копии ссылки объект доступен точно так же, как и по оригиналу, и это тот же самый объект.
Почему это сделано так? Дело в том, что не все объекты можно просто склонировать. И даже если это можно, что делать со ссылками на другие объекты, которые содержит данный объект? Клонировать все внутренние объекты? Это слишком долго и слишком сложно (например, что делать, если ссылки выстраиваются в цикл?). А если внутренние объекты не клонировать, возникает та же проблема: сам объект копируется, а внутренние подобъекты всё равно передадутся по ссылке.

Qt(C++) считывание данных с веб страницы

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


Ответ

В Qt имеется QtWebKit - компонент, реализующий функциональность браузера с поддержкой JS. Так что ваша задача состоит в исследовании скриптового функционала страницы при помощи, например, FireBug, а затем вызова этих js-методов посредством WebKit.
Вызов js:
QWebView::page()->mainFrame()->evaluateJavaScript( "some_js_function()" );

Как получить HINSTANCE модуля в котором находится код?

Как в MS Visual C++ получить HINSTANCE модуля (exe или dll) в котором находится текущая функция?


Ответ

Я согласен, что вариант с __ImageBase можно использовать в определенных случаях, но хотел упомянуть о двух других стандартных методах.
Чаще всего необходимо получить HINSTANCE основной программы (EXE). Для этого проще всего использовать GetModuleHandle(NULL)
Другая типичная ситуация, что мы написали DLL с callback функцией и ее кто-то вызывает. В этом случае у нас обычно есть параменры переданные вазывающим нас модулем. С помощью GetModuleHandleEx с параметром GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS можно получит HMODULE по адесу переменной, а HINSTANCE DLL это и есть HMODULE
Есть конечно много других способов. Но решающим является в каком контексте мы находимся.
Мне лично, в свое время, дало многое для общего поминания программка которую я включил в этот ответ. Она показывает, что огромное виртуальное пространства процесса зазбито на блоки и каждый блок принадлежит своему модулю. Имея начала модуля можно поличить о нем всю информацию. Я полагаю, что GetModuleHandleEx работает примерн так.

Установка единого значения свойства объектам на форме WPF

На форме WPF есть несколько TextBlock. Как программно по нажатию кнопки установить у них всех к примеру свойство Visible в false?


Ответ

Если вы пользуетесь MVVM (а чем ещё?), у вас не должно быть желания обработать все текстбоксы на странице — вы должны думать не в терминах контролов, а в терминах показываемых на странице сущностей. Тем более что визуальное представление любого из объектов может поменяться, TextBox может поменяться на другой контрол, а вам скорее всего хочется отключить видимость этого элемента, какого бы типа он ни был.
Поэтому правильное решение — выставить в VM свойство наподобие IsVisible, и привязываться к нему. По команде из UI переключать на уровне бизнес-логики свойства IsVisible у нужных VM-объектов, и дать UI автоматически подхватить эти изменения.

Альтернативное, более техническое решение наподобие изложенного в соседнем ответе: binding к свойству + общий стиль. (Я бы всё же советовал управлять на уровне VM.)
Пример:
True Edit mode

Если нужно для некоторых TextBox'ов включать, а для других выключать видимость по «общему» сигналу, придётся создать свой конвертер. Это совсем не сложно:
public class BooleanToVisibilityInvertedConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return ((bool)value) ? Visibility.Collapsed : Visibility.Visible; }
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return object.Equals(value, Visibility.Collapsed); } }
Ну и теперь можно подключить к коду. Один из многих способов:
True Edit mode
Или можно уложить это в два стиля, чтобы код был проще.

Убрать все элементы на странице с классом

Мне нужно убрать все элементы на странице с классом user
(Изменить свойство display на none).
Как это сделать на чистом JS, без использования сторонних библиотек?


Ответ

var elems=document.getElementsByClassName('user'); for(var i=0; i

Как найти detached коммиты?

Однажды откатился на какой-то безымянный коммит. И, не создавая новую ветку, сделал несколько новых коммитов.
После чего лазил через SourceTree и "случайно" перешёл на другую ветку. После чего Detached HEAD from 1f231656aabcd2... бесследно пропал.
Все решения ведут к
git reflog --all
Ищи там свой коммит, переходи туда (checkout), создавай новую ветку и мерж, или сразу мерж. Но я не могу найти там своих последних коммитов. Всё старьё.


Ответ

в выводе git reflog ищите строку "moving from".

пример сообщения о переходе от несвязанного ни с каким указателем (веткой или тегом) коммита к ветке master
$ git reflog ... 2217ae2 HEAD@{0}: checkout: moving from 70c48300c538de67deb020df43b036728c133187 to master ...
если теперь посмотреть
$ git log 70c48300
то видна вся последовательность коммитов, по цепочке связанных с искомым.

Сократится ли размер репозитория на GitHub, если удалить из него часть данных?

Если залить репозиторий до 400МБ, а потом удалить часть и оставить до 50МБ. То общий размер репозитория будет всеравно 400МБ? Ну чтобы востановить снимок тех 350МБ их же надо где-то хранить.
Вопрос связан с ограничениями размера репозиториев в частности GitHub.


Ответ

Естественно, если данные можно восстановить, то значит где-то они лежат.
Гит хранит разницы между состояниями файловой системы. Так что в вашем примере будет примерно так:
+400мб - залили файлы (не принимая в расчет сжимающиеся они или нет) +0,001мб - залили инфо о том что файлов больше нет
Более подробно, о том как гит обращается с коммитами вы можете прочитать здесь: Каким образом git сохраняет изменившуюся строку при коммите?

Ошибка при создании SQL запроса

При выполнении запроса выводится ошибка
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group, discipline, exam, student WHERE exam.stud_id = student.stud_id AND ' at line 2
Вот сам запрос:
SELECT group.index_group, discipline.name_disc, COUNT(*), SUM(value) FROM group, discipline, exam, student WHERE exam.stud_id = student.stud_id AND exam.disc_id = discipline.disc_id AND exam.value IS NOT NULL AND exam.value > 2 GROUP BY group.index_group, discipline.name_disc
Вот используемые таблицы:
CREATE TABLE IF NOT EXISTS `discipline` ( `disc_id` int(11) NOT NULL AUTO_INCREMENT, `name_disc` varchar(100) DEFAULT NULL, `type_of_classes` varchar(100) DEFAULT NULL, `id_prepod` int(11) NOT NULL, `index_group` int(11) NOT NULL, PRIMARY KEY (`disc_id`), KEY `index_group` (`index_group`), KEY `id_prepod` (`id_prepod`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
СREATE TABLE IF NOT EXISTS `exam` ( `id` int(11) NOT NULL AUTO_INCREMENT, `disc_id` int(11) NOT NULL, `stud_id` int(11) NOT NULL, `value` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `disc_id` (`disc_id`), KEY `stud_id` (`stud_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `group` ( `index_group` int(11) NOT NULL AUTO_INCREMENT, `course` int(11) NOT NULL, `id_specialization` int(11) NOT NULL, PRIMARY KEY (`index_group`), KEY `id_specialization` (`id_specialization`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `student` ( `stud_id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `index_group` int(11) NOT NULL, PRIMARY KEY (`stud_id`), KEY `index_group` (`index_group`), KEY `index_group_2` (`index_group`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Помогите, пожалуйста, с решением данной проблемы.


Ответ

Проблема в обращении к таблице group. В MySQL слово group - зарезервированное слово (является частью синтаксиса select ... group by), и если надо его использовать в качестве имени для базы/таблицы/столбца - обрамляйте его кавычками:
select `group` ... from `group`
То же касается зарезервированных слов select, insert, delete, update (они обозначают действия, которые можно выполнить со строками), text, date, time (они обозначают типы данных) и многих других
Общей практикой и хорошим тоном будет всегда обрамлять названия базы/таблицы/столбца в запросах кавычками, независимо от присутствия ключевых слов в этих названиях:
select `fldname` from `bdname`.`tblname` where `fld2name` = '123' order by `fld3name` limit 5

Можно ли сделать такое в jquery?

Есть окно выбора картинки через input, можно ли сделать чтобы src картинки подгружалось при выборе из локального компьютера, или же может какое то хранилище для этого есть? Суть в том чтобы менять картинку без загрузки её на сервер


Ответ

Сделать можно. С помощью объекта FileReader
Объект FileReader позволяет веб-приложениям асинхронно читать содержимое файлов (или буферы данных), хранящиеся на компьютере пользователя, используя объекты File или Blob, с помощью которых задается файл или данные для чтения.
Его метод .readAsDataURL() позволит считать данные файла в виде data: URL, которые мы потом кладем в атрибут src картинки, и она отобразится.

your image

--
function readURL(input) { if (input.files && input.files[0]){ var reader = new FileReader();
reader.onload = function(e){ $('#blah').attr('src', e.target.result); }
reader.readAsDataURL(input.files[0]); } }
$("#imgInp").change(function(){ readURL(this); });
http://jsfiddle.net/LvsYc/

Низкое разрешение экрана

Внезапно компьютер начал загружаться с низким разрешением монитора.
Симптомы: GRUB загружается с низким разрешением. Потом Ubuntu 14.04 загружается с низким разрешением. Параметры системы -> Настройка экранов говорит «Неизвестный монитор» и максимальное разрешение у него 1024 x 768.
xrandr Screen 0: minimum 320 x 200, current 1024 x 768, maximum 32767 x 32767 VGA1 connected primary 1024x768+0+0 (normal left inverted right x axis y axis) 0mm x 0mm 1024x768 60.0* 800x600 60.3 56.2 848x480 60.0 640x480 59.9 VIRTUAL1 disconnected (normal left inverted right x axis y axis)
Windows тоже загружается с низкой резолюцией, но дает поменять на нормальную.
Я подозреваю, что поломалась какая-то компонента оборудования, но если Windows может это исправить, то и в Ubuntu это можно починить?


Ответ

1. Установка разрешения монитора для сессии
(Эта часть решения найдена в здесь. О команде xrandr можно почитать по-русски здесь, а конкретнее по данному вопросу здесь.)
Сначала нужно запустить команду cvt и задать ей нужное разрешение. Я не помнила, какое разрешение было раньше. Для того, чтобы это узнать, я посмотрела размер обоев для рабочего стола.
cvt 1440 900 60 # 1440x900 59.89 Hz (CVT 1.30MA) hsync: 55.93 kHz; pclk: 106.50 MHz Modeline "1440x900_60.00" 106.50 1440 1528 1672 1904 900 903 909 934 -hsync +vsync
Нам нужно то, что написано после слова Modeline. Копируем это в xrandr --newmode (создать новый режим):
xrandr --newmode "1440x900_60.00" 106.50 1440 1528 1672 1904 900 903 909 934 -hsync +vsync
Теперь добавляем новый режим:
xrandr --addmode VGA1 1440x900_60.00
(название монитора "VGA1" берется из вывода xrandr без параметров, как в вопросе)
на этом этапе у меня поменялось разрешение, хотя в документации предлагают запустить еще одну команду.
xrandr --output VGA1 --mode 1440x900_60.00
Последние три команды меняют разрешение экрана в текущей сессии.
2. Постоянное разрешение
Внимание! Если в решении, приведенном ниже, что-то не сработает, то графический интерфейс не загрузится и появится черный экран. Вы можете нажать Ctrl+Alt+Fn, где n от 1 до 6, чтобы вызвать виртуальную консоль, и там откатить или что-то изменить (например, с помощью команды sudo nano).
Итак, лучшее решение, что я нашла: Создаем скрипт с этими тремя командами xrandr
xrandr --newmode "1440x900_60.00" 106.50 1440 1528 1672 1904 900 903 909 934 -hsync +vsync xrandr --addmode VGA1 1440x900_60.00 xrandr --output VGA1 --mode 1440x900_60.00
например, такой командой:
gksudo gedit /usr/bin/lightdmxrandr.sh &
Затем делаем его исполняемым:
sudo chmod +x /usr/bin/lightdmxrandr.sh
Теперь добавляем строку
display-setup-script=/usr/bin/lightdmxrandr.sh
в файл /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf, например, с помощью команды
gksudo gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf
Теперь LightDM будет запускать этот скрипт перед X Windows.
Вторая часть основана на этом вопросе

Как передать запрос со значением параметра null

Есть у меня функция
SqlCommand GetCommand(string value) { var comm = new SqlCommand(); comm.CommandText = "SELECT * FROM MyTable WHERE anyField = @param"; comm.Parameters.Add("@param").Value = value; **** }
А как быть со случаями, когда value передается null? Ведь язык TSQL не есть фильтр вида anyField = null. Неужели переписывать на этот случай заново весь запрос, исправляя на anyField is null? Просто параметров на самом деле много, и каждому предусматривать значение null как-то не по христиански.
UPD:
Я сделал так... Еще не тестировал, но посмотрите, не чересчур ли это?
if (filters != null) { var pCounter = 0; filtersPart = $" WHERE ({string.Join(" OR ", filters.Select(d => $"({string.Join(" AND ", d.Select(kv => kv.Value.Value != null ? (kv.Value.Key ? $"[{kv.Key}] = @param{++pCounter}" : $"[{kv.Key}] LIKE @param{++pCounter}") : $"[{kv.Key}] is null"))})"))}) "; pCounter = 0; foreach(var d in filters) foreach(var kv in d) if (kv.Value.Value != null) res.Parameters.AddWithValue($"param{++pCounter}", kv.Value.Value); }
filters тут это List>>, где List - это список фильтров через OR, dictionary - это список фильтров через AND, где string - это имя столбца, KeyValuePair - это значение столбца и булейное значение, указывающее, четкое ли нужно совпадение (= @param) или похожее (LIKE @param)


Ответ

Как-то так:
SqlCommand GetCommand(string value) { var comm = new SqlCommand(); comm.CommandText = @" SELECT * FROM MyTable WHERE (anyField = @param or anyField is NULL and @param is NULL) -- and/or (другие условия)"; comm.Parameters.AddWithValue("@param", (object)value ?? DBNull.Value); ... }
Можно
comm.CommandText = "SELECT * FROM MyTable WHERE ISNULL(anyField, '') = ISNULL(@param, '')";
но это хуже в плане возможного использования индексов, т.к. будет потеряно sargability
Либо действительно динамический запрос. Если value != null то запрос один:
SELECT * FROM MyTable WHERE anyField = @param
а если value == null, то другой:
SELECT * FROM MyTable WHERE anyField is NULL
Да, может быть сложнее в построении (когда много параметров), но может оказаться выгоднее для исполнения.

java.lang.NullPointerException: Attempt to write to field 'int android.support.v4.app.Fragment.mNextAnim' on a null object reference [дубликат]

На данный вопрос уже ответили: Что такое Null Pointer Exception и как его исправить? 4 ответа На Nexus 7 c Android 5.0(не 4.4) происходит крах с Exception из заголовка. После непродолжительных поисков был найден следующий ответ. Меня он не устраивает, так как в силу обстоятельств не могу отказаться от android.support.v4.app.
Возможность операции над фрагментом, равным null, я тоже рассматривал, но такого быть не должно. Отрывок кода под подозрением:
String tag = FRAGMENT_STATE; FragmentManager fragmentManager = getSupportFragmentManager(); ... stateFragment = new Fragment(); ... if (stateFragment != null) { ... android.support.v4.app.FragmentTransaction transaction = fragmentManager.beginTransaction();//.support.v4 transaction.replace(R.id.content_frame, stateFragment, tag); ... transaction.commitAllowingStateLoss();
Еще есть следующий отрывок:
//Типо подключаю фрагменты if(onerFragment == null) Logi.d("OneFragment is Null"); //if (oneFragment == null || twoeFragment == null) { Logi.d("блок подключения фрагментов"); fragmentTransaction = fragmentManager.beginTransaction(); Logi.d("oneGragment constructer before"); oneFragment = new OneGragment(); fragmentTransaction.add(R.id.one_fragment, oneFragment); Logi.d("TwoFragment constructer before"); twoFragment = new TwoFragment(); fragmentTransaction.add(R.id.two_fragment, twoFragment);
fragmentTransaction.commitAllowingStateLoss();
Логи:
FATAL EXCEPTION: main Process: название пакета, PID: 7755 java.lang.NullPointerException: Attempt to write to field 'int android.support.v4.app.Fragment.mNextAnim' on a null object reference at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:709) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:458) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
P.S Устройства у меня нет, логи взяты из GoogleTestLab, тестирование на эмуляторе тоже не смогу. есть ли у кого-нибудь идеи что делать с этим "эксепшеном"?


Ответ

Вот здесь сказано: Это происходит из-за того, что Вы вызываете методы remove(), add() и т.п. со значением null
Поразумевается, что replace() - это remove() и за ним add()

SeekBar выпадает в java.lang.NullPointerException

Создаю простейший сикбар и одно текстовое поле. При изменении сикбара должно происходить изменение значения в поле. Но студия не компилирует код и вылетает в ошибку java.lang.NullPointerException. Поиски ошибки не увенчались успехом. Прошу помощи.
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.SeekBar; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener { SeekBar sb1; TextView tv1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv1 = (TextView)findViewById(R.id.tv1); tv1.setText(""); SeekBar sb1 = (SeekBar)findViewById(R.id.sb1); sb1.setOnSeekBarChangeListener(this); } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { tv1.setText(String.valueOf(progress)); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }
Exeption FATAL EXCEPTION: main Process: com.example.ivanvovk.linearlayout, PID: 21145 java.lang.NullPointerException at com.example.ivanvovk.linearlayout.MainActivity.onProgressChanged(MainActivity.java:38) at android.widget.SeekBar.onProgressRefresh(SeekBar.java:91) at android.widget.ProgressBar.doRefreshProgress(ProgressBar.java:655) at android.widget.ProgressBar.refreshProgress(ProgressBar.java:667) at android.widget.ProgressBar.setProgress(ProgressBar.java:714) at android.widget.AbsSeekBar.trackTouchEvent(AbsSeekBar.java:451) at android.widget.AbsSeekBar.onTouchEvent(AbsSeekBar.java:372) at android.view.View.dispatchTouchEvent(View.java:7765) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068) at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515) at android.app.Activity.dispatchTouchEvent(Activity.java:2458) at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016) at android.view.View.dispatchPointerEvent(View.java:7945) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3961) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3840) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3406) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3456) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3425) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3532) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3433) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3589) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3406) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3456) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3425) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3433) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3406) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5609) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5589) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5560) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5689) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:138) at android.os.Looper.loop(Looper.java:123) at android.app.ActivityThread.main(ActivityThread.java:5021) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827) at com.android.internal.os.ZygoteInit.main


Ответ

У вас seekBar и textView объявлены два раза. Исправьте на это:
SeekBar sb1; TextView tv1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv1 = (TextView)findViewById(R.id.tv1); tv1.setText(""); sb1 = (SeekBar)findViewById(R.id.sb1); sb1.setOnSeekBarChangeListener(this); }

if (Time 12:00 = DateTime.Now) как правильно сделать?

есть программа на c#, в ней, например, раз в день в 12:00 должно выполняться определенное действие, а в другие часы другое действие.
в 12:00 он не захотел отрабатывать.
как правильно это реализовать?
DayToday = new DateTime(daynow1.Year, daynow1.Month, daynow1.Day, 12, 0, 0); if (DayToday == DateTime.Now) { Что-то делается } else { Что-то другое делается }


Ответ

var timeNow = DateTime.Now; if (timeNow.Hour == 12 && timeNow.Minute == 00) { }
Но этот код не гарантирует выполнение блока then в момент времени 12:00, если вызывать его реже одного раза в минуту.

Как удалить изображение из ImageView?

У меня есть ImageView в который я устанавливаю по очереди изображения из массива. Суть в том, что когда все изображения по очереди были установлены, программа бежит дальше оставляя последнее установленное изображение в ImageView а я хочу что ImageView после операций с ним принимал свое первоначальное значение, чтоб там ничего не оставалось. я пробовал setImageResource(0) и пробовал делать его невидимым и прочее, но это все не то, мне нужно просто вызвать функцию remove(), которая очистит ImageView. Но нет такой функции. Как почистить ImageView?
public class CheckABC extends AppCompatActivity implements View.OnKeyListener { private int finish; private int mistake; private int number; private boolean stopWhile; private Button bStart; private Button bCheck; private Context context; private Chronometer chronometer; private ImageView ivOutput; private ArrayList array; private EditText etInputLatter;
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_check_yourself); array = Letters.getInstance().getLetterses(); context = this; etInputLatter = (EditText) findViewById(R.id.etAddLetter);
etInputLatter.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN && (keyCode == KeyEvent.KEYCODE_ENTER)) { checkYourself(); return true; } return false; } }); }
public void startCheck(View v) { etInputLatter.setVisibility(View.VISIBLE); bCheck = (Button) findViewById(R.id.check); (bCheck).setEnabled(true);
bStart = (Button) findViewById(R.id.bStart); bStart.setEnabled(false); startCheck(); }
private void startChronometer() { chronometer = (Chronometer) findViewById(R.id.chronometer); chronometer.setBase(SystemClock.elapsedRealtime()); chronometer.start(); }
private void startCheck() { startChronometer(); new StartCheck().start(); }
private int[] mesInitializing(int arraySize) { int[] mes = new int[arraySize]; for (int i = 0; i < mes.length; i++) { mes[i] = -1; } return mes; }
private class StartCheck extends Thread {
@Override public void run() { super.run();
long startTime = System.currentTimeMillis();
int[] mes = mesInitializing(array.size());
boolean check = true; finish = 0; int i = 0;
while (finish < array.size()) {
number = (int) (Math.random() * array.size());
for (int obj : mes) { check = number != obj; if (!check) break; }
if (check) { runOnUiThread(new Runnable() { @Override public void run() { System.out.println(number); ivOutput = (ImageView) findViewById(R.id.ivLetter); ivOutput.setImageResource( array.get(number).getIdIRForPropis()); } });
mes[i] = number; i += 1; while (!stopWhile) { try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } stopWhile = false; } }
if (finish == array.size()) { chronometer.stop(); final long totalTime = System.currentTimeMillis() - startTime; final Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(totalTime); final SimpleDateFormat format = new SimpleDateFormat("mm:ss");
runOnUiThread(new Runnable() { @Override public void run() { ivOutput.setImageDrawable(null); chronometer.setBase(SystemClock.elapsedRealtime());
------>>>> ВОТ ЭТА СТРОЧКА etInputLatter.setText(" END");

AlertDialog.Builder builder = new AlertDialog.Builder(CheckABC.this); builder.setTitle("Results!") .setMessage("Your mistake " + mistake + "
" + " Your time " + format.format(cal.getTime()) + "
" + "Do you want try again?") .setIcon(R.drawable.goodresult) .setCancelable(false) .setNegativeButton("I want try again!", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { startCheck(); } }) .setPositiveButton("Cancel ", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); finish(); } }); AlertDialog alert = builder.create(); alert.show(); bStart.setEnabled(true); bCheck.setEnabled(false); } }); } } }
public void checkYourself(View v) { checkYourself(); }
private void checkYourself(){ String inputLatter = etInputLatter.getText().toString(); String vvodSKlavi = array.get(number).getVvodSKlavi();
if (inputLatter.isEmpty()) Toast.makeText(context, "enter you answer", Toast.LENGTH_SHORT).show(); else { if (vvodSKlavi.equals(inputLatter)) { Toast.makeText(context, "you are right", Toast.LENGTH_SHORT).show(); etInputLatter.setText(""); finish += 1; this.stopWhile = true; } if (!inputLatter.equals(vvodSKlavi)) { mistake += 1; Toast.makeText(context, "try one more", Toast.LENGTH_SHORT).show(); etInputLatter.setText(""); } } }
@Override public boolean onKey(View v, int keyCode, KeyEvent event) { return false; }
public void backToABC(View v) { finish(); } }


Ответ

Вам просто необходимо перед добавлением новой пикчи обnullять Ваш ImageView , типа imageView.setImageDrawable(null)

Как реализовать таймер/напоминание и взаимодействие с датой

Как реализовать таймер/напоминание по секундам, минутам, часам и дням включительно?
Пример:
"Установите таймер": Дни : Часы : Минуты : Секунды "Дедлайн": Дата, Часы : Минуты
Как получить автоматический отчёт времени при/после указания даты?
Пример:
"До выбранной Вами даты (и времени) осталось": Дни : Часы : Минуты : Секунды

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


Ответ

https://docs.python.org/3.4/library/datetime.html
>>> import datetime >>> deadline = datetime.datetime(2016, 2, 11, 9, 30) >>> print(deadline) 2016-02-11 09:30:00 >>> now = datetime.datetime.now() >>> print(deadline - now) 0:23:29.521400

Как удалить много записей из базы данных [закрыт]

Простое удаление работает очень долго (около 40 секунд из одной таблицы, в которой примерно 1,5 миллиона записей), нужно сделать быстрее (нужно удалить все данные пользователя). База MSSQL.


Ответ

Если нужно удалить ВСЕ записи из некоторой таблицы, используйте TRUNCATE, предварительно удалив внешние ключи, которые ссылаются на таблицу. Это самый быстрый способ. Он, в частности, игнорирует триггеры.
Если просто большое количество, то нужно удалять пачками. Оптимизировал я job, который удалял устаревшие данные, порядка ~100млн. строк в неделю. запускался на выходных. Опытным путём пришёл к выводу, что быстрее всего строки удаляется пачками по 100-500 штук.
Создаём временную табличку с ID'ами записей которые будем удалять. Пишем туда 100-500 ID'ов. и вызываем:
DELETE T2 FROM #Table T1 INNER LOOP JOIN Table T2 ON T1.ID = T2.ID
Здесь нужен именно LOOP. Хотя сервер скорее всего и без хинтов догадается. Вместо ID таблицы Table, может быть любой уникальный ключ. В случае, если ключ кластерный, то в таблицу #Table желательно вставлять ID'ы пачек строк, которые записаны в Table "рядом".
Если целиком пачку удалить не удалось, вызываем удаление по одной записи и логируем результаты.(ну я так делал:)) потом утром анализируем.
UPD: по поводу быстрого поиска удаляемых записей. Стоит создать индекс по UserId и посмотреть станет лучше или нет.
UPD: чуть-чуть про то, почему именно пачками.
Удаление по одной записи - это N транзакций. Выполняется довольно медленно... Таким был job до того, как я начал его оптимизировать. Пытаться удалить одним DML оператором ~1млн строк тоже плохо. Т.к. сама транзакция становится очень большой и рискуем получить нехватку памяти. Да и выполняется это долго.
В итоге задавая размер пачки, я к каждой таблице подобрал оптимальное число одновременно удаляемых записей. Начальник был доволен(с) :)

Как разделять логику вертикального и горизонтального положения экрана

У меня есть активность (или фрагмент) с RecyclerView, в котором находиться 3 пункта выбора, по открытию которого, открывается окно с соответствующей надписью. Если телефон\планшет находиться в вертикальном положении, тогда я хочу отображать надпись в новом окне, а если в горизонтальном — слева Recycler, а справа надпись. На фото привел пример (прошу прощения за мой paint :D). Как правильно разделить логику (как-то волшебно управлять активностями или фрагментами, может еще что-то) поведения на вертикальное и горизонтальное положение?


Ответ

Если вас интересует разделение по ориентации используйте суффиксы для ваших ресурсов: -land -port естественно если вы изначально, разрабатывали ваше app под device с портретной ориентацией, то вам достаточно будет сделать папку к примеру layout-land и при альбомной ориентации она будет работать, в противном случае значения будут браться по default из изначальной папки, даже если нет суффикса -port
При создании новой директории ресурсов в AS, очень хорошо показывает это квалификаторами UI-mode (могу ошибаться).
Если вы хотите ещё разделить на планшеты и телефоны, тогда с API 14 существует суффикс sw600 - для 7-и дюймовых планшетов, и sw800 для 10-и дюймовых планшетов. Всё работает абсолютно аналогично, тому что написано выше.
Ещё один момент, суффиксы могут записываться последовательно, и работают с определенными приоритетами, которые очень хорошо описаны в официальных guidline google. Вот нашел перевод для вас Обзор ресурсов

Как сделать программу мультиязычной?

В программе буквально 10-20 строк которые нужно переводить? Каким образом сделать?


Ответ

Вы можете посмотреть на msdn пошаговую инструкцию которая объясняет, как это сделать.
Если коротко, то вам нужно воспользоваться менеджером ресурсов:
ResourceManager LocRM = new ResourceManager("WindowsApplication1.WinFormStrings",typeof(Form1).Assembly); // вызов нужной локализации строки: MessageBox.Show(LocRM.GetString("strMessage"));
ResourceManager документация

Совместное использование сигналов и каналов

Никак не могу разобраться как решить задачу на совместное использование сигналов и каналов (пинг-понг) . Вот условие:
Написать программу игры в "пинг-понг" двух процессов через один канал. Первый процесс посылает второму 1, второй первому – 2, первый второму – 3, второй первому – 4 и т.д. Для синхронизации использовать сигнал. Игра завершается при нажатии клавиш Ctrl+C.
Вот мой код:
#include #include #include #include #include
int cnt=0;
int main(){ int fd[2]; pipe(fd); if(fork()==0){ write(fd[1],&cnt,sizeof(int)); while(read(fd[0],&cnt,sizeof(int))){//Дочерний процесс начинает пинг-понг printf("%d
",cnt); cnt++; write(fd[1],&cnt,sizeof(int)); } close(fd[1]); close(fd[0]); exit(1); } while(read(fd[0],&cnt,sizeof(int))){ printf("%d
",cnt); write(fd[1],&cnt,sizeof(int)); } close(fd[1]); close(fd[0]); return 0; }


Ответ

Поскольку процессы должны общаться через один канал, а канал имеет некоторый буфер, позволяющий писать несколько байт без читающего, процесс вызывающий read после write может прочитать собственные данные, в чём легко убедиться запустив немного исправленную вашу программу:
#include #include #include #include #include
int cnt=0;
int main(){ int fd[2]; pipe(fd); if(fork()==0){ printf("2 w%d
",cnt); write(fd[1],&cnt,sizeof(int)); while(cnt<100 && read(fd[0],&cnt,sizeof(int))){//Дочерний процесс начинает пинг-понг printf("2 r%d
",cnt); cnt++; printf("2 w%d
",cnt); write(fd[1],&cnt,sizeof(int)); } close(fd[1]); close(fd[0]); exit(1); } while(cnt<100 && read(fd[0],&cnt,sizeof(int))){ printf("1 r%d
",cnt); cnt++; printf("1 w%d
",cnt); write(fd[1],&cnt,sizeof(int)); } close(fd[1]); close(fd[0]); return 0; }
Результаты:
$ ./a.out 2 w0 1 r0 1 w1 1 r1 1 w2 1 r2 1 w3 1 r3 1 w4 1 r4 1 w5 1 r5 1 w6 1 r6 1 w7 1 r7 1 w8 1 r8 1 w9 1 r9 1 w10
Первый процесс сам справляется, а второй ему изредка помогает. Необходимо чтобы каждый процесс после записи очередного числа ожидал готовности данных для него, блокирующее чтение тут не поможет, так как данные в канале уже есть.
Для ожидания можно бы использовать функцию pause(), но если сигнал придёт до входа в неё, это приведёт к бесконечному ожиданию, поэтому лучше sleep(1) в цикле с проверкой флага, который изменяется в функции-перехватчике сигнала.
Программа с обменом сигналами.
#include #include #include #include #include
int cnt=0; int signaled=0;
void intr(int n) { // обработчик сигнала signaled=1; }
int main(){ int fd[2]; pipe(fd); int pid; signal(SIGUSR1, intr); if((pid=fork())==0){ // Дочерний процесс начинает пинг-понг pid= getppid(); printf("%d w%d
",pid,cnt); kill(pid, SIGUSR1); write(fd[1],&cnt,sizeof(int)); } while(1) { while(!signaled) sleep(1); if(read(fd[0],&cnt,sizeof(int))<=0) break; printf("%d r%d
",pid,cnt); cnt++; printf("%d w%d
",pid,cnt); signaled=0; // после kill в любом месте может прийти ответ, поэтому здесь обнуляем флаг signal(SIGUSR1, intr); kill(pid, SIGUSR1); write(fd[1],&cnt,sizeof(int)); } close(fd[1]); close(fd[0]); return 0; }
Примечание. Иногда процессы приостанавливаются на одну секунду, это значит сигнал пришёл после проверки условия, но перед ожиданием сигнала внутри sleep()

OnClickListener для RecyclerView

Мой код:
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView txtViewTitle; private ImageView imgViewIcon;
public ViewHolder(View itemLayoutView) { super(itemLayoutView); itemLayoutView.setOnClickListener(this); txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.album_title); imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.album_icon); }
@Override public void onClick(View v) { Intent intent = new Intent(v.getContext, SecondActivity.class;
Тут ошибка--> startActivity(intent) } }
то есть, как будто этого метода не существует!
Вопрос:
1) Что неправильно написал?
2) Как добавлить клик, если item-ы RecylerView будет динамически увеличиваться?


Ответ

Передавайте context в конструктор. Вот так по идее правильно:
Intent intent = new Intent(сontext, SecondActivity.class); context.startActivity(intent);
В activity/fragment-e добавьте данный слушатель:
yourRecyclerView.addOnItemTouchListener( new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { //click } }) );

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

Делаю игру, развивающую скорость печать(знаю, такие уже есть). Понимаю, что нужен файл либо база данных слов, как именно это лучше реализовать, и где можно скачать подобные словари?


Ответ

Реализация:
Самое простое, что приходит в голову это хранить слова в txt файле.
Загружаем строку из файла. Разбиваем ее в зависимости от разделителя для слов, который был использован. Складываем это все в массив и дальше пользуемся как угодно.
Скачать:
Есть частотные словари, вот например такой http://www.wordfrequency.info/100k.asp

Python, разделение строки по символам через метод re.split

Необходимо разделить входящую строку по числам и буквам, например:
s = "k10Z18i13Q19u" a = re.split("(\d*)", s)
На выходе получим:
['k', '10', 'Z', '18', 'i', '13', 'Q', '19', 'u']
Но так же получим ошибку:
FutureWarning: split() requires a non-empty pattern match. return _compile(pattern, flags).split(string, maxsplit)
Данный метод очень подходит для решения моей задачи, но не пойму, отчего ошибки. Именно шаблон для разделения строки (\d*) взял из чужого решения, но не знаю как именно он работает, не смог найти описания. Можете подсказать, что делаю не так или каким методом лучше решить данную задачу?


Ответ

Замените (\d*) на (\d+)
Поясню что не так: (\d*) подразумевает ноль или более цифр. То есть пустым разделитель тоже может быть. Если это учитывать, то ваш результат мог быть и таким:
['', 'k', '10', 'Z', '18', 'i', '13', 'Q', '19', 'u', '']
Также если бы у вас были две буквы подряд, то между ними тоже могла бы "найтись" пустая строка. Текущая реализация этого метода не находит пустые подстроки, которые могут подходить под регулярное выражение. Однако в будущем планируется это реализовать, поэтому вы получаете FutureWarning. Вас предупреждают, что если вы ничего не измените, после обновления вас может ожидать сюрприз.
См. также re.split

Подмена значения переменной через ссылку с#

В приложенном коде (код упрощен) я, по замыслу, желал переназначить значение переменной с помощью буферной другой. В процессе я понял, что делаю это неверно, т.к. кличка питомца все же выдавалась изначальная. Как же мне, выполнить это преобразование?
namespace Project { class Program { static void Main(string[] args) {
Animal[,] Animals = new Animal[10, 10]; for (int i = 0; i < 10; i++) for (int j = 0; j < 10; j++) Animals[i,j] = new Animal(0,0,"Unknow");
//FindCat(Animals) = new Cat(FindCat(Animals).X, FindCat(Animals).Y, "Jake"); //Ошибка компиляции, "иду иным путем"
Animal Buffer = FindCat(Animals); Buffer = new Cat(Buffer.X, Buffer.Y, "Jake"); //Не работает и при //Buffer = new Cat(FindCat(Animals).X, FindCat(Animals).Y, "Jake"); Console.Write(Animals[5,5].Name);//Unknow! Console.Read(); }
static Animal FindCat(Animal[,] a) { //На деле выбор сложнее, но не думаю, что столь важно то, //как выбирается индекс здесь, но выбор обязателен return a[5, 5]; } }
class Animal { public string Name; public int Y; public int X;
public Animal() { } public Animal(int x, int y, string name) { X = x; Y = y; Name = name; } }
class Cat : Animal { public string Color;
public Cat(int x, int y, string name) { X = x; Y = y; Name = name; } } }


Ответ

Присвоение нового значения переменной Buffer (Buffer = new Cat(...);) изменит куда указывает переменная (ссылка, reference) Buffer, а переменная (ссылка, reference) Animals[5, 5] будет продолжать указывать на старый объект.
static Animal GetAtCatPosition(Animal[,] animals) { return animals[5, 5]; }
static void PutAtCatPosition(Animal[,] animals, Animal a) { animals[5, 5] = a; }
Animal Buffer = GetAtCatPosition(Animals); PutAtCatPosition(Animals, new Cat(Buffer.X, Buffer.Y, "Jake"));
Вариант 2 (Омега) Fundamental theorem of software engineering
public class AnimalHolder { public Animal Animal { get; set; } }
static AnimalHolder FindCat(AnimalHolder[,] a) { return a[5, 5]; }
AnimalHolder[,] Animals = new AnimalHolder[10, 10]; for (int i = 0; i < 10; i++) for (int j = 0; j < 10; j++) Animals[i,j] = new AnimalHolder() { Animal = new Animal(0, 0, "Unknown") };
AnimalHolder Buffer = FindCat(Animals); Buffer.Animal = new Cat(Buffer.X, Buffer.Y, "Jake"); Console.Write(Animals[5,5].Animal.Name);//Jake! Console.Read();

Python формат .рус

Когда создаю проект на django, есть файлы __init__.рус, wsgi.рус. Я их удаляю, но иногда они сами появляются опять. В чем проблема?


Ответ

Эти файлы содержат питоновский байт код, в который интерпретатор компилирует твой исходный код. Просто игнорируй их, добавь в .gitignore, чтобы не лезли в репозиторий и т.д.

Нужно вывести древовидную структуру многомерного массива объектов

Есть массив обьектов:
var testObject = [ { name: 'Название 1', value: 2, childnodes: [ { name: 'Название 4', value: 25, childnodes: [ { name: 'Название 9', value: 32, childnodes: [ ] }, { name: 'Название 10', value: 0, childnodes: [ { name: 'Название 11', value: 5, childnodes: [ ] }, { name: 'Название 12', value: 2267, childnodes: [ { name: 'Название 15', value: 35, childnodes: [ { name: 'Название 16', value: 55, childnodes: [ ] } ] } ] } ] } ] }, { name: 'Название 5', value: 12, childnodes: [ ] }, { name: 'Название 6', value: 45, childnodes: [ ] }, ] }, { name: 'Название 2', value: 32, }, { name: 'Название 3', value: 7, childnodes: [ { name: 'Название 7', value: 12334, childnodes: [ { name: 'Название 13', value: 122, childnodes: [ ] } ] }, { name: 'Название 8', value: 86, childnodes: [ { name: 'Название 14', value: 222, childnodes: [ ] } ] } ] } ];
Задание состоит в том чтоб с помощью знаков псевдографики вывести древовидную структуру обьекта типа:
// ├ Название 1 // │ ├ Название 4 // │ │ ├ Название 9 // │ │ └ Название 10 // │ │ ├ Название 11 // │ │ └ Название 12 // │ │ └ Название 15 // │ │ └ Название 16 // │ ├ Название 5 // │ └ Название 6 // ├ Название 2 // └ Название 3 // ├ Название 7 // │ └ Название 13 // └ Название 8 // └ Название 14
Что я "нашаманил" на данный момент:
var symbols = Array("├", "│", "└"); //массив символов в качестве префикса для значений function buildItem(item){ var сontainer = item.name+ "
"; if( item.childnodes ) { for (var i = 0; i < item.childnodes.length; i++){ if (i < item.childnodes.length-1 && item.childnodes.length!==0) container += ( symbols[0]+ buildItem(item.childnodes[i])); else container+=(symbols[2] + buildItem(item.childnodes[i])); }; container+=symbols[1]; } return container; } var content = Array(); for (var i = 0; i < testObject.length; i++) { content[i] = buildItem(testObject[i]); }; var str = content.join("
"); console.log(str);
Результат:
Название 1 ├ Название 4 ├ Название 9 │ └ Название 10 ├ Название 11 │ └ Название 12 └ Название 15 └ Название 16 │ │ │ │ │ ├ Название 5 │ └ Название 6 │ │ Название 2 Название 3 ├ Название 7 └ Название 13 │ │ └ Название 8 └ Название 14 │ │ │
Тоесть работает код не совсем так, как хотелось бы, даже не так как надо. Суть вопроса: я вроде как и ошибку понимаю, что в первом вызове функции в принципе все хорошо, но последующая рекурсия не дает желаемого результата; прошу обьясните где я ошибаюсь, буду очень благодарен


Ответ

При печати очередного узла, перед ним нужно напечать префикс, который будет содержать связи его предков с их сиблингами. Можно заметить 2 вещи:
Для всех детей одного узла префикс будет один и тот же, поэтому его можно накапливать в параметре рекурсивной процедуры; Если узел является последним ребенком, то для него линию вниз рисовать не нужно.
Получается как-то так:
function buildTree(tree, prefix) { if (typeof prefix === 'undefined') prefix = ''; var result = ''; tree.forEach(function(e, i) { var lastNode = i == tree.length - 1; result += prefix + (lastNode ? '└' : '├') + ' ' + e.name + '
'; if (e.childnodes) result += buildTree(e.childnodes, prefix + (lastNode ? ' ' : '|') + ' '); }); return result; }
Результат:
├ Название 1 | ├ Название 4 | | ├ Название 9 | | └ Название 10 | | ├ Название 11 | | └ Название 12 | | └ Название 15 | | └ Название 16 | ├ Название 5 | └ Название 6 ├ Название 2 └ Название 3 ├ Название 7 | └ Название 13 └ Название 8 └ Название 14
function buildTree(tree, prefix) { if (typeof prefix === 'undefined') prefix = ''; var result = ''; tree.forEach(function(e, i) { var lastNode = i == tree.length - 1; result += prefix + (lastNode ? '└' : '├') + ' ' + e.name + '
'; if (e.childnodes) result += buildTree(e.childnodes, prefix + (lastNode ? ' ' : '|') + ' '); }); return result; } var testObject = [{ name: 'Название 1', value: 2, childnodes: [{ name: 'Название 4', value: 25, childnodes: [{ name: 'Название 9', value: 32, childnodes: [] }, { name: 'Название 10', value: 0, childnodes: [{ name: 'Название 11', value: 5, childnodes: [] }, { name: 'Название 12', value: 2267, childnodes: [{ name: 'Название 15', value: 35, childnodes: [{ name: 'Название 16', value: 55, childnodes: [] }] }] }] }] }, { name: 'Название 5', value: 12, childnodes: [] }, { name: 'Название 6', value: 45, childnodes: [] }, ] }, { name: 'Название 2', value: 32, }, { name: 'Название 3', value: 7, childnodes: [{ name: 'Название 7', value: 12334, childnodes: [{ name: 'Название 13', value: 122, childnodes: [] }] }, { name: 'Название 8', value: 86, childnodes: [{ name: 'Название 14', value: 222, childnodes: [] }] }] }]; document.body.innerHTML = buildTree(testObject).split('
').join('
'); body { font-family: monospace; white-space: pre; }

Сервер-клиент на Java

Необходимо сделать Сервер-Клиент.
Со стороны сервера - таблица с именами работников и их ID .
Со стороны клиента - программа для добавления нового сотрудника и вытягивания всей таблицы.
Просить реализации было бы сверхнаглостью, поэтому прошу советов и рекомендаций, так как ни разу не сталкивался с этим.


Ответ

Если хотите писать велосипед, то вот самый быстрый на руку вариант клиент-серверного взаимодействия.
Сервер:
class TCPServer{ public static void main(String argv[]) throws Exception{ String clientSentence; String capitalizedSentence; ServerSocket welcomeSocket = new ServerSocket(6789);
while(true){ Socket connectionSocket = welcomeSocket.accept(); BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); clientSentence = inFromClient.readLine(); System.out.println("Received: " + clientSentence); capitalizedSentence = clientSentence.toUpperCase() + '
'; outToClient.writeBytes(capitalizedSentence); } } }
Клиент:
class TCPClient{ public static void main(String argv[]) throws Exception{ String sentence; String modifiedSentence; BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in)); Socket clientSocket = new Socket("localhost", 6789); DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); sentence = inFromUser.readLine(); outToServer.writeBytes(sentence + '
'); modifiedSentence = inFromServer.readLine(); System.out.println("FROM SERVER: " + modifiedSentence); clientSocket.close(); } }
Если нужно нормальное решение, то сервлеты, или какую-то библиотеку вроде netty
Для работы с базой использовать какую-нибудь ORM вроде Hibernate

C# пробелы после значения в таблице после загрузки из локальной базы данных

В Visual Studio 2015 сгенерировал локальную базу данных, добавил datagrid и привязал его к bindingSource. Все данных сохраняются и загружаются, но после загрузки добавляются пробелы к тексту. К примеру: в поле nchar(10) "hhhh__________".Там где "_" это пробелы. Спасибо


Ответ

для nvarchar память выделяться во время заполнения строки символами, для vchar - она уже выделена размерностью.
nchar [ ( n ) ]
Строковые данные постоянной длины в Юникоде. Параметр n определяет длину строки и должен иметь значение от 1 до 4000. Размер при хранении составляет удвоенное значение n в байтах. Если кодовая страница параметров сортировки использует двухбайтовые символы, размер хранения остается равным n байт. В зависимости от символьной строки для хранения n символов может понадобиться менее n байт. По стандарту ISO синонимами для nchar являются national char и national character..
nvarchar [ ( n | max ) ]
Строковые данные переменной длины в Юникоде. Параметр n определяет длину строки и должен иметь значение от 1 до 4000. Значение max указывает, что максимальный размер при хранении составляет 2^31-1 байт (2 ГБ). Размер хранилища в байтах вдвое больше числа введенных символов + 2 байта. По стандарту ISO синонимами для типа nvarchar являются типы national char varying и national character varying.

Как поменять блоки местами без правки html?

Есть резиновый блок со старой(зачеркнутой) и новой ценой. Как поменять цены местами, чтобы сначала была новая, а потом старая без правки html, чтобы блоки оставались резиновыми и по располагались по центру страницы? фидл
.price { text-align: center; padding: 0 25px; display: block; }

20.170 руб 19.162 руб


Ответ

Про FlexBox: на русском и английском
Поддержка FlexBox caniuse.com

1
#order
Применяется к: дочернему элементу / flex-элементу.
По умолчанию flex-элементы располагаются в исходном порядке. Тем не менее, свойство order может управлять порядком их расположения в контейнере.
.price { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -webkit-justify-content: center; -ms-flex-pack: center; justify-content: center; text-align: center; padding: 0 25px; } .price ins { -webkit-box-ordinal-group: 2; -webkit-order: 1; -ms-flex-order: 1; order: 1; } .price del { -webkit-box-ordinal-group: 3; -webkit-order: 2; -ms-flex-order: 2; order: 2; }

20.170 руб 19.162 руб

2
*{ box-sizing: border-box; } .price { display: block; padding: 0 25px; } .price ins { float: left; width: 50%; text-align: right; padding: 0 25px; } .price del { float: right; width: 50%; }
20.170 руб 19.162 руб

Python. Сортировка по алфавиту списка словарей

Имеется список словарей следующего содержания.
guys_json = [ { "id": 3, "full_name": "Ффффф", "post": "Водитель", "image": "xxx.jpg"}, { "id": 20, "full_name": "Рррр", "post": "Повар", "image": "yyy.jpg"}, { "id": 11, "full_name": "Аааа", "post": "Директор", "image": "tre.jpg"}, ....]
Необходимо отсортировать его в алфавитном порядке средствами python по полю 'full name' и раскидать объекты в категории по буквам кириллического алфавита ("А", "Б"... "Я"). Подскажите, пожалуйста, с какой стороны подойти к решению


Ответ

Данные в вопросе не являются JSON объектом, например, json.loads() выкинет ошибку.
Если интерпертировать данные как исходный код Питона, тогда guys_json (вводящее в заблуждение имя) является обычным списком словарей (никакого отношения к JSON-формату, кроме того что синтаксис похож (как и задумано)).
Легко отсортировать список словарей по значению заданного поля:
list_of_dicts.sort(key=lambda d: d['full_name'])
Уже есть готовая функция, которую можно вместо lambda использовать:
from operator import itemgetter
list_of_dicts.sort(key=itemgetter('full_name'))
Обе вызова сортируют, используя лексикографический порядок, что для не-ASCII символов может быть не то что нужно. См. Поиск упорядоченной подстроки в строке Python

шаблонный класс - друг

Как объявить в такой ситуации A другом B и можно ли использовать одинаковый параметр t?
template class A; template class B { public: friend template class A; // <-- ошибка };


Ответ

Всё ведь просто:
template class A; template class B { public: friend class A; };

Если нужно, чтобы другом были все A, а не только те, что имеют тот же шаблонный параметр, то можно написать так:
template class A; template class B { public: template friend class A; };

Swap переменных xor'ом в одно выражение

Является ли такой способ обмена значений переменных неопределённым поведением?
http://codepad.org/3IFTpgwR
#include
int main(void) { int x = 10, y = 20; x ^= y ^= x ^= y; printf("%d %d", x, y); return 0; }
Здесь есть двукратное присваивание переменной x - является ли оно некорректным?
PS: Вопрос возник из-за того, что другие языки иначе вычисляют эту конструкцию.


Ответ

Да, является. Операция xor-c-присваиванием (^=) не является точкой следования
Многократное присваивание в рамках одной точки следования - UB.
Для обмена переменных в c++ есть std::swap()