Страницы

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

пятница, 14 декабря 2018 г.

Как сделать отступ первого слова в абзаце TextView?

android:layout_marginLeft="16dp" Так сдвигается весь абзац, а мне нужно только первое слово сдвинуть. То есть мне нужно сделать "красную строку".


Ответ

\t, в начале текста. Это управляющий символ, и при отображении строки он будет заменен 4мя пробелами. Наверняка вы сталкивались с
- переходом на новую строку.

Правильный способ хранения текста и HTML-кода в базе MySQL

Каким образом необходимо обрабатывать текст и html-код для записи в базу MySQL? Какая схема? Перерыл интернет, везде совет для записи в базу использовать mysql_real_escape_string(), и больше вроде ничего не нужно. Но как быть со спец-мисволами html? К примеру "⇔" при вставке в форму отображается как символ, а не как html-код сивола. Соответственно при записи в базу, он превращается в "?" Как я понимаю необходимо обрабатывать текст вот так перед вставкой: $inputText = htmlentities($inputText, ENT_NOQUOTES, 'UTF-8'); $inputText = mysql_real_escape_string($inputText); Соответственно при выводе из базы на отображение необходимо обрабатывать текст вот так: $inputTex = html_entity_decode($inputTex); Такой алгоритм правильный или надо делать как-то по-другому? Кодировка сайта utf8.


Ответ

Вопрос очень простой, но в то же время очень характерный.
В нем отлично собраны наиболее популярные заблуждения начинающих пользователей РНР. Попробуем в них разобраться.
Хранение
Самое первое, что надо научиться - это не путать хранение данных и их использование в SQL запросах. Это совершенно разные вещи. По поводу хранения следует понимать, что храниться в БД могут абсолютно любые данные, и при этом храниться они должны как есть. То есть, для хранения их никак, вообще никак обрабатывать не нужно.
Следовательно, отвечая на поставленные в посте (не совсем корректные, как мы видим), вопросы:
Как хранить какие-либо данные в БД? Данные должны храниться как есть. Как обрабатывать данные для БД? Никак. Ни в коем случае никак обрабатывать нельзя. Как хранить HTML? Никаких особенных действий ни для HTML, ни для любых других данных производить не нужно. Все данные хранятся абсолютно одинаково.
Использование данных в SQL запросах.
А вот это уже совсем другой вопрос. Единственный, в ответ на который нам надо будет что-то делать. Но при этом сами данные мы всё равно трогать не будем. Да-да! Даже для помещения в SQL запрос мы никак данные обрабатывать не будем. Дело в том, что "совет для записи в базу использовать mysql_real_escape_string()" - это просто феерическая глупость, к сожалению, растиражированная в миллионах экземпляров.
А единственно правильный способ добавления данных в SQL запрос - это делать это через плейсхолдеры.
То есть, чтобы использовать любые данные в SQL запросе, надо сначала на их месте написать знаки вопроса:
INSERT INTO users (name, lastname) VALUES (?,?)
это, кстати, касается вообще всех запросов. SELECT мы пишем точно так же:
SELECT * FROM users WHERE name=?
после этого надо будет подготовить запрос, а потом выполнить его, передав переменные отдельно. Вот как это происходит на примере PDO:
$stmt = $pdo->prepare("INSERT INTO users (name, lastname) VALUES (?,?)"); $stmt->execute(array($name, $lastame));
то есть, идея такая: если нам надо подставить в запрос какую-либо переменную, вместо неё надо поставить знак вопроса. А саму переменную передать после.
Таким образом мы будем гарантированы от любых ошибок и неприятностей, поскольку РНР сам обработает за нас все переменные и сделает это правильно
Спец-символы HTML
Я думаю, что внимательный читатель уже уловил идею: HTML вообще никакого отношения к БД не имеет. Ни малейшего. Это абсолютно разные вещи. То есть пользователю РНР никогда не должна приходить в голову идея использовать функцию, в которой встречается слово "HTML" для какой-либо работы с БД, а при работе с HTML - функцию, в которой встречается слово "mysql".
Функции для работы с HTML следует применять для работы с HTML.
То есть, если мы собираемся выводить HTML текст в HTML, то мы его должны выводить как есть.
Но если мы собираемся выводить в HTML текст, который не является HTML, мы должны отформатировать его так, чтобы он нам случайно не попортил верстку. Обычно для этого используется функция htmlspecialchars()
Кодировка
Если какой-либо символ сохраняется в виде знака вопроса, то это не проблема HTML кодирования, а проблема кодировки, которая попросту не поддерживает данный символ. Чтобы БД могла сохранять символы типа ⇔, у нее должна быть кодировка utf8. А также РНР скрипт, устанавливая соединение с базой, должен выставлять кодировку этого соединения в utf8. При этом отображая пользователю форму, должен выдавать НТТР заголовк Content-type с кодировкой UTF-8.
И тогда все символы запишутся в целости и сохранности.

