Страницы

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

понедельник, 11 марта 2019 г.

MSSQL инкремент значения

Как инкрементировать значение поля в БД MSSQL с использованием Linq. Вариант с прочитать-прибавить-записать не подходит ввиду одновременного инкремента разными клиентами и потоками.
По ответам из комментов, попробовал сделать вот так:
public static async Task IncrementDownloadCounterAsync(Int32 id) { using (LICENSE_RO3Entities db = new LICENSE_RO3Entities()) { using (DbContextTransaction transaction = db.Database.BeginTransaction()) { DB.Update update = await db.Updates.FindAsync(id); if (update != null) { update.download_counter++; }
await db.SaveChangesAsync(); transaction.Commit(); } } }


Ответ

Для обновления одной записи никакая транзакция не нужна: EF умеет использовать оптимистическую блокировку для той же цели.
Если вы используете Code First - можно отметить свойство атрибутом [ConcurrencyCheck]. В таком случае EF при каждом обновлении записи будет дополнительно проверять что значение соответствующего атрибута в базе не изменилось.
Также можно добавить в модель свойство отмеченное атрибутом [Timestamp] типа byte[] если база данных поддерживает тип данных rowversion или его аналог. Отличие Timestamp от ConcurrencyCheck - в том, что ConcurrencyCheck только проверяется, а Timestamp еще и автоматически обновляется при любом изменении записи.
[Timestamp] public byte[] RowVersion { get; set; }
В любом случае, какой бы из двух способов вы не выбрали - вы получите DbUpdateConcurrencyException если кто-то поменяет значение в базе пока вы собирались его сохранять. После этого можно будет попытаться увеличить счетчик еще раз.

Но самый нормальный способ - конечно же делать это средствами базы. EF не предоставляет способа делать это через Linq - поэтому надо использовать SQL-запрос:
db.Database.ExecuteSqlCommand("UPDATE Updates SET download_counter = download_counter + 1 WHERE Id = @p0", id);
Если есть желание изолировать вышележащие слои от SQL-кода - можно добавить этот запрос как метод контексту:
public void IncrementDownloadCounter(int id) { if (Database.ExecuteSqlCommand("UPDATE Updates SET download_counter = download_counter + 1 WHERE Id = @p0", id) == 0) { throw что-нибудь; } }

Символ “красный круг с минусом” в “обозревателе решений”

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


Ответ

Загляните в файл .gitignore, возможно данные файлы / папка пропускаются / игнорируются. Переключитесь в представление папок, там найдете .gitignore.

Semaphore на примитивных функциях Java

