text:
Q: Реализация Producer/Consumer pattern Паттерн producer/consumer достаточно часто встречается в многопоточном программировании. Его смысл состоит в том, что один или несколько потоков производят данные, и параллельно этому один или несколько потоков потребляют их.
Как правильно реализовать этот паттерн в популярных языках программирования? Задача сама по себе нетривиальна, поскольку включает синхронизацию между потоками, и потенциальную гонку между несколькими производителями и потребителями.

Справка.
Производящий поток (или потоки) называется «производитель», «поставщик» или просто «producer», потребляющий (-ие) — «потребитель» или «consumer».
Нетривиальность проблемы заключается в том, что потенциально как создание новых данных, так и их потребление могут занимать длительное время, и хотелось бы, чтобы обработка шла без простоев, на максимально возможной скорости.
Примеры:
Произведённые данные могут представлять вычислительно интенсивное задание. В этом случае разумно иметь единственный производящий поток, и несколько выполняющих потоков (например, столько, сколько в системе ядер процессора, если узкое место обработки — вычисления).
Или производящие потоки загружают данные из сети, а по окончанию загрузки выполняющие потоки производит разбор загруженных данных. В этом случае разумно иметь по одному производителю на сайт и, и ограничивать число производителей, если предел доступной скорости сети исчерпан.

Этот вопрос — адаптация одноименного исследования с Хэшкода.

A: Реализация на C#, библиотека Dataflow ("инверсный" алгоритм)
Отличие данного алгоритма от приведенного VladD "прямого" - в том, что используется очередь потребителей вместо очереди элементов.
Это позволяет избавиться от цикла приема в потребителе - ценой появления знания списка потребителей поставщиком данных. Иными словами, в такой конфигурации потребители выходят не активными - а пассивными.
Кроме того, сам алгоритм получается очень простым.
Потребитель в таком алгоритме не имеет никакого алгоритма, это лишь класс (или интерфейс либо вовсе делегат), в котором можно вызвать метод:
class Consumer
{
  public void Consume(string str)
  {
    Console.WriteLine(str);
  }
}

На стороне поставщика алгоритм немного сложнее:
BufferBlock<Consumer> consumers = new BufferBlock<Consumer>();

public async void SendToConsumer(string str)
{
  var consumer = await consumers.ReceiveAsync();
  try
  {
    consumer.Consume(str);
  }
  finally
  {
    consumers.Post(consumer);
  }
}

async Task Produce(int howmuch)
{
    Random r = new Random();
    while (howmuch-- > 0)
    {
        // эмулируем длительную работу по подготовке следующего задания
        // длительность выбираем случайно, чтобы задания приходили в
        // непредсказуемые моменты времени
        await Task.Delay(1000 * r.Next(1, 3));
        var v = string.Format("automatic {0}", r.Next(1, 10));
        SendToConsumer(v);
    }
}

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

*

*добавить в метод контракт класса Consumer требование обязательной обработки исключений;

*или же установить глобальный обработчик неперехваченных исключений.
А еще лучше - воспользоваться сразу обоими вариантами.
И еще один важный момент. Пассивность потребителя означает, в частности, что потребитель будет запущен в контексте синхронизации поставщика. Иногда это может быть нежелательным - в таком случае в код SendToConsumer следует добавить вызов Task.Run.
Иногда же, напротив, производителю нужно дождаться полной обработки порции данных. В таком случае надо сменить возвращаемое значение у метода SendToConsumer с void на Task.

A: Реализация на C#, Channels
Как подсказал в комментариях @aepot, начиная с .NET Core 3.0 (и .NET 5) появился ещё один специализированный инструмент: Channel. Очевидно, он пришёл под влиянием языка Go, и описывает, по сути, тот же паттерн Producer/Consumer, но реализованный более эффективно (за счёт меньшего числа фич).
Класс Channel<T> является, по сути, готовой реализацией, из коробки поддерживающей асинхронный интерфейс, отмену через CancellationToken, множественных производителей/потребителей и пакетное чтение/запись.
Интерфейс очень похож на интерфейс библиотеки Dataflow, и перевод кода в простых случаях не составит большого труда.
У производителя есть функция для записи одного элемента WriteAsync, а если мы хотим сразу записать несколько элементов подряд, может* оказаться лучше использовать WaitToWriteAsync и следом синхронный TryWrite в цикле. По окончанию добавления элементов нужно использовать Complete, чтобы проинформировать потребителей, что больше ждать нечего.
У потребителя есть функция ReadAsync для чтения одного элемента, и функция ReadAllAsync, которая похожа на GetConsumingEnumerable из BlockingCollection<T>: она выдаёт последовательность читаемых элементов (но асинхронно), распределяя их по всем потребителям. Если у вас элементы могут приходить большими партиями, вам может* подойти связка WaitToReadAsync + цикл с TryRead, чтобы не вызывать асинхронную функцию, когда новые задания скорее всего и так присутствуют в канале.
Итак, код производителя.
Простой вариант:
async Task ProduceSimple(ChannelWriter<string> writer, int howmuch)
{
    Random r = new();
    int n = 0;
    while (howmuch-- > 0)
    {
        // эмулируем длительную работу по подготовке следующего задания
        // длительность выбираем случайно, чтобы задания приходили в
        // непредсказуемые моменты времени
        await Task.Delay(1000 * r.Next(1, 3));
        await writer.WriteAsync($"simple {n++}");
    }
}

Вариант с множественной отправкой заданий:
async Task ProduceBatched(ChannelWriter<string> writer, int howmuch)
{
    Random r = new();
    int n = 0;
    while (howmuch > 0)
    {
        await Task.Delay(1000 * r.Next(1, 3));
        // в реальности, задания обычно приходят пачками, так что отправим сразу много
        await writer.WaitToWriteAsync(); // это не нужно, если объём очереди не ограничен
        // случайный размер пачки, вам скорее всего эта логика не будет нужна, т. к.
        // данные будут приходить группами естественным образом
        var batchSize = Math.Min(r.Next(1, 5), howmuch);
        while (batchSize-- > 0)
        {
            // подготовим задание
            var v = $"batched {n}";
            if (writer.TryWrite(v))
            {
                n++;
                --howmuch;
                if (howmuch <= 0)
                    break;
            }
            // подготовленное, но не отправленное задание нужно сохранить
            // для следующей итерации
        }
    }
}

Теперь код потребителя. Базовый вариант совсем простой:
async Task ConsumeSimple(ChannelReader<string> reader, int number)
{
    Random r = new();
    await foreach (var v in reader.ReadAllAsync())
    {
        Output(number, v);

        // симулируем длительную обработку результатов клиентом
        await Task.Delay(1000 * r.Next(0, 3));
    }
}

Если обработка одного задания быстрая, имеет смысл использовать вариант, в котором мы синхронно вычитываем все пришедшие данные раз за разом:
async Task ConsumeBatches(ChannelReader<string> reader, int number)
{
    Random r = new();
    while (await reader.WaitToReadAsync())
    {
        // вычитываем всё, что есть в канале, синхронно
        // в этой точке данные могут быть уже уйти другому потребителю,
        // так что цикл может оказаться пустым
        while (reader.TryRead(out var v))
            Output(number, v);

        // симулируем длительную обработку результатов клиентом
        await Task.Delay(1000 * r.Next(1, 3));
    }
}

Осталось добавить вызов и запустить:
async Task ProduceAll(ChannelWriter<string> writer)
{
    var p1 = ProduceSimple(writer, 20);
    var p2 = ProduceBatched(writer, 25);
    await Task.WhenAll(p1, p2);
    writer.Complete(); // не забываем завершить производителя!
}

Task ConsumeAll(ChannelReader<string> reader)
{
    var c1 = ConsumeSimple(reader, 1);
    var c2 = ConsumeBatches(reader, 2);
    return Task.WhenAll(c1, c2);
}

async Task RunAll()
{
    Channel<string> channel = Channel.CreateUnbounded<string>();
    var p = ProduceAll(channel.Writer);
    var c = ConsumeAll(channel.Reader);
    await Task.WhenAll(p, c);
}

Вспомогательная функция:
void Output(int readerNumber, string v)
{
    // цветной вывод и прочие плюшки
    // мне лень синхронизировать вывод на консоль, хотя конечно это разделяемый ресурс
    if (Console.CursorLeft != 0)
        Console.WriteLine();
    var savedColor = Console.ForegroundColor;
    Console.ForegroundColor = (ConsoleColor)(readerNumber + 8);
    var indent = new string(' ', readerNumber * 4);
    Console.WriteLine($"{indent}[reader #{readerNumber}]: {v}");
    Console.ForegroundColor = savedColor;
}

