text:
Author: Joshua Jensen (email@example.com)
The LuaPlus distribution contains some modifications to the core Lua code base. As such, it is not an official distribution of Lua 5.01 (which may be found at http://www.lua.org/), nor does it intend to represent itself as one. Most modifications are superficial, but some, such as the wide character string type, end up touching a great deal of source files. Any references to Lua in this document refer specifically to the modified Lua code contained herein, unless otherwise stated.
The LuaPlus distribution provides the following functionality.
LUA_TSTRING in the Lua core code base was supplemented with an
equivalent wide character
The LuaPlus Visual Studio LuaWatchAddin provides facilities whereby the Watch window
will show the contents of a
LuaStackTableIterator, or
TString (when
stepping inside Lua internals). The LuaWatchAddin does not expand Lua
tables, but an additional add-in does.
Program Files/Microsoft Visual
Studio .NET/Common7/IDE.
Program Files/Microsoft
Visual Studio .NET/Common7/Packages/Debugger/autoexp.dat:
; LuaPlus LuaPlus::LuaObject=$ADDIN(LuaWatchAddin.dll,AddIn_LuaObject) LuaPlus::LuaStackObject=$ADDIN(LuaWatchAddin.dll,AddIn_LuaStackObject) LuaPlus::LuaStackTableIterator=$ADDIN(LuaWatchAddin.dll,AddIn_LuaStackTableIterator) LuaPlus::LuaTableIterator=$ADDIN(LuaWatchAddin.dll,AddIn_LuaTableIterator) TString=$ADDIN(LuaWatchAddin.dll,AddIn_TString)
LuaPlus::StackObjects, LuaPlus::LuaTableIterators,
LuaPlus::StackTableIterators and
TStrings will expand in the watch
The LuaWatchAddin does not provide expansion for Lua tables, although the LuaPlus Debugger Add-in does.
The ManagedLuaPlus Watch window support currently only works for
Program Files/Microsoft
Visual Studio .NET/Common7/Packages/Debugger/mcee_cs.dat:
; LuaPlus <ManagedLuaPlus.LuaObject>=<WatchType>
The LuaPlus Visual Studio .NET Debugger add-in allows viewing of Lua tables in a tree fashion. Currently, there is no installer for this.
To manually install:
All LuaPlus functionality is encapsulated in the
LuaPlus namespace. Any
references to LuaPlus classes and types in this documentation assume the
LuaPlus:: qualifier.
LuaPlus is an experimental C++ wrapper, and as such, there are sometimes multiple techniques for accomplishing the same result. Usually, the multiple techniques need to stay around, as some of the more advanced ones employ C++ templates and are not conducive to implementation in Managed C++.
All LuaPlus.NET functionality is encapsulated in the
ManagedLuaPlus namespace. Any
references to LuaPlus classes and types in this documentation assume the
ManagedLuaPlus. qualifier. For the sake of this document, C# will
be used as the language accessing
ManagedLuaPlus functionality.
LuaState is the C++ form of a
lua_State. Most C functions that accessed
lua_State are inlined functions in
LuaState. As far as efficiency goes,
LuaState is equally as fast as the C
low-level counterparts for most operations.
LuaPlus is set up to work in DLL or LIB form, therefore, special
functions are provided for creating and destroying
LuaState objects. It is
not possible to
new a
LuaState object, because it is
necessary to ensure all allocation and deallocation is done within the same
memory management system. It is also not possible to call the core Lua
lua_open() function and use a
lua_State pointer from
The static function
An alternate approach to creating and destroying a
LuaState* state = LuaState::Create();
A LuaState object is created no differently than any other .NET object.
LuaState state = new LuaState();
Currently, the majority of the Lua standard library is initialized per LuaState, too, which consists of the auxiliary, base, debugging, I/O, math, ANSI string, wide string, and table libraries.
LuaState Thread Instance
|To add another state, typically for thread purposes, to an existing
instance, use the
LuaState::CreateThread() static function.
LuaState* threadState = LuaState::CreateThread(state);
|Not possible at this time.
LuaState Instance
|Calling the
LuaState::Destroy() function runs all final garbage collection
processes and frees any memory associated with the
LuaState object.
LuaState::Destroy(threadState); LuaState::Destroy(state);
|No explicit destruction of a LuaState object is needed. The .NET garbage collector will kick in and take care of clean up.
lua_State Pointer to a
LuaState Instance
(Unmanaged Only)
A special function called
LuaState::CastState() exists for purposes of
changing an underlying
lua_State* to a
LuaState*. Note that
can only be used if the
lua_State pointer was originally from a
LuaState::Create() call. This separation may occur with certain Lua
LuaState* castedState = LuaState::CastState(regular_lua_State);
Global variables in a
LuaState instance may be retrieved by one of a couple
LuaObject obj = state->GetGlobal("MyGlobalVariable");
Alternatively, the basic
LuaObject::operator[] referencing or
LuaObject::GetByName() functions may be used in conjunction
LuaState::GetGlobals(). (Both functions are described in
greater detail below, in the
LuaObject section.)
LuaObject globalsObj = state->GetGlobals(); LuaObject obj = globalsObj["MyGlobalVariable"];
You can also use a shortened form:
LuaObject obj = state->GetGlobals()["MyGlobalVariable"];
Note that some functions are for retrieval of
LuaStackObjects. These
function names are usually followed with
LuaStackObject obj1 = state->GetGlobals_Stack(); LuaStackObject obj2 = state->GetGlobal_Stack("MyGlobalVariable");
LuaObject obj = state->GetRegistry(); LuaStackObject obj2 = state->GetRegistry_Stack();
Any stack object can be retrieved via the
Stack() function.
LuaStackObject obj = state->Stack(1);
GetTop() - Mirrors
SetTop(int index) - Mirrors
PushValue(int index) - Mirrors
PushValue(LuaStackObject object) - Mirrors
Remove(int index) - Mirrors
Insert(int index) - Mirrors
Replace(int index) - Mirrors
CheckStack(int size) - Mirrors
XMove(LuaState* to, int n) - Mirrors
Equal(int index1, int index2) - Mirrors
RawEqual(int index1, int index2) - Mirrors
LessThan(int index1, int index2) - Mirrors
Pushing values to the stack is accomplished via the following functions.
PushNil() - Mirrors
PushNumber(lua_Number n) - Mirrors
PushLString(const char* s, size_t len) - Mirrors
PushLWString(const wchar_t* s, size_t len) - Mirrors
PushString(const char* s) - Mirrors
PushWString(const char* s) - Mirrors
PushBoolean(bool value) - Mirrors
PushLightUserData(void* p) - Mirrors
Pushing a closure to the stack has several overloads:
PushCClosure(lua_CFunction fn, int n) - Mirrors
PushCClosure(function, n) - Pushes a C callback function
taking a
LuaState* argument. It can be either a global
function, static function, or member function.
TypeError(narg, tname) - Mirrors
ArgError(narg, extramsg) - Mirrors
CheckLString(numArg, len) - Mirrors
OptLString(numArg, def, len) - Mirrors
CheckNumber(numArg) - Mirrors
OptNumber(nArg, def) - Mirrors
ArgCheck(condition, numarg, extramsg) - Mirrors
CheckString(numArg) - Mirrors
OptString(numArg, def) - Mirrors
CheckInt(numArg) - Mirrors
CheckLong(numArg) - Mirrors
OptInt(numArg, def) - Mirrors
OptLong(numArg, def) - Mirrors
CheckStack(int sz, const char* msg) - Mirrors
CheckType(narg, t) - Mirrors
CheckAny(int narg) - Mirrors
CheckUData(int ud, const char* tname) - Mirrors
LuaPlus provides a comprehensive serialization facility for Lua data. It is described in detail in the Serialization section below.
LuaStateAuto is an auto pointer encapsulation for a
LuaState pointer.
When the
LuaStateAuto goes out of scope,
LuaState::Destroy() is
automatically called on the contained state. In a Release build,
accessors are inlined, and code generation is as if the
object did not even
LuaStateAuto is illustrated below:
{ LuaStateAuto stateOwner; // The state is automatically set to NULL. stateOwner = LuaState::Create(); stateOwner->PushNil(); // LuaState::Destroy() is automatically called here. }
LuaStateOwner is derived from
LuaStateOwner can automatically create the
through the function call
{ LuaStateOwner stateOwner; // Automatically calls LuaState::Create(). stateOwner->PushNil(); // LuaState::Destroy() is automatically called here. }
Since a
LuaStateAuto object merely encapsulates the
LuaState pointer, it is
possible to retrieve that pointer by just assigning it.
LuaState* state = stateOwner;
LuaPlus provides an API extension over the core of Lua wrapped in the class
LuaObject. A
LuaObject gives the full functionality of core Lua's stack
entities, but it does so without involving the stack at all. In general,
LuaObjects tend to run a little faster than the core Lua stack equivalent.
LuaObject should be used for all communication with LuaPlus that is
external to a callback function.
LuaStackObjects, described
below, are used in conjunction with callback functions, but the same functional
interface is provided for consistency.
LuaObjects store a pointer to the parent
LuaState. In part, this
is what makes the LuaWatchAddin work. Most importantly,
LuaObjects can
just be passed around without any regard for the LuaState they came from.
It is also important to note
LuaObjects are scope-driven.
So long as the
LuaObject is in scope, the object is valid.
When it goes out of scope, the contents of the
LuaObject will be
garbage collected. There is no need to run commands like
to keep an object around. Merely holding onto the
instance, be it as a member variable, global variable, or even local variable
within a block of code is enough to ensure the
Reset() function is also provided. It resets the
LuaObject back to a default state where no Lua state is pointed to internally.
The sample code TestSuite performs an in-depth test of
LuaObject and is a
useful supplement to this documentation. The sample TestScript is
also used as a test bed for
LuaObject concepts.
LuaObject contains an object of one of several different types. These
types are described in the Lua manual with
the exception of the wide string type, a
LuaPlus added type.
There are several ways to retrieve the type of the
LuaObject. To test
for a specific type, one of the following functions may be called:
IsNil() - Tests if the object is nil. Mirrors
IsTable() - Tests if the object is a table. Mirrors
IsUserData() - Tests if the object is userdata (including
light userdata). Mirrors
IsCFunction() - Tests if the object is a C function.
IsNumber() - Tests if the exact type of the object is a
number. See
IsConvertibleToNumber() for the
LuaObject equivalent of
IsString() - Tests if the exact type of the object is a
string. See
IsConvertibleToString() for the
LuaObject equivalent of
IsWString() - Tests if the exact type of the object is a wide
string. See
IsConvertibleToWString() for the wide string equivalent of
IsConvertibleToNumber() - Tests if the object is convertible
to a number. The object being tested can be a number, string, or wide
string. Mirrors
IsConvertibleToString() - Tests if the object is convertible to a string.
The object being tested can be a number or a string. Mirrors
IsConvertibleToWString() - Tests if the object is convertible to a wide
string. The object being tested can be a number or a wide string.
lua_iswstring(), the wide character equivalent of
IsFunction() - Tests if the object is a function.
IsNone() - Tests if the object is out of range on the stack.
IsLightUserData() - Tests if the object is specifically light
user data.
IsBoolean() - Tests if the object is a boolean. Mirrors
Generically, the type may be retrieved via the
function. It returns a value from the
LuaState class's
enumeration of Types:
The actual string name of the type can be retrieved through
TypeName() function.
After testing the
LuaObject for the desired type, the stored
value may be retrieved using one of
functions. All
Get*() functions assert on the wrong type in
Debug builds.
lua_Number ToNumber() - Mirrors
Attempts to retrieve a numeric value from the object, even if the object is
a string.
const char* ToString() - Mirrors
Attempts to retrieve a string from the object. If the object is a
number, the object is converted to a string.
const wchar_t* ToWString() - Mirrors
Attempts to retrieve a wide string from the object. It the object is a
number, the object is converted to a wide character string.
int GetInteger() - Retrieves the integer the object
represents. Asserts if the object is not of a numeric type.
float GetFloat() - Retrieves the float the object
represents. Asserts if the object is not of a numeric type.
double GetDouble() - Retrieves the double the object
represents. Asserts if the object is not of a numeric type.
lua_Number GetNumber() - Retrieves the lua_Number the
object represents. Asserts if the object is not of a numeric type.
const char* GetString() - Retrieves the string the object
represents. Asserts if the object is not a single byte string type.
const wchar_t* GetWString() - Retrieves the wide string the
object represents. Asserts if the object is not a double byte string
lua_CFunction GetCFunction() - Retrieves the C function
pointer the object represents. Asserts if the object is not a C
void* GetUserData() - Retrieves the userdata or light
userdata the object represents. Asserts if the object is not a userdata.
void* GetLightUserData() - Retrieves the light userdata the
object represents. Asserts if the object is not a light userdata.
bool GetBoolean() - Retrieves the boolean the object
represents. Asserts if the object is not a boolean convertible type.
If the
LuaObject is an ANSI or wide character string, the length
of the string in characters may be retrieved via
The function
ToStrLen() may be used to automatically convert
numbers up to strings and retrieve the length.
behavior is a mirror of
For objects of type table, function, userdata, or light userdata, the
internal Lua storage pointer can be retrieved via the function
LuaObject obj = state->GetGlobal("SomeVariable"); if (obj.IsString()) { const char* str = obj.GetString(); }
For a stack Lua value, the programmer uses
Push*() functions to
get user values on the stack. Since
LuaObjects aren't stack
based, an alternate scheme was devised.
To assign a value to any
LuaObject, use one of the
Assign*() functions.
AssignNil(LuaState* state)
AssignBoolean(LuaState* state, bool value)
AssignInteger(LuaState* state, int value)
AssignNumber(LuaState* state, double value)
AssignString(LuaState* state, const char* value)
AssignWString(LuaState* state, const wchar_t* value)
AssignUserData(LuaState* state, void* value)
AssignLightUserData(LuaState* state, void* value)
AssignObject(LuaState* state, LuaObject& value)
AssignNewTable(LuaState* state, int narray = 0, int nhash = 0)
For example, to assign the string
"Hello, world!" to a
LuaObject strObj; strObj.AssignString(state, "Hello, world!");
There are two approaches for table creation built into LuaObject. The first is provided through the CreateTable() suite of functions. CreateTable() works similarly to the Set*() functions described below in that it is assumed the current LuaObject is a table. The first argument to CreateTable() is a table key. The key is used to make a new entry in the current LuaObject table and assign its value as an empty table.
The second approach to table creation is via the AssignNewTable() function. When called, an empty Lua table is created in the current LuaObject.
LuaObject globalsObj = state->GetGlobals(); LuaObject myArrayOfStuffTableObj = globalsObj.CreateTable("MyArrayOfStuff"); LuaObject aStandaloneTableObj; aStandaloneTableObj.AssignNewTable(state);
When the
LuaObject is a table, the functions for manipulating
tables become available. A few functions exist for retrieving various
types of table counts.
For the following table:
MyTable = { WindSpeed = 50, Value = 'Hello', 10, 20, 30 }
GetN() returns 3.
GetN() uses Lua's
table.getn() function internally to retrieve the count.
table.getn() only considers contiguous numeric keys starting at 1 to be
the count.
GetCount() also only considers contiguous numeric keys starting
at 1. It would also return 3 for the table above. However, for one
shot table counts,
GetCount() generally runs much faster.
GetTableCount() exists to return the actual number of
(non-contiguous) keys in the table. For
MyTable above, the table count would
be 5.
When the
LuaObject is a table, the functions for manipulating
tables become available. If the
LuaObject is not a table and
those functions are used, they will assert.
operator[] has been overloaded to accept a key type of
const char*,
LuaStackObject, or
LuaObject. Using
operator[] allows lookups to be very naturally represented, much
like using Lua script code.
state->DoString("MyTable = { WindSpeed = 50, Value = 'Hello', 10, 20, 30 }"); LuaObject myTableObj = state->GetGlobals()["MyTable"]; LuaObject windSpeedObj = myTableObj["WindSpeed"]; LuaObject is20Obj = myTableObj[2]; LuaObject keyObj; keyObj.AssignString(state, "Value"); LuaObject valueObj = myTableObj[keyObj];
Although not usually needed, spelled out forms of the table retrieval functions are:
GetByName(const char* key)
GetByIndex(int index)
GetByObject(const LuaObject& obj)
GetByObject(const LuaStackObject& obj)
LuaObject table setting functions all start with
There are 3 overloaded
Set*() functions per value type.
Each takes one of three key types for the key-value pair arguments.
const char*.
Set*() functions are listed below.
key is
one of the 3 types listed above.
SetBoolean(key, bool value)
SetInteger(key, int value)
SetNumber(key, double value)
SetString(key, const char* value)
SetWString(key, const wchar_t* value)
SetUserData(key, void* value)
SetLightUserData(key, void* value)
SetObject(key, LuaObject& value)
Set*() function returns a reference to the current object,
allowing chaining of multiple
Set*() functions in a single
LuaObject tableObj; tableObj.AssignNewTable(state); tableObj.SetString("MyKey", "Hello, world!"); LuaObject globalsObj = state->GetGlobals(); globalsObj.SetBoolean("InUse", true).SetNumber(5, 2000);
The Lookup() function provides a simple method of recursively looking up a table entry by string. It accepts period separated string key entries.
LuaObject globalsObj = state->GetGlobals(); LuaObject valueObj = globalsObj.Lookup("Child1.Child2.Value1");
Some of the calls provided through the table library of functions are more simply encapsulated in LuaObject. The current set of functions are Insert() (mirroring table.insert), Remove() (mirroring table.remove), and Sort() (mirroring table.sort).
LuaObject method,
Clone(), allows simple
cloning of a
LuaObject. The clone operation is a deep clone
for Lua tables, but for any other values, a simple clone is performed.
This should be fine for most needs, especially where values like userdata can
just be a simple pointer copy.
Clone() method does not handle cyclic tables. You will
either run out of memory or stack overflow if you attempt a clone operation on a
cyclic table.
LuaObjects may be compared by using the
== or
< operators. The internal comparisons are done through
lua_equal() and
lua_lessthan(), which is equivalent to their
Lua counterparts.
On many occasions, it is still necessary to access an object on the Lua
stack. Callback functions receive an array of
as arguments. Generally, the APIs for a
LuaStackObject and a
LuaObject are similar enough to not be an issue when writing code.
LuaObjects are, however, the preferred way of accessing objects
maintained by Lua, since the stack doesn't need to be taken into consideration.
Turning a
LuaStackObject into a
LuaObject is as
simple as making an assignment:
LuaStackObject stack1Obj(state, 1); LuaStackObject stack2Obj(state, 2); LuaObject nonStack1Obj(stack1Obj); // or LuaObject nonStack2Obj = stack2Obj;
The cases where you would need to push a
LuaObject onto the Lua
stack are rare. Nonetheless, the facility is provided through
PushStack() function.
LuaObject tableObj(state); tableObj.AssignNewTable(); tableObj.SetString("Key", "My String"); // It's often good practice to use a LuaAutoBlock here. tableObj.PushStack(); // Be sure to clean it up when you're done!
|Proper LuaPlus callbacks are of the function signature:
int Callback(LuaState* state);
As a convenience mechanism, the Lua stack is available through a class called
LuaPlus's callbacks use a simple functor mechanism that masks away the differences between global functions, non-virtual member functions, and virtual member functions.
Lua standard C-style callbacks can also be used, although they aren't as functionally robust as LuaPlus callbacks.
An example follows:
static int LS_LOG(LuaState* state) { printf("In static function\n"); return 0; } class Logger { public: int LS_LOGMEMBER(LuaState* state) { LuaStack args(state); printf("In member function. Message: %s\n", args[1].GetString()); return 0; } virtual int LS_LOGVIRTUAL(LuaState* state) { printf("In virtual member function\n"); return 0; } }; LuaObject globalsObj = state->GetGlobals(); globalsObj.Register("LOG", LS_LOG); state->DoString("LOG()"); Logger logger; globalsObj.Register("LOGMEMBER", logger, &Logger::LS_LOGMEMBER); state->DoString("LOGMEMBER('The message')"); globalsObj.Register("LOGVIRTUAL", logger, &Logger::LS_LOGVIRTUAL); state->DoString("LOGVIRTUAL()");
Callback functions are registered with the
void Register( const char* funcName, lua_CFunction function, int nupvalues = 0 ); void Register( const char* funcName, int (*func)(LuaState*), int nupvalues = 0 ); void Register( const char* funcName, const Callee& callee, int (Callee::*func)(LuaState*), int nupvalues = 0 );
|Proper LuaPlus callbacks are of defined through the Managed C++
public __delegate int LuaPlusCallback(LuaState* state);
An example follows:
public int LS_LOG(LuaState state) { Console.WriteLine("In member function. Message: {0}\n", state.Stack(1).GetString()); return 0; } LuaObject globalsObj = state.GetGlobals(); globalsObj.Register("LOG", new LuaPlusCallback(Logger.LS_LOG)); state->DoString("LOG()");
|Even though
Register() can dispatch to C++ member functions, it
uses a 'this' pointer as provided by the second argument passed to the function.
The 'this' pointer is constant, and
Register() is not suited for
mirroring class hierarchies in Lua.
The solution to the 'this' pointer issue is through
As an example, we want to mirror a class called MultiObject:
class MultiObject { public: MultiObject(int num) : m_num(num) { } int Print(LuaState* state) { printf("%d\n", m_num); return 0; } void Print2(int num) { printf("%d %d\n", m_num, num); } protected: int m_num; };
The best way to implement C++ objects mirrored in Lua is through metatables. We'll start by creating a metatable and adding the MultiObject::Print() function to it.
LuaObject metaTableObj = state->GetGlobals().CreateTable("MultiObjectMetaTable"); metaTableObj.SetObject("__index", metaTableObj); metaTableObj.RegisterObjectFunctor("Print", &MultiObject::Print);
Now, we'll give two C++ objects implementations in Lua called
MultiObject obj1(10); LuaObject obj1Obj = state->BoxPointer(&obj1); obj1Obj.SetMetaTable(metaTableObj); state->GetGlobals().SetObject("obj1", obj1Obj); MultiObject obj2(20); LuaObject obj2Obj = state->BoxPointer(&obj2); obj2Obj.SetMetaTable(metaTableObj); state->GetGlobals().SetObject("obj2", obj2Obj);
Everything is set up to handle proper dispatching now. To
illustrate, a few
state->DoString("obj1:Print()"); state->DoString("obj2:Print()");
LuaObject table1Obj = state->GetGlobals().CreateTable("table1"); table1Obj.SetLightUserData("__object", &obj1); table1Obj.SetMetaTable(metaTableObj); LuaObject table2Obj = state->GetGlobals().CreateTable("table2"); table2Obj.SetLightUserData("__object", &obj2); table2Obj.SetMetaTable(metaTableObj); state->DoString("table1:Print()"); state->DoString("table2:Print()");
Above, two Lua tables called
|LuaPlus supports registration of C++ functions directly through the
RegisterDirect() function.
float Add(float num1, float num2) { return num1 + num2; } LuaStateOwner state; state->GetGlobals().RegisterDirect("Add", Add); state->DoString("print(Add(10, 5))");
Any functions registered in this fashion automatically receive built-in type checking for the incoming arguments. If an argument is not valid, luaL_argassert is called. For instance, in the above example, if Add was called with a non-numeric string, there would be a failure.
state->DoString("print(Add(10, 'Hello'))");
Just as global functions can be registered, member functions can be registered, also.
void LOG(const char* message) { printf("In global function: %s\n", message); } class Logger { public: void LOGMEMBER(const char* message) { printf("In member function: \n", message); } virtual void LOGVIRTUAL(const char* message) { printf("In virtual member function: %s\n", message); } }; LuaObject globalsObj = state->GetGlobals(); globalsObj.RegisterDirect("LOG", LOG); Logger logger; globalsObj.RegisterDirect("LOGMEMBER", logger, &Logger::LOGMEMBER); globalsObj.RegisterDirect("LOGVIRTUAL", logger, &Logger::LOGVIRTUAL); state->DoString("LOG('Hello')"); state->DoString("LOGMEMBER('Hello')"); state->DoString("LOGVIRTUAL('Hello')");
The implementation built into LuaPlus in this version supports up to 7 parameters in the registered function.
Note: This direct registration of C++ functions and the recommended style for calling Lua functions are based around techniques presented in LuaBind (http://luabind.sourceforge.net/). LuaBind provides a much more powerful function dispatching mechanism, including inheritance for classes. I am not interested in making LuaPlus dependent on another library, and LuaBind is dependent on Boost (http://www.boost.org/). Also, LuaPlus has no issue with making extensions to the core Lua code base to achieve the end result more efficiently. LuaBind is built directly on top of the unmodified Lua 5.0 core.
|The support for direct registration of .NET functions is incomplete and slow at this time. Hopefully, future improvements will bring it up to the usability level of the C++ counterpart.
|Even though
RegisterDirect() can dispatch directly to C++ member functions, it
uses a 'this' pointer as provided by the second argument passed to the function.
The 'this' pointer is constant, and
RegisterDirect() is not suited for
mirroring class hierarchies in Lua.
The solution to the 'this' pointer issue is through
Using the above MultiObject sample, we'll add support for a directly called C++ member function to the metatable.
metaTableObj.RegisterObjectDirect("Print2", (MultiObject*)0, &MultiObject::Print2);
All that needs be done at this point are some calls to
state->DoString("obj1:Print2(5)"); state->DoString("obj2:Print2(15)"); state->DoString("table1:Print2(5)"); state->DoString("table2:Print2(15)");
Unregistering a callback is as simple as setting its table entry to nil.
LuaObject attempts to simplify the function calling interface of the core Lua API. It does so by completely masking away the stack management. Often, Lua function calls with arguments can be performed in a single line of code.
|By taking advantage of some C++ template tricks, we can directly call a Lua
function as if it was C++ function.
LuaStateOwner state; state->DoString("function Add(x, y) return x + y end"); LuaFunction<float> Add = state->GetGlobal("Add"); printf("Add: %d\n", Add(2, 7));
The template
LuaStateOwner state; state->DoString("function Print(str) print(str) end"); LuaFunction<> Print = state->GetGlobal("Print"); Print("Hello, world!");
The built-in types LuaPlus understands for functions are:
A more detailed discussion of the function dispatching mechanism may be found in the Lua Callback Dispatcher section below.
The implementation built into LuaPlus in this version supports up to 7 arguments.
|An experimental form of .NET to Lua function calling has been
implemented for the .NET implementation.
LuaStateOwner state; state->DoString("function Print(x, y) print(x, y) end"); LuaObject printObj = state->GetGlobal("Print"); printObj.Call(2, "Hi");
The types this technique understands is limited for now:
An unlimited number of arguments may be passed to the Call() function.
|LuaPlus also employs a convention similar to the Standard C++
library's iostream functionality. A simple example follows:
LuaStateOwner state; state->DoString("function Add(x, y) return x + y end"); LuaObject funcObj = state->GetGlobal("Add"); { LuaAutoBlock autoBlock(state); LuaCall call = funcObj(); LuaStackObject retObj = call << 2 << 7 << LuaRun(); printf("Add: %d\n", retObj.GetInteger()); }
The function call starts by "calling" the
It can't be avoided that a Lua function call puts return values on the stack.
LuaObject funcObj = state->GetGlobal("PrintIt"); LuaCall call = funcObj; LuaStackObject retObj = call << "String" << LuaArgNil() << LuaRun();
LuaObject funcObj = state->GetGlobal("ThreeReturnValues"); LuaCall call = funcObj; LuaStackObject retObj = call << LuaRun(1); // Only accept one return value.
|No implementation exists for this at this time.
The metatable for a
LuaObject is retrieved via
GetMetaTable(). Every table and userdata has a unique metatable.
The metatable for a basic type is shared. See the
Metatable Enhancements section.
A metatable can be changed for a
LuaObject via the
SetMetaTable() function. If the
LuaObject represents a
table or userdata, the metatable change is as per standard Lua. If the
LuaObject is a basic type, the metatable is changed for all basic
LuaPlus provides a class called
LuaTableIterator to ease the table iteration
process. Its use is far simpler, safer, and more natural looking than the
standard Lua table iteration function (
lua_pop()). The iterator
is not STL compliant in its current form.
LuaStateOwner state; state.DoString( "MyTable = { Hi = 5, Hello = 10, Yo = 6 }" ); LuaObject obj = state.GetGlobals()[ "MyTable" ];for ( LuaTableIterator it( obj ); it; it.Next() ) { const char* key = it.GetKey().GetString(); int num = it.GetValue().GetInteger(); }
If the LuaWatchAddin is installed, the key and value portions of the
LuaTableIterator object will be displayed as it is traversed.
LuaTableIterator is fully documented in
LuaPlus does not use integers to represent stack objects. Instead,
those stack indices are wrapped in a
LuaStackObjects can be passed
directly to a Lua C function, if needed, but it is advised to go through the
LuaPlus version of the function.
Using a
LuaObject is usually the better way to go, since a
LuaObject relieves
the user of any stack management at all.
LuaStackObjects are available for
use in callback functions or in special case stack management scenarios.
LuaStackObjects also store a pointer to the parent
LuaState. In part, this
is what makes the LuaWatchAddin work. Most importantly,
LuaStackObjects can
just be passed around without any regard for the
LuaState they came from.
LuaStackObject functions mirror
LuaObject functions of the same name, so
see the section above for more detail.
(Note: Using LuaObject, there is no need to use this class.)
LuaPlus enhances the Lua ref table facility by allowing ref'ed objects to be
used without using
GetRef() to push them onto the stack.
encapsulates this new functionality. Assigning a
LuaObject (or another
LuaRefObject) to a
LuaRefObject instance will cause a
lua_ref() to occur.
When the
LuaRefObject goes out of scope,
lua_unref() is called.
LuaRefObject is derived from
LuaObject and can operate on ref'ed objects without
The LuaWatchAddin displays the contents of
LuaStackTableIterator is almost identical to the
LuaTableIterator above,
except it provides support for iterating using the stack, similar to how core
Lua does it.
LuaStackTableIterator is fully documented in
Nothing can be more frustrating than paying attention to stack management.
Which function allocates which entry on the stack? How many entries?
Did it get popped? Where is that stack leak at?
LuaAutoBlock serves
as a fairly useful approach to solving these problems.
LuaAutoBlock is a C++ class whose constructor stores the index of the stack
top. At destruction time, it sets the stack top to the stored index.
By providing this functionality as an object, the stack is guaranteed to be
restored, regardless of exit points from a function or loop block.
Note: When using the LuaObject class, there is no need to worry about stack management, and so LuaAutoBlock provides no benefits in that situation.
{ LuaAutoBlock autoBlock(state); LuaStackObject testObj = state->GetGlobals_Stack()["Test"]; // Does this allocate a stack item? state->PushString["A string"]; // Does this? testObj.SetNumber("Value", 5); // Does this? // Who cares? LuaAutoBlock automatically cleans it up. }
LuaStateOutFile and derived classes are used in conjunction with
LuaState::DumpObject(). When a
LuaStateOutFile object is passed to
DumpObject(), that object is used for writing the Lua dump file.
The application can derive from
LuaStateOutFile to change the
default dumping behavior.
The LuaHelper namespace contains some useful helper functions for retrieving values from LuaObjects. The helper functions perform a lookup into a table for a certain key. If the key is required to be found and is not present, an assertion is triggered. Otherwise, the found value or a default value is returned.
The following helper functions are available:
The LuaPlus distribution can write a Lua table into a nicely formatted text file. All data types are handled, although some write themselves out as comments (functions, userdata, threads).
A table can be written both from Lua and C++. The C++ LuaState function prototypes are:
bool DumpObject(const char* filename, const char* name, LuaObject& value, unsigned int flags = DUMP_ALPHABETICAL, int indentLevel = 0, unsigned int maxIndentLevel = 0xffffffff); bool DumpObject(const char* filename, LuaObject& key, LuaObject& value, unsigned int flags = DUMP_ALPHABETICAL, int indentLevel = 0, unsigned int maxIndentLevel = 0xffffffff); bool DumpObject(LuaStateOutFile& file, const char* name, LuaObject& value, unsigned int flags = DUMP_ALPHABETICAL, int indentLevel = 0, unsigned int maxIndentLevel = 0xffffffff); bool DumpObject(LuaStateOutFile& file, LuaObject& key, LuaObject& value, unsigned int flags = DUMP_ALPHABETICAL, int indentLevel = 0, unsigned int maxIndentLevel = 0xffffffff); bool DumpGlobals(const char* filename, unsigned int flags = DUMP_ALPHABETICAL, unsigned int maxIndentLevel = 0xFFFFFFFF); bool DumpGlobals(LuaStateOutFile& file, unsigned int flags = DUMP_ALPHABETICAL, unsigned int maxIndentLevel = 0xFFFFFFFF);
filename - The name of the file to
write to disk or a
"@" string for logging
to OutputDebugString (in Windows).
file - A LuaStateOutFile instance.
name - The name of the initial Lua table to write to
key - The key name of the initial Lua table to write to disk.
This is usually a string, but it could be a number, too.
value - The value to write.
flags - One of three flags may be intermixed with each other:
DUMP_ALPHABETICAL - Alphabetize the keys when writing to the
DUMP_WRITEALL - Write all Lua objects out, including function
and user data information.
DUMP_WRITETABLEPOINTERS - If
DUMP_WRITEALL is
specified, the actual memory addresses of tables are written in comment form.
indentLevel - The number of tabs to indent each line.
maxIndentLevel - The maximum number of nested tables allowed
in the write. If this value is exceeded, then no carriage returns are
The Lua functionality is very similar in form.
function LuaDumpObject(file, key, value, alphabetical, indentLevel, maxIndentLevel, writeAll) function LuaDumpGlobals(file, alphabetical, maxIndentLevel, writeAll)
file - The name of the file to
write to disk, a
"@" string for logging
to OutputDebugString (in Windows), or a FILE* user data (say, from
key - The key name of the initial Lua table to write to disk.
This is usually a string, but it could be a number, too.
value - The value to write.
alphabetical - If true, each table's keys are sorted.
(Optional: Defaults to true.)
indentLevel - The number of tabs to indent each line.
(Optional: Defaults to 0.)
maxIndentLevel - The maximum number of nested tables allowed
in the write. If this value is exceeded, then no carriage returns are
inserted. (Optional: Defaults to 0xFFFFFFFF.)
writeAll - If true, writes all Lua objects out, including
function and user data information. (Optional: Defaults to false.)
So, in a C++ application, an example usage of the serialization APIs might be:
LuaStateOwner state(false); state->DoString("GlobalTable = { 1, 2, 3, 4 }"); state->DoString("GlobalValue = 5"); state->DumpGlobals("c:\\dump.lua");
or like:
LuaStateOwner state; state->DoString("Table = { 0, 1, 2, 'Hello', nil, 'Hi', Yo = 'My Stuff', NobodysHome = 5, NestedTable = { 1, 2, 3, { 'String', }, { 'Table2' } }, { 'String1' } }"); state->DumpObject("c:\\dump.lua", "Table", state->GetGlobals()["Table"]);
Wide character support is built-in as a native LuaPlus type. While it is entirely possible to represent a wide character string using a regular Lua 8-bit clean string, there is no way of determining whether the given string is wide or not. The secondary problem involves the use of standard string functionality, such as the concatenation operator. If a wide character string is represented as a normal 8-bit Lua string, special functions would have to be written to perform operations on the string (i.e. concatenation of two Lua 8-bit clean strings which represent wide characters). Rather than require the user to keep track, a wide character string type is available.
Wide character strings can be entered into Lua script similar to the approach used by C code.
L"Wide characters"
By inserting an
L in front of the quote, the LuaPlus lexer creates a wide character
representation of the above string. If the string was entered as a regular Lua string,
the Unicode equivalent would be simulated as follows, and the string below
assumes a certain architecture's endianness.
"W\000i\000d\000e\000 \000c\000h\000a\000r\000a\000c\000t\000e\000r\000s\000\000\000"
In the event it is necessary to insert wide character codes in the wide
character string, an additional property of the
L"" approach may be
used. 16-bit characters may be entered using hexadecimal notation, in the
same way as C:
L"Wide characters: \x3042\x3043"
A new Lua library, located in lwstrlib.c, has been added for the new functionality. In most respects, it mirrors the ANSI string library, lstrlib.c.
LUA_TWSTRING type added. Mirrors
print() has been upgraded to take Unicode strings as input.
tonumber() can take a Unicode string as a parameter.
tostring() receives a Unicode string as input, it converts it to ANSI
and returns it.
towstring() added. If
towstring() receives an ANSI string as input,
it converts it to Unicode and returns it.
fh:read() can read Unicode files/strings if the input string is Unicode.
The file must be opened in binary mode.
fh:write() can write Unicode strings.
string.format has been extended with the following control types. The use of
these control types makes it easy to write binary file formats to disk.
format("%bb", 255) creates a string containing the 8-bit byte
format("%bw", 1000) creates a string containing the 16-bit word
format("%bd", 1000000) creates a string containing the 32-bit dword
format("%bf", 1.0f) creates a string containing the 32-bit float
format("%bF", 1.0) creates a string containing the 64-bit double
format("%Q", str) turns a binary string into a printable string.
Additionally, much like wide character string, ANSI strings can use the hexadecimal character notation to insert bytes into the string:
str = "Hel\x80o"
This distribution replaces the
#define approach to memory allocation within Lua with a callback mechanism, where the memory allocators can be replaced on a
per Lua state basis. This allows a powerful mechanism to be employed to
adjust memory allocation strategies on a per state basis.
For purposes of better memory tracking, the
realloc() callback allows a void
pointer of user data, an allocation name, and allocation flags to be passed
along. All of these arguments are optional, but they are available if the
memory allocation callback needs them.
The only allocation flag available is
memory manager could react to the
LUA_ALLOC_TEMP flag, for instance, by allocating
the code for the main function of a Lua file at the top of the heap. If
all other Lua allocations happen at the bottom of the heap, no holes will be
left in memory when the
LUA_ALLOC_TEMP flagged allocation is garbage collection.
The callbacks look like:
static void* luaHelper_ReallocFunction(void* ptr, int oldsize, int size, void* data, const char* allocName, unsigned int allocFlags) { return realloc(ptr, size); } static void luaHelper_FreeFunction(void* ptr, int oldsize, void* data) { free(ptr); }
The allocation functions must be assigned before a Lua global state is created, in a fashion similar to below. It is good practice to restore the previous callbacks.
lua_ReallocFunction oldReallocFunc; lua_FreeFunction oldFreeFunc; void* oldData; lua_getdefaultmemoryfunctions(&oldReallocFunc, &oldFreeFunc, &oldData); lua_setdefaultmemoryfunctions(MyReallocFunction, MyFreeFunction, myUserData); LuaStateOwner state; lua_setdefaultmemoryfunctions(oldReallocFunc, oldFreeFunc, oldData);
lua_boxpointer() and lua_unboxpointer() have the unfortunate disadvantage of decoupling their behavior from the lua_touserdata() call. If you box a pointer, you have to unbox the pointer. In the past, a boxed pointer was retrievable through lua_touserdata.
To that end, an implementation of the old lua_newuserdatabox() is included in the LuaPlus distribution as LuaPlus::NewUserDataBox(). Its value is retrieved via LuaObject::GetUserData() (or lua_touserdata()).
This section is out of date!
A whole host of functionality has been added to facilitate the optimization of memory usage in a tight memory environment.
lua_setminimumstringtablesize(int numstrings) will ensure the
global string table is always of the minimum size specified by
numstrings. When garbage
collection occurs, the string table will never shrink below
An application can determine the maximum number of strings it will use and
ensure the space is reserved in advance, so as to avoid fragmentation when the
string table is resized.
lua_setminimumglobaltablesize(int numentries) ensures the globals table is
capable of at least holding
numentries elements without resizing
to avoid fragmenting the heap.
lua_setminimumauxspace(int size) creates a minimum auxiliary space buffer
size bytes. Auxiliary space is automatically allocated with
the allocation flag
LUA_ALLOC_TEMP. An application might
use this to put auxiliary space at the top of a heap or in some other
location, so later freeing of it doesn't cause fragmentation issues.
luaM_setname() macro added and is used internally to name groups of
allocations. The name is passed into the
realloc() callback
function and may be used to better categorize allocations.
This section is out of date!
Basic type metatables are based heavily on Edgar Toernig's Sol implementation of unified methods.
In addition to standard Lua supporting metatables for tables and
userdata, a metatable per Lua's simple types (
boolean, number,
wstring, and
function) has been added. A
string and
wstring, for instance, have indistinguishable
len() functions.
str = "Hello" wstr = L"Hello" print(str:len()) print(wstr:len())
The default method tables have been put into global names for convenience.
They are named like the type but with a capital first letter (
Method tables may be accessed from within Lua using the
getmethodtable() function.
mytable = {} -- Save the old methods. tableMethods = getmethodtable(mytable) newMethods = { doNothing = function(self) end } -- Set the new methods. setmethodtable(mytable, newMethods) mytable:doNothing()
In C, methods may be retrieved using the following functions:
LUA_API void lua_getmethods(lua_State *L, int index); LUA_API void lua_getdefaultmethods(lua_State *L, int type); LUA_API void lua_setmethods(lua_State *L, int index);
A detailed discussion of the LuaPlus Call Dispatcher is found in this document.
Has a single function for retrieving the text from a clipboard.
Retrieves the text from the clipboard and returns it as a string.
Heavily based on the LuaCom 1.0 (beta) implementation by Vinicius Almendra and Renato Cerqueira. For the moment, the original LuaCom.pdf file is in the Docs/ directory. There are a whole bunch of samples in the Test/ directory showing how some of the facilities of the COM module are used.
Some basic file finding facilities. Usually,
glob is
sufficient for any file finds you might need.
Returns a handle representing the first file matching wildcard.
Retrieves the next file matching wildcard.
Closes the file search.
Retrieves the file name of the currently matched file.
Determines if the currently matched entry is a directory.
Glob is a file globbing (matching) facility described in detail at http://www.codeproject.com/file/fileglob.asp. The files found are returned in a table at completion.
table = glob.match("**")
Even though popen() is available under Windows, it is horribly broken, is only unidirectional, and only works for a command-line app. The pipe module provides a facility whereby applications may use pipe facilities without these limitations.
Returns a table with entries for stdin, stdout, and stderr. These file handles work as if they were opened through the io library.
Immediately closes the stdin, stdout, and stderr pipes. Normally, these
would just be garbage collected, but if the application needed them to be shut
down early,
pipe.pclose() is the way to do it.
Similar to the
io.lines() facility. Used in a for loop to simplify
retrieving all the lines in a file (or in this case, pipe).
for line in pipe.lines("dir") do print(line) end
The windows module contains functions for manipulating the Microsoft Windows windowing system. Documentation will be forthcoming.


text:
Posts Tagged 'hurtful comments'
- In: hurtful comments | Kids | Parenting | Support
- Leave a Comment
An interesting article was recently written in support of moms,
advising others of how their comments might inadvertently sound negative and hurtful.
As a mom, I have been the recipient of some of the list of eight and appreciate the support of the author.
I'd also like to add a few of my own.
The article is called Eight Things You Should Never Say to a Mom,
By Charlene Prince Birkeland, Team Mom | Team Mom
Below is the list. Please read the article to review the author's explanations of how these might be perceived as negative.
Here are the responses I'd like to make as a mom:
- "You're so dressed up!"
Thanks, this is my running away outfit.
- "You look so tired."
No I'm not. I was reading in Cosmo that this is the latest "look". It's that smoky look that's all the rage. Looks great, doesn't it?
- "You must really want a girl."
After having my second son people often asked if we were going to try for a girl. My response was "Why?"
- "My son/daughter would love to have a play date with your child. When can I bring him/her over?"
After I bring mine to your house. We'll be there Tues.
- "When did you get so gray?"
I'm not. It's the lighting in here.
- "When are you due?"
A friend of mine got this one from a neighbor. Her response; "I'm not pregnant, just fat."
- "When are you going back to work?
I am at work!
- "I remember that stage. He/she will grow out of it."
We don't do stages in my house. We do "get through the days" here.
Here are a few more I've encountered:
- My pet is my baby
There are few things more irritating to a parent than hearing that someone's dog or cat is their "baby"
- My child has special challenges. He's not one of those cookie cutter kids
So because my kids didn't have special needs they pretty much raised themselves?
- He's not potty trained yet?
You know, I've never seen a college student in diapers
- I read that the way to handle that is…
I read that people who read too much have no time to handle things.

subset: commoncrawl


text:
Darkness in the Delimbiyr
Main Page
Something Terrible Stirs In The Savage North…
Nestled within the Delimbiyr Vale, outside of picturesque Loudwater, a bustling trading hub of the North brews trouble most dire. Reports of a goblin horde massing in the nearby crags of the Greyvale are only underscored by increasingly more brazen attacks upon settlement and trade caravan alike. Indeed, it would seem that every available foul goblin within the Delimbyr Vale has been called to this truly mammoth warhost. To make matters worse, a mysterious aura of chaotic magic has descended upon Loudwater, known only as the Summonplague; it is a fell mystical curse which conjures beasts terrible and strange from all corners of unreality, seemingly only to terrorise the already panicked city.
But all is not what it seems – there are concerns by those with arcane authority that something within the Greypeak Mountains is pushing the hordes out, sending them streaming down the mountains and hills directly into the unsuspecting cities and settlements. However, that Llkorh has thus far been relatively unaffected has begun to have even normally wise minds dance with wild fantasies of a Zhentarim-based conspiracy. The stoic dwarfen mining-fortress citadel of Zhedarak however, has long been prepared for the goblin hordes, and has remained decidedly neutral in these concerns.
Meanwhile, the High Forest has become more active than usual lately, with all manner of strange fey, beast and dragon-serpent seemingly pressing against the merest hint of civilization. The elves of the High Forest, while not enemies, do seem to have their own agenda, or are extremely quiet about whatever they may know about the happenings. Considering the number of fey and dragons that roost upon the Star Mounts, they may well have problems of their own.


text:
Luci and Nicholas at 14 Months16 Comments posted by Kristi on Tuesday, December 15, 2009 at 8:06 PM
There have been great mobility gains in the last month, which means I am drinking a lot more heavily now.
Both babies walk using their walkers quite well.
Nicholas is, quite literally, into everything. We have Baby Jail set up in our family room, so there is no escape route for the prisoners, but that doesn't stop him from trying. If the gate is even slightly open, he will force his head through it like a battering ram, attempting to break free. He also climbs over the toy barricade and onto the brick hearth in front of our fireplace, and even attempts to scale the baby gate. When he's released from prison for good behavior, he attempts to climb stairs, open the fridge and kitchen cabinets, and play in the toilet.
I do not remember Isabella being so hell-bent on destruction, but perhaps I've simply blocked it all out.
It's also been a banner month for the boy because he has found a new toy. In the bath a few weeks ago, my son discovered...his manhood. Much poking, pulling, and fiddling ensued, all performed with a gigantic smile on his face. It's now his favorite plaything during diaper changes, baths, and anytime he's sans clothes.
Nico's hair is growing very long, and it's in his face quite a bit. The fam thinks I need to get the boy a haircut, but I think this works just as well.
This? How you say? Hairtie in my locks? Is curious.
But I like it!
His vocabulary increased this month too, and he's added "Mum-Mum" (as in Baby Mum-Mum), and "Bye-Bye" (with an accompanying arm wave).
After spending half his life being his sister's whipping boy, Nicholas has started to fight back. There's nothing quite as amusing as watching two 14-month-olds battle it out over toys, books, or the last Cheerio on the floor. He's starting to be the aggressor more so than his sister now, but Luci still enjoys beating him upon his head any chance she gets.
Luci is now pulling up and cruising the furniture right beside her brother. I actually think she's the faster crawler now too. Both babies are still entrenched in a fussy eating stage (their dinners consist of macaroni, string cheese, bananas, and Mum-Mums), but Luci is especially fussy.
She is still having an awful time at night, and at least a few nights a week is up and screaming in the late evening and early morning hours, and no amount of CIO or rocking her back to sleep works. I'm not sure if it's teething (she's currently still toothless...at 14 months), nightmares, or what, but I am ready for it to stop.
Her expressiveness is quite adorable, and she's constantly pointing at things and saying, "That." In addition, she now says "Bye-Bye," "Mum-Mum" and "Ba" (ball).
Just before Thanksgiving, I stopped nursing them. Nicholas was long ready for this, and had shown a complete disinterest in nursing since turning a year. I was only nursing him once a day (before bed), and he really wasn't into it for the last few weeks before I stopped. Luci, however, would nurse herself to sleep (or close to it) before naps and before bed. I contemplated continuing nursing her, and decided in the end not to. It seemed unfair to Nicholas (which sounds ridiculous, considering the boy was so over my boobs, but more than that, I was ready to be done.
I know this sounds selfish, and I know there are some nursing moms out there who will not understand, but I exclusively nursed twins for 13 months.
13 months.
And while all along I said I didn't deserve the rockstar treatment for doing so, you know what I think now? I did. Nursing two babies exclusively for this length of time WAS an incredible feat.
It was hugely time-consuming. It was insanely difficult, especially in the beginning when Isabella had just turned two and used my nursing time to tear apart the house. And it was an enormous responsibility. I was the only one who could soothe two colicky babies when all hell broke loose in our house, which happened more times than anyone will ever believe. I was the one up all night long nursing one baby, then the other baby, then the first baby again, and so on.
I nursed twins for 13 months despite everyone in my family (and I do mean everyone) telling me to switch to formula and asking me with quizzical expressions exactly when I planned on stopping (as if nursing twins was this freakish and stupid choice). And while there is certainly nothing wrong with formula, it wasn't the choice I had made for my babies, and I wasn't going to
stop because I wanted to give them the best start possible, and the same start I had given to Isabella.
So yeah, I nursed twins for 13 months. And I am damn proud of myself for doing so.
And I think these two are too.
Likes: Calling the shots, crying, and hunger strikes
Dislikes: Sharing, all vegetables, and being steamrolled by Isabella
Likes: Preparing for his Spiderman audition, crying, and attempting to crawl back into the womb
Dislikes: Independence Day, "Miss Independent," and Freedom Fries
16 Responses to "Luci and Nicholas at 14 Months"
Such cutie-pies! I also think you deserve rock star treatment! I nursed Little Elvis for 13 months, and was hounded for that decision as well.
As for Nicolas getting into everything, I think it's a boy thing. And if he's anything like mine, it doesn't stop and actually gets worse! If I even look like I might tell Little Elvis not to do something or get into something, he does it immediately.
Gosh they are getting so big, and even cuter! (apparently it IS possible). I still can't believe you nursed twins for that long. Wow. I mean I'm not a boob person either, and even I think that's amazing. I at least had the option to palm off my screamers (at varying stages) to the husband, their grandmas etc.
As for Nic scaling and climbing? Welcome to having a boy! Now be grateful your other two are girls :)
Mmm, maybe it is time for a trim. ;-)
They're too cute. You are absolutely amazing to have breastfed them for 13 months. That's incredible and a lot to be proud of.
Sorry Luci's still struggling with sleep. I can only imagine how hard that is. Jason didn't sleep through the night from 6 mos. to 3 years, so you have my empathy.
Coming from someone who nursed a kid for THREE YEARS after barely nursing the other two, I *completely* understand when you say you were ready to stop. And yes, you should receive HUGE props for nursing two for that length of time. That's awesome!
Their growth and development is fascinating to see. Nicholas reminds me of my kids at that age (and now still) - constantly into everything!
LOL - Oh mama, you *have* to get that poor boy a haircut. Now. Or we might have to stage an intervention. :)
I think you kick major @$$ for nursing the kiddos for 13 months. My goal is to do the same thing -- I'm sure you will be getting a MILLION questions from me!
Speaking of BFing twins, by the way, my Grandma (who FF but loves that I BF my son) asked, "You aren't planning on nursing the twins, are you?" When I told her I absolutely was, and that I could save $2,000-$4,000 by doing so, she was quite for a minute and then goes: "Well then, you should go into business after they are done!" Ha ha ha. Not to many people can argue with the money savings, even if they don't GET it. :)


text:
You are hereEvents / Events
The Sierra Club Peak Climbing Section has the distinct honor of hosting legendary climber, Fred Beckey, on Wednesday, December 7 at 7pm at Sports Basement Sunnyvale. We hope you will join us! Sierra Club members always get a 10% discount at Sports Basement.
Come to the 36th annual PCS Festivus party, on Tuesday, December 13, 2011, at 7:00 p.m., at the Whisman Station clubhouse, at 420 Kent Dr., Mountain View.
Come join us for the second in our new Tahoe Backcountry Skiing Series.
Typically Tamarack Peak (near Mt. Rose) has the best early snow.
December is often the best powder.
Requires advanced skiing skills (resort black diamond), avalanche
training. Randonee or Telemark skis, climbing skis, avalanche beacon,
shovel, and probe.
Leader: Louise Wholey (louisewholey at yahoo.com)
To sign up send $8 for leader training to Louise Wholey, 21020 Canyon
View Drive, Saratoga, CA 95070.


text:
The times really are a-changin'.
Mitt Romney's campaign team has revealed that the Republican presidential candidate will reveal his choice for a running mate via his brand-new app for Android and iOS devices (iPhones and iPads). The app is called Mitt's VP and it's available for free in the App Store and Google Play store.
Barack Obama was widely praised for his use of new technology during his 2008 campaign, so it appears that Mitt is trying to one-up the POTUS with this move. Obama isn't being totally left in the dust, however. He also has his own app for the upcoming election season.
Screenshots of the Romney app are posted below. Anyone downloading it should be aware that it may automatically opt you in to receiving e-mails from the Romney campaign. Of course, if you actually download an app based on Mitt Romney, you are probably okay with receiving those emails.
So… any guesses as to who Romney will reveal as his running mate?


text:
January 2019 Union City Rent Report
Welcome to the January 2019 Union City Rent Report. Union City rents declined over the past month. In this report, we'll evaluate trends in the Union City rental market, including comparisons to cities throughout the metro, state, and nation.View full Union City Rent Report


text:
McDonald's recently began testing serving its entire breakfast menu at certain locations in Oklahoma and North Carolina. While the launch of all-day breakfast has been extremely successful for McDonald's, some customers have been disappointed by the limited options. Now the chain is testing the possibility of adding all of its breakfast fare to the all-day menu.
Instead of choosing between an English muffin or a biscuit, customers at certain McDonald's locations will now have the opportunity to order from the entire breakfast menu any time of day. The new menu option is called the 'All Day Breakfast: Bigger Menu' and it gives consumers the option to choose from McGriddles, English muffins and biscuits. The expanded menu is currently being tested at several locations in the Tula area as well as the Triad area of North Carolina.
Comprehensive Breakfast Menus
More Stats +/-
Dessert Breakfast Sandwiches
Protein-Heavy Convenience Menus
Fast Food All-Day Breakfasts
Fried Chicken Breakfast Sandwiches
Kale-Infused Breakfasts
Free 2019 Report & eBook
Get the top 100 trends happening right NOW -- plus a FREE copy of our award-winning book.
Our Research Methodology
This article is one of 350,000 experiments. We use crowd filtering, big data and AI to identify insights.
This Chain is Offering Its Entire Breakfast Menu at Some Locations
- By: Katherine PendrillMar 9, 2016
References: brandeating
References: brandeating


text:
Cisco AIR-ANT1728 Aironet Omnidirectional Ceiling Mount Antenna - 5.2dBiItem#:� YYT2-543848 �|�Model#:�AIR-ANT1728
Currently Out Of Stock!
You May Consider This Alternative
Additional Resources
Cisco Aironet O.D. Mount Antenna AIR-ANT1728 Product Details
Cisco AIR-ANT1728 Aironet Omnidirectional Ceiling Mount Antenna
Every wireless LAN deployment is different. When engineering an in-building solution, varying facility sizes, construction materials, and interior divisions raise transmission and multipath considerations. When implementing a building-to-building solution, distance, physical obstructions between facilities, and number of transmission points must be taken into account.
Designed for WLAN applications in the 2.4- to 2.483-GHz frequency range, the Cisco AIR-ANT1728 Aironet Omnidirectional Ceiling Mount Antenna has a nominal gain of 5.2 dBi and is typically mounted indoors or on a ceiling. The Cisco AIR-ANT1728 Aironet Omnidirectional Ceiling Mount Antenna is compatible with Cisco Aironet radio products utilizing a reverse polarity TNC (RP-TNC) connector.
|Antenna type:
|Operating frequency range:
|2.4- to 2.483-GHz
|Less than 2:1, 1.5:1 nominal
|5.2 dBi
|E-Plane (3dB bandwidth):
|40 degrees
|H-Plane (3dB bandwidth):
|Cable length and type:
|3 ft. (0.91 m) Plenum Rated RG-58
|Dimensions (H x W):
|11.5 in x 1.25 in.
|4.6 oz (131 g)
What's Included
Additional Resources: Product Manuals
Manufactured by: Cisco
Warranty provided by: Not Available
UPC No: 746320380469
Mfg Part No: AIR-ANT1728
Box Size:
( Length:15, Width:5, Depth:2)
Shipping Weight: 0.2000 pound(s)
Dimensional Weight: 1pounds
What is Dimensional weight?
Click here for full warranty and support information
- Cisco logos are registered trademarks of Cisco. All others trademarks and copyrights mentioned herein are the property of their respective owners.


text:
Pension advice
Request your Free Pension Consultation today!
Pension advice
Welcome to Sterling North, the home of good Pension advice. When it comes to pension planning the most important factor is knowing where your money is invested. If you don't carry out regular reviews on the performance of your pension you could be losing out. You could even find that your pension will not be enough to provide you with the comfortable retirement you had planned. At Sterling North we can provide you with quality impartial pension advice. We also offer a full review of your current pensions and advise you in plain English, on how your current arrangements are performing. For those who are interested in making the most of their pension, get in touch today and book your free consultation.
Nicola Mayers Dip PFS Managing Director / Advisor Sterling North
Pension advice
When was the last time you reviewed your pensions?
Do you know where they are invested?
How are they performing?


text:
Filled with Polyester Fibre. The filling materials and cambric cover meet the flammability requirements of BS5852 1988 up to crib 5.
To make cushions see The Encyclopaedia of Curtains pages 220-2.
To plump a hollow fibre cushion, hit the cushion in the centre. This will not only introduce air, but also send the fibres back out to the corners.
Dry Cleaning - Professional dry cleaning only.
Washing - Hand wash or use a Laundrette size ( large capacity) machine at 40C using a wool cycle, promptly spin dry and then hot air tumble dry.
Always ensure that the filling is thoroughly dried.
Do not iron.


text:
profile | register | preferences | faq | search
Posts: 29366From: Houston, TXRegistered: Nov 1999
The next Lunar Legacies Space Memorabilia Auction will be held in late March of this year, and will feature autographs, flown items, hardware, booklets, manuals, patches, badges and much more from all space programs.
The auction will be hosted by Live Auctioneers, and the lots will be uploaded two weeks before the auction date for viewing and pre-bidding.
The Space Walk of Fame Foundation has also announced that Lunar Legacies will be holding a free space memorabilia appraisal clinic:
Check in the attic, clean out the closets and from under the bed, bring your space memorabilia to 1026 South Hopkins Ave., Titusville (Pat Fisher's old Nissan building next to the Star Advocate). Lunar Legacies, a leader in space memorabilia auctions since 1999, will be conducting free appraisals, accepting auction consignments and/or cash purchases of your early space memorabilia. Items of interest include cloth patches, access badges, astronaut autographs, spacecraft models, photograph, items flown in space (flags, patches), booklets, manuals, jackets, etc. They will also be buying (paying cash) and accepting for consignment quality items for an upcoming space memorabilia auction. This Space Memorabilia Appraisal event is sponsored by The U. S. Space Walk of Fame Foundation/Museum. Event to be held at 1026 South Hopkins Ave., Titusville, Florida, Friday, February 28, 10 to 5, Saturday, March 1, 10 to 5 and Sunday March 2, 10-5. For further information contact Karan Conklin at the museum at 321-264-0434 or Don Willis at 321-848-3337.
This Space Memorabilia Appraisal event is sponsored by The U. S. Space Walk of Fame Foundation/Museum. Event to be held at 1026 South Hopkins Ave., Titusville, Florida, Friday, February 28, 10 to 5, Saturday, March 1, 10 to 5 and Sunday March 2, 10-5. For further information contact Karan Conklin at the museum at 321-264-0434 or Don Willis at 321-848-3337.
Posts: 218From: Lakewood Ranch FL USARegistered: Jul 2004
A great auction and resource for space-related items.
Posts: 586From: Honolulu, HI, USARegistered: Sep 2010
Posts: 373From: Liverpool, United KingdomRegistered: Mar 2012
He is working to have the catalog available for preview on liveauctioneers.com by March 25.
Posts: 1822From: Worcestershire, England, UK.Registered: Apr 2008
Posts: 4945From: Brussels, BelgiumRegistered: Jan 2001
There are many descriptions left for me to write, truncated titles anddescriptions from the uploading process for me to fix, photos to add, etc., and all that will be completed by this Friday, but the bidding numbers are correct and you may pre-bid now if you so choose.I do accept mail-in bids if you cannot be there live for the auction, so please email me with your list, and we will be glad to bid for you. Please also understand that all mail bids must be confirmed received by me.Highlights in this auction include: An Apollo 11 flown Silver Snoopy awardAstronaut autographed photos from the former Fat Boys Barbecue in Cape CanaveralAtlas, X-15 and Saturn V hardwareA large STS-1 flown tile presentationMany early and not-so-early jumpsuits and smocksThe Apollo 17 crew parking sign outside the FCTB
I do accept mail-in bids if you cannot be there live for the auction, so please email me with your list, and we will be glad to bid for you. Please also understand that all mail bids must be confirmed received by me.
Highlights in this auction include:
Posts: 37From: Dallas, Texas, USARegistered: Oct 2008
A soft Space Shuttle tile used on the top of the Shuttle, probably at the Payload Bay doors, as a protection against heat exposure, albeit much less heat than elsewhere. RTV remains on the bottom where it was attached. Flown for sure but with no paperwork.
Posts: 417From: Pampa, TX, USRegistered: May 2011
Lot 453 (which is an item I won) is also an AFRSI/FIB blanket, although it appears to be cut from a larger blanket (since the edges are cut open). The lack of RTV on the back suggests to me that it wasn't used for anything.
Posts: 3180From: Sierra Vista, ArizonaRegistered: Nov 1999
Posts: 92From: Merritt Island, FLRegistered: Mar 2009
I also said there was no paperwork, so this lot was for someone who wanted a tile such as this.
For any bidder initiating a purchase of an item advertised as flown without substantiating provenance; don't be surprised if down the road your investment is lost in the event of a subsequent resale attempt. Citing a previous auction house lot description as evidence of provenance, that simply indicates an item is "Flown", "Flown for Sure" or similar, in the absence of any other artifact physical attributes and/or traceable paperwork authenticating flown history is risky.
Posts: 3163From: London, UKRegistered: Feb 2002
Aside from that, another great auction from Donnis. The LiveAuctioneers software worked seamlessly... even on iPad. Finally, someone has figured out live bidding on iOS!
Posts: 81From: Bolney, West Sussex, EnglandRegistered: Jan 2008
quote:Originally posted by Tykeanaut:If a buyer is happy with any auction description then what's the problem?
One piece of advice a fellow collector gave me years ago was 'buy the object, not the story'. Without cast iron provenance, value any item at face value. You won't win any auctions nowadays it seems, but you won't pay over-the-odds or lose a fortune when you come to sell.
There are some unsavory characters out there, but Don isn't one of them.
Posts: 219From: Registered: Sep 2001
quote:Originally posted by rgarner:That is true, but sometimes the story IS provenance.
There are plenty of artifacts out there which have come from known collections and estates and yet have no paperwork, yet are unquestionable as their history is solid.
But like I said, I wouldn't sell something on without paperwork. If I purchased something without paperwork then it would be for my private collection - and the story must stand up to solid scrutiny.
In fact, it is the combination of all of these that form a strong record of provenance. Any one data source alone cannot suffice as provenance beyond reproach.
I can cite a few examples where the source documents were found to be wrong after the owners' accounts pointed to inconsistencies in the record — and vice versa.
Posts: 1534From: Guyton, GA Registered: Jan 2006
I have to tell you if I get information from people like Robert, Donnis or Scott I believe they are giving me the best information that they are able to give. Could they be wrong absolutely (sorry guys) were they trying to be deceitful, absolutely not. It is up to me to determine what I do with that information.
For example, the MSFC Saturn V model we picked up was reported by the seller (a MCFC engineer) to have been on display for a time in one of von Braun's offices. Did I take that into account when I was negotiating the price, no way. Great story and the thought that it may have been there is cool but it did not weigh into my decision. Nor did I post that fact when I posted the picture of our display on this site.
I have typically have been staying away from these emotional topics; however I had to post on this one. I have been blessed beyond belief to be able to add to our collection and do so from all avenues, word of mouth, friends, eBay, auctions and others. In all of that I have found Donnis to be one of the most upstanding seller we have in the community, honest and trust worthy. Take his descriptions for what they are, the best information he has available and is willing to share every bit of it with those who want to buy the item.
Now go focus on those auction houses that would have started the bidding on the same item, with the same provenance, at $2,000.
My comment primarily pertained to the auction communities predisposition to insert the Flown caveat without exercising due diligence in support of that claim (the obvious reason being increased interest/enhanced valuation).
Posts: 1735From: Atlanta, GA, USARegistered: Feb 2007
I don't think AFRSI blankets are applied to orbiters in small blocks or tile shaped objects. I have such an object, and it appears to be bonded to an aluminum plate like the orbiter's but I believe this to be a test piece.
Photo 1 - AFRSI block bonded to aluminum
Photo 2 - Block close up
Instead I believe this form of insulation is applied in larger blankets like this one.
Photo 3 - AFRSI blanket
Finally here's a close up of an AFRSI blanket where it meets the edge of an orbiter's white (LRSI) tiles. This shot was taken after orbital repair but seems to confirm, in this section at least, the AFRSI was applied in larger segments.
Photo 4 - AFRSI blankets against tiles
All times are CT (US)
Copyright 1999-2014 collectSPACE.com All rights reserved.
Ultimate Bulletin Board 5.47a
Ultimate Bulletin Board 5.47a


text:
ChronOS Stability Study: For Metastatic Cancer
OBJECTIVES: I. To determine if Chronos (beta-tricalcium phosphate bone graft) will form a
posterolateral fusion mass in patients undergoing fusion surgery for spine cancer within 12
months. II. To evaluate quality of life following the use of ChronOS as measured by (a)
pain (or lack of pain) associated with pseudoarthrosis and (b) the need for additional
treatment for instability as a result of hardware failure. OUTLINE: Patients undergo
placement of beta-tricalcium phosphate bone graft strips posterolaterally during surgery.
After completion of study treatment, patients are followed up at 1 month and then every 3
months for 1 year.
Allocation: Non-Randomized, Endpoint Classification: Efficacy Study, Intervention Model: Single Group Assignment, Masking: Open Label, Primary Purpose: Supportive Care
Achievement of durable posterolateral fusion
Measured from x-ray and/or computed tomography (CT) scans. Standard criteria of determining fusion is visualization of continuous trabeculating bone bridging the transverse processes and facets on AP and lateral x-rays or when there is < 2 degree angular motion and < 2mm of translation on standing flexion and extension radiographs.
Within 12 months
Thomas Chen
Principal Investigator
University of Southern California
United States: Institutional Review Board
June 2011
June 2014
|University of Southern California
|Los Angeles, California 90033


text:
Company : ViewSonic Corp
UMDC Code : 454261
ViewSonics RELIABLE PERFORMER DELIVERS ON A PROMISE OF QUALITY STANDARDS like 250cd/m2 of brightness and 1000:1 contrast ratio or stunning, bright images. The VA705b features a 5ms video response time that produces crystal-clear graphics and HD quality video for full brilliant, detailed color. SIMPLICITY IS EXECUTED THROUGH ITS CLEAN LINES, SLIM BEZEL. The VESA wall mount makes the VA705b an unobtrusive integration to any decor. Packed with a powerful OnView control interface, precise performance is always a priority in this extremely affordable package. The stylish VA705 LCD display is an ideal choice for SOHO, education and government users.
Product URL : http://ap.viewsonic.com/in/products/lcd/VA705b.php
Last Updated : 03/16/2013
Categories : "Monitors, Video"
Please provide the following information and a representative of ViewSonic Corp will contact you to assist with any questions you might have.
Home |
Specialties |
About |
Terms of Service |
Privacy Policy
Copyright 2019 Medical Product Guide. All Rights Reserved
ECRI Institute Universal Medical Device Nomenclature System (UMDNS™) Proprietary Statement
Ensure that document matches include...
...all of these word(s):
...and optionally include these word(s):
...but do not have these word(s):
Enter your phrase:
Enter the first few characters of a word:
There are 2 types of basic queries: Terms and Phrases.
A Term is a single word search.
A Phrase would wrap a string of words in quotes and find matches on the extact string.
Boolean Operators
You can combine basic queries with Boolean operators to form a more complex query. Boolean operators define the relationships between Terms or Phrases. Our search supports the following Boolean operators: AND, "+", OR, NOT and "-". Please note that Boolean operators must be all uppercase.
example search: default AND document
This is the default operator. It will be used if there is no Boolean operator between two terms. For example:
default document is the same as default AND document. In this case both terms need to exist within a listing to find a match on that listing.The + character is synonymous with using AND.
example search: default OR document
In this case just one of the terms needs to exist within a listing to find a match on that listing.
example search: default NOT "document type"
The NOT operator excludes documents that contain the term (or phrase) after NOT. So a listing match would have to include the word default but not the phrase "document type". The - character is synonymous with using NOT.
Wildcard/Prefix queries
You can perform "wildcard" or "prefix" queries using the '*' operator. Whereas all of the previous search found exact matches on the whole term or phrase, a wildcard search will find partial matches.
example search: ehr*
This query will match all documents containing words beginning with the prefix 'ehr' like the word Ehrlichia.


text:
Enhancing the digital look of one of the world's leading shoe brand
Birkenstock ranks among the global top 5 shoe brands and is one of the leading brands worldwide. Dept gave the brand a new digital look and feel to present it as a lifestyle brand. Our team worked directly and in close partnership with the client to develop and assess ideas, enabling agile implementation and optimum results with a new Salesforce Commerce Cloud platform.
Restructuring Birkenstock's online environment that matches their identity
Say Birkenstock and you most probably think of their well-known line of sandals. Quite understandable. However, as one of the world's top five footwear brands, it also produces many other products. For example, the product portfolio has been expanded to include a new Birkenstock natural cosmetics line, and in the near future, their planned magazine will be a source of even more inspiration for lifestyle enthusiasts.
To present Birkenstock as a lifestyle brand, the online store was in need of a new look-and-feel. In close and direct partnership with Birkenstock, Dept created a new design that communicates Birkenstock's core values and product lines, and that brings the quality of their products to center stage. Therefore, the new website has clear menus and product overviews that make it quick and easy for anyone to find the product that's perfect just for them.
Dept was also asked to assist in the business and project consulting as well as solution integration. The company uses multiple sales channels, especially online and branch sales, to bring trendy shoes to consumers all around the world. Birkenstock's aim – to boost online sales and strengthen the brand globally – made them change their platform to the e-commerce solution Salesforce Commerce Cloud and prepare for the future of e-commerce.


text:
I'm totally blown away by these intricately beautiful works by Brian Dettmer, a Chicago-born, Atlanta-based artist. Using knives, tweezers and surgical tools, he dissects one page at a time, not relocating or implanting anything from inside the out-of-date encyclopedias, medical journals, illustration books, and dictionaries, only removing pieces.
"My work is a collaboration with the existing material and its past creators and the completed pieces expose new relationships of the book's internal elements exactly where they have been since their original conception," Dettmer explains.


text:
Wood Fences
We at Whitmore Fence take pride in providing the finest custom Western Red Cedar fences in Central New York.
Why Western Red Cedar?
Naturally a beautiful wood, Western Red Cedar is a long-lasting, stable material. It is an excellent choice for your garden, boundary, or even dog fence. Red Cedar will not warp or crack like pressure-treated lumber and lasts as many as five times longer than spruce — typically 25-30 years without maintenance.
Customers have the option of letting it fade to a silver grey or preserving its natural beauty with a regular clear stain. We use #1, #2, and clear lumber — meaning no unsightly knotholes — in our fences. Western Red Cedar boards and cross members, combined with high grade pressure-treated posts, create a fence that will add elegance and functionality to your property for many years.


text:
Writing a research paper for Accounting is no different than writing a research paper for another discipline. However, there is no agreed-upon writing style format within this discipline, so be certain to follow your professor's instructions. If no preference is stated, then follow APA guidelines, utilizing a 12 pt. Times New Roman font.
Writing a research paper for Accounting involves several steps:
- Select a topic – If your professor has not provided you with a topic and you cannot readily think of one, then watch the news or read a newspaper. Some areas to consider for research are treasury stock, managerial, or financial accounting. The topic should be one that has relevance, not only to you, but to your targeted reading audience as well.
- Conduct some background research – Peruse at least three resources in order to develop an argument or thesis statement for your research paper.
- Develop an outline – Begin by providing your thesis statement above the outline. The thesis statement should consist of one or two sentences that clearly describe the purpose of your research paper. It is the controlling statement for your paper. The outline shows how you plan to develop your paper, step-by-step.
- Write your draft – Your paper should contain an introduction, body, conclusion, and references.
- Begin your paper with an introduction. It should include your thesis statement and should also explain the importance of your argument.
- The main part of your paper is the body where you will provide evidence to support your thesis statement, that is, the main premise or argument of your paper.
- The conclusion summarizes the main points in your paper with a clear connection as to how the points support your thesis statement.
- Unless specified by your professor, you are expected to cite sources from peer-reviewed journals. These sources should be listed on a separate references page in addition to being cited within your Accounting research paper.
- Revise your outline and draft – Expect to revise both your outline and draft as you write your paper. As you research, more ideas and information will surface. This will necessitate adding and/or deleting ideas as well as reorganizing the sequencing of ideas in a logical and coherent manner.
- Proof-read and edit your final draft. Make certain that mechanical errors in spelling, grammar, and punctuation have been addressed. Recheck word-choice and sentence structure. You may need to pull out that thesaurus to avoid using the same words too many times. Avoid writing in first or second person. Do not use "he" or "she." Instead, refer to "an individual" or "a person."


text:
Schaum's Outline of Probability and Statistics, 4th Edition 897 Solved Problems + 20 Videos, by Schiller, John; Srinivasan, R. Alu; Spiegel, Murray
Note: Supplemental materials are not guaranteed with Rental or Used book purchases.
- Cover: Paperback
- Copyright: 12/6/2012
The ideal review for your probability and statistics course More than 40 million students have trusted Schaum's Outlines for their expert knowledge and helpful solved problems. Written by renowned experts in this field, Schaum's Outline of Probability and Statisticscovers what you need to know for your course and, more important, your exams. Step-by-step, the authors walk you through coming up with solutions to exercises in this topic. 760 fully-worked problems solved step-by-step Hundreds of additional practice problems with answers Coverage of all course fundamentals Easy to understand methodology Clear, concise explanations of all probability and statistics concepts Appropriate for the following courses: introduction to probability & statistics, probability, business statistics, basic statistics, and beginning statistics Easily understood review of basic probability and statistics principles Supports all the major textbooks for the introductory probability and statistics course


text:
This week has been intense one to say the least and I'm terrified I'm turning into a "Drama Queen" - who said you are already?! ...or even worse in parts an Askhole! If your not familiar with the word I will explain because I'm determined to get this "phrase" into the Oxford Dictionary as if I have been infected recently I'm defiantly in very good company and its enough to put me off Facebook sometimes...OK that would NEVER happen but still Its irritating.
- Askhole:
Someone who consistently abuses Internet fora and discussion boards to post stupid questions a quick google search could have easily answered. Usually withholds relevant information so that even posters trying to help cannot really solve his/her problem adequately
and or
A person who constantly ask for your advice, yet always does the opposite of what you told them.
Now I haven't intended to do this but 1. I haven't had time to (for example) trawl though the masses of baby websites all with horrible pop up advertising to find the best baby sling to carry Oscar around an airport with on my own, who FYI is like toting around a baby elephant 2. After then having the cheek to accept an amazing sling as a gift off one of my friends I then didn't take or want anyone's advice if I'm honest. As the husband after previously not being able to come home and fly back with us to Texas (approximately 16hr travel including a 10hr 10min solid flight if your interested) I would have had to do it on my own with a 3yr old and a 1yr old both lets call them "rambunctious". Anyway THANK the lord and US Immigration because due to a visa problem he now has to return today so we can go to the embassy in London to sort out a proper visa next week and all fly back together, excuse me.... YAAAYYY!
I must say I didn't expect it to be this hard without Chris as he goes offshore a lot and he's been on more stag doo's than Geordie Shore Tours but it has felt like forever since I've seen him, not to mention the weight of the responsibility of putting all the bins out on the correct days and chief nail clipping duty of the boys! It hasn't helped that he has struggled to get WIFI set up and I had no signal while I was away so we haven't really been able to talk or Skype until 2 days ago. While I'm talking about Skype I will just say sorry to anyone I have ever know, I was under the assumption I was in control of my facial movements and as you know I keep little to my self but occasionally you have to, like when I'm informed of something like "I'm pregnant for the 6th time" I can say "Ah wow congratulations" but inside I think "what the very f*ck?!". However I have now noticed that every single thing I think is all over my face and its no wonder my face is looking more like a bit of crumpled paper, so when the husband told me he had gone for a "Black" theme in the bathroom of our new condo .....
In other news I have been particularly annoyed this week at people being judgemental with parents or should I say my parenting, this hasn't been personal which honestly is more irritating, its like when I used to discreetly breast feed my boys and the whole time I was desperate for someone to say something offending then I could blast one these people into their place; my poor shy friend was once told it was wrong to bf in public?! Its 2013 feed your baby how you want I have done both and dont think either is better. Anyhoo I don't mind telling you one bit that when I thought I was going to be flying 10hrs straight with a Tasmanian devil in my lap that I looked into child sedation, I was kidding but my friend sent me this great article Here, apparently there are things that can take the edge off if your child is hysterical. It was the comments below though that got me, some people are just so blumming sanctimonious, I will give you my car as well if any of the disgusted people, A. Have Children or B. Have ever flown long haul with them, yes you "Children should know how to behave then you wouldn't have to drug them". Well excuse me,Im not even worried about my 3yr old he can be reasoned with but my little son is just 18mths old he can not yet talk but he can run, this is not a good combo in a stuffy metal tube going 600mils an hour and what smart idea do you have to make him stay on my knee during turbulence?!...anyone? no seriously?....
The other thing that really irritated me is people saying they will be sad when the summer holidays are over...if that's true I salute you truly a better person than me. It makes me feel SUPER guilty though as I'm already desperate to get Archie into a school as soon as we hit US soil, I wouldn't have been as bothered if I didn't know for a fine fact that its not even true for some people in particular. Most of us are limping over to the last week of the holidays, skint, knackered and at times willing to tear a chunk out of your own hair out; if you miss them that much then home school them! Even K-Mid after saying she wouldn't, is now getting a nanny (called it!) its all fun until one hasn't slept for 6 weeks, you cant even remember how to shave your legs and your surviving on chocolate and paracetamol. ENOUGH on the judgement we are all just doing our best.
5 and 2 can do one this is my new diet!
Happens to the best of us Pet.
Onto brighter subjects, I have been having lots of farewell Rendevous with my family and friends to try and see them as much as possible before we all go and it is necessary to be truthful as since Chris has been away I have barley had a proper meal, I cant be bothered to cook when the kids are in bed so I've lived on biscuits, things on toast and baby food...hey there is a lot to be said for them, no added rubbish and goes *ping* in 3mins! I have also been for a lunch and lovely tea with the old girls from work...they are not old, the work is but I cant let them go they are too lush. Then I had a night out with my Best girls, Carly, Clare and Marie, we have all known each other since we were 12, we've done the girly holidays to Faliraki, relocation's, thick and thin and now we are moving on to more serious matters like marriage and babies. As I am 30 in 10days (technically next week *gulp*) and we are all 30 within the next 4mths we were supposed to be going on a weekend away somewhere exciting but due to me moving it has been delayed indefinitely. We or should I say they decided we had to have a night out, I didn't organise a thing, I didn't even know where we were going even when we got there as I had never been to these places before and we may never take that trip but I couldn't have asked for more anyway; it was a perfect night!
We all got dressed up, taxi was on time *essential*, we then went to the fantastic Pleased to meet you which is a speciality Gin and Cocktail bar, I thought this would end badly knowing us but Supper was on the cards so we behaved ourselves despite the drinks being ...MMMMM!...If I ever have a bar I want one like this especially with the gorgeous glassware. We then wandered over to Paradiso and again the food was just amazing, since having the boys I sadly usually dine in "Chain" establishments but this was a proper Restaurant, the food wasn't late at all but wasn't "Fast" either which I love because to me it means its freshly prepared, I was proved right when between the four of us there wasn't a single complaint. We all went for the very reasonable £13.95 for two courses everything was delicious, Carly and Marie said the chicken was the best they had ever had and I can recommend the Lamb Kofta its lush; oh and the service was amazing nothing was too much trouble. We then wandered down to House of Smith which was also fab and we danced the rest of the night away, in fact I felt it was like Pleased to meet you bigger brother. Its definitely a sign that I'm getting older though, I wont tolerate places anymore that smell like feet, have sticky carpets, bad décor, full of people from The Jeremy Kyle waiting room, overly loud music, no where to sit and plastic glasses sorry I'm not a toddler and people that cant be trusted shouldn't be let in. I want to be able to sit and talk my friends and I don't mind paying £7 for a cocktail or waiting 5mins for it to be properly made but I am not having it in a sippy cup; all these places got it just right.
Ash x
- Pleased to meet you - ptmy-newcastle.co.uk/
- Paradiso - www.paradiso.co.uk/
- House of Smith - house-of-smith.com/
Lamb Koftas!
Archie and Oscars Corner
- "Mam can I fly?"...standing at the top of the stairs.
- "Mammy I'm gona blow you a kiss BUT don't drop it like the last time ok?!"
- Me "Oh look Archie a cool spotty dog" Archie "Mam its called a Dalmatian..."
- *thinks* Doesn't Alpen look better all over the floor.
- "Mam are you having a laugh putting me in this costume, I distinctly said Spiderman, at least the big un looks worse ha haaaa"
- "Well I am not impressed one bit, I might have been sick over my Ducky but you know I cant sleep with out it and I prefer it filfy how very dare you wash it....Im sitting here crying until its done"
- "Hey! moving rock everyone knows food on the floor is MINE"
Sebastien (Pasty) and Oscar (Oski)