text:
Queer of color critique is an intersectional framework, grounded in Black feminism, that challenges the single-issue approach to queer theory by analyzing how power dynamics associated race, class, gender expression, sexuality, ability, culture and nationality influence the lived experiences of individuals and groups that hold one or more of these identities. Incorporating the scholarship and writings of Audre Lorde, Gloria Anzaldúa, Kimberlé Crenshaw, Barbara Smith, Cathy Cohen, Brittney Cooper and Charlene A. Carruthers, the queer of color critique asks: what is queer about queer theory if we are analyzing sexuality as if it is removed from other identities? The queer of color critique expands queer politics and challenges queer activists to move out of a "single oppression framework" and incorporate the work and perspectives of differently marginalized identities into their politics, practices and organizations. The Combahee River Collective Statement clearly articulates the intersecting forces of power: "The most general statement of our politics at the present time would be that we are actively committed to struggling against racial, sexual, heterosexual, and class oppression, and see as our particular task the development of integrated analysis and practice based upon the fact that major systems of oppression are interlocking. The synthesis of these oppressions creates the conditions of our lives." Queer of color critique demands that an intersectional lens be applied queer politics and illustrates the limitations and contradictions of queer theory without it. Exercised by activists, organizers, intellectuals, care workers and community members alike, the queer of color critique imagines and builds a world in which all people can thrive as their most authentic selves- without sacrificing any part of their identity.

Historical context
Queer of color critique was a concept long before it was an established framework coined by Roderick Ferguson in The Aberrations in Black: Toward a Queer of Color Critique in 2004, and by Jose Esteban Muñoz in Disidentification: Queers of color and performance politics. Ferguson argues that the queer of color critique "interrogates social formation as the intersections of race, gender, sexuality and class, with particular interest in how those formations correspond with and diverge from nationalist ideals and practices." Ferguson draws a connection between the capitalist nation-building and the state's regulation of gender and sexual eccentricities of non-white populations. Muñoz offers disidentification as a strategy of resistance that defies assimilation and challenges dominant ideology that associates queerness with whiteness, a concept that Ferguson then builds on further by challenging the universality of sexual heterogeneity. Without universality, it is possible to see differences as a source of strength and create new categories that are not fixed, but are experiencing constant change and reformation. Furthermore, without a "normal" or "natural" state of being, Ferguson states "queer of color analysis can be another step in the move beyond identity politics and toward what Angela Davis calls "unlikely and unprecedented coalitions."" The queer of color critique illuminates the ways that queer theory has been historically influenced by dominant ideology by treating the queer white experience as universal and failing to center the voices, needs, and bodies of those who exist at the margins of margins. Both Muñoz and Ferguson build on the scholarship of activists and intellectuals, whose ideas and contributions are explained below.

Audre Lorde
In her speech The Master's Tools Will Never Dismantle the Master's House, Audre Lorde, a Black Feminist lesbian intellectual and activist, calls attention to the racism entrenched in the mainstream white feminist movement. Speaking at the New York University Institute for the Humanities conference, Lorde expresses disappointment at the absence of writings and voices of women of color and the paradoxical reliance on the few Black women, who were in fact invited to the conference, to explain how patriarchy is being reproduced within the feminist movement and how white women's experience is not universal and should not be valued as most important. In response, white women justified silencing marginalized narratives by advocating the importance of a unified message of women's empowerment that could be all-encompassing. Lorde contends that within this color blind and assimilationist approach, transformative change is not possible. Lorde challenges all feminists to defy patriarchy by leaning into the idea that differences are sources of strength and power. Lorde imagines alternatives to change-making within the feminist movement: "In our world divide and conquer must become define and empower" because "refusing to recognize differences makes it impossible to see the different problems and pitfalls facing us as women." The concept of defining difference to empower extends to queer theory and rejects lesbian separatism. If queerness is only associated with whiteness, it is impossible to clearly identify the different problems affecting the queer community as a whole.

In The Uses of the Erotic, a separate essay in Sister Outsider, Lorde provides a strategy for sustainable long term liberation work that has contributed to the queer of color critique by encouraging theorists and activists to seek joy, connection and pleasure from the work of change-making. Lorde writes "For the erotic is not a question only of what we do; it is a question of how acutely and fully we can feel in the doing [...] how often do we truly love our work even at its most difficult?" Lorde highlights the importance of loving the experience of doing the work- and not solely valuing the work itself- as an act of resistance to capitalism and a way of creating genuine change. "Recognizing the power of the erotic within our lives can give us the energy to pursue genuine change within our world, rather than merely settling for a shift of characters in the same weary drama. For not only do we touch our most profoundly creative source, but we do that which is female and self-affirming in the face of a racist, patriarchal, and anti-erotic society." This approach allows individuals to bring their whole creative selves to their activism and seek joy in the process of doing, thereby expanding, sustaining and queering the movement for change by distancing it from the capitalist notion that gives value only to the finished product. Queer theory is not just about dismantling heteronormativity, it is also about dismantling white supremacy and seeing how these different forms of oppression overlap.

Combahee River Collective
The queer of color critique was also influenced by the Combahee River Collective Statement, written by a group of Black feminist lesbians in 1977 in Boston Massachusetts. The statement aimed to advance liberation for all people by identifying the interlocking nature of oppressive systems and laying out a blueprint for Black feminist organizing. The collective was also committed to long term struggle and built community a space that nurtured creativity, culture and care. Barbara Smith, Demita Fraizer and Beverly Smith were among the contributors to the statement, in which they recognize the activists that came before them- including but not limited to Angela Davis, Harriet Tubman, Sojourner Truth, Ida B. Wells, Mary Church Terrell- and articulate their political beliefs and approach to change-making. The Combahee River Collective statement calls for "the destruction of the political-economic systems of capitalism and imperialism as well as patriarchy." Although the contributors identified as feminists and lesbians, they rejected lesbian separatism: "we feel solidarity with progressive Black men and do not advocate the fractionalization that white women who are separatists demand. Our situation as Black people necessitates that we have solidarity around the fact of race [...] we struggle together with Black men against racism, while we also struggle with Black men about sexism." This framework of holding both interlocking identities, and advocating for the destruction of both oppressive systems of racism and patriarchy, extends to the fight against heteronormativity. While the term queer of color critique had not yet been articulated, the Combahee River Collective alludes to the idea that sexuality exists in the bodies and lived experiences of people that hold other marginal identities. Queerness cannot be extracted as its own experience separate from race and class, thus queer theory must acknowledge how race and class oppression affect queer people of color.

Gloria Anzaldua
Gloria Anzaldua, a Chicana lesbian author and activist, contributed to the queer of color critique by documenting and theorizing how queerness and sexuality interact with culture and language. In her book Borderlands/La Frontera: The New Mestiza, Anzaldua challenges readers to understand "borders," not merely as physical barriers that divide nation-states, but as an articulation of identity- invisible boundaries that exist inside the body. Anzaldua writes of her Chicana lesbian experience: "We're afraid of being abandoned by the mother, the culture, la Raza, for being unacceptable, faulty, damaged. Most of us unconsciously believe that if we reveal this unacceptable aspect of the self our mother/culture/race will totally reject us. To avoid rejection, some of us conform to the values of the culture, push the unacceptable parts into the shadows [...] We try to make ourselves conscious of the Shadow-Beast, stare at the sexual lust and lust for power and destruction we see on its face, discern among its features the under-shadow that the reigning order of heterosexual males project on our Beast. Yet still others of us take it another step: we try to waken the Shadow-Beast inside us." Anzaldua articulates herself always stuck at a border, attacked and rejected by both native culture and white culture for holding the truth of her lesbian identity: "Woman does not feel safe when her own culture, and white culture, are critical of her; when the males of all races hunt her as prey. Alienated from her mother culture, "alien" in the dominant culture, the woman of color does not feel safe within the inner life of her Self. Petrified, she can't respond, her face caught between, los intersticios, the spaces between the different worlds she inhabits." This account of queer experience illuminates how different forms of oppression manifest in the body. Anzaldua provides a narrative that explains "dual consciousness" of having to understand both dominant and non-dominant cultures to live in two worlds, both rejecting certain aspects of identity. Gloria Anzaldua draws on this narrative in an anthology titled This Bridge Called My Back: Writings by Radical Women of Color, which she coedited with Cherrie Moraga.  This Bridge Called My Back challenges the whiteness of mainstream queer discourse and uplifts and centers the political voices of marginalized women in an attempt to build international solidarity across difference: "We each are our sisters' and brothers' keepers; no one is an island or has ever been. Every person, animal, plant, stone is interconnected in a life and death symbiosis. We are each responsible for what is happening down the street, south of the border or across the sea." This provides a global perspective to queer theory and shows how individual liberation is bound to the international collective.

Kimberlé Crenshaw
Kimberlé Crenshaw articulates the need to create a new framework that identifies difference and positions it as a source of strength because "ignoring difference within groups contributes to tension among groups". Often organizations or social groups center the ways in which members are the same, identifying common interests, shared values and collective goals, instead of focusing on differences, which inevitably invisibilizes and silences the experiences of Black women and women of color. By looking at domestic violence, Crenshaw illustrates how women of color are subject to intersecting forces of oppression- racism and sexism- and how neither feminist nor antiracist theories nor practices adequately address or even acknowledge how those forces manifest in the lived experiences of women of color, especially those running from domestic abuse.

In a footnote, Crenshaw writes about how lesbian violence is often kept a secret, similar to violence within communities of color, because exposing violence makes an already marginalized group look worse in the eyes of the oppressor. Therefore, lesbians and women of color who experience violence in either queer or heterosexual relationships have to unfairly weigh the importance of holding their abuser accountable with the negative narrative that will be spread about their collective community, a narrative which they (as survivors) will also be hurt by. This reminds me of In the Dream House, a memoir about intimate violence within lesbian relationships. The author, Carmen Maria Machado, used memoir to shed light on the fact that violence exists in queer relationships just like it does in straight relationships. The fact that abuse is so often hidden, does not help victims. It is important to see harm in order to address it, without creating negative stereotypes about an entire group. This is important to the queer of color critique because if the experiences and needs of queer people of color are not recognized, addressed and centered in queer theory nor queer politics, it is impossible to create transformative radical change.

Limits of queer politics
Building on this scholarship, author and activist Cathy Cohen illuminates the misgivings, contradictions and limitations of queer politics as they are currently constructed, while highlighting how queer theory and practice have radical potential for transformative change (1997). As is, queer politics "is understood as "in your face" politics of a younger generation...a willingness to confront normalizing power." Yet, as Barbara Smith points out, queer activists too often  "seem to operate in a historical and ideological vacuum". Here lies one of the contradictions in queer theory: it unapologetically fights against normative hegemonic structures, but fails to see the nuances of white normativity and class oppression within and outside the queer community. Queer identifying people participate and benefit from dominant institutions based on class status, while heterosexual people on welfare get policed for their sexual behavior or promiscuity. What defines queerness? Cohen argues the term "queer" is associated with assumptions of race (whiteness) and class privilege, preventing queers of color from wanting to participate fully in the community: "Because of my multiple identities, which located me and other queer people of color at the margins in this country, my material advancement, my physical protection and my emotional wellbeing are constantly threatened."  An expanded understanding of queer, beyond sexual orientation, as a resistance to all oppressive systems of power, would be to broaden the scope of queer politics. Brittney Cooper articulates that "one can't truly be a feminist if you don't really love women. And loving women deeply and unapologetically is queer as fuck." Cooper extends the label of queer to mean resistance to and rejection of dominant culture's norms. The queer of color critique might incorporate this understanding of queer and argue, alongside Cohen, that in order to become more radical and liberatory, queer politics must center "the marginal positions of punks, bull daggers, and welfare queens, for example, [as] the basis for progressive transformative coalition building."