Постоянный мониторинг папки реализованный на c#

Добрый день. Пытаюсь написать крошечную программу на c#, которая будет мониторить активность заданной папки и выводить информацию о времени последнего изменения в Label. Пытался реализовать этот процесс через While:
public partial class Form1 : Form { bool start = true; public Form1() { InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e) {
button1.Text = ("Начать проверку"); button2.Text = ("Остановить проверку"); }
private void button1_Click(object sender, EventArgs e) {
while (start == false) { DirectoryInfo dir = new DirectoryInfo(@"C:\Users"); label1.Text = ("Полный путь: " + dir.FullName); label2.Text = ("Последнее обновление: " + dir.LastWriteTime); }
} }
Но, данный пример кода не делает вообще ничего.


Ответ

Ссылка:
Вот ссылка на знакомство с наблюдением за событиями файловой системы!
Там как раз написано про наблюдение за событиями файловой системы и примеры есть.
FileSystemWatcher.Changed - событие происходит при изменении файла или каталога в заданном пути Path
FileSystemWatcher.Renamed - событие происходит при переименовании файла или каталога в заданном пути Path
Событие Changed возникает неожиданно при переименовании файла, но оно не возникает при изменении имени каталога.
Для отслеживания переименований используйте событие Renamed.
Пример:
public class Watcher {
public static void Main() { Run(); }
[PermissionSet(SecurityAction.Demand, Name="FullTrust")] public static void Run() { string[] args = System.Environment.GetCommandLineArgs();
// If a directory is not specified, exit program. if(args.Length != 2) { // Display the proper way to call the program. Console.WriteLine("Usage: Watcher.exe (directory)"); return; }
// Create a new FileSystemWatcher and set its properties. FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = args[1]; /* Watch for changes in LastAccess and LastWrite times, and the renaming of files or directories. */ watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; // Only watch text files. watcher.Filter = "*.txt";
// Add event handlers. watcher.Changed += new FileSystemEventHandler(OnChanged); watcher.Created += new FileSystemEventHandler(OnChanged); watcher.Deleted += new FileSystemEventHandler(OnChanged); watcher.Renamed += new RenamedEventHandler(OnRenamed);
// Begin watching. watcher.EnableRaisingEvents = true;
// Wait for the user to quit the program. Console.WriteLine("Press \'q\' to quit the sample."); while(Console.Read()!='q'); }
// Define the event handlers. private static void OnChanged(object source, FileSystemEventArgs e) { // Specify what is done when a file is changed, created, or deleted. Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType); }
private static void OnRenamed(object source, RenamedEventArgs e) { // Specify what is done when a file is renamed. Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath); } }

Агрегация между классами

Объясните пожалуйста понятие агрегации между классами. Например, если есть два класса, classx и classy и они находятся в отношении агрегации, то как это реализовывается в коде. Полезным будут и какие-то понятные примеры из интернета, я не нашел ничего толкового.


Ответ

Агрегация — это отношение между объектами, при котором
один объект содержит другой как часть, но внешний объект не является владельцем внутреннего.
Это означает, что окончание жизненного цикла внешнего объекта не означает автоматически окончание жизненного цикла внутреннего объекта.
Пример: страна аггрегирует своих граждан (то есть, они являются её частью). Но не уничтожает их при распаде страны.
class citizen { };
class country { // используем указатель, чтобы предотвратить копирование сущностей (у нас не может быть // одновременно два "экземпляра" одного и того же гражданина), а также владение ими. unordered_set population;
public: void add_citizen(citizen* pc) { population.insert(pc); } voit remove_citizen(citizen* pc) { population.erase(pc); }
~country() { // не удаляем граждан, пусть живут } };

Не освобождается операционная память

При запуске программы стартовое окно занимает 17 мб оперативной памяти, из стартового окна создается новое, которое занимает 88 мб оперативной памяти, если закрыть это окно и вернуться к стартовому, то объем занятой памяти всё равно будет равен 88 мб. Как освободить оперативную память после закрытия окна?


Ответ

В .NET память не освобождается в момент "закрытия окна". Объекты остаются висеть в куче до тех пор, пока их не зачистит сборщик мусора. Его можно заставить это сделать вызовами:
GC.Collect(); GC.WaitForPendingFinalizers();
И даже после освобождения памяти в управляемой куче - рантайм может не сразу отдать освободившуюся память системе - а вдруг вы ее опять захотите выделить. Тем более что "выделенная память" - это не конкретные куски памяти на микросхеме, а просто зарезервированный в огромном виртуальном адресном пространстве кусочек.

Проблема с анонимными классами: как понимать создание объекта интерфейса? [дубликат]

На данный вопрос уже ответили: Использование анонимного класса 1 ответ Вот очень простой код:
item.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub
}
});
Вроде бы все легко. А я его не совсем понимаю. Даже немного стыдно из-за этого. В частности, не понимаю вот это выражение new ActionListener(). Здесь ведь есть и операция new и круглые скобки.. Как будто бы мы создаем объект. Но ведь нельзя создать объект интерфейса. Да и потом понятно что здесь создается анонимный класс, а не объект. Объясните пожалуйста, почему такой странный синтаксис и что же на самом деле тут происходит?
UPD: Написали что этот вопрос может являться дубликат: Использование анонимного класса Но там разбирается что в принципе происходит в строе new ActionListener(){} А я понимал, что там создается объект анонимного класса, мне было интересно почему для этого используется имя интерфейса.


Ответ

Когда ты создаешь новый объект, ты пишешь так:
new Foo();
Точка с запятой в конце важна, ты вызываешь непосредственно конструктор класса Foo.
В случае с анонимным классом ты делаешь так:
new ActionListener() { // Тело нового класса }
Обрати внимание на фигурные скобки. Это разница в синтаксисе. Теперь по смыслу: фактически ты создаешь наследника класса и одновременно вызываешь его конструктор без параметров, дополнительно в теле реализуя необходимые тебе методы. То есть такой себе одноразовый класс-наследник.
Ты мог бы сделать так в отдельном файле:
class MyActionListener implements ActionListener {
@Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub } }
А затем:
item.addActionListener(new MyActionListener());
по смыслу было бы аналогично, но в дальнейшем ты сможешь ещё создавать объекты MyActionListener, в то время как при использовании анонимного класса ты его описал, создал объект и забыл о его описании.

Как в java хранятся статические поля?

Как в java хранятся статические поля класса? Знаю что был такой вопрос. (JAVA) В какой области памяти хранятся статические поля класса? Но там сказано что они хранятся в Permanent Generation. А в java 8 ведь он заменен на MetaSpace? Хранятся ли они теперь в MetaSpace? Если да, объясните пожалуйста, почему так? Ведь MetaSpace это область, в которой хранятся метаданные? А статические поля не являются же метаданными.


Ответ

А в java 8 ведь он заменен на MetaSpace?
Да, если мы говорим о HotSpot jvm.
Хранятся ли они теперь в MetaSpace?
Да
Если да, объясните пожалуйста, почему так? Ведь MetaSpace это область, в которой хранятся метаданные?
MetaSpace - это та же PermGen, только с плюшкой в виде динамического расширения. В Permanent Generation предельный размер зависел от многих факторов: количество классов, методов, размер пула констант и т.п. Теперь размер мета пространства ограничен лишь размеров доступной памяти. Если хотим поменять, то юзаем флаг MaxMetaspaceSize
Таким образом исключили возможность выпадения java.lang.OutOfMemoryError. Ну да, если вы упрётесь в предел RAM, или в предел заданный в MaxMetaspaceSize, то исключение будет.
А статические поля не являются же метаданными.
Ммм. Если посмотреть книгу Java Data Objects, то там сказано, что статические поля - это мета данные.