Ну и всё надо упаковать в программу:
class Program
{
    static async Task Main(string[] args) => await new Program().RunAll();
    // тут всё остальное

Если вы подружиесь с Channels, возможно, чтобы не изобретать велосипеды, имеет смысл использовать эту библиотеку.

*Как именно эффективнее: по одному элементу или в «пакетном» режиме — нельзя сказать заранее. Протестируйте оба варианта под нагрузкой, специфичной именно для вашего приложения. Для варианта «по одному» у вас может быть лишний асинхронный код (как бы не оптимизирован был ReadAsync, всё же ему нужно «крутить» состояние стейт-машины). Для варианта «пакетной» обработки вас может настигнуть проблема, когда множество ждущих потребителей (или производителей) одновременно просыпаются и лишь один из них получает ресурс. Профилируйте!
Спасибо @Pavel Mayorov за полезное обсуждение и примеры из личного опыта.

A: Реализация на C#
Для современных версий языка (начиная с C# 4.0), имеет смысл не писать реализацию вручную, а (руководствуясь советом @Flammable), воспользоваться классом BlockingCollection, представляющим нужную функциональность.
Для чтения в consumer-потоках используем просто циклы по последовательности, которую даёт GetConsumingEnumerable(). В producer-потоках пользуемся Add, и в конце не забываем CompleteAdding, чтобы consumer-потоки смогли остановиться.
Пример:
class Program
{
    static public void Main()
    {
        new Program().Run();
    }

    BlockingCollection<string> q = new BlockingCollection<string>();

    void Run()
    {
        var threads = new [] { new Thread(Consumer), new Thread(Consumer) };
        foreach (var t in threads)
            t.Start();

        string s;
        while ((s = Console.ReadLine()).Length != 0)
            q.Add(s);

        q.CompleteAdding(); // останавливаем

        foreach (var t in threads)
            t.Join();
    }

    void Consumer()
    {
        foreach (var s in q.GetConsumingEnumerable())
        {
            Console.WriteLine("Processing: {0}", s);
            Thread.Sleep(2000);
            Console.WriteLine("Processed: {0}", s);
        }
    }
}

BlockingCollection<T> позволяет ограничить количество элементов, так что попытка добавить элемент в переполненную очередь также может быть заблокирована до освобождения места.
Заметьте, что GetConsumingEnumerable корректно работает даже в случае, когда у вас много консьюмеров. Это не так уж и очевидно.

Если вы работаете со старой версией C#, вам придётся писать нужную функциональность вручную. Вы можете воспользоваться встроенным классом Monitor (который является аналогом mutex + condition variable из pthreads).
public class ProducerConsumer<T> where T : class
{
    object mutex = new object();
    Queue<T> queue = new Queue<T>();
    bool isDead = false;

    public void Enqueue(T task)
    {
        if (task == null)
            throw new ArgumentNullException("task");
        lock (mutex)
        {
            if (isDead)
                throw new InvalidOperationException("Queue already stopped");
            queue.Enqueue(task);
            Monitor.Pulse(mutex);
        }
    }

    public T Dequeue()
    {
        lock (mutex)
        {
            while (queue.Count == 0 && !isDead)
                Monitor.Wait(mutex);

            if (queue.Count == 0)
                return null;

            return queue.Dequeue();
        }
    }

    public void Stop()
    {
        lock (mutex)
        {
            isDead = true;
            Monitor.PulseAll(mutex);
        }
    }
}

Использование (аналогичный пример):
class Program
{
    static public void Main()
    {
        new Program().Run();
    }

    ProducerConsumer<string> q = new ProducerConsumer<string>();

    void Run()
    {
        var threads = new [] { new Thread(Consumer), new Thread(Consumer) };
        foreach (var t in threads)
            t.Start();

        string s;
        while ((s = Console.ReadLine()).Length != 0)
            q.Enqueue(s);

        q.Stop();

        foreach (var t in threads)
            t.Join();
    }

    void Consumer()
    {
        while (true)
        {
            string s = q.Dequeue();
            if (s == null)
                break;
            Console.WriteLine("Processing: {0}", s);
            Thread.Sleep(2000);
            Console.WriteLine("Processed: {0}", s);
        }
    }
}

A: Реализация на C с библиотекой pthreads
В C, в соответствии с духом языка, нет встроенных высокоуровневых синхронизирующихся коллекций. Наверное самой популярной и широко используемой библиотекой, реализующей многопоточность, является pthreads. С её помощью паттерн можно реализовать так:
#include <pthread.h>

// объявляем структуру данных для одного задания
struct producer_consumer_queue_item {
  struct producer_consumer_queue_item *next;
  // здесь идут собственно данные. вы можете поменять этот кусок,
  // использовав структуру, более специфичную для вашей задачи
  void *data;
};

// объявляем очередь с дополнительными структурами для синхронизации.
// в этой очереди будут храниться произведённые, но ещё не потреблённые задания.
struct producer_consumer_queue {
  struct producer_consumer_queue_item *head, *tail;
                              // head == tail == 0, если очередь пуста
  pthread_mutex_t lock;       // мьютекс для всех манипуляций с очередью
  pthread_cond_t cond;        // этот cond "сигналим", когда очередь стала НЕ ПУСТОЙ
  int is_alive;               // показывает, не закончила ли очередь свою работу
};

Теперь нам нужны процедуры добавления и извлечения заданий из очереди.
void
enqueue (void *data, struct producer_consumer_queue *q)
{
  // упакуем задание в новую структуру
  struct producer_consumer_queue_item *p = (typeof(p))malloc(sizeof(*p));
  p->data = data;
  p->next = 0;

  // получим "эксклюзивный" доступ к очереди заданий
  pthread_mutex_lock(&q->lock);
  // ... и добавим новое задание туда:
  if (q->tail)
    q->tail->next = p;
  else {
    q->head = p;
    // очередь была пуста, а теперь нет -- надо разбудить потребителей
    pthread_cond_broadcast(&q->cond);
  }
  q->tail = p;

  // разрешаем доступ всем снова
  pthread_mutex_unlock(&q->lock);
}

void *
dequeue(struct producer_consumer_queue *q)
{
  // получаем эксклюзивный доступ к очереди:
  pthread_mutex_lock(&q->lock);

  while (!q->head && q->is_alive) {
    // очередь пуста, делать нечего, ждем...
    pthread_cond_wait(&q->cond, &q->lock);
    // wait разрешает доступ другим на время ожидания
  }

  // запоминаем текущий элемент или 0, если очередь умерла
  struct producer_consumer_queue_item *p = q->head;

  if (p)
  {
    // и удаляем его из очереди
    q->head = q->head->next;
    if (!q->head)
      q->tail = q->head;
  }

  // возвращаем эксклюзивный доступ другим участникам
  pthread_mutex_unlock(&q->lock);

  // отдаём данные
  void *data = p ? p->data : 0; // 0 означает, что данных больше не будет
  free(p);
  return data;
}

Ещё нужна процедура для инициализации очереди:
struct producer_consumer_queue *
producer_consumer_queue_create()
{
  struct producer_consumer_queue *q = (typeof(q))malloc(sizeof(*q));
  q->head = q->tail = 0;
  q->is_alive = 1;
  pthread_mutex_init(&q->lock, 0);
  pthread_cond_init(&q->cond, 0);

  return q;
}

И процедура для закрытия очереди:
void
producer_consumer_queue_stop(struct producer_consumer_queue *q)
{
  // для обращения к разделяемым переменным необходим эксклюзивный доступ
  pthread_mutex_lock(&q->lock);
  q->is_alive = 0;
  pthread_cond_broadcast(&q->cond);
  pthread_mutex_unlock(&q->lock);
}

Отлично, у нас есть всё, что нам надо.
Как использовать это? Нужно:

*

*запустить несколько потоков-«производителей» и несколько «потребителей»

*придумать структуру данных для задания

Пример: (производитель — главный поток, потребители — 2 потока)
// это поток-потребитель
void *
consumer_thread (void *arg)
{
  struct producer_consumer_queue *q = (typeof(q))arg;

  for (;;) {
    void *data = dequeue(q);
    // это сигнал, что очередь окончена
    if (!data)
      break; // значит, пора закрывать поток

    char *str = (char *)data;
    // тут наша обработка данных
    printf ("consuming: %s\n", str);
    sleep(2);
    printf ("consumed: %s\n", str);
    free(str);
  }
  return 0;
}

int
main ()
{
  pthread_t consumer_threads[2];

  void *res = 0;

  char *in = NULL;
  size_t sz;

  // создадим очередь:
  struct producer_consumer_queue *q = producer_consumer_queue_create();

  // и потоки-«потребители»
  pthread_create(&consumer_threads[0], 0, consumer_thread, (void *)q);
  pthread_create(&consumer_threads[1], 0, consumer_thread, (void *)q);

  // главный цикл
  // получаем данные с клавиатуры:
  while (getline(&in, &sz, stdin) > 0) {
    enqueue(in, q);
    in = NULL;
  }

  producer_consumer_queue_stop(q);
  if (pthread_join(consumer_threads[0], &res) ||
      pthread_join(consumer_threads[1], &res))
    perror("join");

  return (long)res;
}

Это реализация задачи с "бесконечной" очередью. На практике же иногда (или почти всегда?) более полезно ограничить размер очереди и таким образом сбалансировать скорость производителей, иногда переводя их в спящее состояние, с возможностями потребителей.
Для этого немного изменим нашу producer_consumer_queue
struct producer_consumer_queue {
  struct producer_consumer_queue_item *head, *tail;
                              // head == tail == 0, если очередь пуста
  pthread_mutex_t lock;       // мьютекс для всех манипуляций с очередью
  pthread_cond_t condp;       // этот cond "сигналим", когда очередь стала НЕ ПУСТОЙ
  pthread_cond_t condc;       // этот cond "сигналим", когда в очереди ПОЯВИЛОСЬ СВОБОДНОЕ МЕСТО
  int is_alive;               // показывает, не закончила ли очередь свою работу
  int max, cnt,               // максимальный размер очереди и число заданий в ней
    pqcnt;                    // количество производителей, ждущих свободного места в очереди
};

Добавляем pthread_cond_t condc для "засыпания/пробуждения" потоков производителей, их счетчик в очереди на отправку сообщения и пару переменных, содержащих максимальный размер очереди и текущее количество заданий в ней.
Соответственно меняются функции для постановки задания в очередь (enqueue), выборки его из очереди (dequeue), инициализации очереди (producer_consumer_queue_create) и ее остановки (producer_consumer_queue_stop):
void
enqueue (void *data, struct producer_consumer_queue *aq)
{
  volatile struct producer_consumer_queue *q = aq;
  // упакуем задание в новую структуру
  struct producer_consumer_queue_item *p = (typeof(p))malloc(sizeof(*p));
  p->data = data;
  p->next = 0;

  // получим "эксклюзивный" доступ к очереди заданий
  pthread_mutex_lock(&aq->lock);

  // проверим не переполнена ли она
  if (q->max <= q->cnt) {
    q->pqcnt++;
    asm volatile ("" : : : "memory");
    // зафиксируем изменения очереди в памяти
    // будем ждать пока потребители ее слегка не опустошат
    while(q->max <= q->cnt & q->is_alive)
      pthread_cond_wait(&aq->condc, &aq->lock);
    q->pqcnt--;
    asm volatile ("" : : : "memory");
  }
  // ... и добавим новое задание туда:
  if (q->tail)
    q->tail->next = p;
  else {
    q->head = p;
    // очередь была пуста, а теперь нет -- надо разбудить потребителей
    pthread_cond_broadcast(&aq->condp);
  }
  q->tail = p;
  q->cnt++;
  asm volatile ("" : : : "memory");

  // разрешаем доступ всем снова
  pthread_mutex_unlock(&aq->lock);
}

void *
dequeue(struct producer_consumer_queue *aq)
{
  volatile struct producer_consumer_queue *q = aq;
  // получаем эксклюзивный доступ к очереди:
  pthread_mutex_lock(&aq->lock);

  if (q->pqcnt && q->max > q->cnt)
    // в очереди есть место, а кто-то спит, разбудим их
    pthread_cond_broadcast(&aq->condc);

  while (!q->head && q->is_alive) {
    // очередь пуста, делать нечего, ждем...
    pthread_cond_wait(&aq->condp, &aq->lock);
    // wait разрешает доступ другим на время ожидания
  }

  // запоминаем текущий элемент или 0, если очередь умерла
  struct producer_consumer_queue_item *p = q->head;
  if (p) {
    // и удаляем его из очереди
    q->head = q->head->next;
    if (!q->head)
      q->tail = q->head;
    q->cnt--;
    asm volatile ("" : : : "memory");
    // зафиксируем изменения очереди в памяти
    // разбудим поставщиков в их очереди
    pthread_cond_broadcast(&aq->condc);
  }

  // возвращаем эксклюзивный доступ другим участникам
  pthread_mutex_unlock(&aq->lock);

  // отдаём данные
  void *data = p ? p->data : 0; // 0 означает, что данных больше не будет
  free(p);
  return data;
}

struct producer_consumer_queue *
producer_consumer_queue_create(int max)
{
  struct producer_consumer_queue *q = (typeof(q))malloc(sizeof(*q));
  q->head = q->tail = 0;
  q->is_alive = 1;
  q->max = max;
  q->cnt = 0;
  q->pqcnt = 0;
  pthread_mutex_init(&q->lock, 0);
  pthread_cond_init(&q->condc, 0);
  pthread_cond_init(&q->condp, 0);

  return q;
}

// И процедура для закрытия очереди:

void
producer_consumer_queue_stop(struct producer_consumer_queue *aq)
{
  volatile struct producer_consumer_queue *q = aq;
  // для обращения к разделяемым переменным необходим эксклюзивный доступ
  pthread_mutex_lock(&aq->lock);
  q->is_alive = 0;
  asm volatile ("" : : : "memory");
  pthread_cond_broadcast(&aq->condc);
  pthread_cond_broadcast(&aq->condp);
  pthread_mutex_unlock(&aq->lock);
}

Здесь же показан memory barrier (asm volatile ("" : : : "memory");), использование которого запрещает компилятору переупорядочивать операции чтения-записи из RAM.
Данная реализация не обеспечивает "упорядоченность" производителей, ожидающих своей очереди для отправки сообщения. Т.е. поток производитель, "заснувший" первым из-за отсутствия свободного места в очереди не обязательно проснется первым.
Если такое поведение нас не устраивает, то придется внести некоторые изменения в наши данные, прежде всего добавив очередь поставщиков из структур producer_queue_item (которая будет частью структуры producer_consumer_queue.
Получаем следующие структуры данных:
// объявляем структуру данных для одного задания
struct producer_consumer_queue_item {
  struct producer_consumer_queue_item *next;
  // здесь идут собственно данные. вы можете поменять этот кусок,
  // использовав структуру, более специфичную для вашей задачи
  void *data;
};

// струкура данных для спящего (ждущего свободного места) потока-производителя
struct producer_queue_item {
  struct producer_queue_item *next;
  struct producer_consumer_queue_item *item; // данные для которых нет места
  pthread_cond_t cond;  // этот cond "сигналим", когда в очереди появилось место

#if DEBUG
  pid_t tid;    // linux thread id for debug print
  int signaled; // индикатор "побудки" for debug print
#endif
};

// объявляем очередь данных с дополнительными структурами для синхронизации.
// в этой очереди будут храниться произведённые, но ещё не потреблённые задания.
struct producer_consumer_queue {
  struct producer_consumer_queue_item *head, *tail;
                              // head == tail == 0, если очередь пуста
  pthread_mutex_t lock;       // мьютекс для всех манипуляций с очередью
  pthread_cond_t cond;        // этот cond "сигналим", когда очередь стала НЕ ПУСТОЙ
  int is_alive;               // показывает, не закончила ли очередь свою работу
  int max, cnt;               // максимальный размер очереди и число заданий в ней
  // очередь  потоков-производителей, ждущих свободного места для своих данных
  struct producer_queue_item *pqhead,
    *pqtail;
};

и реализацию основных функций:
void
enqueue (void *data, struct producer_consumer_queue *q)
{
  volatile struct producer_consumer_queue *vq = q;
  // упакуем задание в новую структуру
  struct producer_consumer_queue_item *p = (typeof(p))malloc(sizeof(*p));
  p->data = data;
  p->next = 0;

  // получим "эксклюзивный" доступ к очереди заданий
  pthread_mutex_lock(&q->lock);

#if DEBUG
  printf("%ld (cnt: %d) ---> %s", (long)gettid(), vq->cnt, (char *)(p->data));
#endif

  // ... и добавим новое задание туда:
  if (vq->max <= vq->cnt || vq->pqtail) {// производитель должен ждать

#if DEBUG
    if (vq->cnt < vq->max) {
      puts("========================");
      print_queue(q, 0);
      puts("========================");
    }
#endif

    struct producer_queue_item *pq = (typeof(pq))malloc(sizeof(*pq));
    pthread_cond_init(&pq->cond, 0);  // cond по которому его разбудят
    pq->next = 0;
    pq->item = p;  // сохраним данные на время сна

#if DEBUG
    pq->tid = gettid();
#endif

    // поместим себя в очередь спящих производителей
    if (vq->pqtail)
      vq->pqtail->next = pq;
    else
      vq->pqhead = pq;
    vq->pqtail = pq;
    asm volatile ("" : : : "memory");
    // зафиксируем изменения очереди в памяти

#if DEBUG
    int at = 0; // счетчик циклов пробуждения
#endif

    do { // пойдем спать до появления свободного места в очереди данных

#if DEBUG
      printf ("%ld prod cond wait (cnt: %d  at: %d) %s",
          (long)gettid(), vq->cnt, at++, (char *)(p->data));
      pq->signaled = 0;
#endif

      pthread_cond_wait(&pq->cond, &q->lock);
    } while(vq->max <= vq->cnt && vq->is_alive);
    // проснулись и владеем очередью

    /*
      Вот тонкий момент. Порядок активизации потоков не определен,
      а нам надо соблюдать очередность данных.
      Поэтому переустановим локальные переменные из очереди,
      хотя это могут быть данные, положенные туда другим потоком.
    */
#if DEBUG
    if (pq != vq->pqhead) {
      printf ("BAAAD %ld (cnt: %d  at: %d) %s",
          (long)gettid(), vq->cnt, at, (char *)(p->data));
      print_queue(q, 0);
      if (vq->is_alive)
    exit(1); // совсем плохо, такого быть не должно
      else
    puts("CONTINUE");
    }
#endif

    pq = vq->pqhead;  // в любом случае берем голову очереди производителей
    if ((vq->pqhead = pq->next) == 0) // и удаляем ее
      vq->pqtail = 0;
    asm volatile ("" : : : "memory");
    p = pq->item;
    free(pq);

#if DEBUG
    printf ("%ld prod enqueued after wait (cnt: %d  at: %d) %s",
        (long)gettid(), vq->cnt, at, (char *)(p->data));
#endif

  }

  // вот тут реально кладем data в очередь для потребителей
  if (vq->tail)
    vq->tail->next = p;
  else {
    vq->head = p;
    // очередь была пуста, а теперь нет -- надо разбудить потребителей
    pthread_cond_broadcast(&q->cond);
  }
  vq->tail = p;
  vq->cnt++;
  asm volatile ("" : : : "memory");
  // сбросим изменения очереди в память

  // разрешаем доступ всем снова
  pthread_mutex_unlock(&q->lock);
}

#if DEBUG
#define cond_signal_producer(q) ({          \
      if ((q)->pqhead) {                \
      (q)->pqhead->signaled = 1;            \
      pthread_cond_signal(&(q)->pqhead->cond);  \
      }                         \
    })
#else
#define cond_signal_producer(q) ({          \
      if ((q)->pqhead)                  \
      pthread_cond_signal(&(q)->pqhead->cond);  \
    })