Modern day
Queer of color critique exists to challenge and push queer theory toward greater inclusivity and intersectionality. By centering the lived experiences of trans and gender non-conforming people of color, and operating in an anti-Black framework, transformative solutions and collective liberation become possible. In Unapologetic: A Black Queer and Feminist Mandate for Radical Movements, Charlene Carruthers- an organizer from Chicago- articulates a Black queer feminist lens as "a political praxis (practice and theory) based in Black feminist and LGBTQ traditions and knowledge, through which people and groups see to bring their full selves into the process of dismantling all systems of oppression. By using this lens, we are aided in creating alternatives of self-governance and self-determination, and by using it we can more effectively prioritize problems and methods that center historically marginalized people in our communities." In practice, organizations across the globe are doing work to dismantle systems of political oppression, create tangible change for people and seek joy in the process of the work. Among those practicing the queer of color critique include but are not limited to: The House of Tulip, Southern Fried Queer Pride, The Transgender Law Center and Spirit House. For example, the House of Tulip is a land justice organization that fights gentrification in New Orleans and provides affordable housing through community land trusts to trans and gender nonconforming people who are historically marginalized from accessing safe and stable housing. This work has long term political goals of disrupting racist and homophobic discrimination while providing tangible change to the experiences of trans and gender nonconforming young people, demonstrating how the queer of color critique can manifest in political practice.

As the queer of color critique grows and expands within the constant struggle for liberation, theorists continue to ask, what voices are being left out? How can international scholarship and queers from the global south be incorporated into the critique more equitably? Over the past few decades, it is clear that queer theory has in fact become queerer in its inclusion of diverse queer experiences, shaping a political framework that advocates for a world in which difference is strength and in which all people can thrive. While there are movements that still treat the white queer experience as universal, and there is still more work to do, many are coming to the realization that queerness exists as one of multiple intersecting identities, all of which need to be considered in order to dismantle white supremacy and capitalism.

References

Further reading
 Refuse The Silence, Women of Color in Academia Speak Out
 Third World Women's Alliance. Black Women's Manifesto (1970. On-line)
 Patricia Hill Collins, Black Feminist Thought: Knowledge, Consciousness and the Politics of Empowerment (1990) and Black Sexual Politics: African Americans, Gender, and the New Racism (Routledge, 2005)
 bell hooks, Ain't I a Woman?: Black Women and Feminism (1981)
 Molara Ogundipe-Leslie, Re-Creating Ourselves: African Women & Critical Transformations (1994)
 Home Girls: A Black Feminist Anthology (Kitchen Table: Women of Color Press, 1983; Reed. 2000)
 This Bridge Called My Back: Writings by Radical Women of Color, edited by Cherríe Moraga and Gloria E. Anzaldúa (Persephone Press, 1981; 2nd edn 1984, Kitchen Table: Women of Color Press; translated into Spanish in 2002 by Cherríe Moraga, Ana Castillo, and Norma Alarcón)

 Ahmed, Sara. Queer Phenomenology, 2006
 Rodríguez, Juana María. Sexual Futures, Queer Gestures, and Other Latina Longings.
 Nash, Jennifer. Black Body in Ecstasy: Reading Race, Reading Pornography.
 Grady, Jonathan, Rigoberto Marquez, and Peter Mclaren. A Critique of Neoliberalism with Fierceness: Queer Youth of Color Creating Dialogues of Resistance.
 Manalansan, Martin F. Race, Violence, and Neoliberal Spatial Politics in the Global City.
 Shah, Svati P. Queering the Indian City: Urbanism in the Era of Transnational LGBT Rights. Antipode: A Radical Journal of Geography, August 2014, 1–17.

 Anzaldúa, Gloria. "To(o) Queer the Writer—Loca, escritor y chicana," originally published 1991; in AnaLouise Keating, The Gloria Anzaldúa Reader, 163–175
 Hames-García, Michael. "Queer Theory Revisited," in Gay Latino Studies: A Critical Reader, ed. Michael Hames-García and Ernesto J. Martínez (Durham, NC: Duke University Press, 2011), 19–45.
 Holland, Sharon. The Erotic Life of Racism (Durham, NC: Duke University Press, 2012).
 Manalansan IV, Martin. Global Divas: Filipino Gay Men in the Diaspora.
 Vaid, Urvashi. Irresistible Revolution: Confronting Race, Class and the Assumptions of LGBT Politics (Magnus Books, 2012).

Critical theory
Feminist theory
Queer feminism
Ethnic studies
Same-sex sexuality
Black feminism
Multiculturalism
Colonialism
Intersectional feminism
Race and society


text:
/* cpg - 5/20/02 - with parts borrowed from gm.c and tcpip.c */

/* i need to close connections properly, so the crserver can exit, etc. */
/*   -- broker disconnects through the mothership? */
/*   -- crTeacDoDisconnect is wrong, but it's not even getting called */
/*      at the moment; the client application just quits */

/******************************************************
 * Notes-
 * -Is CR_TEAC_BUFFER_PAD 16?
 ******************************************************/

#define CR_TEAC_COPY_MSGS_TO_MAIN_MEMORY 1
#define CR_TEAC_USE_RECV_THREAD 0

#include <unistd.h>
#include <limits.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#if CR_TEAC_USE_RECV_THREAD
#include <pthread.h>
#endif

#include "teac.h"
#include "cr_error.h"
#include "cr_mem.h"
#include "cr_string.h"
#include "cr_net.h"
#include "cr_endian.h"
#include "net_internals.h"

#if ( CR_TEAC_USE_RECV_THREAD && ! CHROMIUM_THREADSAFE )
#error "Teac configuration error: USE_RECV_THREAD requires CHROMIUM_THREADSAFE"
#endif

#if ( CR_TEAC_USE_RECV_THREAD && ! CR_TEAC_COPY_MSGS_TO_MAIN_MEMORY )
#error "Teac configuration error: USE_RECV_THREAD requires CR_TEAC_COPY_MSGS_TO_MAIN_MEMORY!"
#endif

#ifdef never
#define CR_TEAC_SEND_CREDITS_THRESHOLD ( 1 << 18 )
#endif
#define CR_TEAC_SEND_CREDITS_THRESHOLD ( 1 << 16 )

/* some random bits.  Last must be 0 */
#define CR_TEAC_BUFFER_MAGIC 0x7b52e9e0

/* There must be 16 or fewer of these; they get packed into the
 * bottom 4 bits of a word containing CR_TEAC_BUFFER_MAGIC.
 */
typedef enum {
  CR_TEAC_KIND_SEND,
  CR_TEAC_KIND_FLOW_SEND,
  CR_TEAC_KIND_RECV,
  CR_TEAC_KIND_FLOW_RECV,
  CR_TEAC_KIND_RECV_LISTED
} CRTeacBufferKind;

typedef struct CRTeacConnection {
  CRConnection            *conn;
  struct CRTeacConnection *credit_prev;
  struct CRTeacConnection *credit_next;
  struct CRTeacBuffer     *incoming_head;
  struct CRTeacBuffer     *incoming_tail;
#ifdef CHROMIUM_THREADSAFE
  CRmutex                  msgListMutex;
#endif
} CRTeacConnection;

/* The union in the following struct gets forced to length 8, to
 * make sure there are no size ambiguities when passing between
 * architectures with 32bit and 64bit pointers.
 */
typedef struct CRTeacBuffer {
  unsigned int         magic;
  int                  len; /* used only with CR_TEAC_KIND_RECV_LISTED msgs */
  union {
    SBuffer*             sendBuffer;
    RBuffer*             rcvBuffer;
    struct CRTeacBuffer* incoming_next;
    char                 filler[8]; /* force size of union to 8 */
  } u;
} CRTeacBuffer;

#define CR_TEAC_BUFFER_PAD sizeof(CRTeacBuffer)

static struct {
  int                  initialized;
  int                  num_conns;
  CRNetReceiveFuncList *recv_list;
  CRNetCloseFuncList  *close_list;
  CRTeacConnection    *credit_head;
  CRTeacConnection    *credit_tail;
  unsigned int         inside_recv;
  void                *tcomm;
  char                 my_hostname[256];
  int                  my_rank;
  int                  low_context;
  int                  high_context;
  char                 *low_node;
  char                 *high_node;
  unsigned char        key[TEAC_KEY_SIZE];
#ifdef CHROMIUM_THREADSAFE
  CRmutex              teacAPIMutex;
  pthread_t            recvThread;
#endif
} cr_teac;

/* Forward declarations */
void *crTeacAlloc( CRConnection * );
void  crTeacFree( CRConnection *, void * );
int crTeacErrno( void );
char* crTeacErrorString( int err );
void crTeacInstantReclaim( CRConnection *conn, CRMessage *msg );
void crTeacSend( CRConnection *conn, void **bufp,
		 const void *start, unsigned int len );
CRConnection *crTeacSelect( void );
void crTeacAccept( CRConnection *conn, const char *hostname, unsigned short port );
int crTeacDoConnect( CRConnection *conn );
void crTeacDoDisconnect( CRConnection *conn );
void crTeacHandleNewMessage( CRConnection *conn, CRMessage *msg,
			     unsigned int len );
void crTeacSingleRecv( CRConnection *conn, void *buf, unsigned int len );
void crTeacSendExact( CRConnection *conn, const void *buf, unsigned int len );
int crTeacRecv( void );
static CRTeacConnection *crTeacConnectionLookup( int teac_id );
void* crTeacRecvThread( void* args );

int
crTeacErrno( void )
{
  int err = errno;
  errno = 0;
  return err;
}

char *
crTeacErrorString( int err )
{
  static char buf[512], *temp;

  temp = strerror( err );
  if ( temp )
    {
      crStrncpy( buf, temp, sizeof(buf)-1 );
    }
  else
    {
      sprintf( buf, "err=%d", err );
    }

  return buf;
}

static void
crTeacCreditIncrease( CRTeacConnection *teac_conn )
{
  CRTeacConnection *parent;
  int               my_credits;

  /* move this node up the doubly-linked, if it isn't already in the
   * right position */

  parent = teac_conn->credit_prev;
  my_credits = teac_conn->conn->recv_credits;
  if ( parent && parent->conn->recv_credits < my_credits )
    {
      /* we can't be at the head of the list, because our parent is
       * non-NULL */

      /* are we the tail of the list? */
      if ( cr_teac.credit_tail == teac_conn )
	{
	  /* yes, pull up the tail pointer, and fix our parent to be tail */
	  cr_teac.credit_tail = parent;
	  parent->credit_next = NULL;
	}
      else
	{
	  /* no, just link around us */
	  parent->credit_next = teac_conn->credit_next;
	  teac_conn->credit_next->credit_prev = parent;
	}

      /* walk up the list until we find a guy with more credits than
       * us or we reach the head */
      while ( parent && parent->conn->recv_credits < my_credits )
	{
	  parent = parent->credit_prev;
	}

      /* reinsert us -- we know there is somebody else in the list
       * (and thus we won't be the tail, because we moved up),
       * otherwise we would have been the head, and never bothered
       * trying to move ourself */
      if ( parent )
	{
	  CRTeacConnection *child = parent->credit_next;
	  teac_conn->credit_next = child;
	  child->credit_prev = teac_conn;

	  parent->credit_next = teac_conn;
	  teac_conn->credit_prev = parent;
	}
      else
	{
	  CRTeacConnection *child = cr_teac.credit_head;
	  teac_conn->credit_next = child;
	  child->credit_prev = teac_conn;

	  cr_teac.credit_head = teac_conn;
	  teac_conn->credit_prev = NULL;
	}
    }
}

static void
crTeacCreditZero( CRTeacConnection *teac_conn )
{
  CRASSERT( cr_teac.credit_head == teac_conn );

  /* if we aren't already at the tail of the list, */
  if ( cr_teac.credit_tail != teac_conn )
    {
      /* then pull us off the head, */
      cr_teac.credit_head = teac_conn->credit_next;
      cr_teac.credit_head->credit_prev = NULL;

      /* and put us on the tail */
      cr_teac.credit_tail->credit_next = teac_conn;
      teac_conn->credit_prev = cr_teac.credit_tail;
      teac_conn->credit_next = NULL;

      cr_teac.credit_tail = teac_conn;
    }
}

