Страницы

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

вторник, 7 апреля 2020 г.

cursor.requery is deprecated что теперь делать?

#java #android #sqlite

                    
После удалении из БД данных надо обновить ListView чтобы отображать изменении. Но
Студия говорит что requery() is deprecated . Какую функцию можно использовать вместе
него? Вот здесь говорят что надо повторно вызвать курсор. Но я не понял как это надо
делать. 

UPD: Скопировал первый код и заново вызвал курсор этим кодом не помогло. 

cursor =  mSqLiteDatabase.rawQuery("select * from "+ DatabaseHelper.DATABASE_TABLE,
null);

    


Ответы

Ответ 1



Решил проблему таким образом. Сначала повторно вызвал курсор тем кодом которым он был создан. cursor = mSqLiteDatabase.rawQuery("select * from "+ DatabaseHelper.DATABASE_TABLE, null); Потом использовал функции SimpleCursorAdapter : userAdapter.swapCursor(cursor); userAdapter.notifyDataSetChanged(); Работает как надо. Первым делом вызываем курсор снова потом используем вышеперечисленные методы. Всё вместе выглядит так: cursor = mSqLiteDatabase.rawQuery("select * from "+ DatabaseHelper.DATABASE_TABLE, null); userAdapter.swapCursor(cursor); userAdapter.notifyDataSetChanged(); PS1. В решении проблемы помогла вот это PS2. Если у вас нет SimpleCursorAdapter надо его создать чем то похожим на вот это: userAdapter = new SimpleCursorAdapter(this, R.layout.siyahi_obyekti, cursor, headers, new int[]{R.id.textView5, R.id.textView6,R.id.textView7}, 0); siyahi.setAdapter(userAdapter);

Ответ 2



Вы не поняли главной цели Гугла (Андроида) по изменению политики к курсорам. Идея состоит в том, чтобы вывести процесс загрузки курсора из основного потока, в фоновый, который бы не тормозил работу приложения для пользователя. ДА, Вы воспользовались командой swapCursor(cursor); но это как к японскому автомобилю березовая тяга. Эта команда предназначена для того, чтобы обновить данные в основном потоке на УЖЕ загруженный в фоновом режиме курсор. Изменения работы с курсором - большая тема, и там нельзя отделаться несколькими командами. Советую изучить КурсорЛоудеры или, хотя бы ассинхронные задачи, это первое. А второе - Контент Провайдеры, если нужно обмениваться инфо с другими приложениями. Хотя фанаты лепят их везде.

выборка из базы данных строк с нарушением последовательности

#sql #база_данных #oracle #plsql

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

Необходимо найти строки операций по которым произошли нарушения арифметической последовательности
операции. 

Т.е., баланс не соответствует нужному числу с учетом суммы операций.

И еще найти такие строки, по которым дата операции с меньшим номером больше даты
операции с большим номером. 
    


Ответы

Ответ 1



Вы не привели структуру таблиц и данные. Применим экстрасенсорные способности. Структура таблицы такая: create table table1( usr_id int, -- Клиент opnum int, -- Порядковый номер операции, начиная с 1 opval int, -- Сумма операции balance int, -- Текущий баланс dt date -- Дата операции ); Баланс в любой строке равен сумме всех операций по данному клиенту с первой по текущую. Номера операций идут подряд +1 к предыдущей записи данного клиента, начиная с 1. Тестовые данные: insert into table1 values(1,1,100,100,sysdate-12); insert into table1 values(1,2,100,200,sysdate-11); insert into table1 values(1,3,-30,170,sysdate-9); -- Ошибка даты insert into table1 values(1,4,300,470,sysdate-10); -- Ошибка номера, ошибка суммы insert into table1 values(2,1,100,100,sysdate-12); insert into table1 values(2,3,100,200,sysdate-11); -- Пропущен номер операции "2" insert into table1 values(2,4,100,300,sysdate-10); insert into table1 values(2,5,50,350, sysdate-9); insert into table1 values(2,6,-150,200,sysdate-8); insert into table1 values(2,7,100,250,sysdate-7); -- Ошибка в сумме Запрос: select * from ( select a.*, (lag(opnum,1,0) over(partition by usr_id order by dt))+1 n_opnum, -- Ожидаемый номер sum(opval) over(partition by usr_id order by dt) n_balance -- Ожидаемая сумма from table1 a order by usr_id,dt -- Для наглядности, на правильность работы не влияет ) where n_opnum!=opnum -- Номер операции не соответствует or n_balance!=balance -- Сумма не соответствует Результат: USR_ID OPNUM OPVAL BALANCE DT N_OPNUM N_BALANCE 1 4 300 470 28.01.2016 18:27:37 3 500 1 3 -30 170 29.01.2016 18:27:37 5 470 2 3 100 200 27.01.2016 18:27:37 2 200 2 7 100 250 31.01.2016 18:27:37 7 300 Вот примерно так. Используются оконные функции, незаменимые в таких случаях. lag(opnum,1,0) дает значение поля opnum из предыдущей записи в окне, 0 - для первой записи в окне. sum(opval) over(order by) - нарастающая сумма opval в окне. Окно в таких функциях можно задавать различными способами. В данном случае мы используем partition by что бы окно было в пределах одного клиента и применяем order by для указания порядка операций в пределах клиента.

CSRF-токен в куках

#php #алгоритм #cookie #защита #csrf

                    
почему некоторые сайты хранят CSRF-токен в куках?

Ведь если отправить, к примеру, GET-запрос - 


Ответы

Ответ 1



Само по себе это действительно бесполезно, если сервер помнит соответствие токен-пользователь и проверяет только его. Но в сочетании с передачей такого же токена в параметрах это становится быстрым и простым способом защиты от CSRF: вы ставите пользователю в куки совершенно случайный токен и проверяете, что в параметрах запроса впоследствии приходит точно такой же. Проверяется соответствие запрос-кука. Потенциальный атакующий не сможет достать его из-за Same Origin Policy (можно ещё досыпать сверху HttpOnly, чтобы не получить дыр из-за JS), а потому не сможет его продублировать в запросе. И нет необходимости запоминать что-либо на сервере.

Error:Execution failed for task ':app:transformClassesWithDexForDebug'

#android #android_studio #gradle

                    
Вот такая ошибка в android studio

Error:Execution failed for task ':app:transformClassesWithDexForDebug'.



  com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException:
org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_65\bin\java.exe''
finished with non-zero exit value 1


Вот build.gradle

    apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.example.chingiz.diplom"
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile files('libs/google-api-services-youtube-v3-rev124-1.19.0.jar')
    compile files('libs/google-api-client-1.21.0.jar')
    compile files('libs/google-oauth-client-1.21.0.jar')
    compile files('libs/google-http-client-1.21.0.jar')
    compile files('libs/jsr305-1.3.9.jar')
    compile files('libs/google-http-client-jackson2-1.21.0.jar')
    compile files('libs/jackson-core-2.1.3.jar')
    compile files('libs/google-api-client-android-1.21.0.jar')
    compile files('libs/google-http-client-android-1.21.0.jar')
    compile files('libs/picasso-2.5.2.jar')
}


Подскажите что может быть?
    


Ответы

Ответ 1



Это не обязательно именно ваш случай, но, глядя на количество jar-библиотек в вашем проекте, думаю, очень вероятный сценарий. Когда какие-то из зависимостей дублируют друг друга, при попытке компиляции появляется точь-в-точь такая же ошибка, как у вас. Проверить, нет ли у вас дублируемых зависимостей можно открыв терминал в папке с проектом и прописав там команду ./gradlew имяпроекта:dependencies. Оцените визуально это дерево на предмет повторяющихся зависимостей. Если они есть - ликвидируйте их и компилируйте заново. В моей практике такое было, и справился с этой ошибкой именно этим путём. P.S. А ещё, чтобы логи при подобных ошибках были более развёрнутыми, зайдите в Settings -> Build, Execution, Deployment -> Build Tools -> Compiler и пропишите там в поле Command-line Options --stacktrace

