Страницы

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

пятница, 10 января 2020 г.

Запуск программы из консоли ubuntu и запуск через exec() php выдают различные результаты

#скрипт #php #ubuntu #exec


Есть скрипт на perl, который генерирует картинку из текста. Проблема в том, что скрипт
выдает различные результаты при запуске его из консоли Ubuntu и запуске через функцию
exec(). На выходе в картинке отсутствуют русские символы. Из-за чего это может быть?    


Ответы

Ответ 1



Возможно при запуске через exec() скрипт выполняется под другим пользователем у которого другая локаль.

Ответ 2



Вероятнее всего проблема в пользователях и правах доступа. Скрипт php выполняет другой пользователь, у которого нет доступа к шрифтам с русскими символами!

Клонирование лицензионной Windows 7 Starter

#windows_7 #активация


Имею 10 идентичных машин с предустановленной лицензионной Windows 7 Starter. При
первом запуске машины, получаю уже активированный Windows, т.е. лиц. ключ не надо вводить.
Образ системы уже активированный лежит на жестком диске машины.
Задача, установить и настроить софт на одной машине, затем клонировать образ системы
на другие 9 машин. 
Вопрос, как произвести переактивацию Windows или сменить ключ в системе на склонированных
машинах?     


Ответы

Ответ 1



Вопрос решился. Чтобы удалить ключ из системы надо запустить командную строку(cmd.exe) от имени администратора и в ней пишите: slmgr.vbs /upk Эта команда удалит ключ из системы. Затем можно перезагрузить систему и пройти процедуру ввода ключа и активации. Но можно еще написать: slmgr.vbs /ipk [ваш лицензионный ключ] ` Эта команда добавит ключ в систему, после перезагрузки, нужно будет только активировать систему ` символы "[" и "]" писать необязательно ps: вопрос можно закрывать

Ответ 2



Берешь одну машину, если они все идентичны то вообще отлично. Ставишь все дрова и программы, ну и саму систему. Потом берешь Acronis TrueImage или что-то подобное, делаешь слепок системы. На остальные машины копируешь этот слепок и с помощью этой же программы за 5-10 минут распаковываешь, и вуаля готовая рабочая машинка за 5-10 минут, со всем необходимым ПО. Единственное что иногда машинки в домене и их к нему нужно прицепить + статические адреса. Но это все единичные случаи.

Ответ 3



Позвольте поинтересоваться каким софтом Вы пользовались для создание слепка, сохраняющего лицензию? Есть ноут на лицензионной 7-ке, хочу создать бэкап перед установкой 10-ки. А для Ваших целей лучше всего подошел бы Acronis True Image, он удаляет данные об активации системы при её разворачивании, после чего можно средствами Windows сменить ключ и активировать систему. Кстати, при переносе на другое железо для сброса данных о лицензии и драйверов используется родная Виндовая утилита Sysprep.exe.

Как сделать скриншот главной страницы сайта?

#php


Как сделать скриншот главной страницы сайта не используя никакие сторонние сервисы?    


Ответы

Ответ 1



запустить виртуальную машину с нужной ОС и браузером, выполнить скрипт, который зайдёт на нужный сайт и сделает скриншот — так работают сервисы по оскриншочиванию во всех моделях браузеров, включая вымершие версии; Adobe Air простое приложение, в нём банально компонент браузера, и снятие копии его же экрана в файл.

Ответ 2



Хочется посоветовать PhantomJS. Это запуск полноценного движка WebKit из консоли, то есть все будет отображаться и работать, как в обычном браузере. Из php можно вызвать его через exec, а значит это полностью программное решение без сторонних сервисов. Пример взят из http://m.habrahabr.ru/post/116789/ Запуск в консоли так: phantomjs rasterize.js http://raphaeljs.com/polar-clock.html clock.png Код создания скриншота: if (phantom.state.length === 0) { if (phantom.args.length !== 2) { console.log('Usage: rasterize.js URL filename'); phantom.exit(); } else { var address = phantom.args[0]; phantom.state = 'rasterize'; phantom.viewportSize = { width: 600, height: 600 }; phantom.open(address); } } else { var output = phantom.args[1]; phantom.sleep(200); phantom.render(output); phantom.exit(); }

Пользовательская клавиатура

#android


Как реализовать пользовательскую клавиатуру для программы? Андроидом занимаюсь недавно,
пишу матричный калькулятор, не устраивает, что при ландшафтной ориентации клава занимает
много места. Хочу сделать аккуратную клавиатуру с двумя строками (в ландшафтной ориентации
с одной).    


Ответы

Ответ 1



Чтобы реализовать пользовательскую клавиатуру, нужно создать свой метод ввода: Creating an Input Method. Пример есть в SDK - это SoftKeyboard. Его можно использовать как базу для своей клавиатуры.

Использовать ли “use strict”? [дубликат]

#javascript


        
             
                
                    
                        
                            На этот вопрос уже даны ответы здесь:
                            
                        
                    
                
                        
                            Что значит “use strict”?
                                
                                    (2 ответа)
                                
                        
                                Закрыт 4 года назад.
            
                    
Доброго времени суток.
Есть ли сейчас смысл использовать выражение "use strict" и какие вкусности он дает?    


Ответы

Ответ 1



"use strict" допустим помогает избежать случайного пропуска new или var, или в таких случаях var func = function(){ this.value = 'value'; var a = function(){ console.log(this.value); } a(); } new func(); "проблем" с this, но почему-то у меня получается избежать этого самостоятельно, возможно потому что изначально поставил за правило использовать new, var, точки с запятой и не использовать eval и with

Структура таблицы в БД (денормализация)

#структуры_данных #база_данных


В рамках базы данных (в данном случае - PostgreSQL, но это не суть) есть несколько
небольших таблиц, которые содержат практически неизменяемые, но очень часто используемые
данные:

группы страниц (pagegroups), 
страницы (pages), 
шаблоны (templates),
позиции на страницах (positions),
модули (modules), 
группы пользователей (usergroups).

В каждой из таблиц есть поля ID, название, алиас и порядок показа. Между данными
есть связи: 

группы пользователей имеют разные права доступа, 
модули могут встречаются на разных позициях разных страниц,
каждой странице может быть задан свой шаблон,
шаблон состоит из позиций (header, sidebar_left, canvas, sidebar_right, footer),
которые могут отображаться или нет и т.п. (список связей должет остаться открытым)

Хочу свести все данные в одну таблицу, где представить данные в виде "ключ/значение".
Сломал всю голову. Пример базы (PostgreSQL):
CREATE TABLE core (
  id serial primary key,
  level int,
  group int,
  parent int references core,
  key text,
  value text
);

Фрагмент данных:
INSERT INTO core (id, level, group, parent, key, value) VALUES
(1, 0, 1, 0, 'type', 'coreelements'),
(2, 0, 1, 0, 'name', 'Компоненты системы'),
(3, 1, 2, 1, 'type', 'page'),
(4, 1, 2, 1, 'name', 'Страницы'),
(5, 1, 2, 1, 'order', ''),
(6, 1, 3, 1, 'type', 'template'),
(7, 1, 3, 1, 'name', 'Шаблоны'),
(8, 1, 3, 1, 'order', ''),
(9, 1, 4, 1, 'type', 'position'),
(10, 1, 4, 1, 'name', 'Позиции'),
(11, 1, 4, 1, 'order', '18,19,20,21,22'),
(12, 1, 5, 1, 'type', 'module'),
(13, 1, 5, 1, 'name', 'Модули'),
(14, 1, 5, 1, 'order', ''),
(15, 2, 18, 4, 'name', 'Шапка'),
(16, 2, 18, 4, 'alias', 'header'),
(17, 2, 19, 4, 'name', 'Рабочая зона'),
(18, 2, 19, 4, 'alias', 'canvas'),
(19, 2, 20, 4, 'name', 'Левый сайдбар'),
(20, 2, 20, 4, 'alias', 'sidebar_left'),
(21, 2, 21, 4, 'name', 'Правый сайдбар'),
(22, 2, 21, 4, 'alias', 'sidebar_right'),
(23, 2, 22, 4, 'name', 'Подвал'),
(24, 2, 22, 4, 'alias', 'footer');

Помимо общего вопроса о структуре таблицы смущает меня вот что:

В необходимости поля level не уверен, убрать?
Поскольку родитель и зависимые записи имеют по несколько пар "ключ/значение", как
организовать связь? по ID, по group или третьим способом? Иными словами, что должно
быть в поле parent?
Как связать, скажем, страницы, модули и шаблоны?

Пример к последнему вопросу:
Страница 'settings', в header имеет модуль 6, в canvas - модули 1, 3 и 2, в остальных
- ничего.

Вполне допускаю, что после того, как такая таблица получится, вернусь к первоначальному
- нормализованному - варианту. Но поскольку есть возможность попробовать разные варианты
- хочу попробовать и этот тоже.     


Ответы

Ответ 1



Нафиг такую структуру. Разным сущностям - разные таблицы! Что за извращенное стремление впихнуть все в одно? Даже если сейчас Вы чудом это все слепите так, чтобы работало, в будущем будут большие проблемы с масштабированием и изменением каждой сущности.

Ответ 2