#if CR_TEAC_USE_RECV_THREAD
void* crTeacRecvThread( void* args )
{
  crDebug("crTeacRecvThread: starting listener thread.");
  while (1) {
    CRConnection* conn = crTeacSelect( );
    if ( conn ) {
      RBuffer* rbuf= NULL;
      CRTeacBuffer* teacMsg= NULL;
      CRTeacBuffer* cloneMsg= NULL;
      CRTeacConnection* teac_conn= crTeacConnectionLookup( conn->teac_id );
#ifdef never
      crDebug("crTeacRecvThread: beginning with allocation sizes %ld, %ld",
	      ((Tcomm*)cr_teac.tcomm)->totalSendBufferBytesAllocated,
	      ((Tcomm*)cr_teac.tcomm)->totalRecvBufferBytesAllocated);

      crDebug("crTeacRecvThread: entering teac_Recv on id %d",
	      conn->teac_id);
#endif
#ifdef CHROMIUM_THREADSAFE
      crLockMutex(&cr_teac.teacAPIMutex);
#endif
      rbuf = teac_Recv( cr_teac.tcomm, conn->teac_id );
#ifdef CHROMIUM_THREADSAFE
      crUnlockMutex(&cr_teac.teacAPIMutex);
#endif
#ifdef never
      crDebug("crTeacRecvThread: finished teac_Recv on id %d; got RBuffer at 0x%x",
	      conn->teac_id,(int)rbuf);
#endif
      if ( !rbuf ) {
	crError( "crTeacRecvThread:  teac_Recv( teac_id=%d ) failed",
		 conn->teac_id );
      }

      teacMsg= (CRTeacBuffer*)(rbuf->buf);
#ifdef never
      crDebug("crTeacRecvThread: new msg from teac_id %d is %ld bytes, at %lx",
	      conn->teac_id, rbuf->totSize,(long)(teacMsg+1));
#endif

      teacMsg->magic= (CR_TEAC_BUFFER_MAGIC | (int)CR_TEAC_KIND_RECV);
      teacMsg->u.rcvBuffer= rbuf;

      cloneMsg= (CRTeacBuffer*)crAlloc(rbuf->validSize);
      crMemcpy( cloneMsg, teacMsg, rbuf->validSize );
      cloneMsg->magic= (CR_TEAC_BUFFER_MAGIC | (int)CR_TEAC_KIND_RECV_LISTED);
      /* len field must be valid for LISTED messages */
      cloneMsg->len= rbuf->validSize - CR_TEAC_BUFFER_PAD;
      cloneMsg->u.incoming_next= NULL;

      crLockMutex(&(teac_conn->msgListMutex));
      if (teac_conn->incoming_tail) {
	teac_conn->incoming_tail->u.incoming_next= cloneMsg;
	teac_conn->incoming_tail= cloneMsg;
      }
      else {
	/* This is the first in the list */
	teac_conn->incoming_head= teac_conn->incoming_tail= cloneMsg;
      }
      crUnlockMutex(&(teac_conn->msgListMutex));
      crTeacFree(conn,(CRMessage*)(teacMsg+1)); /* frees original message */
#ifdef never
      crDebug("crTeacRecvThread: appended new msg to incoming at %lx, len %d",
	      (long)(cloneMsg+1), cloneMsg->len);
#endif
    }
    else {
      /* Let's try just spinning */
#ifdef never
      sched_yield();
#endif
    }
  }
  (void)args;
  return NULL;
}
#endif

static void
crTeacAddConnection( CRConnection *conn )
{
  CRTeacConnection *teac_conn = crAlloc( sizeof( CRTeacConnection ) );

  CRASSERT( teac_conn );

  teac_conn->conn = conn;
  teac_conn->credit_next = NULL;
#ifdef CHROMIUM_THREADSAFE
  crInitMutex(&(teac_conn->msgListMutex));
#endif
  teac_conn->incoming_head= teac_conn->incoming_tail= NULL;
  if ( cr_teac.credit_head ) {
    teac_conn->credit_prev = cr_teac.credit_tail;
    cr_teac.credit_tail->credit_next = teac_conn;
    cr_teac.credit_tail = teac_conn;
  }
  else {
    teac_conn->credit_prev = NULL;
    cr_teac.credit_head = teac_conn;
    cr_teac.credit_tail = teac_conn;
#if CR_TEAC_USE_RECV_THREAD
    /* First incoming teac connection, so start the receiver thread */
#ifdef never
    pthread_init();
#endif
    crDebug("crTeacAddConnection: about to start listener thread");
    pthread_create(&cr_teac.recvThread, NULL, crTeacRecvThread, NULL);
    pthread_detach(cr_teac.recvThread);
#endif
  }

  crTeacCreditIncrease( teac_conn );
}

static void
crTeacSendCredits( CRConnection *conn )
{
  CRTeacBuffer *buf  = NULL;
  SBuffer *sbuf = NULL;
  CRMessageFlowControl *msg = NULL;

  CRASSERT( conn->recv_credits > 0 );

  if (teac_sendBufferAvailable(cr_teac.tcomm)) {
#ifdef never
    crDebug( "crTeacSendCredits:  sending %d credits to %s:%d, id %d",
	     conn->recv_credits, conn->hostname, conn->teac_rank,
	     conn->teac_id);
#endif

#ifdef CHROMIUM_THREADSAFE
    crLockMutex(&cr_teac.teacAPIMutex);
#endif
    sbuf= teac_getSendBuffer( cr_teac.tcomm,
			      CR_TEAC_BUFFER_PAD + conn->mtu );
#ifdef CHROMIUM_THREADSAFE
    crUnlockMutex(&cr_teac.teacAPIMutex);
#endif

    buf = (CRTeacBuffer*) sbuf->buf;
    buf->magic= (CR_TEAC_BUFFER_MAGIC | (int)CR_TEAC_KIND_FLOW_SEND);
    buf->len= 0; /* not used for this msg type */
    buf->u.sendBuffer= sbuf;
    sbuf->validSize = CR_TEAC_BUFFER_PAD;
    *((SBuffer **) buf ) = sbuf;

    msg = (CRMessageFlowControl *)( buf+1 );
    msg->header.type    = CR_MESSAGE_FLOW_CONTROL;
    msg->header.conn_id = conn->id;
    msg->credits        = conn->recv_credits;

    sbuf->validSize += sizeof( CRMessageFlowControl );
    conn->send_credits -= sbuf->validSize;

#ifdef CHROMIUM_THREADSAFE
    crLockMutex(&cr_teac.teacAPIMutex);
#endif
    teac_Send( cr_teac.tcomm, &(conn->teac_id), 1, sbuf, buf );
#ifdef CHROMIUM_THREADSAFE
    crUnlockMutex(&cr_teac.teacAPIMutex);
#endif

    conn->recv_credits = 0;

#ifdef never
    crDebug( "crTeacSendCredits:  sent credits to %s:%d",
	     conn->hostname, conn->teac_rank );
#endif
  }
  else {
#ifdef never
    crDebug( "crTeacSendCredits: no buffer; deferring sending to %s:%d, id %d",
	     conn->hostname, conn->teac_rank, conn->teac_id);
#endif
  }

}

static void
crTeacMaybeSendCredits( void )
{
  if ( cr_teac.credit_head &&
       cr_teac.credit_head->conn->recv_credits >=
       CR_TEAC_SEND_CREDITS_THRESHOLD )
    {
      crTeacSendCredits( cr_teac.credit_head->conn );
      crTeacCreditZero( cr_teac.credit_head );
    }
}

static void
crTeacWaitForSendCredits( CRConnection *conn )
{
#ifdef never
  crDebug( "crTeacWaitForSendCredits:  waiting for credits "
	   "to talk to %s:%d (total=%d)",
	   conn->hostname, conn->teac_rank,
	   conn->send_credits );
#endif

  while ( conn->send_credits <= 0 ) {
    crTeacRecv( );
  }

#ifdef never
  crDebug( "crTeacWaitForSendCredits:  found credits "
	   "to talk to %s:%d (total=%d)",
	   conn->hostname, conn->teac_rank, conn->send_credits );
#endif
}

static CRTeacConnection *
crTeacConnectionLookup( int teac_id )
{
  CRTeacConnection *teac_conn = cr_teac.credit_head;
  CRConnection     *conn = NULL;

  while ( teac_conn ) {
    conn = teac_conn->conn;
    if ( conn->teac_id == teac_id )
      return teac_conn;

    teac_conn = teac_conn->credit_next;
  }

  return NULL;
}

void *
crTeacAlloc( CRConnection *conn )
{
  SBuffer *sbuf = NULL;
  CRTeacBuffer *buf  = NULL;
  CRMessage* msg= NULL;

#ifdef CHROMIUM_THREADSAFE
    crLockMutex(&cr_teac.teacAPIMutex);
#endif
  sbuf= teac_getUnreadySendBuffer( cr_teac.tcomm,
				   CR_TEAC_BUFFER_PAD + conn->mtu );
#ifdef CHROMIUM_THREADSAFE
    crUnlockMutex(&cr_teac.teacAPIMutex);
#endif
  buf = (CRTeacBuffer*) sbuf->buf;
  buf->magic= (CR_TEAC_BUFFER_MAGIC | CR_TEAC_KIND_SEND);
  buf->len= 0; /* not used for this msg type */
  buf->u.sendBuffer= sbuf;
  sbuf->validSize = CR_TEAC_BUFFER_PAD;

  msg = (CRMessage *)( buf+1 );
  msg->header.conn_id = conn->id;

#ifdef never
  crDebug("crTeacAlloc: sizes %ld, %ld; alloc %d at %lx",
	  ((Tcomm*)cr_teac.tcomm)->totalSendBufferBytesAllocated,
	  ((Tcomm*)cr_teac.tcomm)->totalRecvBufferBytesAllocated,
	  CR_TEAC_BUFFER_PAD + conn->mtu,(long)msg);
#endif
  return (void *)msg;
}

void
crTeacFree( CRConnection *conn, void *buf )
{
  CRMessage* msg= (CRMessage*)buf;
  CRTeacBuffer* teacBuf= ((CRTeacBuffer*)msg) - 1;
  CRTeacBufferKind kind= (CRTeacBufferKind)(teacBuf->magic & 0xF);

  switch (kind) {
  case CR_TEAC_KIND_RECV:
    {
      RBuffer* rbuf= teacBuf->u.rcvBuffer;
      conn->recv_credits += rbuf->validSize;
#ifdef never
      crDebug("crTeacFree: sizes %ld, %ld; freeing %ld at %lx",
	      ((Tcomm*)cr_teac.tcomm)->totalSendBufferBytesAllocated,
	      ((Tcomm*)cr_teac.tcomm)->totalRecvBufferBytesAllocated,
	      (rbuf->totSize),(long)msg);

      crDebug( "crTeacFree: freeing RBuffer at 0x%x from buffer 0x%x",
	       (int)rbuf,(int)buf);
#endif
#ifdef CHROMIUM_THREADSAFE
    crLockMutex(&cr_teac.teacAPIMutex);
#endif
      teac_Dispose( cr_teac.tcomm, rbuf );
#ifdef CHROMIUM_THREADSAFE
    crUnlockMutex(&cr_teac.teacAPIMutex);
#endif
      crTeacCreditIncrease( crTeacConnectionLookup( conn->teac_id ) );
    }
    break;
  case CR_TEAC_KIND_RECV_LISTED:
    {
      crFree(teacBuf);
    }
    break;
  case CR_TEAC_KIND_FLOW_RECV:
    {
      RBuffer* rbuf= teacBuf->u.rcvBuffer;
      conn->recv_credits += rbuf->validSize;
      crWarning("crTeacFree: misplaced CR_TEAC_KIND_FLOW_RECV message; freeing");
#ifdef CHROMIUM_THREADSAFE
    crLockMutex(&cr_teac.teacAPIMutex);
#endif
      teac_Dispose( cr_teac.tcomm, rbuf );
#ifdef CHROMIUM_THREADSAFE
    crUnlockMutex(&cr_teac.teacAPIMutex);
#endif
    }
    break;
  case CR_TEAC_KIND_SEND:
    {
      crWarning("crTeacFree: misplaced CR_TEAC_KIND_SEND message; losing it!");
    }
    break;
  case CR_TEAC_KIND_FLOW_SEND:
    {
      crWarning("crTeacFree: misplaced CR_TEAC_KIND_FLOW_SEND message; losing it!");
    }
    break;
  }
}

void
crTeacInstantReclaim( CRConnection *conn, CRMessage *msg )
{
  /* Do nothing- message will be freed after dispatching in crTeacRecv() */
#ifdef never
  crDebug("crTeacInstantReclaim: got %d credits from %s:%d",
	  ((CRMessageFlowControl*)msg)->credits,
	  conn->hostname,conn->teac_rank);
#endif
}