Как определить размер функции в программе?

#cpp #c

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


Ответы

Ответ 1



Универсального решения не существует. Особенно если вы пишите на C++. А вообще, вот занимательное чтиво прямо на тему твоего вопроса: https://rsdn.ru/forum/cpp/2333802.hot Если коротко, то можно попытаться так: static int test_proc() { return 1; } static void size_proc() {} static size_t test_proc_size() { return (uintptr_t)((uintptr_t)(void*)size_proc - (uintptr_t)(void*)test_proc); } но вообще никаких гарантий, особенно в том, что size_proc так и останется сразу за test_proc. Ну и в развитие данной темы: можно попробовать получить адреса всех символов, отсортировать по возрастанию, размер между твоей функцией и следующим символом вполне может оказаться искомой величиной.

Ответ 2



Функция в С/С++ не обязана быть непрерывной последовательностью инструкций машинного кода с четко выраженным началом и концом. Если несколько функций содержат одинаковый завершающий блок кода ("эпилог"), оптимизирующий компилятор может включить его в бинарник только в одной функции, а в других заменить его на инструкцию перехода в первую. В таком случае понятие "размер функции" становится неоднозначным. Кроме того, попытка перенести машинный код из одного процесса в другой "как есть" скорее всего закончится неудачей, ведь инструкции часто оперируют относительными адресами. Более правильным решением было бы реализовать инжектируемый блок кода полностью в виде ассемблерной вставки, как например здесь. Тем не менее, API для получения размера функции (как справочной информации) существуют. Например, так это можно сделать в Windows с помощью dbghelp: #include #include #include #include "DbgHelp.h" #pragma comment(lib, "Dbghelp.lib") struct Function { const char* name; unsigned int size; bool success; }; BOOL CALLBACK EnumSymProc(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID context) { Function* pfstruct = (Function*)context; if (strcmp(pSymInfo->Name, pfstruct->name) == 0) { pfstruct->size = SymbolSize; pfstruct->success = true; return FALSE; //закончить поиск } return TRUE; //продолжить поиск } // Находит размер функции fname и помещает в переменную resultvar // Требует наличия отладочных символов (PDB-файла) в каталоге с программой bool GetFunctionSize(const char* fname, unsigned int& resultvar) { bool ret; Function fstruct; fstruct.name = fname; fstruct.size = 0; fstruct.success = false; HANDLE hProcess = GetCurrentProcess(); //текущий процесс char Mask[] = "*!"; //искать среди всех модулей BOOL status; status = SymInitialize(hProcess, NULL, TRUE); //загрузка символов if (status == FALSE) { printf("SymInitialize failed. Error code: %d\n", GetLastError()); return false; } //поиск символов if (SymEnumSymbols(hProcess, 0, Mask, &EnumSymProc, (void*)&fstruct)) { if (fstruct.success != false) { resultvar = fstruct.size; //возвращаем размер ret = true; } else { printf("Symbol [%s] not found\n", fname); ret = false; } } else { printf("SymEnumSymbols failed. Error code: %d\n", GetLastError()); ret = false; } SymCleanup(hProcess); return ret; } //********************************** void Func() { printf("Hello, World!\n"); } int main(int argc, char **argv) { uintptr_t p = (uintptr_t)&Func; printf("Func address: 0x%x\n", (UINT)p); unsigned int size = 0; if (GetFunctionSize("Func", size) != false) { printf("Func size: %u bytes", size); } getchar(); return 0; } При использовании Visual Studio 2017+ для корректной работы данного кода необходимо собирать проект с параметром /DEBUG:FULL (см. /DEBUG).

Android: Периодический опрос сервера [закрыт]

#java #android

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

Уже кучу информации изучил и везде мнения расходятся. Вопросов несколько:

На данный момент организовал Service, который запускается через alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
cur_cal.getTimeInMillis(), 300000, pendingIntent);
alarmManager объявлен в главной Activity (менюшка с фрагментами)


Как работают месенжеры по типу Skype, Viber? У них свои пуш серверы, или там другие
технологии используются? Слышал что-то о websocket. 
Как лучше реализовать постоянный опрос сервера с наименьшей тратой батареи телефона?

    


Ответы

Ответ 1



Больше года назад пришлось потратить некоторое время на изучение второго вопроса. Поиск через Google вывел меня только на один результат исследования по этой теме, где было сказано что smart polling может быть экономичнее использования websockets. Что под этим подразумевалось? Если просто тупо опрашивать сервер с постоянным интервалом, то чудес ждать не стоит. Батарея будет расходоваться неоптимально. Websockets экономичнее. Нужно быть smart :) Анализировать поведение пользователя, знать логику бэкенда и подстраивать интервал опроса соответственно этому. Пример, пользователь отправил что-то на сервер, вы знаете что это попадет в какую-то очередь и раньше 30 секунд результата ждать не стоит. Нечего зря бомбить сервер раньше времени. Либо пользователь читает длинный пост, можно ждать пока дочитает, потом запросить сервер есть ли что нового. Так же слушать системные события, собирать запросы и посылать пачками, кэшировать результаты и всякое такое. Сложно? Да. Стоит того? Да. Не хочется делать? Тогда websockets, а лучше push.

Почему появляются дубли одного пакета в разных путях и как исправить ситуацию?

#ubuntu #debian #apt_get

                    
По какой-то причине у меня оказались установленными две версии пакета ansible. 
Я удалил один из них с помощью apt-get purge, но второй остался установлен.

ppa:ansible/ansible это официальный репозиторий ansible (кто бы мог подумать)
ubuntu.local — это наше локальное зеркало.

$ cat /etc/apt/sources.list.d/ppa_ansible_ansible_trusty.list
http://ppa.launchpad.net/ansible/ansible/ubuntu

$ sudo apt-cache policy ansible
ansible:
  Installed: (none)
  Candidate: 2.0.0.2-1ppa~trusty
  Version table:
     2.0.0.2-1ppa~trusty 0
        500 http://ppa.launchpad.net/ansible/ansible/ubuntu/ trusty/main amd64 Packages
     1.7.2+dfsg-1~ubuntu14.04.1 0
        100 http://ubuntu.local/ubuntu/ trusty-backports/universe amd64 Packages
     1.5.4+dfsg-1 0
        500 http://ubuntu.local/ubuntu/ trusty/universe amd64 Packages

$ dpkg -l | grep ansible
(возвращает пустую строку)

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

$ ansible --version
ansible 1.9.4
  configured module search path = None

$ which ansible
/usr/local/bin/ansible


Похоже, apt-get устанавливает его в другое место

$ sudo apt-get install ansible
$ ls /usr/bin/ansible -l
-rwxr-xr-x 1 root root 3944 Jan 15 04:33 /usr/bin/ansible


Понятно, что я могу просто поменять переменную $PATH и будет использоваться нужная
мне версия. Но я хочу разобраться в причине дублирования и полностью его устранить.
    


Ответы

Ответ 1



/usr/local/bin/ansible — этот файл явно появился здесь в обход пакетного менеджера. проверить это можно, сделав запрос к базе данных dpkg: $ dpkg -S /usr/local/bin/ansible и получив в ответ, что no path found matching pattern. Но я хочу разобраться в причине дублирования и полностью его устранить. вероятно, вы запустили какой-нибудь «инсталлятор» (install.sh, pip install что-нибудь и т.д. и т.п.) Понятно, что я могу просто поменять переменную $PATH вот этого делать, по-моему, не стоит. если у использованного «инсталлятора» нет функции «убрать весь мусор, который он разложил по разным уголкам файловой системы», то, в конце концов, можно удалить/переименовать (например, в /usr/local/bin/ansible-1.9.4) неиспользуемый файл.

Принуждение к реализации в производных классах

#c_sharp

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


Ответы

Ответ 1



