Поиск решения “Посудомоечной машины На Работе”

В моей системе в Git bash C: \ root - это просто /c/, а остальные каталоги оттуда есть, какими бы они ни были, поэтому это будет cd /c/test/build/.

Вы также можете сказать cd ../../build/.

Удачи.

9
задан Dan Rigby 2 May 2012 в 19:47
поделиться

12 ответов

Не имеет отношения к программированию, но может помочь ответить на ваш логический вопрос ... У моей посудомоечной машины есть индикатор "Чистый", который включается при запуске стиральной машины. Индикатор остается включенным, если вы просто открываете дверцу на короткое время (т.е. вынимаете чистую чашку), но гаснет, если вы держите дверцу открытой в течение более длительного времени (достаточно времени, чтобы опорожнить стиральную машину) Он не идеален, но он гораздо надежнее, чем флаг на передней панели, который должен быть (немного забывчивым) человеком.

2
ответ дан 4 December 2019 в 14:31
поделиться

I like your analogy, but the underlying problem worries me. In my experience, a well-designed system always knows (usually implicitly) the kind of state that you're referring to. For example, a resource in a shared resource queue is available for use by other processes -- if it weren't, it wouldn't be in the queue. Or, a resource being modified by a worker thread is in whatever state the thread's processing says it's in -- more importantly, no other thread needs to know whether it's "clean" or "dirty".

There's a mind-boggling number of valid design patterns that I haven't encountered (or invented :-) yet, but what you're describing has the hint of a design smell (or dirty dishes) rather than a valid pattern.

1
ответ дан 4 December 2019 в 14:31
поделиться

Я предполагаю, что все предметы в посудомоечной машине должны быть чистыми или грязными, но не смешиваться и не совмещаться. Решение ниже обеспечивает это свойство. Если нет, то ваша аналогия была не совсем правильной.

Всего несколько мьютексов должны сработать.

У вас есть четыре состояния.

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

Вы можете еще больше разложить пустые и грязные вместе, так как вы не заботятся о разнице.

  • Когда вы хотите что-то вставить, вы ждете на DirtyMutex
  • Когда вы хотите начать стирку, вы ждете на DirtyMutex, чтобы не тратить воду;)
  • Когда стирка окончена,
1
ответ дан 4 December 2019 в 14:31
поделиться

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

Решение просто. Создайте еще один объект Посудомоечная машина .

Одна Посудомоечная машина удерживает грязную посуду в ожидании ее очистки, другая - недавно очищенную посуду.

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

На этом этапе темы пользователя теперь могут помещать грязную посуду в то, что раньше чистая Посудомоечная машина (которая теперь пуста).

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

Примечание. Это решение не решает проблему голодания в чашке. Пользовательские потоки могут по-прежнему блокировать ожидание завершения очистки посудомоечной машиной.

Примечание 2: В стесненных условиях, где Посудомоечная машина является одноэлементной, также предоставьте KitchenCounterBuffer в качестве оператора посудомоечной машины , чтобы убирать посуду и помещать грязные блюда из KitchenCounterBuffer в посудомоечную машину . Затем KitchenCounterBuffer выполняет роль грязной посудомоечной машины в приведенном выше алгоритме. Однако это может привести к тому, что потоки пользователя сгенерируют исключения или умрут.

Это решение не решает проблему голодания. Пользовательские потоки могут по-прежнему блокировать ожидание завершения очистки посудомоечной машиной.

Примечание 2: В стесненных условиях, где Посудомоечная машина является одноэлементной, также предоставьте KitchenCounterBuffer в качестве оператора посудомоечной машины , чтобы убирать посуду и помещать грязные блюда из KitchenCounterBuffer в посудомоечную машину . Затем KitchenCounterBuffer выполняет роль грязной посудомоечной машины в приведенном выше алгоритме. Однако это может привести к тому, что потоки пользователя сгенерируют исключения или умрут.

Это решение не решает проблему голодания. Пользовательские потоки могут по-прежнему блокировать ожидание завершения очистки посудомоечной машиной.