void
crTeacSend( CRConnection *conn, void **bufp,
	    const void *start, unsigned int len )
{
  CRMessage *buf = NULL;
  CRTeacBuffer* teacBuf= NULL;
  SBuffer *sbuf;
  CRTeacBufferKind kind;

#ifdef never
  crDebug("crTeacSend: beginning with allocation sizes %ld, %ld",
	  ((Tcomm*)cr_teac.tcomm)->totalSendBufferBytesAllocated,
	  ((Tcomm*)cr_teac.tcomm)->totalRecvBufferBytesAllocated);
#endif

  if ( cr_teac.inside_recv )
    crError( "crTeacSend:  cannot be called with crTeacRecv" );

  while ( crTeacRecv( ) )
    ;

  if ( conn->send_credits <= 0 )
    crTeacWaitForSendCredits( conn );

  if ( bufp == NULL ) {
    buf = (CRMessage*) crTeacAlloc( conn );
    crMemcpy( (void*)buf, start, len );
  }
  else {
    buf = (CRMessage *)( *bufp );
  }

  teacBuf= ((CRTeacBuffer*)buf)-1;
  kind= (CRTeacBufferKind)(teacBuf->magic & 0xF);
  if (kind != CR_TEAC_KIND_SEND)
    crError("crTeacSend: someone passed me a buffer of type %d!",kind);
  sbuf = teacBuf->u.sendBuffer;

  sbuf->validSize += len;
  conn->send_credits -= sbuf->validSize;

  crDebug("crTeacSend: entering send block to %d, msg type %d",
	  conn->teac_id,(((CRMessage*)start)->header.type-CR_MESSAGE_OPCODES));
#if CR_TEAC_USE_RECV_THREAD
  while (!teac_sendBufferAvailable(cr_teac.tcomm)) {
    /* Let's try just spinning */
#ifdef never
    sched_yield(); /* let recieve thread run while we wait */
#endif
  }
#endif
#ifdef never
  crDebug("crTeacSend: entering makeSendBufferReady to %d, msg type %d",
	  conn->teac_id,(((CRMessage*)start)->header.type-CR_MESSAGE_OPCODES));
#endif
#ifdef CHROMIUM_THREADSAFE
  crLockMutex(&cr_teac.teacAPIMutex);
#endif
  sbuf= teac_makeSendBufferReady( cr_teac.tcomm, sbuf );
#ifdef never
  crDebug("crTeacSend: Sending to id %d",conn->teac_id );
#endif
  if (bufp==NULL)
    teac_Send( cr_teac.tcomm, &(conn->teac_id), 1, sbuf, teacBuf );
  else
    teac_Send( cr_teac.tcomm, &(conn->teac_id), 1, sbuf,
	       (void *)((char *) start - CR_TEAC_BUFFER_PAD ) );
#ifdef CHROMIUM_THREADSAFE
  crUnlockMutex(&cr_teac.teacAPIMutex);
#endif
#ifdef never
  crDebug("crTeacSend: finished Send of msg type %d to %d; loc %lx",
	  (((CRMessage*)start)->header.type-CR_MESSAGE_OPCODES),
	  conn->teac_id, (long)buf);
#endif
  /* I have the sense that we're supposed to set *bufp to NULL here,
   * but doing so breaks things.
   */
}

CRConnection *
crTeacSelect( void )
{
  int  count    = 0;
  int *teac_ids = crAlloc( sizeof( int ) * cr_teac.num_conns );
  int  ready_id = -1;
  CRTeacConnection *teac_conn = NULL;

  /* Build a list of currently valid teac_ids */
  teac_conn = cr_teac.credit_head;
  while ( teac_conn ) {
    teac_ids[count] = teac_conn->conn->teac_id;
    count++;

    teac_conn = teac_conn->credit_next;
  }

  /* Poll the connections */
#ifdef CHROMIUM_THREADSAFE
  crLockMutex(&cr_teac.teacAPIMutex);
#endif
  ready_id = teac_Poll( cr_teac.tcomm, teac_ids, count );
#ifdef CHROMIUM_THREADSAFE
  crUnlockMutex(&cr_teac.teacAPIMutex);
#endif
  crFree(teac_ids);
  if ( ready_id == -1 )
    return NULL;

  /* Search for the connection with the proper teac_id */
  teac_conn = crTeacConnectionLookup( ready_id );
  if ( teac_conn ) {
#ifdef never
    crDebug( "crTeacSelect:  teac_id=%d has data available",
	     teac_conn->conn->teac_id );
#endif
    return teac_conn->conn;
  }

  return NULL;
}

int
crTeacRecv( void )
{
  CRConnection *conn = NULL;
  RBuffer *rbuf = NULL;
  CRMessage* msg= NULL;
  CRTeacConnection *teac_conn= NULL;
  CRTeacBuffer* teacMsg= NULL;
  CRTeacBuffer* cloneMsg= NULL;
  int len = 0;

  cr_teac.inside_recv++;

  crTeacMaybeSendCredits( );

#if CR_TEAC_USE_RECV_THREAD

  teac_conn= cr_teac.credit_head;
  teacMsg= NULL;
  while (teac_conn ) {
    if (teac_conn->incoming_head) {
      /* This connection has at least one incoming message */
      crLockMutex(&(teac_conn->msgListMutex));
      teacMsg= teac_conn->incoming_head;
      teac_conn->incoming_head= teacMsg->u.incoming_next;
      if (teac_conn->incoming_tail==teacMsg)
	teac_conn->incoming_tail= NULL;
      crUnlockMutex(&(teac_conn->msgListMutex));
      msg= (CRMessage*)(teacMsg+1);
      len= teacMsg->len;
      conn= teac_conn->conn;
      crDebug("crTeacRecv: popped msg from incoming at %lx, length %d",
	      (long)msg, len);
      break;
    }
    teac_conn= teac_conn->credit_next;
  }
  if (!teacMsg) {
    cr_teac.inside_recv--;
    return 0;
  }

#else

  conn = crTeacSelect( );
  if ( !conn ) {
    cr_teac.inside_recv--;
    return 0;
  }

#ifdef never
  crDebug("crTeacRecv: beginning with allocation sizes %ld, %ld",
	  ((Tcomm*)cr_teac.tcomm)->totalSendBufferBytesAllocated,
	  ((Tcomm*)cr_teac.tcomm)->totalRecvBufferBytesAllocated);

  crDebug("crTeacRecv: entering teac_Recv on id %d",
	  conn->teac_id);
#endif
#ifdef CHROMIUM_THREADSAFE
  crLockMutex(&cr_teac.teacAPIMutex);
#endif
  rbuf = teac_Recv( cr_teac.tcomm, conn->teac_id );
#ifdef CHROMIUM_THREADSAFE
  crUnlockMutex(&cr_teac.teacAPIMutex);
#endif
#ifdef never
  crDebug("crTeacRecv: finished teac_Recv on id %d; got RBuffer at 0x%x",
	  conn->teac_id,(int)rbuf);
#endif
  if ( !rbuf ) {
    crError( "crTeacRecv:  teac_Recv( teac_id=%d ) failed",
	     conn->teac_id );
  }

  teacMsg= (CRTeacBuffer*)(rbuf->buf);
  msg= (CRMessage*)(teacMsg+1);
  len = rbuf->validSize - CR_TEAC_BUFFER_PAD;
#ifdef never
  crDebug("crTeacRecv: new msg from teac_id %d is %ld bytes, type %d, at %lx",
	  conn->teac_id, rbuf->totSize,
	  (int)(msg->header.type-CR_MESSAGE_OPCODES),(long)msg);
#endif

  teacMsg->magic= (CR_TEAC_BUFFER_MAGIC | (int)CR_TEAC_KIND_RECV);
  teacMsg->u.rcvBuffer= rbuf;

#if CR_TEAC_COPY_MSGS_TO_MAIN_MEMORY
  cloneMsg= (CRTeacBuffer*)crAlloc(rbuf->validSize);
  crMemcpy( cloneMsg, teacMsg, rbuf->validSize );
  cloneMsg->magic= (CR_TEAC_BUFFER_MAGIC | (int)CR_TEAC_KIND_RECV_LISTED);
  cloneMsg->len= len; /* valid for LISTED messages */
  cloneMsg->u.rcvBuffer= NULL;
  crTeacFree(conn,msg); /* frees original message */
  msg= (CRMessage*)(cloneMsg+1); /* Leave the clone in its place */
#endif

#endif

  crNetDispatchMessage( cr_teac.recv_list, conn, msg, len );

  /* CR_MESSAGE_OPCODES is freed in
   * crserverlib/server_stream.c
   *
   * OOB messages are the programmer's problem.  -- Humper 12/17/01 */
  if (msg->header.type != CR_MESSAGE_OPCODES
      && msg->header.type != CR_MESSAGE_OOB) {
    crTeacFree( conn, msg );
  }

  cr_teac.inside_recv--;

  return 1;
}

void crTeacInit( CRNetReceiveFuncList *rfl, CRNetCloseFuncList *cfl,
		 unsigned int mtu )
{
  (void) mtu;
  cr_teac.recv_list = rfl;
  cr_teac.close_list = cfl;
  int i;
  long key_sum= 0;

  if ( cr_teac.initialized )
    {
      return;
    }

  if ( crGetHostname( cr_teac.my_hostname, sizeof( cr_teac.my_hostname ) ) )
    {
      crError( "crTeacInit:  couldn't determine my own hostname!" );
    }
  strtok( cr_teac.my_hostname, "." );

  if ((cr_teac.low_node==NULL) || (cr_teac.high_node==NULL))
    {
      crError( "crTeacInit: node range is not set!" );
    }

#ifdef CHROMIUM_THREADSAFE
  crInitMutex(&cr_teac.teacAPIMutex);
  cr_teac.recvThread= (pthread_t)0;
#endif

  key_sum= 0;
  for (i=0; i<(int)sizeof(cr_teac.key); i++) key_sum += cr_teac.key[i];
  if (key_sum==0) /* key not initialized */
    crStrncpy((char*)&(cr_teac.key), "This is pretty random!",
	      sizeof(cr_teac.key));
#ifdef CHROMIUM_THREADSAFE
  crLockMutex(&cr_teac.teacAPIMutex);
#endif
  cr_teac.tcomm = teac_Init( cr_teac.low_node, cr_teac.high_node,
				 cr_teac.low_context, cr_teac.high_context,
				 cr_teac.my_rank, cr_teac.key );
#ifdef CHROMIUM_THREADSAFE
  crUnlockMutex(&cr_teac.teacAPIMutex);
#endif
  if ( !cr_teac.tcomm )
    crError( "crTeacInit:  teac_Init( %d, %d, %d ) failed",
	     cr_teac.low_context, cr_teac.high_context,
	     cr_teac.my_rank );

  cr_teac.num_conns = 0;

  cr_teac.credit_head = NULL;
  cr_teac.credit_tail = NULL;
  cr_teac.inside_recv = 0;

  cr_teac.initialized = 1;
}