Пометьте класс и метод, который обязателен к реализации, как абстрактные: abstract class Base { // обязателен к реализации в не-абстрактных наследниках protected abstract void SomeMethod(); // не обязателен к переопределению в наследнике protected virtual void SomeNonAbstractMethod() { } } // не-абстрактный наследник class Child : Base { // если метод не реализован - компилятор выдаст ошибку protected override void SomeMethod() { } }

Отсутствие href у ссылки

#html

                    
Правильно ли не присваивать атрибут href ссылке если работаю с ней через JS?

Пример тому модальное окно. У верстальщика привычка на все ссылки ставить заглушки
 в виде #.После клика на такие ссылки в URL адрессе остаются эти решетки которые никому
не нужны.

div id="modal-forgot" class="modal-forgot modal styled1 form-dynamic">           
       


Ответы

Ответ 1



Выдержка из спецификации: NOTE: The href attribute on a and area elements is not required; when those elements do not have href attributes they do not create hyperlinks. То есть, href не обязательный атрибут, но при его отсутствии браузер не будет рассматривать тег a как ссылку.

Не дает сделать merge

#git #git_merge

                    
Сделал новую ветку и сделал merge, после чего добавил исправленный после конфликта
файл и пишу git commit и тут такое:

 

Merge branch 'branch'

# Conflicts:
#       myfile.txt
#
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
#       .git/MERGE_HEAD
# and try again.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# All conflicts fixed but you are still merging.
#
# Changes to be commited:
#   modified:   myfile.txt
#


что делать?
    


Ответы

Ответ 1



как я понял, при попытке слияния у вас возник конфликт. вы его устранили и командой commit повторяете попытку слияния. при этом запустился редактор vim для редактирования сообщение о слиянии. сразу предложен и обычно вполне подходящий вариант — в первой строке. после сохранения файла (:wq, затем enter) пустые и закомментированные строки будут отброшены. в них — всего лишь подсказки для вас. дополнение если вы всё-таки хотите отказаться от этого коммита, удалите все непустые и незакомментированные строки (в приведённом случае — одна первая строка), для чего переместите «курсор» (например, с помощью стрелок вверх/вниз) на удаляемую строку и нажмите dd. а потом сохраните файл, как написано выше. commit не будет создан.

Получение значения переменной из анонимного класса [дубликат]

#java #android

                            
             
                
                    
                        
                            На этот вопрос уже даны ответы здесь:
                            
                        
                    
                
                        
                            Не могу возвратить результат из анонимного класса
                                
                                    (3 ответа)
                                
                        
                Закрыт 4 года назад.
            
        

Надо получить обработанную переменную soapXml. Как это сделать?

public class MainActivity extends Activity
{
    public String soapXml = "";
    final String LOG_TAG = "myLogg";

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

        et3 = (EditText) findViewById(R.id.editText3);

        et3.setOnEditorActionListener(new TextView.OnEditorActionListener()
        {
            val3 = et3.getText().toString();
            receiver = new BroadcastReceiver()
            {
                @Override
                public void onReceive (Context context, Intent intent)
                {

                    soapXml = intent.getStringExtra("xml");
                    tv.setText(soapXml); // здесь он выводит обработанную переменную
                }
            }
        });
    }
    Log.d(LOG_TAG,soapXml) // здесь надо получить обработанную переменную soapXml,
но в логе он выводит лишь "" и все. :(
}

    


Ответы

Ответ 1



В методе setOnEditorActionListener в качестве аргумента вы передаете экземпляр анонимного класса. В этом случае происходит захват переменных по значению. В вашем случае копируется по значению указатель на переменную soapXml, который затем изменяется. Но это изменение будет видно только внутри тела анонимного класса. Более подробно, почему так происходит. Как вариант, вы можете создать вложенный класс и его экземпляр передавать в качестве аргумента, откуда затем получать новое значение soapXml. Второй вариант: создать вложенный класс, в котором обернуть объект типа String и экземпляр этого класса передавать в анонимный класс, тогда вы сможете извлечь новое значение строки извне замыкания. Пример: public class MainActivity extends Activity { private class SoapResponse { public String soapXml; } private SoapResponse soapResponse = new SoapResponse(); final String LOG_TAG = "myLogg"; @Override protected void onCreate(Bundle savedInstanceState) { ... et3.setOnEditorActionListener(new TextView.OnEditorActionListener() { val3 = et3.getText().toString(); receiver = new BroadcastReceiver() { @Override public void onReceive (Context context, Intent intent) { soapResponse.soapXml = intent.getStringExtra("xml"); tv.setText(soapResponse.soapXml); } } }); } Log.d(LOG_TAG, soapResponse.soapXml); }

SQLite производительность

#java #android #sql #sqlite

                    
Есть ли разница в скорости получения данных из таблицы SQLite на Android:

Первый вариант:

    ArrayList arrayList;
    Cursor c = db.rawQuery("select a,b,c from table");
    for (int i = 0; i < c.getCount(); i++) {
        arrayList.add(c.getString(0));
    }


Второй вариант:

    ArrayList arrayList;
    for(int i=0; i < count; i++){
        Cursor c = db.rawQuery("select a,b,c from table where a = " + i)
        String a = c.getString(0);
        arrayList.add(a);
    }


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


Ответы

Ответ 1



Второй вариант вероятно будет работать гораздо медленнее. Если есть возможность получить все данные одним обращением к БД(1 вариант), т.к. зачем вы намеренно обращаетесь к бд множество раз(2 вариант)? А вообще просто сравните скорость выполнения первого и второго способа на большом объёме данных. Меня только смущает в вашем втором варианте i<10. Первый вариант должен выглядеть видимо так: ArrayList arrayList; Cursor c = db.rawQuery("select a,b,c from table where a>=0 and a<10"); for (int i = 0; i < c.getCount(); i++) { arrayList.add(c.getString(0)); }

Ответ 2



Я бы сделал проверку if(c.moveToFirst()), странно что вы эту команду не вызываете. А в цикле нужно использовать c.moveToNext().

Расскажите, кто как работает в django с формами? [закрыт]

#django

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

Добрый день, тут хочу для себя разьяснить что лучше, точнее предпочтительнее, "рисовать"
самому форму или просто воспользоваться from django import forms, а в html просто вывести
{{ form }}, т.к. и ежу понятно, что если у тебя всего пара полей, то можно особо не
выдумывать и вывести через {{ form }}, а если у меня десяток полей, где надо ввести
и числа и строки и сделать выбор из селектов....
    


Ответы

Ответ 1



Возможностей для кастомизации форм довольно много. В forms можно указать нужные виджеты для полей. В темплейтах можно использовать встроенные методы для форм {{ form.as_p }} {{ form.as_table }} Можно обращаться к определенным полям и добавлять их в нужные теги

{{ form.some_field }}

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

вставка блока внутрь иного блока

#javascript

                    
Имеется конструкция типа 
, и нужно вставить внутрь блока span. Проблем с созданием спана, его класса и его содержимого нет, но вот когда я пытаюсь вставить спан в блок, то выходит [object HTMLSpanElement](через console.log(number_span) выводит всё правильно, то что вставить собственно нужно). Делаю так: var div = document.getElementById('show_chosen_address'), number_span = d.createElement('span'); number_span.className = "number"; number_span.innerHTML = "test"; div.innerHTML = number_span;


Ответы

Ответ 1



либо используйте appendChild, либо вставляйте number_span.outerHTML var div = document.getElementById('show_chosen_address'), number_span = document.createElement('span'); number_span.className = "number"; number_span.innerHTML = "test"; div.innerHTML = number_span.outerHTML; var div2 = document.getElementById('show_chosen_address2'), number_span2 = document.createElement('span'); number_span2.className = "number"; number_span2.innerHTML = "test2"; div2.appendChild(number_span2); #show_chosen_address, #show_chosen_address2 { border: 1px solid; width: 200px; margin-bottom: 10px; }


Как правильно закэшировать в браузер Javascript/CSS файлы?

#php #javascript #apache

                    
1. Как правильно кэшировать  в браузер Javascript/CSS файлы, что бы при изменении
версии файла, файл кэшировался. 

2. И как правильно сделать версионность кэшируемых файлов? 
    


Ответы

Ответ 1



Кеширование осуществляется за счет заголовков ответа (Cache-Control). В apache кеширование можно включить используя mod_expires Тут документация Так же может быть полезным для общего развития прочтение данной статьи Часто используют добавление get параметра к имени файла. Например /_build.css?v=1. Второй подход - это складывать файл в папку с именем версии /v1/_build.css. Но первый вариант проще, т.к. он позволяет легче поддерживать прошлые версии (при публикации новой версии - старая останется доступна). По просьбе из комментариев дополню первый пункт: Т.к. мы управляем версиями наших файлов, то мы можем включить кеширование на максимальный срок (Хотя уверен, что хватит и месяца). Вот код для apache всё из той же статьи Header set Cache-Control "max-age=2592000, must-revalidate" Т.е. для всех файлов с расширением css и js мы добавляем заголовок ответа, который говорит браузеру, что данные файлы необходимо закешировать на 2592000 секунд (30 дней)

Как присвоить ссылки цветным полосам на резиновом фоне?

#html #css

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

Высота задаётся за счёт свойства width: 10%; соседнего блока, она и образует высоту
всего блока в котором находится квадрат и цветные полосы. Но не получается сделать
так, чтобы полосы становились той же высоты.


Ответы

Ответ 1



Cделать ссылку, затем трансформировать её. Дополнено: резиновые %-ные значения. a { width: 20%; height: 60px; transform: skew(-45deg); display:block; float: left; } a { } a:nth-child(1) { background-color: red; } a:nth-child(2) { background-color: blue; } a:nth-child(3) { background-color: green; } a:nth-child(4) { background-color: tomato; } a:nth-child(5) { background-color: yellow; } div { width: 90%; margin: 0 30px; }

Совместимы ли методы из библиотеки Delphi с P/Invoke?

#c_sharp #delphi #net

                    
Совместимы ли методы из библиотеки, написанной на Delphi с P/Invoke?
И если нет - есть ли какая либо возможность сделать их совместимыми? 

Есть доступ к исходникам .dll.
    


Ответы

Ответ 1



Для начала - стоит посмотреть в исходниках, с каким соглашением о вызовах функции из библиотеки экспортируются. Если там stdcall или cdecl - то такая функция без проблем может быть вызвана через P/Invoke. Если же там соглашение не указано - то так просто не получится. В таком случае, если исходники библиотеки менять нельзя - самым простым решением будет прослойка из еще одной библиотеки на Delphi: procedure Foo(...); external 'MyLib.dll'; // ... procedure Foo_Std(...); stdcall; begin Foo(...); end; // ... exports Foo_Std name 'Foo';

Как сделать, что бы в IDLE импортировался по умолчанию модуль pprint?

#python #idle

                    
Как сделать, что бы в IDLE (только в shell)  импортировался по умолчанию модуль pprint
(что-бы не импортировать каждый раз вручную)?
    


Ответы

Ответ 1



Имеется системная переменная PYTHONSTARTUP, в которую можно записать путь и имя скрипта, который должен быть выполнен интерпретатором перед запуском программы. Создайте файл с директивами импорта и укажите его в PYTHONSTARTUP.

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

#qt #mvc

                    
Пишу учебное задание, пытаюсь написать некоторое подобие MVC. Пытаюсь разделить логику
программы и интерфейса в разные классы. Соответственно, запилил классы Controller и
View. View содержит нажатия всяких кнопок, считывание с полей, обновление содержимого
меток и т.п. Controller же должен по идее инициировать запуск View и считывать получаемые
значения для проведения операций над ними и передачи этого добра в модель. Я сделал
вьюху элементом контроллера, вызываю её, но столкнулся с проблемой - а как, собственно
получать из вьюхи данные? Т.е. например, я понимаю, что можно запустить view->show()
и прочие методы вызывать из контроллера, но как обеспечить свободную работу с формой
пользователю и при этом вовремя получать информацию о его действиях?
    


Ответы

Ответ 1



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

System.ExecutionEngineException при попытке маршализации структуры

#c_sharp #struct

                    
Есть программа на C#, предназначенная для конфигурирования устройства на микроконтроллере
через USB порт.
Для того, чтобы корректно передавать данные микроконтроллеру (Си, жесткие требования
к ресурсам), я храню их в виде структуры фиксированного размера:

SystemPack InternalSystemPacket = new SystemPack(); // Текущий пакет данных со стороны
ПК        

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
public unsafe struct SystemPack
{
    public ushort PackLength; // Перед отправкой пакета контроллеру сюда надо записать
общую длину пакета

    // Вкладка "Информация"
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = DEVICENAMELENGTH)]
    public byte[] DeviceName;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = STRINGLENGTH)]
    public byte[] DeviceVersion;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = REQUESTLENGTH)]
    public byte[] DeviceIMEI;