Базовый элемент таблицы - узел, к которому привязаны как его свойства, так и узлы-потомки. CREATE TABLE core ( id serial primary key, parent int references core, node bool, key text, value text ); Два ключа (id, parent) используются для связи данных между собой; Булево поле (node) используется для отличия типов данных (собственно узлов и свойств). TRUE, если узел, FALSE, если свойства. key и value - собственно свойства. Пример данных: INSERT INTO core (id, parent, node, key, value) VALUES (3, NULL, TRUE, NULL, NULL), -- узел-родитель (4, 3, FALSE, 'alias', 'page'), -- свойства узла-родителя (4-6) (5, 3, FALSE, 'name', 'Страницы'), (6, 3, FALSE, 'order', '90,96,101,106'), ------ (90, 3, TRUE, NULL, NULL), -- узел-потомок (91, 90, FALSE, 'name', 'Настройки системы'), -- свойства узла-потомка (91-94) (92, 90, FALSE, 'alias', 'settings'), (93, 90, FALSE, 'template', '29'), -- связь с шаблоном (94, 90, FALSE, 'module', '54,62,58'); -- очередность модулей на странице Поле node можно убрать. Дело в том, что key/value для узлов равны NULL (что соответствует TRUE в поле node), тогда как NOT NULL в этих полях == FALSE.

Можно ли узнать пересечение N множеств по частям <N?

#множества #алгоритм


Есть списки уникальных целых значений. Каждый список назову «множеством».
Есть возможность узнавать кол-во уникальных элементов для максимум M множеств. Например:
/* допустим, мн-ва A и B такие, на деле состав множеств неизвестен */
A = [1,2,3]
B = [2,3,4,5]
/* можем задавать такие запросы и получать такие результаты: */
unique(A,B) = 5  /* 1,2,3,4,5 */
unique(A) = 3
unique(B) = 4

Хочется узнать кол-во общих элементов для N множеств, где N > M. Возможно ли это
в заданных условиях?
Запросов про unique() можно делать много. Как отсюда можно прийти к числу общих,
для 2, понятно:
unique(A) + unique(B) - unique(A,B) = общее ядро A и B

3 + 4 - 5 = 2 в примере выше.
Не соображу, как поступать с бОльшим числом множеств. К сожалению, прогулял теорию
множеств в своё время, поэтому прошу помощь у зала.    


Ответы

Ответ 1



Задача в общем случае нерешаема. Пример: пусть M = 1, N = 2, все множества одноэлементные. Вы никак не сможете узнать, эти множества совпадают или нет.

Работа с кассовым апаратом

#c_sharp #внешние_устройства


Требуется написать программу для работы с кассовыми аппаратами (хотя бы печать чека).
Подскажите в какую сторону копать. Есть ли программные эмуляторы кассовых аппаратов
для отладки такого рода программ?     


Ответы

Ответ 1



Для каждого торгового оборудования у разных производителей свои драйвера. Самые распространенные регистраторы - Штрих-М. Идем на сайт, находим свой регистратор, качаем драйвера. Есть еще АТОЛ, тоже популярны довольно. Доступ к драйверу идет через COM, в комплекте с драйверами есть примеры для 1C, delphi и билдера. По поводу эмуляторов, то скорее всего нет. В любом случае проверять надо на реальном аппарате, т.к. в самом регистраторе существуют настройки - кассиры, отделы, виды оплаты, строки для печати в начале и в конце чека... Обычно тестируют на нефискализованном аппарате (стоимость штрихов, например, от 14к рублей), затем фискализуют его просто. UPD Пару лет назад сделал класс для Delphi для работы с разными ККМ. uKKMClass.pas. Там же реализация для регистратора Феликс-РК. Печать чека, снятие отчетов и т.д.

Как установить цветовую схему vim?

#vim


https://github.com/daylerees/colour-schemes/blob/master/vim-themes/colors/Iceberg.vim
достаточно ли просто скопипастить это в конкретную папку, а затем подключить :colorscheme
themename?
При таком подходе дефолтовые темы у меня отображаются верно, но кастомные отображаются
абсолютно не так, например конкретно та что выше, представляет из себя полностью белый
текст    


Ответы

Ответ 1



Во-первых, да, достаточно положить тему в папку. Обычно это .vim/colors/ и потом прописать, например, color wombat256. Во-вторых, самое главное - нормальные темы для своей работы требуют 256-колор режим, без него вы не сможете насладиться темой в полной мере. Чтобы включить 256-й режим, надо прописать в .vimrc: " 256-color terminal set t_Co=256 " тему можно также поставить прямо в .vimrc color wombat256 И не забыть после этого перезапустить vim.

Ответ 2



При запуске Вима в терминалах вроде Gnome Terminal, Konsole следует использовать :colorsheme default и настраивать цветовую схему при помощи средств самого терминала (настройки профиля - цвета). Все остальные темы в терминале чаще всего отображаются некорректно. А за интересную ссылку на множество тем для Вима очень большое спасибо :)

Как и сколько соединений открывать из приложения с сервером БД mysql?

#cpp #mysql #сервер #сокет


Есть многопоточный сервер на с++, который работает с mysql базами.
Проблема в том, что открытие одного соединения на одного клиента не подходит из-за
большой нагрузки на сервер, а использование одного соединения с базой на все приложение
чревато большими проблемами. Подскажите как решить эту проблему.    


Ответы

Ответ 1



Обычно в таких случаях используют пул соединений (connection pool). Суть его в том, что к базе открывается ограниченное число соединений (например, 10). Каждый раз, когда клиент пытается подключиться к базе, мы выдаём ему соединение из пула. После оекончания работы с базой (отсоединения клиента) соединение возвращается в пул, но не закрывается, а по приходу нового запроса отдаётся следующему клиенту. Плюсы такого подхода - не нужно тратить время на переоткрытие соединений с базой. Минусы - ограниченное число одновременных подключений к базе, сложности реализации. На вашем месте я бы не стал писать пул самостоятельно, а поискал бы готовые реализации в Интернете (сам я, к сожалению, не пользовался подобным в C++, поэтому ничего конкретного посоветовать не могу).

Почему валидация выполняется, хотя должна выдавать ошибку?

#yii


Собственно ситуация такая:
Есть некоторая модель, в которой прописано следующее (делал по примеру):
public function rules()
{
    return array(
        array('begin_at', 'uniqueBeginAndEnd', 'message'=>'Сроки проведения с такими
условиями уже заданы'),
    );
}

public function uniqueBeginAndEnd($attribute,$params=array())
{
    if(!$this->hasErrors())
    {
        $params['criteria']=array(
            'condition'=>'courses_id=:courses_id AND end_at=:end_at',
            'params'=>array(':courses_id'=>(int)$_GET['id'], ':end_at'=>$this->end_at),
        );
        $validator=CValidator::createValidator('unique',$this,$attribute,$params);
        $validator->validate($this,array($attribute));
    }
}

Т.е. если я буду пытаться создать новую или редактировать уже существующую запись,
а запись с такими датами уже есть в таблице, то мне выдастся сообщение 'Сроки проведения
с такими условиями уже заданы'. 
Так вот в чем проблема: на добавление новой записи валидация работает, а на редактирование
нет (т.е. update проходит в любом случае).
Что добавление, что редактbрование делается стандартным $model->save()
P.S. Заранее извиняюсь, если объяснил не совсем внятно.    


Ответы

Ответ 1



я бы сделал что-то типа этого. public function rules() { return array( array( 'courses_id, end_at', 'unique', 'className' => 'название модели через которую ищем значение', 'attributes' => array('первовый атрибут', 'второй атрибут'), 'message' => 'Сроки проведения с такими условиями уже заданы'), array('courses_id, end_at', 'required'), array('courses_id, end_at', 'numerical'), ); } UPDATE И в таком случае стоит проверять что было передано от юзера, для этого нужны последние два правила. Я предположил что end_at это число. Если это дата то нужен валидатор date UPDATE 2 С учётом вашего комментария: На хеш-коде уже есть похожий вопрос с принятым ответом (легко ищется через яндекс по запросу "yii проверить уникальность") Коротко: вам нужно указать в правиле 'on'=>'add' //сработает при выполнении сценария добавления записи 'on'=>'edit' //при изменении записи

Ответ 2



Я делаю немного по другому валидацию, отличную от стандартных. Вот пример валидации имени товара: public function rules() { return array( array('name', 'filter', 'filter' => 'strip_tags'), array('name', 'filter', 'filter' => 'trim'), array('name', 'validItemName') ); } public function validItemName($attribute,$params=array()) { $pattern = "/[\!\?\"\'\+\_\/\|]/"; preg_match($pattern, $this->name, $matches); if($matches){ $this->addError('name', 'Недопустимый символ '.$matches[0]); } } Возможно и Вам следует добавлять самостоятельно ошибку через $this->addError()

Php socket write => java socket write

#php #java #сокет


В пхп эта строка выглядит так:  

  fwrite($socket, "\xFE\x01");

Нужно выполнить это же действие на Java. Не знаю, что передать вместо something методу
writeBytes(something). 
p. s.  есть writeChars(string), writeChar(char), если нужно.     


Ответы

Ответ 1



String charsetName="UTF8"; // или какая там кодировка на выходе вам нужна OutputStream ous=socket.getOutputStream(); byte[] bytes = string.getBytes(charsetName); ous.write(bytes); Если вам много строк передавать, то Writer ouw = new BufferedWriter(new OutputStreamWriter(ous, charsetName)); ouw.write(string, 0, string.length()); но только не совмещайте эти 2 способа записи - если вы передали OutputStream ous в конструктор OutputStreamWriter, то не пользуйтесь ous напрямую.

Ответ 2



Если это юникодовый символ то: String s = "\uFE01";

Оператор & в функциях и const

#ооп #cpp


Немного подзабыл C++ , а может просто раньше и не сталкивался с этим, но на вид всё
очень легко. Просто прошу напомнить следующее (можно в кратце, я всё понимаю, но вспомнить
не могу, а гугл не воспринимает символ & в поисковой строке):
const после метода, насколько я знаю, означает защиту значений *this, а что значит
const перед методом? Что значит оператор "&" в шаблонном типе? Это ведь оператор взятия
адреса, здесь он причем? Правильно ли я понял, что "=0" в конце означает, что это pure
метод? Если так, то зачем ему реализация в данном классе, если этот класс абстрактный,
а сам метод будет переопределен в дочерних классах? Или я что-то путаю? Не люблю код,
в котором опущены кавычки, вот и запутался...
Заранее спасибо! Вот, кстати, и сам код :)
template < class UnknownType > class MyClass
{
public:
    virtual const UnknownType& method() const throw () = 0;
};
    