void
crTeacAccept( CRConnection *conn, const char *hostname, unsigned short port )
{
  CRConnection *mother;
  char          response[8096];
  char          client_hostname[256];
  int           client_rank;
  int           client_endianness;

  crDebug( "crTeacAccept is being called -- "
	   "brokering the connection through the mothership!." );

  mother = __copy_of_crMothershipConnect( );

  /* Tell the mothership I'm willing to receive a client, and what my Teac info is */
  if (!__copy_of_crMothershipSendString( mother, response,
					 "acceptrequest quadrics %s %d %d",
					 cr_teac.my_hostname, cr_teac.my_rank,
					 conn->endianness ) ) {
    crError( "crTeacAccept:  Mothership didn't like my accept request" );
  }

  /* The response will contain the Teac information for the guy who accepted
   * this connection.  The mothership will sit on the acceptrequest
   * until someone connects. */
  sscanf( response, "%d %s %d %d",
	  &(conn->id), client_hostname, &(client_rank), &(client_endianness) );

  /* deal with endianness here */

  conn->hostname  = crStrdup(client_hostname);
  conn->teac_rank = client_rank;

  crDebug( "crTeacAccept:  opening connection to %s:%d",
	   conn->hostname, conn->teac_rank );
#ifdef CHROMIUM_THREADSAFE
  crLockMutex(&cr_teac.teacAPIMutex);
#endif
  conn->teac_id = teac_getConnId( cr_teac.tcomm,
				  conn->hostname,
				  conn->teac_rank );
#ifdef CHROMIUM_THREADSAFE
  crUnlockMutex(&cr_teac.teacAPIMutex);
#endif
  if ( conn->teac_id < 0 ) {
    crError( "crTeacAccept:  couldn't establish an Teac connection with %s:%d",
	     conn->hostname, conn->teac_rank );
  }
  crDebug( "crTeacAccept:  connection to %s:%d has teac_id=%d\n",
	   conn->hostname, conn->teac_rank, conn->teac_id );

  /* NOW, we can add the connection, since we have enough information
   * to uniquely determine the sender when we get a packet! */
  crTeacAddConnection( conn );

  __copy_of_crMothershipDisconnect( mother );

  (void) port;
}

/* The function that actually connects.  This should only be called by clients
 * Servers have another way to set up the connection. */
int
crTeacDoConnect( CRConnection *conn )
{
  CRConnection *mother;
  char          response[8096];
  int           server_endianness;

  crDebug( "crTeacDoConnect is being called -- "
	   "brokering the connection through the mothership!" );

  mother = __copy_of_crMothershipConnect( );

  /* Tell the mothership who I want to connect to, and what my Teac info is */
  if (!__copy_of_crMothershipSendString( mother, response,
					 "connectrequest quadrics %s %d %s %d %d",
					 conn->hostname, conn->teac_rank,
					 cr_teac.my_hostname, cr_teac.my_rank,
					 conn->endianness ) )
    {
      crError( "crTeacDoConnect:  Mothership didn't like my connect request" );
    }

  /* The response will contain the Teac information for the guy who accepted
   * this connection.  The mothership will sit on the connectrequest
   * until someone accepts. */

  sscanf( response, "%d %d", &(conn->id), &(server_endianness) );

  /* deal with endianness here */

  crDebug( "crTeacDoConnect:  opening connection to %s:%d",
	   conn->hostname, conn->teac_rank );
#ifdef CHROMIUM_THREADSAFE
  crLockMutex(&cr_teac.teacAPIMutex);
#endif
  conn->teac_id = teac_getConnId( cr_teac.tcomm,
				  conn->hostname,
				  conn->teac_rank );
#ifdef CHROMIUM_THREADSAFE
  crUnlockMutex(&cr_teac.teacAPIMutex);
#endif
  if ( conn->teac_id < 0 ) {
    crError( "crTeacDoConnect:  couldn't establish an Teac connection with %s:%d",
	     conn->hostname, conn->teac_rank );
  }
  crDebug( "crTeacDoConnect:  connection to %s:%d has teac_id=%d\n",
	   conn->hostname, conn->teac_rank, conn->teac_id );

  /* NOW, we can add the connection, since we have enough information
   * to uniquely determine the sender when we get a packet! */
  crTeacAddConnection( conn );

  __copy_of_crMothershipDisconnect( mother );

  return 1;
}

void crTeacDoDisconnect( CRConnection *conn )
{
  crDebug( "crTeacCloseConnection:  shutting down Teac" );
#ifdef CHROMIUM_THREADSAFE
  crLockMutex(&cr_teac.teacAPIMutex);
#endif
  teac_Close( cr_teac.tcomm );
#ifdef CHROMIUM_THREADSAFE
  crUnlockMutex(&cr_teac.teacAPIMutex);
#endif
  crNetCallCloseCallbacks(conn);
}

void
crTeacHandleNewMessage( CRConnection *conn, CRMessage *msg,
			unsigned int len )
{
  crError( "crTeacHandleNewMessage should not get called." );

  (void) conn;
  (void) msg;
  (void) len;
}

void
crTeacSingleRecv( CRConnection *conn, void *buf, unsigned int len )
{
  crError( "crTeacSingleRecv should not get called." );
  (void) conn;
  (void) buf;
  (void) len;
}

void
crTeacSendExact( CRConnection *conn, const void *buf, unsigned int len )
{
  crError( "crTeacSendExact should not get called." );
  (void) conn;
  (void) buf;
  (void) len;
}

void crTeacConnection( CRConnection *conn )
{
  CRASSERT( cr_teac.initialized );

  conn->type  = CR_TEAC;
  conn->Alloc = crTeacAlloc;
  conn->Send  = crTeacSend;
  conn->SendExact  = crTeacSendExact;
  conn->Recv  = crTeacSingleRecv;
  conn->Free  = crTeacFree;
  conn->Accept = crTeacAccept;
  conn->Connect = crTeacDoConnect;
  conn->Disconnect = crTeacDoDisconnect;
  conn->InstantReclaim = crTeacInstantReclaim;
  conn->HandleNewMessage = crTeacHandleNewMessage;
  conn->index = cr_teac.num_conns;
  conn->sizeof_buffer_header = sizeof( CRTeacBuffer );
  conn->actual_network = 1;

  cr_teac.num_conns++;
}

void crTeacSetRank( int rank )
{
  cr_teac.my_rank = rank;
}

void
crTeacSetContextRange( int low_context, int high_context )
{
  cr_teac.low_context  = low_context;
  cr_teac.high_context = high_context;
  crDebug( "crTeacSetContextRange:  using contexts %d-%d",
	   cr_teac.low_context, cr_teac.high_context );
}

void
crTeacSetNodeRange( const char *low_node, const char *high_node )
{
  char* low= crStrdup( low_node );
  char* high= crStrdup( high_node );
  cr_teac.low_node  = strtok( low, "'" );
  cr_teac.high_node = strtok( high, "'" );
  crDebug( "crTeacSetNodeRange:  low node=%s, high node=%s",
	   cr_teac.low_node, cr_teac.high_node );
}

void
crTeacSetKey( const unsigned char* key, const int keyLength )
{
  int i;
  char msgbuf[3*TEAC_KEY_SIZE+1];
  char* runner= msgbuf;
  int bytesToCopy= (keyLength<TEAC_KEY_SIZE)?keyLength:TEAC_KEY_SIZE;
  crMemcpy(&(cr_teac.key),key,bytesToCopy);
  for (i=0; i<TEAC_KEY_SIZE; i++) {
    sprintf(runner,"%02x,",cr_teac.key[i]);
    runner += 3;
  }
  *runner= '\0';
  crDebug( "crTeacSetKey: Teac key is [%s]", msgbuf );
}

redpajama_set_name: RedPajamaGithub


This is the second year for the Mystic Spike waist harness. The Mystic Spike harness has become the favorite to first time waist harness users who are looking for range of motion with the waist harness, but also a waist harness that won't ride up, and will be "cushy" and very comfortable.
The Mystic Spike waist harness is an extremely comfortable harness. The Triple Padding construction and the Relax Edge Technology create a cushy and comfortable shell, while the Kinetic Back Support with the Spreader Down System and the non-slip interior make the harness to "hug" your lower back and not ride up. Finally, thermoformed harness interior makes the harness wrapping around the human body seamlessly.
Tons of other features make the Mystic Spike waist harness 2010 a great harness.


I'm a little bias, but I think the Cyberoam CR series UTM (Unified Threat Management) offering is head and shoulders above other UTM appliances on the market.
Some people will consider all UTMs the same, rather than looking at the components that make up the whole, or they consider it a point solution where only one or two features are used, rather than making the most of the whole solution.
The Cyberoam CR series solution is very cost effective and can go head-to-head with all the major UTM appliances, and in my opinion out shine them as well!
To help compliment this solution, there is also the Cyberoam Centralised Console (CCC), which can manage multiple Cyberoam UTM appliances, as well as software based solution to offer Data Protection & Encryption, Device Management, Application Control and Asset Management.


Our latest Whitney bag is now offered in a slightly larger size with a braided hoop. It's designed with all of the functionality of the original, including the expanded gusset compartment and symmetrical interior compartment in the front and back. The bag opens up to a faux suede lined interior that's spacious enough for storing your wallet and an iPhone 8. Made of fine nappa lambskin designed for a smooth natural finish and ships with a fine shoulder strap.


Massive explosion in Tianjin China as being reported by The Times of Israel (read more). Thus far 50 people are said to be injured. Initial reports suggest it was a container in port. I hope they had insurance.


text:
(function() {
'use strict';

function config($stateProvider) {
    $stateProvider
        .state('home', {
            url: '/',
            templateUrl: 'templates/home/index.html',
            controller:'HomeController as home'
    });
}

angular.module('home.routes', [])
    .config(config);
})();


HTML and text sizes are used in the main page of www.notifynow.biz like the graph.
www.notifynow.biz for the first time taken on 7/29/2004. Last domain update time is 9/12/2014. Also expiry date is 7/28/2015. If you don't renewal on 07/28/2015 somebody can take it.
Your site is on 74.207.222.109 IP server and working speed is under more than average with 10270 ms. You will need to work for your site. If you don't work your site might not be imagined places.


text:
Home Tags New Jersey Transit
Tag: New Jersey Transit
5 lawsuits from Hoboken train crash settled for $8 million
More than $8 million has been paid to settle five lawsuits stemming from the deadly crash of a New Jersey Transit train in...
NJ Transit settles suits in deadly crash at commuter station
The Associated Press - May 14, 2021 0
HOBOKEN, N.J. — NJ Transit has reached settlements in lawsuits filed by the family of a woman killed and people injured in a 2016...
<p>HOBOKEN, N.J. — NJ Transit has reached settlements in lawsuits filed by the family of a woman killed and people injured in a 2016...

redpajama_set_name: RedPajamaCommonCrawl


When considering a shift to inbound marketing, meetings industry suppliers at times question me on the content creation demands that such an approach will create. Hoteliers, DMOs and other service providers wonder if they have enough material to sustain a blog or other resources, how they will find time to generate material regularly, and who is going to write the required content.
As a small company that publishes two blogs (with at least one post each per week), two monthly e-newsletters and the odd white paper, I completely understand the concern. Creating content for your inbound marketing program can seem like a full-time job! When things get "crazy busy," content creation is an easy task to put on the back-burner.
Start with the easy stories: what new services, facilities or partnerships can you write a short announcement about? Resist the temptation to sound too promotional; instead, show how these new developments will help meeting planners.
Put the limelight on one of your clients (with their permission of course). Demonstrate how working with your hotel or destination the group was able to achieve specific goals.
Comment on an industry issue, event or trend. This could show your understanding of issues, or that you are "in the know" about news.
Use the calendar to your advantage. Offer advice for theming events (from Valentines Day to Christmas), seasonal menu offerings, ideas for team building.
Start by making a commitment you can live with. When I started blogging three years ago I posted once per month; now I'm up to once per week.
Stick with a schedule. If you commit to posting every Monday, for instance, it'll become easier to create that habit.
Write a few filler pieces for those busy periods when you just can't find the time.
Ask your staff, suppliers and even outside partners or other bloggers to write an occasional post. At Greenfield we encourage team members to contribute by giving four hours of paid time off for every blog that gets published (click here for our latest post by one of our Client Care Specialists). As for outside contributors, the added exposure, especially the inbound links to their own site, often is incentive enough.
I happen to like writing, but sometimes I have no time. That's when I do one of two things: dictate my thoughts into my iPhone and ask someone to edit, OR I turn to my good friend and business collaborator, Mitchell Beer. I'm at the point now where I can talk with Mitchell for thirty minutes about three different topics, and he'll produce three blogs for me!
Creating content for your inbound marketing program isn't rocket science. But having a sound strategy will ensure that your efforts don't stall along the way.


