Страницы

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

суббота, 8 февраля 2020 г.

C# Windows Form

#c_sharp #visual_studio #visual_studio_2010


Здравствуйте. 
У меня есть форма в ней есть элементы textBox , richTextBox и кнопка. После ввода
текста в textBox и нажатии на кнопку он форматируется и появляется в richTextBox. После
того как я добавляю окало 10 записей появляется ползунок (т.к. размер элемента не позволяет
вместить в себя их) и текст идет вниз. Чтобы его увидеть нужно каждый раз проматывать
ползунок вниз. Это не совсем удобно. Как сделать так чтобы он проматывался автоматически
вниз после добавления записи?
Заранее спасибо.    


Ответы

Ответ 1



Попробуйте так: mySuperRichTextBox.SelectionStart = mySuperRichTextBox.TextLength; // Курсор в конец текста mySuperRichTextBox.ScrollToCaret(); // И прокручиваемся к курсору

Как удалить элемент массива в питоне?

#python


Почему не работает этот код?
for a in massiv:
    for b in massiv:
        if len(a)> len(b):
            del b
        elif len(a)


Ответы

Ответ 1



Код не работает, т.к. инструкция del не удаляет элемент, а уменьшает число ссылок на него на 1, del a означает, что нужно уменьшить число ссылок на элемент списка, на который ссылается a, но т.к. в списке остается ссылка на этот элемент, то он никуда не удаляется.

Ответ 2



Странная логика у вашего скрипта =). Но всеже. Во время итерации по массивам в питоне не допускается удаление элементов. Для этого либо сделайте копию списка - massiv[:], либо итерируйте по старинке - по индексам. В случае индексов вы получаете доступ к элементам исходного массива. massiv = ['12', '123', '1234'] for i in range(len(massiv) - 1): for j in range(len(massiv) - 1): if len(massiv[i]) > len(massiv[j]): del massiv[j] elif len(massiv[i]) < len(massiv[j]): del massiv[i] print massiv # => ['1234']

Ответ 3



maxlen= max([len(i) for i in massiv]) massiv=filter(lambda x: len(x)=maxlen, massiv)

Ответ 4



for a in massiv: for b in massiv: if len(a)> len(b): massiv.remove(b) elif len(a)

Ответ 5



Чтобы удалить элемент из списка lst, если известен его индекс i: del lst[i] Чтобы удалить все элементы, кроме элемента с наибольшей длиной: lst[:] = [max(lst, key=len)] Идиоматический способ удалить элементы из списка, удовлетворяющие заданному условию, собрать элементы, которые следует оставить и заменить ими все элементы в списке: lst[:] = [item for item in lst if keep(item)]

Ответ 6



Во-первых, это кортеж или статический массив? Во-вторых, a и b - это не элементы, это просто моментальное представление. Должно так быть: for a in massiv: for b in massiv: if len(a)> len(b): del massiv[b] elif len(a)

Ответ 7



Удаляем элемент: a = [1,3,5,7,4] n = int(input()) a.pop(n) print(*a, sep=" ")

Автоматическая табуляция в NotePad++

#редактор_текста #html #notepad++


Очень часто, работая в NotePad++, приходится вручную табулировать html-файл. В принципе,
это занимает всего 1-2 минуты, но сумарно затрачивается некое время, которое можно
продуктивно использовать на благо работы :)
Есть ли какая-то функция/плагин, который автоматически табулирует html-файл? 

Например:




name



text






    
        
            name
        
    
    
        text
    

    


Ответы

Ответ 1



Для написания кода можете использовать плагин NppAutoIndent(довольно удобно), для автоматического табулирования файлов вы можете использовать плагин IdentByFold. После установки плагина - открываем "плохой файл", жмем - Плагины->Ident By Fold->Reindent File И файл становится хорошим =)

Ответ 2



https://indentbyfold.googlecode.com/files/IndentByFold-071.zip Это прямая ссылка на плагин . Ставить сюда : C:\Program Files (x86)\Notepad++\Plugins\ или сюда : C:\Program Files\Notepad++\Plugins.

Ответ 3



Автоформатирование html - зло. Особенно когда inline-блоки попадутся.

Double.ToString не более, чем два знака после запятой

#c_sharp #net


Можно ли с помощью Double.ToString вывести не более, чем два знака после запятой?
10.2345 →  "10.23"
10.0    →  "10"
10.20   →  "10.2"
100     →  "100"

Если да, то как?    


Ответы

Ответ 1



Да, например так: lCurrentTime.Text = String.Format("{0:0.00}", ((double)duration)); // тьфу, эт не то Лучше так: string result = duration.ToString("#.##");

Передача данных между формами

#1с


Добрый день.
Только начал разбираться с 1С программированием и столкнулся с проблемой.
1С:Предприятие 8.2 (8.2.13.219) нетиповая конфигурация
Есть справочник контрагентов. У каждого контрагента есть связанные с ним события.
Открываем форму выбранного контрагента, в этой форме есть кнопка "добавить документы",
при нажатии на которую выскакивает форма выбора документов, в которой можно выбрать
"Событие". Выбираем событие, открывается форма создания события.
Вопрос: как передать данные (например самого контрагента) в форму события из открытой
формы выбранного контрагента?
Или как мне сослаться на конкретную форму? чтобы, находясь в самой форме события,
взять все, что мне надо, из формы контрагента.
Что должно получиться: из формы контрагента вызываем форму события, и в поля ввода
формы события сразу подставляется значения, взятые из формы контрагента.

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


Ответы

Ответ 1



В модуле документа "Событие" должна быть процедура ОбработкаЗаполнения(Основание). Система автоматически вызывает эту процедуру и передает в нее параметром "Основание" данные объекта "по ссылке", который явился инициатором заполнения. В вашем случае это контрагент. Вот тут вам и нужно посмотреть, какой тип имеет основание, если это справочникСсылка.Контрагенты тогда заполняете, если нет продолжаете по умолчанию. Выглядеть будет примерно так: Если ТипЗнч(Основание) = Тип("СправочникСсылка.Контрагенты") тогда <Заполняем какие то реквизиты> <При необходимости выходим из процедуры методом Возврат;> КонецЕсли;

Ответ 2



Если вы используете событие ОткрытьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>), то в параметры записываете Структуру Структура = Новый Структура("Контрагент", Контрагент) Далее при создании формы события проверяете существует ли свойство "Контрагент" в параметрах(метод структуры "свойство"), если да, то заполняете необходимый реквизит. Надеюсь, я правильно понял вопрос

Как прочитать строки с пробелами в цикле в С++?

#cpp #linux


Вопрос следующий. В цикле нужно читать строки, содержащие пробелы. Признак конца
строки - символ '\n'.  Пробовал функции cin.getline(), gets(). Результат один - читает
один раз, а затем зацикливание. Вот собственно код.

#include 
using namespace std;

int main()
{
    int Exit = 1;
    char mes[20];
    while (Exit) {
        cout << "Введите строку" << endl;
        cin.clear();
        cin.getline(mes, 19, '\n');
        cout << "Вы ввели: " << mes << endl << "1 - продолжить\n0 - выход" << endl;
        cin >> Exit;
    }
    return 0;
}

    


Ответы

Ответ 1



Классическая проблема. После того, как число было считано в переменную Exit, в буфере потока cin остался непрочитанный символ переноса \n. Он-то в последующем чтении из потока все и портит. Его можно убрать, например, так cin >> Exit; cin.ignore (7777, '\n');

Ответ 2



Также я так полагаю имелось в виду: cin.getline(mes, 19, '\n');

Ответ 3



Также можно использовать: cin.sync() // или cin.ignore(cin.rdbuf()->in_avail()); cin.rdbuf()->in_avail() //возвращает количество символов в буфере

Как удалить все файлы из папки с помощью PHP?

#php #файлы


У меня большое количество посетителей в день и создаётся до 50 тысяч сессий в день.
Пишу скрипт, чтобы когда число сессий в папке mod-tmp превысит 20 тысяч, сервер удалял
бы из неё все файлы и перезагружался. Помогите, пожалуйста, как с помощью PHP удалить
все файлы из 1 папки?
    


Ответы

Ответ 1



Изобретаете громоздкий велосипед. Вот самый быстрый и самый легкий способ: function clear() { if (file_exists('/cache/')) { foreach (glob('/cache/*') as $file) { unlink($file); } } } И всё. Дальше вызываете где и когда нужно. К примеру, если это Wordpress, вешаете add_action('save_post','clear').

Ответ 2



Грубый подход, очень грубый: $baseDir = "./"; exec("rm -f " .$baseDir . "/dir/*"); Это сработает только в Linux. Еще раз скажу, подход очень грубый и лучше такого не использовать НИКОГДА.

Ответ 3



Вероятно, всё намного проще. ISPManager криво меняет конфиг php отключая сборщик мусора сессий. Открывайте конфиг php. По-дефолту /etc/php.d/apache/php.ini Меняйте параметр session.gc_probability=0 в значение 1 Перезапускаете аппач /etc/init.d/apache2 restart Всё, сборка мусора снова — дело php.

Ответ 4



Удалить средствами php сразу все не получится. Только в цикле. Возможно следует посмотреть в сторону демонов, как сказал @Inart. Код для пхп: function cleanDir($dir) { $files = glob($dir."/*"); $c = count($files); if (count($files) > 0) { foreach ($files as $file) { if (file_exists($file)) { unlink($file); } } } }