Примечание 2: В стесненных условиях, где Посудомоечная машина является одноэлементной, также предоставьте KitchenCounterBuffer в качестве оператора посудомоечной машины , чтобы убирать посуду и помещать грязные блюда из KitchenCounterBuffer в посудомоечную машину . Затем KitchenCounterBuffer выполняет роль грязной посудомоечной машины в приведенном выше алгоритме. Однако это может привести к тому, что потоки пользователя сгенерируют исключения или умрут.

В стесненных условиях, где посудомоечная машина является одноэлементной, предоставьте KitchenCounterBuffer , а также DishwasherOperator , чтобы убирать посуду и ставить грязную посуду из KitchenCounterBuffer на Посудомоечная машина . Затем KitchenCounterBuffer выполняет роль грязной посудомоечной машины в приведенном выше алгоритме. Однако это может привести к тому, что потоки пользователя сгенерируют исключения или умрут.

В стесненных условиях, где посудомоечная машина является одноэлементной, предоставьте KitchenCounterBuffer , а также DishwasherOperator , чтобы убирать посуду и ставить грязную посуду из KitchenCounterBuffer на Посудомоечная машина . Затем KitchenCounterBuffer выполняет роль грязной посудомоечной машины в приведенном выше алгоритме. Однако это может привести к тому, что потоки пользователя сгенерируют исключения или умрут.

Затем KitchenCounterBuffer выполняет роль грязной посудомоечной машины в приведенном выше алгоритме. Однако это может привести к тому, что потоки пользователя сгенерируют исключения или умрут.

Затем KitchenCounterBuffer выполняет роль грязной посудомоечной машины в приведенном выше алгоритме. Однако это может привести к тому, что потоки пользователя сгенерируют исключения или умрут.

6
ответ дан 4 December 2019 в 14:31
поделиться

Простым решением этого является поддержание инвариантов, которые всегда верны. Примером такого набора инвариантов может быть:

  • Если посудомоечная машина пуста / не полностью заполнена - все блюда грязные
  • Если посудомоечная машина заполнена - тогда все блюда чистые.

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

0
ответ дан 4 December 2019 в 14:31
поделиться

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

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

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

0
ответ дан 4 December 2019 в 14:31
поделиться

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

--121 --- 1768065--

Идиома pimpl добавляет элемент void * private data в ваш класс, и это полезный метод, если вам нужно что-то быстрое и грязное. Однако у него есть свои недостатки. Главным среди них является то, что это затрудняет использование полиморфизма для абстрактного типа. Иногда вам может потребоваться абстрактный базовый класс и подклассы этого базового класса, собирать указатели на все различные типы в векторе и вызывать методы для них. Кроме того, если идиома pimpl состоит в том, чтобы скрыть детали реализации класса, то только почти завершается успешно: сам указатель является деталью реализации. Возможно, непрозрачная деталь реализации. Но деталь реализации тем не менее.

Существует альтернатива идиоме pimpl, которую можно использовать для удаления всех деталей реализации из интерфейса, предоставляя при этом базовый тип, который можно использовать полиморфно, если это необходимо.

В файле заголовка вашей DLL (тот # включается в клиентский код) создайте абстрактный класс только с общедоступными методами и концепциями, которые определяют, как должен создаваться экземпляр класса (например, общедоступные фабричные методы и методы клонирования):

kennel.h

/****************************************************************
 ***
 ***    The declaration of the kennel namespace & its members
 ***    would typically be in a header file.
 ***/

// Provide an abstract interface class which clients will have pointers to.
// Do not permit client code to instantiate this class directly.

namespace kennel
{
    class Animal
    {
    public:
        // factory method
        static Animal* createDog(); // factory method
        static Animal* createCat(); // factory method

        virtual Animal* clone() const = 0;  // creates a duplicate object
        virtual string speak() const = 0;   // says something this animal might say
        virtual unsigned long serialNumber() const = 0; // returns a bit of state data
        virtual string name() const = 0;    // retuyrns this animal's name
        virtual string type() const = 0; // returns the type of animal this is

        virtual ~Animal() {};   // ensures the correct subclass' dtor is called when deleteing an Animal*
    };
};

... Animal - это абстрактный базовый класс и, следовательно, не может быть создан; никакой частный ctor не должен быть объявлен. Наличие виртуального dtor гарантирует, что если кто-то удалит s Animal * , будет также вызван надлежащий dtor подкласса.

Для реализации различных подклассов базы тип (например, собаки и кошки), Вы бы объявили классы уровня реализации в своей DLL. Эти классы, в конечном счете, являются производными от абстрактного базового класса, который вы объявили в своем заголовочном файле, и методы фабрики фактически создали бы один из этих подклассов.

dll.cpp:

/****************************************************************
 ***
 ***    The code that follows implements the interface
 ***    declared above, and would typically be in a cc
 ***    file.
 ***/   

// Implementation of the Animal abstract interface
// this implementation includes several features 
// found in real code:
//      Each animal type has it's own properties/behavior (speak)
//      Each instance has it's own member data (name)
//      All Animals share some common properties/data (serial number)
//

namespace
{
    // AnimalImpl provides properties & data that are shared by
    // all Animals (serial number, clone)
    class AnimalImpl : public kennel::Animal    
    {
    public:
        unsigned long serialNumber() const;
        string type() const;

    protected:
        AnimalImpl();
        AnimalImpl(const AnimalImpl& rhs);
        virtual ~AnimalImpl();
    private:
        unsigned long serial_;              // each Animal has its own serial number
        static unsigned long lastSerial_;   // this increments every time an AnimalImpl is created
    };

    class Dog : public AnimalImpl
    {
    public:
        kennel::Animal* clone() const { Dog* copy = new Dog(*this); return copy;}
        std::string speak() const { return "Woof!"; }
        std::string name() const { return name_; }

        Dog(const char* name) : name_(name) {};
        virtual ~Dog() { cout << type() << " #" << serialNumber() << " is napping..." << endl; }
    protected:
        Dog(const Dog& rhs) : AnimalImpl(rhs), name_(rhs.name_) {};

    private:
        std::string name_;
    };

    class Cat : public AnimalImpl
    {
    public:
        kennel::Animal* clone() const { Cat* copy = new Cat(*this); return copy;}
        std::string speak() const { return "Meow!"; }
        std::string name() const { return name_; }

        Cat(const char* name) : name_(name) {};
        virtual ~Cat() { cout << type() << " #" << serialNumber() << " escaped!" << endl; }
    protected:
        Cat(const Cat& rhs) : AnimalImpl(rhs), name_(rhs.name_) {};

    private:
        std::string name_;
    };
};

unsigned long AnimalImpl::lastSerial_ = 0;


// Implementation of interface-level functions
//  In this case, just the factory functions.
kennel::Animal* kennel::Animal::createDog()
{
    static const char* name [] = {"Kita", "Duffy", "Fido", "Bowser", "Spot", "Snoopy", "Smkoky"};
    static const size_t numNames = sizeof(name)/sizeof(name[0]);

    size_t ix = rand()/(RAND_MAX/numNames);

    Dog* ret = new Dog(name[ix]);
    return ret;
}

kennel::Animal* kennel::Animal::createCat()
{
    static const char* name [] = {"Murpyhy", "Jasmine", "Spike", "Heathcliff", "Jerry", "Garfield"};
    static const size_t numNames = sizeof(name)/sizeof(name[0]);

    size_t ix = rand()/(RAND_MAX/numNames);

    Cat* ret = new Cat(name[ix]);
    return ret;
}


// Implementation of base implementation class
AnimalImpl::AnimalImpl() 
: serial_(++lastSerial_) 
{
};

AnimalImpl::AnimalImpl(const AnimalImpl& rhs) 
: serial_(rhs.serial_) 
{
};

AnimalImpl::~AnimalImpl() 
{
};

unsigned long AnimalImpl::serialNumber() const 
{ 
    return serial_; 
}

string AnimalImpl::type() const
{
    if( dynamic_cast<const Dog*>(this) )
        return "Dog";
    if( dynamic_cast<const Cat*>(this) )
        return "Cat";
    else
        return "Alien";
}

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

main.cpp:

std::string dump(const kennel::Animal* animal)
{
    stringstream ss;
    ss << animal->type() << " #" << animal->serialNumber() << " says '" << animal->speak() << "'" << endl;
    return ss.str();
}

template<class T> void del_ptr(T* p)
{
    delete p;
}

int main()
{
    srand((unsigned) time(0));

    // start up a new farm
    typedef vector<kennel::Animal*> Animals;
    Animals farm;

    // add 20 animals to the farm
    for( size_t n = 0; n < 20; ++n )
    {
        bool makeDog = rand()/(RAND_MAX/2) != 0;
        if( makeDog )
            farm.push_back(kennel::Animal::createDog());
        else
            farm.push_back(kennel::Animal::createCat());
    }

    // list all the animals in the farm to the console
    transform(farm.begin(), farm.end(), ostream_iterator<string>(cout, ""), dump);

    // deallocate all the animals in the farm
    for_each( farm.begin(), farm.end(), del_ptr<kennel::Animal>);

    return 0;
}
- 121 --- 2177359--

Метод запуска / выхода

// Get the parameters/arguments passed to program if any
string arguments = string.Empty;
string[] args = Environment.GetCommandLineArgs();
for (int i = 1; i < args.Length; i++) // args[0] is always exe path/filename
    arguments += args[i] + " ";

// Restart current application, with same arguments/parameters
Application.Exit();
System.Diagnostics.Process.Start(Application.ExecutablePath, arguments);

Это работает лучше, чем Application.Restart ();

Не уверен, как это происходит, если ваша программа защищает от нескольких экземпляров. Полагаю, вам лучше запустить второй .exe-файл, который приостанавливает работу, а затем запускает для вас основное приложение. --121 --- 835782--

В проекте MVC вы, как правило, имеете отображение из репозитория -> Доменные модели, а затем из Доменных моделей -> Просмотр моделей. Хотя модели просмотра часто содержат доменные объекты.

--121 --- 2917746--

Попробуйте scrotwm попробовать. Это оконный менеджер с мозаичными окнами по умолчанию, написанный кодировщиками, использующими vim!

и vimperator для Firefox делает мою жизнь намного, намного проще.

Для оболочек типа Bourne ( ksh, bash, ...) попробуйте set -o vi , чтобы ваша командная строка использовала клавиши vi.

--121 --- 2058075--

Я думаю, что простой код здесь лучше всего описать как пример подтипа ( http://en.wikipedia.org/wiki/Subtype ). В терминологии объектно-ориентированного программирования полиморфизм относится к способности подклассов изменять или специализировать поведение, определенное в базовом классе ( http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming ). Этот пример на самом деле не показывает этого.

Из вариантов, перечисленных в brainbench, я думаю, что наследование имеет больше смысла просто потому, что оно наиболее расплывчато.

--121 --- 3027152--

Я архитектор решений для решений воспроизведения. Они предоставляют «машину времени» для Java-приложений. Вы можете записать приложение во время его работы (скажем, в среде QA), а затем воспроизвести запись на своем компьютере разработчика. Вам не нужен доступ к базе данных, конфигурациям и т. Д. Все, что вам нужно, это их решение ReplayDIRECTOR, и вы можете отладить проблему в дружественных рамках вашей IDE. Проблемы, которые могут быть воспроизведены, варьируются от проблем конфигурации, исключений базы данных до проблем с многопоточностью. Посмотрите:

http://www.replaysolutions.com

--121 --- 3644235--

В блоге Барта де Смета есть некоторые умные способы использования LINQ, такие как Кто сказал, что предикаты LINQ должны быть булевозначными? .

--121 --- 2293022--

Вы действительно должны искать это, но в JSP это:

request.getRemoteHost()
- 121 --- 4214921--

Javascript:

var server = window.location.hostname;
- 121 --- 4214920--

Объект location имеет несколько свойств , и вам нужно hostname .

Или, при желании, вы можете просто использовать URL-адрес, относящийся к корню. и просто установите свойство pathname и вообще не связывайтесь с хост-бизнесом!

location.pathname = "/store/results/index.jsp";
- 121 --- 4214919--

С головы до головы ...

  • Vimperator для Firefox.
  • Awesome, оконный менеджер WMII, Xmonad или ion3.
  • Evince поддерживает hjkl.
  • vifm filemanager
  • есть привязки клавиш vi для readline, что позволяет использовать их во многих терминальных приложениях
  • xzgv image viewer
- 121 --- 2058053--

Я считаю, что реализация Lua - довольно хороший C-источник.Но языки немного странные в качестве примера проекта.

--121 --- 2387758--

Я предполагаю, что все предметы в посудомоечной машине должны быть чистыми или грязными, но не смешиваться и не совмещаться. Решение ниже обеспечивает это свойство. Если нет, ваша аналогия была не совсем правильной.

Всего несколько мьютексов должны сделать свое дело.

У вас есть четыре состояния.

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

Вы можете еще больше разложить пустые и грязные вместе, так как вы не заботьтесь о разнице.

  • Когда вы хотите что-то вставить, вы ждете на DirtyMutex
  • Когда вы хотите начать стирку, вы ждете на DirtyMutex, чтобы не тратить воду;)
  • Когда стирка окончена, --121 --- 3330357--

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

    Oracle и PostgreSql (DbLinq)
  • LINQ для NCover
  • LINQ для Opf3
  • LINQ для параллельного (PLINQ)
  • LINQ для файлов RDF
  • LINQ для общего доступа
  • LINQ для SimpleDB
  • LINQ to Streams
  • LINQ to WebQueries
  • LINQ to WMI
  • LINQ to XtraGrid
- 121 --- 2293018--

Мне нравится ваша аналогия, но основная проблема меня беспокоит. По моему опыту, хорошо спроектированная система всегда знает (обычно неявно) тип состояния, на которое вы ссылаетесь. Например, ресурс в очереди общих ресурсов доступен для использования другими процессами - если бы его не было, его бы не было в очереди. Или ресурс, изменяемый рабочим потоком, находится в том состоянии, в котором, по словам обработки потока, он находится - что более важно, ни одному другому потоку не требуется , чтобы знать, является ли он «чистым» или «грязным». --121 --- 3330358--

Что вам нужно:

request.getServerName()

Пример:

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
- 121 --- 4214918--

Поместите div в ваш newdiv с шириной : auto и margin-left: 20px

Удалите отступы из newdiv.

На странице модели W3 Box есть хорошая информация.

- 121 --- 602735--

Может быть Finite State Machine соответствует проблеме, которую вы хотите решить?

1
ответ дан 4 December 2019 в 14:31
поделиться

просто возьмите за правило всегда вынимать чистую посуду из посудомоечной машины, чтобы все, что внутри, было грязным, и вы могли добавить еще

1
ответ дан 4 December 2019 в 14:31
поделиться

Я видел коммерческие посудомоечные машины, которые отправляют посуду на конвейер через туннель. Вы ставите грязную посуду на полки слева. Вы берете чистую посуду со стоек справа. Состояние «чистый / грязный» отдельной посуды соответствует ее физическому расположению в машине.

Это совершенно другая архитектура. В стандартной посудомоечной машине вы воспринимаете «чистый / грязный» как атрибут посудомоечной машины. «Чистый» означает «не содержит грязной посуды». Для конвейерной посудомоечной машины «чистый / грязный» не является атрибутом посудомоечной машины.

Возможно, вы не захотите переключаться на эту архитектуру, но если вы это сделаете, рассмотрите серию объектов обработки, связанных параллельными очередями блокировки. Посуда попадает в устройство предварительного ополаскивания, выходит, входит в стиральную машину, выходит,

1
ответ дан 4 December 2019 в 14:31
поделиться

Можно ли настроить автоматическое выталкивание посуды в посудомоечную машину в конце цикла стирки?

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

0
ответ дан 4 December 2019 в 14:31
поделиться

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

Использовать съедобные тарелки?

0
ответ дан 4 December 2019 в 14:31
поделиться

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

Решением, которое позволяет избежать этих проблем, было бы сделать все блюда неизменяемыми. Если вам нужна грязная тарелка, вы просто создадите новый экземпляр с грязью в ней.

Если бы получение чистой копии тарелки было обычной операцией (что звучит так же в вашей ситуации), вы могли бы добавить. AsClean () к вашему объекту Dish, который автоматически вернет вам чистый клон. Если производительность стала узким местом, это можно было бы оптимизировать, вернув this , если экземпляр был уже чист.

Конечно, это предполагает, что вы '

1
ответ дан 4 December 2019 в 14:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: