Страницы

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

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

Как перевести текст из одной раскладки в другую (“Home” --> “Рщьу”)

#c_sharp #net


Есть слово на английском Home его нужно перевести в слово Рщьу.

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

Есть ли готовые инструменты для нескольких раскладок?

Например для следующих переводов:

EN > RU

RU > EN

ES > EN

EN > ES

JA > EN

ZH > EN

AR > EN
    


Ответы

Ответ 1



Можно попробовать сделать так: [DllImport("user32.dll")] public static extern int ToUnicode(uint virtualKeyCode, uint scanCode, byte[] keyboardState, [Out, MarshalAs(UnmanagedType.LPWStr, SizeConst = 64)] StringBuilder receivingBuffer, int bufferSize, uint flags); static char GetChar(char key) { bool isUpper = char.IsUpper(key); var buf = new StringBuilder(256); var keyboardState = new byte[256]; ToUnicode((uint)char.ToUpper(key), 0, keyboardState, buf, 256, 0); return isUpper ? char.ToUpper(buf[0]) : buf[0]; } static void Main(string[] args) { var str = "Home"; for (int i = 0; i < str.Length; i++) { Console.Write(GetChar(str[i])); } } Для русского языка выведет: Рщьу

Ответ 2



Пример (но может я не понял сути вопроса): using System.Globalization; //пространство имен для использования языков InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(new CultureInfo("ru-RU")); Eng "en-US"

Средства и методы нахождения ошибок в коде их исправления. Сборник

#отладка #любой_язык #обработка_ошибок #faq


Этот вопрос, по аналогии с вопросом Книги и другие материалы для обучения, предназначен
для того, чтобы в единственном общем ответе собрать ссылки на вопросы-ответы по методам
поиска, нахождения и исправления ошибок в коде. 

В вопросы, перечисленные ниже в списке МОЖНО и нужно добавлять еще ответы!

Метки пишем в алфавитном порядке. 



Люди смогут использовать его для выявления схожих проблем в различных технологиях. 

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


"Что не так в коде?"
"Где у меня ошибка?"
"Почему программа не работает?"
и подобные

    


Ответы

Ответ 1



Общие практики и советы Какие есть способы предупреждения ошибок, их нахождения и устранения? Список по языкам c# Как и какими средствами находить ошибки в коде на C#? java Как и какими средствами находить ошибки в коде Java? javascript Как и какими средствами находить ошибки в Javascript коде? php Как и какими средствами находить ошибки в PHP коде? css Что делать, если не работает css-класс

Как сделать POST запрос загрузки аудио файла вконтакте (vk api)? C#

#c_sharp #vkontakte_api #post


Сначала делаю запрос для получения адреса сервера для загрузки

https://api.vk.com/method/docs.getUploadServer?access_token=ACCESS_TOKEN&type=audio_message&v=5.63


В ответ получаю

{
  "response":
             {
               "upload_url":"https://..."
             }
}


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

Допустимые форматы: MP3. 
Ограничения: файл объемом не более 200 МБ. 
Поле POST-запроса: file.

Передача файла:
Передайте файл на адрес upload_url, полученный в предыдущем пункте, 
сформировав POST-запрос с полем file. Это поле должно содержать mp3-файл в 
формате multipart/form-data. 


Возможно, я неправильно делаю запрос. Буду благодарен за пример кода на C# POST запроса
загрузки аудио файла. 
Мой вариант кода:

string filePath = @"D:\Soft\Visual Studio\Projects\VK audio messages\VK audio messages\VK
audio messages\l1.mp3";

byte[] audio = convert(filePath);
HttpClient httpClient = new HttpClient();
MultipartFormDataContent form = new MultipartFormDataContent();

form.Add(new ByteArrayContent(audio, 0, audio.Length), "file", "l1.mp3");
HttpResponseMessage response = await httpClient.PostAsync(uploadUrl, form);
response.EnsureSuccessStatusCode();
httpClient.Dispose();
string sd = response.Content.ReadAsStringAsync().Result;
MessageBox.Show(sd);
****


byte[] convert(string fullFilePath)
   {
       FileStream fs = File.OpenRead(fullFilePath);
       byte[] bytes = new byte[fs.Length];
       fs.Read(bytes, 0, Convert.ToInt32(fs.Length));
       fs.Close();
       return bytes;
   }

    


Ответы

Ответ 1



Каким образом вы пытаетесь сделать запрос? В документации VK написано: Передача содержимого файлов на полученный адрес в формате multipart/form-data. Соответственно, загружать ваш файл нужно подобающим образом. В С# я не силён, вот первый попавшийся вариант из гугла, взято отсюда: HttpClient httpClient = new HttpClient(); MultipartFormDataContent form = new MultipartFormDataContent(); form.Add(new ByteArrayContent(imagebytearraystring, 0, imagebytearraystring.Length), "profile_pic", "hello1.jpg"); HttpResponseMessage response = await httpClient.PostAsync("PostUrl", form); response.EnsureSuccessStatusCode(); httpClient.Dispose(); string sd = response.Content.ReadAsStringAsync().Result; Именем поля должно быть file, а url, куда загружаем - полученный ранее upload_url. Пробовали ли вы подобный способ? Поищите примеры загрузки файлов в multipart/form-data формате на C#.

Ответ 2



У меня получилось так (не тестил с аудио, сделал с doc) using (var formData = new MultipartFormDataContent()) { var uploadServerUrl = string.Format("https://api.vk.com/method/docs.getMessagesUploadServer?type=doc&peer_id={0}&access_token={1}", user_id, access_tokken).GetStringFromUrl(); string url = JsonObject.Parse(uploadServerUrl).Get("response").Get("upload_url"); var httpClient = new HttpClient(); MultipartFormDataContent form = new MultipartFormDataContent(); form.Add(new ByteArrayContent(System.IO.File.ReadAllBytes(PathToFile)), "file", "name.txt"); HttpResponseMessage response = await httpClient.PostAsync(url, form); response.EnsureSuccessStatusCode(); httpClient.Dispose(); string fileFromVKServer = response.Content.ReadAsStringAsync().Result; var saveFile = string.Format("https://api.vk.com/method/docs.save?file={0}&access_token={1}", JsonObject.Parse(fileFromVKServer).Get("file") , access_token).GetStringFromUrl(); }

