Страницы

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

среда, 27 февраля 2019 г.

Длина соли и длина выходной стройки алгоритма blowfish

Здравствуйте. В мануале php сказано, что Blowfish-шифрование использует соль след. формата: "$2a$", весовой параметр из двух цифр, "$" и 22 цифры из алфавита "./0-9A-Za-z" . Но на деле вместо 22 у меня почему-то используется только 21 символ. $var = "1111111111111111111112";//22-й символ помечен двойкой
echo strlen($var);//выводит 22
echo crypt("12345", "$2a$11$".$var);// выводит $2a$11$111111111111111111111uDWduZDJM79lPV0duPxKCR2XEmS5ly2q Как видно 22-й символ обрезался и не попал в соль. Вопрос1: Как объяснить выше описанное поведение? Вопрос2: У меня на php длина выходной строки (хэша с солью) всегда равна 60 байт (ну или 60 символов латинского алфавита). Это общий стандарт? стандарт php? Если да, то где описан? Спасибо.


Ответ

Соль задается из алфавита "./0-9A-Za-z" (64 символа), т.е. каждый символ представляет из себя 6 бит. Это напоминает кодировку BASE64. Вы задаете 22 символа это 22*6 = 132 бита. Для Blowfish соль используется 128 бит из-за этого последние 4 бита не используется. Когда выводится результат, то 128 бит также дополняются 4 нулевыми битами, т.е. от последнего символа остается только 2 старших бита. В вашем примере: 2 (111000) -> u(110000), т.е. последний символ Вы можете задавать любой с точность до 2-х старших битов и это не будет влиять на хэш.

Как продолжить выполнение цикла, если словили исключение?

Здравствуйте. Имеется вот такой цикл. String s; while ((s = in.readLine()) != null) { System.out.println(s); } Метод readLine() бросает IOException. Я могу конечно обернуть весь цикл в try-catch, но тогда при возникновении исключения цикл прервётся. Могу в методе, в котором находится этот код дописать throws IOException, но всё равно цикл прервётся. А как сделать, чтобы не прерывался? Неужели только так? String s; while (true) { try { s = in.readLine(); } catch (IOException e) { System.out.println(e); } if(s == null) {break;} System.out.println(s); } Это же как-то не красиво..


Ответ

Да, только так. Если вас смущает конструкция try/catch внутри цикла, можете вынести её в отдельный метод, не бросающий исключений, и глушить исключения там: public void doSth() { // ваш код
String s; while (true) { s = readNextLine(in); if(s == null) {break;} System.out.println(s); }
// ваш код }
private String readNextLine(Reader in) { String s; try { s = in.readLine(); } catch (IOException e) { System.out.println(e); } return s; }

Как программно определить, размыто ли изображение?

Доброго времени суток. Как программно определить, размыто ли фото? Нужно определить, размыто ли фото, и если да, то не дать отправить его на сервер. Возможно, есть какие-то библиотеки или готовые решения? Заранее спасибо.


Ответ

Для этого применяется т.н. алгоритм преобразования Фурье - для обыденного понимания достаточно рассматривать это как разложение сигнала на набор синусоид (сейчас закидают тапочками математики...). Изображение надо рассматривать как двумерный сигнал и, соответственно, разложить его в двумерный ряд Фурье, полученный сигнал проанализировать. В реальных вычислениях применяется дискретное преобразование Фурье - принято обозначать это как FFT - Fast Fourier Transformation. Если в сигнале слишком мало высокочастотных компонент, значит изображение размыто. Что такое слишком много или слишком мало - устанавливайте сами. Для упрощения анализа опять-таки принято полученный сигнал (а по сути новый битмап) проинтегрировать (например, Лапласом) и получить одномерный вектор, который-таки более удобен для анализа. В общем, как-то так. Гуглите по ключевому слову FFT+Java - авось повезет.

Создание Android приложений. Sockets

Здравствуйте. Возникла проблема использования сокета. Вот отдельный от проекта файл Client.java, который служит для проверки соединения в консольном режиме:
import java.net.Socket; import java.net.UnknownHostException; import java.io.*;
public class Client { static AffableThread mSecondThread; public static void main(String[] args) { mSecondThread = new AffableThread(); mSecondThread.start(); } } class AffableThread extends Thread { @Override public void run() { System.out.println("Абракадабра"); try{ Socket socket = new Socket("127.0.0.1", 5555); }catch(UnknownHostException e){}catch(IOException e){} System.out.println("Подключайся любезнейший!"); } }
Работает на ура, подключается к серверу без проблем. Но стоит мне распихать элементы этого кода по моему основному коду, то выдает ошибкy:
> FATAL EXCEPTION: main > java.lang.NullPointerException


Ответ

Без логов ошибки сложно сказать, но вот мои предположения: Нет разрешения в манифесте на интернет Работа с сетью идёт в основном потоке (т.е. в onCreate() активити или фрагмента). Так с определённой версии андроида низзя. Надо делать в отдельном потоке. Например в Service или AsynkTask. Если всё же использовать Service, то надо про него почитать доки И делать как-то так: Создаём класс, расширяющий класс android.app.Service public class MyService extends Service { @Override public void onCreate() {
}
@Override public int onStartCommand(Intent intent, int flags, int startId) { //вот тут можно работать с сетью без проблем. return super.onStartCommand(intent, flags, startId); }
@Override public void onDestroy() { }
@Override public IBinder onBind(Intent intent) { return null; } } Теперь его надо прописать в манифесте: И наконец, теперь можно вызвать всё это из активити: Intent intent = new Intent(this, MyService.class); this.startService(intent);

Mp3 аудио продолжает играть при переходе по страницам

Есть скрипт, который проигрывает музыку на одной странице: Но при переходе на другую страницу сайта музыка обрывается и начинает играть с самого начала вместо того, чтобы продолжить играть дальше. Три часа поисков в гугле ничего не дали, кроме замечаний в разных блогах, что "музыка на сайте - это плохо". Вдобавок ко всему, когда закрываешь сайт на планшете, музыка продолжает играть! И исчезает только при перезагрузке! Как это понимать? Подскажите, пожалуйста, плагин для бесконечного проигрывания фоновой музыке, которая продолжается при переходе по страницам. Заранее спасибо!


Ответ

Судя по всему, у вас каждая страница подгружается самостоятельно. Т.е. при переходе между страницами каждый раз происходит загрузка страницы. Отсюда и сбрасывание текущего воспроизведения - плеер ведь не знает о том, что вы перешли между страницами. Для него каждая страница - это новое открытие страницы. Отсюда вывод: надо либо сказать плееру, что мы проигрывали через куки (не знаю, есть ли плеер, который это может), либо делать автоподгрузку страниц (т.е. использовать шаблоны). При использовании шаблонов у вас будет одна страница, контент которой меняется через AJAX-запросы. В таком случае ваш плеер можно будет расположить вне динамического контента, тогда он будет играть постоянно, даже при переходах между страницами. Но плагин, который привел я, вроде как имеет один недостаток: все страницы доступны только по одному адресу. Поэтому нельзя будет дать ссылки на разные страницы (например, на контакты, меню и т.д.) - все ссылки будут вести только на главную страницу. Но и это не проблема: некоторые плагины для jquery (и не только для него) поддерживают изменение строки браузера, при этом сам механизм работы остается прежним. Таким образом у каждой страницы будет свой собственный адрес (через хэштеги), но фактически работать вы будете по-прежнему с одной страницей. Т.е. ваш плеер будет продолжать играть без перерыва. Так, например, сделано у VK и OK. Насчет плеера, который через куки ловит, что надо проигрывать: не уверен, что такие вообще есть, т.к. в данном случае каждый раз при переходе между страницами придется загружать один и тот же аудиофайл (что не быстро). Даже если файл будет быстро загружен, то при переходе между страницами все равно будет заикание, т.к. в момент перехода текущий dom будет уничтожен, а новый с плеером еще не загрузился. А про фоновое воспроизведение на планшете: сам давно уже не работаю с html/js, поэтому точно не помню. Вроде как страница не закрывается, а просто сворачивается, поэтому воспроизведение и продолжается. Все, что надо, - ловить момент сворачивания и ручками останавливать воспроизведение, при разворачивании - продолжать воспроизведение. Хотя еще раз - уже давно не работал с этим, может быть, там какие-то другие особенности.

Как питоном загрузить ресурс из jar файла?

Всем привет. Я в python/jython новичок. Возникла проблема: надо загрузить файлы из определенного каталога. Локально, никаких проблем for name in glob.glob("%s/*.json" % some_path): log.debug(name) definition = json.loads(file(name).read()) Проблемма вот в чем: основная аппликация на java распространяется как jar(s), и все ресурсы тоже сидят в jar'e. Путь к папке ресурсов определяется в jave: URL resourceURL = CommonMethods.class.getClassLoader().getResource(resourceName); String resourcePath = resourceURL.getPath(); String dirPath = resourcePath.substring(0, resourcePath.lastIndexOf("/")+1); Если ресурс в jar'e, то получаем dirPath="file:/opt/lib/core-lib-1.0.jar!/rulz/" И glob.glob() не работает, думаю, что file(name).read() тоже. :( Подскажите, как читать файлы питоном из jar'a?


Ответ

А вот так не подойдет?
def show_jar_classes(jar_file): """prints out .class files from jar_file""" zf = zipfile.ZipFile(jar_file, 'r') try: lst = zf.infolist() for zi in lst: fn = zi.filename if fn.endswith('.class'): print(fn) finally: zf.close()
То есть действуем так как-будто jar эквивалентен zip (взял здесь).

Открытие ассоциированных с программой файлов в уже запущенном экземпляре программы (вместо запуска нового)

Для того, чтобы открыть ассоциированный файл, программа проверяет при запуске были ли переданы в нее какие-либо параметры. Для простоты можно представить, что открывается текстовый файл.
private static void Main(string[] args) { if(args != null && args.Length > 0) { string fileName = args[0]; // дальше что-то делаю с файлом } }
Проблема в следующем. Если я открываю с помощью проводника очередной файл, то открывается новая копия программы, а мне надо, чтобы файл открывался в уже открытой копии, если она есть или открывал, если нет.


Ответ

Есть следующий способ запуска только одной сущности любого .NET приложения:
При запуске создаем и пытаемся залочить мьютекс. Если это удалось -- это первый инстанс приложения. Если взять лок не удалось -- значит, наше приложение уже запущено (поскольку мьютекс является объектом ОС и шарится между всеми процессами). Если мы обнаружили, что приложение уже запущено, нам нужно передать сообщение (в вашем случае -- путь к файлу) запущенному процессу. Это можно сделать любым из способов межпроцессорного взаимодействия: сообщения Windows, веб-сервис и т.д. При любом выходе из приложения (нормальном или аварийном) не забываем освобождать мьютекс. Пример правильного использования мьютекса -- тут
В случае Windows Forms приложения есть более простой способ, описанный на StackOverflow