Ответ 5



array_map('unlink', glob('./cache/*'));

Ответ 6



А попробуйте лучше удалять не все сразу, а постепенно. То есть PHP-скрипт каждого пользователя, который зашел к вам на сайт, будет удалять, например, по 1000 файлов, пока их не останется вовсе. Это сделать не сложно. Достаточно одного XML-Файла ( БД здесь не обязательно использовать ) с двумя записями - сколько осталось и вторая - надо ли производить удаление.

Ответ 7



У меня вот таким скриптом все удалило... подчистую... вместе с сайтом. if ($objs = glob($dir."/*")) { echo $objs; foreach($objs as $obj) { if(is_dir($obj)){ }else{ unlink($obj); } } } rmdir($dir);

Масштабируемость приложений Windows Forms

#c_sharp #visual_studio


Как можно обеспечить пропорциональное масштабирование оконных приложений, написанных
VS C#? Чтобы элементы окна, при его развертывании оставались на расстоянии, пропорциональном
измененному размеру формы. 
    


Ответы

Ответ 1



Используйте контролы из категории контейнеры; cкорей всего, вам понадобится TableLayoutPanel. С его помощью нужно будет разметить основной каркас формы, а размеры всех строк и столбцов задать в процентах. Далее, добавляем нужный контрол в ячейку таблицы и, если вы хотите масштабирования за счёт расстояния между контролами — устанавливаем свойство Anchor равным None. Если нужна масштабируемость по размеру — Dock равным Full. И, конечно, одной табличкой вы не ограничитесь. Скорей всего придётся использовать вложенные.

Ответ 2



Вряд ли есть простой способ. Можно сделать так: создать массив координат контролов (например, по левому верхнему краю) на форме, переопределить обработчик WM_SIZING для формы, в обработчике пересчитать массив координат с помощью Graphics.TransformPoints и передвинуть контролы.

Проверка !window.jQuery и динамическая загрузка библиотеки

#jquery #javascript


Пишу простой виджет типа последних твитов для новой социальной сети, виджет будет
встраиваться на сторонних сайтах. Сам виджет работает нормально, но если на сайте нет
jQuery, то мы загружаем его динамически
if(!window.jQuery){
            var jqScript = document.createElement('script');
            jqScript.type = 'text/javascript';
            jqScript.async = true;
            jqScript.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js';
            var firstScript = document.getElementsByTagName('script')[0];
            firstScript.parentNode.insertBefore(jqScript, firstScript);
        }

Если после этого скрипта вызвать jQuery, то библиотека не работает, а сам $ не определен.
Вопрос как заставить (или как правильно вызвать следующие функции, которые используют
jQuery), которые бы дождались бы загрузки библиотеки, если ее нет на сайте или может
как-то по другому надо динамически загружать саму библиотеку?
    


Ответы

Ответ 1



Я делаю просто. Может и не элегантно, но работает сто процентов !window.jQuery && document.write(' как сделать, чтоб в него можно было передать переменную?


Ответы

Ответ 1



Через глобальную переменную

Ответ 2



гуру js могут сказать, что это говнокод и/или велосипед: function getParams(selector){ var src = $(selector).attr("src").split("?"); var args = src[src.length-1]; // выбираем последнюю часть src после ? args = args.split("&"); // разбиваем параметры & var parameters = {}; for(var i=args.length-1; i>=0; i--) // заносим параметры в результирующий объект { var parameter = args[i].split("="); parameters[parameter[0]] = parameter[1]; } return parameters; } для примера: вызов функции getParams("#script") вернёт {"arg2":"xyz","arg1":"abc"}

Ответ 3



В HTML5 можно проще через data-src... в HTML'е: script id="MyLoads" data-src="3334" src="./loads.js" defer в скрипте: var doc = document.getElementById("MyLoads") var keys = doc.dataset.src alert('Йохохо = ' + keys)

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

#cpp


Для чего может понадобиться обьёвлять метод класса, используя спецификатор static?
Переменные в этом методе так же будут static? Что будет происходить при создании нескольких
экземпляров класса? Как в памяти всё это дело будет храниться?    


Ответы

Ответ 1



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

Ответ 2



Описание на msdn модификатора static Здесь более подробно про static в C++

Ответ 3



Объявление метода как static позволяет возможность блокировать вызовы для RValue-объекта даже при компиляции в стандарте c++98. //C++11 class A{ public: void f()const&; void f()const&&=delete; void g()&; }; { A a; a.f(); //ok A().f(); //bad a.g(); //ok A().g(); //bad } //C++98 class A{ public: static void f(A const * ); static void g(A & ); }; { A a; A::f(&a); //ok A::f(&A()); //bad A::g(a); //ok A::g(A()); //bad }

Как определить язык программирования?

#декомпиляция #обратная_разработка


Здравствуйте!
Меня очень интересует вопрос, как можно определить язык программы, если она уже откомпилирована?    


Ответы

Ответ 1



Это, на самом деле, дело не из легких, поверьте! С супер точностью определить ничего не получится, так как языки могут быть разные, поддерживаемые, скажем одной средой программирования( VS, например, в которой поддерживается разработка на свыше 10 языках), а та, в свою очередь, добавляет сходную последовательность asm-секций в машинный код любого приложения, написанного в этой среде. Поэтому, скажем, с точностью( и то не всегда 100%-ой! ) можно определить среду разработки. Делается это, естественно, под дезассемблером. Лучший на мой взгляд( и где я, кстати, чаше всего провожу отладку ) - это OllyDBG. Под ним очень легко и быстро можно разобрать почти любую софтину( за исключением упакованой, обфусцированной и т.д ). Так, VS, например, добавляет в ассемблерный код несколько секций, порядок которых специфичен для данной среды. Последовательность похожа на эту( только пример! ), насколько я помню: .686 .model flat, c option casemap :none ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« .data ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« .code MyFunc PROC uses ecx edi, X: DWORD, Y:DWORD ; TODO ret MyFunc ENDP

Ответ 2



Самое простое и быстрое для вас решение - взять PeID и проанализировать им исполняемый файл. Если программа без защит, есть шансы успешного определения.

Как определить разрядность операционной системы средствами .NET?

#c_sharp #net #winapi #windows_7


Имеется C# приложение для Win 7, во время исполнения которого требуется определить,
запущено оно на 32 или 64 bit'ой версии ОС. Возможно ли это сделать с помощью .NET
или же необходимо использовать "обходные" пути?
    


Ответы

Ответ 1



Выяснить разрядность ОС (32 или 64 bit) непосредственно средствами .NET невозможно, однако существуют способы с использованием WinAPI: С помощью функции IsWow64Process public static string GetOSBit() { bool is64bit = Is64Bit(); if (is64bit) return "x64"; else return "x32"; } [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool IsWow64Process([In] IntPtr hProcess, [Out] out bool lpSystemInfo); public static bool Is64Bit() { bool retVal; IsWow64Process(Process.GetCurrentProcess().Handle, out retVal); return retVal; } С помощью размера типа IntPtr using System; using System.Runtime.InteropServices; class OSBitChecker { static bool Is64Bit { get { return Marshal.SizeOf(typeof(IntPtr)) == 8; } } }

Ответ 2



Environment Class Environment.Is64BitOperatingSystem Environment.Is64BitProcess

Ответ 3



Вот :D if(Directory.Exists(@"C:\Windows\SysWOW64") == true) { Console.WriteLine("Ваш виндовс, безусловно 64 разрядный."); } else { Console.WriteLine("Не, разрядность вашего виндовс, такая же, сколько у человека зубов =("); } Console.ReadLine(); Шутка конечно, но катит) Если что, можно поменять на if (Directory.Exists(@"C:\Program Files (x86)") == true) { Console.WriteLine("Ваш виндовс, безусловно 64 разрядный."); } else { Console.WriteLine("Не, разрядность вашего виндовс, такая же, сколько у человека зубов =("); } Console.ReadLine();

Ответ 4



Вот хороший пост по этому поводу:

Ответ 5



class Program { static void Main(string[] args) { if (Environment.Is64BitOperatingSystem) Console.WriteLine("64Bit"); else Console.WriteLine("32Bit"); Console.ReadKey(); } }

Ответ 6



bool is64bit = System.Environment.OSVersion.Major > 5;

CKEditor: прикрепить файл

#редактор_текста #ckeditor #редактор


Добрый день! Нужно сделать возможность прикрепления файлов. Возможно кто-нибудь сталкивался
с этим? В самом CKE не найду этой функции. У меня используется связка CKEditor + CKFinder.. 
Подскажите, пожалуйста!    


Ответы

Ответ 1



Не понял, в чем проблема? Подключаем ckeditor и ckfinder и загружаем файлы на сервер. Сам недавно подключал. Все без проблем. Сейчас только надо настроить конкретную дерикторию для загрузки файлов. Если надо можем обсудить, подскажу - что смогу.

Ответ 2



Нет! Я решил эту проблему. Нашел информацию на каком-то из сайтов. Сейчас расскажу: Подключаем JS файл на необходимую нам страницу Далее две JS функции: И кнопочка: Добавление файлов происходит в элемент с ID 'attachment'. В примере для добавления используется jQuery

Десятичный хэш

#алгоритм #php #хеширование


Числовые ключи в MySQL работают много быстрее, чем строковые. 
Нужно изготовить десятичные числа из любого хэша.
На стэке нашел решение примерно такое:
hexdec(substr(md5($element_id),-15,15)));

Есть ли более изящные методы получения десятичного хэша?
P.S. более изящных методов ведения БД пока что предлагать не нужно.
Первая строка дана только для ориентировки, например, по длине, либо чтобы не возникло
возражения, что шестнадцатиричное число - тоже число.    


Ответы

Ответ 1



Лично мне кажется, что эта задача неразрешима, поскольку все варианты с выделением фрагмента уникального хэша автоматически теряют свойство уникальности, и не могут использоваться в качестве ключа. Что-то похожее на ваш вариант, кстати говоря, делается здесь (на основании хэша sha1). То есть, вы, конечно, можете воспользоваться своим вариантом (да и любым другим вариантом с конвертированием некоторой значимой части уникального хэша), однако рискуете нарваться на неприятности в случае большого количества записей в базе данных или в случае, если звезды будут неблагосклонны :) Тем более, я думаю, что если такое преобразование было бы возможным, то это давным давно уже было бы реализовано на стороне популярных баз данных, которые допускают строковые ключи.

