Страницы

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

четверг, 23 января 2020 г.

Распознавание дубликатов видео

#алгоритм #видео #распознавание


Ищу open-source проект для решения следующей задачи:
Дано множество видеофайлов, среди которых нужно найти одинаковые. При этом одинаковые
видеозаписи в разном качестве и под разными кодеками тоже должны детектиться. То есть
сравнение по хэшу или по длине не подойдет, нужен глубокий анализ.
Лучшее, что я сейчас нашел -- это SOTU, но его исходники закрыты.
Так же буду благодарен за ссылки на хорошую теорию по этой теме.    


Ответы

Ответ 1



Как вариант от себя: если транскодер ничего не делает с видео, а только ужимает его (т.е. таймлайн остается равный), то можно сделать так (ну чисто теоретически): разделить видео на несколько кадров (сколько душе угодно) сравнить эти кадры Методы сравнения изображений можно подчерпнуть тут: http://compsciclub.ru/node/2003

Как прикрепить патч для dll к проекту?

#sdl #opengl #cpp #dll


Я написал приложение на SDL + OPENGL + C++ в CodeBlocks. Обнаружил, что при запуске
исполняемого файла, скомпилированного в релизе (при запуске в релизе в самой среде
всё отлично работает) приложение некоторые .png файлы не загружает (а именно png-24)
и выдаёт в файл для ошибок (stderr) "libpng warning: Interlace handling should be turned
on when using png_ read_ image". Как выяснилось, sdl_ image использует такую libpng(а
именно libpng15-15.dll, другие я пробовал, sdl_image вроде требует именно эту либу),
в которой функция png_read_image имеет ошибку. Я долго искал решение (png-24 нужны),
качал вроде бы более новые версии libpng, но всё тщетно. Нашёл патч, который должен
фиксить эту ошибку:
--- libpng-1.5.0/pngread.c.ark  2011-01-14 12:27:23.440018507 +0100
+++ libpng-1.5.0/pngread.c  2011-01-14 12:28:02.866685173 +0100
@@ -841,7 +841,7 @@ png_read_image(png_structp png_ptr, png_
    }
    else
    {
-      if (!(png_ptr->transformations & PNG_INTERLACE))
+      if (png_ptr->interlaced && !(png_ptr->transformations & PNG_INTERLACE))
   {
      /* Caller called png_start_read_image or png_read_update_info without
       * first turning on the PNG_INTERLACE transform.  We can fix this here,

но не пойму? как его прицепить к  проекту. Скомпилировать свою libpng из исходников
пока не получается (очень не хочется этим заниматься). Помогите пожалуйста!    


Ответы

Ответ 1



Вам придётся скомпилировать libpng. Патч предназначен для исходников, к исходникам его и надо применять. Вы не сможете так просто применить патч исходников для бинарника. В качестве ненадёжной альтернативы, можно попробовать дизассемблировать код libpng, найти нужную функцию, и применить патч вручную. Однако, это имеет право не сработать -- например, если оптимизатор заинлайнил кое-где вызов этой функции. Короче говоря, легче скомпилировать. Кстати, может быть, легче будет уговорить sdl_image использовать другую версию libpng?

Ответ 2



Итак, нашёлся ответ. Собственно я нашёл решение только по другим странностям, когда релиз и дебаг версии начали работать совсем не так, как скомпилированные .ехе. начали вылетать ошибки на простейших функциях opengl и сам .ехе вариант очень тормозил. Оказывается я в начале сунул какую-то кривую версию библиотеки opengl в папку и компилятор работал с нормальной, а вот ехе с кривой.

Запуск приложений на Qt 5.0.1 на других компьютерах

#windows #qt #cpp


На моем рабочем компьютере стоит Qt 5.0.1 (MinGW сборка), собираю проект, кидаю все
нужные либы в папку, запускаю - работает. Убрал из настроек переменных окружения специально,
что бы убедиться, что все чисто, все пути связанные с Qt, все равно работает. При запуске
же на любом другом компьютере, на котором не стоит Qt SDK, вылетает рантайм эррор,
причем на разных разный, где то с указанием пути к запускаемому экзешнику, где то просто
с телом ошибки. 
MS Visual C++ Redistributable стоят, даже переустанавливал специально вручную - безрезультатно.
В чем может быть проблема? Как это можно исправить? Может ли это быть какой либо
косяк самой оффициальной сборки Qt, скачанной с сайта http://qt-project.org/downloads
?     


Ответы

Ответ 1



@KoVadim , спасибо огромное! Скачал утилиту Process Monitor по ссылке, которую вы дали, запустил свое приложение на компе, на котором оно не работает, потом запустил эту утилиту, сделал фильтр по имени моего приложения, и увидел кучу запросов к различным dll и ресурсам реестра, в итоге нашел один путь с пометкой , и взял с машины с установленным Qt SDK эту папку со всем вложенным содержимым и закинул с полным сохранением имени на машину с проблемой запуска приложения. Папка эта - c:\Qt\Qt5.0.1\5.0.1\mingw47_32. Запустил приложение и, о чудо, оно заработало! В итоге методом последовательного исключения удалил все ненужное из этой папки (в ней было вложено8 папок с либами). Оказалась нужной только одна - platforms. потом эту папку просто переместил в папку с моим приложением и все продолжиоло работать. Ну еще удалил из этой папки дебаг версии библиотек (те, что оканчиваются на *d.dll) и все.

Ответ 2



libEGL.dll должен решить эту проблему. Dependency Walker здесь бесполезен.

Чтение файлов из asset Android

#android #java #файлы


В простом Java приложении все просто. Используется BufferReader.
try {           
    BufferedReader in = new BufferedReader(new FileReader("dictionary.txt"));
        while ((word = in.readLine()) != null) {
            dictionary.put(word, 0);
        }
        in.close();            
    } catch (FileNotFoundException e) {
        e.printStackTrace();           
    }

И тогда все строки файла записаны в HashMap, с которым дальше работаем.
Но как сделать так, что бы Android увидел этот файл. Файл лежит в папке asset. Как
бы логично что: 
try {
        AssetManager assetManager;          
        BufferedReader in = new BufferedReader(assetManager.open("dictionary.txt"));
        while ((word = in.readLine()) != null) {
            dictionary.put(word, 0);
        }
        in.close();
        //assetManager.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();           
    }

Но нет, ошибка. Как достать этот файл?
UPD *SOLVED*
Метод:
public static void loadDictionary (Context context) throws IOException {    
        try {
            AssetManager assetManager = context.getAssets();
            InputStreamReader istream = new InputStreamReader(assetManager.open("dictionary.txt"));
            BufferedReader in = new BufferedReader(istream);

            while ((word = in.readLine()) != null) {
                dictionary.put(word, 0);
            }
            in.close();
        } catch (FileNotFoundException e) {
            // FileNotFoundExpeption       
        } catch (IOException e) {
            // IOExeption
        }       
}

Вызов:
try {
    Spell.loadDictionary(getBaseContext());
} catch (IOException e) {
    //IOExpeptino
}

Спасибо user - afiki    


Ответы

Ответ 1



AssetManager assetManager = this.getAssets(); а ты пытаешься вызвать метод у null. try { AssetManager assetManager = this.getAssets(); InputStreamReader istream = new InputStreamReader(assetManager.open("dictionary.txt")); BufferedReader in = new BufferedReader(istream); while ((word = in.readLine()) != null) { dictionary.put(word, 0); } in.close(); } catch (FileNotFoundException e) { e.printStackTrace(); }

Как средствами JS сформировать GUID по маске?

#javascript


Здравствуйте!

Стоит задача средствами JavaScript сформировать GUID (статистически уникальный 128-битный
идентификатор) по маске xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx например 8d7385ad-b837-4953-814e-z6789c27c631.

Если у кого есть готовое решение, поделитесь, пожалуйста...    


Ответы

Ответ 1



@t1nk, как-то непонятно. Вроде и со стэка скопировали, но вроде и не так как там. Копируйте без ошибок в следующий раз: 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); return v.toString(16); }); В таком виде результат будет соответствовать версии The randomly or pseudo-randomly generated version По ссылке ниже чей-то труд по дизассемблированию микрософтовой генерации GUID, если так сильно хочется правильный GUID- реализуйте на JavaScript http://www.gotdotnet.ru/blogs/denish/1965/

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

#c_sharp #изображения


Декартова система координат. Черно белое изображение. 
Центр находиться самостоятельно, основываясь на данных по общей площади изображения
(центр тяжести).

Далее из центра нужно проводить лучи под углами от 0 до 360 с заданным шагом (например,
5 градусов). И для каждого луча, считать количество черных пикселей на нем.

Как пробовал считать я. Луч брал за гипотенузу, и через тангенс угла - находил противолежащий
катет. Проделывал эту операцию для каждого пикселя по оси Х, и на пересечении координат
пикселей Х и величины катета - проверял черный пиксель или нет.

Но данные какие то слишком неточные. Для изображения буквы "К" я получил почти одинаковые
значения количества пикселей на всех лучах. Подозреваю, что я считаю не правильно.
Делаю это на C# .NET.

Сама задача академическая. В чем суть. Строиться гистограмма, которая показывает
отношение количества пикселей к углу луча. Для изображений символов, эти гистограммы
субъективно похожи. Грубо говоря, для одного символа разных шрифтов - гистограммы будут
схожи.

Координаты центра тяжести находятся по формулам. 

Для координаты Х 


Для координаты Y


Функция A(). Значение равно 1 - если пиксель черный, 0 - если белый.

Посоветуйте что-то или подскажите решение.
    


Ответы

Ответ 1



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

Не правильная работа анимации CSS3

#css3 #анимация


Приветствую!

Решил попробовать написать часы с помощью CSS3 трансформаций, но столкнулся с проблемой
слишком медленной анимацией.

Например я задаю анимацию секундной стрелки, которая за 1 минуту должна повернуться
на 360 градусов, но вместо минуты она поворачивается немного медленнее и из за этого
часы начинают "отставать". В чем может быть проблема и как ее можно решить?

Код тут: jsfiddle

HTML

CSS .clock { border: 1px solid; width: 300px; height: 300px; border-radius: 100%; position: relative; } .hour { height: 40%; width: 5px; background: red; position: absolute; left: 50%; top: 10%; margin-left: -3px; -webkit-transform-origin: 50% 100%; -webkit-animation: hour 43200s linear infinite; } .minute { height: 46%; width: 3px; background: green; position: absolute; left: 50%; top: 5%; margin-left: -2px; -webkit-transform-origin: 50% 100%; -webkit-animation: min 3600s linear infinite; } .secunde { height: 50%; width: 3px; background: #ccc; position: absolute; left: 50%; margin-left: -2px; -webkit-transform-origin: 50% 100%; -webkit-animation: sec 59s linear infinite; } @-webkit-keyframes sec { from { -webkit-transform: rotate(252deg); } to { -webkit-transform: rotate(360deg); }; } @-webkit-keyframes min { from { -webkit-transform: rotate(72deg); } to { -webkit-transform: rotate(360deg); }; } @-webkit-keyframes hour { from { -webkit-transform: rotate(360deg); } to { -webkit-transform: rotate(360deg); }; } #js-clock { width: 300px; height: 300px; border: 1px solid; border-radius: 100%; }


Ответы

Ответ 1



Из-за времени выполнения скрипта и других причин ориентироваться на счётчик не правильно. Как вариант предлагаю несколько путей решения: Использовать меньшее время задержки, чтобы учесть отставание. Реализовать часы с помощью js с проверкой времени на сервере.

Порядок выполнения функций

#c_sharp #unity3d


Есть GameObject. В нем 2 компонента: MainLevelSetting и RespawnController.
Классе MainLevelSetting: 
 void Start () {
        Debug.Log( "Start MainLevelSetting" );
        GetComponent().RespawnHero();
    }

И в RespawnController:
void Start () {
Debug.Log( "Start RespawnController" );
}

public void RespawnHero(){
   Debug.Log( "RespawnHero" );
}

Поле запуска, в консоле отоброжается:
"Start MainLevelSetting"
"RespawnHero" 
"Start RespawnController"
То есть сначала вызывается метод класса, а потом только метод инициализируется!
Где ошибка и как исправить?     


Ответы

Ответ 1



Нашел статью про порядок событий http://habrahabr.ru/post/147315/ и понял что я заблуждался! Start вызывается не при инициализации класс( я думал что это аналог конструктора из С++ ), а До первого обновления кадров Start: вызывается перед прорисовкой первого фрейма, только если сценарий определён. А (может не совсем правильно выражусь) аналог является функция: Первая загрузка сцены Эти функции вызываются, когда сцена стартует (по одному разу для каждого объекта в кадре). Awake: Эта функция всегда вызывается до начала любых функций, а также сразу после инициализации префаба. То есть то что нужно!! Но для моего случая больше подошло переделать методы. Так что думаю ответ на вопрос найден! =)

Неявное поведение поля NSManagedObject'а

#objective_c #ios #coredata


Имею некий NSManagedObject-обьект названный, скажем Object. У него есть поле info
типа NSString. По логике программы я должен иметь возможность сохранить в это поле
пустое значение, то есть строку нулевой длины. При сохранении я так и поступаю. Но
когда я фетчу данный обьект из Core Dat'ы и логирую значение этого поля оно уже равно
(null). Если была сохранена строка ненулевой длины то она отдается корректно. Если
это ошибка то не понимаю на каком этапе я могу ее допустить. В целях теста присваиваю
значение полю, делаю save контексту и сразу тут же его фетчу. Получаю такой результат.
Чем может быть обусловлено такое поведение?    


Ответы

Ответ 1



Ах, как я люблю вопросы, в которых (без бутылки) без research effort'а сразу и не разобраться. Если серьёзно, то мои тесты не подтверждают то, что вы говорите: ниже я привожу два тестовых сценария (у меня они оба выполняются). User - это просто тестовая entity, которая имеет поле name типа string с включенной (это дефолт у Xcode) опцией "optional" (то есть оно необязательное, то есть может быть nil'ом), я полагаю, что у вас на вашем текстовом поле optional тоже включено. Так вот первый сценарий - это мы приравниваем name тестового пользователя к пустой строке @"", сохраняем контекст и фетчим его заново. И убеждаемся, что поле таки является пустой строкой. Второй сценарий - это мы заведомо приравниваем name к nil и закономерно убеждаемся после фетча, что name - это nil. Вывод из всего этого такой: похоже вы сохраняете не строку, а nil. Некоторое время назад я создал на Github специальный репозиторий для того, чтобы изучать разные тонкости устройства Cocoa. Для этого я просто прописываю подробные тесты для соответствующих аспектов поведения Core Data или NS-объектов, которые хочу изучить. Ваш случай я только что расположил здесь см. CoreData_Integration. Если будет желание освоить такой Test-Driven способ изучения тонкостей Cocoa, можно постучаться ко мне в скайп, и я объясню, как это работает, так как инструкции по эксплуатации проекта пока что нет. describe(@"Behavior of string-NSString fields", ^{ context(@"When a string field is set to empty string", ^{ it(@"should return its value as an empty string (not nil!)", ^{ User *user = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([User class]) inManagedObjectContext:managedObjectContext()]; user.name = @""; [managedObjectContext() save:nil]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"User"]; NSError *error; NSArray *fetchResult = [managedObjectContext() executeFetchRequest:fetchRequest error:&error]; if (error) { NSLog(@"Error %@", error); } user = (User *)[fetchResult lastObject]; [[user.name should] equal:@""]; }); }); context(@"When a string field is set to nil", ^{ it(@"should return its value as nil", ^{ User *user = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([User class]) inManagedObjectContext:managedObjectContext()]; user.name = nil; [managedObjectContext() save:nil]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"User"]; NSError *error; NSArray *fetchResult = [managedObjectContext() executeFetchRequest:fetchRequest error:&error]; if (error) { NSLog(@"Error %@", error); } user = (User *)[fetchResult lastObject]; [[user.name should] beNil]; }); }); });

Сортировка английских и русских слов в NSArray

#objective_c #сортировка


Нужно отсортировать массив так, чтобы сначала шли слова на Русском, а только потом
на Английском.
Пробовал разные compare функции localizedCompare: localizedCaseInsensitiveCompare:
localizedStandardCompare: и compare:options:range:locale: , не помогло. Подскажите
пожалуйста, кто сталкивался
Пример:
@[Abc, Bcd, Абв, Def, Бвг]; - входящий массив
@[Абв, Бвг, Abc, Bcd, Def]; - то что нужно получить
    


Ответы

Ответ 1



Если массив содержит только русские и английские слова, то можно создать 2 вспомогательные строки с английским и русским алфавитом. В сортировке брать первую по индексу букву из слова, приводить к нижнему регистру(если не нужно сортировать слова с большой и маленькой буквы), узнавать к какому языку она принадлежит и сравнивать слова между собой если они одного языка. Вот так: NSArray* words = @[@"Abc",@"Bcd",@"Grf",@"Влд",@"Гдр",@"Жзн",@"Hbr",@"Абв",@"Def",@"Бвг",@"Cdf",@"Acf",@"Aba"]; NSString* englishChar = @"abcdefghijklmnopqrstuvwxyz"; NSString* russianChar = @"абвгдеёжзийклмнопрстуфхцчшщъыьэюя"; NSArray* sortWords = [words sortedArrayUsingComparator:^NSComparisonResult(NSString* obj1, NSString* obj2) { NSString* prefixObj1 = [[obj1 lowercaseString] substringToIndex:1]; NSString* prefixObj2 = [[obj2 lowercaseString] substringToIndex:1]; if ([englishChar containsString:prefixObj1]) { if ([englishChar containsString:prefixObj2]) { return [obj1 compare: obj2]; } else { return 1; } } else if ([russianChar containsString:prefixObj1]) { if ([russianChar containsString:prefixObj2]) { return [obj1 compare: obj2]; } else { return 0; } } return [obj1 compare: obj2]; }];

Ответ 2



Столкнулся с похожей задачкой, решил ее на js, надеюсь, кому-то будет полезно. var arr =["ФОРМАТЧИСЛО","formatNumber", "test", "лал","QWER"]; arr.sort((a: string, b: string) => { const temp = a.toLowerCase().trim(); return temp.search(/[а-яё]/g) >= 0 ? -1 : temp.search(/[\w]/g) >= 0 ? 1 : 0; });

Анимация на iOS7 не работает (на iOS6 все ОК)

#objective_c #анимация #ios #ios7


С переходом на Xcode 5 и iOS7 SDK получил проблему при адаптации приложения под новую ось.
Типичный код анимации перемещаения отказывается работать. На устройствах со старой
iOS все нормально, а на новой анимация не визуализируется:
[UIView animateWithDuration:0.5 animations:^(void){
               self.ItemPhoto.alpha = 0;
            }
             completion:^(BOOL finished) {
                 self.ItemPhoto.frame = CGRectMake(70, 20, self.ItemPhoto.frame.size.width,self.ItemPhoto.frame.size.height);

                 self.ItemPhoto.alpha=1;
             }];

По факту картинка меняет свою позицию, но без анимации    


Ответы

Ответ 1



Попробуйте сделать вот так: self.ItemPhoto.alpha = 0; // Откуда вы начинаете анимацию [UIView animateWithDuration:0.5 animations:^(void){ // А это куда вы хотите прийти в течение 0.5 секунд self.ItemPhoto.frame = CGRectMake(70, 20, self.ItemPhoto.frame.size.width, self.ItemPhoto.frame.size.height); self.ItemPhoto.alpha=1; } completion:^(BOOL finished) { // А это запускается __после__ того, как 0.5 секунд прошли }]; Надеюсь, я правильно понял логику вашей анимации.

Хотел узнать насчет адаптивной верстки, как правильно прописывать медиа запросы?

#media_queries #html #css


Проверяю сайт на смартфоне 480 на 800. Пишу верстку если смартфон горизонтально расположен,
то-есть ширина его 800px. Написал медиа запрос @media screen and (max-width:800px).
Но почему то не отображает такая раскладка блоков, как написано в стилях для данного
медиа запроса. Подскажите как правильно верстать адаптивно. И как правильно прописывать
медиа запрос для девайсов.    


Ответы

Ответ 1



Вот тут можно очень детально посмотреть /* Smartphones (portrait and landscape) ----------- */ @media only screen and (min-device-width : 320px) and (max-device-width : 480px) { /* Styles */ } /* Smartphones (landscape) ----------- */ @media only screen and (min-width : 321px) { /* Styles */ } /* Smartphones (portrait) ----------- */ @media only screen and (max-width : 320px) { /* Styles */ } /* iPads (portrait and landscape) ----------- */ @media only screen and (min-device-width : 768px) and (max-device-width : 1024px) { /* Styles */ } /* iPads (landscape) ----------- */ @media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : landscape) { /* Styles */ } /* iPads (portrait) ----------- */ @media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : portrait) { /* Styles */ } /********** iPad 3 **********/ @media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : landscape) and (-webkit-min-device-pixel-ratio : 2) { /* Styles */ } @media only screen and (min-device-width : 768px) and (max-device-width : 1024px) and (orientation : portrait) and (-webkit-min-device-pixel-ratio : 2) { /* Styles */ } /* Desktops and laptops ----------- */ @media only screen and (min-width : 1224px) { /* Styles */ } /* Large screens ----------- */ @media only screen and (min-width : 1824px) { /* Styles */ } /* iPhone 4 ----------- */ @media only screen and (min-device-width : 320px) and (max-device-width : 480px) and (orientation : landscape) and (-webkit-min-device-pixel-ratio : 2) { /* Styles */ } @media only screen and (min-device-width : 320px) and (max-device-width : 480px) and (orientation : portrait) and (-webkit-min-device-pixel-ratio : 2) { /* Styles */ } /* iPhone 5 ----------- */ @media only screen and (min-device-width: 320px) and (max-device-height: 568px) and (orientation : landscape) and (-webkit-device-pixel-ratio: 2){ /* Styles */ } @media only screen and (min-device-width: 320px) and (max-device-height: 568px) and (orientation : portrait) and (-webkit-device-pixel-ratio: 2){ /* Styles */ } /* iPhone 6 ----------- */ @media only screen and (min-device-width: 375px) and (max-device-height: 667px) and (orientation : landscape) and (-webkit-device-pixel-ratio: 2){ /* Styles */ } @media only screen and (min-device-width: 375px) and (max-device-height: 667px) and (orientation : portrait) and (-webkit-device-pixel-ratio: 2){ /* Styles */ } /* iPhone 6+ ----------- */ @media only screen and (min-device-width: 414px) and (max-device-height: 736px) and (orientation : landscape) and (-webkit-device-pixel-ratio: 2){ /* Styles */ } @media only screen and (min-device-width: 414px) and (max-device-height: 736px) and (orientation : portrait) and (-webkit-device-pixel-ratio: 2){ /* Styles */ } /* Samsung Galaxy S3 ----------- */ @media only screen and (min-device-width: 320px) and (max-device-height: 640px) and (orientation : landscape) and (-webkit-device-pixel-ratio: 2){ /* Styles */ } @media only screen and (min-device-width: 320px) and (max-device-height: 640px) and (orientation : portrait) and (-webkit-device-pixel-ratio: 2){ /* Styles */ } /* Samsung Galaxy S4 ----------- */ @media only screen and (min-device-width: 320px) and (max-device-height: 640px) and (orientation : landscape) and (-webkit-device-pixel-ratio: 3){ /* Styles */ } @media only screen and (min-device-width: 320px) and (max-device-height: 640px) and (orientation : portrait) and (-webkit-device-pixel-ratio: 3){ /* Styles */ } /* Samsung Galaxy S5 ----------- */ @media only screen and (min-device-width: 360px) and (max-device-height: 640px) and (orientation : landscape) and (-webkit-device-pixel-ratio: 3){ /* Styles */ } @media only screen and (min-device-width: 360px) and (max-device-height: 640px) and (orientation : portrait) and (-webkit-device-pixel-ratio: 3){ /* Styles */ }

