Страницы

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

воскресенье, 31 марта 2019 г.

Как обойти текст при наведении на svg элемент?

Есть следующий код, при наведении на блок у svg должна меняться обводка, но если наводить на текст, который находится над самим svg элементом, то естественно обводка не появляется, пробовал делать вот так:
.accordion_name h2:hover svg { stroke: orange; }
Но это не привело ни к каким результатам, что можно сделать в данной ситуации?
И сразу еще вопрос, я разместил вот этот svg блок относительно родительского блока, мне нужно что бы текст всего был в районе данного треугольника:
Но если текст будет больше, то он выйдет за пределы:
Оно так и должно происходить с моим выполнением задачи, но есть ли способ сделать это правильно: Что бы если текст выходил за пределы треугольника, то треугольник делался больше в ширину, либо другие решения (Пробовал задавать максимальную ширину блоку с текстом, но не помогло).
* { margin: 0; padding: 0; } body { backgoround-color: #ddddd; } .wrapper { margin: 30px; max-width: 600px; } .accordion_item { margin-top: 4px; } .accordion_name { padding: 10px; cursor: pointer; position: relative; } .accordion_name h2 { position: relative; z-index: 3; display: inline-block; } .accordion_name h2:hover svg { stroke: orange; } svg { stroke: transparent; position: absolute; fill: #dddddd; height: 100%; width: 100%; top: 0; left: 0; right: 0; bottom: 0; z-index: 0; transition: 0.2s; } svg:hover { stroke: orange; } .accordion_content { height: 0; overflow: hidden; }

One accordiont line

Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sapiente molestias inventore cum. Eligendi ad quae, veritatis nostrum dolores doloremque culpa. Nam sequi omnis fugiat sed. Enim ipsum rerum iure quisquam.

One accordiont line

Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sapiente molestias inventore cum. Eligendi ad quae, veritatis nostrum dolores doloremque culpa. Nam sequi omnis fugiat sed. Enim ipsum rerum iure quisquam.

One accordiont line

Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sapiente molestias inventore cum. Eligendi ad quae, veritatis nostrum dolores doloremque culpa. Nam sequi omnis fugiat sed. Enim ipsum rerum iure quisquam.


Ответ

Сделайте табы при помощи css:
* { margin: 0; padding: 0; } div { border-bottom: 1px solid #ccc; margin: 20%; cursor: pointer; } span { position: relative; display: table; border: 1px solid #ccc; border-right: none; background: #eee; line-height: 28px; margin-bottom: -1px; padding: 0 30px; } span:before, span:after { content: ''; position: absolute; top: -1px; left: 100%; width: 0; height: 0; border-style: solid; border-width: 30px 0 0 50px; /* Изменяя цифру 50 можно менять угол наклона */ border-color: transparent transparent transparent #ccc; z-index: -1; } span:after { margin-left: -2px; border-color: transparent transparent transparent #eee; } div:hover { border-bottom-color: orange; } div:hover span { border-color: orange; } div:hover span:before { border-color: transparent transparent transparent orange; }

Пунтк 1

Не будет проблем с шириной. Ограничение для текста тоже можно приделать используя overflow: hidden и white-space: nowrap. Можете дорабатывать как захочется.

Объясните на пальцах совместимость библиотек в .Net Core, .Net Framework, .Net Standart

Изучаю .Net. Хочу написать некое серверное приложение (думаю что учеба лучше на реальном примере, нежели писать примитивные hello world). Выбор уходит в сторону .Net Core (микросервис). В проекте нужно будет использовать некоторые библиотеки (далее пример приведу). Из всего прочитанного понял следующее (если что не правильно понял поправьте):
Net Standart - вершина "айсберга" (своего рода типа интерфейс для остальных проектов) Net Core, Net Framework, Xamarin - ниже по иерархии (типа как классы реализующие интерфейс), но могут (и скорее всего так и делают) добавлять свои специфические фичи, характерные для каждого из них. Библиотеки (dll-ки) написанные как классы Net Standart могут использоваться в любом из наследников (Net Core, Net Framework, Xamarin) с полной совместимостью (а если быть точным то смотреть таблицу реализации https://docs.microsoft.com/en-us/dot...tation-support), но не наоборот (т.е. к примеру если библиотека написана как Net Framework dll (со специфическими для Net Framework фичами), то не факт что ее можно использовать в Net Core, потому как он не поддерживает специфические фичи из Net Framework) Каждая последующая версия Net Standart, Net Core, Net Framework, Xamarin включает в себя все фичи из предыдущей версии самой себя + некоторые новые. Т.е. к примеру код написанный под Net Standart 1.3 будет 100% работать в Net Standart 2.0, НО код написанный под Net Standart 2.0 не будет работать в Net Standart 1.3 и выше.
И теперь собственно на реальном примере. Буду использовать .Net Core 2.0 и смотреть совместимость естественно с Net Standart 2.0 и .NETFramework 4.6.1. Выбираю два пакета (библиотеки) на сайте nuget. Первый к примеру Selenium Webdriver https://www.nuget.org/packages/Selenium.WebDriver/ Во вкладке dependencies смотрю что ему надо (я понимаю что все это подтянется автоматом в visual studio, вручную не надо):
.NETFramework 3.5 No dependencies.
.NETFramework 4.0 No dependencies.
.NETFramework 4.5 No dependencies.
.NETStandard 2.0 Newtonsoft.Json (>= 10.0.3)
Как я понимаю ему не нужны никакие зависимости из .NETFramework, но нужна одна зависимость из .NETStandard 2.0. Но для Newtonsoft.Json (>= 10.0.3) тоже нужны зависимости https://www.nuget.org/packages/Newtonsoft.Json/
.NETFramework 2.0 No dependencies.
.NETFramework 3.5 No dependencies.
.NETFramework 4.0 No dependencies.
.NETFramework 4.5 No dependencies.
.NETStandard 1.0 Microsoft.CSharp (>= 4.3.0) NETStandard.Library (>= 1.6.1) System.ComponentModel.TypeConverter (>= 4.3.0) System.Runtime.Serialization.Primitives (>= 4.3.0)
.NETStandard 1.3 Microsoft.CSharp (>= 4.3.0) NETStandard.Library (>= 1.6.1) System.ComponentModel.TypeConverter (>= 4.3.0) System.Runtime.Serialization.Formatters (>= 4.3.0) System.Runtime.Serialization.Primitives (>= 4.3.0) System.Xml.XmlDocument (>= 4.3.0)
.NETStandard 2.0 No dependencies.
Вот тут я немного в ступоре. Если я буду использовать .Net Core 2.0, а он в свою очередь реализует .NETStandard 2.0, то как я понимаю для Newtonsoft.Json уже не нужны зависимости из .NETStandard 1.0 и .NETStandard 1.3, потому как все это уже есть в .NETStandard 2.0.
Т.е. будет ли пакет Selenium.WebDriver совместим с .Net Core в данном случае?
И еще один пример, есть пакет cefSharp: https://www.nuget.org/packages/CefSharp.OffScreen/65.0.0-pre01 Он тянет зависимость CefSharp.Common (= 65.0.0-pre01) Та еще две, но эти последние две не тянут ничего https://www.nuget.org/packages/cef.redist.x64/
This package has no dependencies.
В этом случае ни слова про .NETStandard и .NETFramework. Т.е. как я понимаю они вообще самодостаточные? Т.е. как они будут работать в .Net Core?
Длинный вопрос получился, но надеюсь вы поняли, в чем я хочу разобраться: Как выяснить совместимость пакета с определенной реализацией .NET?


Ответ

Вы немного неправильно читаете раздел "dependencies". Вы читаете его как "поддерживаемые фреймворки, и необходимые части фреймворков". На самом деле это "необходимые дополнительные пакеты, при использовании этого пакета под конкретный фреймворк".
Например:
Как я понимаю ему не нужны никакие зависимости из .NETFramework, но нужна одна зависимость из .NETStandard 2.0.
Это не "одна зависимость из .NETStandard 2.0". Это "другие nuget-пакеты, которые нужны для использования версии Selenium.WebDriver, собранной под .NETStandard 2.0.".
Если ваше приложение собирается под .NETFramework 4.5 - вы можете подключить пакет Selenium.WebDriver, и код из него будет работать сам по себе, без необходимости подключать дополнительные пакеты.
Если ваше приложение собирается под .NETStandard 2.0 (или любую его реализацию, под которую нет более специфической версии, например под .NET Core) - то при подключении Selenium.WebDriver вам придется подключить еще и Newtonsoft.Json.

Вывести тип, использованный в шаблонных параметрах аргумента

Можно ли сделать так, чтобы тип CharT выводился автоматически в C++17?
template void test(std::basic_string_view string) {
} test("hello world"); //ok test("hello world"); //compile error


Ответ

Можно добавить перегрузку:
template void test(CharT const ( & string )[x_array_size]) { return test(std::basic_string_view{string}); }

Что означает данное приведение типа

В статье в по адресу https://ru.cppreference.com/w/cpp/algorithm/transform наткнулся на такое приведение типа:
(int (*)(int))std::toupper
Как правильно прочитать данное приведение типа, и для чего оно нужно.


Ответ

int (*)(int) - указатель ((*)) на функцию от int ((int)), которая возвращает int
int (*)(int) ^ указатель ^ на функцию от int ^ возвращающую int

Как написать regex, не принимающий пустую строку?

Мне нужно, чтобы выражение могло читать: символ -, либо же слово состоящее из букв KQkq. Порядок важен, каждая буква может присутствовать ноль либо один раз. Слово должно состоять минимум из одной буквы.
Я написал такое выражение (-|K?Q?k?q?), но оно, к сожалению принимает и пустую строку. Есть идеи как его можно улучшить?
Строки которые должны приниматься
- KQkq K Q Qk
не должны приниматься
QK QQ // пустая строка qQ


Ответ

Вроде так:
/^(\-|KQ?k?q?|K?Qk?q?|K?Q?kq?|K?Q?k?q)$/g
Проверить можете тут

Как ограничить время работы сценария?

Как ограничить время работы сценария? Например я поставил чтобы через 5 минут программа закрылась, она работает и как только 5 минут пройдет программа закроется. Как это можно реализовать? В windows.


Ответ

Код сценария выполняется в функции run. Функция join ждет указанное количество времени, блокируя дальнейшее выполнение кода в главном потоке. После окончания указанного времени скрипт напечатает в консоль сообщение и закроется.
Параметр daemon=True указывает, что поток при завершении главного потока также завершится:
import threading
def run(): import time
i = 1
# Бесконечный цикл while True: print i i += 1
time.sleep(1)
if __name__ == '__main__': thread = threading.Thread(target=run) thread.daemon = True thread.start() thread.join(5 * 60)
print 'Quit!'

Что значит :: знак в java? [дубликат]

На данный вопрос уже ответили: Что значит оператор ::? 1 ответ Часто вижу :: при определении нового экземпляра, в стримах, иногда в лямда выражениях. Что он значит? Что значит List :: stream?
P.S. И как он называется?


Ответ

Оператор "ссылка на метод" (Method Reference). По сути - сокращенная запись для ссылки на метод из функционального интерфейса при использовании лямбды.
List::stream
является ссылкой на метод stream() из интерфейса List
List> list = Arrays.asList( Arrays.asList(1,2,3), Arrays.asList(4,5,6) ); list.steam() .flatMap(List::stream) .forEach(System.out::println);
приведенный отрывок кода означает: 1. Мы инициализируем поток, в котором будет список чисел (Stream>) 2. с помощью flatMap мы объединяем список чисел в поток чисел (Stream) 3. с помощью forEach и ссылки на метод println для каждого элемента из потока вызывается вывод на экран
Если владеете английским, хорошее объяснение с примерами приведено в этом ответе

Использование регистровых переменных сравнения в циклах Си

Все источники утверждают, что в циклах использование регистровых переменных очень хорошо для производительности. Для меня остаётся не до конца понятен вопрос как компилятор оптимизирует код в том месте, где происходит сравнение индексной переменной i с переменой length.
double array[100ULL];
size_t length = 20ULL;
for(register size_t i = 0ULL; i < length - 1ULL; i++){ array[i] = (double)i; }
В этом примере индексная переменная i - регистровая. Но сравнение внутри for происходит с переменной length, которая НЕ объявлена как регистровая. Помимо прочего перед сравнением происходит математическая операция.
Хочу для себя прояснить пару-тройку моментов:
Будет ли откомпиллированная программа при каждой итерации цикла производить эту математическую операцию (вычитание единицы из меременной length) раз за разом или эта операция будет произведена только один раз перед началом цикла? Догадается ли компилятор оптимизировать переменную length в регстровую? Какой код будет правильнее с точки зрения производительности и однозначности для компилятора: тот, что выше, или нижеприведённый? И есть ли вообще разница для современных компиляторов?
Второй вариант кода, в котором обе сравниваемые переменные регистровые и операция вычитания однозначно производится перед циклом:
double array[100ULL];
register const size_t length = 10ULL - 1ULL;
for(register size_t i = 0ULL; i < length; i++){ array[i] = (double)i; }
Трансляция кода в asm ситуацию не прояснила, поэтому задаю напрямую.


Ответ

Забудьте об этом слове register, оно давно не имеет никакого смысла.
Ответы на вопросы 1-2 зависят от компилятора; наверное, можно найти старый тупой компилятор, который не сумеет выполнить такие простые оптимизации.. А разумный - вообще может использовать какие-нибудь векторные команды процессора или что еще.
Так что ответ на вопрос 3 - нет, такой простой цикл будет оптимизирован любым более-менее разумным компилятором.
Кстати, VC++2017 просто развернул этот цикл в
mov eax, 1 xor ebx, ebx cvtsi2sd xmm1, rbx movsd QWORD PTR array$[rsp], xmm1 xorps xmm1, xmm1 cvtsi2sd xmm1, rax mov eax, 2 cvtsi2sd xmm2, rax mov eax, 3
.....
movsd QWORD PTR array$[rsp+128], xmm2 movsd QWORD PTR array$[rsp+136], xmm1 xorps xmm1, xmm1 cvtsi2sd xmm1, rax movsd QWORD PTR array$[rsp+144], xmm1
ругнувшись при этом на слово register как давно не поддерживаемое... Результат видите сами.
Очень старенький OpenWatcom пошел по циклическому пути -
L$1: cmp eax,13H jae L$2 mov dword ptr 320H[esp],eax xor ecx,ecx add edx,8 mov dword ptr 324H[esp],ecx inc eax fild qword ptr 320H[esp] fstp qword ptr -8[esp+edx] jmp L$1
но, как видите, вычислив 19 сразу, и работая только с регистрами...

C++ - передача массива в функцию

Есть несколько функций, которые принимают в качестве параметра массив целых чисел.
#include
using namespace std;
// нахождение наибольшего целого числа в массиве int FindLargest(int arr[]) { int largest = arr[0]; for (int i = 1; i < arr.size(); i++) { if ( arr[i] > largest) { largest = arr[i]; } }
return largest; }
// содержатся ли в массиве повторяющиеся элементы bool ContainsDuplicates(int arr[]) { for (int i = 0; i < arr.size(); i++) { for(int j = 0; j < arr.size(); j++) { if (i != j) { if (arr[i] == arr[j]) return true; } } }
return false; }
// содержатся ли в массиве повторяющиеся элементы (ver 2.0) bool ContainsDuplicates2(int arr[]) { for (int i = 0; i < (arr.size() - 1); i++) { for (int j = i + 1; j < arr.size(); j++) { if (arr[i] == arr[j]) return true; } }
return false; }
int main() {
}
Компилятор выводит следующие ошибки. Не могу понять в чем они заключаются.
C:\Users\saibo>gcc algorithms.cpp algorithms.cpp: In function 'int FindLargest(int*)': algorithms.cpp:21:26: error: request for member 'max_size' in 'arr', which is of non-class type 'int*' for (int i = 1; i < arr.size(); i++) ^~~~ algorithms.cpp: In function 'bool ContainsDuplicates(int*)': algorithms.cpp:34:26: error: request for member 'max_size' in 'arr', which is of non-class type 'int*' for (int i = 0; i < arr.size(); i++) ^~~~ algorithms.cpp:36:26: error: request for member 'max_size' in 'arr', which is of non-class type 'int*' for(int j = 0; j < arr.size(); j++) ^~~~ algorithms.cpp: In function 'bool ContainsDuplicates2(int*)': algorithms.cpp:50:27: error: request for member 'max_size' in 'arr', which is of non-class type 'int*' for (int i = 0; i < (arr.size() - 1); i++) ^~~~ algorithms.cpp:52:31: error: request for member 'max_size' in 'arr', which is of non-class type 'int*' for (int j = i + 1; j < arr.size(); j++) ^~~~
Может пишу что-то не так. Буду рад подсказке!


