Страницы

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

суббота, 22 июня 2019 г.

Как создать таблицу истории?

Есть таблица Persons
| ID | Name | Post | | 1 | Kolin | manager | | 2 | Emma | specialist |
Нужно создать копию таблицы - Persons_history котарая отслеживает изменений.
| ID | Name | Post | created_at | created_by | Operation | +----+-------+------------+-----------------------------+------------+-----------+ | 1 | Kolin | manager | 2015-08-06 10:04:28.6000000 | hh\Mark | Insert | | 2 | Emma | specialist | 2015-08-17 17:55:03.6600000 | hh\Mark | Update |
К примеру таблица должна выглядит так. Как можно реализовать? Как создать таблицу истории?


Ответ

Создаём таблички:
IF OBJECT_ID('Persons')IS NOT NULL DROP TABLE Persons IF OBJECT_ID('Persons_History')IS NOT NULL DROP TABLE Persons_History GO
CREATE TABLE Persons( Id INT IDENTITY(1,1), name VARCHAR(255), post VARCHAR(255) )
GO
CREATE TABLE Persons_History( Id INT, name VARCHAR(255), post VARCHAR(255), modify_at DATETIME, modify_by NVARCHAR(255), Operation VARCHAR(6) ) GO
Создание триггеров(можно обойтись и одним на самом деле)
CREATE TRIGGER Persons_History_Trigger_Insert ON Persons AFTER INSERT AS INSERT Persons_History SELECT Id, name, post, GETDATE(), SUSER_SNAME(), 'insert' FROM INSERTED GO CREATE TRIGGER Persons_History_Trigger_Update ON Persons AFTER UPDATE AS INSERT Persons_History SELECT Id, name, post, GETDATE(), SUSER_SNAME(), 'update' FROM INSERTED GO CREATE TRIGGER Persons_History_Trigger_Delete ON Persons AFTER DELETE AS INSERT Persons_History SELECT Id, name, post, GETDATE(), SUSER_SNAME(), 'delete' FROM DELETED GO
DML операции и вывод результата
INSERT Persons VALUES('Kolin', 'manager'),('Emma','specialist')
UPDATE Persons SET name='pegoopik' WHERE id=1
DELETE FROM Persons
SELECT * FROM Persons_History
Ну и результат:
Id name post modify_at modify_by Operation ----------- ---------- ---------- ----------------------- ------------------------------ --------- 2 Emma specialist 2016-01-22 12:12:44.157 ALPHA\XXX-Krasovskiy-EA insert 1 Kolin manager 2016-01-22 12:12:44.157 ALPHA\XXX-Krasovskiy-EA insert 1 pegoopik manager 2016-01-22 12:12:44.160 ALPHA\XXX-Krasovskiy-EA update 2 Emma specialist 2016-01-22 12:12:44.160 ALPHA\XXX-Krasovskiy-EA delete 1 pegoopik manager 2016-01-22 12:12:44.160 ALPHA\XXX-Krasovskiy-EA delete
Можно ещё добавить, что вместо VARCHAR(6) для поля Operation можно хранить код операции, например, в byte. 0-insert; 1-update; 2-delete. Чуть сэкономит место.

masm как сделать массив с изменяемой длиной

Возможно ли изменить длинну массива (dd) и затем записать её в eax?


Ответ

И нет, и да. Дело в том, что результат декларации dd - просто последовательность байт в бинарнике, которая статически грузится в память.
Так что менять размер тут просто нечему. dd не является командой динамического выделения памяти - она просто статически помещает в бинарник нужную последовательность байт.
Хотите выделить память - обратитесь к операционной системе и попросите. Через системный вызов.

Не работает атрибут “android:imeOptions”

В некотором layout есть EditText и если по документации от Google установить этому виджету атрибут android:imeOptions="actionSearch", то вместо стандартного значка "Enter" на клавиатуре должна появиться иконка поиска (лупа). Но когда я попробовал это реализовать на практике

иконка осталась прежней. Т.е смена иконки не работает. Попробовал реализовать смену иконки программно, написав в Activity : editText.setImeOptions(EditorInfo.IME_ACTION_SEARCH); Это, к сожалению, тоже не сработало. Более того, видимо как следствие этого, не работает и переопределенный метод для обработки нажатия по кнопке поиска:
@Override public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
Log.d("WHALETAG", "Что то собирается нажаться"); if (i == EditorInfo.IME_ACTION_SEARCH){ Toast.makeText(this, "Поиск: " + editText.getText(), Toast.LENGTH_SHORT).show(); return true; }
return false; }
От чего такое?


Ответ

Решение нашлось довольно нестандартно:
если это происходит, необходимо для EditText указать еще один атрибут android:singleLine="true"
И в результате получится:

и иконка поиска будет исправно отображаться.

Почему регулярное выражение выбрасывает исключение?

Вот задание:
Вывести на консоль все теги, которые соответствуют заданному тегу Каждый тег на новой строке, порядок должен соответствовать порядку следования в файле Количество пробелов,
,
не влияют на результат Файл не содержит тег CDATA, для всех открывающих тегов имеется отдельный закрывающий тег, одиночных тегов нету Тег может содержать вложенные теги
Вот шаблоны тэгов из задания:
text1 text1 text1
text1, text2 могут быть пустыми
Ввод такой:
string1 string2 string11
Вывод должен быть таким:
string1 string2 string11 string2
Какой регэксп для этого нужен? Вот мой тестировочный код:
public class Solution {
public static void main(String[] args) {
String testStr = "string1 string2 string11";
Pattern p = Pattern.compile("(\\<(/?[^\\>]+)\\>)"); Matcher m = p.matcher(testStr);
while(m.find()) { System.out.println(testStr.substring(m.start(), m.end())); }
} }
И ответ к нему.
(?=((?:(?1)|<(?!/span>)|[^<]+)+))
Но у меня не получается "прикрутить"
Pattern p = Pattern.compile("(?=((?:(?1)|<(?!/span>)|[^<]+)+))");
пишет вот такое:
Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '?' near index 0 ?=(<(span)>(?:(?1)|<(?!/\2>)|[^<]+)+)
Подскажите как адаптировать регулярку под мою задачу?