Как увеличить зону клика ссылки?

#html #css


Использую ползунок (input type range).Дело в том, что по макету он в 1px и все идеально,
только вот кликнуть по нему очень сложно, надо попасть в этом самый 1px. Можете, пожалуйста,
посоветовать как увеличить его зону?
    


Ответы

Ответ 1



Без кода, могу предложить добавить невидимый before(подкрасила цветом, чтобы видно было область, вам этот цвет просто убрать нужно): .link { position: relative; display: block; margin:50px auto; height: 1px; width: 1px; background: pink; cursor: pointer; } .link:before { content: ''; position: absolute; display: block; top: -15px; left: -15px; right: -15px; bottom: -15px; background: rgba(255, 0, 0, 0.06);//цвет убрать }

Обработка множественных запросов на RxJava

#java #android #многопоточность #rxjava


Есть поле для вводе текста, допустим ищем пользователей по имени в БД.
Есть метод (упрощенный), который выполняется при каждом наборе символа.

    public void loadUsers(){
        getUsers(mName)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(users -> {
             //отображение данных
            }, throwable -> {
             //обработка ошибки
            });
}


Проблема данного метода в том, что при быстром наборе текста вполне вероятна ситуация,
когда ответ на предпоследний запрос пришел позже, чем на последний. Тогда отображаемые
данные будут не соответствовать введенному тексту.
Вопрос: как обработать запросы в том порядке, в котором выполнялись?
Или, может быть, можно игнорировать предыдущие запросы? 
P.S. С использованием RxJava.
    


Ответы

Ответ 1



Как вариант можно хранить Subscription и её сначала обнулять, а потом новый запрос слать. Типа как-то так (за названия методов не ручаюсь): Subscription s; public void loadUsers() { if(s != null && !s.isUnsubscribed()){ s.unsubscribe(); } s = getUsers(mName) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(users -> { //отображение данных }, throwable -> { //обработка ошибки }); }

Ответ 2



Для того чтобы легко обработать эту ситуацию можете использовать библиотеку RxBinding. Она переводит слушатели на Rx что даёт нам легко воспользоваться оператором debounce(). Почитать про оператор можно здесь. Должно получиться примерно так: public void loadUsers(){ RxTextView.afterTextChangeEvents(mNameEditText) .debounce(300, TimeUnit.MILLISECONDS) .map(TextViewAfterTextChangeEvent::editable) .map(Editable::toString) .flatMap(name -> getUsers(name)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(users -> { //отображение данных }, throwable -> { //обработка ошибки }); }

Посчитать количество элементов в jquery?

#javascript #html #jquery #css


Мне нужно считать количество блоков в блоке с классом .blocks и в зависимости от
их количества, создать столько же ссылок на эти элементы. Каждая ссылка будет скролить
к соответствующему элементу.

Подскажите пожалуйста, как можно это реализовать? Буду очень благодарен.



1
2
3


Ответы

Ответ 1



$('.blocks .section').each(function(index, element){ $(this).attr('data-block', index); $('.navigation').append('
  • Блок '+$(element).html()+'
  • ') }); $(document).on('click', '.navigation .scrollto', function(){ var block_id = $(this).attr('data-block'), block = $('[data-block="'+block_id+'"]:not(.scrollto)'); if (block.offset() !== undefined){ $('html, body').animate({ scrollTop: block.offset().top }, 1000, 'swing', function(){ // здесь код если надо что-то делать после прокрутки }); } return false; });
    1
    2
    3
    В данном случае не обязательно подсчитывать. Достаточно просто для каждого блока вставлять ссылку, т.е. $('.blocks .section').each(function(index, element){ $('.navigation').append('
  • Блок '+$(element).html()+'
  • ') });

    Ответ 2



    Если ссылки для скролла, наверное стоит все же делать это через id. Как добавить ссылки уже скинули (хотя не думаю, что секции действительно будут содержать цифры от чего пример нельзя назвать удачным), но на всякий случай скину ещё такой вариант. $(function() { scrollToSection(); }); function scrollToSection() { let $blocks = $('.blocks'), $sections = $blocks.find('.section'), $navigation = $('.navigation'); createAnchor(); function createAnchor() { for(let i = 1; i <= $sections.length; i++) { let id = `section_${i}`; $sections.eq(i).attr('id', id) $navigation.append(`
  • Блок ${i}
  • `); } } } .section { width: 100%; height: 400px; }
    1
    2
    3


    Обобщённый метод для чтения данных из файла

    #java #generics

    
    Здравствуйте.
    Подскажите, как написать обобщённый метод чтения данных из файла. Например, в одном
    случае нужно считать строки, в другом - целые числа.
    Как написать метод типа такого:
    
        public static  List readFromFile(Path pathIn, TypeValue typeValue){...};
    
    
    Корректен ли такой код:
    
    public static List readFromFile(Path pathIn, TypeValue typeValue){
            try(Scanner in = new Scanner(pathIn)) {
                if (typeValue == TypeValue.typeInt) {
                    List list = new ArrayList<>();
                    while (in.hasNextInt()) {
                        list.add(in.nextInt());
                    }
                    return list;
                } else {
                    List list = Files.readAllLines(pathIn);
                    return list;
                }
            } catch (IOException e){ 
                return null;
            }
        }
    
    
    Здесь pathIn - путь к файлу с данными, typeValue - флаг для обозначения данных (Integer,
    String и т.д.).
    Смущает, что возвращается не параметризованный List. Как вообще решается задача чтения
    из файла, если формат данных может быть разным - Integer, Double, String и т.д.? Или
    следует писать для каждого типа данных свой код для чтения? Как-то громоздко тогда
    получается.
        
    


    Ответы

    Ответ 1



    Функционал из Java 8 Stream & Lambda позволяет передавать в метод функциональный интерфейс, который будет применен к потоку данных: public void start() throws IOException { Path path = Paths.get("test"); List resultStringList = readFile(path, Function.identity()); List resultIntList = readFile(path, Integer::parseInt); } public List readFile(Path path, Function func) throws IOException { return Files.lines(path) .map(func) .collect(Collectors.toList()); } }

    Ответ 2



    Или следует писать для каждого типа данных свой код для чтения? Не самый плохой вариант: написать отдельные методы для каждого типа (в Scanner, например, так и сделали) . Как-то громоздко тогда получается. В Вашем варианте вместо нескольких коротких методов используется один, в котором в одном большом if будет код всех этих методов. Альтернатива Можно обернуть метод в интерфейс и применить полиморфизм: //интерфейс interface ListReader { List read(String path); } //все общие функции вынесем в отдельный базовый класс abstract class BaseListReader implements ListReader { @Override public List read(String path) { try (Scanner in = new Scanner(path)) { List list = new ArrayList<>(); while (hasNext(in)) { list.add(next(in)); } return list; } catch (IOException e) { return null; } } abstract boolean hasNext(Scanner in) throws IOException; abstract T next(Scanner in) throws IOException; } class IntListReader extends BaseListReader { @Override boolean hasNext(Scanner in) throws IOException { return in.hasNextInt(); } @Override Integer next(Scanner in) throws IOException { return in.nextInt(); } } class StringListReader extends BaseListReader { @Override boolean hasNext(Scanner in) throws IOException { return in.hasNext(); } @Override String next(Scanner in) throws IOException { return in.nextLine(); } } Затем создать фабрику: //Метод для создания public ListReader createReader(Class clazz) { if (clazz == Integer.class) { return new IntListReader(); } else if (clazz == String.class) { return new StringListReader(); } throw new IllegalArgumentException("clazz"); } В такой реализации обработка разных типов будет отделена друг от друга и от классов-клиентов (публичным может быть только интерфейс ListReader). Это позволит протеститровать их отдельно от других классов приложения/использовать класы повторно. Насколько это оправдано нужно решать по ситуации. Если код будет использован один раз, требования к нему изменяться не будут и нет строгих требований к качеству (покрытие тестами, ограничение сложности методов), то может быть достаточно просто разбить на отдельные методы. Смущает, что возвращается не параметризованный List Эта проблема не решена (возвращается не параметризованный ListReader). Решение зависит от того как используется результат метода. Если полученный список обрабатывается как List то метод можно оставить непараметризованным. Если в дальнейшем объекты из списка приводятся к типу, то стоить рассмотреть возможность параметризации фабрик и клиентского кода.

    не обновляется foreign key в дочерней таблице

    #java #android #sqlite

    
    Есть две таблицы, в главной таблице есть столбец name, который является ключем для
    дочерней таблицы.
    Когда я обновляю name, делаю это так:
    
    // перезаписываем данные обьекта
    public static void reloadObject(String oldName, String newName, String description,
    String date, Context context) {
        ContentValues cv = new ContentValues();
        ObjectDB objectDB = new ObjectDB(context);
        SQLiteDatabase db = objectDB.getWritableDatabase();
        cv.put(ObjectDB.objColumn.NAME, newName);
        cv.put(ObjectDB.objColumn.DESCRIPTION, description);
        cv.put(ObjectDB.objColumn.START_DATE, date);
        db.update(ObjectDB.dbTab.OBJECT, cv, ObjectDB.objColumn.NAME + " = ?", new String[]{oldName});
        db.close();
    }
    
    
    в дочерней таблице этот столбец не обновляется, хотя в настройках таблицы указано:
    
    [object] TEXT REFERENCES geology_object([name]) ON DELETE RESTRICT ON UPDATE CASCADE, 
    
    
    Если обновить значение name в программе SQLite Expert Personal то все корректно обновляется.
    Использую готовую базу данных и вставляю ее в проект с помощью Android SQLiteAssetHelper
        
    


    Ответы

    Ответ 1



    Нашел ответ на свой вопрос, может кому-то пригодится. Нужно было вставить эту строчку: db.setForeignKeyConstraintsEnabled(true); перед db.update(ObjectDB.dbTab.OBJECT, cv, ObjectDB.objColumn.NAME + " = ?", new String[]{oldName}); и все заработало.

    Ответ 2



    Я применяю немного другой способ. Перегружаю метод SQLiteOpenHelper.onOpen() @Override public void onOpen(SQLiteDatabase database) { super.onOpen(database); database.execSQL("PRAGMA foreign_keys=ON;"); } тоже работает, причем метод более универсальный, поскольку setForeignKeyConstraintsEnabled() работает только с API 16

    Как работают индексированные представления?

    #sql #sql_server

    
    После добавления индекса они "материализуются" ?
    
    Если да, то каким образом происходит обновление представления? Например, запрос начал
    возвращать дополнительные строки. Они пересоздаются по какому-то расписанию?
    
    Имеет ли разницу использовать индексированые представления на часто меняющихся данных
    или данных, которые редко изменяются?
        
    


    Ответы

    Ответ 1



    После добавления индекса они "материализуются" ? Именно так. Добавление уникального кластерного индекса материализует данные, возвращаемые представлением, в этот самый кластерный индекс (т.е., по существу, в отдельную таблицу). Если да, то каким образом происходит обновление представления? Например, запрос начал возвращать дополнительные строки. Они пересоздаются по какому-то расписанию? Обновление материализованного представления происходит синхронно с изменением данных в таблицах, на которых оно основано, и инкрементально (индексы представлений не перестраиваются полностью каждый раз при изменении данных, а дополняются или модифицируются). Представьте, что имеется обычная таблица с дополнительным индексом. Если добавить строк в таблицу, то индекс обновится в соответствии с данными таблицы. Механизм обновления данных материализованного представления аналогичен механизму обновления данных в индексе из данных таблицы. Поэтому Имеет ли разницу использовать индексированные представления на часто меняющихся данных или данных, которые редко изменяются? да, использование индексированных представлений на часто меняющихся данных, как правило, менее желательно, чем на редко меняющихся, т.к. наличие индексированного представления будет замедлять изменение этих данных. Достаточно большое число специальных требований и ограничений, которым должно удовлетворять представление, чтобы его можно было материализовать (привязка к схеме, требования детерминированности, невозможность использования неаддитивных агрегирующих функций), связано именно с реализацией материализованных представлений в виде индекса и инкрементальностью обновления данных в них.

    VS 2017. Повторный build проекта

    #c_sharp #visual_studio

    
    После полного build solution, повторный build один проект пересобирает. Из за чего
    такое может быть?
        
    


    Ответы

    Ответ 1



    По умолчанию Visual Studio собирает только те проеткты, в которых были изменения во входных файлах. Т.е. если вы нажмете Build два раза подряд, то в первый раз вы получите сообщение вида ========== Build: 3 succeeded, 0 failed, 0 up-to-date, 0 skipped ========== Во второй раз вы скорее всего получите сообщение вида: ========== Build: 0 succeeded, 0 failed, 3 up-to-date, 0 skipped ========== В некоторых случаях проект может перебилдовываться даже если во входных файлах не было изменений: Некоторые типы проектов просто не поддерживают up to date check. Например, SQL Server Database project будет собираться при каждой сборке решения. Кроме того, студия всегда считает не up-to-date те проекты, в которых есть файлы с Copy to Output Directory' выставленном в 'Copy always'. Выяснить точную причину, по которой конкретный проект попадает под билд можно выставив Tools → Options → Projects and Solutions → MSBuild project build output verbosity в Diagnostics. На этом уровне детализации студия выведет причину билда в окно Output, примерно в таком виде: 1>Project 'ConsoleApp37' is not up to date. Project item 'C:\...\TextFile1.txt' has 'Copy to Output Directory' attribute set to 'Copy always'.

    Ответ 2



    Потому что в файле проекта была строчка Always

    Практическая разница между Linq To Entites и Linq To Objects

    #c_sharp #entity_framework #linq

    
    Изучая различия между LINQ To Entites и LINQ To Objects  в EntityFramework - столкнулся
    с интересной вещью : 
    
    var phones = db.Phones.Where(p=> p.CompanyId == 1).ToList().Where(p=> p.Id<10);
    
    
    Здесь используются два метода Where, но их реализация будет различной. В первом случае,
    db.Phones.Where(p=> p.CompanyId == 1) транслируется в выражение SQL, которое было рассмотрено
    выше. Далее метод ToList() по результатам запроса создает список в памяти компьютера.
    После этого мы уже имеем дело со списком в памяти, а не с базой данных. И далее вызов
    Where(p=> p.Id<10) будет обращаться к списку в памяти и будет представлять Linq to Object.
    
    И мне стало интересно : А не проще ли просто получать нужное значение из БД путем
    простого обращения через LINQ не используя при этом LINQ To Objects?
    
    Ведь запрос в даном случае будет выглядеть так :
    
    var phones = db.Phones
    .Where(p => p.CompanyId==1 &&
                p.TelephoneId<10)
    
    
    Хотелось бы узнать какой подход в данном случае будем эффективней и почему? 
        
    


    Ответы

    Ответ 1



    Смотрите. Базы данных предназначены, кроме всего прочего, и для того, чтобы быстро и эффективно работать с большими объёмами данных. Например, базы данных легко справляются с выборкой из таблиц, больших по размеру, чем оперативная память. А вот получение целой такой таблицы в память с целью последующей фильтрации уже провалится по перерасходу памяти. Также и фильтрация в базе данных может быть очень быстрой, т. к. если у неё есть индекс на фильтруемое поле, она может совместить фильтрацию с выборкой. (А особо умные базы данных могут, исходя из запросов, такой индекс и выстроить сами.) Если индекса нет, то всё равно польза от фильтрации на стороне базы в том, что выброшенные фильтром данные не нужно перегонять из базы в программу, и не нужно создавать их в основной программе только для того, чтобы тут же выбросить. Поэтому обычно имеет смысл те части запроса, которые можно выполнить в базе данных (это та часть, при которой вы остаётесь в рамках IQueryable), выполнять на ней. (Я не уверен, относится ли эта рекомендация к вложенным подзапросам, пускай лучше специалисты по базам данных поправят меня.) К сожалению, скорость операций на базе данных имеет и обратную сторону: не все операции можно выполнить на базе данных, поэтому промежуточные результаты запроса приходится материализовать (то есть, получать из базы и загружать в память), используя ToList или AsEnumerable, и «дорабатывать напильником» в самой программе. «Умения» различных баз данных отличаются между собой. Обычно база данных должна уметь фильтровать не только по равенству поля значению, но и уметь сравнивать с константой. Судя по всему, либо вам попался код для менее продвинутой базы данных (да, абстракции протекают), либо автор кода ошибся. Либо это «костыль» под какой-нибудь баг. Если сравнение возможно выполнить на базе данных, его стоит именно там и выполнять.

    Ответ 2



    В общем случае, вы конечно правы, проще получить одним запросом к БД, чем фильтровать потом в оперативной памяти. Но тут есть несколько нюансов. Во-первых мы должны учитывать, что в базе данных таблица несколько более сложна чем мы можем видеть в нашем коде, с ней связаны еще такие сущности как и индексы, триггеры и тд... Поэтому добавление какого либо дополнительного условия, может порождать "плохой" план запроса с полным перебором довольно больших объемов данных (например если Id входит только в составной индекс, да, для поля с таким названием это было бы странно, но... ). В таком случае, иногда, проще выбрать только небольшую часть данных, материализовать их (ToList()), и отфильтровать их уже в памяти, вместо проведения рефакторинга всей БД. Во-вторых Phones может быть не таблицей, а представлением, и планы запросов станут в таком случае еще сложнее.

    Как отключить сворачивание кода в Android studio?

    #android_studio

    
    Не могу отключить сворачивание кода в студии. Нашел только хот-кей. Но каждый раз
    нажимать надоедает. Отключение "closures" не помогает.
        
    


    Ответы

    Ответ 1



    File -> Settings.. -> Editor -> General -> Code Folding Галочки в секции Collapse by Default указывают, какие части кода сворачивать по умолчанию.

    Развертывание на весь экран блока

    #javascript #html #jquery #css #css3

    
    Приветствую. 
    
    На сайте https://webgradients.com/ если кликнуть по любому из градиентов - он развернется
    на весь экран с анимацией. Как сделать подобный эффект для блока?
    
    Заметил, что при клике в body добавляется класс state-fixed к уже существующему state-show,
    но разобраться с js-кодом, когда он еще и сжат, мне сложно. Помогите пожалуйста. 
        
    


    Ответы

    Ответ 1



    Я бы сделал так: var ripple = $('.ripple'), // "капля" rippleSize = screenProp(), // размер капли posLeft = 0, posTop = 0; ripple.outerWidth(rippleSize * 2).outerHeight(rippleSize * 2); // задаем капле размер в 2 раза больше размера экрана, чтобы "покрыть" всю видимую область страницы $('.gradient').click(function(e) { // клик на градиент $('body').addClass('fixed'); // блокируем прокрутку экрана posLeft = e.pageX - rippleSize - $(window).scrollLeft(); // положение капли слева posTop = e.pageY - rippleSize - $(window).scrollTop(); // положение капли сверху var gradient = $(this).attr('data-gradient-css'); // получаем код градиента ripple.addClass('ripple--active').css({ // добавляем класс для увеличения и прописываем стили 'left': posLeft + 'px', 'top': posTop + 'px', 'background-image': gradient }); setTimeout(function() { // после увеличения ripple.addClass('ripple--complete'); // добавляем класс, который выровнит каплю точно по краям экрана }, 500); // время анимации увеличения }); ripple.on('click', function() { // при клике на каплю if (ripple.hasClass('ripple--complete')) { // если анимация закончилась $('body').removeClass('fixed'); // возвращаем странице прокрутку ripple.removeClass('ripple--complete ripple--active'); // удаляем классы } }); $(window).on('resize', function() { // при ресайзе окна rippleSize = screenProp(); // пересчитываем размер капли ripple.outerWidth(rippleSize * 2).outerHeight(rippleSize * 2); // и задаем ей полученные значения }); // функция для определения максимального значения из высоты и ширины экрана function screenProp() { if ($(window).width() > $(window).height()) { return $(window).width(); } else { return $(window).height(); } } html, body { padding: 0; margin: 0; } body { overflow-x: hidden; overflow-y: auto; } body.fixed { overflow: hidden; } * { box-sizing: border-box; } .container { display: flex; flex-wrap: wrap; } .block { width: 31%; margin: 0 1%; background: #fff; border-radius: 10px; padding: 20px; } .gradient { width: 100%; height: 0; padding-bottom: 100%; border-radius: 100%; background: #000; cursor: url(https://i.imgur.com/wz8iY4B.png) 16 16, pointer; } .ripple { width: 200%; height: 200%; position: fixed; z-index: 9999; transition: transform .5s linear; transform: scale(0); transform-origin: center; border-radius: 100%; cursor: url(https://i.imgur.com/NRHTafk.png) 16 16, crosshair; } .ripple--active { transform: scale(1); } .ripple--complete { left: 0!important; top: 0!important; width: 100%!important; height: 100%!important; border-radius: 0!important; }


    Ошибка подключение к БД в symfony

    #php #symfony2 #symfony #symfony3

    
    Вылил сайт на хостинг и появилась ошибка подключения к базе данных.
    
    
      You have requested a non-existent parameter "database_name". Did you mean one of
    these: database
    
    
    Локально всё работает нормально. В чём может быть ошибка?
        
    


    Ответы

    Ответ 1



    Скорее всего неправильно задан конфиг в parameters.yml либо в config.yml. в parameters.yml добавьте: parameters: database_host: YOUR_HOST database_port: 3306 database_name: DB_NAME database_user: DB_USER database_password: DB_PASS а в config.yml добавьте подключение к доктрине doctrine: dbal: default_connection: default connections: default: driver: pdo_mysql host: '%database_host%' port: '%database_port%' dbname: '%database_name%' user: '%database_user%' password: '%database_password%' charset: UTF8

    Что такое статический полиформизм?

    #java

    
    Наткнулся на такой термин - "статический полиформизм". Не знал про такое сочетание.
    В гугле особо ничего не нашел.
    
    Кто бы мог дать обьяснение термина + пример?
        
    


    Ответы

    Ответ 1



    Этим умным словосочетанием обозначают обычную перегрузку методов. Не ту, что имеет место в классах-наследниках, помечаемых словом override, а что-то наподобие: class Foo { public void some() { // какой-то код } public void some(int parameter) { // какой-то код } }

    Правильное выполнение запроса RxJava+Retrofit

    #android #rest #retrofit #rxjava

    
    Здравствуйте. Недавно начал разбираться с RxJava. Что-то тяжело пока дается...
    Есть сервер на котором есть приватные чаты(тет-а-тет) и групповые.
    Посредством Rest запроса на сервер нужно выудить следующую инфу оттуда:
    Все существующие чаты и диалоги:
    
    Observable> chats = apiService.getChats();
    Observable> dialogs = apiService.getDialogs();
    
    
    Объекты Chat и Dialog содержат переменные:
    
    int unreadMessagesCount (количество непрочитанных сообщений);
    int id (по этому id запрашивается список сообщений из чата)
    
    
    Запросы на список сообщений
    
    Observable> dialogMessages = apiService.getDialogMessages(String id);
    Observable> chatMessages = apiService.getChatMessages(String id);
    
    
    Как в этом случае более грамотно составить запросы используя RxJava, чтобы опросить
    все чаты и диалоги на предмет новых сообщений и затем получить эти сообщения в один список?
        
    


    Ответы

    Ответ 1



    Например как-то так: Получаем массив чатов. Преобразуем массив оных в очередь объектов Chat. Получаем детали каждого. Результат преобразовываем обратно в массив:. apiService.getChats() .from(Observable::from) .flatMap(chat -> apiService.getChatMessages(chat.id)) .toList() .subscribe(System::out); Если без лямбд, то from(Observable::from) можно переписать вот такой ужасной конструкцией: .flatMap(new Func1, Observable>() { @Override public Observable call(List chats) { return Observable.from(chats); } })

    Отправка header методом POST PHP (замена xhr.setRequestHeader) [закрыт]

    #php #javascript #http #post

    
            
                 
                    
                        
                            
                                Закрыт. Этот вопрос не по теме. Ответы на него в данный
    момент не принимаются.
                                
                            
                        
                    
                                
                                    
                    
                            
                                
                            
                        
                            
                                Хотите улучшить этот вопрос? Update the question so it's
    on-topic for Stack Overflow на русском.
                            
                            Закрыт 2 года назад.
                                                                                    
               
                    
            
    Можно ли как то перевести это в PHP, если да то подскажите пожалуйста как?
    
     function request(func, params, onSuccess) {
        var xhr = new XMLHttpRequest();
        xhr.open('POST', 'http://FF2:7000/$gate/request', true);
        xhr.setRequestHeader("pro-verba-esb-queue", "IM");
        xhr.setRequestHeader("x-function", encodeURI(func));
        xhr.onreadystatechange = function() {
          if (this.readyState != 4) return;
          if (this.status != 200) {
            alert( 'ошибка: ' + (this.status ? this.statusText : 'запрос не удался') );
            return;
          }
          onSuccess(this.responseText);
        }
        xhr.send(JSON.stringify(params));
      }
    
        
    


    Ответы

    Ответ 1



    Воспользуйтесь curl $url = 'http://FF2:7000/$gate/request'; $headers = array( 'pro-verba-esb-queue: IM', 'x-function: '+encodeURI(func) ); $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, count($params)); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); curl_close($ch); echo $result;

    Ответ 2



    Используй библиотеку Guzzle. Вот ссылка на нее http://guzzlephp.org. Приведу небольшой пример, а для большего пониманий прочитай документацию $client = new GuzzleHttp\Client(); $client->request('POST', 'http://FF2:7000/$gate/request', [ 'headers' => [ 'pro-verba-esb-queue' => 'IM', 'x-function' => "" ] ]);

    Запустить java файл с кастомной версией java

    #java #linux #jar

    
    Добрый день.
    У меня имеется некий сервер на Debian на котором я запускаю некие Java файлы. Для
    их запуска используется Java, которая уже установлена в систему.
    Собственно вопрос в том, а могу ли я скачать другую версию Java в какую-то папку
    и уже запускать мои файлы не с помощью системной версии Java, а с той, которую скачали
    отдельно? Если да - то какой командой. Спасибо
        
    


    Ответы

    Ответ 1



    Да, разумеется можете. Допустим, вы запускаете файл с помощью системной java так: java -jar myapp.jar тогда если скачав другую версию, например в директорию /home/user/downloads/jdk/ вы можете запускать свой файл так: /home/user/downloads/jdk/bin/java -jar myapp.jar

    Как разбить строку на слова, чтобы в словах остались только буквенные и цифровые символы?

    #java #регулярные_выражения #строки

    
    К примеру есть вот такая строка:
     String text = "The urn was then carried for several rounds around the cremation
    site, for the last leg of the procession."
    
    Мне надо разбить её на слова, удалив при этом все знаки препинания и спецсимволы,
    а слова поместить в список.
    
    ArrayList words = new ArrayList<>();
            String word = text.replaceAll(",", " "); - тут, насколько я понимаю, надо
    делать регулярное выражение ? Или можно без него удалить знаки препинания и спецсимволы ?
        
    


    Ответы

    Ответ 1



    Можно разбить строку с помощью регулярного выражения. String text = "The urn was then carried for several rounds around the cremation site, for the last leg of the procession."; String[] results = text.split("\\W+"); System.out.println(Arrays.toString(results)); // [The, urn, was, then, carried, for, several, rounds, around, the, cremation, site, for, the, last, leg, of, the, procession] Чтобы \\W+ "понимал" Юникод, добавьте (?U) перед регулярным выражением (чтобы не удалялись русские и другие буквы), "(?U)\\W+". Обратите внимание, что \\W+ не найдёт знака подчёркивания _ и если его надо найти, используйте "[\\W_]+". См. демо онлайн Можно найти все буквы Юникода (\p{L}) и ASCII-цифры ([0-9]) с помощью String text = "The urn was then carried for several rounds around the cremation site, for the last leg of the procession. И ещё..."; Pattern pattern = Pattern.compile("[\\p{L}0-9]+"); Matcher matcher = pattern.matcher(text); List result = new ArrayList<>(); while (matcher.find()){ result.add(matcher.group(0)); } System.out.println(result); // [The, urn, was, then, carried, for, several, rounds, around, the, cremation, site, for, the, last, leg, of, the, procession, И, ещё] Ещё одно Java-демо

    вопросы по поводу работы с жесткими дисками в linux

    #linux #многопоточность #hardware

    
    Здравствуйте, читаю "Системное программирование" Роберта Лава, он пишет про fsync(),
    O_SYNC, но не понятно о назначении этих функций...
    
    
    Где необходимы вызовы этих функций? Если б это было нужно всегда, то синхронизация
    бы была по дефолту установлена. 
    Цитата из книжки.
    
    
      Налицо огромное увеличение издержек, поэтому синхронизированный ввод-вывод следует
    использовать только при отсутствии альтернатив.
    
    Со сколькими параллельными операциями ввода / вывода может работать жесткий диск?
    Ну т.е. хочу я в 1000 нитях параллельно читать или писать в разные файлы на диске,
    будет ли толк, или начнет всё тормозить (имеется ввиду не из-за переключения контекста,
    а из-за каких-то причин с самим диском)?
    
        
    


    Ответы

    Ответ 1



    fsync и его подвиды требуются, когда приложение хочет получить гарантию, что данные уже записаны на физический диск, а не будут записаны на диск. Впрочем, начну лучше со второго вопроса: со сколькими параллельными операциями ввода/вывода может работать жесткий диск? С одной. Потому что внутри HDD только один блок головок чтения-записи. И из-за ограничений физических законов нашей вселенной этот блок может одновременно находиться только над одним местом магнитного диска. И следующее механическое ограничение - магнитные диски вращаются с постоянной скоростью, а читать-писать можно только в одном месте. Значит если мы хотим прочитать сектора в разных местах диска нам требуется: спозиционировать на эту дорожку блок головок чтения-записи дождаться, пока требуемый сектор не окажется под головкой Простым математическим подсчётом получаем механический предел в 120 операций в секунду для 7200 rpm дисков (с частотой вращения 7200 оборотов в минуту). Будет меньше операций если надо читать с разных областей диска, т.к. перемещение магнитной головки штука медленная мало того из-за того что механическая операция но должна осуществляться точно (речь о микрометрах), так ещё и в условиях вибрации от собственно самого диска и всех прочих вибраций. Как итог вполне можно попасть не на ту дорожку и придётся перепозиционировать головки ещё раз. Но зато можно успеть прочитать больше данных, если они идут последовательно в секторах одной дорожки. В общем, механический диск - штука крайне медлительная и прогресс CPU и оперативной памяти (не имеющих механический частей и потому значительно более быстрых) в прошлом тысячелетии потребовали вводить всевозможные ухищрения. В частности, операционные системы начали кешировать операции чтения и записи данных в неиспользуемых в данный момент выполняющимися программами областях оперативной памяти. И если с чтением всё просто - точно такая же копия лежит в энергонезависимой памяти механических дисков - то с кешированием записи как-то печальнее. Операционная система отвечает приложению "данные записаны", а на самом деле они размещены в оперативной памяти и будут записаны когда-нибудь чуть позже, может через несколько секунд. И это замечательно работает и ускоряет все операции с дисков. Вот только при критическом сбое системы (например по питанию) данные будут потеряны. И чтобы дать приложениям возможность попросить систему именно записать какие-то данные в энергонезависимую память и добавили вызов fsync, который синхронизирует кэш записи с дисками. Повторюсь - для механических дисков позиционировать головки операция очень медленная. Поэтому если вы начнёте читать-писать с механическим диском с 1000 потоков - это будет бесконечно долго. При том, ситуацию для вас всеми своими силами постараются сгладить и планировщики ввода-вывода и кэширование файловых операций. Из-за позиционирования головки механические диски могут давать неплохую производительность на последовательных операциях, но производительность случайных операций у механики удручающая. Но, к счастью, за последние лет 10 сильно подешевела flash-память и появились SSD диски. Дисками их называют только по привычке, на самом деле никакой механики там уже нет. И параллельная обработка запросов (пусть и за счёт обращений к разным кристаллам памяти) и куда более внушительная производительность по метрике количества операций в секунду (iops) - всё возможно. И, вероятно, со временем будут пересмотрены в сторону упрощения и планировщики ввода-вывода (собственно blk_mq в ядре linux уже) и упрощены другие нагромождения этих десятилетий когда для хранения данных использовалась медлительная механика. У flash-памяти своих интересных фокусов тоже хватает (например, есть не 2 операции чтение и запись, а чтение, стирание, запись - запись возможна только в предварительно очищенную страницу. Отсюда выросла необходимость в команде trim) - но это уже тема отдельных изысканий.

    Ответ 2



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

    Упрощение sql запроса с подзапросами. Oracle

    #sql #oracle

    
    Здравствуйте. Нужно упростить запрос но пока что не как не могу понять как это сделать.
    Идея в том что бы все вложенные селекты переписать в джоины. ПОдскажит пожалуйста как
    это сделать. Вот мой запрос.
    
    select weight from myTableData
    where port = (select port from myTableDict where Name = 'название') and
    date = (
        select max(date) from myTableData
        where port = (select port from myTableDict where Name = 'название'));
    
    
    Это пример моего запроса. Надеюсь всё расписал достаточно понятно. Если нет то пишите
    объясню. Нужно сделать вместо селектов вложенных, джоины не могу пока что понять как
    именно это сделать.
    
    План запроса:
    
    
    udp_port это port, w это myTableData, s это myTableDict.
    Собстенно в таблице WEIGHER_DATA, 31 милион записей с небольшим. На ней есть 2 индекса.
    На поле upd_port и на поле insert_date которое я подписал в примере как date. Стоимость
    запроса почти под 56 тысяч как по мне многовато. С этой информацией можно как то упростить
    и понизить стоимость запроса?
        
    


    Ответы

    Ответ 1



    select max(weight) keep (dense_rank last order by M.port,M.date) from myTableData M, myTableDict D where D.Name='название' and M.port=D.port Конструкция KEEP дает значение поля weight для последней (dense_rank last) записи в порядке сортировки по дате. т.е. значение на максимальную дату. JOIN сокращен до запятой и параметры из ON перенесены в where.

    Объединенный отчет из двух таблиц SQL

    #mysql #sql

    
    Нужно вывести item_id и price_in_rub. Price_in_rub – стоимость rub, считается как
    price из таблицы items умноженная на курс валюты на максимальную дату выставления курса
    из таблицы rates.
    
    Выглядит все это примерно так:
    Например: item_id=5 price = 20 EUR, в таблице rates максимальная дата выставления
    курса евро – 13 января, на эту дату курс равнялся 3,0. Итого price_in_rub 20*3,0 = 60.
    
    items   
    item_id |price  | currency  
    1       |100    | USD   
    2       |10     | EUR   
    3       |20     | USD   
    4       |40     | USD   
    5       |20     | EUR   
    7       |400    | USD
    
    rates
    currency|   date    |   rate
    USD     | 10.01.2017|   1,0
    USD     | 11.01.2017|   1,5
    USD     | 12.01.2017|   2,0
    EUR     | 13.01.2917|   3,0
    EUR     | 12.01.2017|   2,5
    
        
    


    Ответы

    Ответ 1



    Решение с корелированым подзапросом: SELECT itm.item_id ,(itm.price * cur.rate) price_in_rub FROM items itm CROSS APPLY ( SELECT TOP 1 rate FROM rates WHERE itm.currency = rates.currency ORDER BY date desc ) cur

    Ответ 2



    Вот такой вариант по быстрее будет: SELECT it.item_id, it.price*r.rate AS price_in_rub FROM dbo.items AS it JOIN dbo.rates AS r ON it.currency = r.currency WHERE r.date = (SELECT MAX(date) FROM dbo.rates AS r2 WHERE r.currency = r2.currency)

    Что такое висячие указатели, в чем их опасность?

    #cpp #c #указатели

    
    Почему появляются проблемы подобного рода ?
        
    


    Ответы

    Ответ 1



    char* f() { char s[100]; // страшное вычисление s return s; } Представили? вызываем char * s = f();. Нормально? вроде бы да. Но когда мы начнем использовать этот указатель - тот char s[100]; из функции давно может быть перезаписан чем-то другим (эта память выделяется в стеке только на время работы функции). И мы получаем висячий указатель - т.е. он есть и даже куда-то указывает... Только там может быть что угодно. Или - s = malloc(...); .... free(s); Значение s остается - free его не меняет, но указывает оно на память, которая освобождена, может быть выделена заново, перезаписана... или, например, еще раз удалена. Так понятнее?

    Переопределение имени глобальной переменной

    #cpp #cpp11

    
    Почему оно работает? Слышал об предварительном объявлении, но это явно другой случай.
    Или в чистом виде UB?
    
    Сам код на IdeOne
    
    #include 
    using namespace std;
    const int x = 5;
    
    int main(){
        int x[x];
        cout << "OK!" << endl;
        return 0;
    }
    
        
    


    Ответы

    Ответ 1



    Нет, это не UB. Согласно стандарту, раздел 6.3.2, клауза 2 упоминает в точности ваш пример: const int i = 2; { int i[i]; } В нём определяется массив из двух целых чисел внутри блока. Полная цитата из стандарта (перевод мой): Точка декларации имени находится непосредственно за её полным декларатором (...) и перед инициализатором (если он есть), за исключением замечаний ниже. [ Пример: unsigned char x = 12; { unsigned char x = x; } Здесь второй x инициализируется своим собственным (неопределённым) значением. — конец примера ] [ Замечание: Имя из внешней области действует вплоть до точки декларации имени, которое его перекрывает. [ Пример: const int i = 2; { int i[i]; } определяет внутриблоковый массив из двух целых. — конец примера ] — конец замечания ]

    При повторном вызове функции предыдущие значения объявленной переменной продолжают использоваться

    #javascript #html #jquery #html5

    
    На сей раз возник вопрос к var. Как заставить переменную перезаписывать своё значение
    при каждом новом вызове функции?
    Весь код функции прилагается.
    
    function tablecell(){
        var st = $(this).attr('id');
        console.log(st);
        if($(this).is('.disabled')){ 
        }
        else{
            $('.questionBg').css({'display':'flex'});
            function answer(){
                if ($(this).is('#true')){
                    $(this).css({'background':'#83c849'}).css({'color':'#fff'});
                    $('.answer').addClass('disabled');
                    $('.disabled').off('click', answer);
                    $('.teamSelection').css({'display':'flex'});
                    $('.selectTeam').click(function(){
                        $(close);
                        alert(st);
                        $("#"+st).addClass('disabled');
                        if($(this).is('.selectTeam1')){
                            $("#"+st).children('.question').css({'display':'none'});
                            $("#"+st).children('.team1').css({'display':'block'});
                        }
                        else{
                            $("#"+st).children('.question').css({'display':'none'});
                            $("#"+st).children('.team2').css({'display':'block'});
                        }
                    });
                }
                else{
                    $(this).css({'background':'#e03a3a'}).css({'color':'#fff'});
                    $('.answer').addClass('disabled');
                    $('.disabled').off('click', answer);
                    setTimeout(close, 1000);
                }
            }
        }
        $('.answer').click(answer);
    };
    
    
    Вызов производится извне:
    
    $(document).ready(function(){
        $('.tablecell').click(tablecell);
    });
    
    
    У меня ощущение, что функция банально не завершается, но новое значение в консоль
    при повторном вызове выводится. 
    Однако, alert с каждым разом повторно выводит предыдущие значения. Что делать - не
    пойму. Массивом прописать?
    
        
    Какого цвета этот блок?
      Варианты ответа:
    • Синий
    • Красный
    • Серый
    • Белый
    Начать!


    Ответы

    Ответ 1



    Что делать Не назначать обработчики событий внутри других обработчиков событий. Каждый раз, когда выполняется функция tablecell, Вы добавляете новый обработчик события click всем элементам с классом "answer". По щелчку на такой элемент выполняются все накопившиеся обработчики. (function(){ var st; function answer(){ ... } function tablecell(){ st = $(this).attr('id'); console.log(st); if($(this).is('.disabled')){ } else { $('.questionBg').css({'display':'flex'}); } } $(document).on('click', '.tablecell', tablecell); $(document).on('click', '.answer', answer); })();

    Button не отжимается после выполнения Command

    #c_sharp #wpf

    
    Иногда кнопка после выполнения команды не становится активной.
    Помогает клик по форме. Скажете пожалуйста в чем может быть проблема?
    
    
    
    XAML: