Страницы

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

среда, 24 апреля 2019 г.

Что означает ~$ в терминале bash (в начале строки)?

Что означает ~$ в терминале bash (в начале строки)?


Ответ

Выводим значение переменной PS1 (primary prompt string):
$ echo $PS1 \[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$
Разбираем специальные символы:
\u - The username of the current user. \h - The hostname, up to the first ‘.’. \w - The current working directory, with $HOME abbreviated with a tilde. \$ - If the effective uid is 0, #, otherwise $.
В итоге ~$ означает пользователя в домашней директории.
Источник: https://www.gnu.org/software/bash/manual/bash.html

редактирование xml файла в c#

вот есть у меня список в xml файле, я по нему прохожусь и вывожу в textbox, но что если нужно добавить/удалить элемент в xml файле? как через код это можно сделать?
item1 item2 item3
xml файл считываю так
XmlDocument doc = new XmlDocument(); doc.Load("list.xml");


Ответ

Изменить XML файл можно так:
// Считать файл var doc = new XmlDocument(); doc.Load("My file name");
// Получить первый элемент var node = doc.DocumentElement.ChildNodes[0];
// удалить его doc.DocumentElement.RemoveChild(node);
// создать новый элемент var newNode = doc.CreateElement("list"); newNode.InnerText = "item4";
// добавить новый элемент doc.DocumentElement.AppendChild(newNode);
// Сохранить в файл doc.Save("my file name");

Java типы, допускающие NULL значения

Существуют ли в Java что-то вроде типов, допускающих NULL значения? То есть с сервера приходит, на пример, int, но вместо него может прийти NULL В C#можно это обработать, используя типы, допускающие, NULL значения.
int? a = NULL;
Как это следует обрабатывать в Java?


Ответ

В Java ссылка любого класса может принимать значение null Примитивы же...
Целые числа - byte, short, char, int, long Числа с плавающей точкой (иначе дробные) - float, double Логический - boolean
...лишены такой возможности.
Если требуется создать ссылку на один из примитивных типов данных, необходимо использовать соответствующий класс-обертку. Также в таких классах есть некоторые полезные методы и константы, например минимальное значение типа int можно узнать использовав константу Integer.MIN_VALUE. Оборачивание примитива в объект называется упаковкой (boxing), а обратный процесс распаковкой (unboxing). (источник)
Соответственно для решения вашей задачи необходимо использовать классы-обёртки примитивов: int -> Integer, short -> Short и т.п.

SQL-Server - Попытка открыть доступ к бд, попытка экспорта бд

Экспорт бд выдает ошибку, что не удалось подключиться к серверу. Сервер пингуется. Удаленно подключиться к серверу не могу, выдает ошибку входа.
Сервер не в домене, влияет ли это на работу?


Ответ

Проверьте включен ли протокол TCP/IP в Configuration Manager.

включите разрешение на подключение через SQL авторизацию.

создайте нового пользователя для подключения.

Выберете роль public, укажите сопоставление с вашей БД, укажите схему по умолчанию.

Добавьте разрешения на подключение и просмотр объектов.

Преобразование строки в выражение

Как преобразовать строку в выражение?
$a = "$c.$b"; // string $c = "мама"; $b = "папа";
// функция, преобразующая строку в выражение, либо регулярное выражение
echo $a; // выводим "мамапапа";


Ответ

Можно через переменные переменных. Надо будет только в строке $a убрать у переменных доллары
$a = 'c.b'; $c = "мама"; $b = "папа";
$temp = explode('.', $a);
foreach ($temp as $item) { echo $$item; }

Найти все натуральные числа, которые делятся на каждую из своих цифр

Задача - найти все натуральные числа, не превосходящие заданное число N и делящиеся нацело на каждую из своих цифр Дошел до такого кода:
#include using namespace std;
int main() { int n = 0; cout << "Enter n: "; cin >> n; int n1 = n;
for (int i = 1; i < n; i++) { int length = 0; while (n != 0) { //Узнаем длину числа length++; n /= 10; } int *mas = new int[length]; while (n1 != 0) { mas[i] = n1 % 10; //добавляем цифры числа в массив n1 /= 10; }
bool t = true;
for (int a = 0; a < length; a++) { if (i%mas[a] != 0) { t = false; //проверяем, делится или нет } } if (t == true) { cout << i<< " "; }
}
return 0; }
Но всё равно не работает. В чём проблема?


Ответ

Как-то уж очень сложно у вас...
bool test(int i) { bool dig[9] = {false}; int k = i; while(k) { int d = k%10; k /= 10; if (d == 0 || dig[d-1]) continue; dig[d-1] = true; if (i%d) return false; } return true; }
int main(int argc, const char * argv[]) { int N; cin >> N; for(int i = 1; i <= N; ++i) { if (test(i)) cout << i << endl; } }
Это если хочется сэкономить на проверках и не проверять дважды одну и ту же цифру, но для реальных чисел это особой роли не играет, так что сократить можно до
bool test(int i) { int k = i; while(k) { int d = k%10; k /= 10; if (d && i%d) return false; } return true; }

Обработка исключений с++

Как обработать исключение, которое возникает при попытке инициализировать значение за пределами массива, или при чтении из-за его пределов. Пробовал в catch писать "exception e", но оно не ловит.


Ответ

если это встроенный c++ массив то можно ставить ассерты перед каждым доступом к его элементу -
#define array_size 100 int v[array_size];
int i = 100; assert(i >= 0 && i < array_size); // бросит исключение v[i] = 123;
если у вас std::vector
то как уже сказали в комментариях - воспользоваться функцией членом std::vector::at которая гарантированно бросит исключение при выходе за пределы вектора.
std::vector v(5); v.at(5) = 1.0f; // бросит исключение

в массиве содержатся разные элементы

Вот код:
int *p;
// так как в функцию указатель в таком виде передать нельзя: компилятор заругается, то:
p = (int*)malloc(sizeof(int)); // в функции я переопределю его размер через realloc
func(p);
for (i = 0; i < count; i++) printf("%d ", p[i]); // возвращает мусор /* если из функции делать вывод, то в консоль выводятся корректные значения */
Помогите понять, в чём тут дело ?
Прототип функции func
void func(int *arr);
Делать int * не хочу пока что: хочу понять, что тут не так...


Ответ

Итак, у вас есть указатель int* p; и вы хотите инициализировать его через вызов функции. Можно сделать так:
void func(int** inPtr){ int* tmp = (int*)malloc(0x100); *inPtr = tmp; //(*inPtr)[2] = 0x02;//пишем 3-й элемент }
void main(void){ int* p; func(&p); //printf("0x%X
", p[2]);//читаем 3-й элемент }
func принимает указатель на указатель на int, то есть адрес указателя на int. В main мы через ссылку получили адрес нашего указателя и передали его в функцию. В функции мы через разыменование из адреса получили сам указатель и записали в него выделенный буфер.
Пляски с tmp нужны, чтобы в отладчике можно было посмотреть реальный адрес выделенного буфера и сравнить его с тем, что будет в p после выполнения funс()

Добавить разделитель элементов в RecyclerView

Есть такая разметка для элемента (т.е. пункта списка для RecyclerView)








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


Ответ

Для этого можно прописать View- ку

Как изменить права доступа по умолчанию Unix.

Подскажите, как изменить права доступа для файлов по умолчанию. Для каталогов стоит 777, для файлов 666. Мне необходимо для файлов поставить по умолчанию 777 при создании. Как это сделать?


Ответ

Мне необходимо для файлов поставить по умолчанию 777 при создании. Как это сделать?
если коротко, то — никак. длинное изложение — ниже, а в конце упомянуты соображения по поводу того, «что, если очень хочется…».

в конечном (для процесса) итоге файл/каталог создаётся функцией open() (см. $ man 1 open и упоминание в posix).
при этом во втором аргументе должен быть передан (в том числе и) бит O_CREAT (для каталога — ещё и O_DIRECTORY), а третьим аргументом должен идти набор бит, задающих разрешения процессам (в зависимости от того, от чьего имени они действуют) на доступ к создаваемому файлу/каталогу.
но указанный набор бит — не «окончательный приговор». как минимум на него может оказать влияение file mode creation mask (umask) — свойство процесса (наследуемое дочерними процессами), указывающее, какие биты разрешений надо скрыть («замаскировать») у создаваемого файла/каталога. именно «скрыть», но не добавить.
отсюда, надеюсь, становится чуть понятнее, почему, если мы указали процессу «ничего не скрывать» (т.е., umask a=rwx, или, в числовом виде — umask 0), каталог создаётся с битами исполнимости, а файл всё равно — без этих битов: процесс просто не запрашивал установку этих битов при вызове функции open()
почему же не запрашивал? потому что создатели данной конкретной программы, породившей запущенный вами процесс, руководствовались стандартом posix
When a file that does not exist is created, the following features defined in the System Interfaces volume of POSIX.1-2008 shall apply unless the utility or function description states otherwise: ... 3. If the file is a regular file, the permission bits of the file shall be set to: S_IROTH | S_IWOTH | S_IRGRP | S_IWGRP | S_IRUSR | S_IWUSR (see the description of File Modes in XBD Headers, ) except that the bits specified by the file mode creation mask of the process shall be cleared. If the file is a directory, the permission bits shall be set to: S_IRWXU | S_IRWXG | S_IRWXO
мой вольный перевод:
когда создаётся файл, который до этого не существовал, следующие возможности (features) должны быть применены (если иное не не отмечено в описании утилиты или функции): ... 3. если это обычный файл, должны быть выставлены следующие биты разрешений: S_IROTH | S_IWOTH | S_IRGRP | S_IWGRP | S_IRUSR | S_IWUSR (см. описание file modes в ) за исключением тех битов, которые должны быть скрыты (удалены) согласно значению file mode creation mask (umask) процесса. если файл является каталогом, должны быть выставлены биты: S_IRWXU | S_IRWXG | S_IRWXO
или, чуть проще:
обычные файлы должны иметь биты a=rw (синонимы: ugo=rw и u=rw,g=rw,o=rw), в числовом виде — 0666 (в восьмиричной системе счисления) каталоги должны иметь биты a=rwx (синонимы: ugo=rwx и u=rwx,g=rwx,o=rwx), в числовом виде — 0777 (в восьмиричной системе счисления) биты, указанные в umask, должны быть скрыты (удалены)

так можно ли изменить такое (подчиняющееся стандарту) поведение программ? теоретически — можно. известные мне варианты:
изучите документацию к программе (или её исходный код). возможно, ей можно указать (например, через конфигурационные файлы) создавать файлы с нужным вам набором бит (т.е., переопределять третий аргумент функции open()). программу можно пересобрать, исправив умолчальное значение набора бит. можно воспользоваться каким-нибудь монитором изменения файлов (например, подсистемой inotify программы linux) или какой-то аналогичной «пост-обработкой».

Скрыть компонент из toolbar

Как программно можно скрыть один из MenuItem на toolbar?


Ответ

main_menu.xml


...


Activity.java
public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_menu, menu); MenuItem shareItem = menu.findItem(R.id.menu_action_share); if (что-то) shareItem.setVisible(false); //скрыть программно return true; }

Если Вы хотите контролировать меню из фрагмента, то нужно вызвать setHasOptionsMenu в onCreate() фрагмента.
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); }
Затем переопределить onCreateOptionsMenu
@Override public boolean onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.main_menu, menu); menu.clear();//например убрать все элементы меню. return true; }

Почему Word открывается в режиме только для чтения

Не могу понять в чем дело. Вроде бы скопировал у себя же рабочий код, но почему-то не работает. А не работает потому что word открывается в режиме для чтения. Хотя перед этим всё работало.
private void button5_Click(object sender, EventArgs e) { //показываем панель для введения значений в бланк panel2.Visible = true; //скрываем изображение pictureBox1.Visible = false;
//Создаём новый Word.Application Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
//Загружаем документ Microsoft.Office.Interop.Word.Document doc = null;
//вариант открытия существующего файла object fileName = "E:\\R1.rtf"; object falseValue = false; object trueValue = false; object missing = Type.Missing;
doc = app.Documents.Open(ref fileName, ref missing, ref trueValue, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
//Теперь у нас есть документ который мы будем менять.
//Очищаем параметры поиска app.Selection.Find.ClearFormatting(); app.Selection.Find.Replacement.ClearFormatting();
//Задаём параметры замены и выполняем замену нп поле варианта object findText = ""; object replaceWith = VarApply; object replace = 2;
app.Selection.Find.Execute(ref findText, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref replaceWith, ref replace, ref missing, ref missing, ref missing, ref missing); app.Visible = false;
doc.Save(); doc.Close(Microsoft.Office.Interop.Word.WdSaveOptions.wdSaveChanges); app.Quit(false); richTextBox1.LoadFile("E:\\R1.rtf");
}
Не хочет сохранять изменённый файл в строке doc.Save()


Ответ

doc = app.Documents.Open(ref fileName, ref missing, ref trueValue, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
Третий параметр - ReadOnly, поставьте его missing.
Да и вообще можно написать кратко
app.Documents.Open(ref fileName)

Задание валидного двумерного массива

Есть работающий код задания двумерного массива:
field=[] for i in range(8): block = [] for j in range(8): block.append('X') field.append(block)
Выгялдит не очень, но он работает! Суть проблемы в том что при "не красивой" инициализации все списки отдельные объекты и когда мы делаем изменение в ячейке меняется только она. Как сократить, чтобы код был более "питонистичным", но и сохранить правильную изменяемость ячеек (функциональность)?
Что-то вроде
field = [['X']*8]*8
Но так при изменении поля, меняются все поля по координате из-за того что все ссылаеться на один список. Хочу чтобы при field[2][2] = 'O' изменялась только ячейка [2][2], а не весь столбец
field[2][2] = 'O'
['X', 'X', 'O', 'X', 'X', 'X', 'X', 'X'] ['X', 'X', 'O', 'X', 'X', 'X', 'X', 'X'] ['X', 'X', 'O', 'X', 'X', 'X', 'X', 'X'] ['X', 'X', 'O', 'X', 'X', 'X', 'X', 'X'] ['X', 'X', 'O', 'X', 'X', 'X', 'X', 'X'] ['X', 'X', 'O', 'X', 'X', 'X', 'X', 'X'] ['X', 'X', 'O', 'X', 'X', 'X', 'X', 'X'] ['X', 'X', 'O', 'X', 'X', 'X', 'X', 'X']
Пытался использовать [:], list, но результата нет


Ответ

L = [['X' for n in range(8)] for n in range(8)]

Команда на DoubleClick по элементу ListView

Есть

Где StudentList - коллекция студентов, SelectedStudent - конкретный выбранный студент.
Необходимо по двойному нажатию на ListView, вызвать команду EditStudent. Команды умею привязывать только к Button. Как поступить в этом случае?


Ответ

Давайте воспользуемся такой штукой как InputBindings
...
Это уже работает, но у всех ItemsControl есть нюанс - по умолчанию они не растягивают свои элементы, это можно увидеть, если задать StackPanel любой цвет в Background, поэтому команда будет вызываться только при клике четко по тексту элемента. Исправить это можно, подкорректировав стиль ListViewItem
...
Ну и нужно еще что-то сделать с отступами, так как то что у вас сейчас StackPanel Margin="10" вам скорее всего не понравится, например можно обернуть всё в прозрачный Border (InputBindings теперь переезжают в него, в StackPanel они больше не нужны):
...
Вот тогда между элементами будут визуальные отступы, но команда будет отрабатывать по клику в любом месте элемента

Экземпляры Vue.js?

Сколько экземпляров можно создать?
new Vue({ el: "#example", data: {} })
Или надо только один корневой? По документации не совсем понял.


Ответ

В 99.9% случаев вам не понадобится создавать более 1 инстанса Vue
Всё остальное реализуется с помощью компонентов https://ru.vuejs.org/v2/guide/components.html
Создаете

//your content
и с помощью шаблонизаторов все страницы наследуете от главного шаблона.

Какой порядок выполнения операций и почему?

static class Program { static void Main() { var x=3; var y=(++x)*(x++)|4/2^2; Consoley.Write(y); } }


Ответ

В соответствии с приоритетами слева направо:
(++x) * (x++) | 4 / 2 ^ 2
^ ^^^^^ +--------------------- x=4, returns 4 | ^^^^^--------------- x=5, returns 4 `--------------------- 4*4=16 ^ | ^ | ^-+--------- 4 | | ^------- 2 | `--------- 4/2=2 | ^----- 2^2=0 | | ^--- 2^2=0 | `----- 2^2=0 `------------- 16|0=16
PS: Надеюсь, не ошибся.

Стоит ли использовать шаблоны с большим количеством строгих типов

Есть функция, реализация которой не отличается при любых типах данных. Но тип данных не может быть абсолютно любым ( всего возможных типов данных которые обработает функция - 9 ).
Вопрос: стоит ли делать шаблон для такой функции, а внутри просто проверять является ли тип данных "правильным", или лучше сделать всё обычной перегрузкой?


Ответ

Вообще, один из плюсов (не главный, конечно) шаблонов - уменьшение дублирования кода. А так придется писать 9 почти одинаковых (за исключением типов) функций. Дублирование кода! (Или Вы не ленивый программист?) Используйте std::enable_if_t и отсекайте ненужные типы, для этого этот механизм и был введен в стандарт. Учитывая комментарий про типы, которые преобразуются в std::string, можете попробовать использовать std::is_convertible. Хотя стоит учесть специфику Вашей задачи, возможно, это недостаточное условие. Вот пример использования std::is_convertible с сайта
#include #include
struct A { }; struct B : A { };
int main() { std::cout << std::boolalpha; std::cout << "is_convertible:" << std::endl; std::cout << "int => float: " << std::is_convertible::value << std::endl; std::cout << "int = >const int: " << std::is_convertible::value << std::endl; std::cout << "A => B: " << std::is_convertible::value << std::endl; std::cout << "B => A: " << std::is_convertible::value << std::endl; return 0; }
Про идиому SFINAE можно почитать тут. Варианты использования std::enable_if есть тут
Если проверка типа при помощи std::is_convertible не подходит для данной задачи, то можно сделать проверки типа на основе std::is_integral, std::is_floating_point и прочих подобных структур. Прочитать про них можно, например, здесь. Полагаю, в задаче может быть обработано более 9 типов, учитывая всякие квалификаторы, типы int с размером, разные типы char и т.д. В таком случае, использование std::is_integral и компании оптимально, поскольку они успешно обрабатывают все подобные ситуации.

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

Такой эффект хочу получить

.client p{ font-size: 9pt; font-family: 'Italic'; font-weight: bold; } .coment{ background: url(https://cdn1.savepice.ru/uploads/2017/11/1/03cf72290cca88cdbd8724270cb30430-full.png) no-repeat; } /*End Client*/

Our Clients Say

Suspendisse sollicitudin velit sed leo. Ut
pharetra augue nec augue. Nam elit agna,
endrerit sit amet, tincidunt, viverra sed,
nulla. Donec porta diam eu massa.

Quisque diam lorem, interdum vitae, dapibus
ac, scelerisque vitae, pede. Donec eget tellus
non erat lacinia fermentum. Donec in velit
vel ipsum auctor pulvinar.

Bradley Grosh,
Company Name

Получается вот так


Ответ

всего то надо было с padding-ОМ поиграть да height: 250px выставить как, благо подсказал – vp_arth....
.client p{ font-size: 9pt; font-family: 'Italic'; font-weight: bold; } .coment{ height: 250px; padding:30px; background: url(https://cdn1.savepice.ru/uploads/2017/11/1/03cf72290cca88cdbd8724270cb30430-full.png) no-repeat; } /*End Client*/

Our Clients Say

Suspendisse sollicitudin velit sed leo. Ut
pharetra augue nec augue. Nam elit agna,
endrerit sit amet, tincidunt, viverra sed,
nulla. Donec porta diam eu massa.

Quisque diam lorem, interdum vitae, dapibus
ac, scelerisque vitae, pede. Donec eget tellus
non erat lacinia fermentum. Donec in velit
vel ipsum auctor pulvinar.

Bradley Grosh,
Company Name

XML-сериализация по особым правилам

Имеется электронный документооборот. Обмен данными выполняется с помощью XML следующей структуры:

Проблема на лицо - требуется куча классов примерно такой структуры:
[XmlRoot(ElementName="tag1")] public class Tag1 { [XmlAttribute(AttributeName="value")] public int Value { get; set; } }
и потом:
[XmlRoot(ElementName="document")] public class Document { [XmlElement(ElementName="tag1")] public Tag1 Tag1 { get; set; } [XmlElement(ElementName="tag2")] public Tag2 Tag2 { get; set; } [XmlElement(ElementName="tag3")] public Tag3 Tag3 { get; set; } [XmlElement(ElementName="tag4")] public Tag4 Tag4 { get; set; } [XmlElement(ElementName="tag5")] public Tag5 Tag5 { get; set; } [XmlElement(ElementName="tag6")] public Tag6 Tag6 { get; set; } [XmlElement(ElementName="tag7")] public Tag7 Tag7 { get; set; } [XmlElement(ElementName="outerTag1")] public OuterTag1 OuterTag1 { get; set; } [XmlElement(ElementName="outerTag2")] public OuterTag2 OuterTag2 { get; set; } }
Хотелось бы вместо этого написать класс со свойствами простых типов:
[XmlRoot(ElementName="document")] public class Document { [...(ElementName="tag1")] public int Tag1 { get; set; } [...(ElementName="tag2")] public string Tag2 { get; set; } [...(ElementName="tag3")] public DateTime Tag3 { get; set; } [...(ElementName="tag4")] public int Tag4 { get; set; } [...(ElementName="tag5")] public DateTime Tag5 { get; set; } [...(ElementName="tag6")] public string Tag6 { get; set; } [...(ElementName="tag7")] public decimal Tag7 { get; set; } [XmlElement(ElementName="outerTag1")] public OuterTag1 OuterTag1 { get; set; } [XmlElement(ElementName="outerTag2")] public OuterTag2 OuterTag2 { get; set; } }
и не плодить кучу мелких классов типа Tag1, Tag2, ...
Можно ли как-то это сделать? В идеале хотелось бы сделать кастомный атрибут MyXmlElement и использовать его вместо XmlElement, но как научить XmlSerializer понимать его и генерировать соответствующую разметку? Или может есть какой-то другой способ?


Ответ

Отказался от реализации интерфейса IXmlSerializable - решение получалось очень громоздким и не красивым, к тому же нужно учесть много всевозможных нюансов, которые учтены в штатной работе сериализатора.
В итоге написал простой класс:
public class Tag { [XmlAttribute(AttributeName = "value")] public T Value { get; set; }
public override string ToString() => Value.ToString();
public static implicit operator Tag(T value) => new Tag { Value = value }; public static implicit operator T(Tag tag) => tag.Value; }
Это позволило выбросить кучу мелких классов Tag1, Tag2 и т.д. Сам документ принял вид:
[XmlRoot(ElementName="document")] public class Document { [XmlElement(ElementName="tag1")] public Tag Tag1 { get; set; } [XmlElement(ElementName="tag2")] public Tag Tag2 { get; set; } [XmlElement(ElementName="tag3")] public Tag Tag3 { get; set; } [XmlElement(ElementName="tag4")] public Tag Tag4 { get; set; } [XmlElement(ElementName="tag5")] public Tag Tag5 { get; set; } [XmlElement(ElementName="tag6")] public Tag Tag6 { get; set; } [XmlElement(ElementName="tag7")] public Tag Tag7 { get; set; } [XmlElement(ElementName="outerTag1")] public OuterTag1 OuterTag1 { get; set; } [XmlElement(ElementName="outerTag2")] public OuterTag2 OuterTag2 { get; set; } }
Ну и благодаря операторам для неявного приведения типов документ создается так же просто:
var doc = new Document { Tag1 = 1, Tag2 = "text", ... };

Путь к UNIX сокету не может быть более 16 символов

Есть две моих программы на C/C++. Код для работы с Unix сокетами я брал с одного давно устаревшего сайта, других более понятных примеров я не нашел. В итоге я не могу использовать сокет, длина которого более 14-16 символов. Код клиента:
int sock; sock = socket(AF_UNIX, SOCK_STREAM, 0); struct sockaddr srvr_name; if (sock < 0) { perror("socket failed"); return EXIT_FAILURE; } srvr_name.sa_family = AF_UNIX; strcpy(srvr_name.sa_data, SOCK_NAME); if (connect(sock, &srvr_name, sizeof (srvr_name)) < 0) { perror("connect failed"); exit(2); } send(sock, buf, strlen(buf), 0);
Код сервера:
sock_ = socket(AF_UNIX, SOCK_STREAM, 0); if (sock_ < 0) { throw socket_exception(socket_exception::SocketError); } srvr_name.sa_family = AF_UNIX; filename_c = filepath.c_str(); strcpy(srvr_name.sa_data, filename_c); if (bind(sock_, &srvr_name, strlen(srvr_name.sa_data) + sizeof (srvr_name.sa_family)) < 0) { throw socket_exception(socket_exception::BindError); } listen(sock_, max_connect-1);
В strace(При том что путь к сокету я указал как /run/defu123456789/34567)
connect(3, {sa_family=AF_UNIX, sun_path="/run/defu12345"}, 16) = -1 ENOENT
Размер буфера sock_name ограничен 256 байтами. Использовать библиотеку boost нельзя. Как изменить код так, что бы он работал корректно?


Ответ

В итоге я не могу использовать сокет, длина которого более 14-16 символов.
Потому, что структура sockaddr описана в файле /usr/include/bits/socket.h таким образом:
/* Structure describing a generic socket address. */ struct sockaddr { __SOCKADDR_COMMON (sa_); /* Common data: address family and length. */ char sa_data[14]; /* Address data. */ };
Как видите, под поле адреса сокета отведено ровно 14 байт. Откуда взялось это ограничение - долгая история. Но оно есть.

Преинкремент и постинкремент

Задали вопрос на учебе, что больше потребляет ресурсов ++i или i++. Самостоятельно инфо не нашёл, прошу подсказать где искать.


Ответ

Согласно спецификации языка, разница между пре- и постинкрементом состоит в том, что при вычислении выражения значением результат является в одном случае старое, а в другом — новое значение инкрементируемой переменной. В случае простого применения в форме x++; (например, такое часто встречается в циклах) возвращаемое значение не используется, и смысл обеих форм строго одинаков, так что они компилируются в одинаковый объектный код.
Даже если оператор инкремента переопределён, разницы нет, т. к. (в отличие от C++) нет возможности иметь различные определения для пре- и постинкрементов.
Откуда растут ноги у этого вопроса? А вот откуда. В древние времена были наивные компиляторы языка C (и, возможно, C++), которые не умели оптимизировать код. И если они компилировали прямолинейно, то код получался таким:
// x++ int temp = x; x = x + 1; // результат = temp; но он не нужен, так что он отбрасывается
и
// ++x; x = x + 1; // результат = x; но он не нужен, так что он отбрасывается
Ваш преподаватель, вероятно, слыхал об этом, и ждёт от вас ответа о том, что необходимо ручной оптимизацией убрать ненужную временную переменную. Он неправ, отстал от реальности на вечность и тянет вас в эпоху трилобитов.
В реальности последние как минимум 10 лет компиляторы умеют делать оптимизации намного лучше людей, и в частности прекрасно умеют выбрасывать никому не нужные временные переменные. Так что разницы в сгенерированном коде просто не будет, что можно видеть даже для C++ здесь.* (Если вы, конечно, не отключите оптимизации.)

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

*Например, из таких двух функций:
volatile int x; // угадайте, что будет, если убрать volatile :-P
int pre(int num) { for (int i = 0; i < num; ++i) x = i; }
int post(int num) { for (int i = 0; i < num; i++) x = i; }
gcc 7.2 с ключом -O3 производит
pre(int): test edi, edi jle .L2 xor eax, eax .L3: mov DWORD PTR x[rip], eax add eax, 1 cmp edi, eax jne .L3 .L2: rep ret post(int): test edi, edi jle .L6 xor eax, eax .L8: mov DWORD PTR x[rip], eax add eax, 1 cmp edi, eax jne .L8 .L6: xor eax, eax ret
А с ключом -Os вообще
pre(int): xor eax, eax .L3: cmp eax, edi jge .L2 mov DWORD PTR x[rip], eax inc eax jmp .L3 .L2: ret post(int): jmp pre(int)

Отображение изображение на экран PyQt5 доступных в bytes

как вывести изображение на экран PyQt5 если изображение храниться в бд в bytes
import sys,sqlite3 from PyQt5.QtWidgets import QWidget, QApplication,QPushButton from PyQt5.QtGui import QPainter, QColor, QFont,QIcon from PyQt5.QtCore import Qt,QSize class Example(QWidget):
def __init__(self): super().__init__() self.initUI()
def initUI(self): conn = sqlite3.connect("test.db") connect = conn.execute("SELECT Data from Images") for row in connect:
self.label_im_qrcode = QLabel() import io, qrcode b = io.BytesIO(row[0]) img.save(b, 'png') data = b.getvalue()
pixmap = QPixmap() pixmap.loadFromData(data)
self.label_im_qrcode.setPixmap(pixmap) self.setGeometry(300, 300, 280, 170) self.setWindowTitle('Draw text') self.show() if __name__ == '__main__': con = sqlite3.connect('test.db') cur = con.cursor() fin = open('woman.jpg', "rb") img = fin.read() binary = sqlite3.Binary(img) cur.execute("INSERT INTO Images(Data) VALUES (?)", (binary,)) con.commit() app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())


Ответ

Воспользоваться нужными методами: QImage.loadFromData или QImage::fromData
Для QPixmap есть метод QPixmap.loadFromData
Пример из qrcode_gui
text = self.input_text.toPlainText() img = qrcode.make(text)
import io b = io.BytesIO() img.save(b, 'png') data = b.getvalue()
pixmap = QPixmap() pixmap.loadFromData(data)
self.label_im_qrcode.setPixmap(pixmap)

Больше моих примеров

После обновления вопроса:
Показываю пример добавления в базу данных SQLite картинки и отображения ее на виджете Qt:
import sys import sqlite3 from PyQt5.QtWidgets import * from PyQt5.QtGui import *
if __name__ == '__main__': con = sqlite3.connect('test.sqlite') cur = con.cursor() cur.execute(''' CREATE TABLE IF NOT EXISTS Images ( Data BLOB ) ''') con.commit()
with open('capture.png', mode='rb') as f: binary = sqlite3.Binary(f.read())
cur.execute("INSERT INTO Images(Data) VALUES (?)", (binary,)) con.commit()
app = QApplication([])
w = QWidget() layout = QVBoxLayout() w.setLayout(layout)
for (img_data,) in con.execute("SELECT Data from Images"): pixmap = QPixmap() pixmap.loadFromData(img_data)
label = QLabel() label.setPixmap(pixmap)
layout.addWidget(label)
w.show()
sys.exit(app.exec_())
Скриншот:

Строгий алиасинг в MinGW-w64

При компиляции с MinGW-w64 этого простого кода:
#include #include #include
template void readWithSep(){ std::istringstream sLine; sLine.str("hello"); std::string line; while(std::getline(sLine, line)){ std::cout<int main(){ readWithSep(); }
выдаётся ошибка:
доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти [-Werror=strict-aliasing] while(std::getline(sLine, line)){
Компилирую так:
i686-w64-mingw32-g++ -std=c++17 -W -Wall -Wextra -pedantic -Werror -O3 file.cpp
Почему возникает эта ошибка и как её исправить? Здесь же вроде никаких преобразований типов не происходит. Странно, что g++ это компилирует без ошибок (с теми же флагами)
Полный вывод компилятора:
file.cpp: В функции «void readWithSep()»: file.cpp:10:35: ошибка: доступ по указателю с приведением типа нарушает правила перекрытия объектов в памяти [-Werror=strict-aliasing] while(std::getline(sLine, line)){ cc1plus: все предупреждения считаются ошибками


Ответ

Похоже, это бага (точнее регресия) в gcc. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80633
Воспроисводится только при включенном -O2/-O3, потому что на этом уровне включается -ftrict-aliasing. Если компилятор менять не получается или уровень оптимизации, то можно просто добавить -fno-strict-aliasing

Нужно совместить эффект аккордеона и табов в одном скрипте

Хочу немного модифицировать этот скрипт, чтобы из активного элемента switch tab разворачивался его контент, сейчас это работает не верно (раскрываются сразу все).
Делал решение на css с привязкой раскрытия к активному элементу, но даже с transition раскрытие/скрытие выглядит не плавно, поэтому решил попробовать со слайдами.
$(".content").not(":first").hide(); $(".switch:first div").show(); $(".switch").click(function() { var sld = $(".switch div"); $(".switch").removeClass("active").eq($(this).index()).addClass("active"); $(".content").hide().eq($(this).index()).fadeIn(); if ($(".switch").eq($(this).index()).hasClass("active")) { sld.slideDown(); } else { sld.slideUp(); } }).eq(0).addClass("active"); .switch span { display: inline-block; font-family: Arial; font-size: 14px; padding: 5px; margin-bottom: 10px; background-color: #eee; border-radius: 4px; border: 1px solid #ccc; } .switch div { display: none; font-family: Arial; font-size: 16px; padding: 5px 0; } .active span { color: red; }

Switch_1
Some text switch tab 1
Switch_2
Some text switch tab 2
Switch_3
Some text switch tab 3
some content 1
some content 2
some content 3

Подскажите что я делаю не так?


Ответ

Можете вот так сделать:
$('.switch div').each(function( index ) { var sld = $(this); sld.slideUp(); });
if ($(this).hasClass('active')) { var sld = $(this).find('div'); sld.slideDown(); }
Полный код Jquery:
(function($) { $(".content").not(":first").hide(); $(".switch:first div").show(); $(".switch").click(function() {
$(".switch").removeClass("active").eq($(this).index()).addClass("active"); $(".content").hide().eq($(this).index()).fadeIn();
$('.switch div').each(function( index ) { var sld = $(this); sld.slideUp(); });
if ($(this).hasClass('active')) { var sld = $(this).find('div'); sld.slideDown(); } }).eq(0).addClass("active"); })( jQuery );
Результат:

Возвращение массива функцией

Есть код. В функции double f(double x[], int n) делается вычисление нескольких функций с несколькими переменными. Несколько переменных мы передадим в виде массива double x[], int n - количество элементов массива; к примеру, пусть будут вычислятся две функции - я их решил записать в массив double g[n], так как мне надо, что бы функция возвращала оба вычисления функции: g[0] = x[0] + x[1]; g[1] = x[0] * x[1]. Как вернуть массив g[n], и каким быть должно обращение к функции (в примере кода сразу в функции memcpy)? Что не так, поправьте. Пример кода.
#include
using namespace std;
double f(double x[], int n) { double g[n]; g[0] = x[0] + x[1]; g[1] = x[0] * x[1]; return /* Что? */; }
main() { int n = 2; double a[2], b[2]; for (int i = 0; i < n; i++) { cout << " a[" << i << "] = "; cin >> a[i]; } memcpy(b, f(a, n), sizeof(a)); for (int i = 0; i < n; i++) cout << " b[" << i << "] = " << b[i]; return 0; }


Ответ

Возвращать массив как таковой нельзя. Можно вернуть указатель на него - но тогда массив не должен быть локальной переменной! (Кстати, в C++ нельзя объявлять массив с размером, неизвестным во время компиляции.)
Поэтому нужно иначе..
Выделить массив динамически, и вернуть (только потом не забыть освободить память!)
int * g = new int[n]; ... return g;
Использовать, скажем, вектор (наилучший вариант):
std::vector g(n); ... return g;
Можно обернуть массив в структуру, но опять же, нужно знать размер во время компиляции:
struct Array { int g[10]; }
...
Array f() { Array g; g.g[0] = 5; ... return g; }
Но лучше всего - использовать готовый вектор, тем более что у вас количество элементов заранее не известно, так что std::array<> вам не подойдет.
PS Ну и, конечно, вариант с передачей возвращаемого массива в функцию:
int g[10]; ... f(..., int* g) { // работа с g[i] ... }
...
f(...,g);

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


(1 картинка)
У контейнера может меняться ширина. У элементов фиксированная ширина 75px, margin-left 20px. Как можно сделать, что бы элементы равномерно распределились?
ссылка на мою разметку:
https://jsfiddle.net/mefpu0k6/1/

Если делать через flex-wrap и space-between, то у последних элементов margin-left не такой как у всех (2 картинка)

А нужно сделать как на 3 картинке. Т.е margin-left у всех одинаковый
Мне удалось это сделать, но только с помощью js
`https://jsfiddle.net/u1yub2jq/2/`
Можно ли это сделать без помощи js? Или что делать с лишним пространством справа?
При этом, когда меняется ширина элементы переходят на новую строку.


Ответ

Не флексбоком единым. Есть ещё грид.
.container { display: grid; grid-template-columns: repeat(auto-fit, 75px); grid-gap: 20px; justify-content: space-between; width: 500px; border: 1px solid black; resize: horizontal; overflow: hidden; } .block { background-color: red; color: white; width: 75px; height: 75px; font: 20px sans-serif; line-height: 75px; text-align: center; }

1
2
3
4
5
6
7
8

Подробный разбор всех вариантов размещения ячеек с разнообразными выравниваниями можно найти в статье Красивое выравнивание блоков по резиновой сетке. По-новому

Поиск максимальной суммы квадратов чисел

Требуется найти максимальную сумму квадратов двух натуральных чисел, которая будет близка(или равна) к заданному числу.
Примеры:
20 -> 20 т.к. (42 + 22) 50 -> 50 т.к. (52 + 52 или 72 + 12) 30 -> 29 т.к. (52 + 22)
Не пойму, почему моя программа неверна.
res = int((N)**0.5) res1 = int(((N-res**2)**0.5)) print(res**2+res1**2)


Ответ

Ваше решение неверное так как int(N**.5)**2 не обязан быть одним из слагаемых в сумме. К примеру, 18 = 32 + 32, а ваше решение возвращает 17 = 42 + 12 для N=18 (17 < 18 поэтому это не является наибольшей суммой квадратов чисел близких к N).
Помимо перебора, можно построить решение на основе теоремы о сумме двух квадратов, из которой следуют разрешённые варианты разложения числа на простые множители — целое число m > 1 является суммой квадратов тогда и только тогда когда у него нет простых множителей вида 4*n+3 в нечётной степени:
def is_sum_of_two_squares(m): p = 2 while m > 1: multiplicity = 0 while m % p == 0: # found prime factor multiplicity += 1 m //= p if multiplicity & 1: # odd power if p % 4 == 3: # 4*n+3 form return False p += 1 return True
Имея способ определить является ли натуральное число суммой квадратов, можно найти наибольшую сумму близкую к числу, перебирая рядом стоящие числа (от близких к далёким, от больших к маленьким числам):
def max_sum_of_two_squares_nearest(m): for i in range(m + 1): if is_sum_of_two_squares(m + i): return m + i elif is_sum_of_two_squares(m - i): return m - i assert 0
Пример:
for m in range(21): print(m, "->", max_sum_of_two_squares_nearest(m))
Результат
0 -> 0 1 -> 1 2 -> 2 3 -> 4 4 -> 4 5 -> 5 6 -> 5 7 -> 8 8 -> 8 9 -> 9 10 -> 10 11 -> 10 12 -> 13 13 -> 13 14 -> 13 15 -> 16 16 -> 16 17 -> 17 18 -> 18 19 -> 20 20 -> 20

При повторном вызове функции предыдущие значения объявленной переменной продолжают использоваться

На сей раз возник вопрос к var. Как заставить переменную перезаписывать своё значение при каждом новом вызове функции? Весь код функции прилагается.
function tablecell(){ var st = $(this).attr('id'); console.log(st); if($(this).is('.disabled')){ } else{ $('.questionBg').css({'display':'flex'}); function answer(){ if ($(this).is('#true')){ $(this).css({'background':'#83c849'}).css({'color':'#fff'}); $('.answer').addClass('disabled'); $('.disabled').off('click', answer); $('.teamSelection').css({'display':'flex'}); $('.selectTeam').click(function(){ $(close); alert(st); $("#"+st).addClass('disabled'); if($(this).is('.selectTeam1')){ $("#"+st).children('.question').css({'display':'none'}); $("#"+st).children('.team1').css({'display':'block'}); } else{ $("#"+st).children('.question').css({'display':'none'}); $("#"+st).children('.team2').css({'display':'block'}); } }); } else{ $(this).css({'background':'#e03a3a'}).css({'color':'#fff'}); $('.answer').addClass('disabled'); $('.disabled').off('click', answer); setTimeout(close, 1000); } } } $('.answer').click(answer); };
Вызов производится извне:
$(document).ready(function(){ $('.tablecell').click(tablecell); });
У меня ощущение, что функция банально не завершается, но новое значение в консоль при повторном вызове выводится. Однако, alert с каждым разом повторно выводит предыдущие значения. Что делать - не пойму. Массивом прописать?

Какого цвета этот блок?
    Варианты ответа:
  • Синий
  • Красный
  • Серый
  • Белый
Начать!


Ответ

Что делать
Не назначать обработчики событий внутри других обработчиков событий.
Каждый раз, когда выполняется функция tablecell, Вы добавляете новый обработчик события click всем элементам с классом "answer". По щелчку на такой элемент выполняются все накопившиеся обработчики.
(function(){ var st;
function answer(){ ... }
function tablecell(){ st = $(this).attr('id'); console.log(st); if($(this).is('.disabled')){ } else { $('.questionBg').css({'display':'flex'}); } }
$(document).on('click', '.tablecell', tablecell); $(document).on('click', '.answer', answer); })();

Python проверка наличия данных в sys.stdin

Как проверить есть ли данные для чтения в sys.stdin, чтобы программа не останавливалась в ожидании ввода, если их нет.


Ответ

Можно посмотреть, что происходит, если timeout близкий к нулю передать в input_with_timeout(). На Unix, чтобы узнать есть ли данные для чтения:
import select
ready, _, _ = select.select([sys.stdin], [],[], 0)
На Windows, при вводе с консоли:
import msvcrt
ready = msvcrt.kbhit()
В качестве альтернативы, можно использовать асинхронный ввод/вывод (потоки, asyncio, O_NONBLOCK). Примеры для неблокирующего чтения вывода внешней команды

sql запрос на удаление

База данных postgreSQL , есть две таблицы , "groups" (group_id (pk), name) - 6 строк и "students" (student_id(pk), group_id, first_name, last_name) - 43 строки.
Как удалить строки из таблицы "students" по конкретному названию (groups.name) из таблицы "groups" На вот такой запрос
DELETE FROM public."GROUPS", public."STUDENTS" WHERE "GROUPS"."GROUP_ID" = "STUDENTS"."GROUP_ID" AND "GROUPS"."NAME" = "SR-01";
пишет
ошибка синтаксиса (примерное положение: ",")
на вот такой запрос
DELETE FROM public."STUDENTS" WHERE "GROUPS"."GROUP_ID" = "STUDENTS"."GROUP_ID" AND "GROUPS"."NAME" = "SR-01";
пишет
таблица "GROUPS" отсутствует в предложении FROM


Ответ

У PostgreSQL довольно забавный синтаксис удаления с использованием ключевого слова USING
DELETE FROM public."STUDENTS" USING public."GROUPS" WHERE "GROUPS"."GROUP_ID" = "STUDENTS"."GROUP_ID" AND "GROUPS"."NAME" = 'SR-01'
В крайнем случае всегда можно использовать старые, добрые подзапросы:
DELETE FROM public."STUDENTS" WHERE "STUDENTS"."GROUP_ID" IN(SELECT "GROUP_ID" FROM public."GROUPS" WHERE "NAME" = 'SR-01')

Метод реализации графического интерфейса


Необходимо будет сделать подобную вещь в своей программе на c# Windows Forms, возможно и WPF. Из чего лучше всего сделать такой график? На нем нужно будет и многое другое вырисовывать, но главное это основные свечи(красные, зеленые). Как мысль, самая банальная, сделать координаты и рисовать по ним прямоугольники с линиями сверху и снизу. А при масштабировании вырисовывать другие, более мелкие или большие. Но, может быть, есть более лаконичное решение данной задачи?


Ответ

Ваш рисунок очень похож на Candlestick chart, название которого иногда переводят как японские свечи
Практически в каждой библиотеки для построения графиков такой тип тоже реализован, поэтому в первую очередь стоит рассмотреть готовые варианты прежде чем изобретать собственный велосипед.
Пример того, как может выглядеть такой график нарисованный при помощи библиотеки OxyPlot

Подчеркну, что кроме цвета фона использовались настройки по умолчанию, так как не ставил перед собой цели добиться соответствия с приведенным изображением.
Данные получены случайным образом, по примеру из репозитория.
Не буду копировать оттуда пример, но переведу его реализацию на F# для более наглядной демонстрации типов и методов библиотеки
let candleStickSeries() = let model = PlotModel(Title = "", LegendSymbolLength = 24.0 ) let s1 = new CandleStickSeries(Title = "", Color = OxyColors.Black) let r = Random()
Seq.initInfinite (fun _ -> r.NextDouble()) |> Seq.scan(fun price a -> price + a + 0.1) 100.0 |> Seq.indexed |> Seq.map (fun (i, price) -> let high = price + 10.0 + (r.NextDouble() * 10.0) let low = price - (10.0 + (r.NextDouble() * 10.0)) let open' = low + (r.NextDouble() * (high - low)) let close = low + (r.NextDouble() * (high - low)) new HighLowItem(float i, high, low, open', close)) |> Seq.take 30 |> Seq.iter s1.Items.Add
model.Series.Add(s1) model.Axes.Add(new LinearAxis(Position = AxisPosition.Left, MaximumPadding = 0.3, MinimumPadding = 0.3 )) model.Axes.Add(new LinearAxis(Position = AxisPosition.Bottom, MaximumPadding = 0.03, MinimumPadding = 0.03 ))
model
Если хотите добиться полного (или почти полного совпадения), то советую разбить вопросы на несколько небольших и задать их по метке выбранной библиотеки.

В C# необходимо отредактировать несколько элементов коллекции через LINQ запрос

Язык C#, LINQ, Работа с несколькими элементами коллекции элементов.
Уважаемые коллеги прошу о помощи! Есть коллекция элементов. Мне необходимо выбрать все элементы с "Company=Microsoft" и изменить в этой же коллекции на "Company=12345" через LINQ запрос
Код:
namespace GroupByLinq { class Phone { public string Name { get; set; } public string Company { get; set; } }
class Program { static void Main(string[] args) { List phones = new List { new Phone {Name="Lumia 430", Company="Microsoft" }, new Phone {Name="Mi 5", Company="Xiaomi" }, new Phone {Name="LG G 3", Company="LG" }, new Phone {Name="iPhone 5", Company="Apple" }, new Phone {Name="Lumia 930", Company="Microsoft" }, new Phone {Name="iPhone 6", Company="Apple" }, new Phone {Name="Lumia 630", Company="Microsoft" }, new Phone {Name="LG G 4", Company="LG" } };
//Вот здесь что-то необходимо поправить или присвоения вовсе не должно быть phones = phones.SelectMany(x => x.Company == "Microsoft", p => new Phone { Name = p.Name, Company = "Citrus" }).ToList();
foreach (Phone g in phones) Console.WriteLine(g.Company + " / " + g.Name);
Console.Read(); } } }


Ответ

Linq не предназначен для изменения данных, он используется для запросов, поэтому я рекомендую вам воспользоваться обычным циклом, но если очень захотеть, можно написать примерно так:
phones = phones .Select(p => p.Company == "Microsoft" ? new Phone { Name = p.Name, Company = "12345" } : p) .ToList();
Этот подход плох тем, что он не изменяет старые объекты, а создает новые:
а) вы должны учесть что где-то могут остаться ссылки на старые phone, которых теперь нет в новой коллекции;
б) если вы добавите в класс новые свойства - вам придется найти каждый такой запрос и откорректировать его.
Подумайте хорошенько и поймете, что такой вариант будет гораздо лучше (да и, кстати, не сильно многословнее):
for (int i = 0; i < phones.Count; ++i) if (phones[i].Company == "Microsoft") phones[i].Company = "12345";
и да, с помощью Linq вы можете выбрать нужные телефоны и итерировать по ним, это тоже корректное решение (объекты остаются те же самые, с помощью Linq выбираем из них нужные):
foreach (var phone in phones.Where(p => p.Company == "Microsoft")) phone.Company = "12345";
А в идеале вам вообще нужно завести отдельный класс для компаний, а в телефоне иметь ссылку на него, тогда смена наименования компании превратится во что-то такое:
var company = companies.First(c => c.Name == "Microsoft"); company.Name = "12345";

Вывод объема оперативной памяти

Здравствуйте! Есть задание вывести общий объём физической памяти и свободный объём физической памяти в Мб. Использую структуру MEMORYSTATUS из библиотеки Windows.h
MEMORYSTATUS ms; GlobalMemoryStatus(&ms); label20->Text = Convert::ToString((int)ms.dwTotalPhys / 1024 / 1024) + "Mb"; label22->Text = Convert::ToString((int)ms.dwAvailPhys / 1024 / 1024) + "Mb";
Кол-во свободной памяти выводит правильно, с диспетчером задач сверил, а вот общий объём вывел неправильно, у меня 4 Гб. Снизу скрин выполнения программы. Как решить эту проблему?


Ответ

В самом начале страницы MSDN, посвященной GlobalMemoryStatus, написано:
GlobalMemoryStatus can return incorrect information. Use the GlobalMemoryStatusEx function instead.
В переводе:
GlobalMemoryStatus может возвращать неверную информацию. Используйте вместо нее функцию GlobalMemoryStatusEx

переименовать проект visual studio

Как быстро и безболезненно переименовать рабочий проект в visual studio 2008? По глупости оставил стандартное WindowsFormsApplications, теперь хочу назвать осмысленно. Пробовал разные варианты, гугл не помог.


Ответ

От переименовывания папки с решением и файла *.sln ни чего не ломается, это можно сделать в любой момент без последствий.
Теперь переименуем вложенный проект:
В проводнике находим папку проекта, переименовываем. В папке проекта находим файл *.csproj, переименовываем.
Дальше на ваш выбор:
Двойным кликом по *.sln открываем решение в студии, удаляем отвалившийся проект и добавляем заново переименованный из правильной папки. Открываем настройки проекта и исправляем имя выходной сборки и пространства имен по-умолчанию, если необходимо. Открываем *.sln в любом текстовом редакторе => в начале файла перечислены все проекты, включенные в решение, находим нужный => исправляем имя проекта, имя файла и путь к файлу => сохраняем => закрываем. Открываем *.csproj в любом текстовом редакторе => исправляем пространство имен, имя выходной сборки => проверяем, что пути к файлам проекта не содержат ошибок => сохраняем => закрываем.
В некоторых случаях может потребоваться внести исправления в соседние проекты решения, если они ссылались на измененный проект, правим это либо в обозревателе решений через интерфейс добавления ссылок, либо также, в соответствующих csproj-файлах
Также, рекомендую ознакомиться с официальной документацией на тему Управление решениями, проектами и файлами

Есть возможность получить статистику кол-ва строк Java кода в разных модулях в IntelliJ IDEA?

Есть возможность получить статистику кол-ва строк Java кода в разных модулях (пакетах/папках) в IntelliJ IDEA? Может есть какой-то плагин? В идеале, без пустых строк и импортов.
Я видел этот вопрос, но хотелось бы без танцев с посторонними утилитами + там где надо у меня Mac и на него крайне не рекомендуется ставить/запускать что-то левое. Лучше, если поставил плагин к IDEA (еще лучше сделать штатными средствами IDEA, но я таких функций не нашел), нажал получить статистику и все.
P.S. Да я в курсе, что кол-во строк кода мало информативно, но тем не менее потребовалось для одного отчета менеджеру.


Ответ

Вполне вероятно что вам подойдет именно этот плагин. Функционал не такой обширный, но все же хоть какая-то статистика есть.

Не работает CSS анимация в chrome

Не работает CSS анимация в chrome и opera, но работает в мозиле и даже интернет эксплорере, префиксы проставлены последней версией autoprefixer, версии браузеров последние... В чем загвоздка?
body { /*ЛЕТНИЙ ФОН*/ /*background:url(images/g12.jpg);}*/ /*ЗИМНИЙ ФОН (ПАДАЮЩИЕ СНЕЖИНКИ)*/ background: fixed, url(https://udsezon.ru/thumb/qyy419IWBadI3WCti5o-fw/90r90/913216/snezhinku.jpg); -webkit-animation: snegopad 30s linear infinite; animation: snegopad 30s linear infinite; } @-webkit-keyframes snegopad { 0% { background-position: 0 0, 0 0; } 100% { background-position: 0 0, 0% 563px; } } @keyframes snegopad { 0% { background-position: 0 0, 0 0; } 100% { background-position: 0 0, 0% 563px; } }


Ответ

Много лишнего, у позиции 2 значения по x и по y, а не 4:
body { background: url(https://udsezon.ru/thumb/qyy419IWBadI3WCti5o-fw/90r90/913216/snezhinku.jpg); animation: snegopad 30s linear infinite; } @keyframes snegopad { 100% { background-position: 0 563px; } }

Обозначения специальных клавиш в Linux

После перехода с windows-систем крайне непривычно видеть обозначения клавиш с Ctrl, Alt и других.
Например, в mc команда chown это C-x o -- поисле недолгих поисков понимаешь, что это сочетание клавиш Ctrl-x o.
А что за сочетание такое M-? (Find file в mc) и как его набирать?
Или другой пример, из tmux
M-1 to M-5 Arrange panes in one of the five preset layouts: even-horizontal, even-vertical, main-horizontal, main-vertical, or tiled.
Вообще, какие обозначения приняты в linux для таких специальных клавиш, типа Ctrl, Shift, Alt, Win?


Ответ

наиболее старое упоминание таких сокращений нашёл в исходниках gnu emacs версии 18.59, которая вышла 25 лет назад. цитата из man/emacs.texi
You can use modifier keys such as @key{CTRL}, @key{META} and @key{SHIFT} with function keys. To represent these modifiers, prepend the strings @samp{C-}, @samp{M-} and @samp{S-} to the symbol name.
но, конечно, такое сокращение широко употреблялось и ранее. сложно лишь найти достаточно аргументированное подтверждение этому.

А что за сочетание такое M-? (Find file в mc) и как его набирать?
это клавиша meta, которая может быть представлена разными способами
нынче это обычно клавиша с надписью alt. т.е., надо удерживать alt и нажать клавишу ?
но можно и более переносимым образом — через клавишу escape: нажать и отпустить её, а затем нажать клавишу ?

Регулярное выражение от =begin до опционального =end

Нужно составить регулярное выражение возвращающее текст от =begin и до =end, причем если =end отсутствует, то нужно вернуть весь текст после =begin до конца richTextBox (C#).


Ответ

var str = "text =begin ..."; var m = Regex.Match(str, "=begin(.+?)(=end|$)", RegexOptions.Singleline); m.Groups[1].Value; // " ..."

Какой паттерн проектирования выбрать?

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


Ответ

В сервисном слое (слой бизнес-логики) можно использовать многие паттерны, как ОО паттерны, так и другие паттерны более узкого или широкого профиля. Все зависит от того, какие у вас задачи в этом слое встречаются. Невозможно дать общий готовый список шаблонов, вот, мол, используй вот это и будет тебе счастье. Не-воз-мож-но. И не нужно.
Забудьте на время о паттернах. Они не самоцель. Сперва делайте так, как вам кажется правильным. И в какой-то момент некоторые задачи покажутся знакомыми и уже их при желании можно решить, применив тот или иной паттерн.
Еще лучше, забудьте о паттернах на годик. И вернитесь к ним после того, как получите чуть больше опыта. Тогда, я уверяю вас, вы совершенно по-другому на них взглянете, и более того, даже поймете, что использовали некоторые из них, не осознавая этого. Проанализировав свой опыт, поймете, где могли бы применить тот или иной шаблон. Еще раз повторюсь, вы неправильно понимаете для чего нужны паттерны, если отталкиваетесь от них. Шаблоны -- не самоцель, а лишь средство. Это как спрашивать "я хочу построить дом, какой кирпич мне взять?". Вы не с того начинаете, строитель!