Страницы

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

воскресенье, 7 апреля 2019 г.

Почему IDE требует С++ компилятор для С кода?

Code::Blocks 8.02 Ubuntu 10.04 LTS (x86_64) Пишу Сишный код. Компилятор ругается, что нет g++, и просит установить. Установил. Заработало. Теперь вопрос, в чем отличие скомпилированного кода Си в gcc от кода Си в g++?


Ответ

Почему IDE требует С++ компилятор для С кода?
Все очень просто. В качестве линкера (компоновщика связей) используется g++:
gcc -Wall -O2 -c /home/gaal/TEST/TEST/main.c -o obj/Release/main.o g++ -o bin/Release/TEST obj/Release/main.o -s
Теперь вопрос, в чем отличие скомпилированного кода Си в gcc от кода Си в g++?
См. комментарии к предыдущему ответу. Если компилятор — gcc, а линкер — g++, то просто будут добавлены зависимости от библиотек C++. Если компилятор и линкер — g++ с ключами для C-кода, то опять же будут определенные библиотеки. Но по идее код будет «Сишным».

Оптимизация mysql запросов

Назрело несколько вопросов по оптимизации mysql запросов. К примеру, на главной странице форума выводятся последние 5 сообщений. Формат такой: форумная тема - короткий текст - ник - группа пользователя. До недавнего момента я бы писал что-то типа такого: /* таблица posts: id, user_id, theme_id, text таблица users: id, nick, group_id таблица themes: id, name таблица groups: id, name */ $posts = $db->execAndReturnAll('select `id`, `user_id`, `theme_id`, `text` from `posts` order by `id` desc limit 5');
$users = array(); $themes = array(); $groups = array();
$l = sizeof($posts); for($i = 0; $i < $l; ++$i) { if(!in_array($posts[$i]['user_id']), $users) $users[] = $posts[$i]['user_id']; if(!in_array($posts[$i]['theme_id']), $themes) $themes[] = $posts[$i]['theme_id']; }
$users = $db->execAndReturnAll('select `id`, `nick`, `group_id` from `users` where `id` in (0,'.implode(',', $users).')'); $themes = $db->execAndReturnAll('select `id`, `name` from `themes` where `id` in (0,'.implode(',', $themes).')');
$l = sizeof($users); for($i = 0; $i < $l; ++$i) { if(!in_array($users[$i]['group_id']), $groups) $groups[] = $users[$i]['group_id']; }
$groups = $db->execAndReturnAll('select `id`, `name` from `groups` where `id` in (0,'.implode(',', $groups).')'); Но меня что-то берут сомнения, а целесообразно ли посылать 4 простых запроса к БД или расходы на передачу запросов туда-обратно себя не окупят и лучше написать один сложный запрос? 2) Стоит ли перекладывать на mysql всевозможные расчеты или лучше оставить это php? То есть, что лучше: $data = $db->execAndReturn('select `width`, `height`, `width`*`height` as `square` from `rectangles` limit 1'); или $data = $db->execAndReturn('select `width`, `height`, from `rectangles` limit 1'); $data['square'] = $data['width'] * $data['height']; 3) Есть ли какие-либо инструменты для тестирования скорости запросов к БД? Заранее спасибо.


Ответ

В Вашем случае лучше написать один сложный. По поводу расчетов, mysql сделает их быстрее. Все таки php - это интерпритатор и любые лишние действия - это нагрузка. Но судя по Вашему коду, у Вас не нагруженный проект, так что такие действия (такие, как умножение) делайте там, где Вам удобнее :) Инструменты для тестирования: explain... и $start_time = microtime(true);
// выполнение действий
$exec_time = microtime(true) - $start_time;

Как избавиться от ошибки ValueError в Python?

При вводе пустого или буквенного значения в строке float(raw_input()) возвращается ошибка ValueError; что нужно сделать, чтобы она не появлялась, а запрос повторялся?


Ответ

raw_input() принимает ввод с клавиатуры. float() это цифровое значение, следовательно рас вы оборачиваете raw_input() то вводить нужно только цифры. Вот ещё варианты использование raw_input(): >>> int(raw_input("Input int (43): ")) Input int (43): 44 #ВВодим 44 44 >>> str(raw_input("Input str (text): ")) Input str (text): text text #Вводим text text 'text text' >>> float(raw_input("Input f (32): ")) Input f (32): 598 #Вводим 598 598.0 А еще можете пользоваться try: (except:) для обработок ошибок. Если вам нужно вводить и текст и цифры и всё подряд, то пользуйтесь вторым моим приведенным вариантом, там прокатит всё и пустое значение и цифры: >>> str(raw_input("Input str (text): ")) Input str (text): text text #Вводим text text 'text text' А так он ожидает только лишь цифру.

Абстрактные классы в Delphi

Допустим, есть базовый класс. В нем объявляем abstract virtual функцию. В наследнике реализуем эту функцию (перекрываем override). Вопрос: можно ли вызывать эту функцию в базовом классе? ПС: Спрашиваю потому, что встретился с такой ситуацией в чужом коде. До этого думал, что это невозможно.


Ответ

Можно. Смысл в том, что экземпляров базового абстрактного класса у вас никогда не будет. Будет экземпляр конкретного дочернего класса, в котором этот метод точно переопределен. Этот шаблон проектирования, кстати, называется Шаблонный метод (Template method): в базовом абстрактном классе мы собираем некоторый алгоритм из абстрактных методов. И уже от дочерних конкретных классов будет зависеть работа этого алгоритма. Пример: в базовом классе TCocktail определяется процедура приготовления коктейля. Дочерние классы реализуют конкретные этапы этого процесса. Базовый класс: type TCocktail = class protected procedure AddFirstIngridient(); virtual; abstract; //Добавление первого ингридиента procedure AddSeconsIngridient(); virtual; abstract; //Добавление второго ингридиента procedure AddDecorations(); virtual; abstract; //Добавление украшений function GetName(): string; virtual; abstract; //Название public procedure Prepare; //Алгоритм приготовления коктейля end;
{ TCocktail }
procedure TCocktail.Prepare; begin writeln('Готовим коктейль ' + GetName()); AddFirstIngridient(); AddSeconsIngridient(); AddDecorations(); writeln('Ваш коктейль готов'); end; Первый коктейль type TBloodyMary = class (TCocktail) protected procedure AddFirstIngridient();override; procedure AddSeconsIngridient();override; procedure AddDecorations();override; function GetName(): string;override; end;
{ TBloodyMary }
procedure TBloodyMary.AddDecorations; begin writeln('Добавляем лед'); end;
procedure TBloodyMary.AddFirstIngridient; begin writeln('50мл водки'); end;
procedure TBloodyMary.AddSeconsIngridient; begin writeln('150мл томатного сока'); end;
function TBloodyMary.GetName: string; begin result := 'Кровавая Мэри'; end; Второй коктейль type TIrishCoffee = class (TCocktail) protected procedure AddFirstIngridient();override; procedure AddSeconsIngridient();override; procedure AddDecorations();override; function GetName(): string;override; end;
{ TBloodyMary }
procedure TIrishCoffee.AddDecorations; begin writeln('50 сливки (33%)'); end;
procedure TIrishCoffee.AddFirstIngridient; begin writeln('50мл ирландского виски'); end;
procedure TIrishCoffee.AddSeconsIngridient; begin writeln('80мл кофе'); end;
function TIrishCoffee.GetName: string; begin result := 'Ирландский кофе'; end; Ну и сам код: var cocktail: TCocktail; begin cocktail := TBloodyMary.Create; cocktail.Prepare;
cocktail := TIrishCoffee.Create; cocktail.Prepare;
readln; end.

Что означает #define WINVER

Без этого объявления моя программа не компилируется. Что это значит и почему 0x501? #define WINVER 0x0501


Ответ

Это объявление указывает версию винды, для которой производится сборка. 0x0500 - Windows 2000 0x0501 - Windows XP 0x0502 - Windows Server 2003 0x0600 - Windows Vista 0x0601 - Windows 7 В Вашем случае версия ОС не определяется при компиляции. Поэтому WINVER объявляется вручную.

Удаление узла бинарного дерева

Есть бинарное дерево, надо удалить из него элемент. Нашел вариант - удаляем элемент а на его место ставим либо самый правый элемент его левого поддерева либо самый левый его правого поддерева. Вопрос: как это лучше всего организовать? Логично, что надо у замещающего элемента дописать указатели на поддеревья а у его владельца заменить указатель на него на NULL, причем у владельца удаляемого элемента заменить указатель на замещающий элемент. Если делать все в лоб, то нужны 2 указателя на поддеревья, указатели на родителей и указатели на сами элементы. Есть ли некий правильный способ удаления без этого гемора? Возможно более оптимизированный. Просьба посмотреть мой код строка 164 - функция не линкуется, а вроде нормально написано.


Ответ

В случае бинарного дерева поиска рекомендую посмотреть корректный алгоритм в Кормене ("Алгоритмы. Построение и анализ" - страница 326), либо в более простом и наглядном варианте здесь. В обоих случаях используется классическая структура данных для хранения BST, в которой элемент представлен кортежем (parent, left, right, data) В случае же обычного бинарного дерева нетривиальна только ситуация, когда у удаляемого элемента ссылки left и right - не null. В этой ситуации необходимо совершить обход по дереву в сторону left или right, найти первый возможный лист в дереве и заменить удаляемый элемент на данный лист. Для оптимизации такой операции возможно хранить в каждом узле дерева дополнительное поле leaf, которое будет указывать на такой возможный лист, чтобы избежать прохода по ветке дерева в случае удаления элемента. Хотя, как мне кажется, интерес в такой оптимизации является сугубо теоретическим.

jQuery не обрабатывает созданный элемент.

Добрый день. Создаю Div с помощью jQuery: $("#main").append("

"); Однако если вызвать функцию $('#one a').click(function() { alert('1'); }); Алерт не срабатывает. Подскажите пожалуйста в чем ошибка?


Ответ

Дело в том, что .click() навешывает обработчики только на существующие элементы DOM, чтобы навесить обработчик на тот элемент, которой возможно будет создан динамически, используйте .on() или ему подобные, делегирующие методы: .bind(), .delegate(), .live(). $("#one a").on("click", function(event){ alert('1'); }); или $(document).on("click", "#one a", function(event){ alert('1'); });

Русские слова с маленькой буквы

Здравствуйте. Как выразить регулярное выражение, отсевающее русские слова, начинающиеся с маленькой буквы?


Ответ

$string = "Здравствуйте, помогите написать регулярное выражение отсевающее Русские слова начинающиеся с маленькой буквы."; $pattern = '/(^|\s|\b)+[^А-Я]+/u'; echo preg_replace($pattern, ' ', $string);

Сравнение хешей строк

Допустимо ли делать выводы о равенстве содержимого строк на основе равенства их хешей?


Ответ

В общем случае, хэширование не является взаимно однозначным отображение, то есть нельзя утверждать, что две разные строки дадут два разных хэша. Возьмем для примера MD5 хэш. На вход поступает строка произвольной длины. На выходе - хэш длиной 128 бит. Таким образом, на входе бесконечное множество, а на выходе - конечное. Очевидно, что в бесконечном множестве найдется бесконечное количество строк, которые дадут один и тот же хэш.

Замена символов через регулярное выражение

Небольшие знания о регулярках у меня есть. Мне надо почитать, как использовать в java регулярные выражения. Подскажите, пожалуйста, что можно почитать. И второй вопрос: как в java составить регулярное выражение для замены всех символов // и \\ на /?


Ответ

Шаблон примерно такой:
Pattern pattern = Pattern.compile("Здесь будет регулярное выражение"); Matcher matcher = pattern.matcher("строка для разбора"); String result = matcher.replaceAll("/"); // строка с результатом (замена всего найденного на "/")
Ну, а дальше тренируйтесь составлять regExp =)