Проигрывание видео в элементе video со встроенного http-сервера на айоси

#video #ios #html5


Есть приложение на obj-c, в которое встроен http-сервер (использовался вот из этого
примера, вроде почти без изменений,"вроде" т.к. весь проект мне в наследство достался),
к которому идут запросы из UIWebView, в отображающемся html имеется тег video который
не работает. Вопрос - какими свойствами должен обладать сервер чтобы видео проигрывалось.
Видео передается корректно, у него определены Content-type, content-length, Content-Range,
то что это действительно так проверялось как с помощью загрузки видео NSURLConnection
(заодно сохранил полученые данные в другое место и проверил что мд5 совпали), так и
прямо в js с помощью XMLHttpRequest в том же месте где динамически добавлялся этот
тег, в том же файле есть аудио и оно работает. Если страничку грузить из интернета
то все хорошо, а вот с внутреннего сервера не хочет    


Ответы

Ответ 1



Сам отвечу на свой вопрос, приведенный сервер не умеет показывать видео, но помогает вот этот сервер, только есть одна особенность - по какой-то причине в iOs 7 видео не будет проигрываться для localhost, надо использовать 127.0.0.1 На всякий случай уточню, что потомка NSURLConnection тоже пробовал, с ним не работает по крайней мере в 6 и - это известный баг.

