Страницы

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

четверг, 6 декабря 2018 г.

Почему нельзя запустить android приложение на Linux?

Здравствуйте! Почти все приложения для Android написаны на Java. И тем не менее их нельзя запустить на компьютере. Почему? А если перекомпилировать? В чем разница между Java на Android и Linux? Можно их запустить на компьютере?


Ответ

Во первых Андроид это операционная система и работает на виртуальной машине по жавой. Хоть и сделана на база линукса они разные, разные библеотеки, дрова и тд. Тем более приложение компилируется на архитектуру процессоров ARM. Но запустить на компе возможно с помощью эмулятора, па пример Genymotion.

Вернуть md5 к исходному значению на С

Подскажите какой-нибудь декриптор или что-нибудь в этом роде на Си для md5. Нужно сделать так, чтобы шифровка md5 превращалась в то, что было до шифрования. Возможно ли такое в принципе, и если нет, то почему?


Ответ

MD5 - это не "шифрование", это хэш-функция. Основное требование к криптографическим хэш-функциям - необратимость.
Если бы хэши были обратимы, то архиваторы и прочие алгоритмы сжатия стали бы не нужны. Например, я посчитал хэш от терабайтного файла. Получил 79a2520f22b9e1526ff93176029603b8. Вы считаете что можно эту строчку расшифровать обратно в тот же терабайт информации?
Максимум, что можно сделать для MD5 - найти коллизию (второй прообраз) - строчку, для которой MD5 выдаст такое же значение. Это можно сделать или по готовым словарям (если есть подозрение что строчка - это пароль вида 12345), или с использованием радужных таблиц.
Но никакой гарантии что вы получите при этом именно оригинальную строку нет. Точнее, вы с некоторой вероятностью получите оригинальную строку, если она была короткой. Но вы точно получите неоригинальную строку, а просто коллизию, если оригинал был достаточно длинным.
Если поиска коллизии для вас достаточно - поищите готовую опен-сорс реализацию работы с радужными таблицами, например MD5Rainbow

Убрать стрелочки с

Есть input с типом number и при наведении на него появляются такие стрелочки:


Можно ли как-то их убрать?


Ответ

input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { /* display: none; <- Crashes Chrome on hover */ -webkit-appearance: none; margin: 0; /* <-- Apparently some margin are still there even though it's hidden */ }
Ответ тут.

Развернуть слово

Надо развернуть слова наоборот, чтобы при этом небуквенные символы оставались на своих местах.
Например: a1bcd => d1cba


Ответ