MySQL vs PostgreSQL vs SQLite для высоконагруженных сайта на PHP?

Здравствуйте! Подскажите, пожалуйста, какую БД выбрать(MySQL vs PostgreSQL vs SQLite) для высокоангруженного сайта на PHP в котором будет примерно 300 000 статей, и 50 000-60 000 заходов на сайт в день? Спасибо!


Ответ

Ну для больших проектов SQLite точно не стоит выбирать. А что касается MySQL и PostgreSQL, то это скорее зависит от собственных предпочтений и кривизны рук)) Несколько интересных ссылок: PostgreSQL vs MySQL: есть тесты на больших таблицах? PostgreSQL vs MySQL vs ... MySQL vs PostgreSQL

Мнимые числа в python

Добрый день, есть список, примерно такой: [(0.55773011861+0.966016929j), (1.63099590361+2.82465006773j), (2.4131580717499039+4.17971238644j)] нужно у комплексных чисел взять мнимые или реальные части, т.е получить: [0.5577301186126, 1.630812759959036, 2.413158071749903] И наоборот, что-то пока не пойму как это сделать, а в поисковике ничего толкового не нашёл. Заранее спасибо за помощь.


Ответ

m = [(0.55773011861+0.966016929j), (1.63099590361+2.82465006773j), (2.4131580717499039+4.17971238644j)]
[n.real for n in m] [0.55773011861, 1.63099590361, 2.413158071749904]
[n.imag for n in m] [0.966016929, 2.82465006773, 4.17971238644] Думаю вы об этом

Как правильно прочитать файл?

Всем привет! У меня есть обычный текстовый файл, в котором каждый новый элемент - это новая строка. Пример файла:
Игра Строитель Лампа Стол
И вот мне надо загрузить это всё в listBox, чтобы каждая строка в файле была отдельной строкой в listBox'e. Когда я делаю так:
using (StreamReader sr = new StreamReader(File.Open("history.txt", FileMode.Open))) { listHistory.Items.Add(sr.ReadToEnd()); }
У меня всё в одной строке.


Ответ

Если "каждый новый элемент это новая строка", т.е. файл выглядит так:
Игра Строитель Лампа Стол
тогда можно решить так:
using (StreamReader sr = new StreamReader(File.Open("history.txt", FileMode.Open))) { while (!sr.EndOfStream) listHistory.Items.Add(sr.ReadLine()); }

Изменение url в адресной строке браузера

Возник вопрос такого плана: Имеется сайт "site.ru" необходимо по AJAX'у подгрузить страницу с пользователями, которая располагается по адресу "site.ru/users/". Подгрузить то я подгрузила, только встает другой вопрос: как сделать так, чтобы в адресной строке браузера тоже изменилось url на "site.ru/users/", просто хочу весь сайт перевести на AJAX, но вот думаю, пользователям не понравится, что они, к примеру не смогут дать своим друзьям ссылку на самих себя ну или иную другую страницу. Вот сайты типа vk.com и odkl.ru они же тоже на AJAX'е подгружают контент, иначе бы было невозможно слушать музыку и передвигаться по страницам, и хочу заметить, что URL у них изменяется. Прошу гуру мне помочь.


Ответ

Чтобы без перезагрузки сменить адрес в браузере можно использовать History API, а именно pushState. Само собой, это будет работать только в браузерах, которые поддерживают HTML5 Простейший пример: var redirect = '/users/'; history.pushState('', '', redirect); За большим идите по ссылке и знакомьтесь с деталями.

Карта от гугла со своими иконками и описанием

Доброго всем времени суток Нашел такое. т.е. карта гугла, по верх нее есть иконки фирмы, причем если карту двигать - иконки тоже двигаются. И это далеко не 1 сайт в интернете такой. Есть аналогичные сайты с еще более продвинутыми картами. Там рядом располагаются надписи, уже под картой гугла, т.е. на самой странице, и при нажатии на них без перезагрузки страницы на нужной иконке всплывает подпись - где кратенько написано описание магазина. Господа, хотел бы за раз спросить много и получить развернутый ответ. Как такая штука называется? (гугление на тему - карта гугл со своими иконками, не дало результатов за которые можно зацепиться) Может ли кто подробно объяснить как сделать такую карту с иконками Как сделать ссылки, при нажатии на которые на карте появлялась подпись сделанная самостоятельно p.s. очень очень охота обойтись кодом PHP+MySQL + JS + ( возможно JQ )


Ответ

Все такие штуки и много других можно делать через апи гуглокарт. API Demo Gallery Примеры кода

Дистрибуция приложения, зависящего от библиотеки, не присутствующей в репозиториях

Мое приложение зависит от библиотеки, которая существует только в виде исходников. Она имеет лицензию LGPL, поэтому я не могу статически прилинковать ее к приложению. Возможно ли сделать так, чтобы она лежала в папке с приложением и бралась оттуда? Как это сделать? Приложение и библиотека на Qt и собираются в Linux и Windows. Я спрашиваю о том, как сказать приложению, что библиотеку надо искать не в /usr/bin, а в папке с бинарником?


Ответ

