Страницы

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

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

Как можно выравнить числа в таблице по точке или запятой?

Существует возможность средствами HTML+CSS выравнить в таблице, в теге TD числа по определенному знаку (по точке или запятой)? Например:
---- 153.12 98.357 753.00 0.002 15 32145.9998


Ответ

Делается разбиением данных на две части. А сортировка делается по атрибуту data. Плюсом этого решения является то что данные можно копировать через выделение.
.start { display: inline-block; width:50px; text-align:right; }

123.01
1.122
22.1
12345.111

Суть конструктора по-умолчанию в наследовании

Здравствуйте. Зачем когда мы создаем какой-нибудь конструктор в базовом классе, обязательно надо создать еще и конструктор по-умолчанию, в противном случае не получается создавать объект унаследованного класса. Например, если в этом коде попытаемся комментировать конструктор по-умолчанию, выдается ошибка
using System; class one { private int ID; //public one() { } public one(int ID) { this.ID = ID; } } class two : one { int age;string name, position; public two(int age, string name, string position) { this.age = age; this.name = name; this.position = position; } public void show() { Console.WriteLine(name + " " + position + " " + age); } } class consoleapp { static void Main() { two obj = new two(25,"Shamil", "IT"); obj.show(); Console.ReadKey(); } }


Ответ

На самом деле не обязательно.
При конструировании объекта производного класса мы обязаны вызвать конструктор базового и если вы не указываете какой конкретно конструктор нужно вызвать, то компилятор по умолчанию ищет конструктор без параметров.
Конкретно ваш код скомпилируется, если написать, например, так:
public two(int age, string name, string position) : base(1)

Указатели на функции

Объясните, пожалуйста, есть ли разница между двумя записями, если есть, то какая?
#include
int sum(int a, int b){ return a+b; }
main(){
int (*fun)(int , int) = NULL; fun = sum;
printf("%d

", fun(12,14)); printf("%d

",(*fun)(12,14));
return 0; }


Ответ

Разница существует лишь на абстрактном концептуальном уровне. Фактической разницы нет.
Получение адреса функции тоже можно записать как fun = sum; или как fun = ∑. Разницы тоже нет.
Можно, разве что, посоветовать быть единообразным, т.е. либо использовать явные операторы и там, и там
fun = ∑ (*fun)(12,14);
либо не использовать их ни там, ни там
fun = sum; fun(12,14);
Хотя и этот совет, возможно, не заслуживает большого внимания.

Python декораторы

Каким образом функция func() передалась как аргумент в функцию deco() ?
ps = input("Введите пароль:")
def test_pass(p): def deco(f): if p == "universe": return f else: return lambda: "Access denied" return deco
@test_pass(ps) def func(): return "Access approval"
print(func())


Ответ

Грубо говоря, Python разворачивает конструкцию
@test_pass(ps) def func(): ...
в
def func(): ...
decorator = test_pass(ps) # В два шага для понятности func = decorator(func)

Недопонимание с кодом

Наткнулся на код, по которому у меня возникает пару вопросов, если ответите, то буду признателен
#include #include
int isOdd(int a) { return (a % 2 != 0); }
unsigned int filter(int *arr, unsigned size, int (*pred)(int), int** out) { unsigned i; unsigned j; *out = (int*) malloc(sizeof(int)*size); for (i = 0, j = 0; i < size; i++) { if (pred(arr[i])) { (*out)[j] = arr[i]; j++; } } *out = (int*) realloc(*out, j*sizeof(int)); return j; }
int main () { int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; unsigned i; unsigned size; int *aOdd = NULL;
size = filter(a, 10, isOdd, &aOdd); for (i = 0; i < size; i++) { printf("%d ", aOdd[i]); }
}
Вопрос №1: Зачем требуются явные преобразования такого вида?
*out = (int*) malloc(sizeof(int)*size); *out = (int*) realloc(*out, j*sizeof(int));
Они же излишни, если я не ошибаюсь.
Вопрос №2: Что происходит в строках, которые я выделил восклицательными знаками?
unsigned int filter(int *arr, unsigned size, int (*pred)(int), int** out) { unsigned i; unsigned j; *out = (int*) malloc(sizeof(int)*size); /* !!!!!!!!!! */ for (i = 0, j = 0; i < size; i++) { if (pred(arr[i])) { (*out)[j] = arr[i]; /* !!!!!!!!!! */ j++; } } *out = (int*) realloc(*out, j*sizeof(int)); /* !!!!!!!!!! */ return j; }
Вопрос №3: Разве не легче было реализовать функцию из вопроса №2 таким образом (просто через указатель, а не через указатель на указатель)
unsigned int filter(int *arr, unsigned size, int (*pred)(int), int* out) { unsigned i; unsigned j; for (i = 0, j = 0; i < size; i++) { if (pred(arr[i])) { *(out + j) = arr[i]; j++; } }
return j; }
Есть ли существенные различия или даже преимущества между функцией из вопроса №2 и функцией из вопроса №3?


Ответ

Вопрос №1: Зачем требуются явные преобразования такого вида?
Для C не нужны. Для C++ необходимы, т.к. в C++ неявное преобразование из void* запрещено.
Вопрос №2: Что происходит в строках, которые я выделил восклицательными знаками?
1) Выделение памяти для size int'ов. 2) Копирование элемента, удовлетворяющего предикату в только что выделенный массив. 3) Отрезаем не заполненный кусок массива данных
Вопрос №3: Разве не легче было реализовать функцию из вопроса
Они дают разный результат
Есть ли существенные различия или даже преимущества между функцией из вопроса №2 и функцией из вопроса №3?
Для варианта из вопроса №2 память выделяется непосредственно в функции, а потом усекается. Для варианта из третьего вопроса эта ответственность ляжет на вызывающую сторону. Преимущества и недостатки есть у обоих способов. Всё зависит от того, как их использовать.

Возможность остановить анимацию css

Здравствуйте!
Есть ли возможность остановить анимацию css с той позиции, когда нажата кнопка Pause и снова запустить с места остановки
На данный момент при checked Pause - анимация сбрасывается
Решение на javascript есть. Хотелось бы решение на css.
Код Fiddle
#play { display: none; } #play+label[for=play] { display: inline-block; color: #fff; cursor: pointer; font-size: 13px; z-index: 99; padding: 5px; background: #37A000; margin-bottom: 15px; } #play+label[for=play]>span:nth-of-type(2), #play:checked+label[for=play]>span:nth-of-type(1) { display: none; } #play:checked+label[for=play] { background: tomato; } #play:checked+label[for=play]>span:nth-of-type(2) { display: block; } .progress { height: 15px; background: #555; position: relative; } .progress:after { width: 0; content: ''; position: absolute; top: 0; left: 0; height: 100%; background: #37A000; animation-play-state: paused; } #play:checked+label[for=play]~.progress:after { animation: animProgress 7s linear infinite; } @keyframes animProgress { 100% { width: 100%; } }



Ответ

Лови.
#play { display: none; } #play + label[for=play] { display: inline-block; color: #fff; cursor: pointer; font-size: 13px; z-index: 99; padding: 5px; background: #37A000; margin-bottom: 15px; } #play + label[for=play] > span:nth-of-type(2), #play:checked + label[for=play] > span:nth-of-type(1) { display: none; } #play:checked + label[for=play] { background: tomato; } #play:checked + label[for=play] > span:nth-of-type(2) { display: block; } .progress { height: 15px; background: #555; position: relative; } .progress:after { width: 0; content: ''; position: absolute; top: 0; left: 0; height: 100%; background: #37A000; animation: animProgress 7s linear 1; animation-fill-mode: forwards; } #play ~ .progress:after { animation-play-state: paused; } #play:checked ~ .progress:after { animation: animProgress 7s linear 1; animation-fill-mode: forwards; } @keyframes animProgress { from { width: 0 } to { width: 100% } }


p.s. В примере выставил один цикл.

Зачем нужны вложенные интерфейсы?

Прогуливаясь по чужим кодам наткнулся на Класс, который содержит внутри интерфейсы:
class Aborigen{
interface Arm{ }
interface Hand{ }
//..etc code }
Где это может быть надобно в практическом применении? Также столкнулся, когда внутри инерфейса классы. Это чтото новое для меня. Я запутался.


Ответ

Например, когда нужно привязать интерфейс к конкретному классу.
Классический пример (из мира андроид) View.OnClickListener
Суть в том, что OnClickListener - это такое абстрактное имя, которое можно прицепить много к чему, а в данном случае дается четкое понимание, что этот интерфейс OnClickListener относится именно к View
Либо же этот интерфейс нужен исключительно внутри этого класса (ну мало-ли) и его не выносят наружу, что бы не плодить лишних сущностей и не запутывать читателей.
По большому счету - это просто еще один уровень изоляции и организации кода. Есть еще один классический пример (правда с классами, но суть та же) - это классы строители.
Можно сделать два файла/класса: MyObject и MyObjectBuilder, но более... элегантно, что-ли, будет назвать MyObjectBuilder просто Builder, поместить его внутрь MyObject и вызывать как MyObject.Builder

Вопрос про оптимизацию кода

Сегодня попробовал google closure. Заметил, что цифры в условиях он ставит на первое место:
Оригинал
A.keyLis.blockCtrlAlt.fined(e.keyCode) !== -1 && e.ctrlKey
После closure
-1 !== A.keyLis.blockCtrlAlt.fined(a.keyCode) && a.ctrlKey
Вопрос следующий- как это оптимизирует код?


Ответ

Нет, это не оптимизация. Это Йода стайл. Когда то он помогал избежать ошибок.
Если вместо a == 1 написать a = 1, то будет немного не то, что ожидается, но многие старый компиляторы/интерпретаторы пропускали. А вот так 1 = a сразу ошибка.
Сейчас многие компиляторы/интерпретаторы умеют "видеть" код вида a=1 в условиях и ругаются. Как по мне, то сейчас так уже писать не нужно.

Отличие файлов SharedPreferences от обычных файлов

Определение SharedPreferences из документации:
Объект SharedPreferences указывает на файл, содержащий пары "ключ-значение", и предоставляет простые методы для чтения и записи. Управление каждым файлом SharedPreferences осуществляется с помощью инфраструктуры и может быть частным или общим.
А чем отличаются файлы, используемые SharedPreferences, от обычных файлов в файловой системе Android? Одно из отличий, как написано в той же документации, если я правильно понимаю, состоит в строго определённой структуре файла (набор пар "ключ-значение"). А есть ли ещё отличия? Например, эти файлы можно прочитать только программно (т.е. можно прочитать только из приложения/приложений, которые обращаются к этим SharedPreferences, а открыть из файловой системы их нельзя) или же это неверно?


Ответ

Файлы SharedPreferences это обычные файлы с расширением .xml которые располагаются в подкаталоге конкретного приложения. При этом права доступа к файлу прописываются такие же как и всем остальным, которые принадлежат данному приложению. Соответственно получить доступ к нему можно не только программно, но и из файловой системы. Другим программам на устройстве получить доступ к данному файлу не удастся,так как они не имеют соответствующих прав, за исключением тех программ которые имеют права root или же подписаны тем же сертификатом, что и программа которой принадлежит SharedPreferences

Как работает приведение типов ключей при создании объекта?

var obj = { "1": 0, 1: 9, 2: 3 } console.log(obj["1"]); // 9 console.log(obj);
Почему вернулось значение свойства 1, а не "1"? Куда пропало свойство 1?


Ответ

Потому что ключом в объекте всегда является строка (ну ладно, ещё symbol, но он тут не при чём). Получается, ты в литеральную запись объекта включаешь два одинаковых свойства (разрешено в ES3-, ES5 non strict, ES6+ в любом режиме) и последнее из свойств побеждает (перезаписывает более раннее значение).

Роль interface в Java

Здравствуйте, давно читаю разные туториалы и много где встречаю должно быть мало зависимостей, как я понял это все достигается при помощи interface и IoC. Нашел много примеров но так сути и не понял как правильно это достигать... К примеру у меня есть проект с моделями(таблицы из БД) и сервисы(классы для выполнения каких=либо действий над ними), и что получается мне для каждого сервиса писать интерфейс его действий? Я понимаю что если добавится другой класс мы просто имплементим его и ничего менять не нужно практически. Но с другой стороны много лишнего кода и классов. Может быть мне кто-нибудь сможет подробно объяснить как достигнуть минимизации зависимостей на примерах кода Java или просто на словах, чтобы я уловил смысл?


Ответ

Для чего вообще нужно минимизировать зависимости? Фредерик Брукс, автор статьи «Серебряной пули нет» утверждал, что производство программного обеспечения дело трудное, и в ближайшее время не появится ничего, что сделает его проще.
Это было в середине 80-х. Через 10 лет Брукс изучил, изменилось ли что-нибудь кардинально в индустрии. Оказалось, что нет. Правда, один из подходов выглядел многообещающе — повторное использование кода
Речь о том, что, написав большую систему, и приступая к написанию другой, мы могли бы взять готовые куски кода и использовать их повторно. Фактически, мы могли бы сократить работу минимум на 30%. Этому мешает то, что части системы сильно сцеплены (couple) друг с другом.
Для борьбы со сцепленностью придуманы без малого десятки техник. Часть из них дублируют друг друга на разных уровнях детализации. Вначале программы были не очень большими, и программисты делали независимыми отдельные функции. Скажем, предпочитали чистые функции, значение которых зависело только от аргументов, следовательно, их можно было безболезненно перенести в другой проект. Предпочитали модули с высокой связностью, но малой сцепленностью. В современных ОО языках предпочитают классы с единственной ответственностью.
Когда программы стали слишком большими, модули объединили в слои (уровни) и задали чёткое правило направления зависимостей: нижние уровни не могут зависеть от верхних. Никогда.
В классическом трёхзвенном приложении уровень представления зависит от уровня предметной области, а тот, в свою очередь, от уровня доступа к данным.
Presentation → Domain → Data Access
Для примера возьмём интернет-магазин. Одной из сущностей магазина является Заказ (Order). Этот класс принадлежит к уровню предметной области, потому что вся работа интернет-магазина строится вокруг Заказов. Если вы используете паттерн MVC в построении веб-приложения, то заведовать заказами будет Контроллер Заказов (OrderController). Этот класс принадлежит к уровню представления. Значит, класс OrderController может знать и использовать Order, а Order ничего про OrderController знать не может.
В этом есть глубокий смысл. Предположим, у вас работает не только веб-приложение, но фоновые сервисы, которые, по сути являются консольными приложениями. Они запускаются с заданным интервалом и что-то делают с заказами. Очень правильно в этом случае повторно использовать весь код, реализующий Заказы и их сохранение в БД. Но чтобы это сделать, надо чётко понимать, что является представлением, а что нет. OrderController реагирует за запросы HTTP, и у него есть такие штуки, как URI запроса, текущий пользователь и прочее. Но ничего этого нет у самого Заказа. Эта ошибка встречается часто: в классах предметной области хранятся дескрипторы окна, или данные, специфичные для веб-приложений. На самом деле класс Order не может строить никаких предположений о том, в какой среде его будут использовать.
Вопрос, трудно ли будет создать фоновые сервисы или оконные приложения, если приложение спроектировано правильно? Не очень трудно. Нам, конечно, придётся написать новый слой, но нам точно не нужно будет переписывать классы нижних уровней, в частности Order
Теперь опускаемся на уровень ниже, к данным. Предположим, все данные лежат в MySQL и мы для доступа к ним используем JDBC. SQL-запрос для постраничного списка заказов мы пишем сами, он в виде строковой константы находится в Java-коде:
SELECT Orders.* FROM Orders ORDER BY Orders.CreatedAt LIMIT ? OFFSET ?
На уровне доступа к данным у нас находятся классы Connection, ResultSet, Statement из пространства имён java.sql. Классы с верхних уровней могут к ним обращаться, то есть Order мог бы уметь создавать себя из ResultSet, а OrderController мог бы выполнять запросы с помощью Statement
Снова всё хорошо. Вопрос, трудно ли будет изменить способ хранения с MySQL на Oracle, или даже на что-нибудь вроде MongoDB? На этот раз гораздо труднее, чем раньше.
Нам придётся вносить изменения не только в классы нижнего уровня, но и в Order, и в OrderController. В Oracle постраничный доступ требует другого синтаксиса, а для загрузки данных из MongoDB уже нельзя использовать ResultSet
Решение заключается в том, чтобы в данном месте инвертировать зависимость. Мы говорим, что не знаем заранее, как будем обращаться к данным. Вместо конкретных классов ResultSet и MongoCollection мы скажем: у нас точно будет какое-то внешнее хранилище из которого мы захотим постранично получать данные. Наверное, нам придётся узнавать и общее количество страниц.
public interface OrderRepository { List ReadAll(int oneBasedPageNumber); int ReadTotalPages(); }
Интерфейс Хранилище Заказов (OrderRepository) находится на уровне предметной области, и OrderController может использовать его. Реализация интерфейса для MySQL находится на уровне доступа к данным, но теперь зависимость инвертирована: доступ к данным зависит от предметной области.
public MysqlOrderRepository implements OrderRepository { @Override public List ReadAll(int oneBasedPageNumber) { . . . } }
Реализация MysqlOrderRepository видит Order и может создавать объекты Заказа. Зависимости теперь выглядят так:
Presentation → Domain ← Data Access
Из всего изложенного становятся понятно, что использовать интерфейсы для доступа к объектам предметной области не нужно, если этого не требуют специальные условия. Скажем так, Заказ в интернет-магазине — одна из базовых сущностей, и вряд ли вам потребуют две конкурирующие реализации Заказов. Точно также и сервисы предметной области интерфейсов не требуют. Бизнес-процесс оформления заказа фиксирован, поэтому его сразу можно реализовать в виде конкретного класса Сервис Оформления Заказов (OrderService).
Использовать интерфейсы для объектов уровня представления также не нужно, потому что они находятся на самом верху и от них ничего не зависит. Интерфейсами имеет смысл закрывать только объекты и сервисы уровней ниже предметной области. Мы обозначили их как уровень Data Access, а Эрик Эванс, создатель DDD, предлагает называть их инфраструктурными. Соответственно, у нас может быть сервис рассылки электронных сообщений NotificationService. Это интерфейс уровня предметной области, чья реализация TwilioNotificationService находится на инфраструктурном уровне.
При такой организации проекта мы получаем возможность быстро клонировать проект и дописать новый кусок. Хотим сделать консольное приложение? Берём готовые уровни предметной области и инфраструктуры, дописываем обвязку консольного приложения. Хотим перенести на СУБД Postgres? Берём готовые уровни предметной области и представления, дописываем реализацию хранилищ на PostreSQL. Зависимости остаются, но они упорядочены и позволяют изымать и подменять целые уровни приложения.
Есть несколько случаев, когда интерфейсы могут появиться на высоких уровнях. Скажем, если в интернет-магазине могут быть разные способы начисления скидок, их удобно реализовать в виде паттерна Стратегия. По сути это будет иерархия однотипных классов, каждый из которых рассчитывает скидку на основании своих данных. Общие методы этих классов можно вынести в базовый интерфейс. В этом случае необходимость в интерфейсе диктуется уже не зависимостями, а способом реализации конкретного паттерна.
Резюмирую: мы в действительности можем говорить о минимизации зависимостей, как об управлениями зависимостями. Мы не можем от них избавиться совсем, но мы можем их ограничивать. Для этого мы разбиваем приложение на слои, и вводим правило: все зависимости идут в одну сторону. Использовать можно только свои классы, либо классы слоя, от которого мы зависим. Ядром приложения, его солью является слой предметной области. Все слои, которые выше него, оставляем как есть, они и так от него зависят. Для слоёв, которые ниже него, инвертируем зависимости. На практике это означает, что мы вводим интерфейсы в слой предметной области, которые реализуем в нижних слоях.

Как сверстать облако тегов на css?

Сейчас готов кусок html и css к нему, но верстка не соответствует макету и непонятно, как сделать hover при наведении и всплывающую подсказку над тегом.
.tags { padding: 80px; width: 380px; /* Style for "jQuery" */ color: #ffffff; font-family: Roboto; font-size: 17px; font-weight: 300; line-height: 40px; } .tags a { white-space: nowrap; /* Style for "Rounded Re" */ width: auto; border-radius: 13px; background-color: #090a0b; padding: 5px 10px 5px 10px; text-decoration: none; color: #ffffff; }


При этом на выходе должно получится облако тегов с возможностью раскрыть его и при наведении hover с подсказкой https://yadi.sk/i/t7ATcCq23SqXoq


Ответ

ну вот как вариант
body { background: #1e2429; } .tags { padding: 80px; width: 380px; /* Style for "jQuery" */ color: #ffffff; font-family: Roboto; font-size: 17px; font-weight: 300; line-height: 40px; } .tags a { white-space: nowrap; /* Style for "Rounded Re" */ width: auto; border-radius: 13px; background-color: #090a0b; padding: 5px 10px 5px 10px; text-decoration: none; color: #ffffff; position: relative; /* для подсказки */ } /* это нужно, если есть необходимость что бы можно было навести курсор на подсказку. Иначе будет исчезать */ .tags a:after { content: ''; position: absolute; left: 0; right: 0; bottom: 100%; height: 20px; visibility: hidden; } .tags a:hover:after { visibility: visible; } .tags a:hover { background: #eb1f63; } /* оформление плашки */ .tags__hide { position: absolute; left: 50%; position: absolute; left: 50%; transform: translateX(-50%); color: #000; background: #fff; padding: 5px 10px; line-height: 1; transition: all .3s; /* параметры для изчезновения/появления. Можете настроить как вам угодно */ visibility: hidden; opacity: 0; bottom: 0; } .tags a:hover .tags__hide { visibility: visible; opacity: 1; bottom: calc(100% + 15px); } /* треугольник */ .tags__hide:before { content: ''; width: 10px; height: 10px; background: #fff; position: absolute; bottom: -5px; left: 50%; margin-left: -5px; transform: rotate(45deg) }


Как правильно верстать горизонтальный список (меню)?

Имеется пример списка:


Как правильно записать стили, чтобы сделать горизонтальное меню?
Просто есть вариант с float: left;, displat: inline; итп. Хочу увидеть, как делают это профессионалы.

UPD: при li > display: inline-block; у li появляются боковые отступы, которые никак не могу убрать, а чем проблема?


Ответ

Пример с flexbox
* { margin: 0; padding: 0; } body { font-family: Monospace; font-size: 1.3rem; } .container { padding: 0 0.9375rem; } li { list-style-type: none; } a { text-decoration: none; color: white; } .navbar { background-color: crimson; } .navbar ul { display: flex; justify-content: flex-start; flex-wrap: wrap; } .navbar ul li { padding: 1rem; background-color: black; }


Пример с flow-root & float: left
* { margin: 0; padding: 0; } body { font-family: Monospace; font-size: 1.3rem; } .container { padding: 0 0.9375rem; } li { list-style-type: none; } a { text-decoration: none; color: white; } .navbar { background-color: crimson; } .navbar ul { display: flow-root; } .navbar ul li { padding: 1rem; float: left; background-color: black; }
Upd: Выделил li, сделал без отступов.

Две функции в самовызывающейся функции

Такой вопрос
var bred = (function a() { return 1 }, function b() { return 2 })();
При вызове будет 2. Почему?


Ответ

Потому что оператор запятая возвращает последний операнд. Всё равно что
var bred = (1, 2); console.log(bred);

Как вывести на экран количество элементов в массиве имеющих конкретное значение?

Я создала строковый массив,и рандомно присвоила элементам значения в помощью переменной типа int (0,1) и вывела на консоль "черное" и "белое". Как вывести на экран еще и количество элементов в массиве отдельно с названием "черное" и названием "белое"?
int numberOfBalls = 100; string[] balls = new string[numberOfBalls];
Random rnd = new Random(); int a = rnd.Next(0, 2);
for (int i = 0; i < numberOfBalls; i++) { a = rnd.Next(0, 2); if (a == 0) balls[i] = "beloe"; else balls[i] = "chernoe"; }
for (int i = 0; i < numberOfBalls; i++) { Console.WriteLine(balls[i]); }


Ответ

Воспользуйтесь методом расширения Count
Console.WriteLine(balls.Count(s => s == "beloe"));
Классический вариант сделать тоже самое вручную в цикле:
int count = 0; foreach (string s in balls) if (s == "beloe") ++count; Console.WriteLine(count);
С помощью цикла for:
int count = 0; for (int i = 0; i < numberOfBalls; ++i) if (balls[i] == "beloe") ++count; Console.WriteLine(count);
Для подсчета количества "черных" код аналогичен.

Парсинг строки для разбиения на слова по пробелу

Не могу найти красивого решения для вычленения слов из строки. Например:
SELECT 'Фамилия' as Col_1, Parse(FullName, ' ')[0] as FirstName, 'Имя' as Col_2, Parse(FullName, ' ')[1] as Name, 'Отчество' as Col_3, Parse(FullName, ' ')[2] as Patronymic FROM Students
Есть ли подобное в SQL вообще без написания своих хранимых функций?


Ответ

Можно обойтись без регулярок, используя только substr и instr. Несмотря на свою неказистость, такое решение может показывать значительно более высокую скорость по сравнение с регулярками.
with Students as ( select level id, 'fname'||level||' mname'||level||' lname'||level fullName from dual connect by level <= 3 ) select s.*, substr(s.fullName, 1, instr(s.fullName, ' ', 1, 1) - 1 ) as fName, substr(s.fullName, instr(s.fullName, ' ', 1, 1), instr(s.fullName, ' ', 1, 2) - instr(s.fullName, ' ', 1, 1) ) as mName, substr(s.fullName, instr(s.fullName, ' ', 1, 2) ) as lName from Students s

Найти общий объем загруженной информации приложением на c#

Есть приложение winforms на c#. Иногда оно обращается с запросами к разным интернет ресурсам, получает ответы. Можно ли как-то узнать, сколько Mb было скачано за одну сессию работы с приложением. То есть мне нужно просто узнать объем траффика через мое приложение. Спасибо


Ответ

Можно использовать счетчики производительности .NET CLR Networking. Для этого необходимо включить в раздел configuration файла app.config следующий элемент:

Счетчики позволяют получить количество байт, отправленных и полученных средствами классов .NET, для указанного процесса. Создадим вспомогательный класс:
using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Threading; using System.Net; using System.Text;
namespace WinformsTest { public class NetworkStats { const string CategoryName = ".NET CLR Networking 4.0.0.0";//В .NET 2.0-3.5 заменить на ".NET CLR Networking"
static PerformanceCounter _sentcounter = null; static PerformanceCounter _recvcounter = null;
public static long BytesSent { get { if (_sentcounter == null) throw new InvalidOperationException("Class not initialized"); return _sentcounter.RawValue; } }
public static long BytesReceived { get { if (_recvcounter == null) throw new InvalidOperationException("Class not initialized"); return _recvcounter.RawValue; } }
public static bool Initialize() { //устанавливаем культуру, чтобы иметь предсказуемое имя счетчика CultureInfo ci = Thread.CurrentThread.CurrentCulture; Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
try { var category = new PerformanceCounterCategory(CategoryName);
//для активации счетчиков нужно отправить хотя бы один запрос, неважно успешный или нет try { WebClient cl = new WebClient(); string html = cl.DownloadString("http://example.com"); Debug.WriteLine(html.Length); } catch (Exception ex) { Debug.WriteLine(ex.Message); }
//получаем имя процесса Process pr = Process.GetCurrentProcess(); string prname = ""; using (pr) { prname = (pr.ProcessName.ToLower()); } var instances = category.GetInstanceNames();
//находим экземпляр счетчика для процесса string instance = ""; foreach (string s in instances) { if (s.ToLower().Contains(prname)) instance = s; } if (instance == "") return false;
//создаем счетчики _sentcounter = new PerformanceCounter(CategoryName, "Bytes Sent", instance, true); _recvcounter = new PerformanceCounter(CategoryName, "Bytes Received", instance, true); return true; } finally { //возвращаем исходную культуру Thread.CurrentThread.CurrentCulture = ci; Thread.CurrentThread.CurrentUICulture = ci; }
} } }
Пример использования:
public partial class Form1 : Form { public Form1() { InitializeComponent(); if (NetworkStats.Initialize() == false) { MessageBox.Show("NetworkStats.Initialize failed"); return; } timer1.Enabled = true; }
public string PerformRequest(string url) { WebClient cl = new WebClient(); string html = cl.DownloadString(url); return html; }
private void button1_Click(object sender, EventArgs e) { string s = PerformRequest("http://yandex.ru"); MessageBox.Show(s.Substring(0,300)); }
private void timer1_Tick(object sender, EventArgs e) { textBox1.Text = "Bytes sent: " + NetworkStats.BytesSent.ToString() + "; Bytes received: " + NetworkStats.BytesReceived.ToString(); } }

Переключение картинок между двумя button

Подскажите оптимальный способ : нужно по нажатию на первый button вывести первую картинку, по нажатию на второй button - вывести вторую картинку. Когда выводится одна картинка, - другая скрывается.
Пример кода:


div { display: inline-block; width: 400px; text-align: center; } button { font-size: 30px; } .apple { display: none; }


Ответ

Сделал универсальный и обновленный вариант на 4 строчки jQuery:
$('.box').on('click', '.btn', (e)=> { const srcAttr = $(e.target).data('src'); $('.image').css('background-image', `url(${srcAttr})`); }); .box { display: flex; justify-content: center; margin-bottom: 10px; } button { font-size: 24px; } .image-box { display: flex; justify-content: center; } .image { height: 250px; width: 250px; background-size: cover; background-repeat: no-repeat; }


Пример на JSFiddle.

Как растянуть текст svg по всей ширине контейнера?

Растягивание самого SVG-элемента никак не помогает. Также пробовал добавить viewBox='50% 50% 100% 100%' и это не привело ни к каким результатам.
.wrapper { width: 600px; background-color: blue; height: 600px; } svg { width: 100%; height: 100%; } tspan { font-size: 30px; font-family: Helvetica; }

The chair has been used since antiquity, although for many centuries it was a symbolic ar - ticle of state and dignity rather than


Ответ

Растягивание текста делается с помощью атрибутов textLength и lengthAdjust
.wrapper { width: 600px; background-color: blue; height: 180px; } svg { width: 100%; height: 100% } text { font-size: 30px; font-family: Helvetica; }

antiquity, although for many centuries it was a symbolic article of state and dignity rather than

Смотрите также: Как растянуть текст по ширине блока div, где присутствует решение через JS/JQ.

Почему не работает присваивание переменной значения в lambda функции?

def _create_candle(self, index): candle = Candle(index) self.candles.append(candle)
def o(response): candle.open = response.result
def h(response): candle.high = response.result
def l(response): candle.low = response.result
def c(response): candle.close = response.result
def v(response): candle.volume = response.result
def t(response): candle.time = response.result
self._api.send("O", lambda response: candle.open = response.result, self._ds_id, index) # не работает self._api.send("H", h, self._ds_id, index) self._api.send("L", l, self._ds_id, index) self._api.send("C", c, self._ds_id, index) self._api.send("V", v, self._ds_id, index) self._api.send("T", t, self._ds_id, index)


Ответ

В лябмдах нельзя присваивать элементы.
Попытки присвоить приведут к ошибке: SyntaxError: can't assign to lambda
Но можно попытаться обойти ограничение, пример:
class Foo: pass
f = Foo() f.a = 10 print(f.a) # 10
# result = lambda x: f.a = x # Ошибка result = lambda x: setattr(f, 'a', x) result(78) print(f.a) # 78
result('abc') print(f.a) # abc

C# вопрос по преобразованию

Есть класс, реализующий интерфейс IEnumerable
class MyClass : IEnumerable { public IEnumerator GetEnumerator() { for(int i = 0; i < 100; i++) { yield return i; } }
IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)this).GetEnumerator(); //всё хорошо return (IEnumerable)this.GetEnumerator(); //error; }
Почему первый вариант компилятор принимает, а второй подчеркивает, что такая запись недопустима, если, по идеи, оба эти записи являются операциями преобразования?


Ответ

Потому что он думает, что Вы хотите переменную типа IEnumerable преобразовать в IEnumerator. То есть расценивает это как попытку вызвать this.GetEnumerator(), преобразовать реультат в IEnumerable (явным кастом) и вернуть как IEnumerator (неявным кастом) - тип возвращаемого значения, объявленный в декларации метода. Просто:
return this.GetEnumerator();

Что такое UUID?

Объясните пожалуйста русским языком, что такое uuid, читал и википедию и другие источники, все равно не особо понимаю.
Например при переходе по url posts/1 мы получим саму статью. А с использованием uuid идентификатор поста будет что-то вроде этого posts/ac5fb2c6-e43a-48e3-a116-47fc719a69c5
Зачем это нужно и почему лучше использовать с uuid, а не без него (по умолчанию posts/1)?


Ответ

Зачем это нужно и почему лучше использовать с uuid, а не без него (по умолчанию posts/1)?
Чтобы нельзя было получать сущности (в данном смысле посты) по их номеру. Т.е. перебором от 1 до n
Это защита от получения произвольных данных всякими парсерами.
Например, захотел я собрать все посты с другого сайта, пишу:
Псевдокод:
for i in 1..1000: html = get("https://example.ru/posts/" + i)
И через пару секунд получаю содержимое 1000 постов с того сайта.

Если бы там каждый пост имел uuid, то пришлось бы другим способом получать их:
Через разделы: главное меню, категории, и т.п. Через поиск на сайте (можно даже через поисковики) <Другие способы>

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

Всем здравствуйте, есть у меня массив List>readyList. То есть в List содержаться несколько коллекций. Как мне получить простой стринговый массив,то есть в это массиве все элементы из всех внутренних коллекций. Думаю и не могу сообразить, вроде простой форыч не подходит.


Ответ

Как вариант, использовать LINQ, а точнее SelectMany. Простой пример:
List> list = new List> { new List {"111", "222"}, new List {"333", "444"} };
List result = list.SelectMany(x => x).ToList();
Если без LINQ, то примерно так:
List result = new List(); foreach (var item in list) { result.AddRange(item); }
Результат:

Расчет коллизий при CRC32

Возник вопрос - если существует значение функции CRC32, например - a50985e0 которое было получено из массива байт - Hello (т.е. из строки ТОЛЬКО символов.) то какова вероятность что точно такое же значение (a50985e0) появится при обработке функцией массива байт полученных из 12345 т.е. из числа ?
Upd.
Исходя из ответов уважаемых @Alex и @Harry делаю вывод что коллизий не избежать в принципе. И при постаточно большем диапазоне числового массива (от 0 до 1 000 000 000) всегда найдется хеш, который совпадет с хешем полученным из строки символов. В связи с этим переформулирую вопрос - существует ли закономерность (возможно ли ее вообще обнаружить) в колличестве этих самых коллизий ? Например хеш X из числа Y (например 12345) проверен в обшем массиве хешей (0 - 2 000 000 000) и найдено 10 коллизий, и так же для любого числа - врезультируещем массиве существует хотябы 10 коллизий. В то время как хеш из символьной строки Hello даст всего 1 коллизию и так же любая другая строка из символов даст не более 1 коллизии. Существует ли подобная законормерность ?


Ответ

Вначале хочу заметить, если вы задаетесь таким вопросом, то скорее всего вы используйте функцию чек-суммы не по прямому назначению. А значит, вы делаете что-то неправильно.
Насколько я понял, вам интересно, одинаков ли шанс получить коллизию, если на входе строка из букв, или строка из цифр. Хочу заметить, что если у вас откуда-то приходят случайные строки длиной 5 символов (для примера), то шанс что у вас появятся одинаковые строки из цифр на много-много порядков выше, чем когда приходят строки из букв.
Что бы показать, что шансы получить коллизию одинаковы, я сгенерировал 100 млн чек-сумм для строк длиной 20 (я взял 20, что бы не создавались одинаковые строки из чисел), и посчитал коллизии внутри строк из чисел, внутри строк из букв, и взаимные коллизии между строками из чисел и букв. Вот мой код на C#:
private static uint crc32(byte[] data) { uint crc = 0xffffffff; uint poly = 0xedb88320; for (int i = 0; i < data.Length; i++) { uint c = (crc ^ data[i]) & 0xff; for (int k = 0; k < 8; k++) c = (c & 1) != 0 ? poly ^ (c >> 1) : c >> 1; crc = c ^ (crc >> 8); } return crc ^ 0xffffffff; }
static void Main(string[] args) { byte[][] digits = new byte[0x10000][]; for (int i = 0; i < 0x10000; i++) digits[i] = new byte[0x10000];
byte[][] chars = new byte[0x10000][]; for (int i = 0; i < 0x10000; i++) chars[i] = new byte[0x10000];
var rnd = new Random(123); int iterations = 100000000;
byte[] buffer = Encoding.ASCII.GetBytes("12345678901234567890"); for (int i = 0; i < iterations; i++) { int index = rnd.Next(20); buffer[index]++; if (buffer[index] > '9') buffer[index] = (byte)'0';
uint crc = crc32(buffer); digits[crc >> 16][crc & 0xFFFF]++; }
buffer = Encoding.ASCII.GetBytes("abcdefwxyzabcdefwxyz"); for (int i = 0; i < iterations; i++) { int index = rnd.Next(20); buffer[index]++; if (buffer[index] > 'z') buffer[index] = (byte)'a';
uint crc = crc32(buffer); chars[crc >> 16][crc & 0xFFFF]++; }
int digitsCollisions = 0; for (int i = 0; i < 0x10000; i++) for (int j = 0; j < 0x10000; j++) if (digits[i][j] > 1) digitsCollisions += digits[i][j];
int charsCollisions = 0; for (int i = 0; i < 0x10000; i++) for (int j = 0; j < 0x10000; j++) if (chars[i][j] > 1) charsCollisions += chars[i][j];
int digitsCharsCollisions = 0; for (int i = 0; i < 0x10000; i++) for (int j = 0; j < 0x10000; j++) if (chars[i][j] > 0 && digits[i][j] > 0) digitsCharsCollisions += chars[i][j] * digits[i][j];
Console.WriteLine(digitsCollisions); Console.WriteLine(charsCollisions); Console.WriteLine(digitsCharsCollisions); }
Результат:
2298490 2304243 2330855
Как видно, вероятность получить коллизию одинаковая.
В другом тесте я брал длину входных данных 10 байт, и вместо случайных чисел просто брал строковое представление числа i. Результат получился другой:
4431872 2301156 2324554
Как видно, коллизий на числах в 2 раза больше, хотя чек-сумма считалась на уникальных входных данных. Это происходит потому, что в случайной строке из букв длиной 10 байт больше энтропии, чем в строке чисел. CRC-32 не является полноценной криптографической хеш-фукнцией, и в ней нет лавинного эффекта. С хорошей хеш-функцией мы бы получили одинаковый результат.

Виртуальное наследование в C++

Что это такое и зачем это используют в C++?


Ответ

Виртуальное наследование необходимо в такой ситуации.
class A { int a; }; class B: public A {}; class C: public A {}; class D: public B, public C {};
В классе D, в таком случае, будут два поля с именем a и они оба будут принадлежать классу A. Проблема состоит в определении к какой переменной идет обращение. Для исключения подобной ситуации используют виртуальное наследование. Правильный вид объявления в данном примере будет
class A { int a; }; class B: public virtual A {}; class C: public virtual A {}; class D: public B, public C {};

Использование итераторов С++ с массивами

Возможно, кто-либо может объяснить итераторы и их использование с массивами, или же дать соответствующую литературу по этой теме?
Т.к. я читал по разным книгам о итераторах, но там идет речь о использовании их совместно с STL и т.п., а как самому написать - особо такого не написано... Насколько я понял, то они нужны, чтобы перебирать и т.п. элементы массива. Я правда не знаю смысл в этом, если вроде бы можно и непосредственно обращаться, ну да ладно, не важно. Т.е. нужно создать вложенный класс внутри класса, где будет содержаться, скажем, массив?
Если я понял, то в конце концов, когда он написан, то, к примеру, для цикла выведения массива будет такой код:
for(start = Iterator.begin(); start != end; start++) { cout << *start; }
Или я что-то путаю?
P.S.: А ещё, если у кого есть книги, где об этом говорится, статьи, то пожалуйста и их напишите тоже сюда.

class Array { private: int* p; public: class Iterator { public: Iterator() { p = nullptr; } Iterator(int *pv) { p = pv; } int operator *() const { return *p; } Iterator operator ++(int) { int *temp = p; return ++temp; } };
Array(); ~Array(); int& operator[] (); Iterator begin() { return Iterator(buffer_) } int* buffer_;
void partial_sort(Array::Iterator start, Iterator end) { start }
Вот как понять что-то вроде этого... Точнее говоря это наброски, они не совсем мои.. Вот мне нужно сделать примерно такое же, только работающее..

Если говорить поконкретнее насчёт того, что не понимаю... Вот класс итератор вложенный, в нем какое поле должно быть ? При перегрузке Iterator operator ++(int) это он типо должен будет перебирать элементы массива же, да? А если я хочу перегрузить ==? Я пробовал писать что-то вроде:
Iterator operator==(Iterator it1, Iterator it2)
Чтобы сравнивать их на равенство, но не получается - ошибка "много аргументов". ДА и ещё не до конца понимаю как его реализовать.. Т.е. допустим функции вывода, сортировок вместо того, чтобы передавать массив и его длину мне нужно будет передавать 2 итератора, верно? Один из них указывает на начало, другой на конец, да? А вывод массива в таком случае выглядел бы с итераторами так:
for(start ???; start != end; start++) cout << *start;


Ответ

Вот, собственно, пример итератора. Этот код вырезан из SGI STL, почищен от всяких подробностей, чтобы оставить суть. Тут можно посмотреть что и как в итераторах должно быть в принципе: #include // нужен только лишь для типа std::size_t
class iterator { protected: int* p;
public: explicit iterator(int* __i) : p(__i) { }
// Forward iterator requirements const int& operator*() const { return *p; }
int& operator*() { return *p; }
int* operator->() const { return p; }
// prefix increment (++it) iterator& operator++() { ++p; return *this; }
// postfix increment (it++) iterator operator++(int) { return iterator(p++); }
// Bidirectional iterator requirements
// prefix decrement (--it) iterator& operator--() { --p; return *this; }
// postfix decrement (it--) iterator operator--(int) { return iterator(p--); }
// Random access iterator requirements const int& operator[](const std::size_t& __n) const { return p[__n]; }
int& operator[](const std::size_t& __n) { return p[__n]; }
iterator& operator+=(const std::size_t& __n) { p += __n; return *this; }
iterator operator+(const std::size_t& __n) const { return iterator(p + __n); }
iterator& operator-=(const std::size_t& __n) { p -= __n; return *this; }
iterator operator-(const std::size_t& __n) const { return iterator(p - __n); }
int* base() const { return p; } };
// Forward iterator requirements inline bool operator==(const iterator& __lhs, const iterator& __rhs) { return __lhs.base() == __rhs.base(); }
inline bool operator!=(const iterator& __lhs, const iterator& __rhs) { return __lhs.base() != __rhs.base(); }
// Random access iterator requirements inline bool operator<(const iterator& __lhs, const iterator& __rhs) { return __lhs.base() < __rhs.base(); }
inline bool operator>(const iterator& __lhs, const iterator& __rhs) { return __lhs.base() > __rhs.base(); }
inline bool operator<=(const iterator& __lhs, const iterator& __rhs) { return __lhs.base() <= __rhs.base(); }
inline bool operator>=(const iterator& __lhs, const iterator& __rhs) { return __lhs.base() >= __rhs.base(); }
inline std::size_t operator-(const iterator& __lhs, const iterator& __rhs) { return __lhs.base() - __rhs.base(); }
inline iterator operator+( std::size_t __n, const iterator& __i) { return iterator(__i.base() + __n); } Обратите внимание на explicit конструктор, на то какие операторы перегружены для того, чтобы итератор удовлетворял концепциям: forward iterator random access iterator bidirectional iterator

Зачем в Java создавать самого себя из static main()?

При решении оллимпиадных задач, и не только, люди часто в методе main создают объект этого же класса, и запускают его уже нестатический метод run. public class A { public static void main(String[] args) { new A().run(); }
private void run() { //code here } } Пример из acm.timus.org FAQ Зачем так делать, если можно просто помечать все члены как static?


Ответ

Если реализовывать Runnable, то в предыдущих версиях Java это был единственный способ отхапать себе большой стек и сделать возможным, скажем, глубокую рекурсию. А так это банально удобнее -- везде писать static не только лениво, но и несимпатично. В том коде, что вы привели одна строчка кода и один лишний метод заменяет тысячи static'ов. Я лично, использую не один run, а методы init, solve, finish, где в init'е объявляю ввод и вывод, в finish'е делаю flush для output-потока, а в solve просто пишу решение задачи. Таким образом, с помощью шаблонов в вашей любимой IDE вы можете сделать удобный шаблон таким образом, что всю эту стандартную рутину(ввод-вывод) не писать тысячу раз, а IDE сама генерировала код, а вы только писали решение в solve to Dex: кто мешает просто сделать метод run, для этого не обязательно реализовывать Runnable :)

“Задачка” на составление SQL-запроса

Есть запрос:
SELECT *, DATE_FORMAT(`timestamp`,'%d.%m.%Y') AS `date` FROM testresults WHERE `timestamp` > '2011-08-01' AND `timestamp` NOT LIKE ('2011-08-04%') AND `publish` = '1' ORDER BY SUBSTRING(`timestamp`, 1, 10) DESC, `green` DESC, `red` ASC, `white` ASC, `timestamp` DESC
Запрос вытаскивает записи результатов тестов за текущий месяц и сортирует их по дням таким образом, чтобы тесты с лучшими результатами "внутри" дня шли первыми. Но мне, на самом деле, нужно выбрать только первую строчку "внутри" каждого дня, т.е. только одну строчку с самым лучшим результатом за каждый день текущего месяца. Можно ли это сделать в данном запросе? И если можно, то каким образом нужно модифицировать запрос?
upd: Результат теста лежит в трех колонках: green (количество правильных ответов), red (количество неправильных) и white (количество вопросов без ответа). Если количество green, red и white у двух тестов одинаковое, то лучшим из них (в этот день) считается тот, который сделан позже по времени (поле timestamp, формат этого поля YYYY-MM-DD HH:MM:SS). В ORDER BY видно как сортируются результаты.
Если бы поле в котором лежит результат было бы одно, то можно было бы сделать MAX() по этому полю, сгруппировав записи по дням. Но здесь фактически четыре поля определяющих лучший результат и я не вижу варианта как можно по ним сделать МАX() или что-то подобное ...
т.е. по сути надо сделать что-то типа "LIMIT 1 внутри каждого дня" ... вот только как и можно ли это сделать вообще?


Ответ

К сожалению, в mysql нет аналитических функций, поэтому придёться немного поизвращаться. Примерно так. select * from testresults t, (select max(a.id) as id from testresults a, (select max(result) res, date(day) d from testresults group by date(day)) b where a.result = b.res and date(a.day) = b.d group by a.result, date(a.day)) x where t.id = x.id; Хороший, кстати, вопрос) Тут таких мало.

Базы данных для автотрекера

Необходимо спроектировать базу данных для системы слежения за автомобилями. На автомобиле стоит устройство слежения, которое отправляет свои координаты на сервер раз в N секунд. Работаю с MySQL 5ой версии. Опуская ненужные подробности, в моей голове родилось два варианта: Для хранения координат использовать одну таблицу с колонками: [ID устройства(primary key)], [Долгота], [Широта], [Дата_Время] Получается, что в одной таблице хранятся все треки для всех устройств. Использовать отдельную таблицу для каждого трекаустройства и хранить в базе таблицу: [ID устройства(primary key)], [Имя таблицы трека] Запросы получаются сложнее, но каждый трек лежит в БД отдельно. Внимание вопрос: какой вариант использовать лучше и почему? Или оба варианта не тру и есть вариант номер три?


Ответ

Две таблицы. Первая - последние N точек для активных в данный момент устройств, где N - достаточное число для отображения логического маршрута(для такси - один заказ). Вторая - все точки для всех устройств. При отключении устройства оно пропадает из первой таблицы. Для каждого устройства создавать таблицу не надо.

Сборник задач по Java [дубликат]

На данный вопрос уже ответили: Книги и учебные ресурсы по Java 1 ответ Здравствуйте!
Посоветуйте ссылки по основам Java, где можно больше попробать с примерами и поразбираться с кодом к каждой теме?
Где можно скачать сборник задач по JAVA?


Ответ

Вот еще хороший сборник задач по Java Fundamentals.

Автогенерация кода

Подскажите, пожалуйста, на каком из языков программирования можно написать программу, которая способна создать другую программу, а так же полностью изменить себя? Какие способы есть для этого, макросы, метапрограммирование? Чем тогда отличаются макросы ассемблера от макросов Lisp?


Ответ

Подскажите пожалуйста на каком из языков программирования можно написать программу которая способна создать другую программу, а так же полностью изменить себя? Для использования возможностей метапрограммирования достаточно наличия в языке eval. Возможность построить и выполнить произвольный код который будет влиять на текущий контекст — мощное средство с помощью которого можно писать программы, пишущие программы. Чтобы "изменять себя" достаточно переопределять существующий код в рантайме. Это можно сделать много где: Smalltalk, Python, Ruby, JavaScript. Иногда много средств для изменения кода на лету доступно из без eval, когда среда поддерживает рефлексию. (Smalltalk) Какие способы есть для этого, макросы, метапрограммирование? Чем тогда отличаются макросы ассемблера от макросов Lisp? Макросы Lisp — это просто удобное средство для преобразования AST перед компиляцией ничего больше. Разница в том, что макросы asm и C-предпроцессора оперируют кусками текста. Макросы Lisp оперируют выражениями. Кроме того, макросы в Lisp -- полноценные программы, и с помощью них можно строить весьма сложные выражения. UPD eval — это процедура которая принимает исходный код в виде данных (просто строку или AST) и выполняет его. Например в JavaScript можно написать так: eval("function some_func() { return 1; }") Здесь код передан как простой текст, но после выполнения будет объявлена функция some_func в текущем контексте, и мы сможем ею оперировать. some_func() // вернёт 1 Так как передаётся простой текст, то мы можем его преобразовывать любыми способами, и в итоге выполнить произвольный код в рантайме. AST — abstract syntax tree, такая структура данных (дерево) в которую преобразуется исходный код какого-либо языка после парсинга. После того как получено AST обычно над ним производят ряд преобразований (оптимизаций), а потом компилируют в машинный код. В случае Lisp из-за простоты синтаксиса AST будет обычный линейный список, например код: (some-construction (for i 0) ((i) exit)) В виде списка (AST) будет почти так же: (list 'some-construcion (list 'for 'i 0) (list (list 'i) 'exit)) ;; Или достаточно закавычить, чтобы получить тот же список '(some-construction (for i 0) ((i) exit)) Макросы — просто программы которые оперируют этой структурой данных, уже после того как код был прочтён, но ещё не оптимизирован и не скомпилирован. Они позволяют легко встраивать новые конструкции в язык, которые потом преобразуются в какие-то стандартные конструкции. Полезно взглянуть на язык Nemerle, который также поддерживает макросы, но не является лиспоподобным.

Как сделать прозрачный фон формы в Visual Studio на C#?

Мне нужно сделать прозрачным только фон, ничего больше. Пробовал через опцию "Opacity" но тогда прозрачным стает все, и форма и кнопки и все остальное. Помогите пожалуйста, желательно представить кусочек кода, а то я в C# недавно.


Ответ

Для WinForms: this.FormBorderStyle = FormBorderStyle.None; this.AllowTransparency = true; this.BackColor = Color.AliceBlue;//цвет фона this.TransparencyKey = this.BackColor;//он же будет заменен на прозрачный цвет То же самое можно сделать и из конструктора...

Создание запуска приложения java для “недалеких” пользователей

Есть jar-архив с приложением java. Нужно сделать так, чтоб пользователь мог запускать приложение не из командной строки, а просто кликнул по ярлыку и всё запустилось (под винду). Как это сделать? Написать и скомпилировать программу например на C#, которая будет делать java -jar app.jar?


Ответ

Можно просто написать bat-файл, например, start.bat, а в нём то, что Вы и написали java -jar <ваш jar-файл>.jar

Как программно проверить наличие установленного Adobe Reader?

У нас в программу встроен элемент управления Adobe Reader с помощью AcroPdfLib. Если не стоит Adobe Reader, конструктор формы падает с ошибкой. Хотелось бы реализовать такое поведение: если не установлен Adobe Reader, не открывать pdf-документ в нашей программе, а предложить пользователю, сохранить его. Еще лучшим вариантом было бы использование для отображения pdf-документов такой библиотеки, которая не требует установки чего бы то ни было, чтобы можно было просто положить сборку в дистрибутив - и всё работает.


Ответ

Проверка записи в реестре: RegistryKey adobe = Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("Adobe");
if (adobe != null) { RegistryKey acrobatReader = adobe.OpenSubKey("Acrobat Reader");
if (acrobatReader != null) { // TODO: ... } } Проверка GUID для инсталлятора, если GUID известны: bool installed = codes.Any(guid => { var code = "{" + guid.ToString().ToUpper() + "}"; var state = MsiQueryProductState(code);
return state == 3 || state == 5); }); Здесь codes - это guid для версий Acrobat Reader. Варианты просмотра pdf-файлов на C# без установленного софта от Adobe: View PDF files in C# using the Xpdf and muPDF library, Print PostScript PDF Viewer Control Without Acrobat Reader Installed

Поскажите с сортировкой в SQL-запросе

Есть не совсем "правильный" sql-запрос: SELECT * FROM `products` ORDER BY `quantity` DESC, `position` поле quantity - числовое значение от 0 до нескольких сотен - хранит остаток товара на складе; поле position - внутренняя сортировка товара - чем меньше значение в нем, тем товар должен выводиться в каталоге раньше относительно других. Как переписать этот запрос таким образом, чтобы в начале списка шли все товары у которых ненулевое количество на складе (quantity != 0), отсортированные по полю position, а потом товары с нулевым количеством на складе? (если можно это сделать одним запросом)


Ответ

Используйте CASE в предложении ORDER BY. Примерно так SELECT * FROM `products` ORDER BY case when `quantity`!=0 then 0 else 1 end, `position`

Определение браузера

Подскажите, пожалуйста, как средствами jQuery определить браузер (FireFox в частности)?


Ответ

Test

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

Всем доброго времени суток, подскажите, как в C/C++ программно определить количество ядер в процессоре? Может метод какой есть? #include
using namespace std;
int main() { int numCPU = sysconf(_SC_NPROCESSORS_ONLN); cout << numCPU << endl; }


Ответ

Отредактировано: Раз нашел, то сделал перевод аналогичного вопроса на StackOverflow
Linux, Solaris, AIX, OS X >= 10.4:
sysconf(_SC_NPROCESSORS_ONLN);
Или прочитать в /proc/cpuinfo (для LSB-совместимых дистрибутивов). FreeBSD, OS X/Darwin, NetBSD, OpenBSD и их *BSD-сородичи:
int mib[4] = {CTL_HW, HW_AVAILCPU, 0, 0}; size_t len = sizeof(numCPU); sysctl(mib, 2, &numCPU, &len, NULL, 0); if (numCPU < 0) { mib[1] = HW_NCPU; sysctl(mib, 2, &numCPU, &len, NULL, 0); } HPUX:
mpctl(MPC_GETNUMSPUS, NULL, NULL) IRIX:
sysconf(_SC_NPROC_ONLN) OS X >= 10.5 (на Objective-C):
NSUInteger a = [[NSProcessInfo processInfo] processorCount]; NSUInteger b = [[NSProcessInfo processInfo] activeProcessorCount]; Windows
SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo);
numCPU = sysinfo.dwNumberOfProcessors;

Проверка e-mail на существование

Как можно определить e-mail на существование на php? Можно конечно через этот сервис curl запросы отправлять. Но хотелось бы узнать, как они это сделали.


Ответ

в ТЕОРИИ сделать можно, но не везде.
по поводу гугла:
telnet gmail-smtp-in.l.google.com 25
helo example.com mail from: rcpt to: 550-5.1.1 The email account that you tried to reach does not exist. Please try 550-5.1.1 double-checking the recipient's email address for typos or 550-5.1.1 unnecessary spaces. Learn more at 550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596
а если пользователь существует, то будет ответ:
250 2.1.5 OK
вот более полный расписанный ответ
Все это вполне может работать и для других серверов.

Использование Android Studio для разработки приложений [дубликат]

На данный вопрос уже ответили: Книги и учебные ресурсы по Android 1 ответ Воспользуюсь хорошим настроением Хешкодовцев, спрошу нубский вопрос. В целях заполнить вечернее послерабочее время безделья, коего стало много после окончания игр близов, решил податься далее в самообразование. Вопрос собственно состоит достаточно абстрактный - решил изучать программирование под android. Скачал разрекламированную студию, прочитал старткнижку лектора МГУ по быстрому старту разработки под адройды... а понимания все еще не появилось. Открываю студию - куча файлов, всяческие конфигурации, ох боже ж ты мой. В общем это как учиться плавать на берегу и тебя бросают с лодки в воду, с криком - ты же все уже прочитал. Есть ли дизайнер окон? Есть ли дополнительные компоненты визуальные? Где привычные из других языков не визуальные компоненты, но все же компоненты, которые можно кинуть на форму и забыть про их создание (ну например таймер, который по тикам будет вызывать события); и еще много и много вопросов, но остальное по ходу разбирательства =) Посоветуйте более-менее полную книжку по андройду. Разрабатывать предполагаю, буду для себя всяческие утилиты для автоматизации своей обыденной деятельности за телефоном и планшетом. Идеи рассказывать не буду, просто если появятся такие же утилиты в гуглплее - у меня пропадет интерес что-то делать. Если о себе, то с языками программирования знаком с 1997 года, по хронологии: Pascal, delphi7, BDS 2006, c# winforms (3.5), bat/cmd, c# wpf (3.5, 4.0), powershell (2.0), и еще несколько страшных слов. Java только начинаю понимать на уровне принадлежности к андройд, но как не посмотрю - слова другие, а суть таже. В общем суть вопроса по интерфейсу студии и ее возможностей (вдруг кто уже освоил новинку) и поиск книжки (можно из серии "быстрый старт" на подобие той что прочитал, можно чуть по глубже). Но для меня быстрое изучение будет только если книга на русском =) увы на английском обучен читать по диагонали, выхватывая только нужные слова, зачастую пропуская нюансы. Спасибо за терпимость и очередную помощь.


Ответ

Есть ли дизайнер окон? да. ищите каталоги, которые начинаются с слова layout, там xml файлы. Открывайте их и увидите дизайнер (возможно придется внизу переключиться на вкладку "Design".) Есть ли дополнительные компоненты визуальные? да, например Sherlock ActionBar. Где привычные из других языков не визуальные компоненты, но все же компоненты, которые можно кинуть на форму и забыть про их создание (ну например таймер, который по тикам будет вызывать события); такого нет. Их придется ручками в коде создавать. Но часто это всего пару строк. Вообще то невизуальные элемены есть - это всякие LinearLayout/RelativeLayout - менеджеры компоновок. Но они нужны, что бы размещать правильно элементы. Что почитать. Мне очень нравится сайт startandroid.ru - все на русском и достаточно понятно. Живой форум. Да, там на базе эклипса описывается, но это дело достаточно наживное - горячие кнопки другие да цвет иконок. Также, объязательно следует ходить на сайт d.android.com - там много справочного материала, есть примеры. Такой себе msdn.com, но для андроида и заметно лучше. Из книг рекомендую поискать из серии Pro Android. И желательно на английском. Потому как в русском часто так переведут, что читать не хочется - "намерение (то есть intent) активировало активность(то есть activity), на которой находиться представление(то есть view)".

Произведение чисел порядка 10^9 по модулю

Столкнулся с задачей вычисления произведения двух разных чисел a,b по модулю n(не обязательно простому): 10^9 < a,b <= n. Собственно, простой вариант: c=(a*b)%n; (еще раз замечу, что всегда a,b <= n) не подходит, ибо, при a,b > 4.29496729610^9, произведение ab >2^64. Подскажите, пожалуйста, как реализовать подобную операцию. Естественно, чем быстрее она будет выполняться, тем лучше. Заранее спасибо всем откликнувшимся!


Ответ

Попробуйте так: static int MulPeasant(int a, int b, int n) { a = a % n; // не нужно, если гарантированно a < n b = b % n; // не нужно, если гарантированно b < n int acc = 0; while (b > 0) { if ((b & 1) != 0) acc = (acc + a) % n; a = (a * 2) % n; b >>= 1; } return acc; } Выражение (acc + a * b) % n — инвариант цикла. Должно работать, если n < MAXINT/2 (Если я не ошибаюсь, это так называемый «русский крестьянский метод»). Для случая произвольного n подойдёт небольшая модификация: static int MulPeasant(int a, int b, int n) { a = a % n; // не нужно, если гарантированно a < n b = b % n; // не нужно, если гарантированно b < n int acc = 0; while (b > 0) { if ((b & 1) != 0) acc = SafeAdd(acc, a, n); a = SafeAdd(a, a, n); b >>= 1; } return acc; }
static int SafeAdd(int x, int y, int n) { if (x <= MAXINT - y) // проверка на переполнение сложения { int result = x + y; // x, y < n, x + y < 2n. (x + y) mod n равно или x + y, return (result >= n) ? (result - n) : result; // или x + y - n } else // в этом случае x + y > MAXINT >= n, но x + y < n + n = 2n { // значит (x + y) mod n = x + y - n return x - (n - y); // n - y > 0, вычитаем два положительных числа меньших n } } Можно ещё организовать поразрядное умножение: const int halfbits = sizeof(int) * 8 / 2; const int halfbase = (1 << halfbits); const int lomask = halfbase - 1;
static int MulDigits(int a, int b, int n) { int reducedbase = halfbase % n; int reducedbasesquare = (reducedbase * reducedbase) % n; int ah = a >> halfbits, al = a & lomask; int bh = b >> halfbits, bl = b & lomask;
int ll = (al * bl) % n, lh = (((ah * bl) % n) * reducedbase) % n, hl = (((al * bh) % n) * reducedbase) % n, hh = (((ah * bh) % n) * reducedbasesquare) % n; return SafeAdd( SafeAdd(ll, lh, n), SafeAdd(hl, hh, n), n); } (Если ваше n одно и то же всё время, константы reducedbase и reducedbasesquare можно предвычислять.) А вообще, почитайте «Искусство программирования», главы 4.3.2 и 4.3.3.

Защита приложения от fake gps

День добрый Меня интересует как Можно защититься от файк GPS на ios и android?


Ответ

Есть у Андроида такая возможность - выдавать подложные gps координаты (с помощью ddms). ТС намекает на приложение fake gps Бороться конечно же можно. Например, простым способом - человек обычно не может перемещаться очень быстро. Поэтому, запоминаем несколько последних координат и время и просто проверяем "скорость перемещения". Заодно, и телепортеров выловим. Второй способ заключается в том, что реальный сигнал "болтается", координаты постоянно изменяются. А вот подложные координаты скорее всего будут одни и те же. Третий способ, более изощеренный, заключается в том, что бы отслеживать побочные продукты изменения координат. К примеру, если координаты принадлежат Австралии (плюс-минус), а часовой пояс - Мексике... значит что то здесь не то. Конечно, большую точность здесь не нужно - можно просто сверять текущий меридиан и часовой пояс.

Двойные и одинарные кавычки

Не нашёл ответ в инете: почему в Java двойные кавычки используются только для строк , а одинарные только для символов? В чём профит?


Ответ

Профит в том, чтобы чётко различать литералы строк и символов. Если бы и строки, и символы можно было задавать с помощью одного и того же типа кавычек, то пришлось бв проверять, символ ли это, или строка. Иногда это вносило бы путаницу, а иногда точно определить это не представлялось бы возможным. Вот пример: public void doSth(String s) {}
public void doSth(char c) {}
doSth("a"); Если бы литералы символов можно было задавать с помощью двойных кавычек, тут возникла бы неопределённость: какой метод вызывать?

Проверка версии платформы .NET Framework

Необходимо чтобы при запуске программы (обязательно C#) происходила проверки наличия установленного .NET Framework 3.5 и выше. Пока есть два варианта решения проблемы: 1. Открывать программу .NET Framework 2.0 и если проходит проверка, то запускать на версии выше. 2. Писать в другой среде, которая может проверить наличие .NET Framework как такового и после чего уже запускать программу. Хотелось бы услышать ваши мнения. По первому пункту я не могу найти как поменять запускаемую платформу и как потом перейти на другую программу. По второму - на чём писать и, опять таки, как запустить программу написанную в C#.


Ответ

Не-не, так не катит. Программа должна не просто запускаться, а инсталлироваться на клиентской машине. Инсталляция включает установку всех необходимых redistributables, включая и нужную версию .NET. Это значит, что если ваш target — платформа младше Windows 7 (на которой .NET 3.5 ставится автоматически), вам нужно таскать с собой либо полный redistributable, либо web-инсталлятор. В любом случае, проверка и инсталляция необходимых библиотек — это проблема не программы, а её инсталлятора.

Размеры вложенных List в C#

Пока писал диплом (использую вложенные List < List<...>> c кучей данных), понадобилось проверить, сколько элементов влезает в List: оказалось, 33554432. В пересчёте (double - 8 байт) получается ровно 256 Мб памяти.
Далее я создал List < List< double>>: оказалось, что при максимальном количестве элементов внутреннего листа (всё те же 33554432) внешний лист успевает создать 3 внутренних - а потом происходит всё то же "System.OutOfMemoryException". То есть, в List< List> влезает уже 256 * 3 Мб.
А потом я создал всё тот же List< List< double>>, но при этом заполнял внутренний лист только на четверть от максимально возможного (33554432/4). Казалось бы, очевидно, что внешних листов должно получиться 12 (3 * 4=12) - но нет! Внешних листов создаётся 16. То есть, получается уже 256 * 4 Мб. А если заполнять внутренние количеством элементов (33554432/64), то внешних листов получается аж 265 (хотя 3 * 64=192) - то есть, 1060 Мб.
Уже ничего не понимая, я создал List< List< List< double>>>: при всё тех же максимально 33554432 элементах во внутреннем листе удаётся создать ровно два с половиной промежуточных листа -- после этого всё падает со всё тем же Exception'ом. То есть, получается 256 * 2,5 Мб.

Можете объяснить, как вообще выделяется память под List? И почему система не может занять пару гигабайт оперативки (у меня 4 Гб, х64), потом перейти в файл подкачки - и только потом откинуться со словами "System.OutOfMemoryException"? Зачем надо объявлять, что памяти больше нет, хотя её еще полно?
P.S. Если долго объяснять, посоветуйте что-нибудь почитать по этому поводу, если эти вещи где-то объяснены. Да, я чайник, знаю.
Всем спасибо!


Ответ

Число максимальных эелементов в списке будет зависеть от многих параметров. Но я просто попытаюсь объяснить, как выделяется память под эти элементы внутри класса List
List - это ничто иное как обертка над обычным массивом T[]. Этот массив инициализируется при создании списка, либо инициализируется повторно уже в процессе работы с созданным списком. Первый случай довольно прост - это начальная инициализация, которая происходит при вызове конструкторов. Немного кода из класса List
private const int _defaultCapacity = 4; private T[] _items; static T[] _emptyArray = new T[0];
// Constructs a List. The list is initially empty and has a capacity // of zero. Upon adding the first element to the list the capacity is // increased to 16, and then increased in multiples of two as required. public List() { _items = _emptyArray; }
// Constructs a List with a given initial capacity. The list is // initially empty, but will have room for the given number of elements // before any reallocations are required. public List(int capacity) { if (capacity < 0) ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.capacity, ExceptionResource.ArgumentOutOfRange_SmallCapacity); _items = new T[capacity]; }
Второй случай может произойти во время добавления в список новых элементов или при присвоении нового значение свойству Capacity. Рассмотрим случай с добавлением новых элементов. Из комментария над первым конструктором видно, что размер внутреннего массива увеличивается вдвое. Происходит это тогда, когда текущий массив уже полностью занят элементами. Соответствующий код:
// Gets and sets the capacity of this list. The capacity is the size of // the internal array used to hold items. When set, the internal // array of the list is reallocated to the given capacity. public int Capacity { get { return _items.Length; } set { if (value != _items.Length) { if (value < _size) { ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.value, ExceptionResource.ArgumentOutOfRange_SmallCapacity); }
if (value > 0) { T[] newItems = new T[value]; if (_size > 0) { Array.Copy(_items, 0, newItems, 0, _size); } _items = newItems; } else { _items = _emptyArray; } } } }
// Ensures that the capacity of this list is at least the given minimum // value. If the currect capacity of the list is less than min, the // capacity is increased to twice the current capacity or to min, // whichever is larger. private void EnsureCapacity(int min) { if (_items.Length < min) { int newCapacity = _items.Length == 0 ? _defaultCapacity : _items.Length * 2; if (newCapacity < min) newCapacity = min; Capacity = newCapacity; } }
Метод EnsureCapacity вызывается внутри всех методов списка, добавляющих в него новые элементы (Add(), Insert() и т.д.).
Какой из этого всего можно сделать вывод? Во время добавления элементов в список наступают моменты, когда памяти под элементы выделено в 3 раза больше, чем требуется на самом деле (момент, когда создался новый, в 2 раза больший массив и в него копируются данные из старого массива).
Исходники смотрел здесь: .NET List sources

Как сделать отступ первого слова в абзаце 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();
И даже после освобождения памяти в управляемой куче - рантайм может не сразу отдать освободившуюся память системе - а вдруг вы ее опять захотите выделить. Тем более что "выделенная память" - это не конкретные куски памяти на микросхеме, а просто зарезервированный в огромном виртуальном адресном пространстве кусочек.