Страницы

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

четверг, 4 октября 2018 г.

Какая польза от перехода на managed language's?

А точнее, зачем их вообще используют и зачем (в каких ситуациях) лучше их использовать? Вот посудите сами. Managed languages: Выполняются в виртуальной машине (соответственно, требуют больше инструкций для выполнения инструкций языка) Являются интерпретируемыми (выходит из первого пункта), соответственно, требуют больше памяти\ресурсов машины, а значит, программы написанные с их использованием работают медленнее, требуют больше ресурсов, вычислений, и т.п. В то время как программы, написанные (скомпилированные прямо в машинный код) на "обычных" процедурных\объектно-ориентированных языках, вроде того же С или С++, обладают куда большей скоростью, производительностью, куда менее требовательны к памяти и ресурсам системы. И почему, к примеру, если я хочу использовать в своей программе систему классов NET Framework, я обязан перейти на виртуальную машину? Что, если я хочу, чтобы мой код компилировался в машинный? Например, мой одногрупник решил писать на Java, мотивируя свой переход с плюсов на яву тем, что в C++, якобы, нужно иметь дело со "всеми этими указателями" (и он даже ничего не слышал ни про RAII, ни про smart ptr'ы), а в Jave, вот, есть GarbageCollector, и ни о чем думать и заботиться не надо. В чем же причина такого массового распространения managed языков, какую нишу они занимают, и какая судьба в будущем ждет языки вроде С,C++, Haskell, и т.д.?


Ответ

Являются интерпретируемыми (выходит из первого пункта), соответственно, требуют больше памяти\ресурсов машины, а значит, программы написанные с их использованием работают медленнее, требуют больше ресурсов, вычислений, и т.п. В то время как программы, написанные (скомпилированные прямо в машинный код) на "обычных" процедурных\объектно-ориентированных языках, вроде того же С или С++, обладают куда большей скоростью, производительностью, куда менее требовательны к памяти и ресурсам системы. Это спорно. Во-первых, в современных средах используют агрессивный JIT, который может выдавать код исполняющийся быстрее чем тот что компилируется статически (ниже занятный пример такого превосходства), за счёт дополнительной информации доступной только в рантайме. Во-вторых, обычно на всю систему запускается одна виртуальная машина, для множества приложений использующих её, в то время как каждая программа скомпилированная статически тащит необходимый рантайм каждая свой. На самом деле это несущественно, но стоит упомянуть. И почему, к примеру, если я хочу использовать в своей программе систему классов NET Framework, я обязан перейти на виртуальную машину? Что, если я хочу, чтобы мой код компилировался в машинный? Тогда вам наверное не по пути. Например, мой одногрупник решил писать на Java, мотивируя свой переход с плюсов на яву тем, что в C++, якобы, нужно иметь дело со "всеми этими указателями" (и он даже ничего не слышал ни про RAII, ни про smart ptr'ы), а в Jave, вот, есть GarbageCollector, и ни о чем думать и заботиться не надо. У вашего одногруппника очень здравая позиция, он выбирает функционал и избегает лишней сложности. Это ведь великолепно, что GC снимает часть головной боли с программиста. А то что повышается потребление ресурсов, то это имеет значение лишь в том случае, если ощутимо заметно для пользователя. В остальных случаях -- это серьёзная оптимизация времени программиста. В чем же причина такого массового распространения managed языков, Видимо потому что программы исполняющиеся на виртуальных машинах легче переносить. Кроме того обычно такая среда предоставляет возможность работы с кодом как с данными, предоставляет большую гибкость. какую нишу они занимают, и какая судьба в будущем ждет языки вроде С,C++, Haskell, и т.д.? Си похоже не умрёт никогда. Haskell, как жертва постоянных экспериментов и исследований -- тоже. Зато C++ очень даже может сдохнуть, ибо слишком сложен, и преимущества не стоят недостатков. UPD: Нашёл очень занятную дискуссию. Внезапно обнаружилось что реализация языка Lua, LuaJIT выполняется быстрее чем код на языке D. При том, что язык D -- статически типизированный, компилируется в нативный код, тогда как Lua -- динамически типизированный, с JIT-компиляцией. Такие дела.

Генерация случайных дробных чисел

Есть вот такая задача: Сгенерировать массив чисел, сумма которых составит 1. Кол-во чисел вводится с клавиатуры. Решение может быть любое главное получить итоговую сумму 1 (Не желательно большое кол-во нулей)


Ответ

Генерируем N любых неотрицательных чисел. Вычисляем их сумму. Делим каждое на эту сумму.
Пример реализации:
int count = 10; Random random = new Random(); int[] integers = new int[count]; long sum = 0; for (int i = 0; i < count; ++i) { integers[i] = random.Next(); sum += integers[i]; } double[] doubles = new double[count]; for (int i = 0; i < count; ++i) doubles[i] = (double)integers[i] / sum; Console.WriteLine(string.Join("
", doubles)); Console.WriteLine(doubles.Sum());
random.Next() возвращает неотрицательное случайное целое число. Для накопления суммы берем long-переменную во избежание переполнений.

Организация DDoS атаки

Дорогие участники, обраўаюсь к вам с пргосьбой объснить что необходимо для организации ДДоС атаки и как все необходимое написать? заранее благодарен, жду ответа...


Ответ

Попробую серьезно ответить) Для начала читайте все, что найдете, по ботнетам. Создаются они обычно тихими вирями, которые сидят, никого не трогают и раз в N минут шлют запрос на "базу". База может быть одним сервером или несколькими, тогда запросы чередуются. Когда на базе обнаруживается задание (обычно передаются в виде структуры, напр. "1/2/123.45.67.89:80/4/register.php?save=1" может означать "задача 1 (ддос), метод 2(гет) на IP 123.45.67.89 порт 80, интенсивность 4, адрес долбежки /register.php?save=1"), бот начинает его выполнять. Соответственно, в нем должны быть обработчики для каждого задания. Как правило, для гет- и пост- атак предварительно на сайте выбираются некэшируемые, тяжелые страницы (новости, логин, юзерские галереи и пр.). По сути главные сложности - написание вирей (а их такого рода довольно сложно спалить, ибо поведение в "stand by" мало чем от аси отличается) и организация базы. Вторая сложность - скрыть отношение между базой и вами, ну и ботами и вами, но это проще. Особые умельцы закладывают адрес базы как результат псевдослучайного генератора, тогда в случае падения основной базы все боты перекинутся на следующий адрес. Т.о. при накрытии базы не удается идентифицировать создателя, а боты тупо меняют адрес и продолжают работу, тогда остается только громко звать на помощь каспера или человека-паука. Ну и соответственно вирусы тут вам писать не будут, а вот организовать базу на фрихостинге вполне можно с помощью и сердечной поддержкой анонимайзеров, коих в сети не великое, но таки множество. Ах да, защита)) Защищаемся от пинга блокировкой IP больше лимита Q запросов на T сек, от гета-поста: lvl1 та же блокировка, lvl2 проверка на кол-во одинаковых запросов (если страничка специфичная, а запросы шкалят - блок, в зависимости от опасности, IP или страницы), lvl3 эвристика всякая, капчи и прочее.

Как записать выражение (-1)^(k+1) без pow?

Как записать (-1)^(k+1) без использования функции pow?


Ответ

int result;
if (k%2 == 0) result = -1; else result = 1;

Разбить элементы списка посимвольно

Здравствуйте!
Подскажите, пожалуйста, как можно разбить уловный список ['1', '22', '333'] по символам, т.е. чтобы получился список ['1', '2', '2', '3', '3', '3']
Заранее спасибо!


Ответ

На функциональщине в одну строчку:
reduce(lambda a, x: a + x, map(lambda x: list(x), ['1', '22', '333']))
Поясняю - reduce принимает на вход функцию, которая объединяет результаты разбиения списка функцией map. Map принимает на вход функцию и начальный массив, над каждым элементом массива выполняется данная функция. То же самое можно выразить следующим кодом:
>>> result_list = [] >>> for x in ['1', '22', '333']: ... for y in list(x): ... result_list.append(y) ... >>> print(result_list) ['1', '2', '2', '3', '3', '3']

Сравнение по скорости предложенных вариантов:
Вариант с использованием join и объединением в строку результата уделал всех. Оно и неудивительно — все операции здесь быстрые. Будет работать с любыми iterable объектами:
$python3 -m timeit "list(''.join(['1', '22', '333']))" 1000000 loops, best of 3: 0.318 usec per loop
Вариант с использованием генератора списка из ответа @jfs действительно работает быстро:
$python3 -m timeit "[char for s in ['1', '22', '333'] for char in s]" 1000000 loops, best of 3: 0.452 usec per loop
Вариант с использованием sum занимает третье место по скорости, однако по моему мнению, проигрывает в интуитивности:
$python3 -m timeit "sum([list(i) for i in ['1', '22', '333']], [])" 1000000 loops, best of 3: 0.984 usec per loop
Вариант на map-reduce является самым медленным. Почему я его использую? Потому что мне нравятся цепочки вызовов. Остальное — вкусовщина. Однако даже Гвидо ненавидит reduce (и вынес его в functools в python3)
$python3 -m timeit "from functools import reduce; reduce(lambda a, x: a + x, map(lambda x: list(x), ['1', '22', '333']))" 100000 loops, best of 3: 2.16 usec per loop
Вариант с collections покрывает все случаи, когда передаваемый объект может быть неитерируемым (число, например), однако цена за такое — большое время выполнения:
$python3 -m timeit "import collections
def it(obj): if isinstance(obj, collections.Iterable): for ob in obj: if isinstance(ob, collections.Iterable) and len(ob) > 1: yield from it(ob) else: yield ob else: yield obj
list(it(['1', 2, [2, 44, '123', ('qwe')], 2]))" 100000 loops, best of 3: 14.6 usec per loop

В чем разница между Thread и Runnable?

В чем разница между Thread и Thread (Runnable)? Иными словами, какой плюс от того, что поток Thread будет реализован через интерфейс Runnable? Это типа поток в потоке или какие-то доп. функции будут? К примеру, доступ к UI?..


Ответ

@Futurama, в документации совершенно четко прописан ответ на Ваш вопрос. Читаем (жирный шрифт -- это выделено мной): There are two ways to create a new thread of execution. One is to declare a class to be a subclass of Thread. This subclass should override the run method of class Thread. An instance of the subclass can then be allocated and started. For example, a thread that computes primes larger than a stated value could be written as follows: class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; }
public void run() { // compute primes larger than minPrime . . . } } The following code would then create a thread and start it running: PrimeThread p = new PrimeThread(143); p.start(); Суть в том, что мы переопределяем метод run класса Thread, который вызывается из метода start класса Thread, который мы и вызываем для запуска потока (исполнения нашей программы в новом потоке). The other way to create a thread is to declare a class that implements the Runnable interface. That class then implements the run method. An instance of the class can then be allocated, passed as an argument when creating Thread, and started. The same example in this other style looks like the following: class PrimeRun implements Runnable { long minPrime; PrimeRun(long minPrime) { this.minPrime = minPrime; }
public void run() { // compute primes larger than minPrime . . . } } The following code would then create a thread and start it running: PrimeRun p = new PrimeRun(143); new Thread(p).start(); В принципе, как говориться -- "те же яйца, вид сбоку". Если вдуматься, то суть та же. Создается (подготавливается к запуску) новый поток (класс Thread -- структура данных внутри JVM). В эту структуру заносится адрес функции (последовательности инструкций JVM), которая представляет программу, которую мы хотим выполнять в новом потоке. Вызов метода .start класса Thread (непосредственно или опосредовано, как унаследованного в первом случае) запустит новый поток (как именно -- зависит от ОС в которой работает конкретная JVM). Вот собственно и все. Просто RTFM.

Использование MapFragment внутри ViewPager: Не загружается карта

Имею ViewPager, который подгружает MapFragment. При этом карта не видна, но фон меняется на серый, т.е. можно четко понять, что фрагмент MapFragment прикрепился без проблем, но по какаим-то причинам карта не видна на экране.
Как это исправить?
Мой fragment_map.xml

Мой MapFragment.java
public class MapFragment extends Fragment implements OnMapReadyCallback {
private static final String MAP_FRAGMENT_LOG_TAG = "map_fragment_log";
private MapView mMapView = null; private GoogleMap mGoogleMap = null;
public static MapFragment newInstance() { Bundle args = new Bundle(); MapFragment fragment = new MapFragment(); fragment.setArguments(args); return fragment; }
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MapsInitializer.initialize(MapFragment.this.getActivity().getBaseContext()); }
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View v = inflater.inflate(R.layout.fragment_map, container, false); mMapView = (MapView) v.findViewById(R.id.map_view); mMapView.onCreate(savedInstanceState); mMapView.getMapAsync(this); return v; }
@Override public void onResume() { super.onResume(); mMapView.onResume(); }
@Override public void onMapReady(GoogleMap googleMap) { mGoogleMap = googleMap; mGoogleMap.addMarker(new MarkerOptions() .position(new LatLng(0, 0)) .title("Marker") .draggable(true) ); }
@Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mMapView.onSaveInstanceState(outState); }
@Override public void onPause() { super.onPause(); mMapView.onPause(); }
@Override public void onDestroy() { super.onDestroy(); mMapView.onDestroy(); }
@Override public void onLowMemory() { super.onLowMemory(); mMapView.onLowMemory(); }
}
Мой AndroidManifest.xml









Ответ

Согласно сообщению ТС в комменте проблема была в отсутствии SHA-1 дебажного ключа, коим было подписано приложение