text:
Pesticide exposure and lung function: a systematic review and meta-analysis
Occup Med (Lond). 2020 Mar 12;70(1):14-23
Ratanachina J, De Matteis S, Cullinan P, Burney P.
BACKGROUND: Epidemiological studies have reported associations between pesticide exposure and respiratory health effects, but the quantitative impact on lung function is unclear. To fill this gap, we undertook a systematic review of the available literature on the association between pesticide exposure and pulmonary function. AIMS: To examine all available literature regarding the relationship between occupational and environmental exposure to pesticides and lung function. METHODS: We searched MEDLINE, EMBASE and Web of Science databases to 1 October 2017 without any date or language restrictions using a combination of MeSH terms and free text for 'pesticide exposure' and 'lung function'. We included studies that met the criteria of our research protocol registered in PROSPERO, and we assessed their quality using a modified Newcastle-Ottawa scale. RESULTS: Of 2356 articles retrieved, 56 articles were included in the systematic review and pooled in meta-analyses for forced expiratory volume in 1 s (FEV1)/forced vital capacity (FVC), FVC and FEV1. There was tentative evidence that exposure to cholinesterase (ChE) inhibiting pesticides reduced FEV1/FVC and no evidence that paraquat exposure affected lung function in farmers. CONCLUSIONS: Respiratory surveillance should be enhanced in those exposed to ChE-inhibiting pesticides which reduced FEV1/FVC according to the meta-analysis. Our study is limited by heterogeneity between studies due to different types of exposure assessment to pesticides and potential confounders. Further studies with a more accurate exposure assessment are suggested.
Read the full publication
View all publication items


text:
Leptotes marina es una especie de Lepidoptera de la familia Lycaenidae. Se encuentra en Sudamérica hasta México, sur de Texas, Arizona y California.

Tiene una envergadura de alas de 22–29 mm. Los adultos se encuentran en vuelo desde abril hasta septiembre en el norte y todo en año en el sur.

Las larvas se alimentan de Astragalus, Amorpha californica, Acacia greggii, Dalea purpurea, Dolichos lablab, Galactia, Glycyrrhiza lepidota, Prosopis glandulosa, Lysiloma thornberi, Lathyrus odoratus, Medicago sativa, Lotus scoparius dendroides, Phaseolus, Wisteria sinensis y Plumbago.

Enlaces externos

 Butterflies and Moths of North America
 eNature.com

marina
Lepidópteros de América
Insectos descritos en 1868

redpajama_set_name: RedPajamaWikipedia


text:
Control of a mitochondrial protective mechanism identified
(Vienna, 12 February 2020) Mitochondria are known as the "powerhouses" of cells. However, under critical pathophysiological conditions, they can use cellular energy for self-preservation. This occurs when the operating mode of a molecular machine in the mitochondrial sheath becomes reversed. An international research group led by MedUni Vienna's Center for Physiology and Pharmacology has now identified L-type calcium channels in the plasma membrane of neurons as a trigger of this mitoprotective function. Hence, therapeutic control of L-type calcium channels in the brain could substantially improve new treatment approaches for neurological diseases, such as Alzheimer's and Parkinson's disease.
Mitochondria are essential for normal functioning of almost all cells, since they are the main production sites of the energy-carrying molecule adenosine triphosphate (ATP). In addition, mitochondria are the key sites of biosynthesis of various proteins, lipids, nucleotides and signalling molecules. Interestingly, mitochondria appear to descend from bacteria that were incorporated into cells and put into their service early during biological evolution.
The above notion is widely known as the "endosymbiotic theory". In a symbiosis, both partners attain benefits: mitochondria support the biosynthetic and bioenergetic requirements of cells. In return, cells willingly feed mitochondria, which in turn allows the "evolutionary invaders" to maintain their vital membrane potential of about -150 mV.
Enzyme reverses molecular operating direction and becomes an ion pump
Under certain pathophysiological circumstances, the mitochondrial membrane potential can come under serious threat. Due to the important cellular role of mitochondria, such an event can ultimately lead to cell death. Hence, mitochondria are equipped with protective mechanisms enabling them to remain intact even under unfavourable cellular conditions. One such defence mechanism is the reversal of the operating mode of an enzyme responsible for the last step of ATP production in the mitochondrial membrane. This enzyme, known as ATP synthase, then consumes ATP, rather than generating it. Like a minute motor, it uses the available energy to pump ions out of the mitochondrion, thereby maintaining the mitochondrial membrane potential.
To date, little has been known about the control of ATP synthase reversal. A study recently published in "Science Signaling" by Helmut Kubista and his research team (first author: Matej Hotka) sheds new light on this matter. The authors demonstrate that calcium ion influx into neurons via the so-called L-type calcium channels, acts as a key regulator of the ATP synthase. Under normal neuronal activity, the influx of calcium ions via L-type channels serves to stimulate ATP production. On the other hand, as soon as the neuronal activity increases beyond physiological levels, the L-type calcium channels allow larger amounts of calcium to flow into the cell interior, whereupon the ATP synthase adopts the reverse operating mode. Such a vital physiological role of L-type calcium channels in the control of mitochondrial ATP synthase was previously entirely unknown.
"We were more aware of this type of calcium channel in the context of other cellular functions, such as skeletal muscle contraction, the regulation and execution of heartbeat, insulin release in pancreatic cells and sensory functions such as seeing and hearing," explains Helmut Kubista: "We also knew that L-type calcium channels play an important role in the central nervous system, notably in the regulation of neuronal excitability and in higher neuronal functions such as learning and memory."
Malfunctions play a part in neurological diseases
Over the past few years, there have been numerous indications linking malfunctioning in the L-type calcium channels to neurological disorders such as Alzheimer's and Parkinson's disease. "Indeed, experts in the field have been considering the pharmacological control of L-type calcium channels in the brain as a treatment option for these diseases," explains Kubista, "however, our findings relating to a mitochondrial protective effect of the L-type calcium channels has considerable implications in view of the actual therapeutic approaches."
This work was supported by a grant of the Austrian Science Fund (FWF, project P28179) as well as by the Herzfelder'sche Familienstiftung.
Service: Science Signaling
L-type Ca2+ channel-mediated Ca2+-influx adjusts neuronal mitochondrial function to physiological and pathophysiological conditions. Matej Hotka, Michal Cagalinec, Karlheinz Hilber, Livia Hool, Stefan Boehm and Helmut Kubista Science Signaling; DOI: 10.1126/scisignal.aaw6923


text:
A Work of Beauty
Alexander McCall Smith's Edinburgh
Alexander McCall Smith curates his own story of Edinburgh, combining his incisive wit with a wealth of stunning imagery drawn from Scotland's national collection of architecture and archaeology.
Above Scotland
The National Collection of Aerial Photography
For the first time in one volume, Historic Environment Scotland has brought together the finest images from its collection in a stunning illustration of Scotland's past, present and future.
Above Scotland Cities
This volume looks at the character and development of each of Scotland's six cities, drawing on stunning aerial photography from the 1920s to the present day to tell their compelling stories.
An Inventory for the Nation
An Inventory for the Nation follows the Royal Commission over the course of a century, tracing the impact of everything from the motor car and two World Wars, to digital technology and the internet.
Architects Volume 1
Morris and Steedman
This booklet is the first in a series celebrating the work of Scotland's architects. Volume one covers James Morris and Robert Steedman. Each volume will focus on influences and key buildings.
Peter Womersley
This booklet is the second in a series celebrating the work of Scotland's architects. Volume 2 covers Peter Womersley. Each volume will focus on influences and key buildings.
Basil Spence
This booklet is the third in a series celebrating the work of Scotland's architects. Volume three covers Basil Spence. Each volume will focus on influences and key buildings.
Our books are telling the stories of Scotland. Our aim is to explore ideas and start conversations about the past, present and future of our nation's history and heritage.
Building Knowledge: An Architectural History of the University of Edinburgh
Edinburgh is a city renowned for critical thinking, cutting edge breakthroughs and unique creativity. At the heart of these enlightened ideals lies the University of Edinburgh.
Building Knowledge: An Architectural History of the University of Glasgow
A unique collaboration between Historic Environment Scotland and the University of Glasgow has resulted in this lavishly illustrated book about the University's architectural history.
Building up our health: the architecture of Scotland's historic hospitals
"Building up our health: the architecture of Scotland's historic hospitals" is a book that aims to give a taste of the rich architectural heritage of Scotland's hospitals.
Clan and Castle
The Lives and Lands of Scotland's Great Families.
"Clan and Castle" - Clans are central to the story of Scotland. This book focuses on the stories of seven prominent clans, featuring extensive illustrations and vivid stories.


When you are on the Display Partial Records or Display Full Records page, images are "attached" to the index records of the results set. You can download full-size digital photograph files of the images you retrieve, one image at a time. An AAD results set of only the index records is not available and cannot be downloaded. If you do not wish to download images one at a time through AAD, you may order copies in the available AAD format (JPEG) through the Still Picture vendors. Cite each item by Record Group (370), image series designator (PR), and Pribilof Project Office assigned file name (e.g., 370-PR-CGMEMORIAL.jpg). Submit the citations and your reproduction requirements to the vendor of your choice, from the list of available vendors. For information about item ordering procedures, contact stillpix@nara.gov. You can also review options for ordering a copy, from NARA, of the entire index database, or TIFF copies of images accessioned in TIFF format.


During our 4 years in Texas, I came to love almost everything about the place. Everything except for fire ants…and sweating through the fall. Needless to say, one of the things I've been looking forward to most now that we're back in Kansas is bundling up for chilly weather! Check back with in with me in January and I'm sure I'll be dreaming of being on a patio somewhere in Houston…but for now, I'm so excited about boots, scarves, and everything cozy.
I was recently asked to do a review on the JJ Cole Urban BundleMe, so when the temperatures took a dip on Sunday, we headed out to the park to give our cozy new accessory a test drive!
The first thing I noticed about the BundleMe was the quality. It's extremely well-made, zips nicely, and the inside is super soft and comfy. Basically, you take one look at it on a cold day and wish you were getting zipped up in it!
The only con I could find was that Arden's legs are almost too long. Granted she is very tall for a 2-year-old (38 inches) and she had some pretty clunky boots on. Without the boots, I'd say this will definitely last her until spring…and I know we'll put it to good use again when baby #2 is old enough!
I'm also planning to purchase the infant size to use for the little guy's car seat. After the mild summer we had, I think we may all FREEZE this winter!!!
I don't know why, but I'm a sucker for pockets. This one if the perfect size for a phone, snacks, keys, etc.
I think that face pretty much says it all!
The JJ Cole Bundle Me is available at BuyBuyBaby and Babies R Us.
Stay warm out there, friends!
Whoa!! This thing is GENIUS! Mia totally needs one!! I still run in the winter but it is often negative degrees outside… miserable! This would be a life saver to have in our stroller!
She is such a doll! Love the park pictures!!
can i get in and you can push me around? we dont even have to go to the park. maybe a bakery instead. that thing looks insanely warm and cozy and comfy!
aw she's so cute all bundled up in there! hoping we can get some cooler weather soon!
I love the BundleMe! We're using ours for Mim's carseat and it's amazing! How I didn't have one of these with Mac is a mystery. It's genius!