#endif

void *
dequeue(struct producer_consumer_queue *q)
{
  volatile struct producer_consumer_queue *vq = q;

  // получаем эксклюзивный доступ к очереди:
  pthread_mutex_lock(&q->lock);

  // если есть спящие производители, то разбудим первого
  cond_signal_producer(vq);
  while (!vq->head && vq->is_alive) {
    // очередь пуста, делать нечего, ждем...
    pthread_cond_wait(&q->cond, &q->lock);
    // wait разрешает доступ другим на время ожидания
  }

  // запоминаем текущий элемент или 0, если очередь умерла
  struct producer_consumer_queue_item *p = vq->head;
  if (p) {
    // и удаляем его из очереди
    vq->head = vq->head->next;
    if (!vq->head)
      vq->tail = vq->head;
    vq->cnt--;
    asm volatile ("" : : : "memory");
    // сбросим изменения очереди в память
    // разбудим первого поставщика в их очереди
    cond_signal_producer(vq);
  }

  // возвращаем эксклюзивный доступ другим участникам
  pthread_mutex_unlock(&q->lock);

  // отдаём данные
  void *data = p ? p->data : 0; // 0 означает, что данных больше не будет
  // согласно 7.20.3.2/2, можно не проверять на 0
  free(p);
  return data;
}

struct producer_consumer_queue *
producer_consumer_queue_create(int max)
{
  struct producer_consumer_queue *q = (typeof(q))malloc(sizeof(*q));
  q->head = q->tail = 0;
  q->pqhead = q->pqtail = 0;
  q->is_alive = 1;
  q->max = max;
  q->cnt = 0;
  pthread_mutex_init(&q->lock, 0);
  pthread_cond_init(&q->cond, 0);

  return q;
}

// И процедура для закрытия очереди:

void
producer_consumer_queue_stop(struct producer_consumer_queue *q)
{
  volatile struct producer_consumer_queue *vq = q;
  // для обращения к разделяемым переменным необходим эксклюзивный доступ
  pthread_mutex_lock(&q->lock);

  vq->is_alive = 0;
  pthread_cond_broadcast(&q->cond); // разбудим потребителей
  volatile struct producer_queue_item *pq;
  for (pq = vq->pqhead; pq; pq = pq->next) {
#if DEBUG
    pq->signaled = 1;
    asm volatile ("" : : : "memory");
#endif
    // будим каждого ждущего производителя
    pthread_cond_signal((pthread_cond_t *)&pq->cond);
  }

  pthread_mutex_unlock(&q->lock);
}

Все три программы (pq1.c, pq2.c и pq3.c) вместе с функцией gettid() находятся в http://pastebin.com/E23r9DZk . Для экспериментов скопируйте их в разные файлы и компилируйте, например, gcc pq3.c -pthread gettid.o

A: Реализация на C#, библиотека Dataflow
Ещё одной альтернативой является использование Майкрософтовской библиотеки Dataflow, которая собственно и создана для того, чтобы управлять потоками данных. Для использования кода в примерах, вам нужно подключить NuGet-пакет Microsoft.Tpl.Dataflow. Класс BufferBlock<T> практически является готовым producer/consumer'ом, но, в отличие от блокирующего интерфейса BlockingCollection<T>, он имеет async-интерфейс!
Для асинхронного добавления задания поставщик может воспользоваться SendAsync. Асинхронное добавление нужно, так как очередь может быть ограниченной длины, а значит, добавление должно будет дожидаться наличия свободного места! По окончанию добавления нужно вызвать Complete.
async Task ProduceSingle(ITargetBlock<string> queue, int howmuch)
{
    Random r = new Random();
    while (howmuch-- > 0)
    {
        // эмулируем длительную работу по подготовке следующего задания
        // длительность выбираем случайно, чтобы задания приходили в
        // непредсказуемые моменты времени
        await Task.Delay(1000 * r.Next(1, 3));
        var v = string.Format("automatic {0}", r.Next(1, 10));
        await queue.SendAsync(v);
    }
    queue.Complete();
}

Если у вас несколько поставщиков, закрывать очередь нужно лишь когда они все отработают:
async Task Produce1(ITargetBlock<string> queue, int howmuch)
{
    Random r = new Random();
    while (howmuch-- > 0)
    {
        await Task.Delay(1000 * r.Next(1, 3));
        var v = string.Format("automatic {0}", r.Next(1, 10));
        await queue.SendAsync(v);
    }
}

// функция Console.ReadLine() -- блокирующая, поэтому выполняем её асинхронно
// (иначе она заблокирует вызывающий поток)
// у Console нет async-интерфейса.
Task<string> ReadConsole()
{
    // блокирующую функцию выгружаем в thread pool
    return Task.Run(() => Console.ReadLine());
}

async Task Produce2(ITargetBlock<string> queue)
{
    string s;
    while ((s = await ReadConsole()).Length != 0)
        await queue.SendAsync("manual " + s);
}

async Task ProduceAll(ITargetBlock<string> queue)
{
    var p1 = Produce1(queue, 20);
    var p2 = Produce2(queue);
    await Task.WhenAll(p1, p2);
    queue.Complete();
}

Теперь, потребитель. Если потребитель лишь один, всё просто:
async Task ConsumeSingle(ISourceBlock<string> queue)
{
    while (await queue.OutputAvailableAsync())
        Console.WriteLine(await queue.ReceiveAsync());
}

Для случая нескольких потребителей использовать ReceiveAsync — неверно, так как задание может быть взято из очереди другим потребителем! Функции TryReceiveAsync тоже нету, поэтому после асинхронного выяснения того, что очередь не пуста, используем TryReceive:
async Task ConsumeCooperative(IReceivableSourceBlock<string> queue, int number)
{
    Random r = new Random();
    while (await queue.OutputAvailableAsync())
    {
        string v;
        // в этой точке данные могут быть уже уйти другому потребителю
        if (!queue.TryReceive(out v))
            continue; // продолжаем ждать

        // цветной вывод и прочие плюшки
        // мне лень синхронизировать вывод на консоль, хотя конечно это разделяемый ресурс
        if (Console.CursorLeft != 0)
            Console.WriteLine();
        var savedColor = Console.ForegroundColor;
        Console.ForegroundColor = (ConsoleColor)(number + 8);
        Console.WriteLine(string.Format("{0}[{1}]: {2}",
                          new string(' ', number * 4), number, v));
        Console.ForegroundColor = savedColor;

        // симулируем длительную обработку результата клиентом
        await Task.Delay(1000 * r.Next(1, 3));
    }
}

Task ConsumeAll(IReceivableSourceBlock<string> queue)
{
    var c1 = ConsumeCooperative(queue, 1);
    var c2 = ConsumeCooperative(queue, 2);
    return Task.WhenAll(c1, c2);
}

Осталась обвязка:
class Program
{
    static void Main(string[] args)
    {
        new Program().RunAll().Wait();
    }

    async Task RunAll()
    {
        BufferBlock<string> queue = new BufferBlock<string>();
        var p = ProduceAll(queue);
        var c = ConsumeAll(queue);
        await Task.WhenAll(p, c, queue.Completion);
    }

    // остальные методы
}

В своей статье Async Producer/Consumer Queue using Dataflow Stephen Cleary предлагает другой подход, более в духе библиотеки Dataflow. В ней заложена симметрия между блоками-источниками (ISourceBlock<T>), блоками-приёмниками (ITargetBlock<T>), и блоками-преобразователями (IPropagatorBlock<TInput, TOutput>). В соответствии с этой идеологией, мы применяем для поставщика блок-приёмник ActionBlock<T>:
Task Consume2(ISourceBlock<string> queue, int number)
{
    var consumerOptions = new ExecutionDataflowBlockOptions { BoundedCapacity = 1 };
    var consumer = new ActionBlock<string>(v => ConsumeImpl2(v, number), consumerOptions);
    var linkOptions = new DataflowLinkOptions { PropagateCompletion = true };
    queue.LinkTo(consumer, linkOptions);
    return consumer.Completion;
}

void ConsumeImpl2(string v, int number)
{
    Console.WriteLine(string.Format("[{0}]: {1}", number, v));
    Thread.Sleep(1500);
}

Task ConsumeAll2(ISourceBlock<string> queue)
{
    var c1 = Consume2(queue, 1);
    var c2 = Consume2(queue, 2);
    return Task.WhenAll(c1, c2);
}

Для чего нужно BoundedCapacity = 1? Дел в том, что по умолчанию ActionBlock<T> имеет «неограниченную» ёмкость, и таким образом за раз потребит все данные из очереди. Таким образом, если мы ввели ограничение на объём очереди
queue = new BufferBlock<string>(new DataflowBlockOptions { BoundedCapacity = 20 });

то данные будут всё равно накапливаться в ActionBlock'е. Чтобы роль хранилища исполнялась BufferBlock'ом, а потребителя — ActionBlock, и нужно ограничить его объём. Заметьте также, что ограничение ёмкости ActionBlock'а позволяет библиотеке Dataflow балансировать нагрузку, отправляя данные свободному блоку.
Заметьте, что в этом случае то, в каком контексте (пул потоков? выделенный поток?) исполняется ActionBlock, управляется не через стандартный механизм async/await, а посредством TaskScheduler'а в настройках.
Подход со стыковкой блоков выполнения может быстро стать слишком тяжеловесным, поэтому я советовал бы использовать его лишь для достаточно сложных задач.


text:
Q: JavaScript Print function issue When I clicked Ön Izleme (Span/Button) , i come the back i cant use my JavaScript Function Like Draggable Resize method on my divs. Do anyone can help me ? Önizleme Button job is print
When i back to from print screen i cant use my JavaScript function Like Draggable and resize. What is the my fault do anyone can help me?
<!DOCTYPE html>

<link href="http://code.jquery.com/ui/1.10.4/themes/ui-lightness/jquery-ui.css" rel="stylesheet">

  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>AdminLTE 2 | Calendar</title>

  <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">

  <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">

  <link rel="stylesheet" href="dist/css/AdminLTE.min.css">

  <link rel="stylesheet" href="dist/css/skins/_all-skins.min.css">

    <button class="btn btn-danger dropdown-toggle" type="button" data-toggle="dropdown">Alan Ekle
    </button>

Isim

SoyIsim

Adress

Numara

Yaş

Tanıdık 1

 Ekle

      <input style="margin-left :10px ; height:32px " type="text" class="col-xs-1" id="EkAlan">

       Ek Alan Ekle

    Ön İzleme
    Ana Sayfa

<input style="margin-left :10px ; height:32px " type="text" class="col-xs-1" id="YaziBoyutu" placeholder="Yazı Boyutu">

 Değiştir

    <button class="btn btn-danger dropdown-toggle" type="button" data-toggle="dropdown">Yazı Font
    </button>

Georgia

Palatino Linotype

Book Antiqua

Times New Roman

Arial

Helvetica

Arial Black

Impact

Lucida Sans Unicode

Tahoma

Verdana

Courier New

Lucida Console

 Yazi Stil Değiştir

A: It's not an optimal solution but can you try replacing CiktiGetir function with this:
function CiktiGetir(e){
    var htmlElement = document.querySelector("html");
    var printContents = document.getElementById("Kolonlar");

    // Make body invisible, append new element to HTML
    document.body.style.display = "none";
    htmlElement.appendChild(printContents);

    window.print();

    // Make body visible again, remove the added element
    document.body.style.display = "initial";
    htmlElement.removeChild(printContents);
}

Replacing HTML content breaks the JS events and dynamic contents.

A: You are replacing the body HTML
document.body.innerHTML = printContents;
window.print();
document.body.innerHTML = originalContents;

So you will need to reatach the events.
Try the "on" jquery method. Something like
$(document).on('click', '#CiktiGetir', function() { CiktiGetir(); });

A: My code was just an example. You will have to adapt it to your code.
You need to reatach the events after replace body content.
If, you dont want to to this, you can refresh the entire page.
function CiktiGetir(e){
    var KolonlarinChildren=document.getElementsByClassName("divKolon");
     var printContents = document.getElementById("Kolonlar");
     printContents=printContents.innerHTML;
     document.body.innerHTML = printContents;
     window.print();
     location.reload();
}

redpajama_set_name: RedPajamaStackExchange


text:
Q: POST Request with content type "application/x-www-form-urlencoded" is not working in server(QA,UAT...) but works fine locally Below is my POST Request
    request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Method = "POST";