Ответ 2



Не очень понимаю, почему это неразрешимая коллизия. Давайте посмотрим спокойно: Есть набор байтов представляющих из себя некий хэш Набор байтов однозначно и всегда (взаимно обратимо) транслируется в целое значение - вопрос только в длине набора байтов. Пример: есть допустим хэш длиной 8 байт - это всегда и взаимно обратимо можно переложить на long (Java). Весь вопрос только упирается в длину целого. В Java этой проблемы не существует - ибо всегда можно: new BigInteger(byte[] val) и получить целое произвольной длины.

Ответ 3



А не проще вычислять хэш самому? https://code.google.com/p/boyanov/wiki/FNVHash

CSRF в django

#python #django


Изучаю формы по мануалу джанги, следую строго по инструкции:
1.Добавляю {% csrf_token %} в форму
{% csrf_token %} ...
Получаю Forbidden (403) CSRF verification failed. Request aborted. 2.В гугле предлагают закомментировать 'django.middleware.csrf.CsrfViewMiddleware', чего не хотелось бы. Либо добавить во view.py: from django.core.context_processors import csrf from django.shortcuts import render_to_response def my_view(request): c = {} c.update(csrf(request)) name = "MakcuM" age = 28 return render_to_response("template.html", c) Вопрос в том, как в этом случае в шаблон template.html передать не только словарь с, но и нужные мне данные (в примере name и age). Буду признателен за ответ или за ссылку на источник. Спасибо.


Ответы

Ответ 1



c.update({'data': value}) или c.update(name='MakcuM', age=28)

Ответ 2



Используй RequestContext, например: from django.template import RequestContext def index(request): render_to_response('index.html', {}, context_instance=RequestContext(request))

Выбор MySQL или SQLite высоконагруженного проекта

#highload #sqlite #php #mysql


Здравствуйте! 
Подскажите, какую БД лучше выбрать(MySQL или SQLite) для высоконагруженного проекта
на PHP. Записей в таблице около 50. Обновление данных в них каждый час. Количество
заходов может доходить до 50к в день. 
Заранее спасибо!    


Ответы

Ответ 1



Начинать нужно с mysql и далее смотреть по обстановке. Расширять вы можете в глубь или в ширину для подъема производительности. Расширение в глубь - прикрутить в приложение кеширующий механизм, читать из которого возможно гораздо быстрее. Расширение в ширину - добавить еще один mysql-сервер. Производительность увеличится чуть меньше чем в 2 раза. Хотя с другой стороны 50 килозапросов в день = 35 в минуту = чуть меньше, чем 1 запрос в 2 сек. mysql будет вполне справляться, это не нагрузка для одного таблицы в 50 записей. Единственное, что наврятле они будут идти равномерно. ) В общем порядок действий такой: Ставим -> Тестим -> Изменяем/Добавляем -> Тестим -> Изменяем/Добавляем -> Тестим -> Изменяем/Добавляем -> Тестим -> Изменяем/Добавляем -> Тестим......... и так далее..

Ответ 2



MySQL + я бы посоветовал работу с базой через pdo только ради транзакций. Для высоконагруженных проектов без транзакций некуда.

Ответ 3



Я использовал бы MySQL.

Ответ 4



Недавно проводили сравнение Mysql с mariadb. Mariadb хорошо себя показала. А если между Mysql и SQLite то естественно Mysql.)

Выбор СУБД под большой проект [закрыт]

#база_данных


        
             
                
                    
                        
                            Закрыт. На этот вопрос невозможно дать объективный ответ.
Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы на него можно было дать ответ, основанный на фактах и цитатах, отредактировав его.
                        
                        Закрыт 4 года назад.
                                                                                
           
                
        
Какую лучше СУБД выбрать под разработку большого проекта?
Mongo DB с ее автоматическим привлекающим внимание тысяч программистов, как пчел
на мед, шардингом и вообще современными возможностями?
MySQL и аналоги ..?
SQLite3? Но у нее есть лимиты памяти баз данных и шардинг никакого смысла в увеличении
скорости не придаст.    


Ответы

Ответ 1



Для начала нужно определиться с каким типом БД вы будете работать. По собственному опыту могу сказать, что нельзя ответить на вопрос "что лучше: монго или sql". Нужно исходить из поставленной задачи. Документо-ориентированные БД (mongo, couch) будет лучше если в системе вам часто приходится копировать записи с их зависимостями. Или, например, если не все записи имеют одинаковые поля. Если же вам приходится обрабатывать массивы данных для подсчёта неких статистических данных (например, среднее состояние кассы всех компаний за N-ый период), то здесь к месту реляционный подход (mysql, postgresql). Поэтому, чтобы сузить круг выбора БД, для начала выберите её тип исходя из поставленной вам задачи.

Ответ 2



Есть большая тройка: Oracle, MS SQL Server и IBM DB2. Все остальное это детские шалости, ну разве что MySQL и Postgres близки к этим гигантам. Когда вы говорите большой проект, то видимо речь идет не столько о том, что много данных, но видимо и о том, что много серверов, много коннектов. По человечески умеют делать кластеризацию только указанные монстры, а всякая мелочь вроде MongoDB и проч. - не смешите. Ну запихнете вы туда 100 гигов (и то сомневаюсь), а дальше то что? Ну про SQLite вообще умолчу: ключевое слово здесь lite - то есть легкий, маленький. Хорошо, хоть не упомянули про Hypersonic SQL :) Когда проект большой на первый план выходит не столько способность вмещать данные, столько возможность "держать" нагрузку, использование фич специализированных серверных процессоров, возможность кластеризации, бэкапа, репликации данных между инстансами. Ну и не забываем про поддержку. Какую вы поддержку получите с MongoDB и тем паче с SQLite? Форум полусумасшедших разработчиков-индусов? В общем смотрите в сторону большой тройки. Я лично, предпочитаю Oracle. P.S. Почитав про цели: Ну если говорить о базе жителей города и устройстве у них лк по мониторингу электричества, например. мне становится страшновато за жителей города или за Чубайса, поскольку счета за электричество с SQLite'ом точно не будут оплачены...

Ответ 3



Mysqli или PDO, смотря какая связка. В данный момент для большого проекта, я выбрал MySQLi + PHP + Jquery + Memcache

Ответ 4



@qsad, что значит (количественные характеристики) большой проект?. Во многих больших проектах (кластеры из несколько серверов и систем хранения в SAN, терабайты дискового пространства) используют Oracle, DB2 или MS-SQL. Кое с какими данными на эту тему можно ознакомится здесь

Ответ 5



Никакого MySQL. Юзайте постгрес!)

Ответ 6



Лучше использовать то, где у Вас больше всего опыта. И на MySQL можно построить отличные решения. Шардинги, репликации и партиционирование там тоже есть.

Ответ 7



Холивары вокруг того какая СУБД самая-самая — весьма популярный в интернете вид спорта. Большинство ответов тут, увы, именно про это. Дабы не повышать напряжённость постараюсь вовсе не упоминать тут названия различных СУБД. @qsad, наблюдение за подобными холиварами едва-ли поможет вам разобраться в вопросе, скорее наоборот запутает. Так-же не стоит рассчитывать услышать тут правильный ответ на ваш вопрос. Дело в том что сделать правильный выбор тут можно только зная в подробностях что должна делать система, имея представление об имеющихся ресурсах (людских и материальных). И самое главное: разбираясь в предметной области. К сожалению вынужден констатировать что, судя по вашему вопросу, ваших знаний недостаточно для того что-бы задаваться правильными вопросами (а это наверное самое главное). Если у вас есть время, мозги, желание и готовность долго изучать что-то не связанное напрямую с решением конкретной задачи — изучите получше эту тему. Базы данных и проектирование восоконагруженных и высокодоступных систем это вообще интересно. Если «проект нужно сдавать уже вчера», или сама тема вам не интересна — наймите опытного DBA (Database administrator). Хоть я и не представляю как вы отличите адекватного DBA от чёрт-знает кого. P.S. должен заметить что у меня есть некоторые соображения о том как-бы могла выглядеть подобная система. Но я не стану их озвучивать, учитывая что: во-первых мои соображения основываются на представлении о целевой системе сложившемся из обрывков информации предоставленных @qsad и гадании на кофейной гуще, во-вторых моего опыта и познаний очевидно недостаточно что-бы проектировать такие системы.