Ответы

Ответ 1



всё просто UnknownType& это тип: ссылка на UnknownType а const для того чтобы нельзя было изменить то что возвращается да это pure метод, вот только вы не показали что там есть реализация

Не могу найти ошибку в АСМ модуле для С

#c #ассемблер


Пишу модуль для с-шной программы на nasm - сортировка пузырьком.
Программы почему-то вылетает при исполнении. Целые сутки пытался понять причину -
не вышло.
Пробовал разные реализации этого когда - бесполезно.
NASM ошибок не выдает, а модуль при исполнении вылетает.
Модуль АСМ:
global _bubblesort_asm
section .text

_bubblesort_asm:
    mov ebx, [esp+4] ; EBX = *m
    mov esi, [esp+8] ; ESI = size
    dec esi ; ESI = size-1 = I
    loop_i:
        xor edi, edi ; J = 0
        loop_j:
            mov ecx, [ebx+edi*4] ; ecx = value of m[J]
            mov edx, [ebx+edi*4+4] ; edx = value of m[j+1]
            cmp edx, ecx ; if(m[j] <= m[j+1])  goto skip
            jns skip
                mov [ebx+edi*4], edx ; mov value m[j+1] to m[j] adress
                mov [ebx+edi*4+4], ecx ; mov value m[j] to m[j+1] adress
            skip:
        inc edi ; j++
        cmp edi, esi ; if(j!=i) goto loop_j
        jnz loop_j
    dec esi ; I--
    cmp esi, 0 ; if(i>=0) goto loop_i
    jns loop_i
retn
;    for(i=size-1; i>=0; i--)
;        for(j=0; j m[j+1])
;                {temp = m[j]; m[j] = m[j+1]; m[j+1] = temp;}

main.c:
int main()
{
    srand(time(NULL));
    int i,size=100,m[size];
    for(i=0;i


Ответы

Ответ 1



Скомпилировал сишную сортировку с помощью mingw gcc с оптимизацей -O2, дизассемблировал, получилось вот что: .text:004013C5 mov edx, [ebp+m] .text:004013C8 mov esi, [ebp+size] .text:004013CB dec esi .text:004013CC js short loc_4013F5 .text:004013CE db 66h ; выравнивание .text:004013CE nop ; выравнивание .text:004013D0 .text:004013D0 loc_4013D0: ; CODE XREF: bubblesort+33j .text:004013D0 test esi, esi .text:004013D2 jle short loc_4013EF .text:004013D4 xor eax, eax .text:004013D6 db 66h ; выравнивание .text:004013D6 nop ; выравнивание .text:004013D8 .text:004013D8 loc_4013D8: ; CODE XREF: bubblesort+2Dj .text:004013D8 mov ecx, [edx+eax*4] .text:004013DB mov ebx, [edx+eax*4+4] .text:004013DF cmp ecx, ebx .text:004013E1 jle short loc_4013EA .text:004013E3 mov [edx+eax*4], ebx .text:004013E6 mov [edx+eax*4+4], ecx .text:004013EA .text:004013EA loc_4013EA: ; CODE XREF: bubblesort+21j .text:004013EA inc eax .text:004013EB cmp eax, esi .text:004013ED jnz short loc_4013D8 .text:004013EF .text:004013EF loc_4013EF: ; CODE XREF: bubblesort+12j .text:004013EF dec esi .text:004013F0 cmp esi, -1 .text:004013F3 jnz short loc_4013D0 .text:004013F5 .text:004013F5 loc_4013F5: ; CODE XREF: bubblesort+Cj Код почти идентичен тому что в вопросе, отличается некоторыми деталями, плюс gcc добавил выравнивание (66h - это префикс-модификатор размера операнда, перед nop он никаких функций не выполняет). Дополнение про различие js и jl. По сути cmp - это вычитание, не сохраняющее результат, но выставляющее флаги. Если сравнивать небольшие по модулю числа, то разницы в результатах не будет. Но если сравнивать числа, при вычитании дающие результат по модулю больший половины размерности переменной (регистра), то sf будет иметь не то значение, которое могло бы быть при сравнении меньших по модулю чисел. На примере величин в пределах байта. Сравним -10 и 10 внутри байтовых регистров: mov al, -10 mov cl, 10 cmp al, cl ; результат вычитания -20, флаг SF установлен ; и по js и по jl переход произойдет Теперь на примере чисел -100 и 100: mov al, -100 mov cl, 100 cmp al, cl ; результат вычитания "на бумаге" -200 ; но в пределах байта это уже не -200, а 56, флаг знака сброшен, ; поэтому по js переход не произойдет. ; Зато выставлен флаг переполнения - OF ; По jl, которое проверяет и SF, и OF, переход произойдет. Дополнение 2. Под половиной разрядности я имею в виду вот что: к примеру в байтовом регистре могут храниться знаковые числа от -128 до +127. В вордовом - от -2^15 до +2^15-1, в двордовом - от -2^31 до +2^31-1. Соответственно, если результат вычитания выходит за эти границы, то знак результата вычитания оказывается неверным (да и сам результат будет неверным, но в случае cmp он нас не интересует) и выставляется флаг переполнения. Поэтому чтобы определить, что одно число больше чем другое, нужно учитывать и флаг знака, и флаг переполнения, что и делают команды переходов jl (jnge), jnl (jge), jg (jnle), jng (jle). По поводу вылета при условии выхода из внешнего цикла cmp esi, 0 ; jns loop_i. Последний виток внешний цикл должен выполнить при esi==0. Тогда во внутреннем цикле произойдет вот что: edi обнулится при необходимости выполнится операция перестановки соседних элементов массива edi увеличится на 1 произойдет сравнение edi (1) с esi (0) так как они не равны (edi уже больше чем esi), то выход из цикла не произойдет далее edi будет увеличиваться и увеличиваться, пока не дойдет до конца доступного для записи участка памяти. Если заменить cmp esi,0 на cmp esi,1, то последний виток внешний цикл выполнит при esi==1, и внутренний цикл завершится, выполнив одну итерацию. Но тут все равно возникают проблемы, если массив состоит из одного элемента или вообще пуст, тогда esi уже при проверке условия выхода из внутреннего цикла будет меньше чем edi и условие выхода опять не сработает. Чтобы избежать такого "проскакивания" внутреннего цикла и нужно добавить проверку перед входом в него ("предусловие").

Возможно ли создание ЧПУ?

#php #чпу


Возможно ли создание ЧПУ на пхп(связь с БД) без внесения изменении в htaccess? 
Есть примеры?     


Ответы

Ответ 1



Вообще без .htaccess практически не возможно. Исключение - вы сконфигурируете свой сервер соответствующим способом. Хотя не думаю, что это легкий выход из положения. А вот избежать лишней головной боли с mod_rewrite можно. Я уже говорил тут об этом, но не могу найти этот пост, поэтому вкратце повторюсь. Создается правило, с помощью которого все запросы перенаправляются на морду, если директории или файла не существует физически на сервере. Например, так: RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [L] Теперь, вы ловите такие запросы в php: $request = $_SERVER['REQUEST_URI']; Разбираете полученную строку "на запчасти": по слешу для определения основных частей URI, учитывая окончание, если допустим адрес может быть /some_path/page.html и в зависимости от полученных данных, выводите ту или иную информацию.

Ответ 2



Да, возможно, такое ЧПУ сделано в CMS WordPress. Пример написали выше.

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

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


Добрый вечер. Понимаю, что вопрос очень глупый, но голова уже не варит. Да, начинается
время зачетов :)
Для N-ной лабы по матстату нужно посчитать количество вхождений подстроки в строку.
Банальщина. Чтобы эту банальщину хоть как-то приукрасить, пишем extension method для
string:
public static int P(this string baseStr, string inputStr)
{
    return new Regex(inputStr).Matches(baseStr).Count;
}

Для справки - в задании строка из N 0 и 1, первым этапом надо посчитать вероятности
появления пар в строке. 
Собственно, мой глупый вопрос: почему описанный метод, вызванный от строки "1111"
возвращает 2? Ну не могут же регулярки последовательно считать...
UPD:
пример вызова метода:
string data = "1111";
Console.WriteLine(data.P("11")); //2
    


Ответы

Ответ 1



Всё верно: в строке 1111 всего два вхождения подстроки 11. Регулярные выражения анализируют текст слева направо. При совпадении внутренний "курсор" (индекс) устанавливается на его начальную позицию. Следущее совпадение система начинает искать с позиции, находящейся сразу после текущего совпадения. Таким образом, перекрёстные совпадения невозможны при использовании обычных шаблонов. Как верно заметил ReinRaus, необходимо воспользоваться механизмом опережающей проверки, т.е. конструкцией (?=...), которая используется для проверки того, что следует после текущей позиции в строке. Несмотря на то, что такие блоки не "поглощают" текст при совпадении (т.е. при нахождении подстроки индекс остаётся на прежнем месте во входной строке), внутри них возможно использование захватывающих подмасок типа (...). Тут мы подходим к решению проблемы: string data = "1111"; string sub = "11"; Console.WriteLine(data.P(string.Format("(?=({0}))", Regex.Escape(sub))); Здесь пример использования данного подхода.

Ответ 2



Потому что вхождения не могут пересекаться. Надо делать предпросмотр, чтобы сжирать только то, что не входит в искомую строку: (?=11)

Вопрос о Model и ViewModel в MVVM

#wpf #mvvm


Работали мы когда-то с WinForm и был у нас некий класс:
class City
{
    public int ID {get;set;}

    public string Name {get;set;}

    public List {get;set;}
   ....
}

Потом мы узнали про WPF и решили перейти на него. Но если это WPF, то занчит надо
делать все по канону (т.е. с использованием MVVM) и надо бы сделать ViewModel. Дак
вот тут-то я и теряюсь. Как лучше сделать? Доработать тот самый класс City - сделать
его наследником INotifyPropertyChanged (При этом коллекции заменить на ObservableCollection),
но ведь тогда у нас Model и ViewModel сольются воедино? Не хорошо получается, или хорошо?.
Или же создать для него ViewModel:
class CityViewModel : INotyPropertyCjanged
{
    private City _city;

    public int ID 
    {
       get {return _city.ID; }
       set {_city.ID = value; RaisePropertyChanged("ID");}
    }
    ...
}

Но что же тогда делать с List? Как ее упаковать в ObservableCollection?
Направьте пожалуйста на путь истинный... Примеры приветствуются!
UPD
И пока не забыл. Допустим нам надо наполнить нашу модель данными из, например, баз
данных. Где должна лежать функция получения данных? Во ViewModel или View или еще где?    


Ответы

Ответ 1



Смотрите. Классы модели лежат отдельно, и не пересекаются с классами VM. Классы VM моделируют сущности вашей «бизнес-логики», то есть, внутренние объекты в терминах программы. Классы модели моделируют сущности своей предметной области. Например, ID интересен модели, но может быть вовсе не интересен программе, так что переносить его в VM нет особого смысла (разве что он нужен в UI). Таким образом, у нам получается вот что: Модель: class City { public int ID { get; private set; } public string Name { get; private set; } public List Areas { get; private set; } } static class CityHelpers { static City GetCityByName(string name) { ... } } VM: class CityVM : INotifyPropertyChanged // или даже DependencyObject { public CityVM(City city) { name = city.Name; Areas = new ObservableCollection(); foreach (var area in city.Areas) Areas.Add(new AreaVM(area)); } public Name { get { return name; } set { if (name == value) return; name = value; RaisePropertyChanged("Name"); } } public ObservableCollection Areas { get; private set; } // ну и ещё имплементация INotifyPropertyChanged } Функции получения данных лежат, понятно, в модели: VM не должна знать, как именно и откуда берутся данные. Но вот попросить модель загрузить данные должна именно VM (причём желательно грузить их не в UI-потоке, конечно, а то будет подвисать).

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

#jquery


Причём желательно не вариант с jQuery.noConflict(true), т.к. подключать в последствии
нужно другие страницы со скриптами, а не писать скрипты прямо на этой странице, т.е.



 //тут нужно чтобы работал jquery-10

 //a тут нужно чтобы работал jquery-4

    


Ответы

Ответ 1



// подключаем последнюю версию jQuery // подключаем jQuery 1.6 var $jq16 = jQuery.noConflict(true); // сохраняем ссылку // подключаем jQuery 1.4 var $jq14 = jQuery.noConflict(true); // сохраняем ссылку ;(function($) { // старый плагин, который использует jQuery 1.4 }($jq14)); ;(function($) { // чуть новее, использует jQuery 1.6 }($jq16)); ;(function($) { // используем последнюю версию jQuery }(jQuery)); Чем этот вариант не устраивает?

Как сделать визуализатор аудио на js?

#javascript


Надо сделать визуализатор музыки: столбцы, высота которых бы менялась в зависимости
от частоты. Как это сделать на js?    


Ответы

Ответ 1



Да тут вообще много всего понаписано. Попробуйте например dancer.js, даже есть по настоящему красивые результаты. Можете посмотреть здесь куча рекомендаций

Алгоритм нарезки прямоугольника на равные меньшие прямоугольники

#алгоритм #геометрия


Дан исходный прямоугольник N×M.
Задача: определить сколько раз можно полностью "уложить" (ориентация любая) меньший
прямоугольник n×m в исходный.
Возможно, для будущих ходоков будет интересно КАК.
Спасибо.    


Ответы

Ответ 1



Чистая эвристика: сделал модель с простым перебором на JS. В очередную точку пробует поставить блок гор. или верт. Есть вариант с приоритетом вертикального положения, есть с приоритетом горизонтального. Добавил случайность: каждый раз с вероятностью 50% выбирается приоритет гор. или вертикального расположения очередного блока. С откатом на оставшийся вариант, если «приоритетный» не влезает. Забавно: наблюдаю, что с «хаосом» иногда получаются результаты лучшие, чем когда выбран определённый вариант приоритета. Т.е. оптимум лежит в более сложном алгоритме. Для размера «гаража» 320x278 и «машины» 12x56 я пока поймал максимум в 125: P.s. потыкав и понаблюдав расстановки, интуитивно понял, что надо начинать из углов, двигаясь к центру. Если кому не лень форкнуть и разобраться, дайте знать. Может, конкурс устроить? Битву алгоритмов : ) Все пишут свои варианты. В назначенный день объявляем конкурсный размер гаража и машины, и смотрим, кто найдёт максимум за меньшее время.

Ответ 2



Задачка решается просто. Если нужен ответ на вопрос КАК // Возвращает массив расположения блоков [ { x, y, w, h } ] function calc(W, H, w, h) { var hor = pack([], W, H, w, h, 0, 0); var ver = pack([], W, H, h, w, 0, 0); // сортировка блоков в порядке сверху-вниз, слева-направо // если не планируется нумеровать блоки - можно удалить return (hor.length >= ver.length ? hor : ver).sort(function(a, b) { return (a.y - b.y) || (a.x - b.x); }); function pack(pieces, W, H, w, h, x0, y0) { var x, y; var nx = W / w | 0; // число блоков, умещающееся по ширине var ny = H / h | 0; // по высоте var n = nx * ny; // всего for (y = 0; y < ny; y++) for (x = 0; x < nx; x++) { pieces.push({ x: x0 + x*w, y: y0 + y*h, w: w, h: h }); } if (W % w >= h && H >= w) { // осталось полезное место справа pack(pieces, W % w, H, h, w, x0 + nx*w, 0); } else if (H % h >= w && W >= h) { // осталось полезное место снизу pack(pieces, W, H % h, h, w, 0, y0 + ny*h); } return pieces; } } Если нужен ответ на вопрос СКОЛЬКО // Возвращает число блоков function calc(W, H, w, h) { return Math.max(pack(W, H, w, h), pack(W, H, h, w)); function pack(W, H, w, h) { var n = (W / w | 0) * (H / h | 0); if (W % w >= h && H >= w) { n += pack(W % w, H, h, w); } else if (H % h >= w && W >= h) { n += pack(W, H % h, h, w); } return n; } } Демо: http://jsfiddle.net/RHq23/

Помогите понять json в GO

#json #golang


При энкодинге выводит: {"Tables":{"Id":{"Column":{},"Row":{},"Border":{}}}}
А хочется  (и в целом, каким должна быть структура для этого JSON?) :
{
"tables": {
    "table_001": {

        "dx":10.5, "dy": 10.5,

        "column": {
            "widths": [1.0, 1.0, 1.0],
            "align":[1,3,3],
            "colors": ["#1513","#1513","#1513"]
        },
        "row": {
            "heights": [1.0, 1.0, 1.0],
            "align": [3, null, null],
            "colors": ["#1513","#1513","#1513"]
        },
        "border": {
            "color": "#12244",
            "style": "solid", 
            "width": 1,
            "drawb": [                  
                        ["ltrb", "ltrb", "ltrb"],
                        ["ltrb", "ltrb", "ltrb"],
                        ["ltrb", "ltrb", "ltrb"]
                    ]
        },
        "tcont": [
                    ["рорпорп", "ID", "Year"],
                    ["ывывп", "1212", "2014"],
                    ["вапвапва", "1ht212", "2014"]
                ]
    }
}
}


package main

import (
    "encoding/json"
    "fmt"
)

func main() {

    type column struct {
        widths []float64
        align  []int32
        colors []string
    }
    type row struct {
        heights []float64
        align   []int32
        colors  []string
    }
    type border struct {
        width float64
        drawb [][]string
        color string
        style string
    }
    type table struct {
        dx     float64
        dy     float64
        Column column
        Row    row
        Border border
        tcont  [][]string
    }
    type tables struct {
        Id table
    }
    type jsonn struct {
        Tables tables 
    }

    var tle = jsonn{
        Tables: tables{
            Id: table{
                dx: 10.5, dy: 10.5,
                Column: column{
                    widths: []float64{70.0, 20.0, 20.0},
                    align:  []int32{1, 1, 1},
                    colors: []string{"", "", ""},
                },
                Row: row{
                    heights: []float64{40.0, 40.0, 40.0},
                    align:   []int32{1, 1, 1},
                    colors:  []string{"", "", ""},
                },
                Border: border{
                    width: 1.0,
                    drawb: [][]string{
                        {"ltrb", "ltrb", "ltrb"},
                        {"ltrb", "ltrb", "ltrb"},
                        {"ltrb", "ltrb", "ltrb"},
                    },
                    color: "#000000",
                    style: "solid",
                },
                tcont: [][]string{
                    {"polplpl", "ID", "Year"},
                    {"blablabla", "1212", "2014"},
                    {"blablabla", "1ht212", "2014"},
                },
            },
        },
    }

    b,err := json.Marshal(tle)
    if err != nil {
        fmt.Println("error:", err)
    }
    fmt.Printf("%s\n", b)
}
    


Ответы

Ответ 1



Если поля структуры объявляются с прописной буквы, то они не экспортируемые, и как следствие им нельзя присвоить значение. Для того, чтобы работать с JSON в Go необходимо объявлять поля с заглавной буквы. Все поля в JSON, также должны начинаться с заглавной.

Применить функцию ко всем дивам в блоке

#javascript


Сразу скажу чтобы в дальнейшем не было вопросов. Вроде "А что так уже не делают?!,
разве нельзя просто сделать вот так?! и т.д". В js я полный нуб. И естественно сформировать
свой вопрос я не могу(Так сам бы нагуглил)  

В чем весь сабж. Есть код  



$(document).ready(function() {
  var margin = $("#image1").width() / 2;
  var width = $("#image1").width();
  var height = $("#image1").height();
  $("#image2").stop().css({
    width: '0px',
    height: '' + height + 'px',
    marginLeft: '' + margin + 'px',
    opacity: '0.5'
  });


  $("#reflection2").stop().css({
    width: '0px',
    height: '' + height + 'px',
    marginLeft: '' + margin + 'px'
  });
  $("#image1").mouseover(function() {
    $(this).stop().animate({
      width: '0px',
      height: '' + height + 'px',
      marginLeft: '' + margin + 'px',
      opacity: '0.5'
    }, {
      duration: 500
    });
    window.setTimeout(function() {
      $("#image2").stop().animate({
        width: '' + width + 'px',
        height: '' + height + 'px',
        marginLeft: '0px',
        opacity: '1'
      }, {
        duration: 500
      });
    }, 500);
  });
  $("#image2").mouseout(function() {
    $(this).stop().animate({
      width: '0px',
      height: '' + height + 'px',
      marginLeft: '' + margin + 'px',
      opacity: '0.5'
    }, {
      duration: 500
    });
    window.setTimeout(function() {
      $("#image1").stop().animate({
        width: '' + width + 'px',
        height: '' + height + 'px',
        marginLeft: '0px',
        opacity: '1'
      }, {
        duration: 500
      });
    }, 500);
  });
});
Сейчас все эффекты применяются только к первому диву vizitka(ко внутренним изображениям). А таких дивов на странице несколько. Как сделать, что бы функция применялась к каждому image1,image2 Которые лежат в vizitka. Я думаю нужно id поменять на класс...НО нужно что-то еще. Все мои попытки оказались тщетными(


Ответы

Ответ 1



Пробуйте var doNicely = function (this_) { var $imgs = $('img', this_), $img1 = imgs.eq(0), $img2 = imgs.eq(1); var margin =$($img1).width()/2; var width=$($img1).width(); var height=$($img1).height(); $($img2) .stop() .css({width:'0px',height:''+height+'px',marginLeft:''+margin+'px',opacity:'0.5'}); $("#reflection2") .stop() .css({width:'0px',height:''+height+'px',marginLeft:''+margin+'px'}); $($img1).mouseover(function(){ $(this) .stop() .animate({width:'0px',height:''+height+'px',marginLeft:''+margin+'px',opacity:'0.5'},{duration:500}); window.setTimeout(function() { $($img2) .stop().animate({width:''+width+'px',height:''+height+'px',marginLeft:'0px',opacity:'1'},{duration:500}); },500); }); $($img2).mouseout(function(){ $(this) .stop() .animate({width:'0px',height:''+height+'px',marginLeft:''+margin+'px',opacity:'0.5'},{duration:500}); window.setTimeout(function() { $($img1) .stop() .animate({width:''+width+'px',height:''+height+'px',marginLeft:'0px',opacity:'1'},{duration:500}); },500); }); } $(document).ready(function () { $('.vizitka').click(function () { doNicely(this); }); });

Ответ 2



Сделал вот так. $(document).ready(function(){ /* $img2.stop().css( { width:'0px', height:height+'px', marginLeft:margin+'px', opacity:0.5 }); */ var width=$("img.image1").width(); var height=$("img.image1").height(); $("div.vizitka").hover(function(){ var $vizitka=$(this); $vizitka.find("img.image1").animate( { width:'0px', height:height+'px', opacity:0.5 },400,function() { $vizitka.find("img.image2").animate( { width:width+'px', height:height+'px', opacity:1 },400); } ); },function(){ var $vizitka=$(this); $vizitka.find("img.image1").stop(); $vizitka.find("img.image2").animate( { width:'0px', height:height+'px', opacity:0.5 },400,function() { $vizitka.find("img.image1").animate( { width:width+'px', height:height+'px', opacity:1 },400); }); }); });

Ответ 3



$(document).ready(function(){ var margin = $("#image1").width()/2; var width = $("#image1").width(); var height = $("#image1").height(); // $("#image2").stop().css({width:'0px', // height: height +'px', // marginLeft: margin +'px', // opacity:'0.5' // }); vis = $('.vizitka'); var i = 0; while(i < vis.length){ var visOnly = $(vis.get(i)); var b = visOnly.children('img'); var margin = $(b.get(0)).width()/2; var width = $(b.get(0)).width(); var height = $(b.get(0)).height(); $(b.get(0)).mouseover(function(){ var self = $(this); self.stop().animate({width:'0px', height: height + 'px', marginLeft: margin +'px', opacity:'0.5'},{duration:500}); window.setTimeout(function() { self.stop().animate({width: width + 'px', height: height + 'px', marginLeft: '0px', opacity: '1'},{duration:500}); },500); }); $(b.get(1)).mouseout(function(){ var self = $(this); self.stop().animate({width:'0px', height: height +'px', marginLeft: margin +'px', opacity:'0.5'},{duration:500}); window.setTimeout(function() { self.stop().animate({width: width + 'px', height: height + 'px', marginLeft: '0px', opacity:'1'},{duration:500}); },500); }); // $(b.get(1)).stop().css({width:'0px', // height: height +'px', // marginLeft: margin +'px', // opacity:'0.5' // }); i++; } }) Document


Ответ 4



$(document).ready(function(){ //------------------------- /* * @Cache------------------ */ var margin, width, height; var viz = $('.vizitka'); var i = 0; //------------------------- // viz.find('img').stop().css({ // width:'0px', // height: height +'px', // marginLeft: margin +'px', // // opacity:'0.5' // }); var autoassignment = function(f){ this.f = f; while(f > -viz.length){ var vizOnly = $(viz.get( f )); var b = vizOnly.children('img'); margin = $(b.get(0)).width()/2; width = $(b.get(0)).width(); height = $(b.get(0)).height(); // mouseover ________________________________ $(b.get(0)).mouseover(function(callback){ var self = $(this); self.stop().animate({ width:'0px', height: height + 'px', marginLeft: margin +'px', opacity:'0.5' },{duration:500}); window.setTimeout(function() { self.stop().animate({ width: width + 'px', height: height + 'px', marginLeft: '0px', opacity: '1' },{duration:500}); },500); }); // mouseout ________________________________ $(b.get(1)).mouseout(function(callback){ var self = $(this); self.stop().animate({ width:'0px', height: height +'px', marginLeft: margin +'px', opacity:'0.5' },{duration:500}); window.setTimeout(function() { self.stop().animate({ width: width + 'px', height: height + 'px', marginLeft: '0px', opacity:'1' },{duration:500}); },500); }); // $(b.get(1)).stop().css({ // width:'0px', // height: height +'px', // marginLeft: margin +'px', // opacity:'0.5' // }); f--; } }; autoassignment( i ); }); //document ready Document


Завис Sublime Text 3 при работе с внушительным php файлом при сохранении

#sublime_text #sublime_text_3


Собственно, вопрос, что делать? Кто виноват — понятно. Есть ли возможность спасти
скрипт? Может, у Сублайма есть местечко, куда он сохраняет временные файлы? Или другие
варианты? ОС — Ubuntu 14.04.
    


Ответы

Ответ 1



Вопрос решился. Сперва полез смотреть где бы subl мог хранить сессии. Обнаружил их в домашней папке пользователя в каталоге /home/user/.config/sublime-text-3/local. В файле *.sublime_session. Открываю и вижу JSON массив. И, о чудо, вижу знакомый код. Правда идет он одной строкой и символы конца строки проставлены как /n. Отлично, скопировав, решил уйти в ребут, т.к. субл намертво завис и закрываться не хотел даже через htop. После ребута открыл subl и случилось самое величайшее во всей этой истории - последний экземпляр кода висел как несохраненная вкладка. Спасибо команде Sublime! Обновление Ах и еще вот что https://github.com/akalongman/sublimetext-autobackups. Замечательный антисединный плагин.

Задать определенное время в AlarmManager

#android #java


Возникла проблема при вызове Notification в определенное время суток. 
Notification вызываю при помощи AlarmManager.
Когда задаю текущее время (System.currentTimeMillis()), проблем не возникает, все
отлично запускается и выводится, но как только пытаюсь задать определенное, то бишь,
точное время, ничего не происходит. Что подскажете? Как правильно задать время?  

Рабочий вариант:

private void restartNotify(Context context) {
    alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent notifyIntent = new Intent(context, NotificationMessage.class);
    contentIntent = PendingIntent.getBroadcast(this, 0,
                    notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT );
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), contentIntent);
}


Не рабочий:

private void restartNotify(Context context) {
    alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent notifyIntent = new Intent(context, NotificationMessage.class);
    contentIntent = PendingIntent.getBroadcast(this, 0,
            notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT );

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR, 15);
    calendar.set(Calendar.MINUTE, 20);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), contentIntent);
}


Решил проблему. Вот реализация: 

 private void restartNotify(Context context) {
        alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent notifyIntent = new Intent(context, NotificationMessage.class);
        contentIntent = PendingIntent.getBroadcast(this, 0,
                notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT );

        Calendar calendar = Calendar.getInstance();
        Calendar cal = Calendar.getInstance();

        calendar.set(Calendar.YEAR, cal.get(Calendar.YEAR));
        calendar.set(Calendar.MONTH, cal.get(Calendar.MONTH));
        calendar.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH));
        calendar.set(Calendar.HOUR_OF_DAY, 13);
        calendar.set(Calendar.MINUTE, 53);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), contentIntent);
    }