Задача - написать семафор без util.concurrent.*, только wait/notify/notifyAll Сам семафор:
public class MySemaphore { private int permits;
public MySemaphore(int permits) { this.permits = permits; }
public synchronized void acquire() throws InterruptedException { if (permits > 0) { permits--; }
else { this.wait(); permits--; } }
public synchronized void release() { permits++;
if (permits > 0) { this.notify(); } }
public boolean tryAcquire() { if (permits > 0) { return true; }
return false; } }
Два типа потоков для проверки:
1) Инкрементный
public class IncrementThread implements Runnable {
MySemaphore semaphore; String name; int count;
public String getName() { return name; }
public IncrementThread(MySemaphore semaphore, String name, int count) {
this.semaphore = semaphore; this.name = name; this.count = count; System.out.println(name + " was created"); }
@Override public synchronized void run() { System.out.println(Thread.currentThread().getName() + " is waiting for permit");
try { semaphore.acquire(); System.out.println(Thread.currentThread().getName() + " is got for permit"); for (int i=0; i2) Дикрементный
public class DecrementThread implements Runnable { MySemaphore semaphore; String name; int count;
public DecrementThread(MySemaphore semaphore, String name, int count) { this.semaphore = semaphore; this.name = name; this.count = count; System.out.println(name + " was created"); }
@Override public synchronized void run() { System.out.println(Thread.currentThread().getName() + " is waiting for permit");
try { semaphore.acquire(); System.out.println(Thread.currentThread().getName() + " is got for permit"); for (int i=0; iОтдельный класс, который собираюсь мучить из разных потоков:
public class SharedValue { static volatile int count = 0; }
И сам тест:
public class MySemaphoreTest {
public static void main(String[] args) { MySemaphore semaphore = new MySemaphore(2); System.out.println("Semaphore with 2 permits was created"); System.out.println("Shared: " + SharedValue.count); IncrementThread thread1 = new IncrementThread(semaphore, "First increment thread", 3); IncrementThread thread2 = new IncrementThread(semaphore, "Second increment thread", 4); DecrementThread thread3 = new DecrementThread(semaphore, "First decrement thread", 7); //DecrementThread thread4 = new DecrementThread(semaphore, "Second decrement thread", 5);
new Thread(thread1, "firstIncrementThread").start(); new Thread(thread2, "secondIncrementThread").start(); new Thread(thread3, "firstDecrementThread").start(); //new Thread(thread4, "secondDecrementThread").start(); } }
Как мне кажется (по-крайней мере, так задумывалось), в конце исполнения программы я должен получить SharedValue.count = 0, а получаю какой-то рандом.
В логах видно, что нити после нескольких итераций "выстреливают" результат одновременно, хотя опять-же, по задумке, должны проводить операцию раз в секунду.
Проблема в реализации семафора или в тестировании?


Ответ

Результат одновременно "выстреливают" не потоки, а логи этих потоков. Сами потоки работают как положено с задержкой в 2 секунды.

Добавьте два synchronized метода incrementCount и decrementCount, и работайте с ними вместо переменной напрямую..
public class SharedValue { private static volatile int count = 0;
public static int getCount() { return count; }
public static synchronized void incrementCount() { count++; }
public static synchronized void decrementCount() { count--; } }

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

Есть DataFrame, в котором записаны нули и единицы,
df = pd.DataFrame({'A': [0,0,1,1,1,0,1]})
A 0 0 1 0 2 1 3 1 4 1 5 0 6 1
Необходимо пронумеровать только 1, а 0 оставить без изменения, т.е. должны получить:
A 0 0 1 0 2 1 3 2 4 3 5 0 6 1


Ответ

In [186]: df.groupby(df['A'].diff().ne(0).cumsum()).cumsum() Out[186]: A 0 0 1 0 2 1 3 2 4 3 5 0 6 1
Пошагово:
разница между текущей и предыдущей строкой:
In [2]: df['A'].diff() Out[2]: 0 NaN 1 0.0 2 1.0 3 0.0 4 0.0 5 -1.0 6 1.0 Name: A, dtype: float64
сравниваем значения из шага [2] с 0
In [3]: df['A'].diff().ne(0) Out[3]: 0 True 1 False 2 True 3 False 4 False 5 True 6 True Name: A, dtype: bool
кумулятивно суммируем то что получилось на предыдущем шаге [3] (в Python - False == 0, True == 1):
In [4]: df['A'].diff().ne(0).cumsum() Out[4]: 0 1 1 1 2 2 3 2 4 2 5 3 6 4 Name: A, dtype: int32
дальше группируем по значениям из шага [4] и считаем кумулятивную сумму:
In [8]: df.groupby(df['A'].diff().ne(0).cumsum()).cumsum() Out[8]: A 0 0 1 0 2 1 3 2 4 3 5 0 6 1

Как узнать, что клиент-серверное приложение написано с применением технологии REST?

Написал клиент-серверное приложение. Используется протокол http, данные посылаются в формате JSON. Этого не достаточно, наверное. Какие критерии того, чтобы однозначно дать ответ, что приложение написано с подходом REST?


Ответ

Client-Server. Система должна быть разделена на клиентов и на серверов. Stateless. Сервер не должен хранить какой-либо информации о клиентах. В запросе должна храниться вся необходимая информация для обработки запроса и если необходимо, идентификации клиента. Cache․ Каждый ответ должен быть отмечен является ли он кэшируемым или нет. Uniform Interface. Универсальный интерфейс между компонентами системы. ссылка на статью в habrahabr

Нумерация строк в QTextEdit

Как реализовать нумерацию строк в QTextEdit, что то как на примере Excel или Notepad++

import sys from PyQt5.QtWidgets import QTextEdit, QWidget, QApplication, QVBoxLayout
class Text(QWidget):
def __init__(self, **kwargs): super().__init__(**kwargs) text_edit = QTextEdit('Какой то текст') layout = QVBoxLayout() layout.addWidget(text_edit) self.setLayout(layout)
if __name__ == "__main__": app = QApplication(sys.argv) main = Text() main.show() sys.exit(app.exec_())


Ответ

Вот небольшой пример:
import sys import numpy as np
from PyQt5 import Qt
class LineNumberArea(Qt.QWidget): def __init__(self, editor): super().__init__(editor) self.myeditor = editor
def sizeHint(self): return Qt.Qsize(self.editor.lineNumberAreaWidth(), 0)
def paintEvent(self, event): self.myeditor.lineNumberAreaPaintEvent(event)
class CodeEditor(Qt.QPlainTextEdit): def __init__(self): super().__init__()
self.lineNumberArea = LineNumberArea(self)
self.blockCountChanged[int].connect(self.updateLineNumberAreaWidth) self.updateRequest[Qt.QRect,int].connect(self.updateLineNumberArea) self.cursorPositionChanged.connect(self.highlightCurrentLine)
self.updateLineNumberAreaWidth(0)
self.setPlainText(""" Класс QPlainTextEdit предоставляет виджет, который используется для редактирования и отображения обычного текста. """)
def lineNumberAreaWidth(self): digits = 1 count = max(1, self.blockCount()) while count >= 10: count /= 10 digits += 1 space = 3 + self.fontMetrics().width('9') * digits return space
def updateLineNumberAreaWidth(self, _): self.setViewportMargins(self.lineNumberAreaWidth(), 0, 0, 0)
def updateLineNumberArea(self, rect, dy):
if dy: self.lineNumberArea.scroll(0, dy) else: self.lineNumberArea.update(0, rect.y(), self.lineNumberArea.width(), rect.height())
if rect.contains(self.viewport().rect()): self.updateLineNumberAreaWidth(0)
def resizeEvent(self, event): super().resizeEvent(event)
cr = self.contentsRect(); self.lineNumberArea.setGeometry(Qt.QRect(cr.left(), cr.top(), self.lineNumberAreaWidth(), cr.height()))
def lineNumberAreaPaintEvent(self, event): mypainter = Qt.QPainter(self.lineNumberArea)
mypainter.fillRect(event.rect(), Qt.Qt.lightGray)
block = self.firstVisibleBlock() blockNumber = block.blockNumber() top = self.blockBoundingGeometry(block).translated(self.contentOffset()).top() bottom = top + self.blockBoundingRect(block).height()
height = self.fontMetrics().height() while block.isValid() and (top <= event.rect().bottom()): if block.isVisible() and (bottom >= event.rect().top()): number = str(blockNumber + 1) mypainter.setPen(Qt.Qt.black) mypainter.drawText(0, top, self.lineNumberArea.width(), height, Qt.Qt.AlignRight, number)
block = block.next() top = bottom bottom = top + self.blockBoundingRect(block).height() blockNumber += 1
def highlightCurrentLine(self): extraSelections = []
if not self.isReadOnly(): selection = Qt.QTextEdit.ExtraSelection()
lineColor = Qt.QColor(Qt.Qt.yellow).lighter(160)
selection.format.setBackground(lineColor) selection.format.setProperty(Qt.QTextFormat.FullWidthSelection, True) selection.cursor = self.textCursor() selection.cursor.clearSelection() extraSelections.append(selection) self.setExtraSelections(extraSelections)
if __name__ == "__main__": app = Qt.QApplication(sys.argv)
txt = CodeEditor() txt.setStyleSheet("""QPlainTextEdit{ font-family:'Consolas'; color: #ccc; font-size: 20px; background-color: #2b2b2b;}""") txt.setGeometry(400, 100, 600, 400) txt.show()
sys.exit(app.exec_())

This при работе c событиями в ES6

Здравствуйте решил написать простенький класс таймера используя ES6 синктаксис.
Есть две проблемы: 1.Как вынести переменные tick, min,seconds,minutes в конструктор, так что б они были видны внутри метода run() 2.При клике на кнопку стоп,таймер должен останавливаться и в cleatinterval должна попадать ссылка на таймер из конструтора.
Используя ES5 можно вынести контекст в отдельную функцию и с ней работать, как сделать тоже самое используя новый синтаксис?
class Timer { constructor(){ this.timer; } run(){ let tick = 0; let min = 0 let seconds = document.getElementById('seconds'); let minutes = document.getElementById('minutes'); this.timer = setInterval( () => { tick++; if(tick == 60){ min++; tick = 0; if(min < 9){ min = '0'+min; } minutes.innerHTML = min; } if( tick < 9){ tick = '0'+tick; } seconds.innerHTML = tick; console.log('timer play'); },1000) } stop(){ console.log(this);//Ссылаетcя на btn clearInterval(this.timer);//не работает console.log('timer stop'); } } let main_timer = new Timer; btn.addEventListener('click',main_timer.run); stop.addEventListener('click',main_timer.stop);


Ответ

constructor(){ this.timer; this.tick; this.min; this.seconds; this.minutes; }
run(){ this.tick = 0; this.min = 0;
this.seconds = document.getElementById('seconds'); this.minutes = document.getElementById('minutes'); this.seconds.innerHTML = ''; this.minutes.innerHTML = '';
this.timer = setInterval( () => { this.tick++; if(this.tick == 60){ this.min++; this.tick = 0; this.minutes.innerHTML = (this.min < 10)? '0' + this.min : this.min; } this.seconds.innerHTML = (this.tick < 10)? '0' + this.tick : this.tick;
console.log('timer play'); }, 1000); }
Что до контекста, в котором будут выполняться run и stop
btn.addEventListener('click',main_timer.run.bind(main_timer)); stop.addEventListener('click',main_timer.stop.bind(main_timer));
или
btn.addEventListener('click', () => main_timer.run()); stop.addEventListener('click', () => main_timer.stop());
или
class Timer { ...
runHandler() { return this.run.bind(this); } stopHandler() { return this.stop.bind(this); }
btn.addEventListener('click', main_timer.runHandler()); stop.addEventListener('click', main_timer.stopHandler());

Скрытное управление звуком

Нашёл следующий код(рабочий, проверял):
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Runtime.InteropServices;
namespace volume_controller { public partial class Form1 : Form { private const int APPCOMMAND_VOLUME_MUTE = 0x80000; private const int APPCOMMAND_VOLUME_UP = 0xA0000; private const int APPCOMMAND_VOLUME_DOWN = 0x90000; private const int WM_APPCOMMAND = 0x319;
[DllImport("user32.dll")] public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
public Form1() { InitializeComponent(); } private void Mute() { SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle, (IntPtr)APPCOMMAND_VOLUME_MUTE); } private void VolDown() { SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle, (IntPtr)APPCOMMAND_VOLUME_DOWN); } private void VolUp() { SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle, (IntPtr)APPCOMMAND_VOLUME_UP); } } }
При управление звуком таким образом, во время изменения показывается это: Как можно управлять звуком так, чтобы не отображалась эта шкала?


Ответ

На дынный момент нашёл это: https://stackoverflow.com/a/40361942 В принципе вариант мне подходит, громкость изменяется скрытно.
Инструкция по установке: https://docs.microsoft.com/ru-ru/nuget/quickstart/install-and-use-a-package-in-visual-studio Страница либы: https://www.nuget.org/packages/AudioSwitcher.AudioApi.CoreAudio/3.0.0.1

Ошибка размерности массива в Python

Пишу нейронную сеть для распознавания цифр, вылезла ошибка - не могу разобраться как изменить размерность массива, код ниже
import numpy as np from keras.utils import np_utils from keras.models import model_from_json from keras.preprocessing import image import matplotlib.pyplot as plt %matplotlib inline
json_file = open("fully_mesh_network.json", "r") loaded_model_json = json_file.read() json_file.close() loaded_model = model_from_json(loaded_model_json) loaded_model.load_weights("fully_mesh_network.h5")
loaded_model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
img_path = '2.png' img = image.load_img(img_path, target_size=(28,28), grayscale=True)
x = image.img_to_array(img) x = 255 - x x/= 255 x = np.expand_dims(x, axis = 0)
prediction = loaded_model.predict(x) prediction = np_utils.categorical_probas_to_classes(prediction) print(prediction) ---------------------------------------------------------------------------
ValueError: Error when checking : expected dense_1_input to have 2 dimensions, but got array with shape (1, 28, 28, 1)


Ответ

Судя по ошибке ваша модель ожидает 2D массив на входе.
попробуйте так:
x = x.reshape(28, 28)
PS метод np_utils.categorical_probas_to_classes() - отсутствует в современных версиях Keras. Вместо него можно попробовать использовать метод: keras.utils.to_categorical()

Как правильно “облегчить” класс?

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


Ответ

Для решения данной задачи хорошо подходит механизм композиции. Навскидку его можно достичь 2 путями:
1) Использовать трейты (traits), для php >= 5.4. http://php.net/manual/ru/language.oop5.traits.php
2) Использовать реализацию с помощью паттерна "Декоратор", при помощи которого мы можем к базовой функциональности подключать необходимый нам функционал. Тут есть отличное описание схемы работы данного паттерна:
https://refactoring.guru/ru/design-patterns/decorator

JavaScript тесты

У меня есть код теста, и я хочу, чтобы если в тесте набралось не более 10%, то мне выводилось "плохо", а если другие результаты, то уже другие ответы
$(function() { $('.questionForm input[type=submit]').on('click', function(e) { var answer = 0; $('#wrap').addClass('none'); for (i = 0; i < $('.group').length; i++) { $('.group').eq(i).each(function(id, elem) { if ($(elem).find('input:checked').length != 0) { if ($(elem).find('input:checked').attr('value') == 1) { answer++; } } }) } $("#wrap").hide(); $(".result").show("slow", function() { $(".result").replaceWith("

" + "
" + "Тест пройден на: " + "

" + (answer / $('.group').length) * 100 + '%' + "

" + "
" + "
") }) return false }) }) div.questionBlock { display: block; }

Начальный уровень



JavaScript - это

Язык разметка
Язык программирования
Язык описания внешнего вида

Чтобы добавить код JS надо написать

<script text="javascript">
<script="text/javascript">
<script type="text/javascript">
<script type="javascript">

Чтобы добавить комментарий надо

использовать */
использовать **
использовать //
использовать <!--

Как вывести слово "привет"

Через alert ('привет');
Через hi ('привет');
Через alert (привет);
Через alert 'привет';

Какой из вариантов создаст переменную "a"

var = a;
var a;
$a;
var

Какой вариант неправильный

 var x;
     alert(x);
 var x = 10;
     alert(x);


Чтобы добавить код JS надо написать

1)
2)
3)
4)

Чтобы добавить код JS надо написать

1)
2)
3)
4)

Чтобы добавить код JS надо написать

1)
2)
3)
4)


Чтобы добавить код JS надо написать

1)
2)
3)
4)