Ответ 8



Работаю с БД размером ~70 Гб, строк больше 300 млн., и это MySQL! Проблем нет!

Python 3 и командная строка

#python


Нужно использовать командную строку из скрипта Python 3 и получать ответ. Какая для
этого есть функция\либа?    


Ответы

Ответ 1



Вам нужени модуль subprocess. result = subprocess.check_output(["command", "parameters"]);

Ответ 2



Если просто нужно что-то запустить с помощью консоли, то можно воспользоватся модулем os. os.system('start "" "E:\...\namefolder") Если нужно получить результат работы запускаемой программы, тогда используйте модуль subprocess. from subprocess import Popen, PIPE process = Popen('start %s ' % (programm), stdout=PIPE, stderr=PIPE) out,err = process.communicte() if out: output = out.decode('cp866') print(output)

Получение контента из удалённого файла и вывод его в Toast

#android #файлы


Всем привет, начал заниматься программированием под Android совсем недавно. Вот который
день мучаюсь с простейшим кодом. Даже решил попросить увас помощи, ибо сам не в силах
осмыслить. Данная программа должна считывать содержание файла в интернете и выводить
его в Toast (всплывающее сообщение). Например, в удалённом файле написано "Hello world!"
и это сообщение выводится в тоаст при нажатии на кнопку. Перепробывал все возможные
варианты кодов. При нажатии на кнопку либо ничего не происходит, либо приложение вылетает.
Помогите, очень нужно! Желательно расписать всё подробно, чтобы я смог разобраться =)
Вот полный код main_activity
package com.example.byfile;

import android.os.Bundle;
import com.example.byfile.R;
import android.app.Activity;

import android.os.Bundle;

import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.net.URL;
import java.io.*;

public class MainActivity extends Activity {

     Button btnSend;

        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            btnSend = (Button) findViewById(R.id.btnSend);

            btnSend.setOnClickListener(new View.OnClickListener() 
            {
                public void onClick(View v) 
                {

                    try
                    {
                        URL myURL = new URL("http://my-site.ru/file.txt");
                        InputStream dataStream = myURL.openConnection().getInputStream();
                        InputStreamReader isr = new InputStreamReader(dataStream,
"UTF-8");
                        StringBuffer data = new StringBuffer();
                        int c;
                        while ((c = isr.read()) != -1){
                               data.append((char) c);
                        }

                        String phoneNumber = new String (data.toString());

                        Toast toast = Toast.makeText(getApplicationContext(), 
                                phoneNumber, Toast.LENGTH_SHORT); 
                                toast.show();
                } 
                catch (IOException ie) {
                      ie.printStackTrace();
                }
                }

            });        
        }         
              }

Соответственно, в манифесте доступ в интернет открыт.  


    


Ответы

Ответ 1



//метод, который получает данные по ссылке public static String executeHttpGet(String uri) throws Exception { String result = ""; try { URL url = new URL(uri); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); String str; while ((str = in.readLine()) != null) { result +=str; } in.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return result; } //читать данные лучше в фоновом потоке, а по завершению выводить сообщение private class ReadInBackground extends AsyncTask { String url = ""; public ReadInBackground(String ur) { url = ur; } @Override protected String doInBackground(Void... voids) { //тут все выполняется в фоновом потоке return executeHttpGet(url); } @Override protected void onPostExecute(String params) { //тут выполняется после завершения фонового потока в основном //так же тут можно делать операции с интерфейсом, если нужно Teoast.makeText(getApplicationContext(), params,Toast.LENGTH_SHORT).show(); } } //что бы запустить фоновый поток, которые описан выше //нужно сделать следующее new ReadInBackground("ваша ссылка").execute(); UPD: new ReadInBackground("ваша ссылка").execute(); это как вызвать какой нибудь метод. Тут создается экземпляр класса ReadInBackground и сразу же вызывается метод execute, который и запускает фоновый поток. ReadInBackground наследуется от AsyncTask, а соответственно в ReadInBackground доступные все не приватные методы, которым execute и является. Советую почитать примеры от Google. Если вызов new ReadInBackground("ваша ссылка").execute(); сложен, то можно по другому сделать: //создание объекта и вызов его метода //а это можете вставлять куда вам нужно будет ReadInBackground read = new ReadInBackground("ваша ссылка"); read.execute();

Ответ 2



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

Разработка настольного приложения для анализа данных

#c_sharp #wpf #java #swing


Доброго времени суток.
У меня на работе начинается новый проект по разработке приложения для анализа статистических
данных. Приложение будет работать с базой данных sql server. ОС Windows. Но есть нюанс... 
Мое место работы - это государственное учреждение, где требуется работа с информацией,
имеющей гриф секретности. Устанавливаться и использоваться ПО будет у нас.
Все бы ничего, но на рабочих машинах будущих пользователей будет установлено ПО Страж
3 и проведена аттестация рабочих мест на работу с секретными данными. Эта аттестация
пройдет в ближайшее время, и как мне объяснили, после данного мероприятия изменять
конфигурацию рабочих машин пользователей не будет возможным (показания, правда, расходятся
- я спрашивал троих человек, и трое дали разные варианты ответов). 
Суть такая - после аттестации менять железо и ПО на машинах будет нельзя (это худший
вариант ответа). 
И тут возникает вопрос: а что лучше выбрать для разработки. Хочется устанавливать
ПО пользователям с периодом в 2 недели, но там возникают трудности... для запуска java
приложения необходимо дать права только на jre и потом не напрягать IT с просьбой установки
или изменения паспорта компьютера и т.д. А вот для запуска wpf приложения потребуется
каждый раз искать этих неуловимых товарищей и привлекать к обновлению ПО у пользователя
на машине.
Что посоветуете выбрать java swing или wpf? Трудности я приблизительно постарался
описать. Опыт есть с обоими платформами.    


Ответы

Ответ 1



Из моего опыта -- Swing намного неудобнее, нелогичнее, медленнее и просто хуже WPF, что вопросов вообще никогда не возникало. Хотя на Swing'е в принципе можно создать нормально выглядящее приложение, по факту нативные виджеты выглядят в стиле Motif/CDE, layout manager отвратителен (некоторые свойства действуют в одном случае и не действуют в другом, простое выравнивание вправо/влево сопряжено с нетривиальными танцами с бубном), визуальный редактор производит код, глядя в который хочется плакать, нету XAML, binding'ов, стилей, анимации, кодировать приходится в стиле WinForms, 19 век, в общем. Кроме того, ваш опыт разработчика на WPF пригодятся на рынке труда существенно больше, чем опыт в Swing, всё же Java не снискала славы десктопного языка. Резюме: если есть возможность, выбирайте WPF. А вот для запуска wpf приложения потребуется каждый раз искать этих неуловимых товарищей и привлекать к обновлению ПО у пользователя на машине. Ы? Один раз устанавливаете .NET 4.5 и всё. Если вы говорите об обновлениях, то обновляются все -- и .NET, и Java, и эти обновления при необходимости вполне можно отключить на уровне групповых политик (спросите вашего админа, он знает лучше).

Ответ 2



Если честно, не понял, почему с WPF сложней. Мне кажется, стоит выбрать WPF.

Куки без сервера?

#cookie #javascript


Здравствуйте. Озадачили тут, нужно сделать обратный отсчет на html-страницах, но
без сервера. Будет пара страниц из архива. Открывают первую - старт с 30 минут до 0. 
Думал на JS и куках сделать. 
В голову приходит проблема домена: нормально ли браузер на следующий страницах позволит
их считать? И вообще, может есть более элегантное решение? (Ну в голову еще приходил
Web-Storage из HTML5, но могут попадаться старые браузеры).    


Ответы

Ответ 1



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

Ответ 2



Как вариант, можно при первом появлении на странице, писать время в куку, а начиная со второго, открывать её с помощью JS, и вычислять разницу... time() от php очень бы пригодился)) По моему и в JS что-то подобное да есть. Возможно стоит зайти сюда javascript.ru или в поисковике набрать time js.

Ответ 3



Я как-то делал автономную оффлайн систему для ЕГЭ тестирования на JS — её на DVD к книге прилагали. В куках хранил пройденные вопросы и введённые ответы. Таймер в "основной" странице. А вопросы подгружаются динамически - не в iFrame, просто в div'ы.

Ответ 4



Я нашел замену кукам, которая работает на локалке без сервера. localStorage.setItem('ключ', 'значение'); // Назначение localStorage.getItem('ключ'); // значение localStorage.clear(); // стереть все

Ответ 5



Если что, сделал через GET-параметры. На линках добавлял время оставшееся и повесил это на onclick по ссылкам.

Ответ 6



Если страницы открываются в одной вкладке, то можно использовать window.name.

Реализация в Java сигнатуры метода?

#java #методы