request.ContentLength = data.Length;
 if (timeoutOverride.HasValue)
        {
            timeout = timeoutOverride.Value;
        }
        else
        {
            timeout = GetTimeoutForUrl(request.RequestUri);
        }

    using (var streamWriter = new StreamWriter(request.GetRequestStream()))
        {
            streamWriter.Write(data);
            streamWriter.Flush();
            streamWriter.Close();
        }

       var asyncResult = request.BeginGetResponse(null, null);
        string responseData;
        try
        {
            using (asyncResult.AsyncWaitHandle)
            {
                bool complete = asyncResult.AsyncWaitHandle.WaitOne(timeout);
                if (!complete)
                {
                    ThrowTimeoutError(url, timeout);
                }
                using (var webResponse = request.EndGetResponse(asyncResult))
                {
                    using (var responseStream = webResponse.GetResponseStream())
                    {
                        using (var responseStreamReader = new                StreamReader(responseStream))
                        {
                            responseData = responseStreamReader.ReadToEnd();
                        }
                    }
                }
            }

please help me out , how to make it work on server, i am thinking it is server configuration issue. or else issue with my request, it works locally fine, not working on server.

A: You need to specify MIME types in server
IIS settings, MIME types needs to included.
http://technet.microsoft.com/en-us/library/cc725608%28v=ws.10%29.aspx
https://www.rfc-editor.org/rfc/rfc2045


text:
Q: Getting a git error when trying to install mysql with brew I'm installing mysql on OS Mojave with brew. I got this error:
Stack:
  0   __exceptionPreprocess (in CoreFoundation)
  1   objc_exception_throw (in libobjc.A.dylib)
  2   -[DVTExtension valueForKey:error:] (in DVTFoundation)
  3   _IDEInitializeOnePlugInAndPrerequisites (in IDEFoundation)
  4   _IDEInitializePlugIns (in IDEFoundation)
  5   IDEInitialize (in IDEFoundation)
  6   -[Xcode3CommandLineBuildTool run] (in Xcode3Core)
  7  0x0000000103785202 (in xcodebuild)
  8   start (in libdyld.dylib)

sh: line 1: 10700 Abort trap: 6
/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -sdk macosx -find git 2> /dev/null
git: error: unable to find utility "git", not a developer tool or in PATH
Error: Failure while executing; `git config --local --replace-all homebrew.private true` exited with 72.

Does anyone know why this is happening?


text:
Q: Not able to trim the string which is fetched from mysql db and insert into another table using jmeter I am not able to trim the string which is fetched from mysql db and insert into another table using jmeter
In Jmeter, using JDBC request I am able to fetch data from database. In my table there are 2 coloumns. One is a data coloumn and other is ID. My requirement is I want to retreive all data(which is a string with comma seperated) and need to trim the data based on comma seperation.
For eg: "=XXXXIoT2?data=$XXXX,P10,999194446131444,20170308170009,14,1"
Then these trimmed strings need to be inserted into seperate coloumns of a table. How can i acheive this? Kindly help me

A: If the ID is 1, you can use below snippet to retrieve the ID.
String mystring = "=XXXXIoT2?data=$XXXX,P10,999194446131444,20170308170009,14,1";
String[] aftersplit = mystring.split(",");
System.out.println(aftersplit[aftersplit.length-1]);


text:
Q: Sign up using G+ (Google+) using kivy I am working on some android application and want to add Sign up functionality for users.
Users are expected to sign up using google+ or Facebook.
Any idea how to do this using python and kivy?
This link is great, but need a little help from python developers.

A: The link in your question shows how to call the Google Play Services API to sign in. To call the API from Python, you need to use a library called Pyjnius which is mentioned on the Kivy docs to wrap the Android classes in a Python class.
You should be able to do something similar with the Facebook API after installing the Facebook SDK for Android. Some users have found problems integrating these SDKs into their Kivy projects, with some discussion and solutions here.


text:
Q: Abstract the delete link for a polymorphic model used in a nested controller Question
In a polymorphic model, thats used in nested controllers, how can I abstract my delete link's path so I'm not hardcoding upload_permitted_user_path(@permissible, permitted_user)?
Details
I have a polymorphic model called permitted users. Basically theres a bunch of objects in my application where we need to control who can see it. So a post, photo, etc can have permitted users.
I want to be able to delete permitted users on the post#edit, photo#edit, etc pages.
I have this line:
# Used in "posts#edit"
<%= link_to 'Delete',
  post_permitted_user_path(@permissible, permitted_user), # This should not be hardcoded.
  method: :delete,
  data: { confirm: 'Are you sure?' } %>

# Used in "photos#edit"
<%= link_to 'Delete',
  photo_permitted_user_path(@permissible, permitted_user), # This should not be hardcoded.
  method: :delete,
  data: { confirm: 'Are you sure?' } %>

How can I abstract the path so I'm not hardcoding <MY_TOP_LEVEL_CLASS>_permitted_user_path(@permissible, permitted_user)?

A: Found the answer (feel free to repost and I'll accept :P)
Creating polymorphic links is easy using "polymorphic routes".
You can easily generate the proper link using polymorphic_url([@top_resource, @next_level_resource]) in any view.
For example:
polymorphic_url([:admin, @article, @comment]) becomes admin_article_comment_url(@article, @comment).
Another example without the leading :admin:
polymorphic_url([@article, @comment]) becomes article_comment_url(@article, @comment).


text:
Q: Synchronization when reading a file using multiprocessing in Python I have a python function that reads random snippets from a large file and does some processing on it. I want the processing to happen in multiple processes and so make use of multiprocessing. I open the file (in binary mode) in the parent process and pass the file descriptor to each child process then use a multiprocessing.Lock() to synchronize access to the file. With a single worker things work as expected, but with more workers, even with the lock, the file reads will randomly return bad data (usually a bit from one part of the file and a bit from the another part of the file). In addition, the position within the file (as returned by file.tell()) will often get messed up. This all suggests a basic race condition accessing the descriptor, but my understanding is the multiprocessing.Lock() should prevent concurrent access to it. Does file.seek() and/or file.read() have some kind of asynchronous operations that don't get contained within the lock/unlock barriers? What is going here?
An easy workaround is to have each process open the file individually and get its own file descriptor (I've confirmed this does work), but I'd like to understand what I'm missing. Opening the file in text mode also prevents the issue from occurring, but doesn't work for my use case and doesn't explain what is happening in the binary case.
I've run the following reproducer on a number of Linux systems and OS X and on various local and remote file systems. I always get quite a few bad file positions and at least a couple of checksum errors. I know the read isn't guaranteed to read the full amount of data requested, but I've confirmed that is not what is happening here and omitted that code in an effort to keep things concise.
import argparse
import multiprocessing
import random
import string

def worker(worker, args):
    rng = random.Random(1234 + worker)
    for i in range(args.count):
        block = rng.randrange(args.blockcount)
        start = block * args.blocksize
        with args.lock:
            args.fd.seek(start)
            data = args.fd.read(args.blocksize)
            pos = args.fd.tell()
            if pos != start + args.blocksize:
                print(i, "bad file position", start, start + args.blocksize, pos)
            cksm = sum(data)
            if cksm != args.cksms[block]:
                print(i, "bad checksum", cksm, args.cksms[block])

args = argparse.Namespace()
args.file = '/tmp/text'
args.count = 1000
args.blocksize = 1000
args.blockcount = args.count
args.filesize = args.blocksize * args.blockcount
args.num_workers = 4

args.cksms = multiprocessing.Array('i', [0] * args.blockcount)
with open(args.file, 'w') as f:
    for i in range(args.blockcount):
        data = ''.join(random.choice(string.ascii_lowercase) for x in range(args.blocksize))
        args.cksms[i] = sum(data.encode())
        f.write(data)
args.fd = open(args.file, 'rb')
args.lock = multiprocessing.Lock()

procs = []
for i in range(args.num_workers):
    p = multiprocessing.Process(target=worker, args=(i, args))
    procs.append(p)
    p.start()

Example output:
$ python test.py
158 bad file position 969000 970000 741000
223 bad file position 908000 909000 13000
232 bad file position 679000 680000 960000
263 bad file position 959000 960000 205000
390 bad file position 771000 772000 36000
410 bad file position 148000 149000 42000
441 bad file position 677000 678000 21000
459 bad file position 143000 144000 636000
505 bad file position 579000 580000 731000
505 bad checksum 109372 109889
532 bad file position 962000 963000 243000
494 bad file position 418000 419000 2000
569 bad file position 266000 267000 991000
752 bad file position 732000 733000 264000
840 bad file position 801000 802000 933000
799 bad file position 332000 333000 989000
866 bad file position 150000 151000 248000
866 bad checksum 109116 109375
887 bad file position 39000 40000 974000
937 bad file position 18000 19000 938000
969 bad file position 20000 21000 24000
953 bad file position 542000 543000 767000
977 bad file position 694000 695000 782000

A: This seems to be caused by buffering: using open(args.file, 'rb', buffering=0) I can't reproduce anymore.
https://docs.python.org/3/library/functions.html#open

buffering is an optional integer used to set the buffering policy. Pass 0 to switch buffering off [...] When no buffering argument is given, the default buffering policy works as follows: [...] Binary files are buffered in fixed-size chunks; the size of the buffer [...] will typically be 4096 or 8192 bytes long. [...]

A: I've checked, only using multiprocessing.Lock (without buffering = 0), still met the bad data. with both multiprocessing.Lock and buffering=0, all things goes well


text:
Q: How to prevent infinite loop in componentDidUpdate I've got this code but it gives me an infinite loop.
How can I prevent it?
Or I need to use another lifecycle method??
 componentDidUpdate(prevProps, prevState) {
        if(prevState.input["purpose"] === "TEST" ){
            this.setState({input: { ...this.state.input, number: "1"}})
        }else if(prevState.input["purpose"] !== "TEST"){
            this.setState({input: { ...this.state.input, number: "0"}});
        }
        console.log(this.state.input.number);
        console.log(prevState.input["purpose"]);
      }

A: In both cases of if-else, you are updating the state and you are checking for the purpose to be 'Test'
if its 'Test' you are updating the state and if it's not still you are updating state

A: You are updating the state in componentDidUpdate. Therefore, this function is called every time.
Both of your conditions call setState.

A: Following docs from React.js. You should not update state like this.setState inside componentDidUpdate without condition
https://reactjs.org/docs/react-component.html#componentdidupdate

You may call setState() immediately in componentDidUpdate() but note that it must be wrapped in a condition like in the example above, or you'll cause an infinite loop. It would also cause an extra re-rendering which, while not visible to the user, can affect the component performance. If you're trying to "mirror" some state to a prop coming from above, consider using the prop directly instead. Read more about why copying props into state causes bugs.

In this case, your if else condition always update state
Please, follow react component lifecycle as below


text:
Q: Migrate from Outlook Contacts (Address Book) to something with rich text in Notes In the Contacts (Address Book) part of Outlook for Mac 2011, I use rich text formatting (including links) for Notes.
I'd like to migrate away from Microsoft to something that is open source. From what I can tell, Thunderbird does not support rich text formatting in the Notes tab. Is this correct?
Which program can I migrate to, that supports rich text formatting in the Notes section of Contacts (or Address Book)?


text:
Q: Calculate Duration between two dates (Month and Year will be Considered) I have two dates
06-Jan-2009  and  12-Dec-2010
I want to calculate the date difference between these two dates.. (basis on the month and year).
I want to get the answer 2 Year.
But if dates is 06-Jan-2009 And 12-Oct-2010
then I need 10 Months as output.

A: Try this one:
Declare @SDate DateTime ='06-Jan-2009'
Declare @EDate DateTime ='12-Oct-2009'

select case when DateDiff(M,@sDate,@EDate) <=12
            then DateDiff(M,@sDate,@EDate)
            else Round( ( Convert(Decimal(18,0)
                                   ,DateDiff(M,@sDate,@EDate)/12.0)),0) end

A: declare @Birthdate datetime
declare @AsOnDate datetime

declare @years int
declare @months int
declare @days int
declare @hours int
declare @minutes int

--NOTE: date of birth must be smaller than As on date,
--else it could produce wrong results
set @Birthdate = '1989-11-30 9:27 pm' --birthdate
set @AsOnDate  = Getdate()            --current datetime

--calculate years
select @years = datediff(year,@Birthdate,@AsOnDate)

--calculate months if it's value is negative then it
--indicates after __ months; __ years will be complete
--To resolve this, we have taken a flag @MonthOverflow...
declare @monthOverflow int
select @monthOverflow = case when datediff(month,@Birthdate,@AsOnDate) -
  ( datediff(year,@Birthdate,@AsOnDate) * 12) <0 then -1 else 1 end
--decrease year by 1 if months are Overflowed
select @Years = case when @monthOverflow < 0 then @years-1 else @years end
select @months =  datediff(month,@Birthdate,@AsOnDate) - (@years * 12)

--as we do for month overflow criteria for days and hours
--& minutes logic will followed same way
declare @LastdayOfMonth int
select @LastdayOfMonth =  datepart(d,DATEADD
    (s,-1,DATEADD(mm, DATEDIFF(m,0,@AsOnDate)+1,0)))

select @days = case when @monthOverflow<0 and
    DAY(@Birthdate)> DAY(@AsOnDate)
then @LastdayOfMonth +
  (datepart(d,@AsOnDate) - datepart(d,@Birthdate) ) - 1
      else datepart(d,@AsOnDate) - datepart(d,@Birthdate) end

declare @hoursOverflow int
select @hoursOverflow = case when datepart(hh,@AsOnDate) -
    datepart(hh,@Birthdate) <0 then -1 else 1 end
select @hours = case when @hoursOverflow<0 then 24 +
  datepart(hh,@AsOnDate) - datepart(hh,@Birthdate)
  else datepart(hh,@AsOnDate) - datepart(hh,@Birthdate) end

declare @minutesOverflow int
select @minutesOverflow = case when datepart(mi,@AsOnDate) -
    datepart(mi,@Birthdate) <0 then -1 else 1 end
select @minutes = case when @hoursOverflow<0
    then 60 - (datepart(mi,@AsOnDate) -
  datepart(mi,@Birthdate)) else abs(datepart
      (mi,@AsOnDate) - datepart(mi,@Birthdate)) end

select
 @Months=case when @days < 0 or DAY(@Birthdate)> DAY(@AsOnDate) then @Months-1 else @Months end

Declare @lastdayAsOnDate int;
set @lastdayAsOnDate = datepart(d,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@AsOnDate),0)));
Declare @lastdayBirthdate int;
set @lastdayBirthdate =  datepart(d,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@Birthdate)+1,0)));

if (@Days < 0)
(
    select @Days = case when( @lastdayBirthdate > @lastdayAsOnDate) then
        @lastdayBirthdate + @Days
    else
        @lastdayAsOnDate + @Days
    end
)
print  convert(varchar,@years)   + ' year(s),   '  +
       convert(varchar,@months)  + ' month(s),   ' +
       convert(varchar,@days)    + ' day(s),   '   +
       convert(varchar,@hours)   + ':'             +
       convert(varchar,@minutes) + ' hour(s)'

A: select Round( (
Convert(Decimal(18,2),DateDiff(M,'06-Jan-2009','12-Dec-2010')/12.0)),0)
as Years

A: Please tried with below query
Declare @SDate DateTime ='01-Jan-2009'
Declare @EDate DateTime ='12-Oct-2009'

SET  @EDate  = DATEADD(M, 1, @EDate)
select DateDiff(M,@sDate,@EDate)