и т. д.

Перед передачей данных контроллеру по USB (а также для записи данных на диск) я подвергаю
структуру маршализации для превращения ее в массив данных:

byte[] buffer = new byte[System.Runtime.InteropServices.Marshal.SizeOf(InternalSystemPacket)];

GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned);
Marshal.StructureToPtr(InternalSystemPacket, h.AddrOfPinnedObject(), false);
h.Free();


Все работало нормально. Но при изменении структуры (я удлинил один ее член):

 [MarshalAs(UnmanagedType.ByValArray, SizeConst = REQUESTLENGTH + 1)]
 public byte[] DeviceIMEI;


при попытке маршализации вылетает System.ExecutionEngineException:


    


Ответы

Ответ 1



Рискну предположить, что массив, записанный в поле DeviceIMEI, остался старого размера. PS Но зачем все так сложно? Зачем вам вообще маршаллинг структуры, если все что нужно - это сформировать правильный массив? var ms = new MemoryStream(); var writer = new BinaryWriter(ms); writer.Write((ushort)0); // Место для длины пакета Debug.Assert(packet.DeviceName.Length == DEVICENAMELENGTH); writer.Write(packet.DeviceName); Debug.Assert(packet.DeviceVersion.Length == STRINGLENGTH); writer.Write(packet.DeviceVersion); Debug.Assert(packet.DeviceIMEI.Length == REQUESTLENGTH); writer.Write(packet.DeviceIMEI); var length = writer.Seek(0, SeekOrigin.Current); writer.Seek(0, SeekOrigin.Begin); writer.Write((ushort)length); writer.Flush(); var packetData = ms.ToArray(); Кстати, BinaryWriter умеет и строки напрямую записывать, если ему в конструктор кодировку передать. Только с проверкой длины придется что-нибудь думать, вроде такого: // Код ниже напрашивается на вынесение в отдельную подпрограмму var i = writer.Seek(0, SeekOrigin.Current); writer.Write(packet.DeviceName); // Допустим, это - строка i = writer.Seek(0, SeekOrigin.Current) - i; if (i > DEVICENAMELENGTH) throw new ArgumentException("too long", "packet.DeviceName"); else for (; i < DEVICENAMELENGTH; i++) writer.Write((byte)0);

Как выбрать с помощью jQuery только один li, с условием выборки двух классов?