Как наилучшим образом “смержить” два JSONObject?

#android #java #json


Имеем:
JSONObject o1 = {
    "one": "1",
    "two": "2",
    "three": "3"
}
JSONObject o2 = {
        "four": "4",
        "five": "5",
        "six": "6"
    }

В результате слияния o1 и o2 должны получить:
JSONObject result = {
        "one": "1",
        "two": "2",
        "three": "3",
        "four": "4",
        "five": "5",
        "six": "6"
    }

Один из вариантов - использвать иторатор по keys, и пока hasNext - добавлять поле
по ключу в новый объект.
Ищу более красивый способ.
Note - Ключи в o1 и o2 повторяться не могут.    


Ответы

Ответ 1



Нашел вот такое решение: JSONObject jsonObj = new JSONObject(); jsonObj.put("name", "Sriram"); jsonObj.put("age", 2); jsonObj.put("hobby", "painting"); JSONObject jsonObj2 = new JSONObject(); jsonObj2.put("hobby", "Singing"); jsonObj2.put("dob", new Date(110, 4, 6)); jsonObj.putAll(jsonObj2); System.out.println(jsonObj); На выходе: {"dob":Thu May 06 00:00:00 IST 2010,"age":2,"name":"Sriram","hobby":"Singing"}

Ответ 2



Конвертируем JSON-объект в строку: String str1 = o1.toString(); Находим последнюю фигурную скобку в строке и заменяем её на запятую: int index1 = str1.lastIndexOf("}"); str1 = new StringBuilder(str1).replace(index1, index1+1, ",").toString(); Аналогично для второго объекта, только заменяем "{" на предыдущюю строку: String str2 = o2.toString(); int index2 = str1.indexOf("{"); str2 = new StringBuilder(str2).replace(index2, index2+1, str1).toString(); Конвертируем обратно в JSON-объект: JSONObject result = new JSONObject(str2); Но это явно не наилучший способ.

Ответ 3



Я пришел к тому, что наилучшим решением будет использования иторатора jsonObject.keys() и ручной сборки результурующего объекта. public JSONObject mergeJsonObjects(JSONObject o1, JSONObject o2) { JSONObject result = new JSONObject(); Iterator i1 = o1.keys(); Iterator i2 = o2.keys(); String tmp_key; while (i1.hasNext()) { tmp_key = (String) i1.next(); try { result.put(tmp_key, o1.get(tmp_key)); }catch (JSONException ignored){} } while (i2.hasNext()) { tmp_key = (String) i2.next(); try { result.put(tmp_key, o2.get(tmp_key)); }catch (JSONException ignored){} } return result; } upd: public JSONObject mergeJsonObjects(ArrayList jsonObjects) { JSONObject result = new JSONObject(); String tmp_key; for (JSONObject jsonObject: jsonObjects){ Iterator iterator = jsonObject.keys(); while (iterator.hasNext()) { tmp_key = (String) iterator.next(); try { result.put(tmp_key, jsonObject.get(tmp_key)); }catch (JSONException ignored){} } } return result; }

Ответ 4



Почему бы и нет. Пишется простейшая функция: public JSONObject sliv (JSONObject name1, JSONObject name2 ) throws JSONException { String str1 = name1.toString(); int index1 = str1.lastIndexOf("}"); str1 = new StringBuilder(str1).replace(index1, index1+1, ",").toString(); String str2 = name2.toString(); int index2 = str1.indexOf("{"); str2 = new StringBuilder(str2).replace(index2, index2+1, str1).toString(); JSONObject result = new JSONObject(str2); return result; } Просто обращайтесь: sliv (JSONObject (Ваш объект 1), JSONObject (Ваш объект 2) )

Поиск с помощью регулярных выражений

#регулярные_выражения


Всем привет!


  "Some people, when confronted with a problem, think "I know, I'll use
  regular expressions." Now they have two problems!" (c) Jamie Zawinski


Помогите найти всех "кошек" через регулярные выражения! :)

let's try to find this cat and this cat
let's try to find this cat and this cat
Вот это не сработало: (?<=
)((?!<\/div>)(cat|(?:.|\n))+)(?=<\/div>) Debuggex Demo Второй вопрос еще интересней - найти только тех кошек, которые сидят в блоках с классом "cats": cat
black cat, white cat
cat
black cat, white cat
cat


Ответы

Ответ 1



Для первого случая: Пример /|cat(?=.*?
)|(cat)(?=.*?<\/div>)/g пропускает открывающиеся div, или пропускает cat, за которыми следует открывающийся div, или захватывает cat, если за ним следует минимальное количество символов и закрывающийся
. Для второго случая Пример /
||(cat)(?=.*?<\/div>)/g пропускает открывающийся div с классом cats, или пропускает прочие div - целиком, или захватывает cat, если за ним следует минимальное количество символов и закрывающийся
. UPD: Благодаря дельным замечаниям ReinRaus новые варианты регулярок переписаны и теперь валидны как для PCRE, так и в js-реализации. Спасибо)

NameError: name 'mainloop' is not defined

#python #python_3x #tkinter


объясните пожалуйста почему так работает:
import tkinter

def recAction(*args):
    print('ddd')

root = tkinter.Tk()

row6 = tkinter.Frame(root, borderwidth = 10)
row6.pack(side = 'top', fill = 'x')
button = tkinter.Button(row6, text = 'Send', height = 20, width = 20, relief = 'raised',
cursor = 'hand1', font = ('times', 14, 'bold'))
button.bind('', recAction)
button.pack()

mainloop()

а так не работает:
import tkinter

def recAction():
    print('ddd')

root = tkinter.Tk()

row6 = tkinter.Frame(root, borderwidth = 10)
row6.pack(side = 'top', fill = 'x')
button = tkinter.Button(row6, text = 'Send', height = 20, width = 20, relief = 'raised',
cursor = 'hand1', font = ('times', 14, 'bold'))
button.bind('', recAction)
button.pack()

mainloop()

сообщение об ошибке такое:

Traceback (most recent call last):
File
"C:\Python33\projects\DVD_LIST\p3_dvd_list_shelve_3d_class_edit_menubar\q.py",
line 14, in 
    mainloop() NameError: name 'mainloop' is not defined

мне это не  понятно так как в интернетах много примеров именно второго типа. например
таких    


Ответы

Ответ 1



На вызов mainloop ругается потому, что эта функция определена внутри модуля tkinter. Нужно либо вызывать её как tkinter.mainloop(), либо включить её в пространство имен текущего модуля с помощью from tkinter import mainloop и вызывать просто как mainloop(). "Привязываемые" к событиям функции должны иметь как минимум один параметр, в который попадёт объект-событие. Опять же два варианта: смириться, и дать tkinter этот параметр, или объявить функцию recAction без параметров, а привязывать её через прослойку lambda, как предложил alexlz: button.bind('', lambda event: recAction())

Ответ 2



ну спасибо, помогли. хотя и я не понял почему именно нужно передавать аргумент, но теперь по крайней мере проблему буду решать следующим образом: button.bind('', lambda event: recAction(event)) ....... def recAction(event): print('ddd') и mainloop теперь буду записывать так: tkinter.mainloop :)

Определение положения в помещении

#android


Обобщенная задача. Определить положение устройства (телефон, плашнет) в помещении.
Теоретически в любой момент времени устройство может видеть несколько точек доступа.
С помощью WifiManager.getScanResults() получаем уровни сигнала до всех видимых точек
доступа. Каким образом уровень сигнала преобразовать в расстояния для дальнейшей триангуляции?

Если поможет, можно заранее просчитать координаты на некой координатной сетке всех
точек доступа (ну по крайней мере тех, к которым есть физический доступ).
Задача также осложняется наличием стен и перекрытий (несколько этажей).
ЗЫ ищу любые варианты сабжа, wifi был бы идеальным вариантом, если бы получилось.    


Ответы

Ответ 1



Тут есть не плохое описание, даже исходники под андрод есть. +видео, как работает Полтора года хотел взять эту тему в качестве диплома, но побоялся, что не хватит времени на реализацию хорошего прототипа. Доп. инфа. http://trillworks.com/nick/2011/11/25/real-time-indoor-navigation-for-android-phones/ http://hkr.diva-portal.org/smash/get/diva2:475619/FULLTEXT02.pdf