Тест пройден на

0%

Вы не прошли тест!


Ответ

Ну, собственно, добавить переменную, отвечающую за процент прохождения, и в зависимости от её значения изменять код страницы с помощью функции, аргумент которой - эта самая переменная:
function result(percent) { if (percent <= 10) return 'Плохо'; //дальше - код для других значений } $(function() { $('.questionForm input[type=submit]').on('click', function(e) { var answer = 0; $('#wrap').addClass('none'); for (i = 0; i < $('.group').length; i++) { $('.group').eq(i).each(function(id, elem) { if ($(elem).find('input:checked').length != 0) { if ($(elem).find('input:checked').attr('value') == 1) { answer++; } } }) } var percent = (answer / $('.group').length) * 100; $("#wrap").hide(); $(".result").show("slow", function() { $(".result").replaceWith("

" + "
" + "Тест пройден на: " + "

" + percent + '%' + "

" + "
" + "
") $(".result1").replaceWith("
" + "
" + "

" + result(percent) + "

" + "
" + "
") }); return false; }) }) div.questionBlock { display: block; }

Начальный уровень



JavaScript - это

Язык разметка
Язык программирования
Язык описания внешнего вида

Чтобы добавить код JS надо написать

<script text="javascript">
<script="text/javascript">
<script type="text/javascript">
<script type="javascript">

Чтобы добавить комментарий надо

использовать */
использовать **
использовать //
использовать <!--

Как вывести слово "привет"

Через alert ('привет');
Через hi ('привет');
Через alert (привет);
Через alert 'привет';

Какой из вариантов создаст переменную "a"

var = a;
var a;
$a;
var

Какой вариант неправильный

 var x;
     alert(x);
 var x = 10;
     alert(x);


Чтобы добавить код JS надо написать

1)
2)
3)
4)