text:
Data Science для бізнесу. Як збирати, аналізувати і використовувати дані () — книга американських науковців Фостера Провоста (професора інформаційних систем Школи бізнесу Леонарда Н. Штерна при Нью-Йоркському університеті, доктора філософії в галузі комп'ютерних наук в Університеті Пітсбурга) і Тома Фоусета (доктора наук в області машинного навчання). Вперше опублікована 19 серпня 2013 року американською видавничою компанією «O'Reilly Media». Українською мовою книга перекладена та опублікована в 2019 році видавництвом «Наш Формат» (перекладач — Анастасія Дудченко).

Огляд книги
Що таке «Data Science»? З якими проблемами може зіткнутися компанія, наймаючи на роботу фахівця з обробки даних? Автори книги не просто дають відповіді на ці та багато інших питань, вони виводять фундаментальні рішення, які мають відношення не до конкретного методу чи алгоритму аналізу даних, а й до погляду на проблему в цілому, до застосування такого аналізу в реальному світі.

Основний зміст
Основа книги — досвід викладання дисципліни в Школі Леонарда Н. Штерна.

У першому розділі викладені основи Data Science, розповідається, що таке дата-аналітичне мислення, наводиться цікавий приклад прогнозу відтоку користувачів, а також розкривається роль Data Science в прийнятті рішень в компанії. Водночас згадуються великі дані в контексті Data Science, перехід від Big Data 1.0 до Big Data 2.0.

Другу частину присвячено бізнес проблем та їх вирішенню за допомогою Data Science. Автори пропонують кілька базових методик: класифікація та оцінка ймовірності, регресія, пошук подоб, кластерний аналіз, пошук асоціацій, профілювання, прогноз зв'язків, перетворення даних, казуальне моделювання. А також методи з учителем (supervised) та без вчителя (unsupervised).

Розділ третій присвячено введенню в предикативне моделювання: від кореляції до контрольованої сегментації (supervised segmentation). Наводиться приклад розгляду проблеми відтоку користувачів через індукцію дерев.

Інші важливі питання, детально розглянуті Фоусетом і Провостом:

підбір моделі до даних;

перенавчання моделі, методи уникнення цього процесу;

подібності, сусіди, кластери;

особливості хорошої моделі;

візуалізація моделі продуктивності;

очевидність та ймовірність;

аналітична інженерія;

інші Data Science завдання й техніки.

Крім того, розглядаються питання Data Science і стратегії бізнесу, фундаментальні концепції Data Science. Автори обговорюють майбутнє покоління дослідників даних, які навички будуть затребувані та які функції вони виконуватимуть.

Відгук
«Книга "Data Science for Business" — прекрасна відправна точка для подальшого вивчення кількісної аналітики. Дає бізнесменам набір важливих концепцій для розуміння аналізу даних, вчить ставити правильні питання. Прочитавши книгу, керівники підприємств зможуть адекватно оцінити висновки кількісних аналітиків, на основі чого — прийняти зважені рішення. Технічним фахівцям книга дає глибоке розуміння базових принципів, що лежать в основі аналізу даних та закладає основу для подальшого вивчення предмета», — DataReview.info, інформаційно-освітній портал

Переклад українською
 Фостер Провост. Data Science для бізнесу. Як збирати, аналізувати і використовувати дані / Фостер Провост, Том Фоусет / пер. Анастасія Дудченко. — К.: Наш Формат, 2019.

Примітки

Книги 2019
Книги, перекладені українською мовою
Книги видавництва «Наш Формат»
Книги США
Англомовні книги
Big Data


text:
Showing results for tags 'fire support'.
fire support
Combat Mission - General Discussion
Combat Mission Shock Force 2
Combat Mission Final Blitzkrieg
Combat Mission Black Sea
Combat Mission Red Thunder
Combat Mission Battle for Normandy
Combat Mission Afghanistan
Combat Mission: Touch (iOS / Android)
Combat Mission 2 Archives
Combat Mission Campaigns
Combat Mission: Afrika Korps
Combat Mission: Barbarossa to Berlin
Combat Mission: Beyond Overlord
Repository Updates
Strategic Command
Strategic Command - World War 1: The Great War 1914-1918
Strategic Command - Assault on Communism
Strategic Command - Assault on Democracy
Strategic Command - GLOBAL CONFLICT
Strategic Command - PACIFIC THEATER
Strategic Command 2 Blitzkrieg and Weapons and Warfare
Strategic Command 1
StratCom Design Challenge
TacOps 4
Opponent Finder Forums
CM Archives
T-72: Balkans on Fire!
Theatre of War
DropTeam
Assault Wave
Empires of Steel
CM 3rd Wave
CM Cold War
CM Eastern Front
CM Italian Theater
CM West Front
Repository Moderators
FOs Conduct of Fires Net
TheForwardObserver posted a topic in Combat Mission Black Sea
I'm curious to know what people like to bring for fire support against the computer and against humans, why you bring it, how you use it, what effects you expect to achieve, what are all the factors you consider in making your choices, SOPs. IRL one of the chief responsibilities of a FISTER is advising on the capabilities and limitations of fire support as it relates to a particular mission, and it's always interesting to learn folks' expectations.
Fire mission employment
HerrTom posted a topic in Combat Mission Black Sea
This is a hopefully simple question for everyone: How do you utilize your fire support - do you use the whole gamut of options? Emergency, harrassment, medium, light, etc along with quick, short, medium, long missions? Under what circumstances do you use which combinations? Do you use linear targets, area targets, point targets, and what do you use each on? For me, effective use of fire support has always been my weak spot. One can always improve via vague forum questions!
Power of BM-21
kr0114 posted a topic in Combat Mission Afghanistan
https://www.youtube.com/watch?v=21pOWzWkSEw this is the vid BM-21 firing airbusting HE on the hill3234 which soviet's important stragic point. After fire support, about 30~40 Mujaahedins dead by one MLRS..
hill 3234
PhD Dissertation on WW II FOs!
John Kettler posted a topic in Combat Mission Final Blitzkrieg
BRACKETING THE ENEMY: FORWARD OBSERVERS AND COMBINED ARMS EFFECTIVENESS DURING THE SECOND WORLD WAR A dissertation submitted to Kent State University in partial fulfillment of the requirements for the degree of Doctor of Philosophy by John R. Walker August 2009 https://etd.ohiolink.edu/rws_etd/document/get/kent1248041184/inline The review committee, however august, should be taken out and shot, since this thing is rife with military-technical howlers which would never fly in professional military and military history circles, but it is a very meaty and long read covering the history, development and use of forward observers from the earliest beginnings through the baptism of fire in the Pacific at New Georgia and ending with Luzon and Manila. In Europe, he starts with the Saar Basin, then covers the Battle of the Bulge and continues into crossing the Rhine and beyond. Nevertheless, it is a pioneering study which has unearthed a great deal of material on this little-known and oft poorly documented subject. For example, there is no real overall casualty figure for US FOs in WW II, since such specific records weren't kept and in many cases, no names were provided in combat accounts. Such figures as do exist have had to be painstakingly dug out of various combat award citations and unit records. Nor were the artillerymen officially eligible for the CIB. Despite this, one officer did award two. In case you're wondering why your CM FOs and FOOs attract fire like a magnet, the historical accounts clearly show the tall radio antenna was quite visible--to the point where a FOs who jumped into a foxhole was ordered out by the terrified occupant! This dissertation is not just about the development, difficult acceptance and growth of FOs, ultimately focusing on the US, but also devotes an entire chapter to looking at how the Germans Japanese handled combined arms tactics and how they organized, equipped and ran their artillery and observation, complete with an assessment of their performance vs ours. I've read this chapter and found it good in some aspects and terrible in others, especially the dearth of info on how our foes actually ran their shoots. The combat accounts are juicy and detailed, and time and again you'll find T4s and even PFCs running the shoots. Seems lots of officers normally assigned got whacked, forcing substantial changes from the standard TO&E. There are cases in which untrained PFCs and corporals in FO teams brought down deadly fires, under the grimmest of circumstances, too. What you'll also see is that there were quite a few instances in which officer FOs with the line companies had to step in and take command when the leaders got severely wounded or killed. You will further read of FOs doing CASEVAC under fire and even, on occasion, attacking Siegfried pillboxes when things got hairy! There is a useful discussion of fire direction via sound, which was especially valuable in the Pacific jungles. There may also be an outcry when CMers learn that at New Georgia, high angle artillery fire was being delivered as close as 500 yards from the beach gun positions of the newly landed US force! Believe we'd all agree that 500 (presumably, 105s) yards qualifies as being doable on a typical CM map, right? For the larger stuff (155 howitzers), it was 1500 yards. FO teams should probably also be treated for Fatigue purposes as HMG and similar because of the heaviness of the radios used. The US radio used was such a load that it had to be dismantled and moved as two parts, then reassembled when a halt was called. No radioing for fire while on the move! The similarities of this to heavy weapon deployment time is obvious and could well be longer than for such. I've read about 20 pages consecutively so far, with additional spot reading on the Bulge and later to the tune of another 5 or so. This dissertation is well worth your time, but be wary of some of the "facts," and "explanations" given in the coverage of the early years. Can't speak to the rest of the story of how the US Army got FOs. Regards, John Kettler
artillery observation
forward observers
JP 3-09 Joint Fire Support JP 3-60 Joint Targeting Joint Battle Damage Assessment
John Kettler posted a topic in Combat Mission Black Sea
I was trying to find a list of priority US FS targets when I came across this, JP 3-09 Joint Fire Support, the "how you do it" pub on Joint fire Support for the entire US military and allies. There is much to learn here, so it's worth learning a lot of acronyms. The appendices are full of practical info on the use and limitations of various US FS systems. Grog central! This is a 2014 doc. http://www.dtic.mil/doctrine/new_pubs/jp3_09.pdf The complementary doc from 2013 is JP 3-60 Joint Targeting. This one is much easier to read, since it deals with much more concrete matters, with clear definitions in the text. http://tinyurl.com/glymkyk After you've hit the target or targets, you want to know what you achieved or didn't. For that, you turn to the Commander's Handbook for Joint Battle Damage Assessment, published in 2004. This tells you which assets can tell you what, and to what level of accuracy. What I particularly like about this one is it gives comparisons, of various types of targets before and after hitting them, so the brain has something more solid than text and charts. Here, it is all about maps, target sets, Commander's Intent, target priorities, time urgency and more. http://www.dtic.mil/doctrine/doctrine/jwfc/hbk_jbda.pdf Regards, John Kettler
jp-3-60
jp 3-09
Using the B-FiST
Ivanov posted a topic in Combat Mission Black Sea
What is the best way the M7A3 Bradley Fire Support Vehicles should be used? So far I haven't noticed that they have any advantage over the regular units in spotting, plus they are more difficult to hide, than the small infantry teams.


Unfortunately, in some industries competitors is stupendous and a lot of the domains with the keyword is used. We are making ready extra hints and suggestions such as the search conducive to a gracious fancy quest of a enterprise, getting financing and chap acquisition.
In case your role operates domestically, it is benefit to purchase a department as an alternative of provincial area ending in. Eng – benchmark – I bought the realm buyer – the leading adjectival phrase (Heating Białystok) in which the positions folio is included in the domain.
Sadly, in some industries rivalry is jumbo and most of the domains with the key phrase is used. Unfortunately, in some industries rivalry is stupendous and a lot of the domains with the key phrase is used. We are preparing extra hints and suggestions such as the search conducive to a gracious thought quest of a work, getting financing and customer acquisition.
Every time you wished to put in a Firefox add-on, you'll have to await several seconds earlier than the precise installation starts. It appears the next cold entrance won't push in until mid day on Thursday, which should allow temps to surge to close 60 with rain later in the day.
Begin nigh making a slant of key phrases coordinated to your small business. If he wish to procure a property with the recommendation SEARCH ENGINE MARKETING is I had to engender a domain-polinfor positioning -+ or establishment deal with phrase. HighlightAll – Pressing Control F in Firefox opens a search type that permits the user to go looking on the active page.
Southerly winds will gradually strengthen and rain will spread eastward throughout the country later in the day and on Monday night. If he wish to buy a domain with the news SEO is I needed to create a site-polinfor positioning -+ or firm reputation word.
If he want to buy a dominion with the enterprise SEO is I needed to sire a website-polinfor positioning -+ or institution rank word. If he want to come by a dominion with the recommendation SEO is I had to sire a site-polinfor positioning -+ or troop recognition phrase.


text:
ACCEPTED

#### According to
International Plant Names Index

#### Published in
null

#### Original name
Aconitum latemarense Degen & Gayer

### Remarks
null


text:
Deze lijst omvat voetballers die bij de Ecuadoraanse voetbalclub Club Deportivo Universidad Católica del Ecuador spelen of gespeeld hebben. De namen zijn alfabetisch gerangschikt.

A
 Juan Aguinaga
 Jesús Alcivar
 Ridder Alcívar
 Jose Alvarado
 Pablo Amaya
 José Andrade
 Javier Angulo
 Antonio Arias
 Juan Arias
 Wilson Armas
 Felipe Arroyo
 Jonathan Artura
 Diego Ayala
 Marlon Ayoví

B
 Oscar Bagüí
 Jaime Baldeon
 Diego Benítez
 Diego Betancourt
 Arley Betancourth
 Alex Bolaños
 Elvis Bone
 Pablo Bonvín
 Jaime Borja
 Cristian Bottero
 Miguel Bravo
 Juan Carlos Burbano
 Robert Burbano

C
 Mauricio Cabezas
 Edwin Caicedo
 Javier Caicedo
 Luis Caicedo
 Mirlon Caicedo
 Henry Cangá
 Jhon Cangá
 Byron Cano
 Héctor Carabalí
 Jonathan Carabalí
 Fredy Carcelen
 Fausto Carrera
 Maximiliano Castano
 Rómulo Castro
 Sergio Cedeño
 Luis Celi
 Alexis Chalá
 Bernardo Chalá
 Javier Chila
 Juan Colamarco
 Diego Córdova
 Facundo Corozo
 Yonnis Corozo
 José Luis Cortéz
 Jonathan de la Cruz
 Paulo de la Cruz
 Cristhian Cuero
 Jorge Cuesta

D
 Carlos Delgado
 Jimmy Delgado

E
 Claudio Elías
 Carlos Enriquez
 Luis Espínola
 Alejandro Espinosa
 Juan Esterilla
 Victor Estupiñán

F
 Diego Figueroa

G
 Hernán Galíndez
 Juan Carlos Garay
 Carlos Garcia
 Íder García
 Daniel Garrido
 Jesi Godoy
 Juan Godoy
 Wilmer Godoy
 Armando Gómez
 Cristian Gómez
 Héctor González
 Matías González
 Claudio Guerra
 Omar Guerra
 Hugo Guerron
 Leopoldo Gutierrez

H
 Cristian Hermosilla
 Jacinto Hernandez
 Ángel Hinostroza

I
 Miguel Ibarra
 Romario Ibarra
 Walter Iza

J
 Rolando Jácome
 Víctor Jácome
 Lenin de Jesús

K
 Horlen Klinger

L
 John Landeta
 Federico Laurito
 Leandro Lemos
 Henry León
 Fernando López
 Danny Luna

M
 Luis Mantilla
 Pietro Marsetti
 Emilio Martínez
 Facundo Martinez
 Washington Méndez
 Francisco Mendoza
 Jorge Mendoza
 Peter Mercado
 Cristian Minda
 Cristhian Mora
 José Mora
 Santiago Morales
 César Morante
 Sebastián Morquio
 Marco Mosquera
 Carlos Moyano

N
 Geovanny Nazareno
 Manuel Neira
 Raúl Noriega
 Luis Núñez

O
 Pablo Ochoa
 Danis Ocles
 Yeison Ordoñez
 Carlos Ortíz

P
 Guillermo Palacios
 Pablo Palacios
 Emerson Panigutti
 Martín Paradiso
 Diego Parra
 Elvis Patta
 Henry Patta
 Emerson Perea
 Gene Pico
 Jefferson Pinto
 Daniel Porozo
 Carlos Preciado
 Luis Pretti

Q
 Carlos Quillupangui
 Carlos Quiñónez
 Estuardo Quiñónez
 Genard Quiñónez
 Henry Quiñónez
 Marco Quiñónez
 Orlando Quiñónez

R
 Leiner Ramos
 Clever Reasco
 Gabriel Rengifo
 Roberto Riofrío
 Martin Rios
 Albeiro Rodríguez
 Fernando Rodríguez
 Reinaldo Román
 Juan Romero
 Vilson Rosero

S
 Daniel Samaniego
 Robinson Sánchez
 Fabricio Sánchez
 José Santana
 Miguel Segura
 Leonardo Soledispa
 Steven Soto
 Iván Suárez

T
 Cristian Tasiguano
 José Tenorio
 César Torres
 Juan Triviño

V
 Danny Vaca
 Victor Valarezo
 Eder Valencia
 Luis Alexander Valencia
 Modesto Valencia
 Yery Valencia
 Víctor Valle
 Carlos Veglio
 Giovanny Velásquez
 Hugo Vélez
 Waldier Verdugo
 Jefferson Villacis
 Richard Villegas

W
 Carlos Wila

Z
 Walter Zea

Universidad Católica


In recent years especially popular among potential suitors around the world appeared Moldovan girls. And there is a lot of evidence. Marriage agencies are literally covered by applications from Americans, Portuguese, Germans, French with requests to acquaint these men with Moldovan girls. Why is this happening? It's very simple – Moldovan girls combine the qualities of personality and nice appearance – such which are difficult to find in girls of other nationalities. They are insanely beautiful, but kind, very self-sufficient, but ready for the sake of his family to abandon personal career ambitions. These girls respect traditions and even go to Church, but they are very cheerful and have many interests.
These girls are very desirable for many men and many men really want to get acquainted with the Moldavian beauties. Dating can be possible thanks to the Internet, various agencies and even just by chance on the street. It is very easy and interesting to communicate with a Moldovan girl. She is smart and well-read enough to support almost any conversation. Many Moldovans speak foreign languages and in general girls in Moldova like to study and develop. It's nice to be with woman who is smart and beautiful at the same time, is not it? But imagine that you communicate for a long time and personally you as a man had a sincere desire to start a real serious relationship with this girl. From what should you start?
First of all, you should really assess how much the Moldovan girl is interested in you. If you communicate exclusively on the Internet, in this case, try to gently offer her a meeting where it will be convenient. You can also act more actively and tell her directly that you are going to visit her city and meet her. Pay attention to her reaction. If the girl you like plans a serious relationship with you, she will agree to meet with you. If she starts looking for reasons to refuse you, in this case, understand and accept the situation as it is – for this girl you are not particularly needed and interesting.
Next, a very important point – for a Moldovan girl family traditions are above everything else, and if you decided that this woman is the only one you need for real life and wish to create a family with her, then tell her about it directly. Believe me, she will appreciate your male stability and straightforwardness. The Moldavian woman dreams of the man who is strong emotionally and physically, but kind and loving at the same time – such a rare example nowadays. For the sake of such a man, she is ready to do a lot.
If you really want a Moldovan girl agreed to start a serious relationship with you, then show her that you are really interested in meeting her parents. Be the initiator of this meeting. The family where the Moldovan girl grew up, her relationship with her mother, father, brothers, sisters and grandparents will always be of special importance for her. If you manage to make friends with her parents, then it will be much easier to build a serious and real relationship with your favorite – Moldovan girl.
And one more thing you have to remember – make your Moldovan girlfriend more beautiful compliments and attentions. Moldovan girls know how to appreciate it. And the last and the main advice is to act. If you want marriage you have to give hints to Moldovan girlfriend and observe and analyze her reaction. You will understand whether she is ready or not. Then you have to ask her directly what she thinks about marriage and ask her how she imagines common life. When there is good time tell her you would like to marry her and if you live together for some time under one roof and everything is ok then making a proposal and moving to more serious step (yeah, what could be more serious?) is natural and probably your Moldovan girl is waiting from you for this step, but as Moldovan girls are waiting for the first step from man your girlfriend could either wait for proposal forever or tired of waiting find another guy, so be smart, active and read what is on her mind – don't hurry up and don't be too late.


Open the MSDF Font Generator page in your browser.
On this page; select your font for upload by pressing the "Choose File" button. Currently, this tool only supports TTF files. This may change in the future. Or maybe not.
You need to be sure you can use this font in your application in legal terms. If so, show your decision by the checkbox below.
By default, the generator will try to create all English letters, numbers and frequently used punctuation. You can include to or exclude from this list. However, your font should also support these characters to render them properly. You can also change the final render size in dimensions. Since the technology that SharpText is using (MSDF) is almost resolution independent, won't need to change the Texture Size field most of the time.
After you sure that all options are as desired, click to GENERATE button and wait for the generator to create your Font Data and Font Texture files.
After generation completed, two new buttons will show up for downloading the Font Data and Font Texture files. Download these two files and save on your hard drive for later importing to your Unreal Engine 4 project.


Corfu Travel Guide – What To Do? Where to Stay?
There are several Ionian Islands off the coast of Greece and Corfu is the greenest of them all. Commercial tourism has flourished a lot in this island in the recent years. However, there are still calm and quite corners in the island where you will be able to enjoy some private moments with your loved ones. If you are planning to take a holiday far from the madding crowd, you can visit this Ionian Island. It is considered to be one of the most popular honeymoon spots. There are also happy hour bars, cheap hotels, and noisy discos there in the island. Keep the Corfu travel guide with you and enjoy the way you like.
Corfu is an island where sleepy and calm agricultural villages meet the cosmopolitan towns. Lush, green inland villages are untouched by tourism, therefore, the best place to be for some tranquil time in nature. There are some wild and unspoiled beaches too in the isle. So, if you are on a honeymoon trip, you need to search out a secluded cove, and the best way is by finding a quality Corfu travel guide.
Most of the people who visit the island of Corfu enjoy bathing at the beach the most. But if you are tired of doing that and want to explore the whole island, you can go inland to the serene villages and see the remnants of the reigns of Venetians. This is one of the reasons the island has a bit of Italian touch to it. You can explore the villages around the island on foot as there is not much of traffic and there are cafes and restaurant where you can sit and enjoy the life passing by. You can also be at the ornate church of St Spyridon.
Corfu Travel Guide – Where to stay?
There are many cheap and budget hotels across the popular beaches and towns of the island. You can check them all in a Corfu travel guide. There are expensive resorts and luxurious hotels too. Two of the most sophisticated resorts on the island are the resorts of the Tacky Ypsos and Gouvia. There are burger joints and music bars too.
There are quite a few resorts towards the bays of Agni and Kalami. In each of these resorts, you can expect to enjoy a typical Greek atmosphere. Most of the tourists who plan to stay in resorts choose to stay in the resort of Kassiopi with a nice waterfront. Here the tourists can enjoy karaoke bars and sports. The resort that is popular with the locals who are here for a weekend trip is the resort of Avlaki.
If you are planning to live in a village set-up, you can book your stay at the village of Agios Matthaois. However, there are only a handful of places in the village where you can stay. A half an hour of a walk will bring you to the remote beaches of Skidi and Prasoudi. You can also choose to stay in the sleepy, serene village of Lefkimi. And, you will see natives wearing traditional Greek costumes every day. Also, in Lefkimi, donkeys are the primary means of transport. Also, you can also stay near the fishing harbors and beaches at Boukari and Petriti.


"I think I'll have to do more painting" I sighed as I stared around the four walls of the dinning room, "great, I can't wait".
Admitting there was still more work to complete, when I'm already working to a tight schedule, wasn't what I needed.
Painting and decorating can be soul destroying, especially because every time I return to the UK I am faced with a million and one D.I.Y chores to complete.
Luckily, I'm quite a dab hand with a paint brush. I'm not sure if that's because I have inherited my Dad's genetics or if it's due to the fact I'm arty and crafty in general. Anyway, this skill has helped me enormously over the last eight years.
As my house is over a hundred years old, there is always something to do, so by now you'd have thought I'd be used to it! Usually, I can get the work completed without a fuss. I take pride in doing a good job and there is something satisfying about seeing the end results, usually. Yet, now I have to admit that I am beginning to run out if steam.
Possibly this is because I'm on a final count down. Soon, my home of eight years will become a rental property.
Turning what has been my home, into a rental property for someone else to live in, seems strange and I have mixed feelings about it. I know why, because I am really quite emotionally attached to my house! Some of you might think that is strange, but that's how I feel.
I know that the house needs someone to live in it, as I'm living in Madrid. And hopefully the tenants will care for it and look after it, and of course receiving a rental income will be a relief and add extra money to the pot. Yet, knowing there will be strangers living here, makes me uneasy.
So, as I complete my D.I.Y chores, for the benefit of someone else to enjoy, I see the house becoming ever more ready to become a rental property. I can't help thinking though, that what has been a significant chapter in my life is now coming to a close.
Next time I return to the UK I will be staying with family. Also, I won't need to complete any D.I.Y chores in what was my home, because it won't be my home anymore, it'll be some strangers home and responsibility.


text: Q: Debian 10.1 net installer stuck I am trying to dual boot debian on my laptop. I tried using debian 10.1 net installer and now it's stuck forever at "Select and install software". Can someone please help me with this.

redpajama_set_name: RedPajamaStackExchange


Chloe is a senior associate in our core real estate group. She acts for large corporate landlords, tenants, investors and developers on a range of transactions.
Chloe's recent experience includes negotiating agreements for lease and leases on behalf of a major online retailer, and acting for a major institutional landlord on all aspects of its UK portfolio.
Chloe is qualified in Australia and worked at Herbert Smith Freehills in Sydney before joining Eversheds in 2014.