Как этот метод реализовать на java. 
Нужен для того чтобы проверить кодировку файлов на битовом уровне.
Код:
unc ::IsUTF8(unc *cpt) { if (!cpt) return 0;

if ((*cpt & 0xF8) == 0xF0) { // start of 4-byte sequence
    if (((*(cpt + 1) & 0xC0) == 0x80)
     && ((*(cpt + 2) & 0xC0) == 0x80)
     && ((*(cpt + 3) & 0xC0) == 0x80))
        return 4;
}
else if ((*cpt & 0xF0) == 0xE0) { // start of 3-byte sequence
    if (((*(cpt + 1) & 0xC0) == 0x80)
     && ((*(cpt + 2) & 0xC0) == 0x80))
        return 3;
}
else if ((*cpt & 0xE0) == 0xC0) { // start of 2-byte sequence
    if ((*(cpt + 1) & 0xC0) == 0x80)
        return 2;
}
return 0;
}

Вопрос:


Как трансформировать этот метод в
   Java code?
    


Ответы

Ответ 1



постарался максимально облегчить вашу задачу: // на счет значения не уверен, подставьте нужное private static final int UTF8_HEADER_SIZE = 8 ; public static boolean isUTF8 (String path) { return isUTF8(new File(path)) ; } public static boolean isUTF8 ( File file ) { // validate input if (null == file) { throw new IllegalArgumentException ("input file can't be null"); } if (file.isDirectory ()) { throw new IllegalArgumentException ("input file refers to a directory"); } // read input file byte [] buffer = new byte[UTF8_HEADER_SIZE]; try { readBytes(file, buffer) ; } catch ( IOException e ) { throw new IllegalArgumentException ("Can't read input file, error = " + e.getLocalizedMessage () ); } // validate file header // TODO: your validation goes here // if (0xF0 == (buffer[0] & 0xF8) ) { // } return false ; } private static void readBytes ( File input, byte[] buffer ) throws IOException { if (null == buffer || 0 == buffer.length) { return; } // read data FileInputStream fis = new FileInputStream ( input ) ; fis.read ( buffer ) ; fis.close (); }

Ответ 2



Смотрите. Для массивов в Java используется класс ArrayList. Битовые операции те же, только для беззнакового сдвига влево используется >>> (но вам это не нужно). Вместо адресной арифметики применяйте индексирование. Передать что-то типа указателя в середину массива невозможно, просто передавайте массив и начальный индекс. Сигнатура: // внутри класса public static int IsUTF8(ArrayList cpt, int startIndex) { // ... Дальше сами :-)

Ответ 3



После непростого поиска, результат (сын ошибок трудных :) ) проверки кодировки UTF-8: class EncodingsCheck implements Checker { @Override public boolean check(File currentFile) { return isUTF8(currentFile); } public static boolean isUTF8(File file) { // validate input if (null == file) { throw new IllegalArgumentException("input file can't be null"); } if (file.isDirectory()) { throw new IllegalArgumentException( "input file refers to a directory"); } // read input file byte[] buffer; try { buffer = readUTFHeaderBytes(file); } catch (IOException e) { throw new IllegalArgumentException( "Can't read input file, error = " + e.getLocalizedMessage()); } if (0 == (buffer[0] & 0x80)) { return true; // ASCII subset character, fast path } else if (0xF0 == (buffer[0] & 0xF8)) { // start of 4-byte sequence if (buffer[3] >= buffer.length) { return false; } if ((0x80 == (buffer[1] & 0xC0)) && (0x80 == (buffer[2] & 0xC0)) && (0x80 == (buffer[3] & 0xC0))) return true; } else if (0xE0 == (buffer[0] & 0xF0)) { // start of 3-byte sequence if (buffer[2] >= buffer.length) { return false; } if ((0x80 == (buffer[1] & 0xC0)) && (0x80 == (buffer[2] & 0xC0))) { return true; } } else if (0xC0 == (buffer[0] & 0xE0)) { // start of 2-byte sequence if (buffer[1] >= buffer.length) { return false; } if (0x80 == (buffer[1] & 0xC0)) { return true; } } return false; } private static byte[] readUTFHeaderBytes(File input) throws IOException { // read data FileInputStream fileInputStream = new FileInputStream(input); try{ byte firstBytes[] = new byte[4]; int count = fileInputStream.read(firstBytes); if(count < 4){ throw new IOException("Empty file"); } return firstBytes; } finally { fileInputStream.close(); } } }

Как на Си передать информацию от микроконтроллера на COM-порт?

#cpp #c #микроконтроллеры #com_порт


Занимаюсь изучением программирования микроконтроллеров АВР, и столкнулся с вопросом
передачи данных от микроконтроллера на ПК через ком порт. Пишу на Си, МК Atmel AtMega32. 
    


Ответы

Ответ 1



Для передачи информации от МК на COM-порт ПК используется интерфейс RS-232. На микроконтроллерах AVR он называется USART(универсальный синхронно-асинхронный приемо передатчик). Вы написали, что программа на Си, но не указали какой компилятор Вы используете, поэтому ниже приведу программу написанную в CodeVision AVR, но перенести ее на любой другой C компилятор микроконтроллеров AVR не должно составить особых сложностей. Есть два пути создания такого рода ПО. 1) Воспользоваться стандартным генератором начального кода, который имеется в CodeVisionAVR. Для этого нужно выполнить следующие шаги. а) при создании нового проекта, выбрать "использовать CodeWizard" б) перейти на вкладку USART и там поставить галочки перед приемником и передатчиком, то есть активизировать их. в) задать скорость приема передачи информации и другие параметры, синхронность асинхронность, кол-во стоп битов и т.д. г) нажать генерировать ПО д) далее используя стандартную библиотеку ввода-вывода отправлять и принимать информацию. 2) Написать ручками ниже приведенный код: #include #include #include void main(void) { // Input/Output Ports initialization // Port A initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T PORTB=0x00; DDRB=0x0C; // Port C initialization // Func7=Out Func6=Out Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out // State7=0 State6=0 State5=T State4=T State3=T State2=T State1=0 State0=0 PORTC=0x00; DDRC=0xC3; // Port D initialization // Func7=Out Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=0 State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x88; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 250,000 kHz // Mode: Fast PWM top=FFh // OC0 output: Non-Inverted PWM TCCR0=0x6B; TCNT0=0x00; OCR0=0x5F; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: 250,000 kHz // Mode: Fast PWM top=FFh // OC2 output: Non-Inverted PWM ASSR=0x00; TCCR2=0x6C; TCNT2=0x00; OCR2=0x5F; // External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off MCUCR=0x00; MCUCSR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; /// USART initialization // Параметры соединения: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 38400 UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x19; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; while (1) { int a; a = 5; unsigned char get; // Отправить что нибудь: printf("%d\n\r", a); // Принять get = getchar(); //Отправить принятое: printf("%d\n\r", get); } } Но не забывайте, прежде чем организовать прием-передачу информации посредством RS232 необходимо согласовать логические уровни. И соединять надо приемник с передатчиком!) Как то так.

Остановка выполнения цикла while

#comet #while #php #sleep #long_poll


Всем привет! Интересует вопрос - как можно правильно остановить выполнение while
цикла со sleep внутри. 
Дело в том, что я реализовываю "long poll" для быстрого обновления информации на
сайте (оповещения, другая информация).
СУТЬ РАБОТЫ СКРИПТА 
1. Мы отправляем GET-запрос на PHP-страницу в которой расположен скрипт.
2. Скрипт запускает цикл while.
3. В данном цикле существует 2 условия и sleep(1) в конце, который приостанавливает
выполнение цикла.
- Если если цикл работает больше 30 секунд - останавливаем выполнение цикла, соответственно
и скрипта. 
- Если на сайте появилась новая информация, скажем "оповещение" - выводим результат
пользователю и останавливаем цикл.
ПРОБЛЕМА 
Если пользователь закроет окно браузера, или же перезагрузит страницу - выполнится
новый запрос на данный скрипт, который запустит цикл повторно. Но при этом, предыдущие
выполнение  цикла while не остановятся, пока не сработает хотя бы одно условие внутри
него. Если же пользователь отошлет много запросов на страницу - память сервера начинает
сильно грузится и в результате все висит, пока все while не остановят свое выполнение.
ВОПРОС 
Как остановить выполнение цикла и скрипта в целом при повторном выполнении или же
перезагрузке страницы клиентом? 
Пока на данный момент я сделал следующее.
При выполнении скрипта мы генерируем рандомное число, которое записываем в переменную
и так же с сессию. Далее внутри while делаю условие, в котором данная переменная должна
равняться значению сессии. Если false - останавливаем цикл. 
Если мы запускаем скрипт по новой - значение сессии меняется и соответственно все
предыдущие выполнения while останавливаются. 
Можно ли использовать такой вариант? И на сколько он безопасен?
UPDATE.PHP
 // инициализируем сессию пользователя
 $session = Session::instance();

        $rand = rand();
        $session->set('user_update_key', $rand);
        $key = $rand;

        $limit = 20;
        $seconds = 0;

        set_time_limit($limit + 1);

        while (TRUE) {
            if (Session::instance()->get('user_update_key') == $key) {

                if (есть ли обновления. если есть - выводим) {
                    echo 'информация обновлений';
                    flush();
                    exit;
                }
                if ($seconds == $limit) { // завершаем выполнение цикла по истечению
времени.
                    echo 'Close';
                    flush();
                    exit;
                }
                $seconds++;
            } else {
                unset($session, $rand, $key, $notice, $mysession, $last_notice, $limit,
$notise_return, $seconds);
                flush();
                exit;
            }
            session_write_close();
            sleep(1);
            session_start();

}    