Прошу обратить внимание, кому интересно, что бы все заработало, нужно задать все
пункты (год, месяц, день, часы, минуты, секунды, миллисекунды). Важный пункт calendar.set(Calendar.HOUR
OF DAY, 13);. Если указать Calendar.HOUR вместо Calendar.HOUR OF DAY то время вместо
24-х часового формата, будет использовать 12-ти часовой, из-за чего время будет считаться
указанным не верно (Если у вас на телефоне 24-х часовой формат)
    


Ответы

Ответ 1



А можете проверить какое именно время вы получаете в calendar.getTimeInMillis()? И попробуйте вместо обычного использовать григорианский календарь Calendar calendar = new GregorianCalendar()

Ответ 2



Достаточно 3 параметров. Можно упростить на Kotlin: Calendar calendar = Calendar.getInstance().apply { calendar.set(Calendar.HOUR_OF_DAY, 13); calendar.set(Calendar.MINUTE, 53); calendar.set(Calendar.SECOND, 0); }

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

#blowfish #php #криптография #шифрование


Здравствуйте. В мануале 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? Если да,
то где описан?
Спасибо.    


Ответы

Ответ 1



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

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

#исключения #циклы #java


Здравствуйте. Имеется вот такой цикл.
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);
}

Это же как-то не красиво..    