A: I think that would be work for me:
DECLARE @start DATETIME='01-Jan-2008'
DECLARE @end DATETIME='10-Nov-2011'
DECLARE @duration INT

--SELECT @start = '2011-10-10', @end = '2013-10-10'
--select DATEPART(dd,@start)
SET @Start = Dateadd(DAY, -( Datepart(DD, @Start) - 1 ), @Start)

SET @end = Dateadd(DAY, -( Datepart(day, @end) - 1 ), @end)
SET @end = Dateadd(day, Day(Dateadd(mm, Datediff(mm, -1, @end), -1)), @end)

SELECT @duration = Datediff(mm, @Start, @end)

SELECT CASE
    WHEN @duration = 0 THEN NULL
    WHEN @duration%12 = 0 THEN( CONVERT(NVARCHAR, @duration / 12) + ' Year ' )
    WHEN @duration > 12 THEN( CONVERT(NVARCHAR, @duration / 12) + ' Year ' + CONVERT(NVARCHAR, @duration % 12) + ' Month ' )
    ELSE (SELECT CONVERT(NVARCHAR, @duration % 12) + ' Month')
END

A: declare @Birthdate datetime
declare @AsOnDate datetime

declare @years varchar(4)
declare @months varchar(3)
declare @days varchar(3)
declare @hours varchar(3)
declare @minutes varchar(2)

set @Birthdate = '1989-11-30 9:27 AM' --birthdate
set @AsOnDate  = getdate()        --current datetime

select @years = datediff(year,@Birthdate,@AsOnDate)
select @months = datediff(month,@Birthdate,@AsOnDate) -
    ( datediff(year,@Birthdate,@AsOnDate) * 12)
select @days = datepart(d,@AsOnDate) - datepart(d,@Birthdate)
select @hours = datepart(hh,@AsOnDate) - datepart(hh,@Birthdate)
select @minutes = abs(datepart(mi,@AsOnDate) - datepart(mi,@Birthdate))

print  @years   + ' year(s),   '  +
       @months  + ' month(s),   ' +
       @days    + ' day(s),   '   +
       @hours   + ':'             + @minutes + ' hour(s)'

OUT PUT:


text:
Q: Draggable object with multiple boundaries I have my player dragged around the stage. If the player hits any object(All perfect rectangles) that I lay out in a movieclip, I'd like the player to hit a wall and stop moving. What's the most efficient way to  write this?
Do I loop through all the points the player can't hit?