#javascript #jquery

                    
Есть следующие классы:

  • Как выбрать с помощью jQuery, только один li, с условием выборки двух классов? К примеру, пробую так, не получается: $('li').find('.holiday_homes, .steel_structures');


    Ответы

    Ответ 1



    В селекторах jQuery применяется синтаксис аналогичный CSS таким образом выбор элементов с двумя классами будет выглядеть так $('elementName.ClassName1.ClassName2') Если нужно выбрать только первый, то применять функцию first описанную ниже, либо eq(0), который так же можно добавить в селектор. Важно: Если есть уверенность, что элемент с этими двумя классами только один, либо все с такими классами, то никаких дополнительных манипуляций не нужно. Есть множество способов, например метод first $( "li" ).first().css( "background-color", "red" );

    Изменение цвета на png программно

    #android #android_drawable

                        
    Есть изображение .png, это иконка для таба, для нее я сделал селектор, что бы при
    активном и неактивном табе она имела разный цвет. Пробовал PorterDuff.Mode но результат
    не совсем такой как я хотел. Меня интересует как можно заменить в селекторе цвет активной
    иконки динамически. Что бы вместо фиолетовой иконки можно было сделать, красную, зеленую,
    желтую и т.д.
    
    Пример моего селектора:
    
    
    
    
    
    
    
    
    
    
    
    Пример иконки:
    
    
    
        
    


    Ответы

    Ответ 1



    Изменить цвет можно так: TintIcons.java public class TintIcons { public static Drawable tintIcon(Drawable icon, ColorStateList colorStateList) { if(icon!=null) { icon = DrawableCompat.wrap(icon).mutate(); DrawableCompat.setTintList(icon, colorStateList); DrawableCompat.setTintMode(icon, PorterDuff.Mode.SRC_IN); } return icon; } public static void tintImageView(ImageView imageView, int colorStateListResId) { ColorStateList list = ContextCompat.getColorStateList(imageView.getContext(), colorStateListResId); if (list != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { imageView.setImageTintList(list); } else { imageView.setImageDrawable(tintIcon(imageView.getDrawable(), list)); } } } } /res/color/icon_state_list.xml MainActivity.java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TintIcons.tintImageView((ImageView) findViewById(R.id.img_view), R.color.icon_state_list); } } Вместо списка состояний можно передавать просто цвет (например, R.color.colorPrimary), тогда картинка просто перекрасится. Аналогично можно перекрасить фон кнопок и т.д. (получив предварительно картинку фона через imageView.getBackground()). Как видно все эти причуды нужны для pre-Lollipop. Для lollipop+ достаточно titnList задать в разметке...

    Яндекс пробки получить цифру

    #javascript #yandex_maps_api #яндекс_карты

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


    Ответы

    Ответ 1



    В Яндекс.Карты API нельзя получить отдельно какой-то параметр карт с пробками, например, балл пробок, без отображения слоя пробок, а наоборот - можно (иначе нарушение правил пользования Яндекс.Картами). Подробнее тут. С другой стороны был уже подобный топик.

    Как уменьшить зависимость заголовочных файлов C++?

    #cpp #dll

                        
    Допустим есть файл A1.h с описанием класса A1 (class A1 { ...};), файл A2.h с описанием
    класса A2 (class A2 {...};). Есть файл B1.h, в котором подключаются заголовочные файлы
    A1.h и A2.h и описывается класс B1 (
    
    #include "A1.h"
    #include "A2.h"
    
    class B1 {
    A1* pA1;
    A2* pA2;
    ...
    };
    
    
    ). Как уменьшить зависимость заголовочных файлов, чтобы когда подключалась dll библиотека
    не нужно было тянуть за собой много заголовочных файлов ?
        
    


    Ответы

    Ответ 1



    В вашем примере в файле B1.h нет необходимости подключать файлы A1.h и A2.h, так как описанный вами класс В1 содержит лишь указатели на классы А1 и А2. Достаточно будет предварительного объявления: class A1; class A2; class B1 { A1* pA1; A2* pA2; }; А заголовочные файлы А1.h и А2.h необходимо подключить в файле реализации B1.cpp.

    Когда нужно связывать таблицы БД?

    #sql

                        
    в БД Имеется таблицы спрВузов(колонки id_wuz, name_wuz ), спрГородов(id_gorod, name_gorod),
    спрЛюдей( id_chelovek, name_chelovek, surname)
    
    В программе нужно сделать такую таблицу, где пользователи могли бы вводить Нового
    Студента, город в котором проживает этот студент и в каком ВУЗ-е он учиться:
    id_student,name_student, name_gorod, name_wuz.
    
    Хочу понять, какой самый правильный путь, что бы получить такую таблицу-нужно связать
    мои справочники или это самый короткий путь?
        
    


    Ответы

    Ответ 1



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

    удаление SOCKET из памяти

    #cpp #winsock

                        
    #include 
    #pragma comment(lib, "ws2_32.lib" )
    
    void main(){
    
        WSADATA buff;
        WSAStartup(0x202, &buff);
        SOCKET S;
    
        while (1){
            S = ::socket(AF_INET, SOCK_STREAM, 0);
            closesocket(S);
        }
    }
    
    
    При работе память в диспетчере все растет и растет, как исправить?
        
    


    Ответы

    Ответ 1



    В данном случае сбоил socket модуль, помогло netsh winsock reset

    Исключить запись стандартных namespace при записи XML

    #c_sharp

                        
    
    
    При записи объекта в xml получаю следующее(см. скрин). Как сделать так чтобы запись,
    которая следует после тега report и до тега eeprom не было. И как еще добавить в начало
    файла следующее 
    
    
    
        
    


    Ответы

    Ответ 1



    Попробуйте так: XmlSerializer s = new XmlSerializer(objectToSerialize.GetType()); XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("",""); s.Serialize(xmlWriter, objectToSerialize, ns); enSO

    Ответ 2



    Для задания настроек сериализации используется класс XmlWriterSetting, который имеет параметры OmitXmlDeclaration - возвращает или задает значение, определяющее, следует ли опустить XML-объявление. Encoding - Возвращает или задает тип используемой кодировки текста. Тогда ваш код будет иметь следующий вид XmlSerializer formatter = new XmlSerializer(typeof(Report)); // объект, который сериализуем Report obj = new Report(); // опускаем все определения пространств имен XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("",""); //получаем поток, куда будем записывать сериализованный объект using (FileStream fs = new FileStream(pathXmlFileWrite, FileMode.OpenOrCreate)) { XmlWriter writer = XmlWriter.Create(fs, new XmlWriterSettings() { OmitXmlDeclaration = false, Indent = true, Encoding = Encoding.GetEncoding("ISO-8859-1") }); formatter.Serialize(writer, obj, ns); } В настройках сериализации мы явно указали не удалять XmlDeclaration и установили кодировку Latin1(ISO8859-1) через свойство Encoding.

    Wordpress и AJAX - вывод массива в JSON

    #php #ajax #json #wordpress #json_encode

                        
    С помощью плагина добавляю в WordPress шорткод, который вставляет форму для расчета
    на страничку. Серверной частью формы является вот такая функция:
    
        function ajax_calc(){
    // Прием и обработка POST запроса   
    
            if(isset($_POST['action']) && $_POST['action'] == 'ajax_calc'){
    //ширина, экранируем все лишнее, убираем пробелы и заменяем "," на ".", т.к. пользователь
    может ввести любой из знаков
                $width      = str_replace(',','.',trim(htmlspecialchars($_POST['width'])));    
    //длина                         
                $length     = str_replace(',','.',trim(htmlspecialchars($_POST['length'])));  
    //высота
                $height     = str_replace(',','.',trim(htmlspecialchars($_POST['height'])));
    
                $m_rul      = str_replace(',','.',trim(htmlspecialchars($_POST['m_rul'])));     
    
                $k_zap      = str_replace(',','.',trim(htmlspecialchars($_POST['k_zap'])));
    
    // возвратим ошибку, если пришедший к нам параметр не число 
                if(!(float)$width || $width ==''){     
                    echo implode(array('loadmsgerr'=>'Error! Width should be number only!'));
    
                }
                elseif(!(float)$length || $length ==''){
                    echo implode(array('loadmsgerr'=>'Error! Lenght should be number
    only!'));
    
                }
                elseif(!(float)$height || $height ==''){
                    echo implode(array('loadmsgerr'=>'Error! Height should be number
    only!'));
    
                }
                else{
    // иначе вернем результат       
                    $Perimeter = ($width + $length) * 2 ; //периметр 
                    $Square =  $Perimeter * $height;      //площадь боковых поверхностей
                                    // другие вычисления, предобразования...
                                    //      возвращаемы массив с данными
                    $it_test = 10*$k_zap + $m_rul;
                    $answers = array('S' => $Square, 'P' => $Perimeter, 'it_test' =>
    $it_test);                      
                    echo json_encode($answers);
                            }
                    }
            }
    
    
    А JS при этом вот такой:
    
    jQuery(document).ready(function(){
    // ловим клик по кнопке калькулятора 
        jQuery('#calc #form_calc_id').on('submit', function(e){
            jQuery('#calc .result').show().text(ajax_calc_object.loadingmessage);//Обработка...
    //AJAX запрос методом POST на указанный url. Тип данных определяем как json        
            jQuery.ajax({
                type: 'POST',
                dataType: 'json',
                url: ajax_calc_object.ajaxurl,
                data: { //принимаем данные из формы в шаблоне
                    'action': 'ajax_calc', //вызов нашей функции
                    'width': jQuery('#calc #width').val(), 
                    'length':jQuery('#calc #length').val(),
                    'height': jQuery('#calc #height').val(),                            
    //                'security': jQuery('#security').val()
                    'm_rul': jQuery('#pa_м-в-рулоне').text(),
                    'k_zap': jQuery('#pa_k-zap').text(),
    
                },
                success: function(data){
                    var resperr = data.loadmsgerr;//получаем заначение ошибки
    
                    if(!resperr){//если нет ошибок
                        json.parse(data);
                        jQuery('#calc .result').html(data.S + data.P); //вставляем в
    тег с классом .result полученный ответ
                        jQuery('#Обои').val();
                    }
                    else{
                        jQuery('#calc .result').text(resperr); //или туда же выводим ошибку
                    }
    
                },
                error: function(xhr, textStatus, errorThrown) {//обработка и вывод в
    консоль ошибок
                    if (xhr.status != 0) {
                        var msg = ' (' + xhr.status + ') ';
                        if (textStatus) msg += ': ' + textStatus;
                        if (xhr.status < 200) {
                            msg = 'AJAX Informational ' + msg;
                        } else if (xhr.status < 300) {
                            msg = 'AJAX Success ' + msg;
                        } else if (xhr.status < 400) {
                            msg = 'AJAX Redirection ' + msg;
                        } else if (xhr.status < 500) {
                            msg = 'AJAX Client Error' + msg;
                        } else {
                            msg = 'AJAX Server Error' + msg;
                        }
                        console.log(msg);
                    } else {
                        console.log(errorThrown);
                    }
                }
            });
            e.preventDefault();
        });
    });
    
    
    Проблема в том, что это все не выводит ничего на страничку.
    В консоль пишется ошибка 
    
    
      AJAX Success  (200) : parsererror
    
    
    А в переданных от функции данных я вижу строчку 
    
    
      {"S":"","P":"","it_test":"19"}0
    
    
    Так вот, я подозреваю, что вся проблема именно вот в этом 0 в конце json строки.
    Но вот откуда он там берется - не понимаю вообще. Может кто знаком с механизмом?
        
    


    Ответы

    Ответ 1



    Чтобы не получать нуля в конце ajax-ответа, в самом конце функции ajax_calc() вызывайте wp_die()

    Реализация приложения с обновляемыми формами

    #c_sharp #winforms

                        
    Стоит задача изменения используемых в приложении форм во время его работы. копал
    в сторону выгрузки динамических библиотек (чтобы они содержали формы). Т.е. загрузил
    в AppDomain библиотеку, получил нужный 
    
    контрол (допустим, что обновлять нужно не только формы) разместил его где нужно,
    отобразил с его помощью нужные данные.
    
    Получив сигнал о необходимости обновить контрол - свернули всё это хозяйство, выгрузили
    домен, получили новую версию DLL, создали новый домен - и поехали заново.
    
    Проблемы, возникшие по ходу реализации:
    
    
    Вся инфа по работе между доменами ведет к интерфейсам и неким абстрактным классам
    - а мне нужен хотя бы System.Forms.Control.
    При обмене данными между доменами приложений используется маршаллинг. Используемые
    контролы имеют всего лишь несколько внешних свойств, которые позволяют их настроить
    и для получения данных они используют 
    
    
    OracleConnection, который не может быть передан между доменами (он не маршаллится). 
    
    т.е. выходит, что подход изначально не верный - загрузка библиотеки в другой домен,
    создание контрола отображения для данных из oracle-сессии из первого домена.
    
    Как можно реализовать набор таких обновлямых контролов, причем не прерывая соединения
    с бд, т.е. не выгружая ехе, если это реально?
    
    UPDATE
    попробовал передать между доменами
    
    общая библиотека OracleCall.dll
        //интерфейс для класса, через который передаю оригинальный оракловый коннекшн
        public interface IConnectInitializer
        {
            void CreateConnectionClone(Oracle.DataAccess.Client.OracleConnection conn);
        }
    
    вторая библиотека libForNewClasses.dll, содержащая ссылку на общую 
    в этой библиотеке реализуется статический хранитель оралового соединения:
    
    public class oracleConnInitializer : MarshalByRefObject, IConnectInitializer
    {
        public static Oracle.DataAccess.Client.OracleConnection conn;
    
        public void CreateConnectionClone(Oracle.DataAccess.Client.OracleConnection connection)
        {
            conn = (Oracle.DataAccess.Client.OracleConnection)connection.Clone();
            conn.Open();
        }
    }
    
    
    и контрол:
    
    public class newControl : UserControl
    {
        private void newControl_Load(object sender, EventArgs e)
        {
            OracleCall.OraCallProc.getData(oracleConnInitializer.conn);
        }
    }
    
    
    третий модуль, ехе-шник, содержит ссылку на первый, общий, чтобы работать с передачей
    OracleConnection
    в нем находится форма, на которую и нужно положить контрол из второй библиотеки.
    
    public partial class Form1 : Form
    {
    
    // образец соединения
        static Oracle.DataAccess.Client.OracleConnection conn = new Oracle.DataAccess.Client.OracleConnection(connString);
    
    // домен, куда будем грузить третью библиотеку с дополнительным контролом
        AppDomain dmn;
    
    
        public Form1()
        {
            InitializeComponent();
            init();
        }
        void init()
        {
            // создаем домен
            dmn = AppDomain.CreateDomain("newDomain");
    
            // загружаем библиотеку с контролом
            Assembly asm = dmn.Load("libForNewClasses");
    
            // создаем передатчик коннекшена
            IConnectInitializer connInit =
                (IConnectInitializer)
                dmn.CreateInstanceAndUnwrap("libForNewClasses", "libForNewClasses.oracleConnInitializer");
    
            // передаем коннекшн
            connInit.CreateConnectionClone(conn);
    
            // создаем контрол
            Control ctrl =
                (Control)
                dmn.CreateInstanceAndUnwrap("libForNewClasses", "libForNewClasses.newControl");
    
            this.Controls.Add(ctrl);// пытаемся добавить - БАБАХ! ОШИБКА!!!!
        }
    }
    
    
    ОШИБКА: Remoting cannot find field 'parent' on type 'System.Windows.Forms.Control'.
    
    Что я делаю не так?
    
    UPDATE 2
    переделал общую библиотеку. дабы придать ей общий вид обзовем ее common.dll
    теперь она содержит образец контрола:
        public class myControls : UserControl
        {
            private Button button1;
    
        private void InitializeComponent()
        {
            // ...
        }
        public IntPtr _handle { get; set; }
        public void SetParentHandle(IntPtr handle) { _handle = handle; }
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams createParams = base.CreateParams;
                createParams.Parent = _handle; // Сюда надо передать Handle формы
                return createParams;
            }
        }
        protected Oracle.DataAccess.Client.OracleConnection Connection;
        public void InitConnection(Oracle.DataAccess.Client.OracleConnection conn) {
    Connection = conn; }
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            InitializeComponent(); // почему-то без этого не видно
        }
    }
    
    
    дочерний контрол также изменил свой код:
    
    public class newControl : myControls
    {
        private Label label1;
    
        private void InitializeComponent()
        {
            // ...
        }
    
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            InitializeComponent(); // почему-то без этого не видно
            OraCallProc.getData(Connection); // БАБАХ! падаем с ошибкой!     
        }        
    }
    
    
    ушел от статического хранения соединения, теперь на главной форме:
    
    public partial class Form1 : Form
    {
        // образец соединения
        static Oracle.DataAccess.Client.OracleConnection conn = new Oracle.DataAccess.Client.OracleConnection(connString);
        // домен, куда будем грузить третью библиотеку с дополнительным контролом
        AppDomain dmn;
        public Form1()
        {
            InitializeComponent();
            init();
        }
        void init()
        {
            // открываем
            conn.Open();
            // создаем
            dmn = AppDomain.CreateDomain("newDomain");
            // грузим сборку в новый домен
            Assembly asm = dmn.Load("libForNewClasses");
            // создаем контрол
            myControls ctrl =
                (myControls)
                dmn.CreateInstanceAndUnwrap("libForNewClasses", "libForNewClasses.newControl");
            // отправляем контролу соединение
            ctrl.InitConnection(conn);
            // устанавливанем хэндл формы
            ctrl.SetParentHandle(this.Handle);
            ctrl.Visible = true;
            ctrl.CreateControl(); // БАБАХ! падаем с ошибкой! (это та, что на OnLoad)
        }
    }
    
    
    вопросы:
    
    1) ошибка: Remoting cannot find field 'm_collRef' on type 'Oracle.DataAccess.Client.OracleParameter'.
    
    2) даже если не подключаться к базе, newControl теряет весь свой вид. Почему приходится
    самому переинициализировать в OnLoad? Не красиво ведь в каждом наследнике переопределять
    
    3) т.е. для каждого типа нового контрола нужно создать наследника (будь то TextEdit,
    ListView и подобных), даже если нет необходимости подключаться к БД, мне нужен метод
    SetParentHandle? Как-то это негибко и громоздко получается
        
    


    Ответы

    Ответ 1



    Внимание, ответ по ''Remoting cannot find field 'm_collRef' on type'' Ошибка была не в передаче соединения. С ним работа была налажена. Она крылась в процедуре OraCallProc.getData(Connection); это был статический метод, который выглядел примерно так: public static DataTable getData(OracleConnection conn) { using (OracleCommand cmd = conn.CreateCommand()) { cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.CommandText = "TESTSHEME.TESTPROC.GETDATAFUNCTION"; OracleParameter outvalue = new OracleParameter(); // неправильно! объект создается не в том домене!!! outvalue.OracleDbType = OracleDbType.RefCursor; outvalue.Direction = ParameterDirection.ReturnValue; outvalue.ParameterName = "OUTP"; cmd.Parameters.Add(outvalue); // при попытке добавить объект из одного домена к списку параметров команды из другого возникает ошибка с m_colRef // вообще и здесь не верно. OracleDataAdapter также создается в другом домене OracleDataAdapter da = new OracleDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); // здесь адаптер пытается обратиться к соединению из другого домена, пытается изменить m_state, и тоже падаем return dt; } } решить проблему получилось таким образом: public static DataTable getData(OracleConnection conn) { using (OracleCommand cmd = conn.CreateCommand()) { cmd.CommandText = "TESTSHEME.TESTPROC.GETDATAFUNCTION"; cmd.CommandType = System.Data.CommandType.StoredProcedure; OracleParameter outvalue = cmd.CreateParameter(); //создается в том же потоке, что и cmd outvalue.OracleDbType = OracleDbType.RefCursor; outvalue.Direction = ParameterDirection.ReturnValue; outvalue.ParameterName = "OUTP"; cmd.Parameters.Add(outvalue); // поэтому здесь нет ошибки междоменного доступа к внутренним полям // OracleDataAdapter не нашел как создать в том же домене, зато есть ExecuteReader DataTable dt = new DataTable(OracleDataAdapter.DefaultSourceTableName); using (OracleDataReader r = cmd.ExecuteReader()) { for (int i = 0; i < r.FieldCount; i++) dt.Columns.Add(r.GetName(i), r.GetFieldType(i)); object[] rowValues = new object[r.FieldCount]; while (r.Read()) { // не нашел метода получения значений всей строки, получаю поштучно for (int i = 0; i < r.FieldCount; i++) // мне нужны "чистые" значения, поэтому DBNull -> null rowValues[i] = object.Equals(r.GetValue(i), DBNull.Value) ? null : r.GetValue(i); dt.Rows.Add(rowValues); } } return dt; } } Так что междоменное взаимодействие с OracleConnection вполне реально, надо быть просто внимательнее. Всем спасибо за помощь

    Ответ 2



    Попробуйте в дочернем контроле перегрузить свойство CreateParams, куда записать дескриптор родительского контрола: protected override CreateParams CreateParams { get { CreateParams createParams = base.CreateParams; createParams.Parent = ...; // Сюда надо передать Handle формы return createParams; } } При этом добавлять такой контрол в коллекцию Controls не нужно. Вместо этого надо передать ему свой Handle, установить Visible = true и вызвать метод CreateControl().

    Выборка из БД если поле принимает одно из перечисленных значений

    #sql

                        
    Столкнулся с проблемой - в таблице есть, к примеру, поле color, в которое может быть
    записано число от 1 до 12, и есть поле sect - в него записывается произвольный численный
    id. Хочу сформировать запрос по типу:
    
     $tmp = mysql_query("SELECT * FROM gone WHERE color = '1' OR color = '2' OR color
    = '4' AND sect = '5'");  
    
    
    при том, чтобы выборка производилась, если sect = 5, а color равен либо 1 либо 2
    либо 4. Можно ли такое?
        
    


    Ответы

    Ответ 1



    У вас не совсем верный запрос. У вас будет условие в виде "color=1 или color=2 или (color=4 и одновременно sect=5)", т.е. sect будет действовать только на color=4. Для того, чтобы распространилось на все, надо взять в скобки. Верный запрос будет как: SELECT * FROM gone WHERE (color = 1 or color = 2 or color = 4) and sect = `5`

    Работа рекурсивной функции, суть на машинном уровне

    #cpp #c

                        
    void preOrderTravers(Node* root) {
    if (root) {
        printf("%d ", root->data);
        preOrderTravers(root->left);
        preOrderTravers(root->right);
        }
    }
    
    
    Как работает рекурсия?
    Вот допустим, что в обходе бинарного дерева мы вышли на левый нижний узел. Я так
    понимаю, формируются стек вызова рекурсивной функции, и, дойдя до тупика, машина переходит
    на предыдущий шаг и выполняет preOrderTravers(root->right). Так, да? Просто я где то
    что то читал но не могу сейчас найти. 
        
    


    Ответы

    Ответ 1



    Каждый вызов функции преобразуется в команду типа call xxx. В результате выполнения этой команды в стек заносится адрес возврата. Пока не достигнуто дно рекурсии функция не завершается, а вызывает сама себя. Когда достигается дно рекурсии функция завершается. При этом выполняется команда типа ret, которая выполняет переход по сохранённому в стеке адресу - происходит возврат на один уровень вверх. Таким образом, в случае дерева, функция вызывает себя до достижения листа, что является признаком дна рекурсии. После этого происходит возврат из вызванных функций.

    Выбор нескольких дат на Календаре

    #java #android #material_design

                        
    Я использую  библиотеку MaterialDateTimePicker
    , и у меня два TextView (Откуда - Куда)... Так вот при нажатии на "Откуда", должен
    открыться диалоговое окно с календарем и там выбираю одну дату. Потом при открытии
    "Куда", предыдущая выбранная дата должна отображаться, то есть две даты выбираются.
    У меня пока для каждого textView по диалогу... Просто мне кажется это неправильный подход.
    
    Так вот хотел спросить, как использовать для обоих TextView один Диалог и при этом
    получать два результата? Где именно копать?
        
    


    Ответы

    Ответ 1



    Создайте локальную boolean переменную, назовите её, скажем, isFrom = false. При клике на кнопку/вьюшку, которая вызывается диалог для "откуда" присваивайте Вашей булевой переменной значение true. Для диалога "Куда", соответственно false устанавливайте обратно. По идее Dialog у Вас открывается примерно таким способом: private void showDatePickerDialog() { Calendar now = Calendar.getInstance(); DatePickerDialog dpd = DatePickerDialog.newInstance( CreateEventActivity.this, now.get(Calendar.YEAR), now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH) ); dpd.show(getFragmentManager(), "Datepickerdialog"); } Далее перекрываем onDateSet, в котором и будем смотреть в какое текстовое поле вставить значение @Override public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) { String month = String.valueOf(monthOfYear + 1); String day = String.valueOf(dayOfMonth); if (isFrom) fromTextView.setText(day + "." + (month) + "." + year); else whereTextView.setText(day + "." + (month) + "." + year); showTimePickerDialog(); }

    Обновить widget при изменения данных сайта http/https

    #android #android_sdk #android_studio

                        
    Я сделала виджет) который показывает статистику и новости, с сайта. Всё работает
    отлично. Я хочу чтоб он обновлялся, когда данные страницы меняются. Первая идея была
    делать запрос, и если данные изменились, то выводить уже к примеру уведомление."новые
    новости". Но начала читать и пишут, что это антипаттерн, так делать нельзя, тк батарея
    садится. А как тогда сделать? Есть ли возможность обновить виджет сразу, после такого
    как изменились определенные данные на страничке?
        
    


    Ответы

    Ответ 1



    Есть мысль использовать Push-уведомления и обновлять данные, когда придет пуш на устройство. Идея такая: веб-мастер правит страницу - посылается пуш на девайс - а далее несколько вариантов: либо особый запрос слать на сервер, либо какие-то данные получать из пуша. Но максимальный размер пуша - 4КБ. Ну и способ влоб вы уже частично описали: запрос в AlarManager, который например раз в час будет долбить сервер и обновлять виджет.

    Прокрутка скроллом на высоту блоков

    #javascript #jquery #scroll #веб_дизайн

                        
    Как сделать чтобы при скролле прокрутка страницы происходила ровно на высоту блоков,
    которые в ней находятся (код внутри)?
    
    Не хочу использовать библиотеки, потому что, наверняка, нужно дописать 2-5 строк
    кода, чтобы решить вопрос с прокруткой страницы при скролле на высоту блока (на заданное
    количество пикселей).
    
    И второй вопрос, как сделать эту прокрутку плавной, чтобы не было ощущения, что просто
    переключили блок с одного на другой.
    
    
    function slide() {
      h = document.documentElement.clientHeight
      $(".one, .two, .three").css('height', h);
    };
    
    $(window).resize(slide);
    $(document).ready(slide);
    .one,
    .two,
    .two {
      display: block;
      position: relative;
      width: 100%;
    }
    .one {
      background: #CD5;
    }
    .two {
      background: aquamarine;
    }
    .three {
      background: #2196F3;
    }
    
    


    Ответы

    Ответ 1



    Эврика! function slide() { h = document.documentElement.clientHeight $(".one, .two, .three").css('height', h); }; $(window).resize(slide); $(document).ready(slide); $(document).bind('mousewheel DOMMouseScroll', function(event) { scroll(event); }); var num = 1; var scrolling = false; function scroll(event) { event.preventDefault(); if (!scrolling) { scrolling = true; if (event.originalEvent.wheelDelta > 0 || event.originalEvent.detail < 0) { num--; num = num < 1 ? 1 : num; } else { num++; num = num > 3 ? 3 : num; } $('html, body').animate({ scrollTop: $(".num" + num).offset().top }, 500, "linear", function() { scrolling = false; }); } } .one, .two, .two { display: block; position: relative; width: 100%; } .one { background: #CD5; } .two { background: aquamarine; } .three { background: #2196F3; }


    Как рисовать в android

    #java #android

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


    Ответы

    Ответ 1



    Используйте для этих целей Canvas: http://developer.android.com/intl/ru/reference/android/graphics/Canvas.html http://developer.android.com/intl/ru/training/custom-views/custom-drawing.html Пример круга: canvas.drawCircle(mPointerX, mPointerY, mPointerSize, mTextPaint);

    Использование .ToList() с XDocument

    #c_sharp #net #xml #linq #разметка

                        
    Есть вот такое выражение:
    
    var ext =
                    xDoc.XPathSelectElements("*//nodes")
                        .DescendantNodes().ToList();
    
    
    И по нему есть несколько вопросов:
    
    1) На выходе я получаю List. Могу я его на ходу преобразовать в List
    ? Пробовал различные вариации преобразований, но получаю ругань компилятора.
    
    2)Можно ли получить не просто коллекцию List, а ,допустим, List,
    где string- это какой-нибудь из атрибутов XElement ?
        
    


    Ответы

    Ответ 1



    XElement - это наследник XNode, поэтому список узлов в список элементов можно преобразовать операцией .OfType: var ext = xDoc.XPathSelectElements("*//nodes").DescendantNodes().OfType().ToList(); Но в вашем случае проще с самого начала выбрать Descendants() вместо DescendantNodes(): var ext = xDoc.XPathSelectElements("*//nodes").Descendants().ToList(); А еще проще можно сделать вот так: var ext = xDoc.XPathSelectElements("*//nodes//*").ToList(); Или вот так: var ext = xDoc.Root.Descendants("nodes").Descendants().ToList(); По второму вопросу - такой коллекции как List, не существует. Поэтому не вполне понятно что вы пытаетесь получить. Возможно, вам нужен словарь: var ext = xDoc.Root.Descendants("nodes").Descendants().ToDictionary(x => (string)x.Attribute("name")); Или Lookup: var ext = xDoc.Root.Descendants("nodes").Descendants().ToLookup(x => (string)x.Attribute("name"));

    Какую методику применить для анализа изменяемого текста (на Python)?

    #python #анализатор

                        
    Задача функции - сравнить входной текст с уже имеющимся и, если он изменился, сигнализировать
    об этом. Такая задача возникла при написании бота, который оповещает о новости на определенной
    странице сайта. Дело в том, что текст на (чужом) сайте обновляется ручным способом,
    и поэтому часто бывает, что текст обновился, но автор решил исправить пару слов, ошибки
    в написании и проч. Раньше я тупо сравнивал 2 текста, одинаковы ли они или нет, но
    теперь хочу сделать более-менее цивилизованно, чтобы триггер не срабатывал, если в
    новом тексте просто добавилась какая-нибудь запятая. Пока что я делаю это таким способом:
    
    def findMessageOverlap(new_message, old_message):
        overlap_count = 0
        for word in new_message.strip(' '):
            if word in old_message:
                overlap_count += 1
        overlap_percentage = (100 * overlap_count) / len(old_message.strip(' '))
        # if overlap percentage is less than 50%, there is new message on the site
        if overlap_percentage < 50:
            return overlap_percentage
    
    
    Я обращаю разницу во встречающихся словах нового текста в проценты, и если текст
    отличается больше чем на 50% от старого, то сигнализирую об этом. Как вы, опытные разработчики,
    решили бы такую задачу? Потому что я лишь начинающий.
        
    


    Ответы

    Ответ 1



    Интересная задача) По ней достаточно много обсуждений в теории алгоритмов. Как примеры решений: Алгоритм Шинглов Самый распространненный подход под Вашу задачу ( его как раз используют для выявления плагиатов ). реализации python реализация python part2 Расстояние Левенштейна Это минимальное количество операций для перехода из одной строки в другую. реализация python библиотеки в помощь: difflib в частности посмотрите в сторону SequenceMatcher. Этот класс поможет избавиться от заранее заданных "шумов" ( запятые, табуляции, ненужные части речи ) python-Levenshtein библиотека реализации алгоритма поиска Расстояния Левенштейна PS: прошу прощения за то, что не привел четкого решения под Вашу задачу. Но она достаточно обстрактна что бы просто вставить кусок кода, который Вас выручит. Но в указанных мною ссылках, Вы вполне найдете составные блоки для ее решения.