Ответы

Ответ 1



Похоже, вас интересует двусторонняя коммуникация пользователя с долгоиграющим процессом на PHP, и процессов PHP между собой во время их исполнения. PHP под это не заточен, как уже писали, но есть расширения, которые могут оказаться полезными. Без дополнительных примочек подходит механизм сессий, или же похожий собственный, задействующий, например, БД как "общую память". В первом приближении, я бы сделал точно то же, что и вы. Почему вы хотите именно long polling, а не новый разовый запрос раз в секунду? VK виджеты для комментариев, скажем, именно так работают. Если веб сервер настроен не закрывать мгновенно каждое соединение, то цепочка таких запросов не станет тормозить. (См. настройку KeepAlive для Apache) Наконец, можно посомтреть в сторону других технологий и протоколов, напр. Flash и RTMP: маленькая флешка в веб странице, которая по RTMP связывается с сервером RED5, и получает/отправляет инфу через JS коммуникацию с флешкой - настоящий риалтайм!

Ответ 2



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

Ответ 3



Ну как вариант, записать время в куки , и недавать юзеру выполнять следующий запрос пока тот не выполнится......

Как закрыть текущую вкладку браузера с помощью js?

#jquery #javascript


Есть небольшая задачка - делаю HTML кнопку, как при нажатии на эту кнопку закрыть
текущую вкладку браузера? И возможно ли такое сделать?    


Ответы

Ответ 1



https://stackoverflow.com/questions/2076299/how-to-close-current-tab-in-a-browser-window

Ответ 2



методом close(); напиши window.close(); и все

Зачем подключают *.moc файлы в Qt?

#qt #cpp


Я видел некоторые примеры кода, где в определенном месте кода написана строка:
#include "filename.moc" //filename

Зачем это делается?
Вот, например:
#include 
#include 

class MyProcessEventDispatcher: public QObject
{
    Q_OBJECT

public:
       MyProcessEventDispatcher(QObject *parent = 0) 
          : QObject (parent) 
        {
                connect(&m_timer, SIGNAL(timeout()), SLOT(updateEvents()));
                m_timer.setInterval(100);                
                m_timer.start();
       }

private slots:
      void updateEvents() 
      {
            m_timer.start();
            qApp->processEvents();
       }

private:
    QTimer m_timer;     
};

#include "main.moc"
int main(int argc, char **argv)
{
      QApplication app(argc, argv);
      MyProcessEventDispatcher mpee;
      //...  
      return app.exec();
}
    


Ответы

Ответ 1



Как я понимаю, это делается тогда, когда для создания make-файлов используется не утилитка qmake, а что-то другое. Если Вы для компиляции и всего остального используете QT это делать не нужно и даже не рекомендуется. Выдержка из книжки "Макс Шлее - QT 4.5. Профессиональное программирование на C++" (стр. 66): Созданные moc-файлы не стоит включать с помощью команды препроцессора #include "main.moc" в конец основного файла. ... Лучше если они будут отдельно откомпилированы и подсоединены компоновщиком к основной программе. Также можно привести цитатку отсюда: The C++ source file generated by moc must be compiled and linked with the implementation of the class. If you use qmake to create your makefiles, build rules will be included that call the moc when required, so you will not need to use the moc directly. Т.е. на мой взгляд при написании программ в QT лучше этого не делать. QT сделает все за вас.

Ответ 2



Метаобъектный компилятор - MOC для каждой библиотеки где есть классы с макросом Q_OBJECT создаёт файлы moc_*.cpp, содержащие таблицу виртуальных методов, чтобы нормально отрабатывались сигналы и слоты. Если лениво создавать отдельную библиотеку с классом, содержащим собственные сигналы и слоты, и класс описывается в файле совместно с функцией main (это также нужно не из-за лени а для демонстнрации возможностей, например при обучении Qt), то компилировать такой код нужно так: moc -o main.moc main.cpp make main.cpp При компиляции через QtCreator нужно вручную, после каждого изменения сигналов и слотов, вызвать команду moc -o main.moc main.cpp

Вывести список файлов в папке на С\С++

#c #файлы #cpp


Можно ли средствами стандартной библиотеки получить список файлов в папке? Использование
WinAPI не подойдет, т.к. нужна кроссплатформенность на уровне исходников.
Либо какие есть сторонние кроссплатформенные библиоткеки?    


Ответы

Ответ 1



Можно тут посмотреть: Как получить в C++ список всех файлов из текущего каталога (в Windows, UNIX, MS-DOS). Хороший кроссплатформенный пример.

Ответ 2



Для кроссплатформенного доступа к файловой системе используйте boost. http://www.boost.org/doc/libs/1_54_0/libs/filesystem/doc/reference.html

Как обернуть функцию декоратором?

#python #python_32 #декоратор


Есть функция

def startInvRej(self, event): 
    if 2 < event.button < 4:
        self.canvCoor = []
        self.frameCoor = []
        print(event.x)
        print(event.xdata)
        self.frameCoor.append(event.x)
        self.canvCoor.append(float(event.xdata))
        print(self.frameCoor)
        print(self.canvCoor)


Как завернуть ее в декоратор, чтобы функция выполнялась с отладочным выводом (т.е.
с print'ами), если это необходимо, а иначе без него?



После Ваших ответов и недолгих раздумий было решено сделать таким образом: 

def decorator(func):
    def wrapped(self, event):
        print(event.x)
        print(event.xdata)
        func(self, event)
        print(self.frameCoor)
        print(self.canvCoor)
    return wrapped

@decorator
def startInvRej(self, event):
    if event.button ==3:
        self.canvCoor = []
        self.frameCoor = []
        self.frameCoor.append(event.x)
        self.canvCoor.append(float(event.xdata))


Насколько этот способ корректен? И объясните, пожалуйста, почему такой способ работает
несмотря на то, что я написал func(self, event), а не startInvRej(self, event)?
    


Ответы

Ответ 1



Прежде всего, рекомендую перейти на Python 3.3. Зачем быть не в тренде? Далее, не могу не порекомендовать встроенный модуль logging Пример из HOWTO: import logging logging.basicConfig(filename='example.log',level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') Выведет в указанный файл: DEBUG:root:This message should go to the log file INFO:root:So should this WARNING:root:And this, too Запускаете своё приложение с ключом --log=INFO и наслажлаетесь фильтрованным логированием. Если задача именно в освоении декораторов, можно сделать супер-тупо: # Заглушка, которая не выводит ничего def log_print_stub( *args, **kwargs ): pass # глобальная переменная, с помощью которой # вызывается либо функция print для логгирования, # либо log_print_stub, чтобы ничего не делать log_print = log_print_stub # декоратор, изменяющий состояние глобальной переменной # перед вызовом декорируемой функции def logged(fn): def wrapped(*args, **kwargs): global log_print log_print = print result = fn(*args, **kwargs) log_print = log_print_stub return result return wrapped # пример: @logged def show_log( message ): print( "show_log" ) log_print( message, " ", message ) def dont_show_log( message ): print( "dont_show_log") log_print( message, " ", message ) # декорированная функция выведет "Видно Видно" show_log( "Видно" ) # не декорированная ничего дополнительно не делает dont_show_log( "Не видно" ) Считаю этот метод супер-тупым, так как глобальные переменные - зло. Кроме того, теоретически, этот метод непотокобезопасен.

Ответ 2



Если честно, тут очевидного применения декоратора я не вижу, может потому что не так часто ими пользуюсь, но всё же. А почему бы не попробовать вот так: def startInvRej(self, event, debug=False): if 2 < event.button < 4: self.canvCoor = [] self.frameCoor = [] if debug: print(event.x) print(event.xdata) self.frameCoor.append(event.x) self.canvCoor.append(float(event.xdata)) if debug: print(self.frameCoor) print(self.canvCoor) Там ведь достаточно очевидно и просто всё выглядит :)

Перенос текста UILabel или UITextField

#xcode #ios #objective_c


Наверное, затасканый вопрос, и я запросто могу нарваться на минусы, но все же: не
могу найти, как объяснить Xcode, что нужно перенести текст. 
У меня есть UITextField, в котором ну слов +-200, задаю я его не через Xib, а хардкодом.
Как мне поставить ограничение по ширине, чтобы дойдя до него, слова перенеслись ниже?
Буду благодарен, если подскажете, как сделать это для UITextField и UILabel.    


Ответы

Ответ 1



У класса UILabel смотрите свойство lineBreakMode и соответственно перечисление видов переноса, которые он поддерживает ну и на всякий случай numberOfLines. С UITextField перенос невозможен - насколько мне известно, это поле может быть только однострочным. Для многострочного ввода посмотрите в действии на UITextView - скорее всего вам нужно использовать его. Маленькое замечание: у этого класса, хотя его поля и являются многострочными, отсутствует свойство lineBreakMode аналогичное такому в UILabel. Гляньте также соответствующие ссылки на SO: Wrap text in UITextField How to create a multiline UITextfield? UITextView character wrap but not word wrap

Разбить программу на потоки без сторонних библиотек [закрыт]

#c #многопоточность #потоки_данных


        
             
                
                    
                        
                            Закрыт. На этот вопрос невозможно дать объективный ответ.
Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы на него можно было дать ответ, основанный на фактах и цитатах, отредактировав его.
                        
                        Закрыт 4 года назад.
                                                                                
           
                
        
Сабж. Понятно, что есть много хороших и разных библиотек для распараллеливания программ
на потоки и задачи. А как самому написать библиотеку для многопоточности на голом Си?
Что для этого нужно (просто план, пошагово)? Что почитать по этому поводу?    


Ответы

Ответ 1



Вам все равно придется иметь дело с библиотеками. API ОС под которую пишите это и есть библиотека. А всякое разнообразие других библиотек для многопоточности это просто обертки над API. И ещё в самом C нету поддержки многопоточности. Так что ответ ни как не получится на голом С писать многопоточный код. Даже в С++ в новом стандарте многопоточность реализована в стандартной библиотеке, а не в самом языке. Если хотите писать многопоточный код, то к примеру для *nix систем вам надо по изучать библиотеку pthread. Ну а для Windows нужно читать доку по API windows которая отвечает за многопоточность.

Unexpected end of input

#jquery #javascript


Всем привет. Есть такой код:
var getChat = setInterval(function(){
    $.post("/chat.php?case=GetAll", function(data){
        if(data != "Error!"){
            var data = $.parseJSON(data);

            $("#messages").html('');
            for(var i in data){
                $("#messages").append('bla bla bla')
            }
        }else{
            alert(data);
        }
    });
    $("#messages").scrollTop($("#messages").get(0).scrollHeight);
}, 2000);

И вот он собственно после нескольких итераций (порядка 10-15) выбрасывает сабж, строку
указывает
var data = $.parseJSON(data);

После этого чат перестает обновляться. Тестирую на локалке, поэтому проблема явно
не в блокировке ip на сервере
Скрипт отдает 10-20 элементов массива
Такой бред только в Chrome пока замечен. Лечится закрытием вкладки и открытием новой    


Ответы

Ответ 1



У вас data — пустая JSON.parse(''); // SyntaxError: Unexpected end of input Добавьте проверку: data = data != "" ? $.parseJSON(data) : {};

Ответ 2



Я тут обнаружил решение проблемы, что мой код ожидал ответ с сервера, а сервак после отправки - молчал. Вот и выпадала ошибки что ожиданное окончание жсона fetch(url, { method: 'POST', body: JSON.stringify(json), headers: { 'Content-Type': 'application/json' } }) .then(res => res.json())// вот тут мой код и ожидает ответ из сервака .then((res) => { toastr.success('Created Type is sent successfully'); }) .catch(err => { console.log('Type send failed', err); toastr.warning('Type send failed'); })

Popstate jQuery

#jquery #html5


На сайте ajax навигация:
var nav = {
 go: function(url) {
  ...
  $.get(url, function(data) {
   $('#page').html(data);
  });
  ...
 }
}

test

Вот например на странице /test перед  размещаю:
$(window).bind('popstate', function() {
 alert(1);
});

И переходя на неё через nav.go(), а после, нажимаю кнопку "Назад", почему-то выскакивает
2 alert(1), хотя должен выскакивать 1.
Третий час не могу понять в чём проблема?    


Ответы

Ответ 1



Можно наверное добавить не анонимный обработчик как то так: ... var Handlers = {}; Handlers.popstate = null; ... if(!Handlers.popstate) { Handlers.popstate = function(){alert(1);} $(window).bind('popstate',Handlers.popstate); } ... Хотя, по идее должна быть проверка средствами jquery на наличие уже привязанного евента, но ща не помню её :-)