A: There are built in methods for hit testing, you loop through all the objects you want to hit test against (make each it's own sprite or hit test the entire sprite that contains all the parts against the object depending on what kinds of info you want to have.  You may also want to rig up your own custom Sprite that has hit regions for the left right top and bottom to determine which edge the player has hit.
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObject.html#hitTestObject()
Multiple hittest AS3


text:
Q: Landscape mode not working in App release (Flutter) I need help, I am using flutter to make App will have 3 interfaces 1- Mobile application (portrait) 2- Tablet/iPad (portrait) 3- Tablet/iPad (Landscape)... during debugging stage this was working perfectly till I made the app release... now the App is detecting the Portrait mode of the tablet but does not change to landscape (it seems that the App is not detecting the landscape mode)...here is a copy from my code
import 'dart:math';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:url_launcher/url_launcher.dart';
import 'constants.dart';
import 'home_page.dart';

class ContactUs extends StatefulWidget {
  ContactUs({required this.contactUsHeader, Key? key}) : super(key: key);
  String contactUsHeader;

  @override
  _ContactUsState createState() => _ContactUsState(contactUsHeader);
}

enum ResultField { FeedBack, Subject }

class _ContactUsState extends State<ContactUs> {
  _ContactUsState(this.contactUsHeader);
  final String contactUsHeader;
  final _fieldFeedBack = TextEditingController();
  final _fieldSubject = TextEditingController();
  FocusNode focusFeedBack = FocusNode();
  FocusNode focusSubject = FocusNode();

  List unchangedFields = [ResultField.FeedBack, ResultField.Subject];

  String valueFeedBack = '';
  String valueSubject = '';
  bool userSetFeedBack = false;
  bool userSetSubject = false;

//=====These parameters to make responsive font size
  double SonyZRWidth = 360;
  double SonyZRHeight = 592;

  void listenerFieldFeedBack() {
    if (focusFeedBack.hasFocus) {
      try {
        valueFeedBack = _fieldFeedBack.text;
        userSetFeedBack = true;
      } catch (e) {}

      setState(() {});
    }
  }

  void listenerFieldSubject() {
    if (focusSubject.hasFocus) {
      try {
        valueSubject = _fieldSubject.text;
        userSetSubject = true;
      } catch (e) {}

      setState(() {});
    }
  }

  @override
  void initState() {
    super.initState();
    // _fieldFeedBack.addListener(listenerFieldFeedBack);
    // _fieldSubject.addListener(listenerFieldSubject);
  }

  void feedBackEmail() {
    String encodeQueryParameters(Map<String, String> params) {
      return params.entries
          .map((e) =>
              '${Uri.encodeComponent(e.key)}=${Uri.encodeComponent(e.value)}')
          .join('&');
    }

    final Uri params = Uri(
      scheme: 'mailto',
      path: 'talotech.engtools@gmail.com',
      query: encodeQueryParameters(<String, String>{
        'subject': valueSubject,
        'body': valueFeedBack,
      }),
    );
    launch(params.toString());
  }

//===== This to activate the calculate button
  bool activateSend() {
    bool isActivated;
    if (_fieldSubject.text != '' && _fieldFeedBack.text != '') {
      isActivated = true;
    } else {
      isActivated = false;
    }
    return isActivated;
  }

//===== This is to show the text of the missing fields
  String missingFields() {
    String tostText = '';
    if (_fieldFeedBack.text == '' && _fieldSubject.text == '') {
      tostText = 'Please enter the subject & your thoughts';
    } else if (_fieldFeedBack.text == '') {
      tostText = 'It seems that you did not share you thoughts with Us';
    } else if (_fieldSubject.text == '') {
      tostText = 'What about the subject.. please fill in the subject field';
    }
    return tostText;
  }

  void toastisMissing() =>
      Platform.isIOS ? cupertinoAlertIsMissing() : toastIsMissingAndroid();

  /// This is to determine between toast massage for android or Cupertino Alert Dialod for IOS.
//====== this is the imported toast massage for android
  void toastIsMissingAndroid() {
    Fluttertoast.showToast(
      msg: missingFields(),
      toastLength: Toast.LENGTH_SHORT,
      gravity: ToastGravity.BOTTOM,
      timeInSecForIosWeb: 1,
    );
  }

//====== this is the Cupertino alert Dialog for IOS
  void cupertinoAlertIsMissing() {
    showDialog(
        context: context,
        builder: (ctx) {
          return CupertinoAlertDialog(
            title: Text(missingFields()),
            actions: [
              CupertinoDialogAction(
                child: const Text('Noted'),
                onPressed: () => Navigator.pop(context),
              )
            ],
          );
        });
  }

  @override
  Widget build(BuildContext context) {
    double scaleFactorWidth = 360 / MediaQuery.of(context).size.width;
    double scaleFactorHeight = 592 / MediaQuery.of(context).size.height;

//=====This is the scale factor for mobiles
    double scaleFactorScreenMobile = (MediaQuery.of(context).size.width +
            MediaQuery.of(context).size.height) /
        (SonyZRWidth + SonyZRHeight);
    double scaleFactorTabletLandscape = scaleFactorScreenMobile - 0.5;

    //==== This is to determine the shortest side of the device to determine if iPad/Tablet or mobile phone
//==== 552 was selected based on my tablet Lenovo TAB 2 A7, physical number were extracted from the App in debug mode
    final double shortestSide = MediaQuery.of(context).size.shortestSide;
    final bool useMobileLayout = shortestSide < 552;

//====== This to force the mobile device to be in Portrait mode only ========
//===========================================================================
    if (useMobileLayout) {
      SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
    }

    double mobilePadding() {
      double valuePadding;
      if (useMobileLayout == true) {
        valuePadding = 20;
      } else {
        valuePadding = 60;
      }
      return valuePadding;
    }

    Widget buildContactUsTabletLandscape() {
      return Center(
        child: Stack(
          children: [
            Container(
              height: 0.4 * MediaQuery.of(context).size.height,
              width: 1 * MediaQuery.of(context).size.width,
              decoration: const BoxDecoration(
                  // image: DecorationImage(
                  //   image: AssetImage('images/header.png'),
                  //   fit: BoxFit.fill,
                  // ),
                  ),
            ),
            Center(
              child: SingleChildScrollView(
                child: Center(
                  child: Container(
                    decoration: BoxDecoration(
                      borderRadius: BorderRadius.circular(15),
                      color: Colors.white,
                      border: Border.all(color: kAppGrey),
                      boxShadow: [
                        BoxShadow(
                          color: Colors.grey.withOpacity(0.5),
                          spreadRadius: 1,
                          blurRadius: 3,
                          offset:
                              const Offset(0, 1), // changes position of shadow
                        ),
                      ],
                    ),
                    height: useMobileLayout
                        ? 0.75 * MediaQuery.of(context).size.height
                        : 0.75 * MediaQuery.of(context).size.height,
                    width: 0.90 * MediaQuery.of(context).size.width,
                    child: Padding(
                      padding: const EdgeInsets.only(
                          left: 60, right: 60, bottom: 10.0, top: 8.0),
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                        crossAxisAlignment: CrossAxisAlignment.stretch,
                        children: [
                          Row(
                            mainAxisAlignment: MainAxisAlignment.start,
                            children: [
                              Image.asset('images/email2.png'),
                              const SizedBox(width: 15),
                              Text(
                                'Contact Us',
                                style: const TextStyle(
                                  fontWeight: FontWeight.bold,
                                  color: kAppGreyFont,
                                  fontSize: 18.0,
                                ),
                                textAlign: TextAlign.center,
                                textScaleFactor: useMobileLayout
                                    ? scaleFactorScreenMobile
                                    : scaleFactorTabletLandscape + 0.8,
                              ),
                            ],
                          ),
                          const SizedBox(height: 15),
                          Row(
                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            children: [
                              Text(
                                contactUsHeader,
                                style: const TextStyle(
                                  fontSize: 12,
                                  color: Colors.black,
                                  wordSpacing: 1,
                                ),
                                textAlign: TextAlign.left,
                                textScaleFactor: useMobileLayout
                                    ? scaleFactorScreenMobile
                                    : scaleFactorTabletLandscape + 0.8,
                              ),
                              FloatingActionButton(
                                backgroundColor: activateSend() == true
                                    ? kAppGreen
                                    : kAppGreen.withOpacity(0.4),
                                child: Transform.rotate(
                                  angle: -30 * pi / 180,
                                  child: const Icon(
                                    Icons.send,
                                    size: 35,
                                  ),
                                ),
                                elevation: 8,
                                onPressed: () {
                                  setState(() {
                                    if (activateSend() == true) {
                                      feedBackEmail();
                                      Navigator.push(
                                        context,
                                        MaterialPageRoute(
                                          builder: (context) {
                                            return const HomePage();
                                          },
                                        ),
                                      );
                                    } else {
                                      toastisMissing();
                                    }
                                  });
                                },
                              ),
                            ],
                          ),
                          const SizedBox(height: 15),
                          Column(
                            crossAxisAlignment: CrossAxisAlignment.stretch,
                            children: [
                              Text(
                                'Subject',
                                style: const TextStyle(fontSize: 12),
                                textScaleFactor: useMobileLayout
                                    ? scaleFactorScreenMobile
                                    : scaleFactorTabletLandscape + 0.8,
                              ),
                              const SizedBox(height: 10),
                              SizedBox(
                                height: 50,
                                child: Center(
                                  child: TextFormField(
                                    focusNode: focusSubject,
                                    controller: _fieldSubject,
                                    style: TextStyle(
                                        fontSize: 17 *
                                            (useMobileLayout
                                                ? scaleFactorScreenMobile - 0.2
                                                : scaleFactorTabletLandscape)),
                                    onTap: () {},
                                    onChanged: (_) => listenerFieldSubject(),
                                    textAlignVertical: TextAlignVertical.bottom,
                                    decoration: const InputDecoration(
                                      border: OutlineInputBorder(),
                                      labelText: 'Subject',
                                      hintText: 'Subject...',
                                    ),
                                  ),
                                ),
                              ),
                            ],
                          ),
                          Text(
                            'Content',
                            style: const TextStyle(fontSize: 12),
                            textScaleFactor: useMobileLayout
                                ? scaleFactorScreenMobile
                                : scaleFactorTabletLandscape + 0.8,
                          ),
                          const SizedBox(height: 10),
                          TextFormField(
                            focusNode: focusFeedBack,
                            controller: _fieldFeedBack,
                            onTap: () {
                              activateSend() ? feedBackEmail() : null;
                            },
                            onChanged: (_) => listenerFieldFeedBack(),
                            maxLines: 3,
                            style: TextStyle(
                                fontSize: 17 *
                                    (useMobileLayout
                                        ? scaleFactorScreenMobile - 0.2
                                        : scaleFactorTabletLandscape)),
                            textAlign: TextAlign.start,
                            textAlignVertical: TextAlignVertical.top,
                            decoration: const InputDecoration(
                              border: OutlineInputBorder(),
                              labelText: 'My Message',
                              hintText: 'Please write here...',
                            ),
                          ),
                          const SizedBox(height: 10),
                        ],
                      ),
                    ),
                  ),
                ),
              ),
            ),
          ],
        ),
      );
    }

//====this is for mobile & tablet portrait mode
    Widget buildMobilePortrait() {
      return Center(
        child: Stack(
          children: [
            Container(
              height: 0.4 * MediaQuery.of(context).size.height,
              width: 1 * MediaQuery.of(context).size.width,
              decoration: const BoxDecoration(
                  // image: DecorationImage(
                  //   image: AssetImage('images/header.png'),
                  //   fit: BoxFit.fill,
                  // ),
                  ),
            ),
            Center(
              child: SingleChildScrollView(
                child: Center(
                  child: Container(
                    decoration: BoxDecoration(
                      borderRadius: BorderRadius.circular(15),
                      color: Colors.white,
                      border: Border.all(color: kAppGrey),
                      boxShadow: [
                        BoxShadow(
                          color: Colors.grey.withOpacity(0.5),
                          spreadRadius: 1,
                          blurRadius: 3,
                          offset:
                              const Offset(0, 1), // changes position of shadow
                        ),
                      ],
                    ),
                    height: useMobileLayout
                        ? 0.75 * MediaQuery.of(context).size.height
                        : 0.75 * MediaQuery.of(context).size.height,
                    width: 0.90 * MediaQuery.of(context).size.width,
                    child: Padding(
                      padding: EdgeInsets.only(
                          left: mobilePadding(),
                          right: mobilePadding(),
                          bottom: 10.0,
                          top: 8.0),
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                        crossAxisAlignment: CrossAxisAlignment.stretch,
                        children: [
                          Row(
                            mainAxisAlignment: MainAxisAlignment.start,
                            children: [
                              Image.asset('images/email2.png'),
                              const SizedBox(width: 15),
                              Text(
                                'Contact Us',
                                style: const TextStyle(
                                  fontWeight: FontWeight.bold,
                                  color: kAppGreyFont,
                                  fontSize: 18.0,
                                ),
                                textAlign: TextAlign.center,
                                textScaleFactor: useMobileLayout
                                    ? scaleFactorScreenMobile
                                    : scaleFactorTabletLandscape + 0.8,
                              ),
                            ],
                          ),
                          const SizedBox(height: 15),
                          Text(
                            contactUsHeader,
                            style: const TextStyle(
                              fontSize: 12,
                              color: Colors.black,
                              wordSpacing: 1,
                            ),
                            textAlign: TextAlign.left,
                            textScaleFactor: useMobileLayout
                                ? scaleFactorScreenMobile
                                : scaleFactorTabletLandscape + 0.8,
                          ),
                          const SizedBox(height: 15),
                          Column(
                            crossAxisAlignment: CrossAxisAlignment.stretch,
                            children: [
                              Text(
                                'Subject',
                                style: const TextStyle(fontSize: 12),
                                textScaleFactor: useMobileLayout
                                    ? scaleFactorScreenMobile
                                    : scaleFactorTabletLandscape + 0.8,
                              ),
                              const SizedBox(height: 10),
                              SizedBox(
                                height: 50,
                                child: Center(
                                  child: TextFormField(
                                    focusNode: focusSubject,
                                    controller: _fieldSubject,
                                    style: TextStyle(
                                        fontSize: 17 *
                                            (useMobileLayout
                                                ? scaleFactorScreenMobile - 0.2
                                                : scaleFactorTabletLandscape)),
                                    onTap: () {},
                                    onChanged: (_) => listenerFieldSubject(),
                                    textAlignVertical: TextAlignVertical.bottom,
                                    decoration: const InputDecoration(
                                      border: OutlineInputBorder(),
                                      labelText: 'Subject',
                                      hintText: 'Subject...',
                                    ),
                                  ),
                                ),
                              ),
                            ],
                          ),
                          const SizedBox(height: 10),
                          Column(
                            crossAxisAlignment: CrossAxisAlignment.stretch,
                            children: [
                              Text(
                                'Content',
                                style: const TextStyle(fontSize: 12),
                                textScaleFactor: useMobileLayout
                                    ? scaleFactorScreenMobile
                                    : scaleFactorTabletLandscape + 0.8,
                              ),
                              const SizedBox(height: 10),
                              SizedBox(
                                height: 150,
                                child: TextFormField(
                                  focusNode: focusFeedBack,
                                  controller: _fieldFeedBack,
                                  onTap: () {
                                    activateSend() ? feedBackEmail() : null;
                                  },
                                  onChanged: (_) => listenerFieldFeedBack(),
                                  maxLines: 5,
                                  style: TextStyle(
                                      fontSize: 17 *
                                          (useMobileLayout
                                              ? scaleFactorScreenMobile - 0.2
                                              : scaleFactorTabletLandscape)),
                                  textAlign: TextAlign.start,
                                  textAlignVertical: TextAlignVertical.top,
                                  decoration: const InputDecoration(
                                    border: OutlineInputBorder(),
                                    labelText: 'My Message',
                                    hintText: 'Please write here...',
                                  ),
                                ),
                              ),
                            ],
                          ),
                          const SizedBox(height: 10),
                          SizedBox(
                            height: 0.08 * MediaQuery.of(context).size.height,
                            width: 0.82 * MediaQuery.of(context).size.width,
                            child: TextButton.icon(
                              onPressed: () {
                                if (activateSend() == true) {
                                  feedBackEmail();
                                  Navigator.push(
                                    context,
                                    MaterialPageRoute(
                                      builder: (context) {
                                        return const HomePage();
                                      },
                                    ),
                                  );
                                } else {
                                  toastisMissing();
                                }
                              },
                              label: Text(
                                'Send',
                                style: const TextStyle(
                                  fontSize: 16,
                                  color: Colors.white,
                                  fontWeight: FontWeight.bold,
                                  letterSpacing: 1,
                                ),
                                textScaleFactor: useMobileLayout
                                    ? scaleFactorScreenMobile
                                    : scaleFactorTabletLandscape + 0.8,
                              ),
                              icon: Icon(
                                Icons.email_rounded,
                                size: 30 *
                                    (useMobileLayout
                                        ? scaleFactorScreenMobile - 0.2
                                        : scaleFactorTabletLandscape),
                                color: Colors.white,
                              ),
                              style: ButtonStyle(
                                elevation: MaterialStateProperty.all(5),
                                backgroundColor:
                                    MaterialStateProperty.all<Color>(
                                        activateSend() == true
                                            ? kAppGreen
                                            : kAppGreen.withOpacity(0.4)),
                                shape: MaterialStateProperty.all<
                                    RoundedRectangleBorder>(
                                  RoundedRectangleBorder(
                                    borderRadius: BorderRadius.circular(20),
                                    // side: const BorderSide(color: Colors.black),
                                  ),
                                ),
                              ),
                            ),
                          ),
                        ],
                      ),
                    ),
                  ),
                ),
              ),
            ),
          ],
        ),
      );
    }

    return Scaffold(
      backgroundColor: kAppGrey,
      appBar: AppBar(
        backgroundColor: kAppGrey,
        elevation: 0,
        centerTitle: true,
        iconTheme: const IconThemeData(
          color: kAppGreyFont, //change your color here
        ),
        title: Text(
          'Contact Us',
          style: kAppBarTitleHeader(),
          textScaleFactor: useMobileLayout
              ? scaleFactorScreenMobile
              : scaleFactorTabletLandscape,
        ),
      ),
      body: SafeArea(
        child: OrientationBuilder(
          builder: (context, orientation) =>
              orientation == Orientation.landscape
//================= This is for LandScape mode for iPad/Tablets
                  ? buildContactUsTabletLandscape()
//================= This is for Portrait mode for iPad/Tablets
                  : buildMobilePortrait(),
        ),
      ),
    );
  }
}

also, I tried to use  MediaQuery instead of OrientationBuilder
  child: useMobileLayout
      ? buildMixingMobile()
      : MediaQuery.of(context).orientation == Orientation.portrait
          ? buildMixingTabletPortrait()
          : buildMixingTabletLandscape(),
),

I don't understand what is the reason for this problem & I can't solve it... please help

A: In your release android manifest please remove this line
android:screenOrientation="portrait"

A: I finally find the solution for the issue, the main cause is SystemChrome since as per my code I wanted the mobile screen to be in the portrait mode always so I added
      SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
    }

and for some how the app started to implement the same even in the tablet landscape mode... so I made some adjustment in the App code such as
        child: !useMobileLayout
            ? MediaQuery.of(context).orientation == Orientation.portrait
                ? buildMixingTabletPortrait()
                : buildMixingTabletLandscape()
            : buildMixingMobile(scaleFactorScreenMobile),
      ),