Ответы

Ответ 1



Да, только так. Если вас смущает конструкция 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; }

Прослушивание PDF

#linux #pdf


Поставил сегодня "лучшую программу синтеза речи Festival, разрабатываемую в Центре
изучения речевых технологий в Эдинбургском университете (Шотландия). Она поддерживает
множество различных языков и голосов, может читать текст из файла либо из командной
строки и записывать результат синтеза в звуковой файл формата wav, включает в себя
плагин для pidgin, проговаривающий входящие сообщения":$sudo apt-get install festvox-ruИ
теперь мой кранч стал хорошо говорящим по русски:$ echo "Привет" | festival --language
russian --ttsИ можно прослушать книжку в текстовом формате:$ festival --language russian
--tts path/to/file.txtУ меня вопрос к тем, кто уже не первый день знаком с этой программой,
можно ли заставить читать ее pdf? (Если да, то как?)    


Ответы

Ответ 1



Думается, самый простой выход - это преобразовать pdf в txt, а затем прослушивать этот txt. В Linux это делается такpdftotext from to

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

#android


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


Ответы

Ответ 1



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

Как выбрать на Android с DUAL-SIM поддержкой, с какой карточки сделать вызов?

#android


Моя программа на данный момент рассчитана для односимочных телефонов, в неё я посылаю
запрос способом стартования нового Activity:
startActivity(new Intent(«android.intent.action.CALL», Uri.parse(«tel:» + phoneNumber)))
Но встал вопрос, как это сделать, если у телефона 2 симки?    


Ответы

Ответ 1



Я бы сделал так: Проверка на колличество сим: TelephonyInfo telephonyInfo = TelephonyInfo.getInstance(this); boolean isDualSIM = telephonyInfo.isDualSIM(); Если дуал сим, показал бы пользователю любой диалог для выбора, с какой симки сделать вызов. В зависимости от выбора осуществил вызов intent.putExtra("com.android.phone.extra.slot", 0); // Сим 1 intent.putExtra("com.android.phone.extra.slot", 1);// Сим 2 Класс TelephonyInfo: public final class TelephonyInfo { private static TelephonyInfo telephonyInfo; private String imeiSIM1; private String imeiSIM2; private boolean isSIM1Ready; private boolean isSIM2Ready; public String getImeiSIM1() { return imeiSIM1; } /*public static void setImeiSIM1(String imeiSIM1) { TelephonyInfo.imeiSIM1 = imeiSIM1; }*/ public String getImeiSIM2() { return imeiSIM2; } /*public static void setImeiSIM2(String imeiSIM2) { TelephonyInfo.imeiSIM2 = imeiSIM2; }*/ public boolean isSIM1Ready() { return isSIM1Ready; } /*public static void setSIM1Ready(boolean isSIM1Ready) { TelephonyInfo.isSIM1Ready = isSIM1Ready; }*/ public boolean isSIM2Ready() { return isSIM2Ready; } /*public static void setSIM2Ready(boolean isSIM2Ready) { TelephonyInfo.isSIM2Ready = isSIM2Ready; }*/ public boolean isDualSIM() { return imeiSIM2 != null; } private TelephonyInfo() { } public static TelephonyInfo getInstance(Context context){ if(telephonyInfo == null) { telephonyInfo = new TelephonyInfo(); TelephonyManager telephonyManager = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)); telephonyInfo.imeiSIM1 = telephonyManager.getDeviceId();; telephonyInfo.imeiSIM2 = null; try { telephonyInfo.imeiSIM1 = getDeviceIdBySlot(context, "getDeviceIdGemini", 0); telephonyInfo.imeiSIM2 = getDeviceIdBySlot(context, "getDeviceIdGemini", 1); } catch (GeminiMethodNotFoundException e) { e.printStackTrace(); try { telephonyInfo.imeiSIM1 = getDeviceIdBySlot(context, "getDeviceId", 0); telephonyInfo.imeiSIM2 = getDeviceIdBySlot(context, "getDeviceId", 1); } catch (GeminiMethodNotFoundException e1) { //Call here for next manufacturer's predicted method name if you wish e1.printStackTrace(); } } telephonyInfo.isSIM1Ready = telephonyManager.getSimState() == TelephonyManager.SIM_STATE_READY; telephonyInfo.isSIM2Ready = false; try { telephonyInfo.isSIM1Ready = getSIMStateBySlot(context, "getSimStateGemini", 0); telephonyInfo.isSIM2Ready = getSIMStateBySlot(context, "getSimStateGemini", 1); } catch (GeminiMethodNotFoundException e) { e.printStackTrace(); try { telephonyInfo.isSIM1Ready = getSIMStateBySlot(context, "getSimState", 0); telephonyInfo.isSIM2Ready = getSIMStateBySlot(context, "getSimState", 1); } catch (GeminiMethodNotFoundException e1) { //Call here for next manufacturer's predicted method name if you wish e1.printStackTrace(); } } } return telephonyInfo; } private static String getDeviceIdBySlot(Context context, String predictedMethodName, int slotID) throws GeminiMethodNotFoundException { String imei = null; TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); try{ Class telephonyClass = Class.forName(telephony.getClass().getName()); Class[] parameter = new Class[1]; parameter[0] = int.class; Method getSimID = telephonyClass.getMethod(predictedMethodName, parameter); Object[] obParameter = new Object[1]; obParameter[0] = slotID; Object ob_phone = getSimID.invoke(telephony, obParameter); if(ob_phone != null){ imei = ob_phone.toString(); } } catch (Exception e) { e.printStackTrace(); throw new GeminiMethodNotFoundException(predictedMethodName); } return imei; } private static boolean getSIMStateBySlot(Context context, String predictedMethodName, int slotID) throws GeminiMethodNotFoundException { boolean isReady = false; TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); try{ Class telephonyClass = Class.forName(telephony.getClass().getName()); Class[] parameter = new Class[1]; parameter[0] = int.class; Method getSimStateGemini = telephonyClass.getMethod(predictedMethodName, parameter); Object[] obParameter = new Object[1]; obParameter[0] = slotID; Object ob_phone = getSimStateGemini.invoke(telephony, obParameter); if(ob_phone != null){ int simState = Integer.parseInt(ob_phone.toString()); if(simState == TelephonyManager.SIM_STATE_READY){ isReady = true; } } } catch (Exception e) { e.printStackTrace(); throw new GeminiMethodNotFoundException(predictedMethodName); } return isReady; } private static class GeminiMethodNotFoundException extends Exception { private static final long serialVersionUID = -996812356902545308L; public GeminiMethodNotFoundException(String info) { super(info); } } } Обновление Для проверки дуал сим: public boolean isDualSIM() { return imeiSIM2 != null && imeiSIM1 != null; } Для звонка попробуйте intent.putExtra("simSlot", 1);