Ответ 2



Зачем чудо-велосипед, когда есть pathjs, который ещё и строку url установит, и у которого есть откат на хештеги, если браузер не поддерживает pushState?

Как в Objective-C изменить стандартный переход в Storyboard из одной сцены к другой

#ipad #objective_c #ios #iphone


В моем проекте пока стоит стандартный переход от сцены к сцене при push. 
А мне задумалось сделать что-то поинтереснее.
Как это можно реализовать?
У меня в основе стоит Navigation Controller.
И кстати когда я пытался сделать переход типа modal - симулятор прекращал работу
приложения.
Ну и хочется сделать что-то поинтереснее чем четыре модальных варианта.
Заранее благодарен за помощь )    


Ответы

Ответ 1



Вот вам история в картинках: 1) Начинаете с того, что добавляете новый класс: 2) Делаете его подклассом UIStoryboardSegue, называете его, как хотите: 3) Добавляете в получившийся .m-метод метод perform: #import "CustomSegue.h" #import @implementation CustomSegue - (void)perform { UIViewController *sourceViewController = (UIViewController *)[self sourceViewController]; UIViewController *destinationController = (UIViewController *)[self destinationViewController]; CATransition* transition = [CATransition animation]; transition.duration = .25; transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; transition.type = kCATransitionPush; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade transition.subtype = kCATransitionFromTop; //kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom [sourceViewController.navigationController.view.layer addAnimation:transition forKey:kCATransition]; [sourceViewController.navigationController pushViewController:destinationController animated:NO]; } @end 4) Идете в Storyboard. Удерживая Control, тянете от одного контроллера к другому мышь - отпускаете, выбираете custom: 5) Указываете в свойствах этой Segue, что её класс - CustomSegue. 6) Добавляете в проект фреймворк QuartzCore (если он ещё не добавлен). 7) Пробуете разные способы анимации через изменение опций в методе perform. Удачи!

Как реализовать такую сетку?

#jquery #css3 #html5 #javascript


Есть ли уже готовые плагины для того чтобы реализовать сетку новостей как на имхонете?
(и да я знаю что реализованно с помощью position absolute и можно еще и с transform,
но нужен именно плагин)    


Ответы

Ответ 1



Плагин Masonry. Элементы можно выстраивать как вам угодно. Ну, и как его следствие, плагин Isotope. Будет как в пинтересте и имхонете.

Ответ 2



Там же просто 4 или 5 колонок, господин @Deonis предлагает такое решения вопроса с колонками: http://jsfiddle.net/Deonis/2E4dH/

Ответ 3



Попробуйте плагин "masonry"

Способы определить утечку памяти

#c #unix #memory_leaks #linux


Суть вопроса проста. Какие способы/инструменты есть для определения что память у
нас утекла?
ANSI C.
Для Unix-подобных ОС
x64-86
Нагуглил Hans Boehm garbage collector, но он то ли не работает с Linux x64, то ли
я совсем его криво использую - всё время выдаёт 65536 на GC_get__heap_size().

crtdbg не подходит из-за привязки к MSVS.
Изначально это была задача определить правильно ли я удаляю дерево, но переросло
в этот вопрос.    


Ответы

Ответ 1



Попробуйте Valgrind. Одна из программ Valgrinda, Memcheck, насколько я понимаю, соответствует вашим требованиям.

Как завтавить работать scanf() в VS2012

#visual_studio #cpp #visual_studio_2012


Здравствуйте!
MSVS 2012 не хочет работать с базовой сишной функцией scanf(), нужно писать scanf_s().
Проект консольный, пустой. Как заставить её работать?
PS #define _CRT_SECURE_NO_WARNINGS не помогло.
Спасибо.    


Ответы

Ответ 1



#define _CRT_SECURE_NO_WARNINGS тут не поможет. Вам нужно сделать вот что ( работает в Visual Studio 2012, думаю, сработает и в более ранних) Пункт меню View => Other Windows => Property Manager В появившемся окне кликаете правой кнопкой по проекту, выбираете пункт Properties Configuration Properties => C/C++ => Preprocessor => Preprocessor Definitions Кликаете Edit в выпадающем списке Добавляете в появившемся окошке строку _CRT_SECURE_NO_WARNINGS Сохраняете, закрываете. Должно работать Для наглядности: ** Как найти Property Manager** Вариант 2. На русской VS может не сработать В правом верхнем углу есть поле для поиска: Куда тыкать дальше И наконец

Явное приведение типов

#java


Каким образом работает явное приведение типов то есть например:

List coll = new ArrayList();
List coll2 = (LinkedList) coll;


Явное приведение типа ArrayList к типу LinkedList как это происходит? Ясно что List
является общим интерфейсом для обоих поэтому ссылка может содержать объект типа ArrayList
или LinkedList или какую нибудь другую собственную реализацию...

Объясните пожалуйста каким образом происходит приведение типа ведь объект создается
в куче и как потом меняется его тип?
    


Ответы

Ответ 1



Такое приведение типов не сработает и будет выброшено исключение. ArrayList нельзя привести к типу LinkedList. Смотрите дерево подчиненности. Касательно самой операции приведения типов (или cast'а) - исходный объект - тип не меняет, просто меняется ссылка на него. P.S. Подтекст вопроса в том, что якобы ваш col1 имеет тип List, а раз он имеет тип List то можно провести кастинг на LinkedList, который также имеет интерфейс List. Хитрый у вас интервьюер :) Update Правила кастинга такие: Downcasting - нисходящее приведение, то есть приведение от предка к потомку предку подтипу возможно если только исходная переменная является подтипом приводимого типа. Ошибка может возникать runtime или на этапе компиляции. Скажем: Object object; String s=(String )object; //разрешено, поскольку тип переменной object //может быть String'ом, но это выяснится только в runtime Double object=new Double(1.0); String s=(String )object; //ошибка будет на этапе компиляции поскольку тип // object известен компилятору и он не приводим к типу String Object object=new Double(1.0); Number n=(Number )object; //разрешено, поскольку Double // является подтипом Number Upcasting - восходящее приведение типов или приведение типов от потомка к предку, разрешено всегда. Запрещено приведение типов не "лежащих" в одной иерархии (как в случае Double и String или LinkedList и ArrayList)

Ответ 2



Предыдущий оратор достаточно полно описал нисходящее преобразование, но восходящее (на мой взгляд) требует дополнительных пояснений, так как вопрос очень популярен и интересен. Каким образом работает явное приведение типов В вашем примере показано восходящее преобразование (Upcasting): List coll = new ArrayList(); На русский язык переводится так: создай ворону, типа птицы. Создай динамический массив, типа лист. В большинстве ситуаций восходящее преобразование совершенно не нужно. Однако, приведение типов работает на собеседованиях, когда вам дают вопросы на наследование. К примеру, сайт quizful.net вообще содержит в себе множество вопросов на приведение типов. Поэтому разъясню особенности, которые знаю. Итак, в вышеприведенном примере мы создали объект типа ArrayList, а ссылка типа List. Запомните аксиомы для этого способа: 1. Ссылку можно указать на любого родителя. Даже очень давнего. То есть, можно привести ссылку coll даже к типу Object. Компилятор пропустит любую ссылку на класс родителя, или родителя-родителя, или родителя-родителя...родителя 2. Обращение к полю - всегда идёт возврат поля ссылки, не поля объекта. Если такого поля нет в классе-ссылке будет ошибка компиляции. Class A{ int x = 2; //Поле родителя } Class B extends A { int x = 3; //Поле которое должно перекрыть родительское int y = 5; //Поле, которого нет в родительском классе. } Class Test{ public static void main(String[] args) { A ab = new B(); //Восходящее преобразование System.out.println("Int x = " + ab.x); } } Вернет Int x = 2. Если вы попробуете обратиться к полю объекта: System.out.println("Int y = " + ab.y); //Ошибка компилляции Ваш компилятор скажет, что вы не правы, так как он по ссылке (A ab) не видит такого поля. Всё вышесказанное сохраняет силу, даже если ваши поля пометить модификаторами static. 3. Обращение к нестатическому методу: в этом случае вернёт метод объекта. Но при обращении к статическому методу - возвращает метод ссылки. class D{ public void doSome(){ //Нестатический метод System.out.println("Nonstatic doSome from D"); } public static void Action(){ //Статический метод System.out.println("static Action from D"); } } public class Okey extends D{ public void doSome(){ System.out.println("doSome from Okey"); } public static void Action(){ System.out.println("static Action from Okey"); } public static void main(String[] args) { D o=new Okey(); o.doSome(); //Из класса Okey o.Action(); //Из класса D } } Вывод: Nonstatic doSome from Okey static Action from D Разгадка проста, нестатический метод - это метод объекта, статический - метод класса. Когда мы вызываем не статический метод - компилятор понимает так: летай как ворона. Когда мы вызываем статический - буквально, летай как птица. 4. Если идёт вызов метода, который описан в классе объекта, но не описан в классе ссылки - пойдёт ошибка компилляции. Потому что, вызов метода происходит по ссылке: Class A {} Class B extends A { void someMethod(){}; public static void main(String[] args) { A ab = new B(); ab.someMethod(); //Ошибка компилляции. } } Компилятор такой, пойдёт по ссылке попадёт в класс A - глядь, а метода someMethod() нету! И заругается. 5. Конструктор объекта (при создании командой new) работает также, как если давать ссылку на свой класс.

Есть ли отличия между тесселяцией и триангуляцией?

#графика


И при триангуляции и при тесселяции происходит разбиение объектов на полигоны. Чем
они отличаются и для каких целей применяется каждая из них?    


Ответы

Ответ 1



Тесселяция является более общей техникой. Поверхность разбивается на мелкие многоугольники, как вот в этом примере в средней строке: Триангуляция разбивает строго на треугольники, где соседние граничат по общей стороне. Так что триангуляция тоже тесселяция, а тесселяция с верхнего рисунка не триангуляция: и то и другое применяется для показа поверхностей. Триангуляция применяется когда необходимо чтобы каждый кусочек лежал строго в одной плоскости. Треугольник всегда лежит в одной плоскости. Когда сеть разбивает поверхность, то кусочки с четырьмя и более вершинами не всегда плоские.

Регулярное выражение для проверки на валидность строки

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


Шаблон хочу использовать для проверки на валидность строки вида:
a = 2
a = 2+2
а = 2 +2- 2/ 2 *2 + 2

Длинна строки заранее не известна, но известны разрешенные символы и их порядок.
Я написал написал вот так:
\s*\w+\s*\=\s*\d+[\s*\+|\-|\/|\*\d+]*

Но, такой шаблон захватывает и строки типа:
a = 2 + 
a = 2 ++

Чего я не понимаю, это как строгую последовательность символов сделать группой и
добавить *(ноль или несколько вхождений) для нее, а так же сделать ИЛИ, которое в данном
варианте почему-то не работает.    


Ответы

Ответ 1



Я бы посоветовал предварительно вырезать все пробелы, так как от них больше вреда, чем пользы и написать выражения для конечной строки: \w+=\d+([\+\/\*\-]\d+)*

Возможна ли локализация UI элементов в Xcode iOS?

#xcode #ios #iphone #objective_c


Возможно ли наитивным образом поставить, чтобы надпись в searcBar для отмены была
не "cancel", а "отмена", в TableView при commitEditingStyle были надписи в строках
не "Delete", а "Удалить". Это вообще возможно как то прописать в настройках среды,
или где еще, или только самому прописывать можно? В симуляторе стоит в настройках русский
язык. Искал в сети на обоих языках - нашел информацию только что для подобных элементов
язык сам должен правильный выставляться, но в моем случае этого не происходит. Работаю
в Xcode 5, iOS 7 SDK. 
Для SearchBar пробовал этот способ:
 [[UIButton appearanceWhenContainedIn:[UISearchBar class], nil] 
                                         setTitle:@"Отмена" 
                                         forState:UIControlStateNormal];

Не помогло.    


Ответы

Ответ 1



Конечно возможно, все базовые вещи переводятся автоматом, если вы включаете поддержку других языков в своем проекте. Все остальные строки локализуются либо через NSLocalizedString либо через Base Internationalization в Storyboard. Все строки в сториборде могут быть локализованы, делается это также при добавлении Base в список Languages (у вашей сториборды появляются локализованные варианты). В UISearchBar кнопка будет локализована автоматическии, если вы добавите язык в Проект (вверху слева в дереве навигации по проекту) -> далее следует выбрать проект (не target) -> вкладка Info -> раздел Localizations - список языков. Чтобы локализовывать свои UI элементы - self.label.text = NSLocalizedString(@"Sting to be localized", @"comment for translator"); вот хороший туториал по локализации (теперь на русском): http://www.raywenderlich.com/ru/36227/Локализация-приложений-в-ios а по сторибордам там вроде и так все предельно ясно будет, единственное, autolayout должен быть включен

Включение файлов C++.

#g++ #cpp


Есть два класса Figure и BaseCell (виртуальный). В BaseCell есть метод, принимающий
указатель на Figure, который должен использовать методы Figure. А в Figure есть член
класса с указателем на BaseCell. 
Как заинклюдить файлы BaseCell.h и Figure.h, что бы все работало? Компилятор g++.    


Ответы

Ответ 1



Твоя проблема в том, что каждый класс должен уже знать друг о друге, чтобы уметь как-то обращаться. "В тупую" пытаясь заинклудить друг друга, мы получаем бесконечное погружение в рекурсивное включение (или не получаем - компилятор не позволит). Т.к. ты используешь лишь указатели, тебе пригодится "Forward declaration". В заголовочных файлах предварительно заявляешь: "Потом будет описан такой-то класс, пока знай только то, что он будет". Компилятор не будет знать точного размера этого сумеречного класса (невозможно выделить для него память) и его членов (невозможно определить смещение внутри класса). Таким образом, все, что ты можешь - это работать с указателем на "некий класс". Ограничения те же, как и в void*, учитывая лишь то, что присваивать ему абы что нельзя. А в соответственных *.cpp файлах класса, уже приинклуживай необходимые файлы и сможешь обращаться к членам, создавать конкретные объекты (выделять память, как статически, так и динамически, ибо класс уже будет описан, а не только объявлен). // Figure.h class BaseCell; class Figure { BaseCell *ptr; public: int UseOtherClass(BaseCell* ptr); }; // BaseCell.h class Figure; class BaseCell { Figure *ptr; public: int UseOtherClass(Figure* ptr); }; // Figure.cpp #include "Figure.h" #include "BaseCell.h" int Figure::UseOtherClass(BaseCell* ptr) { // действия с указетелем и возврат необходимого типа } // BaseCell.cpp #include "BaseCell.h" #include "Figure.h" int BaseCell::UseOtherClass(Figure* ptr) { // действия с указетелем и возврат необходимого типа } Ну и, конечно, все методы (в т.ч. inline), в которых используется нечто большее, чем указатель на зависимый класс, должны определяться ПОСЛЕ полного объявления этого класса (в нашем случае - в cpp, после инклудов).