& then I added the condition to change the orientation inside the mobile mode widget as the following
  Widget buildMixingMobile(double scaleFactorScreenMobile) {
//====This to make the mobile screen always in the portrait orientation
    final isPortrait =
        MediaQuery.of(context).orientation == Orientation.landscape;

    if (isPortrait) {
      SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
    }
//=======================================================================
    return Align(

Now the App is working as I wanted


text:
Q: golang smtp get and parse wellcome message of server I want to get welcome message of smtp server and check if contains specific keyword, this is my actual code:
package main

import (
    "fmt"
    "net"
    "strings"
    "time"
    "net/smtp"
    "errors"
)

type loginAuth struct {
    username, password string
}

func (a *loginAuth) Start(server *smtp.ServerInfo) (string, []byte, error) {
    return "LOGIN", []byte{}, nil
}

func (a *loginAuth) Next(fromServer []byte, more bool) ([]byte, error) {
    if more {
        switch string(fromServer) {
        case "Username:":
            return []byte(a.username), nil
        case "Password:":
            return []byte(a.password), nil
        default:
            return nil, errors.New("Unkown fromServer")
        }
    }
    return nil, nil
}

func main() {

    // attempt a connection
    conn, err := net.DialTimeout("tcp", "88.198.24.108:25", 15 * time.Second)
    defer conn.Close()
    if err == nil {
        buf := make([]byte, 32, 32)
        conn.Read(buf)
        if strings.Contains(string(buf), "Haraka") {
            fmt.Println("this server not working with this application")
        }
    }

    client, err := smtp.NewClient(conn, "88.198.24.108")
    if err != nil {
        fmt.Println("1>>", err)
        return
    }

    err = client.Auth(&loginAuth{"info@example.com", "123456"})
    if err != nil {
        fmt.Println("2>>", err)
        return
    } else {
        fmt.Println("auth successfull")
    }

}

The code return this error : 1>> short response: 18 ready
where i wrong ?


text:
Q: integrate jquery ui datepicker into React JS I'm trying to integrate the jquery ui datepicker on an input text using React js , I have this jsbin , http://jsbin.com/diyifa/edit?html,js.
I have this component called Datepicker.js
import React from 'react';
import ReactDOM from 'react-dom';
import {UserProfileForm} from 'react-stormpath';

export default class DateInput extends React.Component {
    render() {
        return (
            <input type="text" className="datepicker"/>
        )
    }
}
export default class Calendar extends React.Component {
    componentDidMount: function () {
        $('.datepicker').datepicker();
        render()
        {
            return (
                <DateInput/>
            )
        }
    }
}
ReactDOM.render(
    <Calendar/>, document.getElementById('dpick')
);

and I want to call this component in my page called PatPage.js
import React from 'react';
import DocumentTitle from 'react-document-title';
import {UserProfileForm} from 'react-stormpath';
import {Calendar} from './Datepicker.js';

        D.2.1Date of Birth

(there's more code but I'm only showing the part when im implementing this)
Any hints to make it work would be appreciated, I'm new to react JS, thanks

A: Assuming your build system is webpack, you should use the provide plugin to make sure $ and jQuery are loaded...
new webpack.ProvidePlugin({
  Promise: 'bluebird',
  jQuery: 'jquery',
  $: 'jquery',
  React: 'react'
})

Also, add the jquery-ui to your entry list before the main entry.js
The following is an ES6 Class of what you will roughly need
//DatePicker.js
export default class DatePicker extends React.Component {
  componentDidMount() {
    $(this.refs.input).datepicker();
  }

  componentWillUnmount() {
    $(this.refs.input).datepicker('destroy');
  }

  render() {
    const props = this.props;
    return <input ref="input" type="date" {...props} />
  }
}

//entry.js
import ReactDOM from 'react-dom';
import DatePicker from './DatePicker';

ReactDOM.render(
  <DatePicker
    value="2015-01-01"
    onChange={(evt)=>console.log('new date', evt.target.value)}
  />,
  document.getElementById('dpick')
)

A: I mad made it work this way:
Datepicker.js
import React from 'react';

export default class Datepicker extends React.Component {
  render() {
    return (
      <input type="text" id="id_field_dateofbirth" className="datepicker form-control" placeholder="DD-MM-YYYY"/>
    );
  }
}

Calendar.js
import React from 'react';
import Datepicker from './Datepicker';

export default class Calendar extends React.Component {
  componentDidMount() {
    $('.datepicker').datepicker({
      changeMonth: true,
      changeYear: true,
      showButtonPanel: true,
      yearRange: "-116:+34",
      dateFormat: 'dd/mm/yy'
    });
  }
  render() {
    return (
          <Datepicker />
    );
  }
}

And I call my component from another file like this
import Calendar from '../components/Calendar'
.....
.....
<Calendar />

A: check src attribute of script tag of jquery ui datepicker , maybe it pointing to wrong destination


text:
Q: Tensorflow Beginner, Basic Question On Linear Model https://www.tensorflow.org/tutorials/estimator/linear
I am following the Tensorflow documentation to implement a Linear Classifier but I like to use my own data instead of the tutorial set. I just have a few general questions.
My dataset is as follows. It's not a time series.
row[0] - float (changed to binary, 0 = negative, 1 = positive) VALUE TO ESTIMATE
row[1] - string (categorical, changed to vocabulary, ints 1,2,3,4,5,6,7,8,9)
row[2-19] - float (positive and negative)
row[20-60] - ints (percentile ranks, ints 10,20,30,40,50,60,70,80,90)
row[61-95] - ints (binary 1, 0)
I started by using 50k (45k training) rows of data and num_epochs=100, batch_size=256.
{'accuracy': 0.8912, 'accuracy_baseline': 0.8932, 'auc': 0.7101819, 'auc_precision_recall': 0.2830853, 'average_loss': 0.30982444, 'label/mean': 0.1068, 'loss': 0.31013006, 'precision': 0.4537037, 'prediction/mean': 0.11840516, 'recall': 0.0917603, 'global_step': 17600}

*

*Does the column I want to estimate need to be a column of binaries for this model?

*Is it a bad idea to mix data types like this? Would it be necessary to normalize the data using something like preprocessing.Normalization ?

*Should I alter the epochs/batch if I want to use more data?

*The accuracy seems high but the loss also seems quite high, why is that?

*Any other suggestions?
Thanks for any help or advice.

A: Here is the answer to your questions.

*

*By default tf.estimator.LinearClassifier considers as binary classification with n_classes=2, but you can have more than 2 classes as well.

*For a linear classification normalizing data won't affect much in terms of accuracy compared to non linear classifier accuracy change after normalizing on the same data.

*You can observe the change in accuracy and loss, if it does not change much for about 5-10 epochs, you can restrict the number of epochs there only. Again you can repeat the same step by changing the batch size.

*Accuracy and loss are not dependent on each other, consider an example of your case to classify 0 and 1. A model with 2 classes that always predicts 0.51 for the true class would have the same accuracy as one that predicts 0.99. Best model would be with high accuracy and with less loss, if your model is giving good accuracy and high loss that means your model made huge errors on few data.

Try to tune your model hyper parameters based on several observations and to feed quality data with some preprocessing is always best way to reach high accuracy and less loss, with some additional data would be good to have always.


text:
Q: How to pass token to new tab in same browser (Login Issue) I am learning web development and implementing the login functionality. I have a rest service which generates a unique token for each user which logs in. Now I had one issue if I log in one tab and go to homepage and if I go to another tab, instead of getting redirected to home page I was getting redirected to log in page again in the new tab. Ideally, if I go to another tab I should get redirected to home page. It happened because I was saving unique token in session storage. But I realized that session storage is per tab basis so now I am saving the token received from Rest service in local storage.
Below is what I did:
Before redirecting to login page I am checking if token exist in local storage
 if((localStorage.getItem('p_kt')))
 window.location = "pages/firstDashboard.html";

If token does not exists normal login code runs and I get the token from REST Service
localStorage.setItem('p_kt', self.get('tokenProp'));

Also, when some one logs out I do:
localStorage.clear();

So everything seems to be working now. But I doubt its the right way to fix the issue. Can someone guide me. Is it okey to keep token in local storage.


text:
Q: Selected columns in sub query(Multiple column) are not showing select daf.id as affiliate_id,daf.name as affiliate_name,
dal.name as allocation_name,dal.id as allocation_id,dal.allocation,dal.price
from degreeamerica.affiliates daf join degreeamerica.allocations dal
JOIN(select pap.lead_price,pap.live,pap.allocation_id,pap.affiliate_id from paul.affiliates_price pap) pafp on (dal.id=pafp.allocation_id and daf.id=pafp.affiliate_id) order by daf.id;

pap.lead_price,pap.live,pap.allocation_id,pap.affiliate_id
These columns are not showing in result set. Please help!!!

A: Short Answer
Add ,pafp.lead_price,pafp.live,pafp.allocation_id,pafp.affiliate_id to the end of your Select just before From
Suggestions
SELECT
    daf.id AS affiliate_id,
    daf.name AS affiliate_name,
    dal.name AS allocation_name,
    dal.id AS allocation_id,
    dal.allocation,
    dal.price,
    pap.lead_price, -- add the fields you want from paul.affiliates_price
    pap.live,
    pap.allocation_id,
    pap.affiliate_id
FROM
    degreeamerica.affiliates daf
    JOIN degreeamerica.allocations dal -- what are we joining on?
    -- why create a subquery with no filters? just join to table.
    JOIN paul.affiliates_price pap ON dal.id=pap.allocation_id
        and daf.id=pap.affiliate_id
ORDER BY
    daf.id

A: add those column in parent select statement..
like
select daf.id as affiliate_id,
       daf.name as affiliate_name,
       dal.name as allocation_name,
       dal.id as allocation_id,
       dal.allocation,
       dal.price,
       pafp.lead_price,
       pafp.live,
       pafp.allocation_id,
       pafp.affiliate_id
       from degreeamerica.affiliates daf JOIN
            degreeamerica.allocations dal JOIN
            (select
                 pap.lead_price as lead_price,pap.live as live,
                  pap.allocation_id as allocation_id,
                  pap.affiliate_id  as affiliate_id
                 from paul.affiliates_price pap
            ) pafp on dal.id=pafp.allocation_id and daf.id=pafp.affiliate_id
         order by daf.id;


text:
Q: Linux VM vs HP9000/550 HP-UX tuning parameters - Any equivalent to "segment swap"? I know this is a stretch, but here goes ...
Way back, I used to manage an HP9000 model 550 HP-UX minicomputer for a team of 12 mechanical product/tooling designers at Nortel.  I was able to achieve remarkable performance tuning by tweaking the amount of swapping for each of memory segments and memory pages.
In Linux, I have seen the many references and parameters regarding page swap.  However, I don't see any references to what could be equated to HP memory segments (a large contiguous grouping of pages) and was wondering if anyone considered implementing anything like that 2-tiered memory swapping for Linux?
I don't have much of my documentation from those days, but I came across some references where
Page Swap Time (ms):          40
Segment Swap Time (ms):    19968
Scan Holdoff Time (ms):       10

and another which reported
RAM:     12288 k
Sys:       508 k
Pages:     280 k
Segs:     7397 k
Bfrs:     4102 k

As can be seen, memory was very restricted back then.
My tuning was done on the basis that Segments (supersets of pages) were moved as a whole to increase swapping performance when large movements were necessary.  Also, I was setting parameters to keep segments memory-resident for a maximum of time, while allowing paging to happen as quickly as necessary while keeping the swapping ratios at about 20:1 for pages:segments, which gave the best user-perceived responsiveness (8 shared Graftek GMS CAD workstations).
I'm not running any production Linux servers now (only personal desktop) and wonder if the concept of segment swapping might benefit
a) normal desktop Linux environments, or
b) environments where massive memory swapping is ongoing such as for bioinformatics.
I would appreciate any feedback on this.