Здравствуйте. В мануале 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 - авось повезет.
Здравствуйте. Возникла проблема использования сокета.
Вот отдельный от проекта файл 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);
Есть скрипт, который проигрывает музыку на одной странице:
Но при переходе на другую страницу сайта музыка обрывается и начинает играть с самого начала вместо того, чтобы продолжить играть дальше. Три часа поисков в гугле ничего не дали, кроме замечаний в разных блогах, что "музыка на сайте - это плохо". Вдобавок ко всему, когда закрываешь сайт на планшете, музыка продолжает играть! И исчезает только при перезагрузке! Как это понимать? Подскажите, пожалуйста, плагин для бесконечного проигрывания фоновой музыке, которая продолжается при переходе по страницам.
Заранее спасибо!
Ответ
Судя по всему, у вас каждая страница подгружается самостоятельно. Т.е. при переходе между страницами каждый раз происходит загрузка страницы. Отсюда и сбрасывание текущего воспроизведения - плеер ведь не знает о том, что вы перешли между страницами. Для него каждая страница - это новое открытие страницы.
Отсюда вывод: надо либо сказать плееру, что мы проигрывали через куки (не знаю, есть ли плеер, который это может), либо делать автоподгрузку страниц (т.е. использовать шаблоны).
При использовании шаблонов у вас будет одна страница, контент которой меняется через AJAX-запросы. В таком случае ваш плеер можно будет расположить вне динамического контента, тогда он будет играть постоянно, даже при переходах между страницами.
Но плагин, который привел я, вроде как имеет один недостаток: все страницы доступны только по одному адресу. Поэтому нельзя будет дать ссылки на разные страницы (например, на контакты, меню и т.д.) - все ссылки будут вести только на главную страницу.
Но и это не проблема: некоторые плагины для jquery (и не только для него) поддерживают изменение строки браузера, при этом сам механизм работы остается прежним. Таким образом у каждой страницы будет свой собственный адрес (через хэштеги), но фактически работать вы будете по-прежнему с одной страницей. Т.е. ваш плеер будет продолжать играть без перерыва.
Так, например, сделано у VK и OK.
Насчет плеера, который через куки ловит, что надо проигрывать: не уверен, что такие вообще есть, т.к. в данном случае каждый раз при переходе между страницами придется загружать один и тот же аудиофайл (что не быстро).
Даже если файл будет быстро загружен, то при переходе между страницами все равно будет заикание, т.к. в момент перехода текущий dom будет уничтожен, а новый с плеером еще не загрузился.
А про фоновое воспроизведение на планшете: сам давно уже не работаю с html/js, поэтому точно не помню. Вроде как страница не закрывается, а просто сворачивается, поэтому воспроизведение и продолжается. Все, что надо, - ловить момент сворачивания и ручками останавливать воспроизведение, при разворачивании - продолжать воспроизведение.
Хотя еще раз - уже давно не работал с этим, может быть, там какие-то другие особенности.
Всем привет.
Я в 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