Не приходят данные методом POST от банка

#python #php #ruby #perl


Здравствуйте. От банка должен приходить ответ об успешной оплате пользователя методом
POST на конкретный url нашего сайта. Проблема в том, что у банка не получается отправить
данные методом пост на наш сайт в то время как я отправляю данные с со своей машины
и все принимается и обрабатывается отлично. 
Может ли быть это связано с настройками моего хостинга или причина в другом? Отправил
вопрос провайдеру думают уже очень давно(тупят, не как не могу вникнуть в мой элементарный
вопрос). Банковский админ утверждает что у него выходит при отправке некая ошибка:
error: java.lang.NullPointerException.
Использую: шаред хостинг, Linux, apache, PHP/Yii framework.
В чем может быть дело? 
Спасибо.    


Ответы

Ответ 1



какой бы не была причина - в любом случае это ошибка нашего любимого Казкоммерцбанка. во-первых, клиент всегда прав во-вторых, это нонсенс - чтобы банк не знал в чем дело. выдавать в эфир "error: java.lang.NullPointerException" и демагогию: "у всех работает, а у вас нет" - показатель сверх непрофессионализма. "NullPointerException" - это не причина, а следствие возникшей ошибки. причина может быть: 1) руки (и мозги) не из того места у программистов ККБ (больше всего к этом склоняюсь) 2) фаервол, либо разрыв связи 3) проблема с сертификатом (eicto более грамотно расписал возможные причины конечно). но в этом случае они должны были озвучивать именно это, а не демагогические нульпоинтерэксепшн. если причина с вашей стороны, то должны были выдать инструкции как это исправить. в-третьих, POST он и в Казахстане POST, провайдеры тут не при чем. и тупят не провайдеры, а сотрудники банка. в-четвертых, не удивляйтесь ничему - это Казахстан, родственные связи и т.д.

ВКонтакте доступ к jQuery из UserJS

#javascript #вконтакте #userjs


Если открыть консоль браузера на странице ВКонтакте, то введя  

$


увидим в выводе объект jQuery, но если внедрить на страницу UserScript:  

function append() {
    console.log( $ );
};

window.setInterval( append, 1000 );


то ровно раз в секунду в консоль будет падать ошибка undefined.
В каком пространстве имен искать jQuery и как вообще такое может быть, ведь UserScript
исполняется в глобальном контексте и в том же контексте происходит работа, если напрямую
вводить команды в консоль ?
    


Ответы

Ответ 1



Команды из консоли выполняются в контексте window + доступно API самого браузера. То, что вы видите, это ссылка на один из методов API браузера. Подробно с API системой вы можете познакомиться в документации соответствующего браузера. Сам сайт ВКонтакте не использует в своей работе библиотеку jQuery.

Ответ 2



Возможно, не подключена jQuery, подключите сами: // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js

Android Bitmap странно ест память

#android #java


Когда я создаю картинку примерно 2000х2000 пикселей она занимает в куче примерно
15Мб. Когда я создаю 1500х2000 она занимает примерно 12Мб.

Но когда я создаю более чем 2000х2000 в DDMS почему-то показывается что максимальный
однобайтовый объект занимает 1Мб. Хотя сама куча довольно сильно увеличивается и работа
с картинкой нареканий не вызывает. 

Почему DDMS выдает 1Мб ??


    


Ответы

Ответ 1



Ответ из комментария: Насколько я помню, при некоторых условиях, применяется оптимизация — контент Bitmap помещается в shadow heap, который, соответственно, не засчитывается в application heap. При каких условиях и что именно происходит — полагаю, только в сорцах андроида читать, в документации вряд ли. На работу recycle это никак не влияет, так как recycle, фактически, ничего и не делает, кроме как помечает pixel data Bitmap как dead и помогает таким образом GC при его следующем вызове.

Ответ 2



У битмап есть ограничение в использовании памяти, если картинка превышает объем памяти пула, то вылет с ошибкой. Решается это путем шифрования или перевода в текстов. Файл или же так -http://m.habrahabr.ru/post/139717/

Позиция заднего фона на сайте

#html #css


Имеется сайт.
На заднем плане находится следующее изображение.
В правом нижнем углу находится пара героев составляющих саму суть картины.
Встал вопрос: Как сделать так, чтобы их было видно всегда, при любом разрешении экрана?
Update:
Проблема была решена следующим способом:
background-size:100% 100%;
background-attachment: fixed; 
background-repeat:no-repeat;

background-position: bottom right;
    


Ответы

Ответ 1



Проблема была решена следующим способом: background-size:100% 100%; background-attachment: fixed; background-repeat:no-repeat; background-position: bottom right; расширил задний фон изображения по ширине до 2560px

Удалить кусок html используя xpath

#html #python #xpath


Задача может быть и простая, но я с таким не сталкивался. Как из html-кода удалить
определенный узел? Используя xpath шаблон. Ниже примерно описал алгоритм. Не знаю только
библиотеку и функцию, которые выполнили бы эту операцию.

import "какая_нибудь_стандартная_библиотека"
html_code = 'Заголовок и так далее ...'
xpath_parrent = '//title'
result = "функция_удалить"(html_code, xpath_parrent)
теперь узла title больше нету
можно выводить на экран
print title

    


Ответы

Ответ 1



Я бы из стандартного использовал бы регулярки. Используя модуль lxml, можно так: from lxml import html html_code = 'Заголовок' xpath = '//title' root = html.fromstring(html_code) print(html.tostring(root)) # b'Заголовок' for el in root.xpath(xpath): parent = el.getparent() parent.remove(el) print(html.tostring(root)) # b''

Ответ 2



Чистый xpath запрос не получится, потому что функция selectNodes выбирает Nod-ы из одного уровня xml, и фильтр можно поставить только на весь уровень. Но можно сделать, например, SelectNodes('/*/*[name(*/.)!="title"]') что выберет "второй" уровень (т.к. первый "root" т.е. весь документ тег html), при этом будет отброшена вся ветка head, от этого вы никак не уйдёте, т.к. если выбрать третий уровень - елементы второго уровня где нету третьего "уйдут" потеряются данные. Пример тут http://stackoverflow.com/questions/36260599/xpath-search-within-xpath-results Вариант 2. Можно использовать трансформацию xsl + xpath с рекурсией. Скрипт трансформации будет примерно такой: Базируется на функции copyif которая клонирует ноды, плюс в if - условие копирование (c которыи прийдётся помучатся, сравнение полного пути xpath 3.0 поддерживает). Шапку можно и 1.0, функции "базовые". Запрос большой, зато на питоне будет две-три строчки - загрузить два xml и сделать transform. это не самый лучший метод, но может пригодится как пример обращения с xml.

Плагин для wordpress как отдельная страница со своим лэйаутом

#php #wordpress


Здравствуйте!
Есть сайт на WP, к которому мне нужно написать плагин. Задача следующая: 

Есть раздел меню, в котором есть свое подменю, т.е. двухуровневый dropdown, и второй
уровень нужно выводить динамически из базы.
Информация из базы данных по ссылкам вышеуказанного меню должна выводиться на отдельной
странице со своим лэйаутом. То есть приблизительно так: я клацаю ссылку, данные передаются
в POST или парсится URL и данная страница выводит динамический контент.

Вопрос: как реализовать данный функционал с помощью плагина, чтобы можно было вписаться
в оформление существующего сайта? Возможно ли такое для WP в принципе?
Спасибо!    


Ответы

Ответ 1



Если нет необходимости оформлять это именно в форме плагина, то сделать это можно так: Создайте в папке шаблона PHP-файл с произвольным именем и необходимым вам функционалом. Например, Создайте новую страницу, выбрав в блоке "Атрибуты->Шаблон" название вашего шаблона (первая строка комментария): "Hello-Tpl"

Python requests: при указании заголовков запросы по сети идут в случайном порядке

#python #requests #словари


Использую библиотеку requests для выполнения запросов по сети. Но возникла проблема.
Когда указываю заголовки, то они идут в рандомном порядке
>>> headers = {'Connection':'keep-alive',
           'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
           'Accept-Encoding':'gzip,deflate,sdch',
           'Accept-Language':'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4',
           'Cache-Control':'max-age=0',
           'Origin':'http://site.ru',
           'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/29.0.1547.0 Safari/537.36'}