Можно ли присоединить пользователя к другому tcp соединению, используя текущее?

#linux #tcp


Ситуация такая, что пользователь подключается к определенному адресу и порту, и я
не могу управлять его клиентом-программой, то есть повторно ещё одно соединение сделать,
потому что разорвется текущее соединение, и ему снова вручную придется подключится
уже к новому адресу, а мне нужно, чтобы он не отключался, но при этом сначала был подсоединен
к одному серверу, а потом, после того как получил с него данные, присоединился к другому,
так чтобы для него это было незаметно.
Как вариант можно сделать прокси и уже с него направлять трафик то туда, то сюда.
Но вариант с прокси не устраивает, потому что канал прокси перегрузится, а канал остальных
серверов будет почти пустовать.
Не знаю, доступно ли объяснил ситуацию. Сейчас только начинаю знакомство с сетями,
чтобы решить потом эту проблему, но даже без знаний с самого начала не понимал, как
можно иначе сделать, кроме как через прокси. Получается, клиент установил соединение
с ip сервера и портом, и, используя это соединение, я не могу сказать машине клиента,
чтобы она присоединилась к другому серверу?    


Ответы

Ответ 1



ответ из комментария: Насколько мне известно -- нет. Я знаю, что можно передать открытый сокет (файловый дескриптор) от одного процесса другому на том же хосте (через sendmsg()), но это отличается от того, что Вы описываете. По сути Вы хотите динамически управлять подменой dst-адреса установленного tcp соединения у клиента.

Получение изображения курсора над Flash

#delphi #flash


Веб-приложение на делфи, в качестве браузера использую компонент Tchromium. В него
загружаю сайт, в котором имеется игра на flash, с помощью кода:
var
CI: TCursorInfo;
begin
CI.cbSize := SizeOf(CI);
GetCursorInfo(CI);
Image1.Picture.Icon.Handle := CI.hCursor;

В image1 получаю изображения курсора. Но если курсор над Flash, и он там заменяется
своим курсором, то в image1 ничего не отображается. CI.hCursor равен 351474505, и этому
значению равен любой нарисованный курсор из flash.
Как можно получить точное изображение текущего курсора над flash или вообще отследить
это изменение?    


Ответы

Ответ 1



Вопрос в следующем - так ли необходимо писать собственную реализацию или можно использовать SCAR Divi? Он как раз позволяет написать свой скрипт. Хукает элементы интерфейса, флэш тоже (например, на нем пишут автокликеры для игр и прочее). Обновление @Sergei123 http://www.scar-divi.com/ - лично мне данное творение очень понравилось. Автор с пониманием дела относится к данному проекту. @Sergei123 порадовало, что есть возможность отслеживать появление в flash-игре какой-нибудь картинки и в соответствии с этим предпринимать какие-либо действия (произвести клик по координатам места появления картинки в отслеживаемой области). И еще. Скрипт - это я погорячился. Программа позволяет создать свое приложение с графическим интерфейсом (я же просто отслеживал все происходящее в бесконечном цикле и производил действия по условию).

Ответ 2



@vas, на счёт "Наверное, никак." очень сомнительный аргумент. ) Ибо всё, что мы видим на своём экране, уже в нашем компьютере, и всё можно вытащить, было бы желание. Но скорее всего в каждом случае подход будет свой, универсальный вы вряд ли найдёте. @Sergei123, это не предусмотрено стандартными API, потому hook мыши вряд ли поможет.

Ответ 3



Наверное, никак. flash plugin это по своей сути, hfepth? живущий по своим законам. Его код закрытый, и Вы влезть в него не сможете. Единственное, если игра Ваша, то можно из флеша отдать рисунок курсора через мост js наружу. Но у хрома свой plugin пеппер, посмотрите, может, у него открытые api есть.

Как отобразить русский текст?

#windows #сокет #cpp


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

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


Ответы

Ответ 1



Необходимо знать кодировку текста, например, она может быть указана в Content-Type http-заголовке и/или в xml-декларации и/или как внутри html-документа и т.д. Если данные из файла, то некоторые кодировки (utf-8, utf-16, utf-32) позволяют указывать BOM (специальная метка в начале файла). В худшем случае, существуют библиотеки такие как chardet, которые пытаются угадать кодировку по содержимому (это не всегда можно точно сделать). Нельзя содержимое называть текстом, если не известна его кодировка. Абсолютный Минимум, который Каждый Разработчик Программного Обеспечения Обязательно Должен Знать о Unicode и Наборах Символов Обновление Если кодировка текста известна, то шаг номер два: превратить байты в Юникодный текст. Для некоторых кодировок можно использовать MultiByteToWideChar(). Шаг номер три: отобразить Юникод. Для печати в консоль, можно использовать WriteConsoleW() или _setmode(_fileno(stdout), _O_U16TEXT); wprintf(L"%s\n", unicode_text); (printf, cout, wcout не должны использоваться в последнем варианте). Чтобы буквы были видны в консоли, нужно создать ярлык для приложения и настроить в нём шрифт (например, Lucida console) и запускать программу через ярлык. При печати в файл (и type) можно BOM добавить. Вот полный пример кода из msdn как напечатать Юникод текст в Виндовую консоль с cmd.exe: #include #include #include int main(void) { _setmode(_fileno(stdout), _O_U16TEXT); wprintf(L"\x043a\x043e\x0448\x043a\x0430 \x65e5\x672c\x56fd\n"); return 0; } Повторюсь: это решение не совместимо с printf(). Не нужно вызывать SetConsoleCP или SetConsoleOutputCP c вышеприведённым кодом. Единственное что нужно, чтобы (TrueType) шрифт был настроен в консоле (такой как Lucida Console).

Ответ 2



Как узнать русский или английский текст и как потом отобразить русский? Русские (точнее, нелатинские) символы всегда будут кодироваться одни байтом со значением > 127 в однобайтовой кодировке и секвенцией, начинающейся с байта со значением > 127 в utf-8 (подробнее в вики). В целом задача сводится к определению кодировки, и если определить utf-8/utf-16/utf-32 еще представляется возможным вручную, то с остальным зоопарком требуется сидеть со стат анализом и подбирать наиболее подходящую кодировку.

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

#android #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

    


Ответы

Ответ 1



Без логов ошибки сложно сказать, но вот мои предположения: Нет разрешения в манифесте на интернет Работа с сетью идёт в основном потоке (т.е. в 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);

Как сверстать border, аналогичный комбинации fieldset и legend?

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


Как сверстать такой border?



Сайт на bootstrap, то есть он не должен сползать.
Сейчас сверстан с помощью legend и fieldset, что не поддерживается в ie8 и ранних
версиях opera.
http://v.testjay.esy.es/
    


Ответы

Ответ 1



Можно так http://jsfiddle.net/rpmv8u9k/ - заголовок абсолютом сделан, минус в том, что заголовок если увеличиться, он не двигает текст. Или так http://jsfiddle.net/vnLw754b/ - заголовок через отрицательный margin, текст двигает, но позиционирование линий зависит от размера падинга у div, если он изменился нужно менять и отрицательный left/right у линий. Хотя это не проблема, можно падинг не указывать для div, а указать только для текста внутри. Если заголовок не меняется, то подойдут оба варианта, если меняется, то второй.

Постоянный токен vk api

#vkontakte_api #вконтакте


Здравствуйте!
Вот пишу приложение, работающее с vk api, и столкнулся с такой проблемой, что нужно
сделать в приложении авторизацию с получением токена (пока просто подставляю уже готовый
токен).
Собственно вопрос:
Обычно токены действуют 24 часа, после чего их снова надо менять. А можно ли получить
токен на более продолжительный срок, чтобы не было необходимости каждый день делать
новую авторизацию? По крайней мере другие приложения, работающие с vk api не требуют
ежедневной авторизации, а где-то хранят данные об авторизации. Как это организовано?     


Ответы

Ответ 1



В права доступа нужно добавить "offline" при получении токена для приложения и тогда, как говорит документация VKapi, "возможен доступ к API в любое время со стороннего сервера и токен является бессрочным "

Ответ 2



Для получения неограниченного по времени токена достаточно при авторизации добавить в scope значение offline. Пример: https://oauth.vk.com/authorize?client_id={ID приложения}&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=notifications,offline&response_type=token&v=5.52

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

#python #jar #java #resources


Всем привет.
Я в 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?    


Ответы

Ответ 1



А вот так не подойдет? 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 (взял здесь).

Утечки памяти (C++)

#память #cpp


Под утечками памяти понимают утечки при работе приложения или память может не освобождаться
даже после завершения работы программы? Насколько я понимаю, при завершении работы
программы ОС освобождает всю память, занимаемую им. Если так, то какие бывают способы
засорения памяти после завершения работы программы?    