Ответ

arr в int FindLargest(int arr[]) - это не массив, а указатель. (При попытке создать параметр-массив, он автоматически превращается в указатель.)
Указатель не знает размер массива, на который указывает. Вам нужно передавать размер массива как отдельный параметр. (Скажем, int FindLargest(int arr[], int size).)
И вообще, может применяться только к классам. Ни массивы, ни указатели не являются классами, так что .size() никак не мог сработать.

Или, можно вообще отказаться от массивов и использовать std::vector. Вот на них .size() работает.

Индикатор процесса загрузки файла

Можно ли сделать индикатор процесса загрузки файла на сервер (отображать процент загруженного файла) без GET запросов в течение загрузки (очень популярный пример в интернете)?


Ответ

Взгляните на библиотеку gwtupload — она очень проста в использовать и прекрасно работает во всех браузерах и ОС, я проверял. Она использует Ajax запросы для расчета прогресса. Кстати SWFUpload не работает в Linux и Mac. Пока что это лучшее решение для GWT.

Javascript - переход по url с открытием новой вкладки

Добрый день. window.location.href = "my.url" Этот код открывает url на этой же страницы, а как сделать чтобы открывалась новая вкладка? Спасибо.


Ответ

используйте метод open window.open('http://example.com');

Сколько цифр в числе

Имеется натуральное число n. Как получить число цифр в этом числе?
int n = 33; int numberDigits = ???


Ответ