@Robotex, на Ваш вопрос Т.е. я не имею права скомпилить библиотеку в .so и положить внутрь пакета с моим приложением? я бы ответил отрицательно. Действительно, самыми простыми способами будет: установить .so (например в /usr/local/bin), прописать ее в /etc/ld.so.conf.d и запустить ldconfig (или перезагрузить комп) прописать в LD_LIBRARY_PATH путь к библиотеке (в составе приложения) где-нибудь в ~/.bashrc запускать приложение через shell скрипт, в котором прописать в LD_LIBRARY_PATH путь к библиотеке Но, все эти способы требуют некоторых действий по установке приложения, а иногда хочется что-то вроде tar xvf my-progs.tar export PATH=$PATH:/tram-pam-pam/my-progs и my-bestprog arg1 arg2 Такую штуку можно сделать, написав некую "обертку" к программе, использующей .so, если известно взаимное (относительное) расположение "обертки", программы и оглавления с .so "Обертка" будет вычислять абсолютный путь, откуда ее запустили (в смысле где она лежит), добавлять к environment LD_LIBRARY_PATH путь к библиотеке и запускать основную программу. Например это можно реализовать так: // txaxa.c программа вызывающая функцию xaxa() из shared library #include #include
int main (int ac, char *av[]) { int i;
for (i = 0; i < ac; i++) printf ("av[%d] = [%s]
",i,av[i]);
xaxa("xa-xa");
exit(0); } А это функция в shared library // xaxa.c эта функция помещается в shared library libxaxa.so #include
void xaxa (char *txt) { printf ("shared lib xaxa(): %s
",txt); } Соберем приложение xaxa avp@avp-ubu1:~/hashcode/tst$ gcc -fPIC -shared xaxa.c -o libxaxa.so avp@avp-ubu1:~/hashcode/tst$ gcc -o xaxa txaxa.c -L. -lxaxa Добавим "обертку" // rxaxa.c добавляет к LD_LIBRARY_PATH ./lib, где в ./lib/libxaxa.so лежит xaxa() // и вызывает "приложение" xaxa (txaxa.c) #include #include
int main (int ac, char *av[]) { fprintf (stderr,"%s
", exewithlibso ("./xaxa","lib",av)? "Can't find path to executable": "execvp error
"); exit (1); } И соберем в каталоге .prog наше приложение avp@avp-ubu1:~/hashcode/tst$ gcc rxaxa.c guessfrom.c -o rxaxa avp@avp-ubu1:~/hashcode/tst$ mkdir prog avp@avp-ubu1:~/hashcode/tst$ mkdir prog/lib avp@avp-ubu1:~/hashcode/tst$ cp libxaxa.so prog/lib/ avp@avp-ubu1:~/hashcode/tst$ cp xaxa rxaxa prog/ avp@avp-ubu1:~/hashcode/tst$ tar cvf my-prog.tar ./prog/ ./prog/ ./prog/lib/ ./prog/lib/libxaxa.so ./prog/xaxa ./prog/rxaxa Теперь распакуем .tar куда-нибудь и можно вызывать (все работает) avp@avp-ubu1:~/hashcode/tst$ cd /tmp avp@avp-ubu1:/tmp$ tar xf /home/avp/hashcode/tst/my-prog.tar avp@avp-ubu1:/tmp$ ./prog/rxaxa call xaxa av[0] = [./prog/rxaxa] av[1] = [call] av[2] = [xaxa] shared lib xaxa(): xa-xa avp@avp-ubu1:/tmp$ PATH=$PATH:/tmp/prog/ avp@avp-ubu1:/tmp$ cd avp@avp-ubu1:~$ pwd /home/avp avp@avp-ubu1:~$ rxaxa call xaxa and it works av[0] = [rxaxa] av[1] = [call] av[2] = [xaxa] av[3] = [and] av[4] = [it] av[5] = [works] shared lib xaxa(): xa-xa avp@avp-ubu1:~$ А вот функции, которые делают эту штуку // avp 2012
#include #include #include #include #include #include #include #include
/* Разбивает путь к файлу (pname) на имя файла и каталоги Каталаги возвращаются в path Имя файла в name */ static void splitpathname(char *pname, char *path, char *name) { char *p = pname+strlen(pname)-1;
*path = *name = 0; while ((p >= pname) && (*p != '/')) p--; strcpy(name,p+1); if (p > pname) strncat(path,pname,p-pname); }
/* Проверяет можно ли выполнить (exec) путь av0 Если да, возвращает 1 и кладет в pfrom absolute path к программе, а по адресу exe (если не NULL) последний компонент из av0 (имя программы) иначе возвращает 0 */ static int checkexe (char *av0, char *pfrom, char *exe) { struct stat st;
if (stat(av0,&st) == 0 && (st.st_mode & S_IFREG) && access(av0,X_OK) == 0) { char name[PATH_MAX], path[PATH_MAX];
splitpathname(av0,path,name); if (path[0]) { char curwd[PATH_MAX]; getcwd(curwd,PATH_MAX); chdir(path); getcwd(pfrom,PATH_MAX); chdir(curwd); } else { strcpy(pfrom,"."); } if (exe) strcpy(exe,name); return 1; } return 0; }
static int getpathpart (char **pb, char *p) { if (!*pb) return 0; char *t = *pb; int l = 0;
while (*t && *t == ':') t++; if (*t) *pb = t; while (*t && *t != ':') p[l++] = *t++; p[l] = 0; return l; }
/* Функция определяет абсолютный путь к запущенной программе по значению argv[0] с учетом envirinment PATH
Returns 1 OK 0 установить путь не удалось В случае успеха возвращает в pfrom найденный путь (без имени программы), а в exe имя программы */ int guessfrom (char *av0, char *pfrom, char *exe) { if (!av0 || *av0 == 0) return 0;
if (checkexe(av0, pfrom, exe)) return 1; int l; char *beg, pexe[PATH_MAX];
for (beg = getenv("PATH"); l = getpathpart(&beg,pexe); beg += l) { pexe[l] = '/'; strcpy(pexe+l+1,av0); // printf ("pexe: [%s]
",pexe);
if (checkexe(pexe,pfrom,exe)) return 1; }
return 0; }
/* Добавляет компонент в начало environment переменной типа LD_LIBRARY_PATH, PATH и т.п. */ void addtopath (char *pathname, char *elem) { char *p = getenv(pathname), *t; int l = strlen(elem); if (p && (t = strstr(p,elem))) { if (t[l] == 0 || t[l] == ':') return; }
char newpath[l+1+ (p? strlen(p): 0)];
strcpy(newpath,elem); if (p) { newpath[l] = ':'; strcpy(newpath+l+1,p); } setenv (pathname,elem,1); }
/* Запускает программу, добавляя компонент к LD_LIBRARY_PATH prog - относительный путь к программе libdir - относительный путь к оглавлению с .so, добавляемому к LD_LIBRARY_PATH av - аргументы (включая argv[0]) запускаемой программы Returns 0 - не удалось выполнить execvp -1 - не удалось определить путь к программе */ int exewithlibso (char *prog, char *libdir, char **av) { char path[PATH_MAX];
if (guessfrom(av[0], path, 0)) { // printf ("I am from: [%s]
",path); int l = strlen(path); path[l] = '/'; strcpy(path+l+1,libdir); addtopath("LD_LIBRARY_PATH",path); // printf ("ld_path: [%s]
",path); path[l] = '/'; strcpy(path+l+1,prog); execvp(path,av); return 0; } return -1; } Вроде работает. Собственно, подобная идея (правда в плане чтения конфигурационных файлов) о "сомонастраивающихся" программах была у меня давно, а вот заинтересовался Вашим вопросом и реализовал для .so Если понравилось, пользуйтесь.

Разница адресов в C

Есть следующий код: int main() { int a = 1; int b = 2; printf("%d", &a - &b); return 0; } Вопрос 1: Почему адрес переменной a больше адреса b. Вопрос 2: Почему разница адресов равна 3?


Ответ

Спешу порадовать, что конструкция &a - &b на мой взгляд может отработать как угодно. Если рассуждать логически, то память под переменные a и b выделяется на стеке. Т.е. от старших адресов к младшим. Причем память должна выделяться в порядке объявления переменных. Это и есть ответ на вопрос 1. Обычно переменные на стеке выделяются подряд, без промежутков. Но тут уж как повезет, т.к. может быть включено выравнивание памяти. И тогда все адреса всех объектов будут кратны каким-то значениям (например, 8 байтам). Более того, у меня лично программа выводит ответ 1. Это означает, что разница в адресах равна одному элементу размера int. А что будет, если компилятор попытается соптимизировать эти инструкции - вообще загадка. И еще попробуйте найти разницу с программой такой: #include
int main() { int a = 1; int b = 2; printf("%d", (char*)&a - (char*)&b); return 0; } Прошу обратить внимание, что включение заголовка stdio.h необходимо, иначе у компилятора немного крышу может сорвать.

Утечка памяти - потоки и серелизаторы (Thread и Serialize)

Имеется многопоточное приложение, использующее в потоках сериализаторы и десериализаторы, а так же очередт.. Потоки используются класса Thread, серелизаторы DataContractJsonSerializer (с методами ReadObject и WriteObject - с одним параметром, Type), а в качестве очереди используется Queue. Периодически создаются объекты, которые добавляются в очередь для последующей обработке конвейерном ещё в одном потоке. Очередь обрабатывается быстро, быстрее чем в неё поступают данные. В приложении имеется утечка памяти (Working Set растет за час примерно мегабайт на 10 - смотрю через Process Explorer v15.22, - а за пару суток набигает до 512 МБайт). Приложение использует десериализацию в 2-3 потоках каждые 5-15 секунд. Вопрос: в какую сторону копать - искать утечку памяти в потоках или сериализаторах, или может даже в очереди (в последнем я очень сомневаюсь) ?


Ответ

Копать нужно только в одном направлении. Вот простая, но хорошая методика поиска утечек, которая скорее всего поможет: подбираем методику, которая приводит к утечке памяти (в соответствии с TaskManager или по факту OutOfMemory). В Вашем случае это просто запустить и подождать часок-другой. Скачиваем Memory analysis tool (тут зависит от желания - кто то может потратить штуку денег и купить крутой анализатор, а кто то может скачать простой, написанный на коленке). К примеру этот его 10 дней триала может хватить. Либо этот от МС с описанием. Тут ещё гугл может очень помочь. запустив программу под анализатором, смотрим результат. Обычно, если есть утечка, то каких то определенных объектов в памяти оказывается очень много. В некоторых случаях можно запускать несколько раз подряд с разной длительностью и смотреть на динамику. Если каких то объектов 1000, но кол-во не изменяется - может они просто кешируются. А течь может один объект в минуту, но на 10 мб. И даже через час их будет 60 штук. вычислив объект(ы), количество которых растет, ищем в памяти их жизненный цикл, гуглим, спрашиваем о них на хэшкоде. Поначалу будет казаться сложно - в дампе тысячи объектов. Но потом придет понимание и они не будут замечаться.

Многомерные массивы python

Как написать функцию которая генерируют Многомерный массив изходя из входных данных. например входит число N, то результатом будет массив N на N


Ответ

Если нужны именно массивы array.array или bytearray, то никак. В Python нет многомерных массивов. Разве что сделать одномерный массив размером n*n, и обращаться по индексу x+n*y. Например, как bytearray(n*n) или, скажем, array.array("l", [0 for _ in range(0, n*n)]) Если под понятие «многомерного массива» подойдет понятие «списка списков» (списки в CPython реализованы именно как массивы), то, собственно, сделать их. Например, так: >>> n = 3 >>> [[0 for _ in range(0, n)] for _ in range(0, n)] [[0, 0, 0], [0, 0, 0], [0, 0, 0]] Если нужны именно матрицы, то можно воспользоваться NumPy >>> numpy.matrix(numpy.zeros((n, n))) matrix([[ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.]]) Или, если нужны не матрицы (а n×n было частным случаем), то, непосредственно, numpy.array >>> numpy.zeros((n, n)) array([[ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.]]) Или, как верно замечает @mikillskegg, например, если требуется массив не чисел, то вместо numpy.array/numpy.zeros можно воспользоваться более низкоуровневым интерфейсом numpy.ndarray >>> a = numpy.ndarray(shape=(n, n), dtype=(unicode, 1)) >>> a.fill(u"X") array([[u'X', u'X', u'X'], [u'X', u'X', u'X'], [u'X', u'X', u'X']], dtype='

Python и ОС Linux

Привет! Интересует следующий вопрос. Если написанный на Python проект собрать, допустим через Pyinstaller (он поддерживает Линукс, судя по заявлениям разработчиков) в ОС Ubuntu. Смогу ли я использовать его на Centos допустим в дальнейшем? P.C Не спрашивайте, пожалуйста, почему сразу не собрать ни Centos.


Ответ

Для Linux посмотрите пакет "pyfreeze". Для Windows есть аналог - "py2exe". На сколько я помню, эти пакеты, как раз, собирают все используемые в коде модули и создают инсталятор.

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

Сейчас при первом запуске программы я считаю хэш файла, сохраняю его и во время второго запуска просто сравниваю его со вновь посчитанным. Проблема в том, что это долго. Хотелось бы уметь проверять файл на изменения без подсчёта хэша. Тут можно было бы запоминать время последнего изменения, но никто не гарантирует, что файл не заменят другим файлом с таким же временем последнего изменения. Такие гарантии можно было бы получить запоминанием inode, но пока я не могу найти как в C# по имени файла получить inode. Да и работать это будет не на всех файловых системах. Как лучше всего решить эту проблему? Как это делает, например, Dropbox?


Ответ

Я бы посоветовал просто проверить дату последнего изменения. Объясняю, почему. Если вы хотите выяснить, изменился ли файл обычным образом -- то есть, не редактировал ли его кто-то, проверки даты должно быть достаточно. Это -- правильный, честный способ. Если же вы хотите переиграть злонамеренного пользователя, то вы уже проиграли: он может сделать что угодно, выставить любую дату изменения, подменить контрольную сумму, которую ваша программа где-то хранит, подменить содержимое файла при запросе только от вашей проверяющей процедуры, да что угодно. Не пытайтесь выиграть на чужом поле.

Как сделать весь блок ссылкой?

Подскажите, как сделать весь блок div ссылкой? А также применить к нему псевдоклассы hover и т.д.


Ответ


Click me Кроссбраузерно ли? Не смотрел!

Когда вызывается оператор преобразования типов?

#include using namespace std;
class three_d { int x, y, z; public: three_d(int a, int b, int c) {x=a; y=b, z=c; } three_d operator+(three_d op2); friend ostream &operator<<(ostream &stream, three_d &obj); operator int() {return x*y*z;} }; ostream &operator<< (ostream &stream, three_d &obj) { stream << obj.x << ", "; stream << obj.y << ", "; stream << obj.z << endl; return stream; } three_d three_d::operator+ (three_d op2) { x+=op2.x; y+=op2.y; z+=op2.z; return *this; }
int main() { three_d a(1, 2, 3), b(2, 3, 4); cout << a << b; cout << b+100 << endl; //31 line cout << a+b << endl; // 32 system("pause"); return 0; } В 31 строчке объект b приводится к int, потому что справа значение int, но зачем в 32 строчке привидении работает после того как выполнился operator+? Ведь тут два объекта с обоих сторон, почему тогда вызывается функция преобразования или как оно там называется, да ещё и в конце?


Ответ

Проблема в том, что ваш объект суммы не lvalue. Для него нужно const
friend ostream &operator<<(ostream &stream, const three_d &obj);
Без const cout << a+b трактуется не как
operator<<(cout, a+b) // ostream &stream, three_d &obj
а как
operator<<(cout, (int)(a+b)) // ostream &stream, const int& i
Объект, не являющийся lvalue, не может быть использован с не-const-ссылкой.

Смотрите, что происходит.
Компилятор пытается понять, что же ему вызывать для выражения cout << a + b
Поскольку a + b -- не lvalue, то ostream &operator<< (ostream &stream, three_d &obj) отпадает. Раз так, компилятор смотрит, как он может преобразовать аргументы, чтобы другие функции подошли.
Компилятор пробует известные ему операторы <<. Когда он пробует ostream &operator<< (ostream &stream, const int &i), он видит, что можно использовать этот оператор, если преобразовать второй аргумент в int. Поскольку вы предоставили преобразование, этот вариант проходит.

Отдельно от темы: ваш оператор сложения -- ужас! Вы модифицируете первое слагаемое!
Представьте себе, если бы сложение чисел вело себя так:
int a = 5; int b = 7; int c = a + b; // здесь внезапно a == 12
Ваш код ведёт себя именно так.
Вот как надо:
three_d three_d::operator+ (three_d op2) { return three_d(x + op2.x, y + op2.y, z + op2.z); }

Вычислить сумму членов бесконечного ряда


Помогите пожалуйста написать на си. Вроде не сложно, но с математикой не идут задачи у меня.


Ответ

Ну, смотрите. Для начала, ваша сумма неправильно раскрыта: для n = 0 имеем x^0 / 0!, то есть 1, а не x Итак, начальное значение слагаемого 1. Чтобы перейти к новому слагаемому на i-ой итерации, надо домножить на x^2 и разделить на (2*i - 1) * (2 * i). Дальше ясно? Кстати, возведение в степень не нужно, если делать, так, как описано. С другой стороны, известно, что для лучшей точности вычислений необходимо начинать суммирование с наименьших по модулю чисел. То есть, считать лучше с конца. Для этого превратим один цикл в два: цикл от i = 0, x = 1 пока |x| >= eps увеличиваем i, x домножаем на x0 * x0 и делим на (2*i - 1) * (2 * i) цикл пока i >= 0 увеличиваем сумму на x, делим x на x0 * x0 и домножаем на (2*i - 1) * (2 * i), уменьшаем i Как правильно было подмечено в комментариях, вычисляя слагаемые дважды (один раз на пути вправо, и один раз на пути влево), мы теряем точность. Выход — запоминать вычисленные элементы (для этого неплохо бы иметь автоматически растущий контейнер, наподобие std::vector в C++), или делать три прохода: один для вычисления количества слагаемых, второй для вычисления самих слагаемых и запоминания их, третий для суммирования с конца. Вместо первого прохода можно, по идее, грубо оценить количество слагаемых по условию выхода (|x|^n/n! < eps <=> n ln |x| - ln n! < ln eps), применив формулу Стирлинга

Вшить иконку в приложение C#

Есть приложение, написал на C#. Реализовано через формочки. Нужно, что бы иконка, которую я нарисовал, была "вшита" в приложение и отображалась не только в "строке названия", но и на рабочем столе. И что бы это оставалось так и не только на моем компе.
Если добавлять иконку через "properties", то она будет видна только в "строке названия"

А, непосредственно, на рабочем столе или в папке останется стандартный значок:


Ответ

Project Properties (Alt + F7) - там все указывается и настраивается на первой же вкладке. Icon and Manifest. А вы всего лишь в своем первом примере указали, какую иконку использовать конкретной форме, а не проекту (аппликации) в целом. Скомпилировав проект и получив exe-файл (я подразумеваю, что вся функциональность у Вас в проекте "выходит" в один файл без dll и прочих ресурс файлов - простите за банальное описание), то иконка аппликации будет, как Вы выразились, "вшита" и exe-файл, и, будучи перенесенным на другие компьютеры (простите опять за банальность объяснения), будет отображаться именно с "вшитой" иконкой.

Построение пирамиды в консоли

Здравствуйте!
Помогите решить задачу (из книжки), написать нужно на СИ.
Я смог только составить 2 цикла, которая печатает буквы:
ch = ch1 = ch2; //Буква, которую ввёл пользователь
for ( ch; ch >= 'A'; ch--) // в порядке убывания { printf("%c", ch); }
for ( i = 'A'; i <= ch1; i++) //в порядке возрастания { printf("%c", i); }
Решение данной задачи я так же нагуглил, но совершенно не понял. Объясните, пожалуйста, как это реализовать. Спасибо.


Ответ

Давайте разобьём задачу на части, будет всё просто. У нас есть k строк. Чтобы напечатать их, надо, понятно, цикл по номеру строки от 0 до k - 1. Хорошо. Что должно быть в i-ой строке? Для начала, в строке есть несколько пробелов. Сколько? В последней строке (её номер k-1) 0 штук, в предпоследней (её номер k-2) один, и так далее. Значит, в i-ой строке у нас k - 1 - i пробелов в начале. Есть? Затем, там идут буквы от A по возрастанию. Сколько их в i-ой строке? В 0-й одна, в 1-ой две и т. д. То есть, i + 1 штук. Таким образом, нам нужен внутренний цикл от 0 до i, в котором мы выдаём новую букву. Видите? Затем, начиная от последней буквы вниз до A выдаём их в обратном порядке. Подумайте, как это можно сделать. В конце строки не забывайте

Core Data vs FMDB->sqlite

Стартовые условия - есть уже работающие сервер (MSSQL->JSON) и клиент (JSON->CoreData) под iOS, и пишется клиент под Android который будет локально работать на sqlite. Руководство хочет уйти от привязки к JSON'у на iOS, которую сделал исполнитель, и перевести iOS-клиент на работу с sqlite, чтобы сделать в будущем highload-backend с которым потенциально смогут работать обе мобильные платформы (а не два бекенда для каждой платформы как сейчас). Передо мной (нынешний исполнитель) дилемма - перепиливать CoreData на прием из сети sqlite и ее засовывание в CoreData, или переписывать все для FMDB->sqlite. Все склоняется к тому чтобы использовать то, что будет быстрее работать на клиенте визуально. Причиной создания данного топика стало то что возможности попробовать нет, так как написание приложения на FMDB с нуля займет непозволительно много времени, и если оно не окупится по итогу то много времени будет потрачено зря. Прошу не разводить холивар на тему кому что больше нравится а описать какие-то практические данные с реальных проектов, околограничные проблемы обоих решений, свой личный опыт о том что из этих вариантов работает быстрее или имеет какие-то преимущества.


Ответ

Я немного запутался в вашем вопросе, но все равно попробую ответить.
Мне странно, что ваше руководство "хочет уйти от привязки к JSON'у на iOS" и я, честно говоря, впервые слышу, чтобы работающий клиент (JSON->CoreData) перекраивали под то, чтобы работать с sqlite (то есть даже вообще впервые слышу, чтобы sqlite служил транспортом вместо JSON особенно в целях унификации платформ).
Возможно я не знаю каких-то особых подходов и тонкостей, но, кажется, JSON является абсолютным стандартом при передаче данных в сетевой схеме взаимодействия между клиентом-приложением и сервером-бэкэндом. Я ни разу не встречал, чтобы топовые библиотеки в мире Apple/iOS работали с чем-то кроме JSON. Достаточно назвать AFNetworking и RestKit. Сказав это, добавлю что такое решение вашего руководства выглядит вдвойне странным в виду того, что, повторю еще раз, если я правильно понял, они стремятся добиться максимальной универсальности решения.
Исходя из сказанного выше, мне кажется, что не должно быть никаких сомнений, что ваш сервер должен отдавать JSON (ну и замечательно будет, если все по REST-конвенциям спроектировано будет или уже), и должны быть клиенты iOS и Android соответственно, которые будут этот JSON переносить уже к себе с учетом своих специфик. Если сказанное до сих пор верно, можно уже поставить немного другой вопрос, на который я могу ответить тоже лишь частично и только про Apple/iOS: "ваш опыт налаживания подобных схем" и его подвопросы: стоит ли пользоваться RestKit (так как это единственное full-stack решение подобных задач, насколько я знаю работает только с Core Data), и если нет, то пользоваться ли Core Data или отказаться от него и использовать sqlite?
Мой личный опыт такой: я занимаюсь разработкой именно iOS-приложений около 11 месяцев, все это время я делаю приложение, которое можно, сказав грубо, назвать клоном FourSquare - говорю это для того, чтобы показать, что я достаточно плотно столкнулся именно с вопросами взаимодействия сервера, спроектированного в соответствии с REST и отдающего JSON, и клиента, которому нужно этот JSON разложить в Core Data.
Так получилось, что о RestKit узнал далеко не сразу. Поэтому оказалось, что научение тому, как сделать все грамотно, то есть разобраться с многопоточностью, GCD, Core Data, всему тому, что RestKit делает где-то за кулисами прямо из коробки, заняло у меня очень много времени (где-то месяцев 5). Позже оказалось (когда я-таки взглянул внимательно на RestKit), что для того, чтобы полностью реализовать работающую схему JSON<->Core Data, мне пришлось сделать код, весьма напоминающий по структуре код RestKit. Он не столь идеально абстрагирован по сравнению с RestKit, но с поставленными задачами справляется, и чем дальше продвигается мой проект, он все больше начинает на него походить, хотя и с небольшой разницей в наших подходах (кстати, судя по профилю на Гитхабе, автор RestKit работает на TripAdvisor - то есть вот against what он разрабатывает RK). Про свои недоумения относительно RestKit я задавал здесь на ХК вопрос, на который, к сожалению, так и не получил хотя бы одного внятного ответа: RestKit - за и против?. То есть после года экспериментов я все еще колеблюсь по поводу того, чтобы полностью перейти на RestKit, так как уже сам почти научился решать эти задачи и немного в более близком лично мне ключе, чем это делает RestKit, но, повторю, времени и усилий это заняло достаточно много!
Резюмируя эту часть: если вы хотите сэкономить время на склейке JSON в Core Data, используйте готовое решение, - постарайтесь перейти на RestKit, если готового самописного еще не стало так много, что миграция окажется очень сложной --- RestKit прекрасно справится с задачей по переводу JSON в Core Data и обратно. Некоторые задачи там решаются настолько легко, что это и впрямь выглядит как magic.
Теперь отвечу совсем немного про "Core Data vs FMDB->sqlite". Я начинал изучать iOS строго по гайдам и там все время мелькало Core Data, поэтому я опять же не сразу узнал, что бывают просто разнообразные ORM и оболочки и key-value store, работающие с sqlite.
Мой результат - это то, что я вполне нормально освоился с Core Data и НИ РАЗУ не встретил СЕРЬЕЗНЫХ ограничений, которые заставляли бы меня подумать о переходе к каким-то другим решениям, хотя за это время я узнал о существовании не только FMDB, но и, например, таких вот решений: NanoStore, YapDatabase, iActiveRecord (особенно близкое и понятное мне, так как я имеющ опыт работы с ActiveRecord в Ruby on Rails).
На этом пока все. Возможно позже я дополню свой ответ, если придумаю, как сделать его лучше.
ОБНОВЛЕНО ПОЗЖЕ
Я могу себе представить только один возможный случай, когда работа с sqlite (без JSON вообще) может оказаться адекватной - это случай так называемой оффлайн-работы. Приведу простой пример: у вас есть приложение с картами (Яндекс карты) и вы в момент начала пользования приложением скачиваете разом NN мегабайтовую карту и с этого момента пользуетесь исключительно скачанной картой, так как карта обновляется очень редко и вы можете быть уверены, что скачанная карта будет служить вам верой и правдой, хм, адекватно отражать местность и завтра и послезавтра. То есть, если база, с которой будет работать ваше приложение, является более или менее статичной, вы можете при первой загрузке приложения (в момент начала использования приложения) просто разово передавать ее одним большим файлом (чуть ли не дампом базы) и просто импортировать её средствами местной на клиенте DB (не узнавал, возможно ли такое в Core Data или в SQLite, но очевидно, что подходы должны существовать). Таким образом вы на корню рубите вопросы синхронизации, JSON, весь этот парсинг, маппинг, асинхронность и много других слов и проблем. Единственное требование к специфике приложения - это, чтобы оно не должно было постоянно лазить за чем-то очень свежим и постоянно обновляющимся на ваш сервер, в сеть. Мне кажется, мое описание этого случая вполне ясно.
ОБНОВЛЕНО ЕЩЕ ПОЗЖЕ
Интересный топик на SO, открытый авторами вопроса и ответа на эту тему: Improve process of mirroring server database to a client database via JSON

Xcode 4 и xcode 5 на одной машине

как извесно в пятом икскоде файлы .xib строятся иначе. При первом открытии интерфейсного файла собранного в четвертом искоде в пятом он предлагает пересчитать файл в новый формат но предупреждает что в старом виде он больше не будет доступен. у меня ест ь надобность поддерживать полноценно старый проэкт (до iOS7) в Xcode 4.6.3 и хочется поставить новый Xcode 5 чтобы разрабатывать в нем под ioS7+. Можно ли оставить два икскода на одной машине одновременно или как решить этот вопрос?


Ответ

Я думаю, сохранить обе версии будет непросто. По крайней мере вам понадобятся для этого специальные усилия.
Вопрос - а что мешает вам в ответ на вопрос Xcode 5:

Ответить "Skip"?
Кроме того, наоборот, что мешает вам ответить "Always Upgrade" (я так сделал), и спокойно разрабывать ваш старый проект точно также как и раньше? Все до-iOS7 версии вашего проекта точно также будут собираться и работать в соответствующих симуляторах этих предыдущих версий. Я ни разу ещё не столкнулся с проблемой каких-то несовместимостей именно в связи с апгрейдом Xcode 5. Если вы стокнулись, вам стоит наверное как-то их подробно описать в вашем вопросе.

ОБНОВЛЕНО ПОЗЖЕ
Если вы так уж сильно опасаетесь проблем с обратной совместимостью - вы можете некоторое время просто "порисковать". Для этого лично я делал бы следующие шаги:
Я должен был бы быть уверен, что мой проект очень хорошо находиться под version-контролем, то есть должен находиться в Github- или там Mercurial-дереве. После того, как 1 выполнено. Я делаю "опасный шаг" и нажимаю upgrade/always upgrade. Выхожу из Xcode 5, вхожу в Xcode 4 проверяю, всё ли работает. Если всё работает, коммичу изменения в дерево с соответствующим названием коммита, чтобы потом можно было легко откатиться. В Xcode 5 Делаю изменения в xib или storyboard'ах, опять выхожу в 4, проверяю, коммичу. Делаю шаг 4 до тех пор, пока не убеждаюсь, что реальной опасности нет. А если оказывается, что реально Xcode 5 портит проекты (повторяю, я пока что ни разу не видел), возвращаюсь к данному вопросу на ХэшКоде с подробным описанием деталей разбоя Xcode 5.
Кратко: Я думаю (I encourage you), вам нужно набраться смелости и перейти на Xcode 5 и просто какое-то время понаблюдать за своими xib/storyboard-ами в Xcode 4. Для этого вам поможет Git или любая другая система контроля версий.
Этот вариант только с Xcode 5 явно более здоровый и "прогрессивный", чем пытаться ужить два Xcode помимо практики самой Apple.
Удачи!

preg_match некорректно обрабатывает кириллицу

Есть вот такая функция:
function validatenick ($nick, $js) { include('adodb5/adodb.inc.php'); include('config.php'); $db = ADONewConnection($db_driver); # $db->debug = true; $db->Connect($db_server, $db_user, $db_pass, $db_name); $valid = 0; // Корректный ник. $lat = ["A","B","C","E","H","I","K","M","O","P","T","X","a","c","e","i","k","o","p","x","y"]; $cyr = ["А","В","С","Е","Н","I","К","М","О","Р","Т","Х","а","с","е","і","к","о","р","х","у"]; $tnick = ""; if (!preg_match("/^[А-ЯЁIЇҐЎ]{1}[а-яёіїґў]{2,19}$/", $nick)) { if (!preg_match("/^[A-Z]{1}[a-z]{2,19}$/", $nick)) $valid = 1; // Некорректный ник. else { // Латинский ник. for ($i = 0; $i < strlen($nick); $i++) { if (!array_search($nick{$i}, $lat)) { $tnick = "NULL"; // Не имеет идентичного по написанию кириллического ника. break; } else $tnick .= $cyr[array_search($nick{$i}, $lat)]; } } } else { // Кириллический ник. for ($i = 0; $i < strlen($nick); $i++) { if (!array_search($nick{$i}, $cyr)) { $tnick = "NULL"; // Не имеет идентичного по написанию латинского ника. break; } else $tnick .= $lat[array_search($nick{$i}, $cyr)]; } } if ($valid == 0) { $rs = &$db->Execute("select * from users where nick = '".$nick."'"); if ($rs->PO_RecordCount('users', "nick = '".$nick."'") > 0) $valid = 2; // Этот ник занят. else if ($tnick != "NULL") { $rs = &$db->Execute("select * from users where nick = '".$tnick."'"); if ($rs->PO_RecordCount('users', "nick = '".$tnick."'") > 0) $valid = 3; // Зарегистрирован идентичный по написанию ник. } } if ($js == true) print($valid); else return $valid; }
Если на входе она получает ник латиницей, то всё ок. Но попытка скормить ей кириллический ник всегда приводит к возврату $valid = 1. Заподозрив, что проблема в передаваемых данных, я задал заведомо корректный кириллический ник внутри функции, но результат был тем же. Удаление из выражения всех нерусских символов и ё проблему не решило. В чём может быть загвоздка?
Кодировка страницы:
header("Content-Type: text/html; charset=UTF-8");
Кодировка файла та же. Версия PHP:
PHP 5.4.9-4ubuntu2.3 (cli) (built: Sep 4 2013 19:37:07)


Ответ

Используйте модификатор "u". preg_match("/^[А-Я]+$/u", $nick);

Как в PHP строку разбить на массив

Как разбить строку: |ele1||ele2||ele3||ele4||var5||nubmr| На массив вида: [0]=>ele1 [1]=>ele2 [2]=>ele3 [3]=>ele4 [4]=>var5 [5]=>nubmr как вариант хотелось бы удалить первый и последний элемент строки с помощью preg_replace (не знаю как если знаете то подскажите) а потом разбить через explode


Ответ

preg_replace('/^\|(.+)\|$/','$1','|ele1||ele2||ele3||ele4||var5||nubmr|');

.NET Native и RyuJIT

Недавно, прочитав интервью от Джеффри Рихтера, узнал о .NET Native компиляторе, который превращает код CIL в нативный код, неотличимый от кода после компиляции С++, также узнал о RyuJIT и появилось несколько вопросов, ответы на которые я не нашел в интернете: .NET Native и RyuJIT - это одно и то-же? В какой код компилирует RyuJIT? XAMARIN тоже компилирует в натив, не эти ли компиляторы они используют? В боксе VisualStudio 2013 уже есть поддержка этих компиляторов? Если есть - как использовать и как оно действует?, если нет - КАКОГО ЧЕРТА НЕ ВВЕЛИ??


Ответ

о RuyJIT, о том, как его попробовать, можно почитать на хабре. Если очень коротко, то это сильно переписаный код стандартного JIT компилятора из .NET. .NET Native и RyuJIT - это одно и то-же? В какой код компилирует RyuJIT? и нет, и да. .NET Native пытается сделать код для конкретной платформы. RyuJIT - это просто улучшенный компилятор .NET. Умеет ли он делать native код - непонятно. XAMARIN тоже компилирует в натив, не эти ли компиляторы они используют? XAMARIN базируется на проекте Mono (это свободная версия .NET, которая работает на многих платформах, в том числе и на линуксе, достаточно совместима с .NET). Поэтому, короткий ответ на эти два вопроса - нет и (скорее всего) нет. В боксе VisualStudio 2013 уже есть поддержка этих компиляторов? Если есть - как использовать и как оно действует?, если нет - КАКОГО ЧЕРТА НЕ ВВЕЛИ?? в статье на хабре есть описание как ее потестить. Не ввели, потому что похоже только разрабатывается. А .NET Native получается, если использовать nugen (утилита из поставки .Net framework).

Как монтировать ISO-образы на Windows 7?

Многие крупные скачиваемые обновления поставляются в виде образов для болванок - файлов формата ISO. Прожигать диски, чтобы с них устанавливать обновления, - это пустая трата расходников, потому что после обновления диски уже не нужны - получается, что это диски однократного использования. Вопрос в том, как правильно монтировать образы в Windows, какие для этого существуют встроенные или устанавливаемые инструменты?


Ответ

Daemon tools (Lite-версия бесплатна), alcohol и множество других ,есть кстати и утилита от майкрософта, но не помню, как называется... Да и в конце концов можно просто открыть архиватором - 7-zip'ом, например. )

Градиент на CSS3

Здравствуйте, подскажите, пожалуйста, как сделать такой градиент на CSS3, без картинок. С помощью каких сервисов?


Ответ

* { padding: 0; margin: 0; } div { min-height: 100px; background: #f5f8f9; /* Old browsers */ background: -moz-linear-gradient(left, #f5f8f9 0%, #1d97d3 50%, #0591d5 100%); /* FF3.6+ */ background: -webkit-gradient(linear, left top, right top, color-stop(0%, #f5f8f9), color-stop(50%, #1d97d3), color-stop(100%, #0591d5)); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(left, #f5f8f9 0%, #1d97d3 50%, #0591d5 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(left, #f5f8f9 0%, #1d97d3 50%, #0591d5 100%); /* Opera 11.10+ */ background: -ms-linear-gradient(left, #f5f8f9 0%, #1d97d3 50%, #0591d5 100%); /* IE10+ */ background: linear-gradient(to right, #f5f8f9 0%, #1d97d3 50%, #0591d5 100%); /* W3C */ filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#f5f8f9', endColorstr='#0591d5', GradientType=1); /* IE6-9 */ }


http://jsfiddle.net/6bv5hmrz/
http://www.colorzilla.com/gradient-editor/ вот есть такой сервис

Доступность сайта одновременно по HTTP и HTTPS

Есть сайт, для него установлен бесплатный сертификат для работы HTTPS.
Можно ли коим-то образом сделать сайт доступным одновременно по HTTP и по HTTPS?


Ответ

Да, просто нужно настроить апач (или другой веб-сервер).
HTTP работает на 80 порту, а HTTPS работает на 443-м.
В апаче необходимо создать 2 виртуальных хоста, один для 80-го порта, 2-й для 443-го. Для этих виртуальных хостов установить одинаковые настройки (какие вам необходимы), кроме этого, для ВХ на 443-м порту необходимо активировать SSLEngine, чтобы иметь возможность соединяться по HTTPS:
SSLEngine on
#путь к сертификату. SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem #путь к ключу SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

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

Нужно, чтобы выпадали цифры от 1 до 5 с вероятностью: 1 = 70%, 2 = 20%, 3 = 5%, 4 = 4%, 5 = 1%


Ответ

Эта задача решается очень просто. function specialRandom() { var r = Math.random() * 100; if (r < 70) { return 1;} else if (r < 90) { return 2;} else if (r < 95) { return 3;} else if (r < 99) { return 4;} else { return 5;} }

Ошибка в setText

Если писать так, то нет ошибки mOtvetTextView.setText(2+2*4 + "ответ"); Если писать так, то ошибка "The operator - is undefined for the argument type(s) String, double" mOtvetTextView.setText("ответ" + 2+2*4); А вообще хотелось бы написать так: mOtvetTextView.setText("пример" + 2+2*4 + "равен");


Ответ

Я бы не делал так. Я бы создал переменную, в которую записывал результат вычисления. Потом уже формировал вывод. Я считаю, что так лучше и красивее. Проще назвать нельзя, так как на одну строчку больше кода выходит)))) Integer otvet = 2+2*4; mOtvetTextView.setText("Пример " + otvet + " равен."); // Лично мне нравится выносить отдельно всевозможные вычисления, считаю, что так удобнее после редактировать код - нагляднее он смотрится. // Но это дело каждого, поэтому решайте сами, код я Вам предложил. Обновление Чтобы работать с дробной частью, нужно применить double тип переменной. Код я предлагаю следующий: double var = 2+2*4/15; // var = 0.66(6) - 0.66 и 6 в периоде, то есть длинный хвост из "6". mOtvetTextView.setText(new DecimalFormat("##.##").format(var)); // задаем формат для var и выводим в textView. 0.66 в textView.

Цикл while «Сумма последовательности чисел»

Здравствуйте. Начал изучать питон, иногда нападают жуткие тупняки. Ряд задач с этим циклом, вроде, решен и понятен, тут не могу никак понять, как формулировать решение. Определите сумму всех элементов последовательности, завершающейся числом 0. В этой и во всех следующих задачах числа, следующие за первым нулем, учитывать не нужно. def по этому курсу еще не было, не знаю, что это. Т.е. задачу нужно решить, исходя из того, что материал был по Занятие 1. Ввод-вывод, арифметические операции Занятие 2. Условная инструкция Занятие 3. Операции с целыми и вещественными числами Занятие 4. Цикл for Занятие 5. Строки Занятие 6. Цикл while Вот просто чего не понял. i = 0 while int(input()) > 0: i += int(input()) print(i) Но в этом случае суммируются элементы без первого, т.е. в том порядке, как входят, если делаю i = 0 a = 0 while int(input()) >0: i += 1 for j in range(0:a): a += int(input()) print(a) то говорит, что закончились числа для ввода. Т.е. в целом я понимаю, что вообще что-то не то делаю.


Ответ

Ошибка в том, что функция input() вызывается в двух местах, нужно вызывать её только в одном месте и использовать одно и то же возвращаемое значение как для проверки на ноль, так и для суммирования: total = 0 # общая сумма while True: # бесконечный цикл n = int(input()) # каждая строка содержит целое число if n == 0: # нашли нуль break # выходим из цикла total += n # суммируем print(total) # печатаем результат Код предполагает, что каждая последовательность завершается нулём. В противном случае нужно ловить EOFError исключение и обрабатывать возвращаемую пустую строку. Чтобы самостоятельно найти ошибку в своём коде, в таких простых случаях, полезно выписать словами, что код делает строчка за строчкой (отладка методом утёнка). Другие способы выразить то же самое для тестов (и для улучшения понимания задачи людьми, которые уже знают Питон, не для прямого использования): import sys from itertools import takewhile
print(sum(takewhile(lambda n: n != 0, map(int, sys.stdin)))) Не нулевые целые числа являются истиной в булевом контексте в Питоне, поэтому вместо lambda n: n != 0 можно использовать просто bool (менее читаемый (явный) вариант). Или даже (если каждая строчка содержит только числа, без пробелов): print(sum(map(int, iter(input, '0'))))

Шахматный конь, рекурсия, максимумы

Имеется шахматная доска 8х8. Предположим в каждой клетке доски содержится некоторое количество яблок. Шахматная фигура “конь” может ходить по классическим правилами хода коня. Оказываясь в очередной клетке, конь собирает все яблоки, которые в ней находятся. Имеется ограничения на количество ходов. Ваша программа должна принимать на вход следующие аргументы: максимальное число ходов, имя файла, содержащего схему заполнения шахматной доски яблоками. Строки в файле соответствуют строкам шахматной доски, строки разделяются переносами. Числа в строках разделяются пробелами. Ваша программа должна вывести максимально возможное количество собираемых яблок конем, при заданном ограничении ходов и произвольном выборе начальной позиции. Собственно, хотелось бы понять, каким образом/методом следует решать эту задачу. Сам код мне, конечно, нужен, но думаю и сам смогу написать программу, если пойму её основную идею. Была идея решать через жадный алгоритм, передвигаясь в клетку, содержащую в себе максимально возможное число яблок (сравнивал количество яблок в каждой из клеток, доступных в данный момент и шел в клетку с максимальным числом), но, как мне кажется, это решение, мягко говоря, не совсем верное. Задача должна содержать в себе рекурсию. Подайте идею решения данной проги или посоветуйте литературы по этой теме, пожалуйста. Заранее благодарю! :D


Ответ

Думаю, что подобные задачи решаются полным перебором. То есть, для каждой клетки делаем полный перебор ходов. Да, это будет долго, но... Специалисты могут решат задачу другим способом. Шахматная доска для коня - это граф. Кол-во яблок в клетке - это значение в вершине. Задача сводиться к поиску цепочки с максимальной суммой. В теории графов есть много алгоритмов для поиска кратчайшего пути, но думаю, они легко "перевернутся".

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

Есть некое регулярное выражение, например, "[a-z][0-9]{3}|[a-z]{3}". Как получить список всех возможных строк, соответствующих этому выражению? Примерно такой: ['a781', 'b000', 'c476', 'u132', 'd997', 'exe', 'use' и т.д.]


Ответ

Кроме самых простых случаев (без *+), кол-во строк, соотвествующих заданному регулярному выражению, может быть бесконечно.
Обратить регулярное выражение достаточно легко, например, re модуль позволяет получить регулярное выражение в виде дерева, обходя которое можно cгенерировать подходящую строку
import re from pprint import pprint
regex = "[a-z][0-9]{3}|[a-z]{3}" pprint(re.sre_parse.parse(regex).data)
Результат:
[('branch', (None, [[('in', [('range', (97, 122))]), ('max_repeat', (3, 3, [('in', [('range', (48, 57))])]))], [('max_repeat', (3, 3, [('in', [('range', (97, 122))])]))]]))]
bjmc написал rstr.xeger функцию, которая возвращает (одну, любую) строку, удовлетворяющую заданному regex:
import rstr # $ pip install rstr
regex = "[a-z][0-9]{3}|[a-z]{3}" print(rstr.xeger(regex)) # print a single string that matches the regex # -> ycu
Paul McGuire (pyparsing) упомянул сайт Инвертер регулярных выражений, основанный на invRegex.py примере:
from itertools import islice from invRegex import invert # http://pyparsing.wikispaces.com/file/view/invRegex.py
regex = "[a-z][0-9]{3}|[a-z]{3}" print("
".join(islice(invert(regex), 10000))) # print < 10000 matching strings
Результат:
a000 a001 a002 a003 a004 a005 a006 a007 a008 a009 a010 a011 a012 a013 a014 a015 a016 a017 a018 a019 a020 a021 a022 a023 a024 ...
Примеры взяты из ответов к Reversing a regular expression in python

PhoneGap или Cordova?

День добрый! Объясните, пожалуйста, есть ли различия между PhoneGap и Cordova? Просто хотел сделать мобильную версию приложения, и не могу понять, в чем их различия. В Сети говорят, что они одинаковые фреймворки, то phonegap лучше, некоторые за cordova-у. У меня нету опыта в этих технологиях, вот и спрашиваю, что выбрать. Netbeans как бы рекомендует из коробки cordovu https://netbeans.org/kb/docs/webclient/cordova-gettingstarted_ru.html, плагина для phonegap не смог найти. И еще вопрос: с помощью каких из них (phonegap, cordova) можно получить доступ к дисплею (включать/выключить) смартфона (андроид)? Спасибо.


Ответ

Cordova - фреймворк с открытым кодом. Phonegap - обертка для этого фреймворка, принадлежащая Adobe и позволяющая теснее взаимодействовать с другими сервисами Adobe. В первую очередь, с Phonegap Build - это облачный сервис на основе Phonegap, который на основе Cordova, в доме, который построил Джек. О нем ниже.
С практической точки зрения, разницы между Phonegap и Cordova нет. Оба устанавливаются локально, оба умеют подтягивать плагины из репозиторев, оба имеют одни и те же глюки, т.к. код в основе один. Разница выглядит примерно так:
$usr> phonegap local build android //local - потому что не в облаке, можно remote
$usr> cordova build android //кордова всегда локальна
Я выбрал Cordova, т.к.:
Интеграция с облаком мне не нужна. Я всегда выбираю более "тонкий" стек технологий. Phonegap апдейтится почти одновременно с Cordova, но не одновременно. Например, поддержка 64-bit iOS apps там припозднилась на месяц. Я за open source и не люблю Adobe.
Как-то раз мне пришлось переключиться с Cordova на Phonegap Build (я делал и тестировал приложение локально, заказчик создавал бинарники в облаке со своими ключами). Переход занял примерно день, в основном на отлов мелких багов, когда что-то в Cordova работало, а в Phonegap Build - нет.
Например, длительность сплэш-заставки в Cordova прописывается в config.xml:

Phonegap Build эту настройку проигнорировал, поэтому пришлось подключать плагин для управления заставкой через JavaScript и делать это руками.

Отключить обновление страницы, после отправки формы

При отправке формы, на странице должен отрисовываться canvas. Но после того как форма отправлена, canvas отрисовывается на долю секунды и потом исчезает. Как сделать так, чтобы после отправки, canvas оставался на месте.
html code:

Enter math expression:

js:
function drawShelves() { var canvas = document.getElementById('canvas'), ctx = canvas.getContext('2d');
canvas.width = 800; canvas.height = 400;
ctx.lineWidth = 1.0; ctx.strokeStyle = 'black'; ctx.beginPath();
// left shelve ctx.strokeRect(5, 100, 340, 10); ctx.moveTo(5, 110); for (var i = 5; i < 340; i+=10) { ctx.lineTo(i+10, 100); ctx.moveTo(i+10, 110); }
// right shelve ctx.strokeRect(455, 100, 340, 10); ctx.moveTo(455, 110); for (var i = 455; i < 790; i+=10) { ctx.lineTo(i+10, 100); ctx.moveTo(i+10, 110); } ctx.stroke(); }


Ответ

Есть два варианта.
Отключить событие нажатия на кнопку по умолчанию:
Отключить событие отправки формы по умолчанию:


Но в обоих случаях вам нужно каким-либо образом без перезагрузки страницы отправить данные на сервер. Самый верный способ -- использовать Ajax запрос. Поэтому код будет проще переписать следующим образом:

function drawShelves() { // здесь отрисовка канвы
// здесь ajax запрос
return false; }
Подробнее про Ajax можно прочитать здесь: http://javascript.ru/ajax/intro

Инициализация View в классе Activity

Пытаюсь инициализировать View через метод findViewById(), прямо в классе MainActivity, чтобы затем, при многократном использовании одного и того же View через onClick, метод findViewById() не вызывался много раз, но при инициализации прямо в классе MainActivity приложение вылетает.
Что я делаю неправильно и как можно один раз инициализировать View для всех последующих методов?
public class MainActivity extends Activity {
public View customView = (View) findViewById(R.id.btn);
public void onCustomClick(View view) { switch (view.getId()) { case R.id.btn: customMethod(customView); break; // и т.д.
} }
private void customMethod (View customVar) { // тело метода } }


Ответ

findViewById должно вызываться например в onCreate() методе активити. Т.е. оставьте public View customView; а в onCreate добавьте:
customView = (View) findViewById(R.id.btn);
UPD. Если копнуть глубже то в Activity у вас в самом начале метода onCreate() есть вызов setContentView(). Это именно этот вызов инициализирует разметку для Activity и только после того как он отработал можно вызывать findViewById()
UPD2. Диаграмма жизненного цикла Activity, спасибо @hardsky за идею, см. http://developer.android.com/training/basics/activity-lifecycle/starting.html

Таким образом, исходя из диаграммы, провести инициализацию можно в: onCreate() после setContentView(), в методах onStart() и onResume()

Объясните как работают sticky intent?

Объясните как работают sticky intent?
Я понимаю что происходит при регистрации BroadcastReceiver, при sendBroadcast и т.д.
Но вот, например, в книге есть такое пример:
IntentFilter batIntentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent battery = context.registerReceiver(null, batIntentFilter); int status = battery.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = ((status == BatteryManager.BATTERY_STATUS_CHARGING) || (status == BatteryManager.BATTERY_STATUS_FULL));
Создается IntentFilter, дальше вызывается метод регистрации BroadcastReceiver, но вместо приемника ему передается null. Ему должны передаваться BroadcastReceiver и IntentFilter для него - для регистрации.
Но, как я понял из документации, если передать null вернется sticky intent. И что он делает? Зачем он? Как он применяется?


Ответ

Система может "выбрасывать" sticky и обычные интенты. Обычные интенты срабатывают когда произошло какое то событие, но после регистрации на это события. Sticky интент, в случае если он уже сработал, будет доставлен сразу же после регистрации на это событие, другими словами если какое то событие уже произошло, то после регистрации на него оно сразу же доставится receiver'y. Если в метод registerReceiver передать null в качестве receiver, то в случае со sticky сразу же будет возвращен intent с информацией о событии, но без последующей регистрации для него. В вашем случае ACTION_BATTERY_CHANGED является sticky и поэтому вам будет сразу возвращен intent с информацией и состоянии батареи, но без регистрации на это событие.

PHPStorm вставка тега в html

Как в PHPStorm6 реализовать вставку в html php тега при вводе: php клавиша [tab] ? Сейчас выдает
Нужно:


Получаю:


Ответ

Выберите пункт меню File -> Settings -> -- IDE Settings -- -> Live Templates -> Add
Далее скриншоты из 8-ой версии, но суть абсолютно та же:

Заполните данные следующим образом:
Abbreviation: php Template Text:

Потом определите контекст (HTML):

Закройте окно и сохраните изменения. Вот и все.
Дополнительно: Live Templates (Snippets) in PhpStorm - PhpStorm Video Tutorial
Составлено на основе вопроса на SO: Phpstorm zen coding: insert tag

как правильно сравнивать с null?

как правильно писать
if(obj ==null){}
или
if(null == obj){}
в чем разница?
и вторая часть вопроса можно ли это заменить на
static boolean isNull(boolean val)
или нет? и что это такое?


Ответ

Особой разницы нет. Но есть не особая. Вариант с
if(null == obj)
уберегает вас от распространенной ошибки типа
if(obj = null)
то есть случая, когда вместо сравнения по недосмотру выполняется присваивание. В случае с null = obj компилятор сообщит об ошибке, поскольку нельзя присваивать что-то null'у. Все вроде бы здорово, и отличие вроде бы и правда есть. Но это замечательное преимущество практически не имеет никакой ценности, поскольку будет работать только в том случае, если obj имеет тип Boolean. В остальных случаях компилятор тоже догадается сообщить об ошибке, поскольку результат такого присваивания не может быть приведен к булевскому типу. Поэтому в java разницы нет практически никакой. А вот в Си это может иметь смысл - там NULL - это всего лишь макрос, под которым обычно скрывается 0, и ошибки типа
if(obj = NULL)
довольно распространены, так как присваивание указателю NULL'а вполне допустимо, а случайно написать = вместо == - дело нехитрое. Может такая ошибка случиться и в JavaScript в силу того, что типизация в нем динамическая, и любую переменную можно неявно привести к булевскому значению. С другой стороны, в js чаще принято писать условия типа
if(!obj)
вместо
if(obj == null)
хотя так делают далеко не все. На мой взгляд конструкция типа null == obj выглядит коряво, но это дело вкуса.

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

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


Ответ

Могу предложить такую регулярку:
(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])
(?= ... ) — это zero-width positive lookahead assertion, то есть проверка, что строка в впереди удовлетворяет паттерну, при этом проверка не "съедает" символы при проверке, то есть после проверки возвращается на изначальную позицию. Скорее всего, это не самый оптимальный подход: вряд ли движок оптимизирует выражение.
При желании можно написать и выражение попроще:
^((?[a-z])|(?[A-Z])|(?[0-9])|.)+(?(a)|(?!))(?(b)|(?!))(?(c)|(?!))$
Или оптимальнее:
^(?>(?:(?
[a-z])|(?[A-Z])|(?[0-9])|.)+)(?(a)|(?!))(?(b)|(?!))(?(c)|(?!))$
Если вы охотитесь за производительностью, и какой-то алгоритм тривиально решается без регулярных выражений, то не используйте регулярные выражения. Они заведомо не будут быстрее.

RE: ReinRaus
Фига себе в джаве тормозной стандартный регекс. :)
Перевёл один-в-один в дотнет (плюс оптимизировал вторую регулярку: там был один лишний захват и, как следствие, баг в реализации от @ReinRaus, возникший при замене именованных групп на индексные):
using System; using System.Collections.Generic; using System.Diagnostics; using System.Text.RegularExpressions;
namespace RegexPasswordPerf { class Program { static void Main (string[] args) { const int Loops = 30000; const string Text = "AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8"; //const string Text = "AaluhfDnaoufbicbIHBDIHBKJXNdCJKfB1"; var regexes = new Dictionary { { "Discord 1", "^(([a-z])|([A-Z])|([0-9])|.)+(?(1)|(?!))(?(2)|(?!))(?(3)|(?!))$" }, { "Discord 2", "^(?>(?:([a-z])|([A-Z])|([0-9])|.)+)(?(1)|(?!))(?(2)|(?!))(?(3)|(?!))$" }, { "ReinRaus 1", "^(?=(?>[^a-z]*)[a-z])(?=(?>[^A-Z]*)[A-Z])(?=(?>\\D*)\\d)(?>[a-zA-Z0-9]+)$" }, { "ReinRaus 2", "^(?:([a-z])|([A-Z])|([0-9]))(?(1)(?>[a-z]*)(?:([A-Z])|([0-9]))(?(4)(?>[a-zA-Z]*)[0-9]‌​(?>[a-zA-Z0-9]*)$|(?(5)(?>[a-z0-9]*)[A-Z](?>[a-zA-Z0-9]*)$|(?!))))(?(2)(?>[A-Z]*)(?:([a-z])|(‌​[0-9]))(?(6)(?>[a-zA-Z]*)[0-9](?>[a-zA-Z0-9]*)$|(?(7)(?>[A-Z0-9]*)[a-z](?>[a-zA-Z0-9]*)$|(?!)‌​)))(?(3)(?>[0-9]*)(?:([A-Z])|([a-z]))(?(8)(?>[0-9A-Z]*)[a-z](?>[a-zA-Z0-9]*)$|(?(9)(?>[0-9a-z‌​]*)[A-Z](?>[a-zA-Z0-9]*)$|(?!))))" }, };
foreach (var entry in regexes) { var regex = new Regex(entry.Value, RegexOptions.Compiled); bool isCorrect = false;
var sw = new Stopwatch(); sw.Start(); for (int i = 0; i < Loops; i++) isCorrect = regex.IsMatch(Text); sw.Stop();
Console.WriteLine("{0}\t{1}\t{2}", entry.Key, sw.ElapsedMilliseconds, isCorrect); } } } }
Результат:
Discord 1 3378 True Discord 2 2518 True ReinRaus 1 738 True ReinRaus 2 721 True
Если строку сделать больше похожей на пароль, то есть короче в несколько раз, то разрыв будет раза в два-три, а не три-четыре:
Discord 1 1247 True Discord 2 1037 True ReinRaus 1 650 True ReinRaus 2 383 True
Подозреваю, что дотнетовый регекс проседает по производительности из-за того, что сохраняет абсолютно все совпадения. Если посмотреть содержимое результата:
string s = string.Join("
", m.Groups .Cast().Select(g => string.Format("{0}: {1}", g.Index, string.Join(", ", g.Captures .Cast().Select(c => c.Value)))));
То можно увидеть это:
0: AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8AaluhfDnaoufbicbIHBDIHBKJXNdCJKfBCNCNX5BCHBAHIBAVIsdniuhuygvD6w489bgtvdihfcbsigdbcsihcgfisyg8 1021: a, l, u, h, f, n, a, o, u, f, b, i, c, b, d, f, s, d, n, i, u, h, u, y, g, v, w, b, g, t, v, d, i, h, f, c, b, s, i, g, d, b, c, s, i, h, c, g, f, i, s, y, g, a, l, u, h, f, n, a, o, u, f, b, i, c, b, d, f, s, d, n, i, u, h, u, y, g, v, w, b, g, t, v, d, i, h, f, c, b, s, i, g, d, b, c, s, i, h, c, g, f, i, s, y, g, a, l, u, h, f, n, a, o, u, f, b, i, c, b, d, f, s, d, n, i, u, h, u, y, g, v, w, b, g, t, v, d, i, h, f, c, b, s, i, g, d, b, c, s, i, h, c, g, f, i, s, y, g, a, l, u, h, f, n, a, o, u, f, b, i, c, b, d, f, s, d, n, i, u, h, u, y, g, v, w, b, g, t, v, d, i, h, f, c, b, s, i, g, d, b, c, s, i, h, c, g, f, i, s, y, g, a, l, u, h, f, n, a, o, u, f, b, i, c, b, d, f, s, d, n, i, u, h, u, y, g, v, w, b, g, t, v, d, i, h, f, c, b, s, i, g, d, b, c, s, i, h, c, g, f, i, s, y, g, a, l, u, h, f, n, a, o, u, f, b, i, c, b, d, f, s, d, n, i, u, h, u, y, g, v, w, b, g, t, v, d, i, h, f, c, b, s, i, g, d, b, c, s, i, h, c, g, f, i, s, y, g, a, l, u, h, f, n, a, o, u, f, b, i, c, b, d, f, s, d, n, i, u, h, u, y, g, v, w, b, g, t, v, d, i, h, f, c, b, s, i, g, d, b, c, s, i, h, c, g, f, i, s, y, g, a, l, u, h, f, n, a, o, u, f, b, i, c, b, d, f, s, d, n, i, u, h, u, y, g, v, w, b, g, t, v, d, i, h, f, c, b, s, i, g, d, b, c, s, i, h, c, g, f, i, s, y, g, a, l, u, h, f, n, a, o, u, f, b, i, c, b, d, f, s, d, n, i, u, h, u, y, g, v, w, b, g, t, v, d, i, h, f, c, b, s, i, g, d, b, c, s, i, h, c, g, f, i, s, y, g, a, l, u, h, f, n, a, o, u, f, b, i, c, b, d, f, s, d, n, i, u, h, u, y, g, v, w, b, g, t, v, d, i, h, f, c, b, s, i, g, d, b, c, s, i, h, c, g, f, i, s, y, g, a, l, u, h, f, n, a, o, u, f, b, i, c, b, d, f, s, d, n, i, u, h, u, y, g, v, w, b, g, t, v, d, i, h, f, c, b, s, i, g, d, b, c, s, i, h, c, g, f, i, s, y, g 990: A, D, I, H, B, D, I, H, B, K, J, X, N, C, J, K, B, C, N, C, N, X, B, C, H, B, A, H, I, B, A, V, I, D, A, D, I, H, B, D, I, H, B, K, J, X, N, C, J, K, B, C, N, C, N, X, B, C, H, B, A, H, I, B, A, V, I, D, A, D, I, H, B, D, I, H, B, K, J, X, N, C, J, K, B, C, N, C, N, X, B, C, H, B, A, H, I, B, A, V, I, D, A, D, I, H, B, D, I, H, B, K, J, X, N, C, J, K, B, C, N, C, N, X, B, C, H, B, A, H, I, B, A, V, I, D, A, D, I, H, B, D, I, H, B, K, J, X, N, C, J, K, B, C, N, C, N, X, B, C, H, B, A, H, I, B, A, V, I, D, A, D, I, H, B, D, I, H, B, K, J, X, N, C, J, K, B, C, N, C, N, X, B, C, H, B, A, H, I, B, A, V, I, D, A, D, I, H, B, D, I, H, B, K, J, X, N, C, J, K, B, C, N, C, N, X, B, C, H, B, A, H, I, B, A, V, I, D, A, D, I, H, B, D, I, H, B, K, J, X, N, C, J, K, B, C, N, C, N, X, B, C, H, B, A, H, I, B, A, V, I, D, A, D, I, H, B, D, I, H, B, K, J, X, N, C, J, K, B, C, N, C, N, X, B, C, H, B, A, H, I, B, A, V, I, D, A, D, I, H, B, D, I, H, B, K, J, X, N, C, J, K, B, C, N, C, N, X, B, C, H, B, A, H, I, B, A, V, I, D, A, D, I, H, B, D, I, H, B, K, J, X, N, C, J, K, B, C, N, C, N, X, B, C, H, B, A, H, I, B, A, V, I, D 1022: 5, 6, 4, 8, 9, 8, 5, 6, 4, 8, 9, 8, 5, 6, 4, 8, 9, 8, 5, 6, 4, 8, 9, 8, 5, 6, 4, 8, 9, 8, 5, 6, 4, 8, 9, 8, 5, 6, 4, 8, 9, 8, 5, 6, 4, 8, 9, 8, 5, 6, 4, 8, 9, 8, 5, 6, 4, 8, 9, 8, 5, 6, 4, 8, 9, 8
Это удобно, но не лучшим образом сказывается на производительности — особенно если соревноваться с регулярками, которые все совпадения не сохраняют. Для полного удовлетворения любопытства надо будет найти плюсовые или шарповые регексы, которые построены ради скорости, а не удобства. Если память не изменяет, регулярки из boost по умолчанию такой фигнёй не занимаются, но есть опция для компиляции.

SQL одним запросом одинаковые аккаунты

Как выдернуть все аккаунты с одинаковым ip (IP) по логину (login). То есть по условию подставляя в запрос один логин, получить аккаунты с таким же ip.


Ответ

примерно так:
select id from accounts where ip in (select ip from accounts where login="логин");

Регулярное выражение с набором разрешенных значений

Возможно ли в рамках одной регулярки реализовать следующее:
Есть строка в которую пользователь может вводить все что угодно, но есть одно НО!
Есть перечень слов, которые должны употребляться только с определенной цифрой:
20 гв 30 гв 45 гв
Т.е если юзер ввел строчку: 123 qwe 20 гв. Все ок. Совпадение есть
Если юзер вбил 100500 гв 123 qwe, то совпадений нет, так сочетание 100500 гв отсутствует в списке. Слова могут идти в произвольном порядке.
Реально ли это сделать в виде 1 регулярки?


Ответ

Хочу пояснить и дополнить ответ Qwertiy
Более правильный ответ:
^((20|30|45)\s+гв\b|(?!\bгв\b).)*$
(20|30|45)\s+гв дает совпадение в строках, где за "20", "30" или "45" следует пустое пространство, а затем - "гв" (?!гв). дает совпадение на одном любом символе, если с него не начинается "гв"
\b добавлены, чтобы не было ложных негативных срабатываний, например на словах "гвардия" или "агв" (давайте считать, что это слово). Этому выражению удовлетворяет граница слова (\w+), при этом оно не поглащает символ.
Когда мы сочетаем их через комбинатор "или", получившаяся регулярка пытается заглотить оба одновременно: если встречается 2, 3 или 4, он идет по первой ветви, иначе - по второй. При этом если встречается "гв", то строка отвергается (negative lookahead).
Наконец, поскольку удовлетворяющих выражению подстрок может быть несколько (в частности, вторая ветвь "или" поглощает только один символ), а также строка может быть пустой, все выражение заключается в ^(…)*$

SSL certificate problem при выполнении push на github

При выполнении команды:
git push -u origin master
Пишет:
fatal: unable to access 'https:/github.com/..../....git': SSL certificate problem: self signed certificate in certificate chain
Я понимаю, что он ругается на самоподписанный сертификат, да только ни в ~/.ssh ни на гитхабе сртификатов у меня нет.
Git свежий. Кто что думает? Как исправить?


Ответ

KIS 2015 в Firefox автоматически по умолчанию устанавливает свой сертификат и делает автоматическую проверку всех защищённых соединений. Для этого он подменяет сертификаты сайтов на свой сертификат в браузере!
Чтобы убрать подмену сертификатов:
В настройках KIS 2015: Настройка/Дополнительно/Сеть(параметры сети) - снять галочку с "Проверять защищённые соединения" и перезагрузить комп.

Разбор записи в файле задач cron

Вот строка:
# every hour 0 * * * * /usr/bin/php -d memory_limit=500M -f [wwwpath]cron/cron-hour.php > /dev/null 2>&1
Что я уже нашел:
0 * * * * формат времени из сайта просто видно что означает. /usr/bin/php указывает обработчик -d определяет INI php из параметром memory_limit=500M -f приступает к обработке файла [wwwpath]cron/cron-hour.php место, откуда берётся файл > меняем вывод результата
и далее — темнота. Пожалуйста, растолкуйте с 6-го пункта включительно, как дальше работает интерпретатор?


Ответ

Что за магическое something > /dev/null 2>&1?
Как вы уже правильно заметили, > перенаправляет поток. Цитируя статью I/O Redirection
COMMAND_OUTPUT > # Redirect stdout to a file. # Creates the file if not present, otherwise overwrites it.
# Перенаправляет stdout в файл # Создает файл, если он не существует, в противном случае, перезаписывает
Обратите внимание, > перенаправляет только stdout, но помимо него есть еще два потока: stdin и stderr. Последний нас интересует больше всего.
У каждого потока есть свой дескриптор:
stdin: 0 stdout: 1 stderr: 2
Соответственно, нам осталось перенаправить куда-нибудь в укромное место поток stderr. Это можно сделать с помощью команды 2>. В данном случае, мы перенаправляем его в поток stdout, что эквивалентно 2>&1
M>&N # "M" is a file descriptor, which defaults to 1, if not set. # "N" is another file descriptor.
# "M" - дескриптор файла. По умолчанию - 1 # "N" - дескриптор файла, в который будет организовано перенаправление.

Способы чтения xml файла

Какие способы чтения xml файла существуют в C#, кроме XmlDocument, XmlDocumentXPatch и XmlReader ?
update: Мне нужен способ чтения от элемента к элементу, и допустим вывод их на консоль, при этом xml большие, поэтому первые два способа использовать нельзя.
update2: вот что получилось набросать, проблема в генерации полноценного запроса Insert, учитывая вложенность, сейчас просто для примера добавляется 1 элемент
while (xml.Read()) { if (xml.NodeType.ToString() == "Element") { if (xml.IsEmptyElement != true) { myStack.Push(xml.Name); } } else if (xml.NodeType.ToString() == "Text") { string first = myStack.Peek().ToString(); myStack.Pop(); string second = myStack.Peek().ToString(); myStack.Push(first); string cmd = "INSERT INTO " + second + " (" + first + ") VALUES ('" + xml.Value + "')"; SqlCommand command = new SqlCommand(cmd, conn); command.ExecuteNonQuery(); } else if (xml.NodeType.ToString() == "EndElement") { myStack.Pop(); } }


Ответ

Способы чтения xml, существующие в .NET:
XmlReader XmlDocument XPathDocument XDocument/XElement XmlSerializer DataContractSerializer / SoapFormatter DataSet.ReadXml / DataTable.ReadXml
Последние два пункта только для документов определённой структуры, не произвольной. Добавил их для полноты картины.
Если файлы большие, то подходит только первый способ. Если не хочется вручную возиться с запоминанием родителей в переменных, то можно применить следующий подход: считываем регулярно повторяющиеся поддеревья в XElement (или другой класс по нраву). Но это применимо только для файлов с повторяющейся структурой.
Допустим, имеется следующий файл:
Vasya

Mars New Vasyuki

Petya
Earth Urupinsk

Предполагается, что узлов person много. Таким образом, в память загружается лишь одно такое поддерево за раз.
using (var xmlReader = XmlReader.Create("file.xml")) { while (xmlReader.Read()) { if (xmlReader.ReadToFollowing("person")) { XmlReader personSubtree = xmlReader.ReadSubtree(); XElement personElement = XElement.Load(personSubtree); // здесь обрабатываем personElement } } }

Стоит ли void метод отмечать как статический?

Стоит ли в Java void методы помечать как static, если объекты в данном проекте используются для хранения определенного состояния между вызовами метода, которое в свою очередь определяется возвращаемым значением?


Ответ

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

Порядок запуска потоков

Всем привет. Подскажите пожалуйста почему идет запуск методов в потоках именно в таком порядке. Вот код:
using System; using System.Threading; class a { object o = new object(); public void Test() { lock (o) { Console.WriteLine("Start"); Monitor.Wait(o); Console.WriteLine("Stop"); } } public void UnLock() { lock(o) Monitor.Pulse(o); Console.WriteLine("Unlock"); for(int x = 0; x <10; x++) { Thread.Sleep(500); Console.WriteLine(x); } } } class b { static void Main() { a A = new a(); Thread t = new Thread(A.Test); t.Start(); Thread t1 = new Thread(A.UnLock); t1.Start(); } }
Я ожидаю что вначале запустится Test, потом написав слово Start он останавливается, потом запускается метод UnLock и при вызове в нем Pulse() метод Test не должен продолжать свое дело, так как Pulse() не снимает блокировку с объекта, однако как только вызывается Pulse(), то несмотря на заблокированный объект в методе Unlock, метод Test начинает продолжать свое дело. Почему так?? То есть я ожидаю вывод такой
Start Unlock 0....9 Stop
а получается
Start Unlock Stop 0....9
То есть видно, что метод Pulse говорит о освобождении объекта блокировки, и не смотря на то что он не освободился по факту, метод Test продолжает свою работу


Ответ

У вас в коде две проблемы. Первая - неправильный отступ. У вас сейчас на самом деле написано следующее:
public void UnLock() { lock(o) { Monitor.Pulse(o); }
Console.WriteLine("Unlock"); for(int x = 0; x <10; x++) { Thread.Sleep(500); Console.WriteLine(x); } }
как указал Pavel Mayorov, вы освобождаете лок сразу же после вызова Pulse
Вторая - само предположение, что второй поток будет запущен позже. Это многопоточность, и нет никаких гарантий что Test начнет выполнятся до UnLock. Даже починив lock, при определенном положении звезд, вы вполне можете получить вывод:
Unlock 0....9 Start
и зависание на Wait

Вопросы по передаче параметров в Java

Здравствуйте! Пересев с С# узнал, что в Java все параметры передаются по значению.
1) Ссылка ссылается на имеющийся объект, и если до передачи на него ссылалась одна ссылка, то теперь их две?
2) Создаётся новый объект в куче, и в пределах блока кода метода работаешь с новосозданным объектом. При этом после завершения работы метода, изначальный объект остаётся не изменённым? Созданный объект в методе уже стал на учёте у сборщика мусора?
Прочитав пару статей про передачу параметров в Java, решил поэкспериментировать. Есть свой класс со строковым полем и двумя методами. Первый метод меняет поле объекта, а второй меняет значение скопированной ссылки.
Вот класс:
class MyClass {
String s;
public MyClass(String s) { this.s = s; }
public static void changeField(MyClass other) { other.s = "**********"; }
public static void changeRef(MyClass other) { other = new MyClass("----------"); }
Однако почему-то, метод changeField изменяет объект, в то время как changeRef - нет.
MyClass obj1 = new MyClass("1"); MyClass obj2 = new MyClass("2");
MyClass.changeField(obj1); MyClass.changeRef(obj2);
System.out.println(obj1.s); System.out.println(obj2.s);
Вывод исполнения программы:
************** 2


Ответ

Как вы сказали, в Java передаётся ссылка на объект(за исключением примитивных классов типа int, long and etc.) при этом, под эту ссылку выдается своя память.
В методе changeField происходит изменение самого объекта. И вы видите эти изменения за пределами функции.
В методе changeRef происходит создание нового экземпляра класса и ссылку на него записываете в ту область памяти которая была выделена для копии ссылки передаваемого объекта. Таким образом вы не меняете исходную ссылку и исходный объект.
И да, при передаче объекта в метод, создаётся дополнительная ссылка, т.е. их становится две, как вы написали в вашем вопросе.