Ответ

В вашем регулярном выражении:
(?=((?:(?1)|<(?!/span>)|[^<]+)+))
Определение группы захвата (?1) не является корректным с точки зрения синтаксиса регулярных выражений в JAVA, т.к. рекурсивные паттеры из PHP PCRE в ней не поддерживаются - ошибка выдаётся именно из-за этого

Вашу задачу необходимо решать с использованием HTML-парсера, например jsoup
String html = "string1 string2 string11"; String tag = "span";
Document document = Jsoup.parse(html);
document.select(tag).forEach((element) -> { System.out.println(element.outerHtml()); });
Этот код выводит:
string1 string2 string11 string2
Что вполне соответствует требуемому от правильного решения.

Yii2, файл вне web, скачать его

В проекте на Yii2, я загружаю через форму файлы в папку files, находящуюся в корне проекта, а не в папке web.
Как вывести ссылки на эти файлы в view, чтобы их можно было скачивать, как-то динамически?


Ответ

У меня нет под рукой ни php, ни Yii2, поэтому ограничусь подсказками, а не готовым решением из разряда "скопируй и выполни".
Вам нужен некий контролер, назовем его FilesController

class FilesController extends Controller { // ... }
Внутри него будут два action'а - actionIndex и actionDownload. Первый будет служить для показа списка файлов, а второй для непосредственной выдачи содержимого файла пользователю.
Так же нам понадобится некое свойство, которое будет содержать путь к папке с файлами. В Yii2 путь к корневой папке находится в Yii::$app->basePath. Соответственно, пишем в методе инициализации контролера:
/** * @var string */ private $path;
public function init() { $this->path = realpath(Yii::$app->basePath . '/files/'); }
В actionIndex получаем список файлов и передаём его в view:
public function actionIndex() { $files = array();
foreach (new DirectoryIterator($this->path) as $item) { array_push($files, $item->getFilename()); }
return $this->render('files', array( 'files' => $files )); }
В view вам нужно будет вывести список ссылок указывающих на actionDownload. Url для каждого файла можно получить примерно так:
Url::to(['download','name'=> $fileName]);
Ну и собственно в actionDownload отдаём файл(для $name желательно добавить валидацию, что бы пользователи не присылали всякую ересь):
public function actionDownload($name) { return Yii::$app->response->sendFile($this->path . $name); }

Сколько используется ресурсов процессора согласно выводу программы top?

Сервер работает на дистрибутиве debian gnu/linux 7. Запускаю конвертацию видеофайла через ffmpeg размером 400мб из формата avi в mp4. Команда простейшая, без дополнительных параметров:
$ ffmpeg -i pathInput -f mp4 pathOutput
Решил посмотреть использование ресурсов сервера командой top. Вот какую информацию получил по процессу ffmpeg
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 55291 admin 20 0 379m 120m 5484 S 378.5 0.2 17:08.12 ffmpeg
Если не ошибаюсь, согласно этим данным, используется 378.5% CPU.
Как это может быть? Я неправильно интерпретирую эти значения?


Ответ

число в столбце %cpu (процент использоания процессора) суммируется по всем ядрам (реальным или виртуальным) всех процессоров.
в данном случае число 378.5 говорит, скорее всего, о том, что четыре ядра используются почти на сто процентов.

кстати, у программы top есть возможность показывать (в верхней, «заголовочной» части «окна» программы) не только общую нагрузку на все ядра всех процессоров, но и на каждое ядро в отдельности. переключается этот режим нажатием кнопки 1
пример вывода по всем ядрам:
top - 18:17:10 up 11 days, 13 min, 19 users, load average: 0.11, 0.25, 0.25 Tasks: 203 total, 1 running, 202 sleeping, 0 stopped, 0 zombie %Cpu(s): 1.9 us, 0.5 sy, 0.0 ni, 95.8 id, 1.8 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem: 8218532 total, 3391900 used, 4826632 free, 468744 buffers KiB Swap: 2719740 total, 0 used, 2719740 free, 1168472 cached
пример вывода по каждому ядру отдельно:
top - 18:17:17 up 11 days, 13 min, 19 users, load average: 0.09, 0.24, 0.25 Tasks: 203 total, 1 running, 202 sleeping, 0 stopped, 0 zombie %Cpu0 : 1.6 us, 1.6 sy, 0.0 ni, 96.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu1 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu2 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu3 : 0.8 us, 0.8 sy, 0.0 ni, 98.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem: 8218532 total, 3409680 used, 4808852 free, 468744 buffers KiB Swap: 2719740 total, 0 used, 2719740 free, 1190592 cached

Как нарисовать фигуру подобную картинке

Как нарисовать подобную фигуру в xml. И стоит ли ее рисовать, или лучше использовать png (будет использоваться в качестве кнопки и будет в дальнейшем анимироваться)


Ответ

Используйте 9-patch png. Добавьте к изображению раму толщиной в один пиксель, которая будет содержать информацию для растягивания изображения и размещения на нем контента.
И измените расширение файла на имя_файла.9.png
В дальнейшем это изображение можно будет использовать в качестве фона, который будет растягиваться в нужных местах, таким же образом делаются разные облачка для диалогов и.т.д.
Преобразовать также можно с помощью png to 9-patch сервисов.