Не надо никаких циклов, можно использовать логарифм Math.ceil(Math.log10(x)) Для страховки можно использовать Math.ceil(Math.log10(x + 0.5)) Собственно, проверил и получил такие вот результаты (3 варианта вычисления: логарифм, деление, сдвиг): Логарифм работает за константное время и, согласен, не так уж быстро, как хотелось бы Сдвиг и деление работают линейно от длины числа, причем сдвиг примерно в пять раз быстрее деления. На десятизначных числах на long(это как раз порядка Integer.MAX_VALUE) логарифм так же быстр, как и сдвиг. Вот, теперь можно почти точно сказать, что логарифм следует использовать только для long, и то, лишь с уверенностью, что будут меряться действительно длинные числа, больше десяти знаков. Вот тестилка, можно и самим проверить, кто желает. На вход подается количество итераций. import sun.misc.Perf;
public class IntegerMeter{ static Perf perf = Perf.getPerf(); static long frequency = perf.highResFrequency();
static int countDigits_A(long number){ int result = 0; for(long match = 0L; number > match; ++result) match = (match << 3) + (match << 1) + 9L; return result; } static int countDigits_B(long number){ return (int) Math.ceil(Math.log10(number + 0.5)); } static int countDigits_C(long number){ int result = 0; while(number != 0L){ ++result; number /= 10; } return result; } static int countDigits_A(int number){ int result = 0; for(int match = 0; number > match; ++result) match = (match << 3) + (match << 1) + 9; return result; } static int countDigits_B(int number){ return (int) Math.ceil(Math.log10(number + 0.5)); } static int countDigits_C(int number){ int result = 0; while(number != 0){ ++result; number /= 10; } return result; } private static double test(Runnable runnable, int count){ long begin = perf.highResCounter(); while(count-- > 0) runnable.run(); long end = perf.highResCounter(); return (double)(end - begin) / frequency; } public static void main(String[] args){ final long candidateLong = 5464456734L; final int candidateInt = (int) candidateLong; int count = Integer.parseInt(args[0]); double testLong_A = test(new Runnable(){ public void run(){ countDigits_A(candidateLong); } }, count); double testLong_B = test(new Runnable(){ public void run(){ countDigits_B(candidateLong); } }, count); double testLong_C = test(new Runnable(){ public void run(){ countDigits_C(candidateLong); } }, count); double testInt_A = test(new Runnable(){ public void run(){ countDigits_A(candidateInt); } }, count); double testInt_B = test(new Runnable(){ public void run(){ countDigits_B(candidateInt); } }, count); double testInt_C = test(new Runnable(){ public void run(){ countDigits_C(candidateInt); } }, count); System.out.printf("%.5f\t%.5f\t%.5f
%.5f\t%.5f\t%.5f
", testLong_A, testLong_B, testLong_C, testInt_A, testInt_B, testInt_C); } }

Плюсы и минусы создания сервера на своем компьютере

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


Ответ

Плюсы: Ты сам себе хозяин. Много места для твоих проектов. Минусы: Постоянный шум компьютера. Расходы на электричество. Убиваешь свое железо. Очень затратно. Нужно постоянно мониторить, обслуживать сервер. Постоянный онлайн, нужны средства на оплату трафика (если он не безлимитный) Я бы не советовал заниматься данным мазохизмом, не пожалей пару баксов и возьми себе нормальный хостинг, меньше геморроя будет. Я бы посоветовал jino.ru. В любом случае это обойдется тебе дешевле, чем свой сервер. И я сомневаюсь что ты будешь использовать всю мощь своего сервера.

Подчеркнуть текст Android

Вот такой код, выводит обычный текст, как мне его подчеркнуть линией внизу? или может быть можно выделить в стринг файле?


Ответ

String htmlTaggedString = "Подчеркнутый текст"; Spanned textSpan = android.text.Html.fromHtml(htmlTaggedString); tvTitle.setText(textSpan);

Возможен ли вызов исключения?

Предположим, где-нибудь, в каком-нибудь месте программы (не в начале), у нас есть следующий код: int a = <некое значение>; Но до этого места, скажем, в нашей программе уже было несколько сот других переменных и программа много раз обращалась к динамической памяти. Возможна ли такая ситуация, что в системе закончится память, и вышеприведенный код приведен к выработке необрабатываемого исключения и аварийному завершению программы? Либо же до этого new[] уже успеет вызвать std::bad_alloc и такая ситуация в принципе невозможна? Другими словами, есть ли гарантия отсутствия исключений в данном случае? Собственно говоря, инструкция int a = some_val просто транслируется в ассемблерную команду наподобии mov eax, ds[index]; т.е. по идее исключение быть и не должно, вопрос только в том, резервируется ли сегмент данных полностью до начала работы программы для всех переменных либо же приобретение ресурсов происходит динамически, в ходе работы программы, как в случае с динамической памятью. Получается, чем больше у нас имен переменных, тем больше индексов в программе, по которым происходит обращение, и тем больше должен быть объем резервируемого сегмента данных. Правда все равно остается вопрос, как запрашивается сегмент данных - либо он представляет некую область в коде программы (секцию данных), либо же размер для сегмента данных и его размер будут получены из системной кучи, при запуске программы.


Ответ

Если я правильно понял вопрос, то есть код: func() { ... int a = 22; ... } В таком случае память для переменной a будет размещаться в стеке и "выделяться" при входе в процедуру func. Я пишу "память выделяется" в кавычках, т.к. при входе в func регистр указателя стека просто будет сдвинут (реально уменьшен) на суммарный объем локальных переменных. Т.о. при обращении к a возможно прерывание по переполнению стека. (Еще вероятнее оно произойдет при вызове первой же функции, если стек в func переполнится). Размер выделяемого сегмента данных под стек (он выделяется при порождении процесса) и возможность управления этим размером зависит от ОС и ее настроек. По умолчанию в Windows это 2MB, в Linux около 10MB. Будет ли средой C++ в таком случае вброшено исключение, откровенно говоря, не знаю. Если интересно, можете поиграться с программкой #include #include #include #include #include
void sigh (int s) { write(1,"catch
",6); exit(1); }
main (int ac, char *av[]) { int sz = av[1]? atoi(av[1]): -1;
while (sz < 1) { printf ("Enter size
"); scanf("%d",&sz); }
struct sigaction sa; memset (&sa,0,sizeof(sa)); sa.sa_handler = sigh; #ifdef ALTST sa.sa_flags = SA_ONSTACK; stack_t ss; ss.ss_sp = malloc(ss.ss_size=1000000); ss.ss_flags = 0; sigaltstack(&ss,NULL); #endif sigaction(SIGSEGV,&sa,NULL);
printf ("Try %d (%x) size
",sz,sz); char a[sz];
a[0] = 'a'; printf ("first
");
a[sz-1] = 'z'; printf ("last
");
exit (0); }
avp@avp-ubu1:~/hashcode$ g++ stacksz.c avp@avp-ubu1:~/hashcode$ ./a.out 10400000 Try 10400000 (9eb100) size first last avp@avp-ubu1:~/hashcode$ ./a.out 10500000 Try 10500000 (a037a0) size Ошибка сегментирования avp@avp-ubu1:~/hashcode$ g++ -DALTST stacksz.c avp@avp-ubu1:~/hashcode$ ./a.out 10500000 Try 10500000 (a037a0) size catch avp@avp-ubu1:~/hashcode$ Идея, надеюсь, понятна. Добавьте ловлю исключений и т.п. крестовые штучки. UPDATE Если кому-то интересно, то можно добавить код struct rlimit lim; int rc = getrlimit(RLIMIT_STACK,&lim); printf ("get = %d stsize: %ld (soft) %ld (hard)
", rc, (long)lim.rlim_cur,(long)lim.rlim_max);
int m = av[2]? atoi(av[2]): 1000000; lim.rlim_cur += m; rc = setrlimit(RLIMIT_STACK,&lim); if (rc < 0) perror("setrlimit"); rc = getrlimit(RLIMIT_STACK,&lim); printf ("get2 = %d stsize: %ld (soft) %ld (hard)
", rc, (long)lim.rlim_cur,(long)lim.rlim_max); и посмотреть, как это работает.

Подключить DLL

Пишу десктопное приложение на C#, которая по задумке должна подключать dll, уже будучи скомпилированой и работающей. Как это возможно реализовать? И возможно ли вообще :)


Ответ

Варианты предлагаю такие: Использовать MEF (как в ответе выше) Использовать MAF (как альтернатива, она может выгружать DLL налету) Использовать Prism Создать общую библиотеку с хорошо продуманным интерфейсом и классом (н-р InitPlugin); обязать ваши библиотеки иметь эту библиотеку и обращаться к нужным интерфейсам посредством Reflection Для неуправляемого кода можно использовать очень интересную возможность: дело в том, что когда функция C# с атрибутом ImportDll обращается к библиотеке, она ищет ее в определенных местах (в системной папке и нек других), но если не найдет, то обязательно также посмотрит в CurrentDirectory. Устанавливая Environment.CurrentDirectory на нужные каталоги, можно добиться системы плагинов на неуправляемом уровне. Последний который приходит в голову, это компилить какие-нибудь алгоритмы прямо на лету через CSharp Compiler

что означает знак -> в ООП?

Первый раз сталкиваюсь с ООП, везде вижу -> , что это за знак присваивания или добавления ? Гуглил, не нашел ответа. И еще: $this - означет так как и jQuеry?


Ответ

Оператор малая стрелка -> предназначен в PHP для работы с объектами при объектно-ориентированном программировании - то есть если у вас есть класс someclass и создан объект $obj=new someclass то обращаться к его полям и методам можно как раз с помощью оператора $obj->field
Если вдаваться в саму работу данного оператора то он может как реально вывызвать методы и считывать/изменять свойства объекта - так и работать за счет функции-перенаправления которая будет выполняться определенные дейтсвия с данными справа от оператора ->
Если приводить аналогию с другими языками программирования, то этот оператор похож на оператор "ТОЧКУ" в языках C/C++/C#/Java/JS и некоторых других - а его синтаксис и семантика взяты из языка Perl

1С альтернатива [закрыт]

Доброго времени суток! Подскажите, может кто сталкивался, слышал. Существуют ли в природе, в идеях, забытых разработках, альтернативы платформе 1С. В первую очередь с точки зрения программиста - то есть мощный конструктор хранилищ данных и форм, плюс отчеты. Интересна любая информация, то есть скажем, старое опен-сорс, которое возможно довести до ума пойдет не менее чем промышленное и тиражное. САП - не предлагать))


Ответ

Вспомнился "Дебет Плюс" на базе Eclipse RCP и JS-скриптов.

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

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


Ответ

Вообще эти термины друг другу не противоречат. Давайте для начала разберемся что есть что. Структурное программирование - это методология, которая позволяет писать программу как набор блоков. Такими блоками являются ветвления, циклы, последовательность операторов, процедуры. На самом деле все имели с этим дело, когда рисовали блок-схему программы. Идея в том, что нам не нужны такие низкоуровневые вещи как инструкция перехода (goto). А понятие процедурного программирования может или быть синонимично императивному программированию (т.е. мы задаем программу как последовательность инструкций), или подразумевать программирование с использованием подпрограмм, т.е. по сути вариант структурного программирования. Так что получается, что нужно смотреть что конкретно подразумевалось в конкретном контексте. Сейчас же, наверное, когда говорят процедурное, то имеют в виду, что речь не об ООП.

Заголовочный файл conio.h

Что за заголовочный файл такой , и для чего он нужен? В K&R такой не описывают. Заранее спасибо.


Ответ

содержит описание нестандартной библиотеки для работы с консолью (clrscr, kbhit и тому подобное). Поставляется, ЕМНИП, со старыми Борландовскими компиляторами. Не пользуйтесь ей, если хотите, чтобы ваш код компилировался на более современных компиляторах. Заметьте, что непосредственная работа с консолью противоречит философии юниксовских утилит, которые должны одинаково хорошо работать как с входными данными, полученными от пользователя, так и с выводом других программ. Поэтому правильная юниксовская утилита должна читать ввод из stdin и выводить его в stdout/stderr, позволяя эффективно использовать перенаправление потоков ввода-вывода.

Освобождение памяти из под динамического массива (с++)

Если динамический массив создается (через new) внутри какого-то блока кода, например, внутри if, то освобождение памяти через delete нужно производить внутри этого же блока? if (count != 0) { int *masPos = new int[count]; int *masNeg = new int[n - count];
//...
delete [] masPos; delete [] masNeg; }


Ответ

Это не имеет принципиального значения. int *masPos = NULL; if (something) { masPos = new int[10]; }
...
if (masPos) { delete [] massPos; } Как правильно заметили выше, нужен только указатель на массив

Проблема с сессией: Cannot send session cache limiter - headers already sent

Изначально когда проектировал сайт, работал с сессиями только на одной странице, где объявлял session_start(); Потом понадобилось распространить эту функцию на весь сайт. Для этого я разместил session_start() в файл config.php, который в свою очередь подключается к каждому файлу php сайта. Вот тут-то и возникли проблемы...
Структура сайта такова (заголовочные файлы):
config.php header.php left.php footer.php
Эти файлы подключаются к каждой странице сайта. А страницы разбиты по категориям в которых нет ошибки сессии:
index.php shopingcart.php contact.php
И файлы в которых ошибка возникает:
faqs.php productdetail.php checkout.php
Как можно побороть ошибку данную?
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at S:\home\localhost\www\web_shop\faqs.php:1) in S:\home\localhost\www\web_shop\config.php on line 2


Ответ

Благодаря помощи, товарища ToRcH565 удалось исправить эту ошибку. Дело было в том, что я писал

Как запретить отправку формы по нажатии кнопки ENTER?

В форме кнопка с онкликом. Нужно запретить отправку формы по нажатии кнопки ENTER. Можно ли это как-то сделать? Или чтобы Enter работал также, как нажатие на кнопку.


Ответ

Ну, например, так: $(document).ready(function() { $(form).keydown(function(event){ if(event.keyCode == 13) { event.preventDefault(); return false; } }); });

Когда обычно нужно использовать делегаты?

Изучаю C#, прошу разъяснить про делегаты - которые предназначены для ситуаций, когда требуется передать методы другим методам в качестве параметров! Но кода это надо? И зачем? Большое спасибо!


Ответ

Реализация обработчиков событий и событийной модели как таковой. Скажем, кликаете на кнопку, и при клике что-то происходит. Чтобы сообщить программе, какое именно "что-то" должно произойти, применяют делегаты LINQ и любые другие элементы функционального программирования в C# - там все основано на делегатах и их "сокращенных" вариантах - лямбда-функциях Они также весьма полезны при реализации многопоточных и асинхронных программ Вообще для реализации коллбэков. Например, функций сортировки. Чтобы сообщить программе, как именно нужно сортировать пользовательские типы данных, в метод сортировки необходимо передать другой метод, позволяющий сравнивать экземпляры сортируемого типа А вообще очень любопытно, по какому источнику вы изучаете язык, что в нем этого не написано?

Как распаковать 7-zip архив?

Как мне распаковать 7-zip архив в указанную папку с заменой файлов, желательно не прибегая к сторонним программам (используя библиотеки)?


Ответ

Я бы все-таки рассмотрел вариант с вызовом внешней программы. Дело в том что это понятно! Любая внешняя программа легко заменяется на другую и для этого достаточно всего двух параметров в конфигурационном файле $7zAppPath, $7zAppParams. Программисту, кроме Вас, будет легче будет понять работу функций callExternalArchivator() ибо там наверняка 5 строк, ну 8 на обработку ошибок и записи в лог-файл. Если же библиотеку, то надо показать какие исходные файлы нужны, а если обновилась библиотека, то что из нее нужно просмотреть внимательно, чтобы новые изменения в либе не сломали текущее. Другими словами, внешняя прога всегда выигрывает перед либой. Не надо усложнять там где этого можно избежать!

Как создать загрузочный диск Ubuntu

Здравствуйте!Насколько сложно или даже насколько возможно создать образ загрузочного диска Ubuntu?Ситуация следующая, мы обычно берем флешку, с помощью Universal-USB-Installer-1.8.6.8 устанавливаем на нее образ Ubuntu, выделяя при этом 4Гб под изменения. Затем ставим все необходимые пакеты и утилиты, после чего используем в качестве загрузочного диска Live с которым собственно и работаем, перенося с одной системы на другую.Но проблемы начинаются на некотором оборудовании, например на ноутбуках с картами ATI. И в силу того, что, видимо, в конфигурации меняется какая-то мелочь (а, может, и не мелочь), флешка перестает запускаться на всех других машинах тоже, после чего образ приходится снова заливать на эту флешку. Так как флешки более не оснащаются переключателем read-only выход найти не можем.Идеальным решением было бы создать из стандартного образа *.iso от Ubuntu наш образ, с нашими пакетами и программами, которые бы загружались как LiveCD (DVD) вместе с загрузкой самой Ubuntu. После чего мы бы записали этот образ на диск и пользовались им, не боясь испортить нашу настроенную систему. Подскажите пожалуйста, как реализовать и вообще возможно ли реализовать данную систему? Посоветуйте, как быть с текущим решением?С Уважением, спасибо.


Ответ

А почему бы не использовать программы аналогичные Ghost - clonezilla. И скопировать образы дисков системы, потом загрузится с загрузочного сд этой программы и залить систему на принимающую машину? это если цель - перенести настроенную систему на другой комп или создать backup-диск...А что мешает использовать UbuntuLiveCD и с него инсталлить систему, либо загружаться?и уж если машины в вашей сети, то создать образ сетевой установки...Форум русскоязычного сообщества Ubuntu, результат поиска ГуглВообще погуглите эту тему - она широко освещена (и не только для Вашего дистра), так что не все так плохо...

Определение типа файла и перенос его в папку в зависимости от типа

В папке имеется несколько файлов. Требуется определить тип каждого файла и в зависимости от этого перенести его в одну из папок: EXE. CPP. H. TXT. Вроде бы формулировка простая, но никак не могу сделать, мыслей нет, помогите, если не трудно. Заранее спасибо.


Ответ

Как мне кажется, нужно копать в сторону функции findfirst() и проверки строки из имени по шаблону с последующей сортировкой и презаписи в другой каталог. Ну и еще, как вариант, написать скрипт на shell и запускать его из приложения. UPD: вот немного кода в котором происходит поиск надо только немного изменить (произвести копирование) #include #include
using namespace std;
int main(){ WIN32_FIND_DATA FindFileData; HANDLE hFind = INVALID_HANDLE_VALUE;
// Find the first file in the directory. hFind = FindFirstFile("C:\\*.bin", &FindFileData);
if (hFind == INVALID_HANDLE_VALUE) { printf ("Invalid file handle. Error is %u.
", GetLastError()); } else { printf ("First file name is %s.
", FindFileData.cFileName);
// List all the other files in the directory. while (FindNextFile(hFind, &FindFileData) != 0){ printf ("Next file name is %s.
", FindFileData.cFileName); }
FindClose(hFind); }
return 0; }

Как узнать, есть ли в строке большие буквы?

Как это можно реализовать? Единственная идея, которая сейчас есть, - разбить строку на символы и далее каждый символ проверять на буква ли это, если да, то потом проверять не большая ли. Мне кажется, что это будет как-то не совсем корректно и должны быть более красивые решения, что ли.


Ответ

Регулярные выражения вас спасут. Если вы хотите по букве проверять, нужно использовать к строке с буквой метод str.matches("A-Z"), что даст логическое true, если символ есть большая буква. Немного пошаманив с регулярным выражением, можно написать и для проверки целой строки, но тут надо учитывать все возможные варианты. Проще - побуквенно. Есть ещё вариант - создать вторую строку через: String str2 = str1.toLowerCase(); и потом сравнить строки. Если будет несовпадение - где-то есть большие буквы, но этот вариант подходит, только если нужен сам факт наличия больших букв. Есть оракловая документация по регулярным выражениям, правда, на английском.

List взять уникальные значение

/кошка/1 /кошка/2 /собака/1 /собака/2 /тигр/1
Как сделать чтобы в результирующем списке были только те элементы, у которых значения между /*/ уникальные. результат
/кошка/1 /собака/1 /тигр/1
Есть вариант заюзать Distinct, но он работает по полному соответсвию.
List list = new List(); list.Add(1); list.Add(2); list.Add(3); list.Add(3); list.Add(4); list.Add(4); list.Add(4); List distinct = list.Distinct().ToList();
А как сделать чтобы он брал значение между /*/ и выбрал среди них уникальные. Мне кажется надо использовать lambda выражения.


Ответ

в Distinct можно передать свой "сравниватель на одинаковость" - IEqualityComparer
class PartialComparer : IEqualityComparer { public string GetComparablePart(string s) { return s.Split('/')[1]; } public bool Equals(string x, string y) { return GetComparablePart(x).Equals(GetComparablePart(y)); }
public int GetHashCode(string obj) { return GetComparablePart(obj).GetHashCode(); } }
class Program { static void Main(string[] args) { List list = new List { "/кошка/1", "/кошка/2", "/собака/1", "/собака/2", "/тигр/1" };
// "/кошка/1" // "/собака/1" // "/тигр/1" var result = list.Distinct(new PartialComparer()).ToList(); } }

Некорректная фильтрация строки

Имеется код:
#include #include using namespace std;
int main() { string str = "Hallow, world"; int i = 0; for (i; i < str.length(); i++) { if (str[i] == ',') { str.erase(i); }; }; cout << str; return 0; }
Цикл завершается тогда, когда условие впервые принимает значение "истина", хотя цикл должен продолжаться до конечного символа строки. Почему так происходит?


Ответ

Правильно удалять так:
for (; i < str.length();) { if (str[i] == ',') str.erase(i, 1); else i++; };
Таким образом вы удаляете каждый раз по одному символу. Кроме того, при удалении символы сдвигаются, так что вам нужно перепроверить текущий индекс. Поэтому i++ ушло в else. (Кроме того, в таком виде for можно заменить на while.)
Более идиоматический метод удаления из строки в C++ — использование и идиомы erase/remove:
str.erase(std::remove(str.begin(), str.end(), ','), str.end());
или, если хочется более сложного условия,
str.erase(std::remove_if(str.begin(), str.end(), [](char x){ return x == ','; }), str.end());
(Спасибо @Vlad from Moscow за уточнение!)

ООП - Есть ли смысл писать класс, в котором нет свойств, но есть метод?

Есть ли смысл писать класс, в котором нет свойств, но есть метод? Или же в этом случае достаточно воспользоваться пользовательской функцией?
class Text { public function MultiColor(){ static $a = null; $a ++; return $a; } } echo Text::MultiColor();


Ответ

Давайте разберемся.
Во-первых, сама по себе парадигма ООП не предполагает использование других парадигм. Это не запрет на их совместное использование, однако парадигма сама по себе самодостаточна, хоть и реализуется зачастую не в чистом виде (функции в PHP и Python, примитивы в Java и C#), а частичное замещение прадигмы приведет к уменьшению консистентности (единообразности) кода.
Парадигма ООП включает в объект две составляющие: поведение (методы) и состояние (свойства). В данном случае обсуждается поведение без состояния (что, на самом деле, неправда - $a относится к состоянию, т.к. сохраняется между вызовами), и это действительно немного смущающий момент, однако не позвольте ему обмануть себя. ООП позволяет включить в объекты и поведение, и состояние, но не запрещает исключить что-то из этого из объекта; другими словами, класс, объявляющий функционал без состояния, равно как и объекты, просто переносящие данные (Business Object, Data Transfer Object) - это абсолютно валидные единицы программы.
И, конечно, необходимо сказать пару слов про статику. Сама парадигма не подразумевает существование классов и статических методов. Однако, методам, которые работают без состояния, самое место в статичных - во-первых, им не нужен лишний экземпляр объекта для работы, во-вторых, таким образом подчеркивается отвязанность метода от состояния. Однако будьте осторожны: объявление статичных переменных обычно говорит о том, что пора создавать обычный объект с состоянием; единственный действительно рациональный пример, который я могу привести для сохранения чего-либо в статичной переменной - это логгер в Java. Сам я, правда, ярый противник статики в принципе, но это совсем отдельная тема для разговора.
И, наконец: хорошая парадигма не запрещает пользователю ничего. Она лишь описывает концепты, в рамках которых пользователю должно быть удобно выстроить проект.
Резюмируя: да, использовать методы без состояния - это абсолютно легально, однако опасайтесь переноса в статику того, что должно лежать в обычных методах.

Поиск сборки (алгоритм)

Подскажите оптимальный способ поиска сборки. Например в папке лежит 1k сборок (*.dll) и нужно выбрать например две специальные сборки. Как нужно пометить (атрибуты? вроде медленно будет искать рефлекшеном) специфические сборки, для быстрого поиска в другой программе?
Может есть какой то способ дописать что то в мета-таблцицы сборки что бы очень быстро можно было прочитать и понят эта та сборка, что нужно, или нет?


Ответ

Вы можете воспользоваться библиотекой Mono.Cecil (доступна так же через NuGet) и использовать ее для анализа сборок
Для теста я взял почти все сборки из GAC, скопировал их, чтобы получилось ~1 тысяча сборок, добавил туда несколько экземпляров моих библиотек с искомым атрибутом и выполнил такой код:
var assemblys = Directory.GetFiles("C:\\dlls\\") .Select(AssemblyDefinition.ReadAssembly) .Where(assembly => assembly.CustomAttributes.Any(ca=> ca.AttributeType.Name == "MyCustomAttribute")) .ToList();
Результат он выдал через ~600 миллисекунд (мерил с помощью Stopwatch). Мне кажется, что этого может быть для Вас достаточно.

Как правильно переносить(копировать) элемент одного std::vector в другой

Интересует как быстрее всего копировать или переносить элементы из одного std::vector в другой, раньше для возможности быстрого удаления элементов из контейнера использовал std::list
for( auto it=l.begin(); it!=l.end();) { if ( условие ) it=l.erase(it); else ++it; }
но как оказалось list не слишком быстрый даже в этом, теперь использую нечто вроде
for( auto it=v.begin(); it!=v.end(); ++it) { if ( !условие ) tmpv.emplace_back(*it); } v.swap(tmpv); tmpv.clear();
сначало элементы которые не попали под условие переношу в другой vector, а потом меняю контейнеры местами, но мне кажется что
tmpv.emplace_back(*it);
это не совсем правильно и возможно есть другие функции в std которые позволят переносить(копировать) элемент быстрее чем реализовано у меня


Ответ

А самый простой вариант (оставляет элементы соответствующие cond())
int n = 0; for (int i = 0; i < v.size(); i++) if (condition(v[i])) v[n++] = v[i]; v.resize(n);
не пробовали?

Если порядок обработки и относительное расположение элементов в векторе после нее не важны, то процесс можно ускорить раза в полтора (если затраты на вычисление условия, копирование элемента и обработку удаляемого одинаковы).
Вот примерчик:
#include #include #include #include
#include #include #include
using namespace std;
void act (string s) { cout << s << '
'; }
int main (int ac, char *av[]) { vector v; string s;
while (cin >> s) v.push_back(s); cout << "size: " << v.size() << " capacity: " << v.capacity() << '
'; int n = 0, cntcmp = 0, cntcpy = 0, cntact = 0; if (av[1]) { /* size: 108 capacity: 256 cmp: 120 cpy: 64 act: 140 total: 324 */ n = v.size();
int i = 0, j = v.size() - 1;
while (j >= i) { while (i <= j && isalpha(v[i][0])) { cntcmp++; i++; } if (i > j) break; act(v[i]); cntact++; n--; while (j > i && !isalpha(v[j][0])) { cntcmp++; cntact++; act(v[j--]); n--; } if (j == i) break; v[i++] = v[j--]; cntcpy++; } } else { /* size: 108 capacity: 256 cmp: 248 cpy: 108 act: 140 total: 496 */ for (int i = 0; i < v.size(); i++) { cntcmp++; if (isalpha(v[i][0])) { cntcpy++; v[n++] = v[i]; } else { cntact++; act(v[i]); } } }
v.resize(n);
for (int i = 0; i < n; i++) cout << v[i] << '
';
cerr << "size: " << v.size() << " capacity: " << v.capacity() << '
'; cerr << "cmp: " << cntcmp << " cpy: " << cntcpy << " act: " << cntact << " total: " << cntcmp + cntact + cntcpy << '
'; }
Вот результат
avp@avp-ubu1:hashcode$ g++ c.cpp avp@avp-ubu1:hashcode$ ./a.out < c.cpp | sort >2.txt size: 108 capacity: 256 cmp: 248 cpy: 108 act: 140 total: 496 avp@avp-ubu1:hashcode$ ./a.out 1 < c.cpp | sort >1.txt size: 108 capacity: 256 cmp: 120 cpy: 64 act: 140 total: 324 avp@avp-ubu1:hashcode$ cmp 1.txt 2.txt avp@avp-ubu1:hashcode$
Ну, все эти sort и cmp для того, чтобы убедиться, что оба варианта дают тот же результат.

cURL не работает

Пытаюсь сделать парсер, но не хочет работать, пишет
Object Moved This object may be found here.
Гуглил, но решения не удалось найти. Что за метод защиты стоит, что запрещает парсить данные с данного сайта ?
$url = 'http://elibrary.ru/titles.asp';
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.6 (KHTML, like Gecko) Chrome/16.0.897.0 Safari/535.6'); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); curl_setopt($ch, CURLOPT_REFERER, $url); $content = curl_exec($ch); curl_close($ch); echo $content;


Ответ

Суть проблемы в следующем: целевой сайт выставляет cookie для идентификации пользователя и отдает код 302 Moved Temporarily + заголовок Location. Это что-то вроде защиты от простеньких парсеров, не способных работать с cookie.
Если говорить о вашем коде, то опция CURLOPT_FOLLOWLOCATION выставленная в false (или 0), запрещает переходы по ссылкам из Location. Поэтому вы видите в ответе:
Object moved
Выставление CURLOPT_FOLLOWLOCATION в true (или 1) не помогает в вашем случае потому, что curl по умолчанию все еще не работает с cookie. А чтобы работал, достаточно указать:
curl_setopt($ch, CURLOPT_COOKIEFILE, '');
Пустая строка в качестве значения, указывает curl, что cookie должны быть использованы, однако без сохранения в файловую систему (см. http://php.net/manual/ru/function.curl-setopt.php).
Таким образом, работающий код может выглядеть так:
$url = 'http://elibrary.ru/titles.asp';
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.6 (KHTML, like Gecko) Chrome/16.0.897.0 Safari/535.6');. curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_REFERER, $url); curl_setopt($ch, CURLOPT_COOKIEFILE, ''); $content = curl_exec($ch); curl_close($ch);
echo($content);

Как изменять выведенный текст в консоли посредством cout?

Есть простая программа производящая долгие вычисления. Хотелось бы на каждой итерации цикла выводить ее номер (ну или текщий процент выполнения) в консоль, при этом желательно изменяя только последнюю строку. Например вывод
Start Function result 45123 Testing ... Comleted 45%
Так вот по ходу надо бы изменять только строку Comleted 45% а остальное не трогать. Вывод осуществляю через cout. Как такое сделать?


Ответ

Вот пример кода. sleep исключительно для того, что бы создать задержку.
#include #include // для sleep int main() { for (int i = 0; i < 100; i+=10) { std::cout << "
Completed " << i << "% " << std::flush; sleep(1); }
std::cout << "
Done " << std::endl; return 0; }
std::flush нужен, так как стандартные потоки любят буферизировать ввод-вывод (закомментируйте и посмотрите на результат).
переводит вывод в начало строки, не переходя на новую строку. Пара пробелов после процента нужна, так как строка не очищается и нужно затирать пробелами "хвост".

суббота, 30 марта 2019 г.

Можно ли средствами Java убить дочерние процессы процесса, созданного с помощью ProcessBuilder?

Если создать процесс
ProcessBuilder builder = new ProcessBuilder("command"); final Process process = builder.start();
то его можно будет убить с помощью: process.destroy();
Но что, если этот command наплодит кучу других процессов? process.destroy(); уже будет не в силах убить их. И они останутся в памяти.
При этом, если из командной строки сделать Ctrl+C, то дочерние процессы тоже завершатся.
В сети много вопросов на эту тему (большинство из них старые) и почти все ответы говорят о том, что это невозможно сделать средствами JVM - нужно обращаться к ОС. Решил задать вопрос, в надежде на то, что это всё же стало возможным с появлением Java 8. Хочется получить решение, не зависимое от ОС.
Возможно ли на сегодняшний день средствами Java убить дочерние процессы процесса, созданного с помощью ProcessBuilder, не манипулируя напрямую с командами ОС? Если возможно, то как это реализовать? Если нет, то ожидается ли такая возможность в Java 9?
UPDATE
Хочу ещё раз выделить то, что я не ищу решения, зависящие от ОС. По этой ссылке можно прочитать о том, как искать PID процесса в Unix и Windows. Потом можно будет обратиться к терминалу с соответствующей командой для "убийства" процесса.
Это не является темой данного вопроса.


Ответ

В версиях Java до 8й включительно инструментарий для работы с процессами был довольно скудным.
Но если ознакомиться, с JEP 102: Process API Updates (который реализуется в рамках Java 9), то мы увидим, что Brian Goetz говорит нам о следующих вещах:
Возможность получить pid процесса JVM и pid-ы процессов, запущенных средствами API. Возможность получить список запущенных в системе процессов, включая их pid, состояние, наименование и, возможно, потребление ресурсов. Возможность взаимодействовать с деревьями процессов, а именно прекращать работу целого дерева. Возможность взаимодействовать с сотнями дочерних процессов, возможно, мультиплексируя потоки вывода и ошибок, чтобы избежать создания отдельной нити (thread) на каждый процесс.
Все эти радости уже можно потрогать в 9ке: см. интерфейс ProcessHandle
long getPid() static Stream allProcesses() и ProcessHandle.Info info() Stream descendants()

Как преобразовать double? в double на C#

Есть поле класса типа double?, то есть оно может и не содержать значения.
А я в своем классе использую просто double
Как сделать преобразование?
И как быть с DateTime? -> DateTime


Ответ

Если вы уверены, что значение там есть, вы можете получить его так:
double? nd = ...; double v = nd.Value;
Если не уверены, вам придётся сначала проверить:
double? nd = ...; if (nd == null) { // значения нет, обрабатываем этот случай } else { // значение есть double d = nd.Value; // работаем с ним }
Для случая, когда для отсутствующего значения подойдёт, например, 0.0, можно написать просто так:
double d = nd ?? 0.0;
Но как именно правильно реагировать на отсутствующее значение, решать только вам.

Чем канонические геттеры и сеттеры лучше открытого поля?

Не понимаю, в чем плюс использования канонических (только возвращающих и устанавливающих занчение) геттеров и сеттеров перед открытым полем? Чем вот такой код:
private MyJDesktopPane desktop;
public MyJDesktopPane getDesktop() { return desktop; }
public void setDesktop(MyJDesktopPane desktop) { this.desktop = desktop; }
Лучше такого:
public MyJDesktopPane desktop;
Понимаю, если в сеттере например используются какие-либо проверки на корректность введенного значения или идет согласование введенного значения с другими полями класса.
Скажу честно, до проблемы додумался не сам, прочитал о ней в статье "10 приемов, разрушающих хрупкую красоту кода" на Хабре.


Ответ

Это "запас на будущее".
Сейчас вам достаточно поля, так как у вас публичны и чтение, и запись, а никакой дополнительной логики нет. Теперь допустим, что вам понадобилась эта логика. Что вы будете делать? Вы скроете поле, напишете геттеры и сеттеры. И тут возникает проблема: надо переписать все доступы к полю во всех классах, работающих с вашим кодом; надо перекомпилировать весь код, который обращается к полю. Часто это может быть большой объём работы, и он может повлечь за собой тьму тьмущую неприятностей, особенно если одновременно поддерживается несколько версий приложения: привет конфликтам мержа кода и прочим радостям.
Всё потому, что изменение поля на геттеры и сеттеры — это изменение, ломающее обратную совместимость, а добавление логики в геттер или сеттер — совершенно безболезненное изменение реализации. При хорошей архитектуре изменение реализации не должно влиять на внешний интерфейс и не должно ломать обратную совместимость. Поэтому предпочтение отдаётся геттерам и сеттерам даже тогда, когда реальной нужды в них нет.
Лирическое отступление: в C# синтаксис доступа к публичным полям и к публичным свойствам (парам геттер+сеттер) идентичен. Однако даже в C# считается дурным тоном использование публичных полей. Во-первых, потому что ломается бинарная совместимость, несмотря на сохранение совместимости на уровне сорцов; во-вторых, потому что публичные поля могут быть переданы по ссылке (ref, out), что невозможно для свойств.

Прочитал статью. Надо заметить, что рекомендация воздерживаться от геттеров и сеттеров в статье универсальна и оторвана от конкретных языков. Нельзя реализовать все рекомендации из статьи, если оставаться в рамках синтаксически аскетичного языка. Вы не можете воспользоваться синтаксическии сахаром в виде свойств, которые выразительнее, чем геттеры и сеттеры, если язык эти свойства не поддерживает. В этом случае придётся использовать геттеры и сеттеры, а не публичные поля, впрочем. Ну или переходите на C#. :)

задача: возможно ли продолжить фрагмент в обе стороны?

Задача из области "алгоритмы и структуры данных".
Дан фрагмент последовательности скобок, состоящей из символов
(){}[]
Требуется определить, возможно ли продолжить фрагмент в обе стороны, получив корректную последовательность. Если возможно - выведите минимальную корректную последовательность, иначе - напечатайте "IMPOSSIBLE". Максимальная длина строки 10^6 символов.
Sample Input 1:
}[[([{[]}
Sample Output 1:
{}[[([{[]}])]]
Sample Input 2:
{][[[[{}[]
IMPOSSIBLE
Идеи:
Есть стандартный алгоритм проверки корректности расстановки скобок, реализуемый через стэк. Суть в следудующем:
идем по строке, если встречаем открывающую скобку - заносим в стек если встречаем закрывающую скобку и на вершине стека лежит аналогичная ей открывающая, то удаляем ее (открывающюю) из стека если после прохода всей строки стек пустой, значит скобки расставлены верно.
Для решения этого задания этот алгоритм нужно модифицировать, чтобы была возможность (или определить невозможность) дополнения проверяемой строки до корректной.
Для этого пытался заводить счетчики на каждую скобку и ее направление и держать противоположную скобку в деке и в нужный момент извлекать из дека. Но пока все покрывается ифами и алгоритм все равно правильно не работает


Ответ

Привет со Степика! Держи код, прошедший все тесты в том уроке: Pastebin
В кратце об алгоритме:
открывающие скобки заносим в стек встречая закрывающие скобки проверяем на соответствие последней в стеке соответствует -> убираем из стека, иначе -> см.пункт 3 стек пуст? -> выводим слева, иначе -> IMPOSIBLE если после полного прохода последовательности стек не пуст, дополняем справа
class Stack: def __init__(self): self.items = [] def isEmpty(self): return self.items == [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() posible = True cin = input() a=Stack() s=Stack() for i in cin: if ( i == '(' or i == '[' or i == '{' ): s.push( i )
if ( i == ')' or i == ']' or i == '}'): if s.isEmpty(): a.push(i) else: temp = s.pop() if (i == ')' and temp != '(') or (i == ']' and temp != '[') or (i == '}' and temp != '{'): posible = False break if posible: while not a.isEmpty(): temp = a.pop() if temp == ']': temp = '[' if temp == ')': temp = '(' if temp == '}': temp = '{' print(temp, end = '') print(cin, end = '') while not s.isEmpty(): temp = s.pop() if temp == '[': temp = ']' if temp == '(': temp = ')' if temp == '{': temp = '}' print(temp, end = '') else: print('IMPOSSIBLE')

Как сделать, чтоб LinearLayout выделял всем item одинаковое по размеру место?

Я с помощью BaseAdapter устанавливаю в ListView XML файл со своей разметкой. В ListView в каждой строчке должно быть 3 столбца каждый из которых должен занимать 33% по ширине. Не больше ни меньше!
**Вот я собираю такой XML : **




Но все равно когда я устанавливаю в первое TextView текст, то он растягивается на где то на 70% по горизонтали, а остальные 2 TextView разделяют между собой остальных 30%. Я рассчитывал что каждый item займет третью часть по горизонтали. Что я делаю не так?


Ответ




Переопределение ссылок

В учебнике написано, что любая ссылка должна быть определена в момент объявления, и определена объектом, а не литералом. И её нельзя перевязать на другой объект. Из любопытства сделал следующее:
{ int val = 20,val2 = 2; int &refVal = val; refVal = val2; cout< return EXIT_SUCCESS; }
И к моему удивлению, на выходе ссылка ссылается на переменную val2, в консоли выводит двойку. Как так, это от компилятора зависит? Либо автор не прав. Можно ссылку на официальную документацию? Это вообще нормально?


Ответ

Дело в том, что ссылка это просто синтаксический сахар над указателями, поэтому, если переписать Ваш код через них, должно быть понятно, что происходит:
{ int val = 20,val2 = 2; int*const refVal = &val; *refVal = val2; cout<<*refVal< return EXIT_SUCCESS; }
Заметьте, в коде выше мы лишь единожды инициализируем указатель, а потом уже всюду его разыменовываем, не меняя его, но меняя тот объект, на который он указывает. Так вот, ссылка, будучи инициализирована, не может быть изменена, это просто синтаксически невозможно. Любое последующее использование ссылки является обращением к тому объекту, на который она ссылается(разыменование указателя в моём примеру).

Как изменить цвет в ActionBar?

Как можно поменять цвет в ActionBar (android), например на синий?


Ответ

В файле style.xml пишем следующее

Ну а в минифесте прописываем нашу тему, например для всего приложения
Ну и в файле colors.xml добавляем цвет
#669f36 #ffffff

Понимание Android adapters

Только сделал старт в изучении android. В общих чертах понимаю что adapter - это что-то, промежуточное между моделью и представлением.
Но помогите лучше понять, что это такое и все его возможности и применения.
П.С. если можно какие-то ресурсы или материалы.


Ответ

Начнем с того, что Adapter это не какой то неведомый абстрактный класс, а один из основных структурных шаблонов проектирования, который описан и разобран максимально подробно.
в общем случае, назначение адаптера - преобразовать один вид информации в другой, без вмешательства в исходное состояние информации.
Известно, что в ООП всё - объект, парадигма объектно-ориентированного программирования подразумевает, что виртуальная программа устроена так же, как и все, что окружает нас в реальной жизни, поэтому наглядным живым примером адаптера будет, как это ни странно - адаптер, приспособление для соединения не соединяемого, например, переходник SVGA - HDMI для подключения старой видеокарты к новому монитору.
Конкретно в Android паттерн Adapter нашел одно из своих применений в формировании различных списков на экране по имеющимся данным. То есть, есть какая то структура упорядоченных данных и ее необходимо отобразить на экране устройства. Структура представляет собой какие то цифры, текст и тому подобное, на экране это все должно быть View - явная несовместимость между источником и приемником. Можно решить эту проблему разными способами, например, предварительно преобразовать данные в подходящее для вывода на экран представление, НО! так мы потеряем исходные данные и при каждом изменении данных потребуется новое преобразование, что выглядит очень сомнительно с точки зрения производительности.
Здесь на помощь и приходит адаптер, который стоит посредником между данными и экраном, преобразуя "на лету" данные в View, не изменяя первые.
Адаптер ПОСЛЕДОВАТЕЛЬНО берет единицу данных, соответствующюю текущей ЗАТРЕБОВАННОЙ виджетом ПОЗИЦИИ одного из айтемов списка и преобразует эту единицу данных в форму, пригодную для отображения на экране - генерирует View. Виджет, отдав адаптеру требуемую позицию, в ответ получает от адаптера визуальное представление, состоящее из помещенных в нем данных и выводит его на экран.
Все возможности и применения адаптеров исходят из вышеизложенного - адаптация одного вида данных к другому. Применение адаптеров, связанных с виджетами, вроде ListView, ограничено преобразованием структурированных данных в отображение на экране, но ничто вам не мешает использовать сам паттерн для решения любых аналогичных преобразований и здесь его применение ограничено только вашей фантазией.

третий параметр алгоритма find

Используя метод find, легко найти есть ли заданное значение в контейнере, или нет:
std::vector vec; std::vector::iterator itr = find(vec.begin() ,vec.end(), int val); if(...)
и так далее;
Но что, если вектор содержит какие-либо структуры, объекты, или даже указатели на них? Возможно ли использовать эту функцию для нахождения необходимого значения, если оно является полем класса, а вектор состоит из указателей на объект этого класса? Что-то вроде:
class ClassName { public: int x; std::string y; };
std::string foo = "bar"; std::vector vec1; std::vector::iterator itr = find( vec1.begin(), vec1.end(), ??? )
Что нужно написать вместо знаков вопроса, чтобы найти такой указатель, который указывает на объект, поле std::string y которого равно строке foo ? Если это невозможно с алгоритмом find, то какие альтернативы?


Ответ

Используйте find_if, она принимает предикат.
std::string foo = "bar"; std::vector vec1; auto itr = std::find_if(begin(vec1), end(vec1), [&](ClassName* el){ return el->y == foo; });

Контроллировать I/O другой программы на C/C++

Здравствуйте. Возможно тема немного сбивает с толку, по этому поясню проще: мне нужна программа на С/С++, которая сможет запустить переданную ей в аргументы другую программу, а потом дать ей кое-что на вход (input), подождать пока она (переданная ей программа) сделает свое и получить её вывод (output). И ещё: программа, которую я передам в аргументы моей программе-оболочке -- скрипт на Python 3, может это важная деталь. Программа будет под Linux. Собственно мне нужно узнать через какие функции можно это сделать (я имею ввиду делать ввод в программу и получать её вывод).


Ответ

Посмотрите в сторону popen - например, здесь или здесь - это вам не поможет?

пятница, 29 марта 2019 г.

Какая разница между экземпляром и объектом класса?

Столкнулся с казалось бы простым вопросом, но понял, что дать ответ на него не смог бы.
Какая разница между экземпляром и объектом класса? Java начал недавно изучать да еще и сам. В общем, определенное время думал, что это одно и тоже. Можно с примером, пожалуйста.


Ответ

Это одно и то же!
Термины «экземпляр класса» и «объект» взаимозаменяемы.
(https://ru.wikipedia.org)

Как сохранить прогресс в консольной игре на Java?

Все знают, что при изучении программирования нужно, что-то писать. Писать калькуляторы и банкоматы надоело :) Хочу в рамках обучения Java, написать и по мере изучения дописывать консольную игру, но если ее сделать не коротенькую, хотелось бы иметь возможность как и в любой игре сохранится и когда-то продолжить играть. Подскажите как это сделать или хотя бы куда смотреть ?


Ответ

Каким образом хранить прогресс игры?
Если тебе нужно сохранять процесс - то это безусловно запись и чтение из файла. В Джаве это довольно просто, поэтому с освоением проблем не будет.
Также ты можешь сериализировать объект, то есть записать сущность объектов. Крутая штука, но новичку не стоит заморачиваться.
Ну а вообще, для более простого извлечения данных можно связать игру с БД или в хранить данные в xml-файле. Это очень элегантные способы извлечения и записи данных, но опять же для новичков сложновато.
Что именно хранить?
Ты можешь сохранять значения полей (к примеру, координаты расположения игрока, уровень, на котором остановился игрок, место сохранения и т.д)

Ну, и от себя добавлю, что не стоит тратить время на масштабные консольные игры или приложения. Да, масштаб - это хорошая практика, но зачем топтаться на одном месте, если есть в языке более крутые и менее примитивные вещи, которые сделают твой код более изящным, а тебя более привлекательным на рынке труда.
Да, с примитивом интересно писать что-то необычное, особенно когда ты новичок, но когда твое детище примет дорогой стоящий вид - это совсем другое чувство.

Защита игры от взлома

Никогда не разрабатывал игры, интересует такой вопрос, допустим есть клиент игры в котором есть персонаж "лучник" который стреляет со скоростью 1 выстрел в 1 секунду, если с помощью программы(например hlapex) поймать пакет который отвечает за выстрел, и отсылать его каждые 0.1 то лучник получается будет делать 10 выстрелов в 1 секунду? То есть на сервере нужно проверять когда был последний выстрел и если следующий выстрел слишком быстро произошел, то блокировать этот выстрел? Или я что-то не понимаю и выстрелы не отправляются? Вообщем может кто-то объяснить?


Ответ

Все верно. Учитывай время между запросами. Блокируй если "выстрелы" приходят при меньшем таймауте чем разрешено.

Определение расширения файла в python

Как в python сделать максимально правильно проверку на расширения файла ? Скажем, ко мне попадает имя файла и я хочу сделать проверку на то, является ли его расширения .py или нет.


Ответ

Используйте os.path.splitext
>>> import os >>> filename, file_extension = os.path.splitext('/path/to/somefile.ext') >>> filename '/path/to/somefile' >>> file_extension '.ext'

Принцип работы интерфейсных переменных в Java

Только начал изучать Java, поэтому вопрос скорее всего глупый. Пример кода из Хорстманна:
public class TimerTest { public static void main(String[] args) { ActionListener listener = new TimePrinter();
// construct a timer that calls the listener // once every 10 seconds Timer t = new Timer(10000, listener); t.start();
JOptionPane.showMessageDialog(null, "Quit program?"); System.exit(0); } }
class TimePrinter implements ActionListener { public void actionPerformed(ActionEvent event) { Date now = new Date(); System.out.println("At the tone, the time is " + now); Toolkit.getDefaultToolkit().beep(); } }
Почему в данной строчке используется интерфейсная переменная? Почему не объектная? Что за процесс происходит?
ActionListener listener = new TimePrinter();


Ответ

Если в будущем вы захотите использовать не TimePrinter, а другую реализацию ActionListener? Конечно, можно делать как вам вздумается. А сделано для того, чтобы можно было на лету менять конечную реализацию (к примеру, вместо TimePrinter использовать MsecTimePrinter, т.е. другую реализацию интерфейса ActionListener).
Поэтому и принято оперировать интерфейсами. Чтобы не связывать свой код жестко конкретными реализациями, т.к. в интерфейс можно присвоить любой класс, который реализует данный интерфейс. Это ПРАВИЛЬНЫЙ подход к написанию кода
А процесс происходит довольно простой: вы объявляете интерфейсную переменную типа ActionListener и связываете её с объектом TimePrinter. В последующем вы используете только методы интерфейса ActionListener, что освобождает вас от знания конкретной реализации самого класса TimePrinter

Как проверить на null в jQuery?

AJAX возвращает объект json. В некоторых случаях json может быть null. Как лучше всего проверить объект на null? Правильно ли использовать такую проверку if(json)?


Ответ

Каноническое решение на jQuery:
if (jQuery.type( proveryamaya_peremennaya ) === "null") { console.log('eto null'); } else { console.log('eto ne null (sic!)'); }

Параметры коллекций java

Встречаю различные варианты декларирования коллекций:
List list = new ArrayList(); //1
List list = new ArrayList(); // 2
List list = new ArrayList(); //3
И совершенно нет ясности, какие объекты в какую коллекцию можно положить. Экспериментально выяснил, что в коллекцию 2 - можно добавить объекты (Object). А в коллекцию 3 - только с типом Integer.
Вопрос 1: как понять по декларированию, какие объекты может содержать коллекция?
Вопрос 2: для каких прикладных задач можно использовать первый, второй и третий вариант декларирования коллекций?


Ответ

Параметр типа коллекции содержится в левой части, что написано в правой части значения не имеет
Таким образом, записи (1, 3) полностью идентичны:
List list = new ArrayList(); //1
List list = new ArrayList(); //3
Вы можете вписывать в правую часть параметр или не вписывать, как вам удобно. Компиляция (по ссылке выше) показала, что на время выполнения запись никак не влияет. Тогда как в выражении 2:
List list = new ArrayList(); //2
Тип не указан в левой части, значит тип - любой объект Object

Случайное число в golang

Как получить случайное число? Вот функция, но она выводить всегда цифру "81"
package main
import ("fmt"; "math/rand")
func main() { fmt.Println(rand.Intn(100)) }


Ответ

Генератор случайных чисел обычно нужно рандомизировать перед использованием, иначе, он, действительно, будет выдавать одну и ту же последовательность.
В golang это можно сделать вот так:
rand.Seed(time.Now().UnixNano())
https://golang.org/pkg/math/rand/#Seed
P.S. Оставлю тут ещё ссылку на англоязычную версию SO, с вопросом, как правильно инициализировать рандомайзер: golang random number generator how to seed properly

Свойства c# - как работают

class A { private int a; private int b; private int c;
public int W{get;set;} }
Вопрос: к какому из этих трех полей будет иметь доступ это свойство?


Ответ

Ни к какому из указанных, компилятор создаст неявное поле для свойства W
Если вам нужно что бы свойство обращалось к конкретному полю, это нужно указать явно.
class A { private int a;
public int W { get { return a; } set { a = value; } } }

Foreach и новый объект

Вот к примеру такой код, он загружает картинки из файлов и считает максимальную ширину и суммарную высоту:
List bitmapsList = new List(); foreach (string fn in fileNames) { Bitmap bmp = new Bitmap(fn); // Интересует вот эта строка bitmapsList.Add(bmp); if (bmp.Width > maxWidth) maxWidth = bmp.Width; totalHeight += bmp.Height; }
Вопрос: как будет правильней, создавать объект Bitmap bmp в цикле, или объявить его перед циклом? Что происходит с ним после прохода одной интерации цикла?


Ответ

Упрощенно можно считать что переменные, объявленные внутри блока ограниченного { } существуют до тех пор, пока выполняется код этого блока. Как только управление передается за пределы блока, все локальные переменные блока удаляются.
С объектами иначе. Объект существует до тех пор, пока к нему можно получить доступ по ссылке. Когда ни одной живой ссылки не осталось, объект может быть удален сборщиком мусора.
В реальности механизм в обоих случаях сложнее, но для начального понимания этого достаточно.
В вашем коде, переменные объявленные внутри цикла будут пересоздаваться на каждой итерации. Ссылку на Bitmap вы кладете в List объявленный за пределами цикла, поэтому с ним ни чего не произойдет.
Создание объекта, происходит в момент вызова конструктора new Bitmap(fn), и оно разумеется должно быть внутри цикла.
Что касается вопроса "как лучше?" - чем код понятнее, тем лучше, компилятор и Jit-компилятор в процессе работы все равно оптимизируют и изменят его так, как посчитают нужным и эффективным. Хотя надо отметить, что для языков на основе стековой машины, C# в их числе, присутствует рекомендация - объявлять переменную максимально близко к месту ее использования, т.е. если переменная используется только внутри итерации цикла и ее значение не участвует в последующих итерациях - объявляем ее внутри цикла, в противном случае вне цикла.
Ну и потратьте день другой, на целенаправленное изучение/повторение основ языка, принципов работы с памятью и сборки мусора в .NET, это реально нужно, если конечно вы планируете развиваться дальше в этом направлении. Вот тут есть отличный список литературы.

Instant run нужно ли?

Всё чаще Android Studio предлагает сделать update Instant Run 2.2.2. Пролистав о возможностях, выделил для себя что это способствует быстрому запуску приложения, без предварительной установки apk.
Но на самом деле это так хорошо как описывают?
И если да, как его установить так, чтоб он не всплывал мне каждый раз окном.


Ответ

Instant Run – это технология, позволяющая сократить время сборки проекта (при этом время первой сборки увеличивается).
Но есть одно очень большое НО: при использовании этой технологии, в некоторых случаях Вы можете получить некорректное поведением Ваших программ.
В официальной документации Google сам пишет что-то вроде: «... для корректного функционирования название_чего-то технология Instant Run должна быть отключена».
Если Вы знаете все те ситуации, где использование Instant Run может привести к некорректным результатам, то в принципе, использовать ее можно, но что-то мне подсказывает, что использование этой технологии может повлиять на поведение Вашей программы даже в каком-то случае, который незадокументирован, поэтому я все таки посоветовал бы не использовать ее (по крайней мере пока).
Подробнее про Instant Run можно почитать в этой статье, либо в официальной документации.
UPD. Как отключить Instant Run:
File – Settings – Build, Execution, Deployment – Instant Run – убрать галочку Enable Instant Run...

Длина большого файла через функцию filelength

Никак не могу понять почему, если хочу узнать длину файла ~3GB в байтах вот так:
FILE * f; errno_t err = fopen_s(&f, "a.iso", "rb"); if (f == NULL) { return 0; } unsigned long int size = filelength(fileno(f)); cout << size << endl;
то мне выдаёт максимально возможное число для типа unsigned long int 4 294 967 295. С маленькими файлами всё нормально (правда я там int использую). Функция filelength объявлена в .
Подскажите, пожалуйста, что тут неправильно.


Ответ

Ну, если файл большой :), то для этого есть, например, _filelengthi64 (подробнее тут).

Interface с реализацией

Я во всех учебниках видел, читал, тестировал interface с методами без реализации. Но вот копаюсь в дереве и тут есть методы с реализацией default. Это как понять? То есть можно реализовать интерфейс с реализацией??? Спасибо.


Ответ

Можно определить интерфейс с реализацией. Эта возможность появилась в Java 8, в более ранних версиях она была недоступна. Вот пример реализации такого интерфейса:
interface Test { default int test(int i) { return i; } }
Если в классе, реализующем этот интерфейс, метод не переопределяется, то будет использована дефолтная реализация из интерфейса.
Фактически, начиная с Java 8, интерфейс приобрёл некоторые черты обычного класса и стало возможным реализовать некий аналог множественного наследования.

Поворот матрицы (двумерного массива) на 90 градусов в Python с помощью zip

Как сделать поворот матрицы в одну строчку без numpy и циклов?
Например если исходная матрица
[[1, 2], [3, 4]]
то результирующая должна быть:
[[3, 1], [4, 2]]


Ответ

Вполне себе рабочий вариант, если скорость не критична.
Но если есть требования по скорости обработки, то лучше все-таки воспользоваться NumPy.
Сравнение производительности для массива 100x100:
In [72]: a = np.random.randint(0, 99, (100, 100))
In [73]: m = a.tolist()
In [74]: a.shape Out[74]: (100, 100)
In [75]: %timeit tuple(zip(*m[::-1])) 10000 loops, best of 3: 71 µs per loop
In [76]: %timeit np.rot90(a, 3) The slowest run took 9.64 times longer than the fastest. This could mean that an intermediate result is being cached. 100000 loops, best of 3: 2.63 µs per loop
Сравнение производительности для массива 1000x1000:
In [77]: a = np.random.randint(0, 99, (1000, 1000))
In [78]: m = a.tolist()
In [79]: a.shape Out[79]: (1000, 1000)
In [80]: %timeit tuple(zip(*m[::-1])) 10 loops, best of 3: 32.6 ms per loop
In [81]: %timeit np.rot90(a, 3) The slowest run took 7.54 times longer than the fastest. This could mean that an intermediate result is being cached. 100000 loops, best of 3: 2.59 µs per loop
Сравнение производительности для массива 10000x10000:
In [82]: a = np.random.randint(0, 99, (10000, 10000))
In [83]: m = a.tolist()
In [84]: a.shape Out[84]: (10000, 10000)
In [85]: %timeit tuple(zip(*m[::-1])) 1 loop, best of 3: 4.43 s per loop
In [86]: %timeit np.rot90(a, 3) The slowest run took 11.29 times longer than the fastest. This could mean that an intermediate result is being cached. 100000 loops, best of 3: 2.59 µs per loop

Не добавляются уникальные элементы в массив

Пишу свой велосипед по удалению одинаковых элементов массива. Как бы при выводе в консоль дубли не попадаются т.е выводится всё как нужно (1, 11, 2, 4, 5, 3). Но при этом в результирующий массив res ничего не попадает. Помогите исправить
var res = []; var a = [1, 1, 11, 2, 4, 2, 5, 3, 1]; var N = a.length; for (i = 0; i < N; i++) { f = 1; for (j = 0; j < N; j++) if (a[i] == a[j] && i != j) { f = 0; break; } if (f == 1){ console.log(a[i]); //в консоле(1,11,2,4,5,3) res.push(a[i]) // в итоговом массиве 1,1,11,2,4,2,5,3,1 -----что не верно } } }


Ответ

Честно говоря не хочу смотреть ваш велосипед. Да он и в консоль выводит дубли. Не знаю как вы проверяли.
Но, кмк, проще сделать так:
var arr = [1, 1, 11, 2, 4, 2, 5, 3, 1]; var set = new Set(arr); arr = Array.from(set); console.log(arr);
Объекты Set позволяют сохранять уникальные значения любого типа, как примитивы, так и другие типы объектов. (вроде браузеры поддерживают)
Array.from() создаёт новый экземпляр Array из массивоподобного или итерируемого объекта.

Функция со switch с переменным количеством case

Допустим, у меня есть несколько таких блоков:
// Ввод символа do switch (_getch()) { // Делать одно case '1': dosmth1(); break; // Делать второе case '2': dosmth2(); break; // Делать третье case '3': dosmth3(); break; // Выйти case '0': dosmth0(); return 0; } while (true);
Но, ввиду частого создания оных, возникает вопрос:
Как организовать такую функцию menu(), которая создавала бы n-ное количество case, соответствующих n-ному количеству параметров (указателей на функции)?

Вызов такой функции по принципу stdarg
menu(4, dosmth1, dosmth2, dosmth3, dosmth0);


Ответ

Если сигнатуры вызываемых функций одинаковы, то самый простой способ - использовать контейнер типа std::map, std::unordered_map. Ключом будет выступать char или int, а в качестве типа значения использоваться указатель на функцию. Например:
std::map action;
Когда контейнер заполнен использование может быть сокращено до вида:
action[_getch()]();
Понятно, что в общем случае могут потребоваться дополнительные проверки на существование элемента, т.к. по умолчанию оператор [] приводит к созданию элемента, если его не было.

XmlDocument и два корневых элемента

На входе есть строка, в которой находятся xml данные, по сути два корневых элемента которые записаны один после другого. При попытке загрузить эту строку в XmlDocument.LoadXml выдается ошибка -
Существует несколько корневых элементов
Изменить входную строку я не могу, и для работы мне нужен второй корневой элемент. Единственный выход который вижу - обрезать строку, но возможно есть более красивое решение?


Ответ

Если у документа нет пролога, то можно завернуть весь документ в еще один тэг.