Страницы

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

воскресенье, 8 марта 2020 г.

Универсальный класс с параметром в виде универсального класса

#c_sharp #generics


Возможно ли, и если да, то как, создать универсальный (generic) класс, параметром
для которого выступает другой универсальный класс? 

Псевдо-код поясняющий идею:

class Gen where T : class { }   // тут всё ОК
class MoreGen where G : Gen { } // здесь непонятно как сделать


Хочется ограничить параметры для MoreGen только классами Gen, чтобы была возможность
использовать следующий код:

new MoreGen>(); // Должно быть OK
new MoreGen();        // Нужна ошибка компиляции
new MoreGen>();      // Нужна ошибка компиляции

    


Ответы

Ответ 1



На основании упомянутого в комментариях ответа на английском SO, решение "в лоб" не является возможным. Для достижения желаемого эффекта приходится добавлять интерфейс: interface IGen {} class Gen : IGen where T : class { } class MoreGen where G : IGen { } public class Test { public static void Main() { new MoreGen>(); // OK new MoreGen>(); // OK // new MoreGen(); // no implicit reference conversion from `string' to `IGen' // new MoreGen>(); // The type `int' must be a reference type } } Результат выполнения кода

Регулярное выражение лишние символы

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


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

Вот как я подумал

    var str = "Имя фамилия текст текст";
    str.match(/^[^!@#]+ [^!@#]+$/i);


И вот результат

["Имя фамилия текст текст"]


Почему , регулярное выражение прошло валидацию? МОжет я не правильно проверяю, я
не пойму...

По идее, регулярка должна найти совпадение

начало_строки[любой_символ_кроме!@#]минимум1раз пробел  [любой_символ_кроме!@#]конец_строки

Но, в примере после 2ого слова есть еще пробелы, символы, и их тоже пропускает

Мне нужно проверить на любые символы кроме тех 3х знаков

Вот тестер
https://regex101.com/r/kJ5vZ2/4
    


Ответы

Ответ 1



Вы сами отвечаете на свой вопрос. Регулярное выражение [^!@#]+ включает в себя любые символы кроме !, @ и # в том числе включает и пробел! А это значит, что вся строка Имя фамилия текст текст подходит под первое [^!@#]+. Добавьте в список исключаемых слов пробел. Пример: var str = "Имя фамилия текст текст"; str.match(/^[^!@# ]+ [^!@# ]+$/i); https://regex101.com/r/kJ5vZ2/5

Почему индекс в методе pop находится вне границы?

#python


import random
WORDS = ["Svitanok", "hogog", "gfgfgfg", "sdasd", "adam"]
newwords = []
length = len(WORDS)
newpos = ""
while WORDS:
  newpos = random.randint(0, length-1)
  newwords.append(WORDS.pop(newpos))
  WORDS.remove(WORDS[newpos])
print(newwords)


В общем, писал алгоритм для вывода списка WORDS в случайном порядке. И наткнулся
на ошибку "pop index out of range". Не могу понять, почему метод выходит за границы?
P.S. Про shuffle я знаю, просто хочу написать код таким способом. 
    


Ответы

Ответ 1



remove не нужно вызывать, pop уже удаляет элемент из списка. Кроме этого, значение length нужно обновлять на каждой итерации, тк список WORDS изменяет свой размер.

Ответ 2



Раз: допустим, после нескольких итераций WORDS у нас стал ["Svitanok"]. 1) newpos = random.randint(0, length-1) newpos может быть 0, 1, 2, 3 или 4, потому что length=5 (никто эту переменную не менял) и length-1=4, а randint включает обе границы в интервал, из которого выбирается число. Допустим, newpos выпало 4. 2) newwords.append(WORDS.pop(newpos)) "Svitanok" это 0. Элементов, соответствующих индексам 1, 2, 3 или 4 здесь уже нет. А newpos у нас выпало как раз 4 — всё, выход за правый предел списка, pop падает. Два: пройдёмся с самого начала с другой ситуацией 1) newpos = random.randint(0, length-1) Допустим, пусть там выпадет 4 2) newwords.append(WORDS.pop(newpos)) WORDS = ["Svitanok", "hogog", "gfgfgfg", "sdasd"] newwords = ["adam"] 3) WORDS.remove(WORDS[newpos]) "Svitanok" это 0, "hogog" это 1, "gfgfgfg" это 2, "sdasd" это 3. А newpos у нас 4. Вот, собственно, и всё, WORDS[newpos] падает, ибо 4 это выход за правый предел списка. Правильный код: import random WORDS = ["Svitanok", "hogog", "gfgfgfg", "sdasd", "adam"] newwords = [] while WORDS: newpos = random.randint(0, len(WORDS) - 1) newwords.append(WORDS.pop(newpos)) print(newwords)

Изображения пропадают с Heroku

#ruby_on_rails #ruby #heroku


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

Heroku logs выдает что то про неполадки с путями:

2016-05-13T14:38:05.031223+00:00 heroku[router]: at=info method=GET path="/system/posts/images/000/000/007/medium/app-server-arena2.png?1463131430"
host=arcane-taiga-31170.herokuapp.com request_id=21181509-0382-494c-b4d8-fc0837464c99
fwd="92.100.233.26" dyno=web.1 connect=0ms service=4ms status=404 bytes=1789
2016-05-13T14:38:05.029499+00:00 app[web.1]: ActionController::RoutingError (No route
matches [GET] "/system/posts/images/000/000/007/medium/app-server-arena2.png"):
2016-05-13T14:38:05.027456+00:00 app[web.1]: Started GET "/system/posts/images/000/000/007/medium/app-server-arena2.png?1463131430"
for 92.100.233.26 at 2016-05-13 14:38:05 +0000

    


Ответы

Ответ 1



Да, Heroku так работает. Локальный диск у него "эфемерный" и может быть пересоздан из образа в любой момент. А именно, когда приложение "засыпает", его диск уничтожается, а когда " будят", создаётся новый, отдельный на каждую машинку (dyno). Поэтому на диск ничего, что предназначено для длительного хранения, сохранять нельзя. Нужно использовать внешнее хранилище. Можно сохранять прямо в БД (они не для этого предназначены, но в теории это реально), а можно подключить внешнюю службу хранения с доступом по HTTP вроде Amazon Simple Storage Service (S3), а можно придумать/найти что-то ещё.

Некорретно обрабатываются регулярные выражения

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


Здравствуйте. Есть следующий пример:

#include 
#include 

int main() {

    std::string str("subject, subbase");
    std::regex rx("sub\\w*");
    std::smatch res;

    std::regex_search(str, res, rx);     

    for(auto &i: res) {
        std::cout << i << " ";
    }

    return 0;
}


Output:
subject

Я ожидал вывод обоих слов из str, и тут мне подсвечивают как раз оба слова. G++ (GCC)
6.1.1 . Может я не правильно понял принцип работы функции regex_search? Она должна
все совпадения внести в res, всё вроде верно. 
    


Ответы

Ответ 1



Цикл for(auto &i: res) std::cout << i << " "; проходит по захваченным группам в результате поиска. Если вашу регулярку записать, например, в таком виде: std::regex rx("(sub)(\\w*)"); то будут захвачены следующие группы: subject sub ject Чтобы сматчить все слова, соответствующие вашей регулярке, можно использовать код: while (std::regex_search (str, res, rx)) { std::cout << res[0] << " "; str = res.suffix(); } Пример использования regex_search можно посмотреть, например, здесь.

Запись радиоэфира с пропуском тишины в Linux

#linux #аудио


Доброго времени суток. Имеется трансивер, подключённый к линейному входу ПК под управлением
убунты. Задача - вести запись вызывной частоты. Подскажите, какой программой можно
захватывать линейный вход с пропуском тишины так, чтобы записи сохранялись в разные
файлы с названием равным времени, в которое была сделана запись. Ещё лучше, если есть
возможность писать всё в один файл, если тишина длилась, например, не более минуты.
(Чтобы в один файл попадал, например, общий вызов и все отклики на него. А как только
тишина длится более минуты - то следующая запись пойдёт в новый файл.)
    


Ответы

Ответ 1



есть программа streamripper которой я записывал потоковое радио. Может писать в один файл. Может не записывать тишину.

Обновление ICU на PHP7

#php #ubuntu #unicode


Подскажите, какие есть способы обновить ICU до актуальной версии на PHP7 на Ubuntu 14.04?
Ставил php7 из ppa репозитория ondrej. Пытался обновить ICU через pecl, но для 7
версии этот способ не работает. Получается выход только один - компилировать PHP из
исходников и указывать icu вручную? Подскажите, как это сделать?
    


Ответы

Ответ 1



После долгих поисков я пришел к выводу что проще всего скомпилировать intl из репозитория php. Ниже привожу мой пример для icu5.8.1 который ставится в /opt/icu5c на php-7.0.8. Для других версий нужно изменить пути к файлам соответсвенно. sudo su #Install ICU wget http://download.icu-project.org/files/icu4c/58.1/icu4c-58_1-src.tgz tar zxvf icu4c-58_1-src.tgz cd icu/source ./configure --prefix=/opt/icu5c && make && make install #Install intl.so from php source cd ../.. wget https://github.com/php/php-src/archive/php-7.0.8.tar.gz tar -xvf php-7.0.8.tar.gz cd php-src-php-7.0.8/ext/intl export LD_LIBRARY_PATH=/opt/icu5c/lib phpize ./configure --enable-intl --with-icu-dir=/opt/icu5c make make install #Activate extension (cli and fpm) echo "extension=intl.so" > /etc/php/7.0/mods-available/intl.ini ln -s /etc/php/7.0/mods-available/intl.ini /etc/php/7.0/cli/conf.d/20-intl.ini ln -s /etc/php/7.0/mods-available/intl.ini /etc/php/7.0/fpm/conf.d/20-intl.ini

Ответ 2



Для тех у кого при команде make выдаются ошибки для ICU версии >=59.1, как у комментария @Arkemlar, мне помогли следующие флаги для компилятора make CXXFLAGS="-g -std=c++11" Комментом не смог добавить, из за репутации инфу

Java Десериализация ArrayList в цикле

#java #сокет #arraylist


Ребята, добрый день! 

Я новичок и выполняю следующее задание. Нужно построить клиент-серверное приложение,
где клиенты отправляют на сервер объекты периодически. сервер эти значения добавляет
в ArrayList и периодически рассылает клиентам. Проблема в том, что на стороне клиента
читается не весь ArrayList. а читается только первые несколько элементов. Помогите
разобраться. Коды и вывод информации ниже.

СЕРВЕРНАЯ ЧАСТЬ

             package sockets;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;


public class ServerSocketProg extends JFrame implements Runnable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    ArrayList users;
    private ArrayList clientObjectOutputStreams;
    private ArrayList stringArrayList = new ArrayList();
    private ServerSocket serverSock;
    private JTextArea ta_chat;
    private Path path;
    private BufferedWriter fileWriter;

    public ServerSocketProg() {
        initComponents();


        path = Paths.get("ServerLogger.txt");
        try {
            fileWriter = Files.newBufferedWriter(path, 
                    StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING,
StandardOpenOption.WRITE);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void run() 
    {
        clientObjectOutputStreams = new ArrayList();
        users = new ArrayList();  

        try 
        {
            serverSock = new ServerSocket(2222);
            while (true) 
            {
                Socket clientSock = serverSock.accept();                        
               
                ObjectOutputStream objectWriter = new ObjectOutputStream(clientSock.getOutputStream());
                clientObjectOutputStreams.add(objectWriter);

                Thread listenerObject = new Thread(new ClientObjectHandler(clientSock,
objectWriter));
                listenerObject.start();
                Thread intervalSender = new Thread(new SendArrayWithInterval());
                intervalSender.start();

                ta_chat.append("Got a connection. \n");
                fileWriter.write("Got a connection. \r\n");
            }
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
            ta_chat.append("Error making a connection. \n");
            try {
                fileWriter.write("Error making a connection. \r\n");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }   



    class ClientObjectHandler implements Runnable   
    {
           BufferedReader reader;
           Socket sock;
           ObjectOutputStream client;
           ObjectInputStream objectReader;

           public ClientObjectHandler(Socket clientSocket, ObjectOutputStream user)
throws IOException 
           {
                client = user;
                try 
                {
                    sock = clientSocket;
                    objectReader = new ObjectInputStream(sock.getInputStream());
               
                }
                catch (Exception ex) 
                {
                    ta_chat.append("Unexpected error... \n");                   
                    fileWriter.write(ex.toString());
                }

           }

           @Override
           public void run() 
           {
                String message;    

                try 
                {
                    while ((message = (String) objectReader.readObject()) != null) 
                    {
                        ta_chat.append("Received Object: " + message + "\n");
                        fileWriter.write("Received Object: " + message + "\r\n");
                        stringArrayList.add(message);                           
          
                    } 
                 } 
                 catch (Exception ex) 
                 {
                    ta_chat.append("Lost a connection. \n");
                    try {
                        fileWriter.write("Lost a connection\r\n");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    clientObjectOutputStreams.remove(client);
                 } 
           } 
        }

    class SendArrayWithInterval implements Runnable{
        @Override
        public void run() {
            while(true){
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(stringArrayList.size()>0){
                    ta_chat.append("Telling everyone Array...\n");                  
                    sendEveryoneObject();
                }
            }
        }
    }

    public void sendEveryoneObject() {
        Iterator it = clientObjectOutputStreams.iterator();

        while (it.hasNext()) 
        {
            try 
            {
                ObjectOutputStream outputWriter = (ObjectOutputStream) it.next();


                outputWriter.writeObject(stringArrayList);

                outputWriter.flush();

                ta_chat.append("Sending: " + stringArrayList.toString() + "\n");        
                ta_chat.setCaretPosition(ta_chat.getDocument().getLength());
                fileWriter.write("Sending: " + stringArrayList.toString() + "\r\n");

            } 
            catch (Exception ex) 
            {
                ex.printStackTrace();
                ta_chat.append("Error telling everyone. \n");
                try {
                    fileWriter.write("Error telling everyone. \r\n");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }




    }


    private void initComponents() {
        JScrollPane jScrollPane1 = new javax.swing.JScrollPane();
        ta_chat = new javax.swing.JTextArea(40, 50);        
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Chat - Server's frame");
        setName("server");        

        jScrollPane1.add(ta_chat);
        jScrollPane1.setViewportView(ta_chat);
        add(jScrollPane1);

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent arg0) {
                try {
                    fileWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }); 

        setSize(400, 600);
        setVisible(true);
        pack();
    }



    public static void main(String[] args) {        
        Thread starter = new Thread(new ServerSocketProg());
        starter.start();            
    }
}


КЛИЕНТСКАЯ ЧАСТЬ: 

package sockets;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;


public class ClientsSocketsProgram extends JFrame implements Runnable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private String address = "localhost";
    private int port = 2222;
    private Boolean isConnected = false;  
    private static int instance = 0;
    private Socket sock;
    private ObjectOutputStream objectWriter;
    private ObjectInputStream objectReader; 
    private JTextArea ta_chat;
    private Path path;

    private int incrementerToSend = 0;

    public ClientsSocketsProgram() {

        initComponentsClientFrame();
        connectToServer();       

        Thread incomeReader = new Thread(new IncomingReader());
        incomeReader.start();
    }   

    class IncomingReader implements Runnable
    {
        ArrayList inputArrayList;// = new ArrayList();
        @Override
        public void run() 
        {
            ArrayList here = new ArrayList();


            try 
            {
                while( true  ){

                    here =(ArrayList) objectReader.readObject();        
           

                    ta_chat.append("Object received: " + here.toString() + "\n "); 
                    ta_chat.setCaretPosition(ta_chat.getDocument().getLength());
             
                }
           }catch(Exception ex) {

               ex.printStackTrace();
           }
        }



    }

    @Override
    public void run() { 
        while(isConnected){
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            ta_chat.append("Sending " + incrementerToSend + "\n");

            sendObject(" " + incrementerToSend);
            ++incrementerToSend;
        }

    }




    private void initComponentsClientFrame() {

        JScrollPane jScrollPane = new javax.swing.JScrollPane();
        ta_chat = new javax.swing.JTextArea(20, 30);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle(" Chat - Client's frame");
        setName("client"); 


        jScrollPane.add( ta_chat );
        jScrollPane.setViewportView(ta_chat);
        add(jScrollPane);

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent arg0) {
                closeConnections();
            }
        }); 

        setSize(400, 600);
        setVisible(true);
        pack();
    }



    private void connectToServer() {
        if (!isConnected) 
        {
            try 
            {
                sock = new Socket(address, port);                
                objectReader = new ObjectInputStream(sock.getInputStream());
                objectWriter = new ObjectOutputStream(sock.getOutputStream()); 
                isConnected = true; 
            } 
            catch (Exception ex) 
            {
                ta_chat.append("Cannot Connect! Try Again. \n");

            }

        } else if (isConnected) 
        {
            ta_chat.append("You are already connected. \n");

        }
    }

    private void sendObject(String text) {

        try  {
            objectWriter.writeObject(text);
            objectWriter.flush();           
        } catch (Exception ex) {
            ta_chat.append("Message was not sent. \n");


            ex.printStackTrace();
        }

    }

    private void closeConnections(){
        if(isConnected){
            try{
                objectWriter.close();
                objectReader.close();
                sock.close();

                isConnected = false;
            }catch(Exception e){
                e.printStackTrace();
            }
        }       
    }





    public static void main(String args[]) 
    {
        Thread thread = new Thread(new ClientsSocketsProgram());
        thread.start();

    }


}


ВЫВОД СЕРВЕРНОЙ ЧАСТИ (ЗАПУЩЕНО 2 КЛИЕНТА): 

         Got a connection. 
Received Object:  0
Received Object:  1
Telling everyone Array...
Sending: [ 0,  1]
Received Object:  2
Got a connection. 
Received Object:  3
Received Object:  0
Received Object:  4
Received Object:  1
Telling everyone Array...
Sending: [ 0,  1,  2,  3,  0,  4,  1]
Sending: [ 0,  1,  2,  3,  0,  4,  1]
Telling everyone Array...
Sending: [ 0,  1,  2,  3,  0,  4,  1]
Sending: [ 0,  1,  2,  3,  0,  4,  1]
Received Object:  5
Received Object:  2
Received Object:  6
Received Object:  3
Telling everyone Array...
Sending: [ 0,  1,  2,  3,  0,  4,  1,  5,  2,  6,  3]
Sending: [ 0,  1,  2,  3,  0,  4,  1,  5,  2,  6,  3]


ВЫВОД КЛИЕНТСКАЯ ЧАСТЬ: 

Sending 0
Sending 1
Object received: [ 0,  1]
 Sending 2
Sending 3
Sending 4
Object received: [ 0,  1]
 Object received: [ 0,  1]
 Sending 5
Sending 6
Object received: [ 0,  1]
 Sending 7
Object received: [ 0,  1]
 Sending 8
Sending 9
Object received: [ 0,  1]
 Object received: [ 0,  1]
 Sending 10
Sending 11
Object received: [ 0,  1]
 Sending 12

    


Ответы

Ответ 1



Это происходит потому, что вы каждый раз передаете один и тот же объект ArrayList. ObjectInputStream/ObjectOutputStream позволяют передать объект вместе со всеми его полями, которые могут содержать ссылки на другие объекты, которые тоже могут на кого-то ссылаться. Поскольку может быть несколько ссылок на один объект, то при десериализации эти ссылки восстанавливаются, а не создается несколько копий. Т.е. writeObject видит, что этот объект он уже записывал, и кладет в поток ссылку, а readObject возвращает вам ссылку на ранее десериализованный объект. Чтобы этого избежать, вы можете использовать ObjectOutputStream.writeUnshared, чтобы основной объект считался уникальным. Еще можно после записи вызывать ObjectOutputStream.reset() чтобы последующие записи не учитывали ранее сериализованные объекты, и записывали их по-новой, а не в виде ссылок. Может быть стоит создавать новый ArrayList в sendEveryoneObject и рассылать его. Замечу, что вы очень вольно обращаетесь с многопоточностью. ArrayList не является потокобезопасной коллекцией, и не дает никаких гарантий при одновременной модификации (когда два клиента прислали вам сообщение, например). Вам нужно или самостоятельно обеспечить потокобезопасность через synchronized или Lock из java.util.concurrent, использовать Collections.synchronizedList (обратите внимание на способ использования итератора в документации метода), либо использовать какую-то коллекцию из java.util.concurrent (CopyOnWriteArrayList вам не очень подойдет, т.к. много модификаций, но для хранения сообщений может подойти одна из очередей). В последних двух случаях стоит скопировать данные перед отправкой клиентам в локально созданный список. При обращении к компонентам Swing следует использовать SwingUtilities.invokeLater, т.к. все обращения должны выполняться из Event Dispatch Thread. Создавать новый new Thread(new SendArrayWithInterval()) при каждом подключении клиента не нужно, у вас поэтому начинают дублироваться посылки сервера.

Как получить данные из onResponse? Retrofit.

#java #android #retrofit


Не могу получить данные из onResponse.

    public void loadData() {
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(myurl)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    RESTPK service = retrofit.create(RESTPK.class);
    Call call = service.loadJsonStr();
    call.enqueue(new Callback() {
        @Override
        public void onResponse(Call call, Response response) {
            pathPoster = response.body().getPath().get(0).get1(); //переменая которую
мне нужно вытащить
            System.out.println(pathPoster);
        }
        @Override
        public void onFailure(Call call, Throwable t) {
        }
    });
}


Если в onResponse вывести на экран переменную pathPoster, то она показывает правильный
результат, но если ее вывести на экран после вызова loadData(), то в ней уже ничего
нет и приложение вылетает с ошибкой. Получить данные получил, но пользоваться ими не
получается.

    loadData();
    System.out.println(pathPoster);


ошибка: 

FATAL EXCEPTION: mainjava.lang.RuntimeException: Unable to start activity ComponentInfo{com.awesomedevelop.recyclerview/com.awesomedevelop.recyclerview.MainActivity}:
java.lang.NullPointerException

    


Ответы

Ответ 1



Потому что у тебя асинхронный запрос. onResponse вызывается после загрузки информации, а System.out.println(pathPoster) вызывается до загрузки, судя по твоему коду. То есть, когда информация еще не успела загрузиться из сети. А падает потому что строка в которую ты не записал еще данные по-умолчанию null. Либо делай синхронный запрос, либо все действия после загрузки выполняй в onResponse. Если переделаешь на синхронный запрос, учти, что синхронные запросы в сеть, нельзя делать в Ui потоке приложения. http://square.github.io/retrofit/2.x/retrofit/

Ответ 2



Проще всего работать через Singleton-класс, к которому можно будет обратиться и из UI-потока и из асинхронного ответа

Валидное расположение блоков

#css #bootstrap #div


Подскажите как грамотно расположить блоки как на данном рисунке(блок 3 немного заезжает
на блок 1,), что б они сохранили при этом адаптивность свою(при изменении ширины экрана
не проваливались ни куда). Можно и на бутстрапе, просто интересен грамотный подход,
да бы минимизировать использование лишних тегов и стилей.Заранее спасибо
    


Ответы

Ответ 1



css - calc() browser support calc .block-1 { height: 200px; background: #ccc; } .block-2, .block-3 { height: 100px; background: #ddd; } .block-3 { height: 100px; background: #999; margin-left: -50px; width: calc(100% + 50px)!important; } @media screen and (max-width: 767px) { .block-3 { margin-left: 0; width: 100%!important; } }
1
2
3


Ответ 2



Поскольку вопрос про минимизацию кода, предлагаю ещё один вариант. Строил то же, что и soledar10. Отличия в деталях: Второй и третий блоки не надо заворачивать в отдельную строку. Вместо calc можно использовать проценты от ширины экрана. Поскольку бутстрап рабоает в логике "mobile first", органичнее использовать @media (min-width: 768px). Это позволяет задать width и margin-left для третьего блока только один раз, когда они отличаются от значений по умолчанию. col-sm- действует для всех экранов шириной от 768 пикселей. Если при большей ширине экрана поведение не меняется, то другие классы добавлять не нужно. .block-red { background-color: red; height: 400px; } .block-green { background-color: green; height: 200px; } .block-yellow { background-color: yellow; height: 200px; } @media (min-width: 768px) { .block-yellow { margin-left: -10%; width: 85% !important; } }


Правильная замена классов в галерее

#javascript #jquery


Есть слайдер с js-анимацией. Анимирование происходит путем подмены класса, их координаты
заданы в css и в js - circleCoords. 

Код выкладываю на plunker, т.к. его много и чтоб понять проблему нужно увидеть событие
глазами: https://plnkr.co/edit/qHn1HytgxucUwl0tkBTe?p=preview

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

Но почему-то, после клика, элементы начинают сдвигаться беспорядочно, а не как следует
- друг за другом в новой построенной очереди. Я уверен что где-то пропустил какую-то
мелочь, нужен свежий взгляд профи) Благодарен за внимание!
    


Ответы

Ответ 1



немного упростил код, смотреть результат лучше на всю страницу. var dd = $("[data-id]"), elems = $.makeArray(dd), circleCoords = [{ top: 0, left: 229 }, { top: 100, left: 677 }, { top: 265, left: 603 }, { top: 265, left: 307 }, { top: 265, left: 14 }, { top: 100, left: -58 }]; dd.on("click", function() { var i = $.inArray(this, elems); elems[i] = elems[0]; elems[0] = this; $(elems[i]).removeClass("active"); move() }); function move() { var deferreds = []; $(elems[0]).addClass("active"); $.each(elems, function(indx, el) { deferreds.push($(el).animate(circleCoords[indx],2000)) }); $.when.apply(null, deferreds).done(function() { if (!busy) timer = window.setTimeout(function() { var el = elems.pop(); $(elems[0]).removeClass("active"); elems.unshift(el); move() }, 2000) }) } var busy, timer; $(".container").mouseleave(function() { busy = false; !dd.queue("fx").length && move() }).mouseenter(function() { window.clearTimeout(timer); busy = true }); move() .container { padding-top: 30px; } .animation-wrap { position: relative; width: 1170px; height: 565px; margin: auto; overflow: hidden; } .animation-wrap a { display: none; position: absolute; width: 119px; height: 30px; z-index: 72; top: 279px; left: 196px; } .animation-wrap .small { position: absolute; width: 222px; height: 131px; left: 50%; top: 50%; margin-left: -138px; margin-top: -81px; cursor: pointer; z-index: 2; opacity: 1; -webkit-transition: all 0.7s ease; -moz-transition: all 0.7s ease; -ms-transition: all 0.7s ease; -o-transition: all 0.7s ease; transition: all 0.7s ease; } .animation-wrap .small:hover { -webkit-filter: brightness(130%); filter: brightness(130%); } .animation-wrap .big { position: absolute; opacity: 0; margin: 0 auto; -webkit-transition: all 0.7s ease; -moz-transition: all 0.7s ease; -ms-transition: all 0.7s ease; -o-transition: all 0.7s ease; transition: all 0.7s ease; } .active .small { opacity: 0; cursor: default; } .active .big { opacity: 1; z-index: 3; width: 507px; height: 360px; } [data-id] { position: absolute; width: 400px; height: 380px; } [data-id=obj1] { top: 70px; left: -165px; } [data-id=obj2] { top: 0; left: 285px; } [data-id=obj3] { top: 70px; left: 730px; } [data-id=obj4] { top: 285px; left: 610px; } [data-id=obj5] { top: 285px; left: 285px; } [data-id=obj6] { top: 285px; left: -40px; }


Фиксированное значение столбца (= null) в зависимости от значения другого столбца

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


В таблице tablename есть столбцы type и arg. Нужно ввести ограничение, по которому
при type = 1, всегда arg = null.

Каким образом это можно организовать в PostgreSQL? Версия 9.5.2.

Можно реализовать это на уровне приложения, но требуют, именно, на уровне СУБД. Чтобы
она не дала нарушить это правило.
    


Ответы

Ответ 1



ALTER TABLE test ADD CONSTRAINT null_arg CHECK ((type = 1 AND arg IS NULL) OR type <> 1)

Как записать параметры автоустановщика в Ubuntu?

#ubuntu #anaconda


CentOS при ручной установке создаёт файл /root/anaconda-ks.cfg, в котором записываются
все параметры ручной установки. После этого файл можно использовать для типовой установки
множества машин.

Как записать параметры автоустановщика для Ubuntu? Именно не создать новый файл самому,
а записать параметры при установке новой системы.
    


Ответы

Ответ 1



если при установке использовать текстовый режим, то запускаемая при этом программа debian-installer создаёт в целевой файловой системе каталог /var/log/installer, в котором содержится, в том числе, и файл /var/log/installer/cdebconf/questions.dat, который можно использовать в качестве «заготовки» для preseed-файла. получить такую «заготовку» можно с помощью скрипта debconf-get-selections (из пакета debconf-utils): $ sudo debconf-get-selections --installer > файл $ sudo debconf-get-selections >> файл из личного же опыта я бы посоветовал за основу для автоконфигурации брать «образцовый» файл example-preseed.txt, а содержимое полученного с помощью debconf-get-selections файла использовать разве что в качестве иллюстрации. дополнение про разницу между preseed-файлами для debian и для ubuntu. помимо закомментированных строк есть всего четыре отличия: добавлен параметр про отключение диалога выбора языка: d-i console-setup/ask_detect boolean false указан другой репозиторий с пакетами (что вполне естественно). явно указано не шифровать домашний каталог первого создаваемого пользователя: d-i user-setup/encrypt-home boolean false в качестве выбора задачи указана установка мета-пакета ubuntu-desktop: tasksel tasksel/first multiselect ubuntu-desktop доп. информация: Приложение B. Автоматическая установка с помощью списка ответов B.3. Создание файла ответов B.4. Содержимое файла ответов (для jessie) Automating Debian/Ubuntu Installs With Preseed

JSOUP заменить тег

#java #android #html #jsoup #парсер


Всем привет. Есть необходимость с помощью jsoup заменить тег  на