Ответы

Ответ 1



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

Клонирование только определенной директории

#git #git_clone


Подскажите, как-то можно в git клонировать не весь проект ветки master, а только
1 директорию из этой ветки? И в дальнейшем работать с ней?    


Ответы

Ответ 1



Насколько я знаю, скачивать придётся всё равно весь master. Но можно чтобы "распаковывались" не все файлы. git init имяреп cd имяреп git remote add origin ссылка git fetch На этом этапе master (и все другие ветви) будут скачаны, но не распакованы. Теперь включим спецрежим: git config core.sparseCheckout true Укажем какие файлы мы хотим echo вот/этот/каталог >> .git/info/sparse-checkout И распакуем файлы: git checkout origin/master -B master В итоге вот/этот/каталог/файл.txt попадёт в рабочий каталог, а не/тот/каталог/файл.txt нет. Если в репозитории много ветвей и нужно экономить траффик, можно скачивать не все (например, после git remote add изменить файл .git/config, чтобы было не fetch = +refs/heads/*:refs/remotes/origin/*, а только fetch = +refs/heads/master:refs/remotes/origin/master), а также скачивать не всю историю (git fetch --depth=50).

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

#c_sharp #net


Для того, чтобы открыть ассоциированный файл, программа проверяет при запуске были
ли переданы в нее какие-либо параметры. Для простоты можно представить, что открывается
текстовый файл.

 private static void Main(string[] args)
 {
   if(args != null && args.Length > 0)
   {
     string fileName = args[0];
     // дальше что-то делаю с файлом
   }
 }


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


Ответы

Ответ 1



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

Получить и принять «trade offers» (Steam Web API)

#php #steam_web_api #steam


Здравствуйте. Только начал изучать Steam Web API, информации мало.

Хотел узнать, как с его помощью получить входящие предложения обмена и принять их?
Вот есть статья Steam Web API/IEconService, но мне самому в ней разобраться сложно.
    


Ответы

Ответ 1



Данная API не предоставляет возможность принятия входящего предложения обмена. С помощью нее можно лишь получить список предложений, отменить собственные, либо дать отказ на входящие. При этом она работает только для аккаунта, на который у тебя зарегистрирована API естественно. Пример запроса для получения списка предложений: http://api.steampowered.com/IEconService/GetTradeOffers/v1/?key=********&get_sent_offers=1&time_historical_cutoff=100 Подставляешь нужные тебе параметры, что описаны в мануале, и api ключ в место звездочек

Ответ 2



$url = 'https://steamcommunity.com/tradeoffer/' . $tradeID . '/accept'; $partnerID = ''; $tradeID = ''; $data = array( 'sessionid' => $sessionId, 'serverid' => '1', 'partner' => $partnerID, 'tradeofferid' => tradeID, 'captcha' => '' ); $c = curl_init(); curl_setopt($c, CURLOPT_HEADER, false); curl_setopt($c, CURLOPT_NOBODY, false); curl_setopt($c, CURLOPT_URL, $url); curl_setopt($c, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($c, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)"); curl_setopt($c, CURLOPT_COOKIE, $cookies); curl_setopt($c, CURLOPT_POST, 1); curl_setopt($c, CURLOPT_POSTFIELDS, http_build_query($data)); curl_setopt($c, CURLOPT_RETURNTRANSFER, true); curl_setopt($c, CURLOPT_HTTPHEADER, array('Referer: https://steamcommunity.com/tradeoffer/' . $tradeID)); curl_setopt($c, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($c, CURLOPT_CUSTOMREQUEST, strtoupper('POST')); $response = curl_exec($c); curl_close($c); echo $response; $TradeID можно найти отправив Get запрос на http://api.steampowered.com/IEconService/GetTradeOffers/v1/?key=[API_KEY]&get_received_offers=1&time_historical_cutoff=100 ; $sessionID и $cookies берем из авторизации.

Ответ 3



Данная API позволяет Вам получить трейд-оффера, как и их id-шники. Собсна принять их можно простым Post-запросом на https://steamcommunity.com/tradeoffer/"tradeId"/accept где tradeId - собственно, ID оффера. В шапке отправки нужно указать: {"sessionid", ...}, {"serverid", ...}, {"tradeofferid", ...}, {"partner", ...}, {"captcha", ...} Первые два параметры должны храниться в контейнере, который собирается при авторизации. Третий и четвертый параметры, будут получены через предложенный вами API, а Капча, по умолчанию, string.empty

Слияние в GIT и командная работа

#git #git_branch #git_merge


Помогите, пожалуйста, разобраться с командной работой в Git.
Пока работа настроена так:
2 программиста: 1 делает работу, другой проверяет.

Тот который делает получает таски, для выполнения каждого таска создает новую ветку
после после того как выполнил задание пушит эту ветку на сервер, сливает ветку со своим
мастером делает новую ветку для таска и т.д.

Проверяющий забирает ветки с сервера и делает проверку если все ок вливает их в мастер
отправляет на сервер. Если сделаны ошибки возобновляет таск.

Это все как-то коряво, я думаю можно сделать лучше, подскажите как, наведите на правильный
путь!

Сейчас проблемы возникают на этапе проверки при слиянии веток. Как можно слить только
те комиты которые были сделаны в сливаемой ветке ? 
    


Ответы

Ответ 1



Как можно слить только те комиты которые были сделаны в сливаемой ветке ? В git под термином «ветка» (branch) подразумевается указатель на коммит, а не набор коммитов, как в некоторых других системах управления версиями файлов. Иными словами, это точка, а не отрезок. Вам требуется перенести несколько коммитов (отрезок), а для этого нужно указать две точки. К примеру: одобренная задача решалась в ветке task125, а предыдущая, пока не одобренная задача, решалась в ветке task124. Тогда для включения (в текущую ветку) одобренных коммитов (отрезка между этими двумя точками) можно использовать такую, например, команду: git cherry-pick task124..task125

Свой атрибут/описание для public поля класса

#c_sharp #рефлексия #attribute


Есть у меня классы, у них открытые переменные. Я через reflection добираюсь до их
значений для последующего отображения/изменения.

По умолчанию - есть некоторый диапазон для изменения, условно -+20%.

Но для некоторых переменных есть свои особенности: -10%/+20% или 0..100. Это исключения,
они не многочисленны, но они есть.

Мне хочется, когда буду перебирать переменные, чтобы можно было прямо в коде задать
для переменной свой атрибут или не знаю как это называется - описание, которое я мог
бы пропарсить:

public int Length;

// Min: 0. Max: 100
public int Size;

[Range:20%]
public int Weight;


Чтобы было более наглядно: у Unity3D есть HideInInspector. Что-то похожее хочу сделать,
но более информативно.
    


Ответы

Ответ 1



Используйте для этого кастомные классы атрибутов, они для того и созданы, чтобы предоставлять мета-информацию об объектах в отражениях. Например, вот атрибут, позволяющий задавать диапазон для полей: [AttributeUsage(AttributeTargets.Field)] class RangeAttribute : Attribute { public int Percent { get; set; } public RangeAttribute (int percent) { Percent = percent; } } Задавать значение диапазона на поле можно так: class Foo { [Range(20)] public int Bar; } Ну а дальше — отражения: FieldInfo barField = typeof(Foo).GetField("Bar"); RangeAttribute barRange = barField.GetCustomAttribute(); int range = barRange != null ? barRange.Percent : 20; var foo = new Foo(); barField.SetValue(foo, 10); См.: Attributes Tutorial (MSDN) Writing Custom Attributes (MSDN) Creating Custom Attributes (MSDN)

Примитивные типы Java float и double

#java #float #double


Кто может подсказать максимальные размеры для float и double по вики:

float   32  от 3.4е-038 до 3.4е+038
double  64  от 1.7е-308 до 1.7е+308

По этому коду:

   System.out.println("MAX FLOAT : "+Float.MAX_VALUE);
   System.out.println("MIN FLOAT : "+Float.MIN_VALUE);
   System.out.println("MAX Double : "+Double.MAX_VALUE);
   System.out.println("MIN Double : "+Double.MIN_VALUE);


MAX FLOAT : 3.4028235E38
MIN FLOAT : 1.4E-45
MAX Double : 1.7976931348623157E308
MIN Double : 4.9E-324

Вопрос следующий, где правда?
    


Ответы

Ответ 1



Смотрите. Есть разница между минимальным нормализованным и ненормализованным значениями. 1.1754943508222875E-38f — это минимальное нормализованное, 1.401298464324817E-45f — минимальное ненормализованнoе значение для float. Вот официальная документация. Немного теории. Обычно числа с плавающей запятой записываются внутри в виде мантисса + экспонента, где мантисса — это число от 0.1 до 1, а экспонента — показатель степени десятки. Например, число 0.0015 содержится как 0.15 + степень 10^-2, 44 — как 0.44 и степень 10^2. (На самом деле там то же самое в двоичном виде, степени двойки и числа между 1 и 2^-1. Но важен принцип.) Под мантиссу отводится фиксированное количество разрядов, стартовая цифра выбрасывается для экономии (потому что она должна быть равна 1 в двоичной системе). Так вот: можно немного выйти за нижнюю грань, используя денормализованные числа — числа наподобие 0.0000156 * 10^-38. У них точность хуже, чем у нормальных чисел, т. к. старшие разряды мантиссы используются для укказания величины. Но это лучше, чем просто 0.