Заводим указатели на начало и конец строки, идем в цикле, первый указатель увеличиваем, второй уменьшаем, цифры проскакиваем. Меняем между собой буквы на которые смотрят указатели. Завершаемся, когда указатели сравнялись.
В виде кода как то так (правда вы язык не указали):
int j = 0; int k = ch.length-1; while(j

Зачем использовать Python2 вместо Python3?

Почему некоторые продолжают использовать интерпретатор предыдущей версии, почему он еще не умер и не забыт?
Третья версия ушла далеко вперед (один async и новый GIL чего стоят), многие библиотеки были портированы (ранее, например, был повод использовать Py2 - OpenCV, но и ее портировали).
Единственный повод - поддержка старых проектов и невозможность переезда, но по-прежнему есть те, кто стартует новые проекты на Py2. Новые вопросы на StackOverflow появляются.
Зачем, какие очевидные причины?


Ответ

Очевидной причиной является несовместимость большинства старых рабочих тестированных Питон 2 программ с Питон 3.
Даже если большинство изменений тривиально (и может быть автоматизированно), переход на Питон 3 требует наличия тестов и времени программистов, трату которого надо обосновать. Питон 2 сам по себе уже хорошим языком является. Питон 3 местами лучше, но для каких-то задач может даже хуже показаться на первый взгляд.
Даже если разработчики могут найти время для перехода на новый язык, учитывая что программисты люди любознательные, Питон 3 может конкурировать с переходом и на другие языки такие как Go, OCaml (Питон 3 несовместим, но он "недостаточно несовместим" если что-то новое хочется попробовать).
Изначальной адаптации Питона 3 не помогало, то что первые версии (до Питон 3.2-3.3) не были предназначены для широкого использования. Большинство книг/ресурсов в сети использовали Питон 2 синтаксис. Обычно, предустановленная команда python запускает Питон 2 на POSIX системах.
Большинство живых популярных библиотек работают как на Питоне 2 так и 3. Существует "длинный хвост" библиотек, которые только на Питоне 2 работают (публичные и внутренние инструменты).
Из-за заявленной долгосрочной (на данный момент до 2020) официальной поддержки Питона 2, люди немного теряют оставаясь на Питоне 2 (хотя люди часто недооценивают время жизни программ).
Заставлять программистов учить разницу между текстом, представленным в виде Unicode строк и байтами создаёт заметный барьер для смены версий для нового кода. Особенно, если программист работает в окружении где текст в основном представлен в виде байт, закодированных в utf-8, или хуже: семантически текстовые интерфейсы используют исторически байтовые API на POSIX системах, которые допускают произвольные последовательности байтов (имена файлов, параметры командной строки, переменные окружения), что требует таких вещей как surrogateescape, чтобы продолжить с Unicode работать по умолчанию.
Уроки
Чтобы не повторять ошибок, можно было бы избежать смены основной версии и вводить новые изменения поэтапно (Python 4 в понимании Python 3 не должно быть):
не накапливать много несовместимых изменений, которые нужно научиться использовать и искать способ подружить со старым кодом (низкая стоимость перехода) возможно большинство новых фич убрать под from __future__ import division, print_function, unicode_literals, etc, которая включается через несколько выпусков по умолчанию (позволяет тестировать, преобразовывать код по одному модулю за раз) публиковать на PyPI модули, облегчающие переход с версии на версию, например, contextlib2, pathlib2, subprocess32, etc предоставить возможность исполнять старый код на новой версии без изменений (чтобы старые программы поддерживать—это относительно просто, если другие пункты также реализовать) конвертировать новую версию в старую, чтобы новый код в старом окружении исполнять (новые программы можно было бы на новой версии языка писать, а исполнять в старом окружении) (3to2 вместо 2to3—см. futurize и pasturize скрипты) ограничить поддержку старых версий (как сейчас 3.2, 3.3, 3.4, 3.5 поддерживаются) — только одна официальная текущая версия языка (чтобы ненужный выбор не создавать) использование semver для языка может быть вредно по психологическим причинам: вместо 3.0 можно было 2.6 выпустить с меньшим набором новых фич (изменение основной цифры может пугать без оснований) медленно убирать старые особо зловредные фичи — упомянуть в документации лучший путь, но фактически задержать на несколько лет удаление старого кода (адаптация под каждую новую версию в любом случае может требовать работы—так барьер между перехода на каждую версию не слишком высок)
В итоге:
люди, которые любят новые блестящие штучки, могут их использовать, не ожидая перехода всей кодовой базы на новую версию люди, которым надо чтоб продолжало работать, также довольны—старый код не должен ломаться (за исключением обычного ожидаемого подкручивания гаек при переходе на новую версию) особо консервативные люди продолжают сидеть на Python 2.4, 2.6 новички просто начинают с текущей единственной версии

Стоит ли продолжать начинания в изучении Python как основного? [закрыт]

Мне симпатизирует синтаксис, но язык кажется каким-то больше вспомогательным сам по себе. Да, есть фреймворки, но тот же Джанго относительно не столь популярен. Но на данный момент это единственный язык, который я знаю на начальном уровне, и стоит ли продолжать?
Не хочу ситуацию, чтоб я остался на улице, а PHP/C++/Java-элита бы пожинала плоды.


Ответ

1. Мнение
Python — не «вспомогательный» язык, это популярный язык программирования, продолжать изучение стоит, на улице при соответствующем уровне знаний не останетесь.

2. Аргументация
2.1. Рейтинги популярности языков программирования
PYPL — второе место на февраль 2018;
Redmonk — третье место на июнь 2017; TIOBE — четвёртое место на январь 2018;
Trendy Skills — пятое место на февраль 2018. Правда, на 4-м месте в этом рейтинге HTML, не являющийся языком программирования.

2.2.Рейтинги востребованности рабочих мест
Indeed — 2-е место на ноябрь 2017;
Indeed другая статистика — 4-е место на декабрь 2017.

2.3. Рейтинги языков программирования по зарплате разработчиков
ChallengeRocket — 3-е место на февраль 2017.

См. также перевод отрывка, посвящённого Python:
Это универсальный и понятный язык, используемый крупными игроками в технологической индустрии (Google, NASA). Принимая во внимание, что уже в 2016 инженер-программист со знанием Python может заработать до $100 000, мы прогнозируем, что годовой оклад Senior Python Developer будет колебаться вокруг суммы $105 000 и выше. Это объясняется в значительной степени популярностью языка и его частым появлением в списках требований в процедурах найма на работу. Согласно рейтингу TIOBE, Python находится на 5-м месте по количеству запросов в основных поисковых системах, поэтому аналитики предполагают, что его популярность будет продолжать расти. За последние 5 лет популярность Python демонстрировала наибольшие темпы роста в этом аспекте (6,8%, когда, например, PHP имеет -5,0%).

3. Дополнительная информация
О том, как вычисляются рейтинги, в большинстве случаев можно посмотреть по ссылкам на эти рейтинги. См. также:
Краткое описание, какие критерии берутся в расчёт для некоторых из перечисленных выше рейтингов

В Linux Debian нет стандартно программы make. Как устанавливать?

Установил Linux Debian. Все стандартные программы есть, а хочу установить pindgin и ещё парочку. А там надо из исходников собирать. А там нужен make. Ввел в терминале make Вывел bash: make: команда не найдена. Скачал этот make с офф. сайта. Глянул файл INSTALL и README. Ничего не понял. Как установить этот make? Напишите пожалуйста.


Ответ

Если есть необходимость компилировать софт, то одного make может быть мало. Поэтому обычно более оптимальным является установка пакета build-essential, который содержит make в том числе. В убунте он поставит к примеру dpkg-dev (package building tools for Debian g++ (The GNU C++ compiler), gcc (The GNU C compiler), libc6-dev (GNU C Library: Development Libraries and Header Files) or libc-dev (virtual package provided by libc6-dev) и make. В Debian приблизительно тоже. Поэтому рекомендую такую последовательность sudo -s apt-get update #это желательно, если хочется все новенькое apt-get install build-essential

Русский язык в исходном коде в Dev C++ [дубликат]

На данный вопрос уже ответили: Русский язык в консоли 3 ответа Я недавно начал изучать С++, у меня есть компилятор Dev C++. Когда я делаю
std::cout<<"Привет!";
то получается абракадабра! А если перебираю символы циклом, то русские буквы отображаются правильно. Я думаю проблема в различии кодировок dos и windows. Кто знает какие-нибудь примочки для Dev C++ (типа keycyr для pascal) или операторы/функции/процедуры C++ позволяющие сменить кодировку std::cout.


Ответ

С setlocale() по науке правильно, но если локализация кривовата (как у меня на этой машине), то не работает.
В Windows есть 2 функции, CharToOem(char, char) и OemToChar(char, char) для перевода cp-1251 в cp-866 (консоль) и обратно.
Пример:
#include #include #include #include
main () { char str[1000], buf[1000]; int itty = isatty(fileno(stdin)), otty = isatty(fileno(stdout));
strcpy(str, "привет"); if(otty) CharToOem(str, str); puts(str);
fgets(str, 1000, stdin); if (itty) OemToChar(str, str);
str[strlen(str) - 1] = `\0`; if (strstr("привет", str)) strcpy(buf, "да, часть от 'привет'"); else strcpy(buf, "такого нет в слове 'привет'"); if(otty) CharToOem(buf, buf); puts(buf); }
В программе набрано в cp-1251 (она же ANSI).
При вводе с консоли, независимо от setlocale() придется переводить кодировку. Также обратите внимание, что параметры командной строки, набранные в консоли поступают в программу в кодировке cp-1251!!!
Кодировка в файлах обычно подразумевается в cp-1251, это надо учитывать при переадресации (>) вывода (stdout, stderr). Я продемонстрировал в примере, как это можно делать.
UPDATE
@insolor дал замечательный ответ как правильно программировать работу с русскими буквами в консоли Windows, используя стандартные функции SetConsoleCP(1251) и SetConsoleOutputCP(1251)
В обсуждении (комментариях) к его ответу можно найти различные детали, в частности установку русского шрифта.
Похоже его ответ прошел незамеченным для некоторых участников форума. Поэтому я решил привести функцию, вызов которой в самом начале упрощает программирование ввода/вывода русских букв в Windows и пример ее использования.
cons1251.c
#include
static int oldin = 0, oldout = 0;
static void exitfunc() { SetConsoleCP(oldin); SetConsoleOutputCP(oldout); }
void cons1251 () { if (oldin) return;
atexit(exitfunc);
oldin = GetConsoleCP(); oldout = GetConsoleOutputCP(); SetConsoleCP(1251); SetConsoleOutputCP(1251);
} rustest.c
#include // русский текст в кодировке cp1251 (она же ANSI) // обратите внимание, не нужен
main() { printf ("This is russian [аБвГдЕ] before cons1251()
"); cons1251(); printf ("This is russian [аБвГдЕ] after cons1251()
");
char str[1000], buf[1000];
printf ("Привет - введи часть от \"привет\"
"); fflush(stdout);
fgets(str,1000,stdin); str[strlen(str)-1] = 0;
printf("Вы ввели: '%s'
",str); if(strstr("привет",str)) printf("да, часть от 'привет'
"); else printf("такого нет в слове 'привет'
"); fflush(stdout);
puts("ждем ввода to exit..."); fflush(stdout); fgets(str,1000,stdin); }
Вызов fflush(stdout) при работе с консолью (tty) необязателен, однако для вывода в некоторых эмуляторах терминала (например в Emacs eshell) необходим.
Это пример компиляции (Windows 7, Emacs eshell) окно в cp1251 поэтому вывод русского текста и до и после cons1251() одинаковый (и правильный).
c:/Users/avp/src/cc/hashcode $ gcc -c cons1251.c c:/Users/avp/src/cc/hashcode $ gcc rustest.c cons1251.o -o rustest c:/Users/avp/src/cc/hashcode $ ./rustest This is russian [аБвГдЕ] before cons1251() This is russian [аБвГдЕ] after cons1251() Привет - введи часть от "привет" иве Вы ввели: 'иве' да, часть от 'привет' ждем ввода to exit...
c:/Users/avp/src/cc/hashcode $ c:/Users/avp/src/cc/hashcode $
К сожалению для стандартного cmd-окошка Copy/Paste не работает, так что попробуйте сами.
Для окна с PowerShell в Win 7 этот метод к сожалению не работает (в отличие от «геморройного» CharToOem/OemToChar).
Надеюсь этот текст окажется кому-то полезным.
UPDATE 2 (for @Rules)
Исходный файл tt.cpp
#include
extern "C" void cons1251(void);
main() { std::cout << "Привет, введите слово
"; cons1251(); std::cout << "Привет, введите слово
"; char str[100]; std::cin >> str; std::cout << "Вы ввели: " << str << std::endl; }
c:/Documents and Settings/avp/src/hashcode $ g++ tt.cpp cons1251.o -o tt c:/Documents and Settings/avp/src/hashcode $ ./tt Привет, введите слово Привет, введите слово йцукен Вы ввели: йцукен c:/Documents and Settings/avp/src/hashcode $
Пример вывода из эмулятора терминала Emacs eshell. Поэтому первый «Привет...» тоже состоит из нормальных букв. В обычной консоли там «кракозябры», а дальше нормальная кириллица.
Обращаю особое внимание. Перед запуском надо изменить шрифт в консоли на Lucida Console. Иначе будут кракозябры (но другие). Для замены шрифта кликаете правой кнопкой на надписи «Командная строка» окна консоли. В открывшемся меню выбираете «Свойства». В появившемся окне выбираете вкладку «Шрифт» и там выбираете «Lucida Console». Потом подтверждаете, что попросит.
Если при подтверждении выбрать пункт «Изменить ярлык для запуска этого окна», то новые окна командной строки будут уже с нужным шрифтом.
Вроде все.

Как заставить генератор случайных чисел давать дробные значения?

Не могу понять как заставить генератор случайных чисел давать дробные значения. Пробовал сделать так. A = rand() % 158.691+(-1.235); не получилось. Интервал от -1.235 и 157.456. #include #include #include using namespace std;
int main() { int N,M; int max = 157456, min = -1235; cout << "Enter size of matrix A:N " << endl; cin >> M; cout << "Enter size of matrix A:M " << endl; cin >> N; cout << "Creating matrix A:" << endl; // Создаётся матрица A float **A = new float* [M]; srand(time(NULL)); int i = 0; do { A[i] = new float [N]; i++; } while(i cout << endl << endl;
// Освобождение памяти for (int i = 0; i < N; i ++) delete [] A[i]; delete [] A; system("pause"); return 0; }


Ответ

На самом деле всё просто.
// Генерирует случайное действительное число от 0 до 1 (double)(rand())/RAND_MAX // Генерирует случайное действительное число от 0 до N (double)(rand())/RAND_MAX * N
Вот пример:
#include #include #include using namespace std;
// Функция, генерирующая случайное действительное число от min до max double random(double min, double max) { return (double)(rand())/RAND_MAX*(max - min) + min; }
int main() { srand((unsigned int)time(0)); cout << random(-1.235, 157.456) << endl; return 0; }
Здесь проверка.

Первые шаги в изучении GUI в С++

Здравствуйте. Вот начал изучать всем известный язык С++. Работа с консолей не было самым сложным этапом. Все давалось очень легко ибо до этого языка программирования имел опыт работы. Писал и тетрис и змейку в консоли. Все это очень прикольно, но хотелось бы не просто чёрный экрна, а что то больше, графический интерфейс, кнопочки всякие ну и т.п. Так вот, я слышал, что есть много библиотек таких как: OpenGL DirectX SDL Ну и другие. Что еще слышал об Qt, что стоит с него начинать. Так вот, собственно вопрос: С чего лучше начать? Может у кого-то есть литература или видео-уроки. Буду очень благодарен. Заранее спасибо.


Ответ

Так вам что именно нужно? Изучить кресты, или научиться делать всяческие...пардон, гуёвины (это от слова GUI, не подумайте плохого)?
Если второе, то C++ вряд ли можно назвать идеальным выбором для этого. Если первое, то лучше сконцентрироваться на возможностях самого языка, а конкретные задачи ставить себе уже по мере изучения. Что касается книг, то посмотрите ответы на этот вопрос
А вот что касается упомянутых вами библиотек, то они прямого отношения к ремеслу клепания окошек не имеют. Это библиотеки по работе с графикой. Если нет достаточных знаний языка и веских причин с ними связываться, то я бы на вашем месте не торопился в них углубляться, еще успеете

Си. Условные операторы в макроопределении препроцессора. Возможно ли?

Нужно исключить отладочные printf() из программы, применяя константу препроцессора. Обрамлять каждый вызов printf()
#if DEBUG == 1 printf(); #endif
не хочется. Можно ли сделать что-то типа:
#define printf(x,y) (if DEBUG == 1 printf(x,y) endif)
#if внутри макроопределений запрещены. Есть ли альтернатива?


Ответ

Можно определять макрос по разному в зависимости от значения DEBUG
#if DEBUG==1 #define printf_d(...) printf(__VA_ARGS__); #else #define printf_d(...) #endif
Но лучше сделать это немного по другому, проверяя не значение, а факт наличия макроопределения:
#ifdef DEBUG // . . .
Такой подход позволяет включить режим отладки простым указанием имени проверяемого макроса в Make-файле или даже в параметрах команды сборки.

Как правильно обнулить память?

Собственно очень интересует вопрос, если например массив нужно "обнулить", "очистить", не знаю как правильно выразится, чтобы туда не попал "мусор", нужно это делать мемсетом или можно заполнить массив нулями просто и это будет одно и тоже "{ 0 }", хотелось бы выслушать мнение людей с большим "опытом работы" в программировании, есть ли разница и может ли это повлечь какие-то проблемы в больших проектах(программах) или может это нужно делать как-то по другому?
OPENFILENAME ofn = { 0 }; ZeroMemory(&ofn, sizeof(ofn));
или
char FileName[260]; ZeroMemory(&FileName, sizeof(FileName));


Ответ

Для начала, локальные переменные необходимо инициализировать до первого чтения. Чтение неинициализтрованной переменной — очень серьёзная ошибка программиста, и может привести, например, к вылету программы. (Почитайте про undefined behaviour.)
Затем, код наподобие
OPENFILENAME ofn = { 0 };
уже есть инициализация, дополнительное «обнуление памяти» не нужно. (В современных версиях C++ обычно достаточно просто OPENFILENAME ofn = {};.)
В случае, когда вы объявляете массив, проще опять-таки попросить об инициализации компилятор (char FileName[260] = {};), чем обнулять массив вручную (ZeroMemory).
Другое дело, если вы хотите инициализировать массив ненулевым значением, это придётся делать вручную. Для «единичных» структур обычно можно всё ещё применять инициализацию:
MENUITEMINFO mii = { sizeof(MENUITEMINFO) };

Если вы собираетесь сразу же записывать данные в вашу структуру/массив, инициализация не имеет особого смысла. (Хотя хороший оптимизатор может увидеть это и выкинуть её.) Если вы собираетесь заполнять массив значениями, не имеет смысла перед этим прописывать всё нулями. Однако, если вы передаёте структуру/массив в чужую функцию, имеет смысл заранее посмотреть в документацию, читает функция эту структуру данных, или лишь заполняет её. Если вы твёрдо уверены, что функция лишь заполняет вашу структуру, можно пропустить инициализацию.

Программирование на android

Есть ли какие-нибудь приложения на Android, в которых можно писать код, который потом компилируется и запускается? Желательно, чтобы был один из известных языков, но главное, узнать есть ли IDE. Имеется ввиду, что код набирается в самом смартфоне


Ответ

Как ни странно, но это возможно. Вот по крайней мере одна ссылка. Интерпритатор паскаля. От себя добавлю, что на данный момент ни смартфоны, ни планшеты не позволяют заниматься программированием более-менее серьёзно. Может быть лет через 5-6... Сейчас основное предназначение (тех же планшетов) - потребление контента, а не его генерирование.

Как лучше всего убить зависший поток?

std::thread * tr1; tr1 = new std::thread([&]() { function(); // функция что то считает Sleep(3000000); // допустим это означает зависание });
Запущенный поток по каким то причинам завис, таймер определил, что поток выполняется дольше времени. Как можно убить поток, чтобы он не висел в памяти и не выполнял вычисления? В потоке нет никаких мьютексов и.т.д. Никакие переменные разрушится не смогут, туда передаётся указатель, который при обнаружении что таймер превышен задается в ноль. Больше поток ни с кем и ни с чем не контактирует.
Как его можно убить или поставить на паузу?


Ответ

Если на винде, то
TerminateThread(tr1->native_handle,0);
используйте на свой страх и риск :D

OpenGL шейдеры: стоит ли переходить на них?

Стоит ли сейчас переезжать с glBegin на шейдеры? Зачем их вообще ввели? Для каждого вида отрисовки свой писать что ли?


Ответ

Стоит, потому что, начиная с OpenGl es 2.0 для мобильных и opengl 3.2 для настольных отрисовка осуществляется исключительно при помощи шейдеров. Если Вы планируете использовать opengl в своей профессиональной деятельности - однозначно изучайте шейдеры и новые версии opengl. Кроме того, тут всплывают нюансы с поддержкой той или иной версии конкретной видеокартой и extensions.

Отправка POST запроса без перезагрузки страницы.

Как возможно и возможно ли вообще реализовать отправка POST запроса без перезагрузки страницы не подключая Ajax и jQuery?


Ответ

...