Чтобы добавить код JS надо написать

1)
2)
3)
4)

Чтобы добавить код JS надо написать

1)
2)
3)
4)


Чтобы добавить код JS надо написать

1)
2)
3)
4)



Тест пройден на

0%

Вы не прошли тест!

Как узнать язык операционной системы Windows?

Как программно узнать язык операционной системы Windows (начиная с Windows XP)?
Интересует именно язык системы - то есть язык, на котором Windows общается с пользователем программы, а не выбранная страна или раскладка клавиатуры и т.п. Условно говоря, надо узнать на каком языке написано название "My Computer" или "Мой Компьютер" или "Mój Komputer". Формат полученного обозначения не так важен (ISO или англ.текст или локализованый текст).
Мысли вслух: Попробовал несколько вариантов, включая GetLocaleInfo(LOCALE_USER_DEFAULT.., GetSystemDefaultLangID, GetUserDefaultLangID, но ни один из них не вернул мне локаль моей ОС (англ.), а вернул Russian. пока что единственная правдоподобная зацепка - hklm\system\controlset001\control
ls\language\Installlanguage, но тогда непонятно, почему Install Language один (англ.), а Default другой (рус.), при том что ОС со мной общается на английском.


Ответ

Для относительно новых версий Delphi можно воспользоваться вызовом GetUserDefaultUILanguage из модуля WinAPI.Windows (возвращает значение языка интерфейса, выбранное текущим пользователем):
var i: integer <...> i := Lo(GetUserDefaultUILanguage); // нижнего байта достаточно для определения языка, вида надписей на кнопках и т.п. // Это может быть не так для экзотических языков, но с ними я не сталкивался
case i of $19: // русский end;
Вот список ряда языков, возвращаемых в нижнем байте или же оф. список от Майкрософт
Для старых версий Delphi придётся самостоятельно определить GetUserDefaultUILanguage из kernel32.dll, например, так:
function GetSystemDefaultUILanguage: integer; stdcall; external 'kernel32.dll';
Поскольку @teran первым указал на функцию, ответ можно оформить, как общий.

Невозможность нормального удаления приложения через лаунчер девайса

Есть приложение, на всех аппаратах удаляется нормально, но от владельцев Asus Zenfone разных моделей я получаю отзывы, к примеру:
Интересно придумал, приложение удалить нельзя, значок при удалении на весь экран!.
Естественно этого нельзя провернуть силами самого приложения (без рут-прав), проблема в девайсе. Кто-нибудь сталкивался с подобной проблемой?

При удалении остальных приложений:


Ответ

Решение нашлось. Т.к. мне было лень делать иконку под разные размеры экрана, я использовал только одну. (620×620) Как я понял, родной лаунчер на асусовской прошивке берет иконку не подгоняя её под нужные размеры... Порезав иконку я получил то, что хотел - нормальное диалоговое окно при удалении:

Существует ли аналог pip для Си?

У python есть pip для установки сторонних библиотек. Есть ли подобное для Си ? И если нет, то почему ?


Ответ

Си - это язык для написания программ, и в спецификацию языка не входит управление пакетами. Можно разве что проверить "подключен пакет" или нет при определенных условиях. Питон - можно рассматривать как язык, в спецификации языка может быть только "проверка наличия" пакета. А управлять пакетами, используя язык - нельзя.
Пакеты могут быть исключительно у среды разработки
У среды разработки Питон - управление пакетами есть.
Для С++ управление пакетами есть в:
Dev C++ Borland C++ Builder (такие же как в Delphi). Одно время были популярны сайты распространяющие библиотеки для Delphi и Borland C++ в составе пакетов. Eclipse IDE позволяет так же работать с С++, и доставлять пакеты библиотек.

Установить картинку на фон textArea

Добрый день,пишу легкий чатик, захотел сделать приятный интерфейс, и при попытке поставить картинку на фон textArea столкнулся с проблемой отсутствия таковой возможности. Для графического составляющего использую Scene Builder. Могу взять ImageView растянуть по всей textArea и подрегулировать opacity. Но теряется резкость выводимого текста. Подскажите пожалуйста, какие есть решение данной проблемы ?


Ответ

С помощью Scenic View можно выявить внутреннюю структуру TextArea
TextArea styleClass="text-input text-area" ScrollPane styleClass="scroll-pane" StackPane styleClass="viewport" StackPane ContentView styleClass="content" Group Text styleClass="text" Path ScrollBar styleClass="scroll-bar" ... ScrollBar styleClass="scroll-bar" ... StackPane styleClass="corner"
Исходя из этого, можно задать фоновое изображение в .css-файле в .text-area {...}, а внутренним панелям назначить прозрачность. При этом изображение не будет прокручиваться вместе с текстом:
.text-area { -fx-background-image: url("bg.png"); }
.text-area .scroll-pane .scroll-bar { -fx-background-color: rgba(255,255,255,0.5); }
.text-area .viewport { -fx-background-color: transparent; }
.text-area .content { -fx-background-color: transparent; }
.text-area .text { -fx-effect: dropshadow(gaussian,#fff,10,0.8,0,0); }
Если же нужно, чтобы изображение прокручивалось, тогда следует указать его в .text-area .content {...}
Документация по CSS:
JavaFX 9 CSS Reference Guide
JavaFX 8 CSS Reference Guide

three.js, Объект не принимает позицию другого объекта

Кольца Сатурна должны быть вокруг Сатурна (он окрашен в Юпитер), а они вокруг Солнца. Позицию Сатурна они не воспринимают, в отличие от других объектов.
ring.position.x = saturn.position.x; ring.position.z = saturn.position.z;
Возможно, это устаревшее значение для частиц, нового аналога в документации на нахожу.
var camera, scene, renderer; var sun_geom, sun_mat, sun; var mercury_geom, mercury_mat, mercury; var venus_geom, venus_mat, venus; var earth_geom, earth_mat, earth; var mars_geom, mars_mat, mars; var jupiter_geom, jupiter_mat, jupiter; var saturn_geom, saturn_mat, saturn; var ring_sarurn_geom, ring_saturn_mat, ring; //кольца var uranus_geom, uranus_mat, uranus; var neptune_geom, neptune_mat, neptune; var t = 0; var offset_y = 0; var texture; var r = 0.019; var light; init(); animate(); function init() { camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 0.01, 10000 ); camera.position.z = 1; camera.rotation.z = -Math.PI/20; scene = new THREE.Scene(); light = new THREE.PointLight(0xffffff, 1.4, 7000); light.position.set(100, 0, 0); light.castShadow = true; light.shadowMapWidth = 204; light.shadowMapHeight = 204; scene.add(light); sun_geom = new THREE.SphereGeometry(0.12, 40, 40); texture = new THREE.TextureLoader().load( 'https://upload.wikimedia.org/wikipedia/commons/9/99/Map_of_the_full_sun.jpg' ); sun_mat = new THREE.MeshBasicMaterial({map: texture}); sun = new THREE.Mesh(sun_geom, sun_mat); scene.add(sun); mercury_geom = new THREE.SphereGeometry(0.3829 *r, 10, 10); texture5 = new THREE.TextureLoader().load( 'img/mercury.jpg' ) mercury_mat = new THREE.MeshBasicMaterial({map: texture5}); mercury = new THREE.Mesh(mercury_geom, mercury_mat); scene.add(mercury); venus_geom = new THREE.SphereGeometry(0.95*r, 10, 10); texture4 = new THREE.TextureLoader().load( 'img/venus.jpg' ) venus_mat = new THREE.MeshBasicMaterial({map: texture4}); venus = new THREE.Mesh(venus_geom, venus_mat); scene.add(venus); earth_geom = new THREE.SphereGeometry(r, 10, 10); texture2 = new THREE.TextureLoader().load( 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Whole_world_-_land_and_oceans_12000.jpg/500px-Whole_world_-_land_and_oceans_12000.jpg' ); earth_mat = new THREE.MeshBasicMaterial({map: texture2}); earth = new THREE.Mesh(earth_geom, earth_mat); scene.add(earth); mars_geom = new THREE.SphereGeometry(0.532*r, 10, 10); texture3 = new THREE.TextureLoader().load( '' ); mars_mat = new THREE.MeshBasicMaterial({map: texture3}); mars = new THREE.Mesh(mars_geom, mars_mat); scene.add(mars); jupiter_geom = new THREE.SphereGeometry(2*r, 30, 30); texture6 = new THREE.TextureLoader().load( 'https://vignette.wikia.nocookie.net/space-engine/images/a/a8/Jupiter_Oberfl%C3%A4che.jpg/revision/latest/scale-to-width-down/640?cb=20151220023337&path-prefix=de' ) jupiter_mat = new THREE.MeshBasicMaterial({map: texture6}); jupiter = new THREE.Mesh(jupiter_geom, jupiter_mat); jupiter.castShadow = true; scene.add(jupiter); saturn_geom = new THREE.SphereGeometry(2*r, 30, 30); texture7 = new THREE.TextureLoader().load( 'https://vignette.wikia.nocookie.net/space-engine/images/a/a8/Jupiter_Oberfl%C3%A4che.jpg/revision/latest/scale-to-width-down/640?cb=20151220023337&path-prefix=de' ) saturn_mat = new THREE.MeshBasicMaterial({map: texture7}); saturn = new THREE.Mesh(saturn_geom, saturn_mat); scene.add(saturn); ring_sarurn_geom = new THREE.Geometry(); ring_sarurn_mat = new THREE.PointsMaterial({ color: 0x3A3A3A, opacity: 0.3, size:1, sizeAttenuation: false }); for ( var i = 0; i < 20000; i ++ ){ var vertex = new THREE.Vector3(); vertex.x = Math.sin( Math.PI/180*i )*(5*r-i/2); vertex.y = THREE.Math.randFloatSpread(10)*10; vertex.z = Math.cos( Math.PI/180*i )*(4*r-i/2); ring_sarurn_geom.vertices.push(vertex); } ring = new THREE.Points(ring_sarurn_geom, ring_sarurn_mat); ring.castShadow = true; scene.add(ring); uranus_geom = new THREE.SphereGeometry(1.1*r, 30, 30); texture8 = new THREE.TextureLoader().load( 'https://vignette.wikia.nocookie.net/space-engine/images/a/a8/Jupiter_Oberfl%C3%A4che.jpg/revision/latest/scale-to-width-down/640?cb=20151220023337&path-prefix=de' ) uranus_mat = new THREE.MeshBasicMaterial({map: texture8}); uranus = new THREE.Mesh(uranus_geom, uranus_mat); scene.add(uranus); neptune_geom = new THREE.SphereGeometry(1.1*r, 30, 30); texture9 = new THREE.TextureLoader().load( 'https://vignette.wikia.nocookie.net/space-engine/images/a/a8/Jupiter_Oberfl%C3%A4che.jpg/revision/latest/scale-to-width-down/640?cb=20151220023337&path-prefix=de' ) neptune_mat = new THREE.MeshBasicMaterial({map: texture9}); neptune = new THREE.Mesh(neptune_geom, neptune_mat); neptune.castShadow = true; scene.add(neptune); renderer = new THREE.WebGLRenderer( { antialias: true } ); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); } function animate() { requestAnimationFrame( animate ); sun.rotation.y+=0.01; mercury.rotation.y+=0.01; venus.rotation.y+=0.01; earth.rotation.y+=0.01; mars.rotation.y+=0.01; jupiter.rotation.y+=0.01; saturn.rotation.y+=0.01; uranus.rotation.y+=0.01; neptune.rotation.y+=0.01; /* mercury.position.x = Math.sin(t*0.35)*0.14; mercury.position.z = Math.cos(t*0.35)*0.14; venus.position.x = Math.sin(t*0.3)*0.18; venus.position.z = Math.cos(t*0.3)*0.18;*/ earth.position.x = Math.sin(t*0.25)*0.25; earth.position.z = Math.cos(t*0.25)*0.25; /* mars.position.x = Math.sin(t*0.2)*0.3; mars.position.z = Math.cos(t*0.2)*0.3; */ /*jupiter.position.x = Math.sin(t*0.1)*0.4; jupiter.position.z = Math.cos(t*0.1)*0.4;*/ saturn.position.x = Math.sin(t*0.05)*0.45; saturn.position.z = Math.cos(t*0.05)*0.45; ring.position.x = saturn.position.x; ring.position.z = saturn.position.z; /*uranus.position.x = Math.sin(t*0.04)*0.5; uranus.position.z = Math.cos(t*0.04)*0.5;*/ /*neptune.position.x = Math.sin(t*0.03)*0.55; neptune.position.z = Math.cos(t*0.03)*0.55;*/ t+=Math.PI/180*2; renderer.render( scene, camera ); }
https://jsfiddle.net/Nata_Hamster/9pdL97jm/


Ответ

С позицией "колец" все нормально. Не нормально - с их масштабом:
for (var i = 0; i < 20000; i++) { var vertex = new THREE.Vector3(); vertex.x = Math.sin(Math.PI / 180 * i) * (0.5 * r - i / 2); vertex.y = THREE.Math.randFloatSpread(1000); vertex.z = Math.cos(Math.PI / 180 * i) * (0.4 * r - i / 2); ring_sarurn_geom.vertices.push(vertex.multiplyScalar(0.00001)); // в 100 000 раз меньше }