>>> headers
{'Origin': 'http://site.ru', 'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4',
'Accept-Encoding': 'gzip,deflate,sdch', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/29.0.1547.0 Safari/537.36', 'Connection': 'keep-alive', 'Cache-Control': 'max-age=0'}

Origin перескакивает в самое начало. Суть в том, что сервер восприимчив к подобным
переменам, и заголовки надо отправлять в строго определенном порядке. Вычитал что это
проблема возникает из за того что используется словарь. Однако как я понял, requests
принимает header только в таком виде.
Подскажите, как можно решить данную проблему?
PS возможности вмешиваться в работу сервера нет.    


Ответы

Ответ 1



И Вы и Python и Header'ы в HTTP используют словарь {"ключей":"значений"}, не имеет никакого смысла указывать Header'ы по другому. Меняйте серверную часть, которая нормально сможет обращаться к заголовкам по их "ключу". Что это за серверная часть, у которой важен порядок словаря? Словарь на то и словарь, чтобы обращаться к значению по его ключу. И я вас уверяю, даже не пытайтесь сдерживать порядок словаря, это невозможно, при передаче данных порядка не будет. Есть конечно разного рода сортировка для словарей, но она не применима конкретно к Header'ам, так как Header'ы сами по себе сконструированы по принципу словаря.

Ответ 2



Порядок http-заголовков не гарантирован (ни в спецификации, ни на практике). Заголовки могут быть переставлены при транспортировке через интернет. Хотя для целей спецификации (Internet Message Format) заголовки не следует переставлять в общем, а некоторые заголовки не должны переставляться вообще. См. Сохраняет ли HTTPMessage порядок ключей? возможности вмешиваться в работу сервера нет. Чтобы упорядочить свои заголовки, достаточно их как collections.OrderedDict передать (так как dict в Питоне не упорядочен). Если вы хотите также свой порядок для заголовков, которые requests самостоятельно выставляет, то можно их переопределить на Session объекте. См. Header Ordering: #!/usr/bin/env python3 from collections import OrderedDict import requests session = requests.Session() session.headers = OrderedDict([ ('Connection', 'keep-alive'), ('Accept-Encoding', 'gzip,deflate'), ('Origin', 'example.com'), ('User-Agent', 'Mozilla/5.0 ...'), ]) # ... custom_headers = OrderedDict([('One', '1'), ('Two', '2')]) req = requests.Request('GET', 'https://httpbin.org/get', headers=custom_headers) prep = session.prepare_request(req) print(*prep.headers.items(), sep='\n') Вывод: ('Connection', 'keep-alive') ('Accept-Encoding', 'gzip,deflate') ('Origin', 'example.com') ('User-Agent', 'Mozilla/5.0 ...') ('One', '1') ('Two', '2') Порядок заголовков сохранён.

Как полностью отключить автозавершение тегов в phpstorm?

#phpstorm #javascript


Подскажите, пожалуйста, не получается полностью отключить автозавершение тегов, даже
при всех отключённых галочках в Settings - Editor - Smart Keys при вводе кода


как от этого избавиться?    


Ответы

Ответ 1



В PhpStorm 9 есть раздел настроек Code completion. В этом разделе вы можете убрать автоматический автокомплит.

Дайте грамотный совет. Занимаюсь разработкой своего ORM

#jdbc #java #orm


Всем привет. 
Занимаюсь по-тихоньку развитием своей библиотеки объектно-реляционного отображения
для Java на основе JDBC. Сразу говорю: я не профессиональный программист, я всего лишь
студент 4 курса, но интерес к данной теме есть и хочется сделать что-то стоящее (разбираюсь
в новых темах по мере необходимости). Есть желание сделать библиотеку такой, чтобы
она была интересна не только мне. 
В данный момент уже реализовано:

Представление записей в виде объектов сущностных классов, один объект = одна запись.
Один сущн. класс = одна таблица;
Транзакции;
Автоматическая обработка исключений внутри класса EntityClass (обработка вынесена
в отдельный скрытый метод, там происходит вызов rollback() или метода для переподключения,
в зависимости от ситуации, а так же прочие действия);
Автоматическое переподключение в случае потери соединения (выполняется только если
не используется транзакция);
Подгрузка настроек из properties-файла;
Подгрузка подготовленных запросов из файла (будет ещё дорабатываться, хочу что-то
вроде хранимых процедур, но на стороне клиента, желательно даже с параметрами);
Набор методов в классе Functions для автоматической выборки и прочих вещей (будет
ещё дорабатываться);
Что-то вроде кеширования, но я не знаю, кеширование ли это. Помимо того, что можно
значения полей получать напрямую из ResultSet'а, есть возможность вызвать метод initialization()
и тогда содержимое ResultSet'а перегонится в Map, хранимый в объекте EntityClass. После
этого нужно вызывать отдельный метод для получения значений из Map'а, отображение не
зависят от состояния подключения к БД.
Несколько методов для связывания объектов. Например, метод insertObject(fieldName
: String, object : EntityClass) : void вставляет в указанное поле объект сущн. класса
(а на самом деле просто записывает в это поле внешний ключ). Ещё метод returnObject(fieldName
: String, tableName : String) : EntityClass извлекает из указанного поля объект сущн.
класса, принадлежащий указанной таблице. Методы для прочих связей в РБД пока не реализованы.

В принципе, это всё, что пока есть. Хочу обратить внимание на то, что в данный момент
есть два способа работы с сущн. классами: создание экземпляра класса EntityClass с
передачей ему в качестве параметра имени таблицы, с которой он связан и наследование
от EntityClass. При наследовании нужно класс-предок оформлять по строгому шаблону. Такому:
package entity;
import java.sql.SQLException;
import java.util.ArrayList;
import db_and_orm.EntityClass;
import db_and_orm.Functions;
import db_and_orm.Transaction;

public class Кафедра extends EntityClass {

    private final static String TABLE_NAME = "кафедры";

    //конструкторы для добавления новой записи 
    //после их вызова нужно вызывать "сеттеры", а затем insertRow)
    //полная выборка
    public Кафедра(Transaction trans) {
        super(trans, TABLE_NAME);
    }

    //частичная выборка
    public Кафедра(Transaction trans, String... поля) {
        super(trans, TABLE_NAME, поля);
    }

    //конструкторы для извлечения готовых записей
    //полная выборка
    public Кафедра(Transaction trans, int id) {
        super(trans, TABLE_NAME, id);
    }

    //частичная выборка
    public Кафедра(Transaction trans, int id, String... поля) {
        super(trans, TABLE_NAME, id, поля);
    }

Как видно, поля там не определены, потому что они определяются сами с помощью метаданных
(доступ к полям у меня осуществляется исключительно по имени, передаваемому методу
get().  То есть POJO классы не используются. Сейчас думаю, а может всё таки попытаться
адаптировать всё на POJO классы? Но тогда вопрос, если я буду наследоваться от EntityClass,
то откуда базовый класс будет знать, какие конкретно поля я определил в дочернем? Делать
абстрактный метод я не хочу, это не дело. 
Хочу позже ещё реализовать следующие вещи:


Хранимые процедуры и функции;


Логирование. Вот тут вопрос: что конкретно нужно логировать в плане работы с БД?
Может, дадите ссылку, где описывается, как происходит логирование по-нормальному?


Допиливание связей;


Применение аннотаций для упрощения работы с библиотекой;


Автоматическое составление структуры БД и отправка запросов на создание таблиц по
составленной объектной модели на уровне ЯП. Хочу без использования всяких XML, чтобы
составление схемы БД происходило только по сущн. классам;


Поддержка составных ключей;


Какой-нибудь контейнер, где будут выполняться операции над группой объектов сущн.
классов. Ну, в общем, хранение объектов и их обработка. Но тут вопрос: какие конкретно
операции могут производиться над группой объектов?


Рефлексивные отношения (вот это под вопросом, я честно говоря, не понимаю зачем они
вообще нужны). 


Вроде всё, до чего додумался. Ещё вопрос: как происходит реализация наследования,
если в РБД его нет. Я думаю, что если класс Б наследуется от А, то должна быть таблица,
которая содержит поля и класса А и класса Б. В классе А нужно как-то ограничивать кол-во
полей.
Цель этого поста: чтобы его прочитали и написали грамотный комментарий и ответы на
вопросы. 
Так же, ответьте на вопрос: что должна иметь ORM-библиотека, чтобы называться полноценной?
Я всё перечислил или что-то упустил? И что нужно, чтобы библиотека была интересна не
только мне?
Заранее спасибо :)    


Ответы

Ответ 1



Я не великий специалист в разработке ORM, как говорится: чукча не писатель, чукча читатель Уберите русскоязычные названия классов, я знаю, что javac и IDE умеют не ругаться на не ASCII идентификаторы, но что более важно, на это ругаются 99.9% девелоперов. Здесь дело не в неуважении к собственной стране, а в правилах. Почему то ведь вся медицина на латыни работает и ничего... Здесь то же самое. Логгирование. Недавно здесь обсуждались системы логгирования и народ сошелся, что наиболее продвинутым будет использование библиотеки логгирования SLF4J - позволяющей присоединять более-менее любую систему логгирования. Можно и старый добрый Log4J. Обычно в логи ORM выдают (в зависимости от уровня логгирования) - SQL запросы которые лежат в основе экзерсисов ORM. Получение JDBC коннекта через JNDI имена/ресурсы (javax.sql.DataSource) Кэширование JDBC коннектов, в частности реализация JDBC Pool Кэширование SQL запросов (PreparedStatement/CallableStatement) Кэширование результатов SQL запросов - ResultSet Реализация разных моделей кэширования, например классический LRU (Least Recently Used) и проч. - вагон и маленькая тележка Ну и т.д.

Как создать RSA (PEM 1024 bit) пару ключей на Objective-C или Apple Swift?

#swift #objective_c #ios #rsa #key


Доброе время суток, в общем нужно создать RSA (PEM 1024 bit) пару ключей, пробовал
разные варианты, но проблема в том, что как оказалось под iOS это большая редкость,
пробовал таким образом:

Способ #1

Способ #2

Но это не то что нужно, они создаются в HEX нужен PEM, либо же как можно преобразовать
ключ в PEM?
    


Ответы

Ответ 1



Получилось реализовать с помощью библиотеки.

Как подружить luit и cp866?

#linux #кодировка #utf_8


Linux. utf8.

[root@pandora ~]# luit -list | grep 866


не дает нам ничего, а надо чтобы была 866 кодировка. Как научить luit понимать её?

p.s. xorg-x11-apps последний стоит. CentOS 5.6

UPD

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

Итак, нам надо пропатчить luit (это тулза, которая фоном поток конвертит из чужеродной
локали в текущую), чтобы она понимала cp866. У меня CentOS 5.x, делал для него.

Что я сделал.


Убедился, что такой локали у меня нет locale -a | grep 866
Проверил, что charmaps для 866 присутствует ll /usr/share/i18n/charmaps/IBM866.gz
Создал локаль IBM866. localedef -i ru_RU -f IBM866 ru_RU.IBM866. подготовка завершена,
теперь надо патчить luit


Скачал исходники xorg-x11-apps.src.rpm, развернул и нашел в исходниках архив luitа,
развернул его и нашел там файл charset.c.

В нем, в описании массива:

 FontencCharsetRec fontencCharsets[] = {


Добавил строку:

{"IBM866", T_128, 0, "ibm-cp866", 0x80, 0, 0}


Затем в описании

LocaleCharsetRec localeCharsets[] = {


Добавил 

{ "ibm866", 0, 2, "ASCII", NULL, "IBM866", NULL, NULL}


Сохранил, затарил само дерево luit, перекомпилировал в новый rpm, установил и получил
пофиксенный и рабочий комплект.

Вот как это теперь выглядит: win2lin http://dl.dropbox.com/u/66475831/Sites/inet/luit.gif
    


Ответы

Ответ 1



описанная в вопросе проблема очень устарела. уже 2011/10/30 в luit была внесена правка: 2011/10/30 add entries to the locale-charset table to correspond with the font-encoding table, making it possible to use locales defined with each named charset (reported by Andrey Ivanov, also reported in Freedesktop #41857) так что, если в вашем дистрибутиве более старая версия, то можно скачать и собрать актуальную версию.

Modx revo.Как можно настроить плагин gallery для работы в нескольких контекстах?

#modx #gallery #revo


Всем привет.
Есть сайт на modx revo,установлен babel,сделан 1 дополнительный контекст(en).
Есть страничка на которой есть вывод gallery,в случае дефолтного контекста(web) все
фотки выводятся отлично,но если открыть перевод ресурса в другом контексте фото не
грузится.

Как я понял все дело в путях к файлам с фотографиями:


вот путь в контексте web:

/assets/components/gallery/connector.php?action=web/phpthumb&ctx=web&w=57&h=57&zc=1&far=C&q=90&src=%2Fassets%2Fgallery%2F3%2F41.jpg

а вот путь в контексте eng :

 /assets/components/gallery/connector.php?action=web/phpthumb&ctx=eng&w=57&h=57&zc=1&far=C&q=90&src=%2Fen%2F%2Fassets%2Fgallery%2F3%2F41.jpg



Обратим внимание на конец ссылки:


%2Fassets%2Fgallery%2F3%2F41.jpg
%2Fen%2F%2Fassets%2Fgallery%2F3%2F41.jpg


В en контексте он подписывает - %2Fen (ну или /en)

Хочу спросить,есть ли решение настройки gallery для 2 и более контекстов? Если есть
то как это реализовать?

Обновление

Можно конечно и просто replace добавить:

  • [[+name]]
  • Но это топорный вариант. Хотелось бы все по уму) Вот такой вот способ тоже можно заюзать в главном снипgете Gallery строка 131... правим вот на это: $itemArray['thumbnail'] = str_replace(array('%2Fen%2F'),'',$item->get('thumbnail',$thumbProperties)); $itemArray['image'] = str_replace(array('%2Fen%2F'),'',$item->get('image',$imageProperties)); В принципе это тот же самый реплейс, только уже внутри плагина.


    Ответы

    Ответ 1



    $itemArray['thumbnail'] = str_replace(array('%2F'.($modx->context->get('key')).'%2F'),'',$item->get('thumbnail',$thumbProperties)); $itemArray['image'] = str_replace(array('%2F'.($modx->context->get('key')).'%2F'),'',$item->get('image',$imageProperties)); или же создать сниппет getContextKey return $modx->context->get('key'); и вызывать в фильтре [[+image:replace=%2F[[getContextKey]]%2F==%2F]`]

    Как сделать функцию с необязательным параметром в СИ

    #c #функции

    
    Имеется функция вида 
    f(p1, *p2, *p3, *p4) {
       ...
    }
    
    По указателям p3 и p4 присваиваются определённые значения, которые не всегда нужны
    во внешней программе, т.е. эти аргументы, в отличие от p1 и p2, являются не обязательными.
    Как можно реализовать на Си, чтобы можно было использовать эту функцию без "возвращения"
    значений туда, на что указывают p3 и p4?
    Например, чтобы можно было использовать как f(a1, &a2), так и f(a1, &a2, a3, a4)    
    


    Ответы

    Ответ 1



    @Ilyazh, если еще актуально, то вот пример такой функции (из рабочей программы в Linux) static int check_args_nz(void *a, ...) { va_list ap; va_start(ap, a); int i; for (i = 0; a; i++) a = va_arg(ap, void *); va_end(ap); return i; } Для теста вызывать можно примерно так: int a = 1; char *b = "abc"; double c; printf ("%d %d %d\n", check_args_nz(0, "2", &a, 0), check_args_nz(&a, b, &b, &c, 0), check_args_nz((void *)a, 0)); результат: $ ./a.out 0 4 1 $

    Ответ 2



    Рискую оказаться не прав, давно с С дела не имел :) f(p1, *p2, *p3, *p4 = NULL) { //проверка p3 и p4 на NULL } f(p1,*p2,*p3 = NULL) { f(pi,p2,p3,NULL); } //можно использовать type a, b, c; f(1, &a); f(1, &a, &b); f(1, &a, &b, &c);

    Ответ 3



    Я бы завернул возврат в структуру struct f_result { int* p2; int* p3; int* p4; }; void f(int p1, f_result* result); Звать так: int p2; // сюда хотим возвращаемое значение p2 f_params p = {&p2}; // не заданные члены структуры автоматически получают нули f(100, &p); В синтаксисе могу несколько ошибаться, с голым Си мало дела имел.

    Ответ 4



    А не проще сделать так? void sum_and_product(int p1, int p2, int* p3, int* p4) { if( p3 ) { *p3 = p1 + p2; } if( p4 ) { *p4 = p1 * p2; } } int sum; int product; sum_and_product(2, 3, &sum, NULL); sum_and_product(1, 1, NULL, &product);

    Ответ 5



    Пример: Код: Function MyFunction(S: String): Boolean; OverLoad; Begin Form1.Caption:=S; MyFunction:=True; End; Function MyFunction(S1, S2: String): Boolean; OverLoad; Begin Form1.Caption:=S1; Form1.Button1.Caption:=S2; MyFunction:=True; End; Procedure TForm1.Button1Click(Sender: TObject); Begin MyFunction('Hello World!'); End; Procedure TForm1.Button2Click(Sender: TObject); Begin MyFunction('My Name Is ...', 'Say SomeThing...'); End; I am the First of Cyber Evolution... I am the First to Program your Future...

    Странный роутинг в kohana3

    #php #kohana_3 #маршрутизация

    
    Приветствую вас. Столкнулся с очень странной проблемой: kohana3, судя по поведению,
    в нетрезвом состоянии, так как при правильно заданном маршруте для роутера выскакивает
    ошибочка:
    Kohana_HTTP_Exception [ 404 ]: The requested URL signup was not found on this server.
    
    Маршрут написан по мануалу в точности.
    Route::set('assest', '',
        array(
            'action' => '(login|signup|logout)'
        ))
        ->defaults(array(
            'controller' => 'Assest'
        ));
    
    .htaccess стандартный, изменения не вносились.
    Вот такие вот странности, знает кто, как лечить это?    
    


    Ответы

    Ответ 1



    Снова моя не внимательность, не обратил внимание на строчку из документации, так как она написано очень мелким шрифтом, которая гласит, что маршрут должен быть задан до стандартного :D

    Как научится низкоуровневому программированию под linux

    #kernel #c #system #linux

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


    Ответы

    Ответ 1



    @1z0, в качестве работы за которую платят деньги? -- Что же касается ответа на заголовок вопроса, то я бы посоветовал начать с чтения файлов в /usr/include и самостоятельного обдумывания, как бы Вы сами это реализовали. Обновление Большинство из них -- к устройству ядра действительно отношения не имеют. Однако, обратите внимание -- низкоуровневое программирование в Linux это по большей части не программирование ядра, а программирование с использованием libc (и опосредовано ядра). По поводу, непосредственно ядра. Почитайте конечно книжки, например, Роберт Лав "Linux. Системное программирование" и "Разработка ядра Linux" и потом потренируйтесь. Скачайте исходники, посмотрите как люди пишут, попробуйте что-нибудь свое придумать и добавить. Обновление 2 Вот небольшой список сайтов: https://www.kernel.org/ наверняка известен Вам, там http://vger.kernel.org/ -- можете подписаться на e-mail рассылку -- место, где размещают важные сообщения и члены сообщества ведут разработку. http://lwn.net/ новости Linux http://kernelnewbies.org/ Linux Kernel Newbies читайте, изучайте.

    Ошибка при создании screen

    #php #linux #ssh #gnu_screen

    
    Здравствуйте. Есть скрипт на PHP ,который выполняет команду screen -S test337 через
    SSH ,вот он:
    
    /* Соединение */
    $connect = ssh2_connect($rows1['ip'], $rows1['sshport']);
    ssh2_auth_password($connect, $rows1['login'], base64_decode($rows1['password']));
    $shell = ssh2_shell($connect);
    
    /* Выполнение команды */
    fwrite($shell, 'screen -S test337'.PHP_EOL);
    
    /* Получение ответа */
    $text = '';
    while($buf = fread($shell,4096)) {$text .= $buf;};
    echo '
    '.$text; /* Закрытие соединения */ fclose($shell); В переменой $rows1 хранятся данные от SSH. Но сервер выдаёт ошибку: Cannot find terminfo entry for 'vanilla' Если даже отправить просто команду screen ,он вернёт точно такую же ошибку. На сервере стоит CentOS 6.* Подскажите пожалуйста как это можно исправить? И из-за чего это вообще может происходить?


    Ответы

    Ответ 1



    исправить ошибку можно, установив переменной окружения TERM какое-нибудь более распространённое (а значит, с большей вероятностью присутствующее в целевой системе) значение. например, xterm, или даже vt100. дополните вызов программы screen таким присвоением значения переменной TERM: TERM=xterm screen ... или таким: TERM=vt100 screen ...

    Медиа-запрос или аналог относительно родителя, а не вьюпорта или экрана

    #media_queries #html #адаптивная_верстка #css #вёрстка

    
    Имеется вот такой блок:
    
    
    
    Хотелось бы сделать так, чтобы при достаточности ширины он трансформировался в такой
    блок:
    
    
    
    Как писать свойства - понятно: заменить инлайн-блоки на блоки, добавить отступы и т.д.
    
    С запросами, на первый взгляд, тоже понятно. Пишем что-то типа:
    
    .selector {
        свойства для телефонов
    }
    
    @media screen and (min-width: 768px) {
        .selector {
            свойства для планшетов и десктов
        }    
    }
    
    
    Но как быть в случае, если этот блок встречается на разных страницах и в одном случае
    брейкпойнтом должно быть 768px, а в другом 1024px, например? Например, на одной странице
    есть сайдбар, уменьшающий пространство, а на другой нету.
    
    
    
    
    
    Получается, что этот запрос нужно делать относительно родителя. Если, например, родитель
    400+ пикселей, то применяем свойства выстраивающие элементы блока колонками.
    
    Медиазапрос должен выглядеть как-то так:
    
    @media (ширина контекста: 480px) { ... }
    
    
    Подскажите, пожалуйста, есть ли возможность организовать медиазапросы таким образом?
    
    Другими слова: я вижу, что этот блок должен трансформироваться, если есть свободных
    400px, но как мне определить, что ширина родителя 400+? Медиазапросом я могу определить
    только ширину вьюпорта или экрана и она не всягда связана с шириной родителя.
    
    Я пока что вижу два варианта:
    
    а) На разных страницах проставлять нашему блоку разные классы, например
    
    @media screen and (min-width: 768px) {
        .selector_unfold-on768 { ... }
    }
    @media screen and (min-width: 1024px) {
        .selector_unfold-on1024 { ... }
    }
    
    
    Но тогда придется дублировать одни и теже свойства (ну или убирать в миксины и инклюдить).
    
    б) отказаться от медиа-запросов как таковых и пасть JS`ом.
        
    


    Ответы

    Ответ 1



    Верно мыслите, тут либо через классы либо JS, ибо медиа запросы не умеют работать с DOM элементами

    Ответ 2



    Подозреваю, что такое можно сделать с помощью flexbox. Media-запросы работают только с viewport'ом.

    Редирект в Spring MVC

    #spring_mvc #spring #java #redirect

    
    В последнее время мне никто не отвечает, но я всё равно почему-то спрашиваю... 
    
    Привет, товарищи. По прежнему мусолю официальный пример на оф. сайте Spring, переписываю
    их код с помощью аннотаций. Там есть формочка, чтобы увеличить цену, вот такая:
    
    
    
    По нажатии кнопки Execute цены на товар увеличиваются на заданный процент, и после
    этого пользователя перебрасывает на страницу со списком товаров.
    Вот их код, который это обслуживает:
    
    public ModelAndView onSubmit(Object command)
                throws ServletException {
    
            int increase = ((PriceIncrease) command).getPercentage();
            logger.info("Increasing prices by " + increase + "%.");
    
            productManager.increasePrice(increase);
    
            logger.info("returning from PriceIncreaseForm view to " + getSuccessView());
    
            return new ModelAndView(new RedirectView(getSuccessView()));
        }
    
    
    Опустим работу с логированием, базой данных, остановимся только на возвращаемом методом
    значении. Моя задача - сделать так, чтобы после увеличения цен на странице с товарами
    появилось уведомление, мол, "цены успешно повышены", а при обновлении страницы пропало.
    Я пробовал так:
    
    @RequestMapping(method = RequestMethod.POST)
    public ModelAndView post(Model model) {
        model.addAttribute("hello", "world");
        return new ModelAndView(new RedirectView("/home.htm"));
    }
    
    
    так:
    
    @RequestMapping(method = RequestMethod.POST)
    public ModelAndView post(Model model) {
        return new ModelAndView("redirect:/home.htm").addObject("hello", "world");
    }
    
    
    так:
    
    @RequestMapping(method = RequestMethod.POST)
    public ModelAndView post(Model model) {
        return new ModelAndView("redirect:/home.htm", "hello", "world");
    }
    
    
    так:
    
    @RequestMapping(method = RequestMethod.POST)
    public View post(Model model) {
        model.addAttribute("hello","world");
        return new RedirectView("/home.htm");
    }
    
    
    А ещё тут предлагают вызывать метод, отвечающий за страницу со списком товаров. Все
    мои попытки, представленные выше, передают мой hello=world в url, получается 
    
    
      http://localhost/home.htm?hello=world
    
    
    Соответственно если я сделаю пометку таким образом, она никуда не денется после обновления
    страницы. Как мне быть? Может, есть какой-то способ передать в модель той страницы
    дополнительные атрибуты? На PHP я это делал с помощью $_SESSION, может, и здесь сессии
    использовать?
    
    P. S. Спасибо тем, кто доскроллил вопрос до конца, надеюсь получить ответ, палец
    вверх и принятый ответ гарантирую.
        
    


    Ответы

    Ответ 1



    может и здесь сессии использовать? Ну а как еще? Это же по факту состояние, которое надо сбрасывать после первого показа. Ну куки еще разве что. Вордпресс, конечно, живет себе гет-параметрами, но он вордпресс. Вообще эта штука называется flash messages, единственная проблема будет со списками, когда надо по одному ключу забить кучу сообщений https://stackoverflow.com/questions/11881720/multiple-flash-messages-in-spring-mvc В последнее время мне никто не отвечает, но я всё равно почему-то спрашиваю... палец вверх и принятый ответ гарантирую. -_-

    Среднее  арифметическое  модулей  разностей всех  элементов  массива

    #массивы #java

    
    Доброго времени суток.
    Задача стояла такая: вводя 2 целых числа, нужно было найти все простые числа между
    ними. С этим быстро справился, но вторая часть задания добавляет условие: сгенерировать
    массив из простых чисел, найденных ранее, при условии, что среднее  арифметическое 
    модулей  разностей всех  элементов массива наиболее близка к целому числу P > 1 типа int.
    Число Р также вводится вместе с границами диапазона. Разности считаются так: если массив,
    например, 7 2 2 5, то среднее арифметическое будет вычисляться так ср_арф = (|7-2|+|7-2|+|7-5|+|2-2|+|2-5|+|2-5|)/6.
      Сломал весь мозг, но дальше прямого перебора не придумал ничего, вот что я наваял
    (осторожно говнокод):
    rezArrList.add(intArrList.get(rand.nextInt(intArrList.size())));
        counter++;
        while (result >= p+1 || result <= p-1 || result != p){
            rezArrList.add(intArrList.get(rand.nextInt(intArrList.size())));
            counter++;
            for (int i = 0; i < rezArrList.size()-1; i++){
                for (int j = 1; j < rezArrList.size(); j++){
                    preresult += Math.abs(rezArrList.get(i)-rezArrList.get(j));
                }
            }
            result = preresult/counter;
        }
    
    Это срабатывает, но крайне редко, если повезет. Сейчас пытаюсь вывести формулу, но
    пока что-то не очень выходит.     
    


    Ответы

    Ответ 1



    Отсортируйте массив простых чисел от большего к меньшему. так например 7 2 2 5 -> 7 5 2 2 Далее отнимайте от семи 5, 2, 2 От 5 отнимайте 2, 2 и т.д. Количество прохождения цикла сократится вдвое. Напишите, если нужен код.

    Работа с Git и человеком, который им не пользуется

    #git

    
    Добрый день!
    Ситуация такая: есть проект, который лежит на удаленном сервере, я все изменения
    вношу на локальной машине, потом при помощи Git отправляю изменения на сервер, есть
    дизайнер, который не умеет работать с Git и вносит правки на продакшене.
    Мне приходится лезть на сервер добавлять все правки дизайнера в репозиторий, а потом
    пулить (pull) изменения в свою локальную версию проекта.
    Хочется перестать сливать изменения дизайнера на продакшене, а делать это на своей
    локальной машине, а потом все одим махом отправлять на удаленный сервер.
    Есть ли в Git какой-нибудь инструмент, с помощью которого можно пулить незафиксированные
    изменения?
    Может быть, есть какой другой способ работы в команде в такой ситуации?
    Заранее спасибо за Ваш ответ/совет.
    P.S.
    Ответ капитана: Научить дизайнера использовать Git.    
    


    Ответы

    Ответ 1



    Если он ещё и верстальщик (а может, и фронтенд разработчик), то без гита тяжело, настройте ему .ssh ключ чтобы не требовалось вводить никаких паролей и научите такой команде: git add . && git commit -am 'frontend development' && git pull origin master && git push origin master - объясните что это будет что-то типа "сохранить свои изменения и вылить". В консоле гита ему достаточно будет набрать "вверх" и "enter" и всё. :) Если про "батник", то смысл в следующем: найти папку, куда установлен гит, у меня это C:\Program Files (x86)\Git\bin; элемент списка; добавить "переменную среду" (PATH): Панель управления > Система > Дополнительные параметры > Переменные среды >; выбираем параметр PATH и дописываем через ; этот пусть к гиту; создаем файл, например, apply.bat, и прописываем там: git add . && git commit -am 'frontend development' && git pull origin master && git push origin master Не забудьте поменять ветку на свою.

    Параметры для split в Java

    #java #строки

    
    Как задать параметр для разбиения строки в массив в метод split, чтобы он учитывал
    и переход на следующую строку и пробел сразу?
    А сама проблема в том, что если в строке после слова идет переход на следующую строку
    и нет пробела, то это слово просто прибавляется к предыдущему как один элемент массива.
    Сейчас сплит выглядит так: split(" ").     
    


    Ответы

    Ответ 1



    Попробуй так: s.split("\\s"). Таким образом строка разобъется в массив учитывая символы-разделители [ \t\n\x0B\f\r] из предустановленного класса \s . Либо просто нужно перечислить символы-разделители, как предлагал nofate. Документация по java.util.regex.Pattern

    WebView и получение токена

    #android #java #webview #вконтакте #vkontakte_api

    
    Здравствуйте, уважаемые знатоки! Наверное, у меня глупый вопрос, но все же.
    Я пытаюсь в андроид-приложении прикрутить авторизацию Вконтакте с помощью WebView.
    Мне нужно, чтобы при запуске приложения запускалась активити с WebView, где пользоавтель
    мог ввести логин, пароль и после чего получить токен. 
    Я делаю так: 
    public class LoginActivity extends Activity {
    
        WebView webview;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);
    
            webview = (WebView) findViewById(R.id.loginWebView);
            webview.getSettings().setJavaScriptEnabled(true);
            webview.clearCache(true);
    
            webview.setWebViewClient(new WebViewClient());
            CookieSyncManager.createInstance(this);
    
            CookieManager cookieManager = CookieManager.getInstance();
            cookieManager.removeAllCookie();
    
            String url = "https://oauth.vk.com/authorize?client_id=123&scope=65544"; 
            webview.loadUrl(url);
        }   
    }
    
    В итоге открывается активити, на ней WebView отображает диалог авторизации вконтакте.
    А вот что делать дальше, я не знаю. ( Как получить этот токен из вебвью?    
    


    Ответы

    Ответ 1



    @JuniorTwo, тебе нужно для своего WebView установить WebViewClient. У него есть метод-callback onPageStarted (WebView view, String url, Bitmap favicon). Как видишь, вторым параметром придёт ссылка, в которой будет указан токен. А вот выдрать токен из строки - это уже твоя задача. Сам URL будет типа http://REDIRECT_URI#access_token= 533bacf01e11f55b536a565b57531ad114461ae8736d6506a3&expires_in=86400&user_id=8492

    Поименованные аргументы из Python в с++ через SWIG

    #cpp #python #swig

    
    Объявляю в С++ class, ну например:
    
    сlass Point
    {
    public:
        Point(int color, int x=0, int y=0);
    };
    
    
    Теперь из Python пробую создать объект
    
    p = Point(16, y=0)
    
    
    Но получаю что-то вроде:
    
    TypeError: __init__() got an unexpected keyword argument 'y'
    
    
    Как при помощи SWIG генерировать для Python интерфейс с поименованными аргументами?
        
    


    Ответы

    Ответ 1



    Добавьте в Ваш интерфейсный файл, например point.i, следующую строку: %feature ("kwargs") Point;

    С какого запроса следует начинать авторизацию на DropBox?

    #http #https #oauth #request #dropbox

    
    Доброго времени суток, уважаемые форумчане!
    
    Изучаю документацию по протоколу Oauth 1.0 для DropBox, но не могу понять, с какого
    запроса следует начинать сеанс обращения к серверу DropBox. В документации написано,
    что первый запрос должен содержать следующие параметры:
    
    
      
      oauth_consumer_key: The Consumer Key.
      oauth_signature_method:
      The signature method the Consumer used to sign the request.
      oauth_signature:
      The signature as defined in Signing Requests.
      oauth_timestamp:
      As defined in Nonce and Timestamp.
      oauth_nonce:
      As defined in Nonce and Timestamp.
      oauth_version:
      OPTIONAL. If present, value MUST be 1.0 . Service Providers MUST assume the protocol
    version to be 1.0 if this parameter is not present. Service Providers’ response to
    non-1.0 value is left undefined.
      Additional parameters:
      Any additional parameters, as defined by the Service Provider.
      
    
    
    Для вычисления подписи предлагается использовать PLAINTEXT, HMAC-SHA1 или RSA-SHA1.
    Методом PLAINTEXT ничего не получилось, как не пыталась отправлять запросы, сервер
    всё время возвращал ошибку "Not authorized".
    
    Решила попробовать создавать подпись с помощью HMAC-SHA1, но не понятно, что будет
    являться входным параметром, а что ключом. Подскажите ещё, пожалуйста, какой нужно
    отправлять метод: POST или GET, куда передавать параметры: в строку запроса или в тело
    запроса?
    
    Ссылка на рефы DropBox: http://oauth.net/core/1.0/#signing_process
    
    Пример:
    
        wstring url = L"https://www.dropbox.com/home/request_token";
        wstring oauth_nonce;
        CreateRequestParam(oauth_nonce);
        wstring oauth_callback = L"";
        wstring oauth_consumer_key = L"my App key";
        wstring oauth_consumer_secret = L"my App secret";
        wstring oauth_signature_method = L"PLAINTEXT";
        wstring oauth_timestamp = to_wstring(*(double*)time);
        wstring oauth_version = L"1.0";
        wstring oauth_signature = oauth_consumer_secret + L"&";
        wstring params = L"oauth_consumer_key=" + oauth_consumer_key +
                         L"&oauth_signature_method=" + oauth_signature_method +
                         L"&oauth_signature=" + oauth_signature +
                         L"&oauth_timestamp=" + oauth_timestamp +
                         L"&oauth_nonce=" + oauth_nonce +
                         L"&oauth_version=" + oauth_version;
    
        int err = PostRequest(url, params);
    
    
    На указанный url отправляю HTTP POST запрос, в теле передаю параметры, указанные
    выше. Должны возвращаться out_token и outh_secret, но возвращается страница в html-формате,
    в которой нет ни того, ни другого. Что я делаю не так?
        
    


    Ответы

    Ответ 1



    Не знаю, актуален ли еще вопрос, попробую ответить. Первый запрос на адрес https://api.dropbox.com/1/oauth/request_token Пример: POST https://api.dropbox.com/1/oauth/request_token HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0 Host: api.dropbox.com Accept: */* Accept-Encoding: deflate, gzip Authorization: OAuth oauth_consumer_key="973quph3jxdgqoe",oauth_nonce="105816471209",oauth_signature="wloizpn331cc8zd&",oauth_signature_method="PLAINTEXT",oauth_timestamp="Wed%2C%2013%20May%202015%2015%3A37%3A53%20%2B0000",oauth_version="1.0" Content-Length: 0 Content-Type: application/x-www-form-urlencoded В ответ получаете oauth_token HTTP/1.1 200 OK Server: nginx Date: Wed, 13 May 2015 15:46:32 GMT Content-Type: application/x-www-form-urlencoded ... Content-Length: 64 oauth_token_secret=LZl8HyVRQuP1ifON&oauth_token=RS4XReiBykw8WHNz Затем отправляете пользователя в браузер на страничку https://www.dropbox.com/1/oauth/authorize?oauth_token=RS4XReiBykw8WHNz Пользователь нажимает кнопочку Allow. Затем выполняете запрос на второй URL (подписываете его уже с использованием полученного ранее oauth_token_secret: https://api.dropbox.com/1/oauth/access_token POST https://api.dropbox.com/1/oauth/access_token HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0 Host: api.dropbox.com Accept: */* Accept-Encoding: deflate, gzip Authorization: OAuth oauth_consumer_key="973quph3jxdgqoe",oauth_nonce="847334669",oauth_signature="wloizpn331cc8zd&LZl8HyVRQuP1ifON",oauth_signature_method="PLAINTEXT",oauth_timestamp="Wed%2C%2013%20May%202015%2015%3A46%3A46%20%2B0000",oauth_token="RS4XReiBykw8WHNz",oauth_version="1.0" Content-Length: 0 Content-Type: application/x-www-form-urlencoded И получаете в ответ токен, который будете использовать при последующих запросах: HTTP/1.1 200 OK Server: nginx Date: Wed, 13 May 2015 15:46:55 GMT Content-Type: application/x-www-form-urlencoded Connection: keep-alive ... Content-Length: 76 oauth_token_secret=32mdalirxxxxa8j&oauth_token=yx8f9rdxxxxj8dia&uid=1921xxxx Пример авторизации на Dropbox Пример OAuth авторизации на Flickr с подписыванием запроса HMAC-SHA1

    PowerShell Бинарный Модуль

    #powershell

    
    Я создал бинарный модуль на C# (в виде dll). Он у меня нормально импортируется в
    среду  PowerShell, посредством  командлет import-module, а также я его вижу с помощью
    командлет get-module и его командлет выполняться здесь, как говорится, всё ОК. Но у
    меня стоит задача это бинарный модуль импортировать на удаленную ПЭВМ. Но что бы импортировать
    на удаленную ПЭВМ, он должен обладать свойством "импортированным в сеанс", т.е. когда
    даю на выполнение командлет  Get-Module -ListAvailable, этот модуль невиден, естественно,
    Invoke-command { import-module MyModul } -session New-PSSession -computerName 10.3.0.222
    Выдает сообщение:
    
    
      Указанный модуль "MyModul" не был загружен, так как ни в одном из
      каталогов модулей не был обнаружен действительный файл модуля.
    
    + CategoryInfo          : ResourceUnavailable: (MyModul:String) [Import-Module],
    FileNotFoundException
    + FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand
    + PSComputerName        : 10.3.0.222
    
    
    
    Мой модуль находится в директории C:\Users\Alex_Kot\Documents\WindowsPowerShell\Modules.
    Эта директория заданна в переменной среды $env:PSModulePath, т.е. здесь все тоже вроде
    как ОК.
    
    PS:
    Не могу понять как мне сделать модуль способным импортироваться на удаленную ПЭВМ.
        
    


    Ответы

    Ответ 1



    Импортируй модуль в объект сессии, вот так: $Session = New-PSSession -Computername 10.3.0.222 -Credential (Get-Credential) Invoke-Command -Session $Session {Import-Module MyModul} Import-PSSession -Session $Session -Module MyModul

    Lubuntu 15.04, android-studio, подключение телефона

    #android #ubuntu #adb

    
    Lubuntu 15.04, android-studio.
    
    Запускаю студию
    
    :~$ sudo sh ./studio.sh
    
    
    lsusb девайс видит, но не отображает имя.
    
    :~$ lsusb 
    Bus 001 Device 011: ID 2970:0c02  
    Bus 001 Device 003: ID 058f:6362 Alcor Micro Corp. Flash Card Reader/Writer
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 002 Device 003: ID 046d:c52f Logitech, Inc. Unifying Receiver
    Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    
    
    Смотрим на сам дивайс, все в порядке.
    
    :~$ lsusb -D /dev/bus/usb/001/011
    Device: ID 2970:0c02  
    Device Descriptor:
      bLength                18
      bDescriptorType         1
      bcdUSB               2.00
      bDeviceClass            0 (Defined at Interface level)
      bDeviceSubClass         0 
      bDeviceProtocol         0 
      bMaxPacketSize0        64
      idVendor           0x2970 
      idProduct          0x0c02 
      bcdDevice            2.16
      iManufacturer           2 Fly
      iProduct                3 IQ4514 Quad
      iSerial                 4 0123456789ABCDEF
      bNumConfigurations      1
      Configuration Descriptor:
        bLength                 9
        bDescriptorType         2
        wTotalLength           62
        bNumInterfaces          2
        bConfigurationValue     1
        iConfiguration          0 
        bmAttributes         0xc0
          Self Powered
        MaxPower              500mA
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        0
          bAlternateSetting       0
          bNumEndpoints           3
          bInterfaceClass       255 Vendor Specific Class
          bInterfaceSubClass    255 Vendor Specific Subclass
          bInterfaceProtocol      0 
          iInterface              5 MTP
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x81  EP 1 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0200  1x 512 bytes
            bInterval               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x01  EP 1 OUT
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0200  1x 512 bytes
            bInterval               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x82  EP 2 IN
            bmAttributes            3
              Transfer Type            Interrupt
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x001c  1x 28 bytes
            bInterval               6
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        1
          bAlternateSetting       0
          bNumEndpoints           2
          bInterfaceClass       255 Vendor Specific Class
          bInterfaceSubClass     66 
          bInterfaceProtocol      1 
          iInterface              0 
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x83  EP 3 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0200  1x 512 bytes
            bInterval               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x02  EP 2 OUT
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0200  1x 512 bytes
            bInterval               0
    Device Qualifier (for other device speed):
      bLength                10
      bDescriptorType         6
      bcdUSB               2.00
      bDeviceClass            0 (Defined at Interface level)
      bDeviceSubClass         0 
      bDeviceProtocol         0 
      bMaxPacketSize0        64
      bNumConfigurations      1
    Device Status:     0x0001
      Self Powered
    
    
    adb devices показывает 1 пустую строку (как я понимаю эта пустая строка и есть мой
    дивайс)
    
    :~$ adb devices 
    List of devices attached 
    
    :~$ 
    
    
    Пробовал давать права 777 /dev/bus/usb/001/011.
    Пробовал делать все под root.
    android-studio вообще не видит девайс.
    Отключал, подключал USB.
    udev reload
    В телефоне поставил отладку по USB, включил режим "для программистов".
    Честно испробовал все, что только попалась по запросам:
    
    ubuntu lsusb device without name
    ubuntu lsusb device
    ubuntu adb empty list
    ubuntu adb doesn't see device
    ubuntu android studio doesn't see device
    etc.
    
    
    Может все проще? Как сделать так чтобы android-studio увидело девайс? Перепробовал
    100500 смежных решений по данному вопросу, не сработали.
        
    


    Ответы

    Ответ 1



    Закройте студию и работайте только с adb. На данном этапе студия будет только мешать. Да и её не стоит запускать через sudo. Устройство должно быть подключено, в настройках включена отладка по USB. Добавьте в файл ~/.android/adb_usb.ini строку (Каталог .android и этот файл уже должны созданы у вас в home): 0x2970 Посмотрите adb devices. Если не помогло, то дальше будет стандартный мануал. Создайте файл /etc/udev/rules.d/51-android.rules с содержимым: SUBSYSTEM=="usb", ATTR{idVendor}=="2970", MODE="0666" Установите чтение для всех на этот файл: $ sudo chmod a+r /etc/udev/rules.d/51-android.rules Убейте все запущенные процессы adb, если они есть $ sudo killall adb Перезапустите udev: $ sudo service udev restart Посмотрите ещё раз adb devices. Если и это не помогло, то попробуйте тупо сменить USB кабель. С такими телефонами обычно идут кабели очень низкого качества. Ну или либо он у вас просто слишком длинный. В таких случаях часто ничего не работает, хотя и устойство отображается в lsusb.

    Валидация свойств модели в SelectedModel

    #c_sharp #wpf #mvvm #валидация #model

    
    Есть 2 SelectedModels:
    
    SelectedCanvas
    {
    public CanvasModel {get;set;}
    }
    
    SelectedImage
    {
    public ImageModel {get;set;}
    }
    
    
    , каждая из которых содержит свою модель:
    
    CanvasModel
    {
    public double CanvasWidth {get;set;}
    public double CanvasHeight {get;set;}
    }
    
    ImageModel
    {
    public double X {get;set;}
    public double Y {get;set;}
    }
    
    
    Свойства выбранной CanvasModel(Width, Height) должны накладывать ограничения на свойства
    выбранной ImageModel(X,Y), на которую байндятся несколько View-моделей.
    
    Вопрос: как правильнее организовать валидацию, с учетом того, что прямой связи между
    выбранными моделями нет?
        
    


    Ответы

    Ответ 1



    Ориентируясь на Свойства выбранной CanvasModel(Width, Height) должны накладывать ограничения на свойства выбранной ImageModel(X,Y), на которую байндятся несколько View-моделей. я бы сделал как-нибудь так public class MainVM : BaseVM { private CanvasVM _selectedCanvas; public CanvasVM SelectedCanvas { get { return _selectedCanvas; } set { // Тут, по-хорошему, тоже надо проверять на доспустимость выбора, если SelectedImage != null _selectedCanvas = value; RaisePropertyChanged("SelectedCanvas"); } } private ImageVM _selectedImage; public ImageVM SelectedImage { get { return _selectedImage; } set { if (/*Проверка на допустимость выбора с учетом SelectedCanvas*/) { // Ошибка, недопустимое значение throw new ArgumentException("Такой Image не подойдет!"); } _selectedImage = value; RaisePropertyChanged("SelectedImage"); } } } Где ImageVM - ViewModel для ImageModel CanvasVM - ViewModel для CanvasModel MainVM - ViewModel, в которой происходит работа по установке SelectedImage и SelectedCanvas. А View я бы привязывал к MainVM.

    Ответ 2



    Расскажу как был решен вопрос, может кому-то пригодится. Был выделен интерфейс IBounds { Width { get;set; } Height { get;set; } } от него унаследован CanvasModel в ImageModel было добавлено св-во: ImageModel { IBounds Bounds { get; set; } } При добавлении новой ImageModel св-ву Bounds присваивается SelectedCanvas.CanvasModel Валидация реализуется в ImageModel.