text:
Small companies can always use any type of side they can acquire, particularly when it concerns advertising. It is not always quite simple battling the opponents and for this reason creativity could sometimes be the best solution. If your little company has been performing well on social networks around this stage, you may want to take under account one of the fairly new kids on the block, Instagram. Essentially, Instagram has really become a widely notable social networking system that centers on visual material. Offered the character of the, it is sometimes a superb method to distribute the message regarding your own firm or brand and captivate a fresh target marketplace. It is crucial to be sure that this system is ideal for your company so that you do not wind up speaking with a symbolic online wall. A superb preliminary test is to inquire by you, do I have something I would really like to actually reveal my marketplace.
Using a service like Instagram will surely be much considerably simpler if the internet content or graphics presents itself for you and there is no need to truly search for this. Your viewers will surely be considerably more reluctant to follow your company so long as it is not struggling to detect and develop articles. In other words, if appealing photographs of what your manufacturer participate in or signifies are simple ahead across, then Instagram is likely for you because if you are experiencing trouble today finding the best photograph, you then will probably still be having difficulty 4 weeks later on. This can be an additional one of those questions that prevents you from the distress of talking with a wall surface on line. It is crucial your clients, past, present, in addition to future, are people that are using the service. If they are not, you may certainly do in your an superb favor by devoting your time and resources on where they exist in different areas online.
Instagram users are those who have been raised in the time of technology. Social networking sites like facebook and also Twitter have force of dependence on them, hence the in depth usage of hashtags on this particular platform with insta enjoys. Clients vary in ages from young adolescents entirely through adults in their 30's or even 40's, provided they are technologically intelligent at the era. Given these demographics, Instagram can be utilized by plenty of individuals. Not only in the USA, however within a global scale since it is an Android program also. The entire downloads is over 40 million because the brand new calendar year. Businesses are able to benefit from using ig 人數 in many different methods. No matter which you pick, it is essential to remember that it has to be a corresponding expansion of a developed social networking sites or digital advertising and promotion strategy all around.


text:
Panama Canal and Its Impact on U.S. Economy
How It Lowers Your Food Bill and Creates U.S. Jobs
The Panama Canal connects the Atlantic Ocean to the Pacific Ocean via the Caribbean Ocean. It allows ships to avoid sailing another 5,000 miles around the southern tip of South America.
The canal's engineering is complex. It's more than digging a long trench at the shortest point which is the Isthmus of Panama. First, the sea level of the Caribbean is eight inches lower than the Pacific. Second, the two oceans have different tides. Third, the Isthmus of Panama rises 26 meters above sea level.
The Panama Canal solves the problem of different sea levels. It sends ships through a series of three locks. First,the locks lift the vessels up to Gatun Lake. They then lower them through three more locks back down to sea level. On average, it takes 13 hours to move through the canal's 51-mile length.
The expanded Panama Canal opened on June 26, 2016. The expansion added a new third lane. That doubled the canal's capacity. Most important, it accommodated Post-Panamax ships. Each one is 1,200 feet long and carries three times the cargo of 965-foot-long Panamax ships. That efficiency will lower your food costs.
Panama receives $1 billion in tolls from the canal. That will double or even triple now that the expansion is complete. It was delayed by a year. Cost overruns added $1.6 billion to the $5.2 billion price tag.
Why the Canal Is Important to the U.S. Economy
The Panama Canal keeps the cost of imported goods down. That reduces inflation. Five ports carry 70 percent of U.S. ship imports. They are the LA/LB ports at Los Angeles/Long Beach, the NY/NJ at New York/New Jersey, Seattle/Tacoma, Savannah, and Oakland. All of these ports and the port of Charleston already can or will be able to receive Post-Panamax ships by 2018. Traffic is expected to double at these ports by 2030.
Expansion of the Panama Canal makes the U.S. transportation system run more efficiently. It relieves congestion at the LA/LB port. Most of that port's traffic comes from Asia.
The canal will create more U.S. jobs. It will give U.S. exporters better access to China and other Asian markets.
Cargo through the canal increased 23 percent in the first nine months of 2017. That's brought millions of dollars to U.S. East Coast ports. Traffic at the ports is up 29 percent. It's become cheaper to ship through the Canal than ship to Los Angeles and move through goods by rail and truck.
How the Canal Lowers Shipping Costs
The fastest way to get cargo from China to the U.S. East Coast is by ship and rail. It takes 18.3 days. That includes 12.3 days for a vessel to go from China to the U.S. West Coast. Cargo on a train takes six days from the West Coast to the East Coast. For this reason, 75 percent of Asian imports take this route.
Before the expansion, only 20 percent of cargo ships from Asia took the Panama Canal route. It took 21.6 days. The remaining 5 percent of China's trade to America goes through the Suez Canal in Egypt. That takes 21 days.
The canal's expansion could take 35 percent of West Coast freight. The Post-Panamax ships carry as much as 16 trains. Expanding the canal makes this longer route more profitable for commodities exporters. They need to cut cost more than they need to reduce time. The expansion will open the Asian market for U.S. natural gas exporters. Before the expansion, the canal was too small for liquefied natural gas ships. High-value, time-sensitive goods, such as electronics, will still use West Coast ports and rail.
Canal History
The French began building the canal in the late 1800s. They gave up when they ran out of money and lost too many workers to tropical diseases.
In 1904, the United States bought the Canal Zone. It wanted to expand its shipping and naval power between the Atlantic and Pacific Oceans. It paid $10 million to Panama and $40 million to France. U.S. engineers decided a canal lock would protect ships from landslides in the Andes Mountains. U.S. doctors found treatments for the tropical diseases of malaria and yellow fever.
The canal construction created jobs for Pittsburgh steel mills, Portland cement factories, and General Electric machinery. Forty-five thousand workers went to Panama to work on the canal itself.. Between 10,000 to 15,000 of them died from accidents and diseases. In 1914, the Panama Canal was completed for $375 million.
The United States owned the canal inside the country of Panama. In 1977, President Carter signed a treaty that promised to turn the canal over in 1999. The agreement allowed the United States to intervene anytime that its use of the canal was threatened. By that time, the canal cost more to run than it returned in profit to American companies. Railroads were much faster and their costs had fallen. The treaty also improved relations with Panama and the rest of Latin America. But many Americans saw it as an American retreat from its global power.
More on Post-Panamax Ships
Post-Panamax ships carry 5,000 to 8,000 containers. Each ship is 14 to 20 containers wide. They need a channel 17 meters deep. Super Post-Panamax vessels haul more than 13,200 containers. These ships carry 27 percent of the world's cargo. To remain competitive, the Panama Canal had to expand to accommodate these ships.

subset: commoncrawl


text:
Price: $89.00
This 12 volt raft pump unit blows a slightly higher volume of air than the Dyna raft pump, at a much higher pressure - 1.5 p.s.i. to 1.8 p.s.i. depending on your raft's valves. This means you won't have to do much topping off at all. There is one other raft pump that does as well pressure-wise, and blows even more air. That would be the LVM, but the LVM has shown to be less than reliable over the many years it's been on the market. It also costs nearly double what the Hurricane raft pump goes for.
Raft Pump Accessories
This pump stands up by itself, and comes with four adapters, including one that seems to work for about 80% of the valves out there. The raft pump hose is a bit too short for many applications. Your local hardware store sells various (spa & Tygon) tubing by the foot in the rope & chain section, so you can retrofit the Hurricane with something longer if you wish. A 5' piece of garden hose also works well. The Hurricane uses battery connectors for under your hood, not a cigarette lighter plug like the little Dyna raft pump.
Comment on Facebook


text:
On Wednesday 26 June some Henderson North School students went to Corban Art Centre to learn about Matariki
Matariki means seven stars and the Matariki Celebrates the maori new year. Other schools watched the performance with us. We learn how to play the maori flute the flute is made out of bamboo. It was interesting to learn about the maori
culture. The maori flute name is koauau.
By Jordan


text:
In some cases I wonder how a development can be the exact opposite of the maker. It is like having an eastern baby as well as the parents are pure whites. It seems impossible but that is just what we have actually come to be. God is caring, merciful, kind, slow to rage, flexible as well as caring. We have dropped up until now from the glory of god that we do not have anything in typical with him you may locate that your neighbour has no food and you still go ahead and eat after that discard the leftover. God enjoys us the very same. Your neighbor and everybody else in the world come from one god. He loves everybody the exact same. If god is love, why is the world filled with so much evil.
I know it is difficult to really feel anything for individuals you are not connected to yet absolutely nothing is impossible with god. He gives to them that ask. Just precede him and also ask him to plant the seed of love in your heart. Actually this would just resemble paradise. I think that if sin is love, we could additionally love like he does. God sentenced us and passed judgment on us to be devilish. He at that point gives out just discipline and afterward he went ahead to give the arrangement. He gave his lone son that whosoever accepted would not die. God could have abandoned it at judgment and foul play. He could have just offered unavoidable passing. For god so adored the world he sent his son.
Whosoever believeth in him isn't really denounced. What an immense explanation this is for us to live by. God did not simply denounce us; he offered all who might have confidence in Christ interminable life. He liberated us from the judgment. He gave the answer for the judgment of judgment and gave us another bearing. He gave us the answer for the wicked life we lead. He gave us an approach to be better and an approach to get interminable life. We talk the discussion, however we don't walk the walk, yet this is all changing, and in the event that you look carefully, you can see the signs all over the place. The new cognizance is starting and you can be a piece of it.


text:
Lua is an embeddable, extensible, extension language and is used in the Barracuda server for writing applications at a higher level than applications designed in C/C++ code. Applications designed in Lua are not limited to web-applications, thus Lua applications can be used as a method of designing your overall (embedded) application.
The Barracuda server and all plugins are designed by Real Time Logic, with the exception of the Lua scripting language. Lua uses the MIT license model and can therefore be used in commercial products.
In the Barracuda Embedded Web Server (BA), Lua code is typically activated by an event generated by C code. The following diagram illustrates the sequence of events:
In the above diagram, C code activates Lua code and the Lua code calls Lua C functions made available to the Lua script. C code that is made available to Lua code is referred to as Lua bindings.
The BA library provides a wealth of functions available to Lua script code. You simply provide the device management functionality for your platform. BA and Lua are designed to be extended and it is therefore easy to add your own device management functions. Making C functions available to Lua -- i.e. creating Lua bindings is described in the Lua book. One can also automate this task by using various tools designed to parse a C/C++ header and automatically create the Lua bindings for the C/C++ code. For example, our Online Lua Binding Generator is a tool that automatically creates Lua bindings from your C header files.
Lua Server Pages, or LSP for short, provides a simple and fast way of creating dynamically created web pages. LSP is similar to CSP, except that LSP does not need to be pre-compiled.
Lua script can be freely intermixed with HTML or XML. LSP tags are XML compliant <?lsp ?>. Code between these tags is executed as Lua code. Expressions are provided by the <?lsp= ?> tag. The result of an expression is emitted as HTML/XML.
The standard LSP tags are recognized by most HTML editing tools and hence these tools can be used for creating dynamic LSP pages.
LSP can be used as an adjunct to CSP. CSP pages can include LSP pages and vice versa.
Like CSP, LSP can be loaded from a compressed directory.
LSP pages are available for any target platforms supported by the Barracuda Web Server.
A standalone executable Lua interpreter and a compiler are also provided. The standalone compiler is useful for testing LSP prior to deployment without the aid of a Web server.
Lua also provides a mechanism to construct the virtual directory tree used by the Web Server. This directory tree consists of C/C++ HttpDir objects. A directory structure specified with Lua is similar in performance to a C/C++ constructed tree; however, it is faster and easier to construct with Lua. With the ba.create family of functions, HttpDir derived objects such as WebDAV, HttpResRdr, etc., can be created in either preload scripts or LSP pages. The LSP directory function mirrors the Barracuda C/C++ APIs. All directory types provide a set of common methods. See the directory object for more information.
Lua has the concept of environments. Environments provide scoping for collections of variables. The standalone Lua interpreter provides one global environment known as _G. The LSP plugin provides the same global environment _G, but LSP also provides an ephemeral environment called the "request/response environment". The ephemeral environment is also known as the "command environment" or CMDE for short. Any global variables created in Lua Server Pages (LSP) and/or directory functions will be saved in this ephemeral command environment. The command environment is also the environment of any included or forwarded pages. Hence variables set in an LSP page will be available to included or forwarded pages.
The diagram to the right, shows the relationship between the command environment, directory functions, LSP pages, the LSP page's private page table, and the LSP page's application table. The command environment is automatically created when the first LSP page or directory function is executed. This environment lives for the lifetime of the request and is automatically terminated when the request completes. Global variables declared in this environment are available to all included and or forwarded pages. The environment is also available to directory functions.
Note: The diagram shows a hypothetical request where an LSP page delegates the request to another LSP page, then to a directory function, and so on. The purpose with this diagram is to show you the relations between objects. One would typically not delegate a request as deep as shown in the diagram to the right.
Directory Function
A directory function is a Lua function installed in one of dir, resrdr, or dav. A directory function implements directory functionality for a dir, but extends and/or changes the behavior of a resrdr, dav, or eh. Directory functions are typically used in advanced web applications.
Lua Server Pages
Lua Server Pages(LSP) is a Lua script page with the extension .lsp. The page is executed by a Resource Reader if the Resource Reader is LSP enabled -- e.g. if function rsrdr:lspfilter() has been called.
An LSP page has the following variables configured by the LSP engine:
Page Table
Each LSP page has its own private "page" table and variables created in the page table are maintained for the execution life of the Resource Reader. Resource Readers can be created dynamically and added to the virtual file system. Resource Readers can also be removed at any time from the virtual file system. Resource Readers that are not referenced are automatically terminated by the Lua garbage collector.
<?lsp -- Using page variables print("
"); page.count = (page.count or 0) + 1 print("Access count = ", page.count) print("
") ?>This code updates the variable count each time the page is displayed. When there multiple users of the page, the number may increment by more than one each time you refresh the page. Even more interesting is if we change the code to the following:
<?lsp -- Using page variables print("
"); page.count = (page.count or 0) + 1 print("Access count = ", page.count) ba.sleep(10); print("Access count = ", page.count) print("
") ?>then the two values of the access count may be different when we have multiple users.
Application Table
A Resource Reader makes it possible to optionally create an application table. The application table is provided when calling rsrdr:lspfilter(apptab). The application table is available to all LSP pages in a Resource Reader, but is kept private to other Resource Readers. The application table can store code and data common to all LSP pages in the application or store and execute code that is not part of the standard web application, such as timer driven Lua code, HTTP clients, Lua socket code, etc. As an example, the lspappmgr and wfs example code implements an "application concept" by allowing auxiliary loaded applications to load and run common code in a ".preload" script. The .preload's environment is then made available to all LSP applications as the "app" table.
Session Object/Table
The LSP plugin also supports a session object/table in addition to the tables described above. The session object maintains variables that are available to the the current session. Session variables are destroyed when the session terminates. As an example,a typical use of Session variables would be to maintain a users shopping basket:
<?lsp -- Using session variables print("
"); local session = request:session() if not session then -- no session ? print"you must first login using a valid username and password" else -- no basket? - create it session.basket = session.basket or {} -- add an item to the basket table session.basket[#session.basket +1] = "something new" end print("We have ", #session.basket, " items in the session table") print("
") ?>
Lua globals
Lua globals (_G) are common to all pages. Variables set in one page/session may be retrieved in another page/session.
Global variables may be referenced without the _G prefix, however, to create a Global variable the _G prefix must be applied.
<?lsp -- Using Lua Globals print("
"); _G.count = (_G.count or 0) + 1 print("Global LSP Access count = ", _G.count) print(_G.stdpageheader) print(_G.copyright) -- global functions _G.myfunction() print("
") ?>
The Lua scripting language is not designed for preemptive context switching, but Lua provides a light weight threading mechanism called coroutines. In the Barracuda Server(BA), Lua event generators are mapped to coroutines, thus each event triggered by BA has its own Lua stack. In BA, multiple events may be active simultaneously even though Lua is nonpreemptive. The BA Lua event generators are typically run by native threads on the C side and each native thread is mapped to a Lua coroutine. When a Lua coroutine is running, the thread may yield to another thread when a BA lua binding is called. For example, an LSP page may be preempted when calling response:write().
The following diagram gives an overview of the event and threading mechanism in BA:
The socket event dispatcher fires events when new data is available on a socket or if a non-blocking socket is ready for writing. The socket event dispatcher delegates client HTTP requests to the server thread pool which activates one of the threads. The thread searches for the resource and if found, executes the resource in a command environment. The resource may, for example, be an LSP page or a Lua directory function.
The socket event dispatcher can also fire events directly to Lua code if the auxiliary socket library is included. The Event Handler events are also run in the context of the dispatcher.
It is important that Lua code running directly in the context of the socket event dispatcher does not block as this will prevent the web-server from serving other requests. In general, Lua code should not block unless run in the context of the Server HTTP Thread Pool or the Lua Thread Library. Events run in the context of the dispatcher or the timer thread can delegate jobs to the Lua Thread Pool.
It is also possible to create user defined events, but this requires extensive knowledge of Lua. More information on creating user defined events can be found in the C/C++ manual, under section Advanced Lua Bindings.
Authentication in the Barracuda server is an optional component that can be installed in any of the directory types. You can have multiple authenticators or you can use one authenticator, as shown in the following example, that makes all pages in the server protected.
local dir=ba.create.dir() dir:insert() -- Enable authentication and -- authorization for the directory. dir:setauth(authenticator,authorizer) -- Note: you must also reference (anchor) -- the dir to prevent it from garbage collecting.
In the above example, an unnamed directory is created and installed as a root directory. We install the directory in the root, thus covering all pages in the server. The last line inserts an authenticator and authorizer in the server. We will soon look into how one can create authenticator and authorizer objects. Authenticators can be installed, replaced, or removed in a running system. For example, the authenticator is removed by calling dir:setauth().
The Lua authentication and authorization logic are wrappers for the authentication and authorization classes implemented in C code. The C classes are based on an object oriented design and many of the classes are designed to be extended by the application designer. The Lua wrappers use the same concept and one can create multiple authenticator and authorizer types. The authenticator and authorizer can be implemented in Lua, but one can also use drop in authenticator and authorizer solutions implemented in C code. We are currently providing one authenticator and authorizer drop in solution that stores user database information as JSON. See ba.create.jsonuser() for more information.
The authenticator object is responsible for the authentication handshaking between the client and the server. The authorizer is an optional component that authorizes the action performed by authenticated users. The following example expands on the previous example and implements an authenticator, but we are not using an authorizer.
local dir=ba.create.dir() dir:insert() -- The username/password callback function. local function getpassword(username) if username == "admin" then return "admin" end end -- Create the username database from our getpassword func. local authuser=ba.create.authuser(getpassword) -- Create authenticator by using the username database. local authenticator=ba.create.authenticator(authuser) -- Enable authentication for the directory. dir:setauth(authenticator)
An authenticator is created by calling ba.create.authenticator. The authenticator requires a user database and we create a basic user database by calling ba.create.authuser. The user database object in turn requires a password lookup function. The job of the password lookup function is to look up the user and return the password if the user is found. The authenticator matches the password with the password provided by the user and accepts the user if the password matches. The above password lookup function returns the password "admin" if the username is "admin" -- i.e. the user is accepted if the username and password is "admin". The above getpassword callback function returns the password in plaintext. You can also return a hash value or use external authentication.
The above is all that is required in order to implement authentication for a directory. The authentication defaults to digest authentication since we have not configured the authenticator. The authenticator is also using an integrated HTTP response message which is displayed if the user clicks the cancel button in the browser's digest pop up window.
An authorizer object is created as follows:
local function authorizer(username, method, path) -- return true or false end local authorizer = ba.create.authorizer(authorizer) dir:setauth(authenticator,authorizer)
The authorizer callback function must decide from the username, the HTTP method type, and the requested relative path if the user has access or not. The function returns true if the user has access and false or nothing if the user does not have access.
The authorizers must decide from username, method, and path if a user has access. You may want to authorize based on other criteria, and you have many options when it comes to authorizing user besides using the authorizer objects. Each LSP page can make its own decision or you can override the directory service function and implement a generic authorizer specifically tailored for your application.
The authenticator example above is using HTTP digest authentication, which is the default if the type is not specified. The authenticator type can be specified by setting field "type" in the optional "option table".
local authenticator=ba.create.authenticator(authuser,{ type="basic" })
The following authenticator types can be specified:
The authenticator uses digest or basic authentication if the client is directly specifying the authentication type by setting the "Authorization" header. Command based and HTTP client libraries integrated with applications typically set the "Authorization" header before sending the request. The authenticator also checks if the client sends a Barracuda specific "PrefAuth" HTTP header which should be set to basic or digest.
The authenticator defaults to digest authentication if the type is not specified and the request is for a non text based URL or if the request originates from a JQuery AJAX call.
The authenticator defaults to form based authentication if the authentication is not specified and if the request is for an .html, .lsp, or .csp file.
The "auth" authenticator requires a custom response message handler, which is typically more complex to design than custom response message handlers for the other authenticator types.
All authenticator types are designed to work with user databases where the passwords are not stored in clear text, but as a hash value. However, the hash encoded passwords must be stored using an encoding called HA1. See storing passwords as a hash value for details.
A login response message handler is responsible for sending login information and login failed information to a client. The function is not called unless the client requires login information, or if the authenticator failed to authenticate the client, or if the client is denied by the authenticator, or an installed login tracker denied the request.
From the above login sequence, the response handler is called when the user requests a protected resource (1). The response handler requests the user credentials (2) by sending login information to the client. Note: The response handler should send response data but must not set the HTTP authorization header since this header is managed by the the authenticator. The response handler is also called if the username and/or password does not match (3).
The following example shows how to create a login response message handler for form based authentication:
-- Custom Response Message Handler local function loginresponse(_ENV, authinfo) if authinfo.username then response:forward".loginfailed.lsp" end response:forward".loginform.lsp" end local authenticator=ba.create.authenticator( authuser,{type="form", response=loginresponse})
The _ENV variable is the command environment where globals such as the request and response objects are found.
The authinfo is a table with information about the login status. The username is set if the user failed to login. The username is not set when the client requests the login page. Notice that we are not using an "else" statement when forwarding the request to the login form. The "else" statement is not needed since response:forward by default does not return to sender, thus the code below ".loginfailed.lsp" will not execute unless username is not set. The pages ".loginform.lsp" and ".loginfailed.lsp" are regular LSP pages that send HTML login information and error information to the client.
The Do It Yorself (DIY) tutorial bundled with the Barracuda Server's combined demo and tutorial includes a number of interactive authentication examples.
Form based authentication requires a custom response message handler. The response handler can emit the complete response page, but it is easier to create a response handler that forwards the request to a dedicated LSP page. The following example shows how to create the ".loginform.lsp" page for the form response message handler we showed previously.
  <form method="post"> Username: <input type="text" name="ba_username">
 Password: <input type="password" name="ba_password">
 <input type="submit" value="Login"> </form>
The above HTML form includes the two required form fields ba_username and ba_password. Pressing the submit button sends the login information in plaintext to the server. It is for this reason that one should use a secure (SSL) connection when using form based authentication. See the " force secure connection" example for more information.
The form authenticator supports cryptographic hashing and implements an authentication scheme similar to digest authentication, which allows user identity to be established securely without having to send a password in plaintext over the network. The form authenticator adds two additional fields to the authinfo table that can be used by the response handler when creating the login form.
The following examples show how to create a form response message handler and an LSP login form that supports cryptographic hashing.
Form response message handler:
We must make a modification to the the form response message handler we showed previously such that the response handler supports our new form login page.
local function loginresponse(_ENV, au) authinfo=au -- Set authinfo in the global command environment if authinfo.username then response:forward".loginfailed.lsp" end response:forward".loginform.lsp" end
The code above is similar to our previous example, except for that we make the variable authinfo available in the command environment. We can use authinfo in the the new ".loginform.lsp" page by making authinfo global in the command environment.
Form login page:
      <form method="post"> Username: <input type="text" name="ba_username">
 Password: <input type="password" name="ba_password" autocomplete="off">
 <input type="hidden" name="ba_seed" value="<?lsp= authinfo.seed ?>"> <input type="hidden" name="ba_seedkey" value="<?lsp= authinfo.seedkey ?>"> <input type="button" id="ba_loginbut" value="Login"> </form>
<form method="post"> Username: <input type="text" name="ba_username">
 Password: <input type="password" id="ba_password2">
 <input type="hidden" name="ba_password"> <input type="hidden" name="ba_seed" value="<?lsp=authinfo.seed?>"> <input type="hidden" name="ba_seedkey" value="<?lsp=authinfo.seedkey?>"> <input type="button" id="ba_loginbut" value="Login"> </form>
The following field must be added to the form when using a user database with encrypted passwords.
<input type="hidden" name="ba_realm" value="Barracuda Server">
Realm is the authenticator's realm value. The default realm value is Barracuda Server.
You must also include spark-md5.min.js, which is used for calculating HA1.
The following shows the complete example:
  <form method="post"> Username: <input type="text" name="ba_username">
 Password: <input type="password" name="ba_password" autocomplete="off">
 <input type="hidden" name="ba_realm" value="Barracuda Server"> <input type="hidden" name="ba_seed" value="<?lsp= authinfo.seed ?>"> <input type="hidden" name="ba_seedkey" value="<?lsp= authinfo.seedkey ?>"> <input type="button" id="ba_loginbut" value="Login"> </form>
Basic and form based authentication is unsafe unless the login information is sent over a secure connection. The following example makes sure the client is using a secure connection:
-- Create a secure URL from URI (path) -- cmd is the request and response object. local function getSecureUrl(cmd) local host = cmd:header"host" -- Use host header if sent by client, otherwise use IP addr if host then host = string.gsub(host,":%d+","") -- Strip port number, if any else host = cmd:sockname() end -- Create the secure URL local url = "https://"..host return cmd:encoderedirecturl(url..cmd:uri(), true) end -- The username/password callback function. -- Notice how we use the optional _ENV command environment. local function getpassword(username, upasswd, _ENV) if not request:issecure() then -- Deny login: send redirect request response:sendredirect(getSecureUrl(request)) -- sendredirect does not return to caller. end if username == "admin" then return "admin" end end -- Create the username database from our getpassword func. local authuser=ba.create.authuser(getpassword) -- The login response message handler local function loginresponse(_ENV, authinfo) if not request:issecure() then -- Remove Authorization header set by basic or digest authenticator response:setheader("Authorization",nil) -- sendredirect does not return response:sendredirect(getSecureUrl(request)) end -- The connection is secure if we get this far. if authinfo.username then response:forward".loginfailed.lsp" end response:forward".loginform.lsp" end local authenticator=ba.create.authenticator(authuser,{response=loginresponse}) dir=ba.create.dir() dir:insert() dir:setauth(authenticator)
The login response message handler checks if the URL is secure, and if it is not, sends a redirect request to the client. Removing the "Authorization" header set by the authenticator is necessary if using Digest or Basic authorization since we do not want the client to send the credentials before using a secure connection.
A client normally starts by requesting a secure resource without providing the user's credentials (1), but a non browser client such as a HTTP client library may directly send the credentials (3). The password is sent in plaintext and an eavesdropper could intercept the password. We cannot prevent this on the server, but we can change the getpassword() function to ignore the login request and force the connection to a secure connection. The response is not normally committed in a getpassword() function, but the authenticators are designed such that they assume the getpassword() function sent a "denied" request if the response is committed. Method response:sendredirect commits the response.
Note: The modified getpassword() function with the secure redirect is not needed if using the shtml authenticator since the secure form authenticator denies all non secure requests and delegates the request directly to the response message handler.
Each LSP page is provided with some predefined variables and objects; namely, request, response, cookie, session and page.
The request object is a global variable in the command environment and is available to directory functions and LSP pages. The request object provides information sent by the client to the server.
  <?lsp -- has the page been modified in the last 2 minutes print("
request methods
"); print("
"); request:checktime(response, os.time() - 120) print("request:checktime(response,os.time() - 120)"); print("request:user() ", request:user()) print("request:cookie'z9ZAqJtI'", request:cookie"z9ZAqJtI") print("request:header'User-Agent'", request:header"User-Agent") print("\nAll request headers") for k,v in next, request:header() do print(k,'=',v) end print("\nrequest:method() ", request:method()) print("request:uri() ", request:uri()) local t =request:data() print("request:data() ", request:data()) for k,v in next, t do print("\t",k,'=',v) end print("\nrequest:session() ", request:session(true)) if request:session() then print("session id", request:session():id(),"\n") end print("request:version() ", request:version()) print("
") ?>
-- only allow GET and POST for this page request:allow{"GET", "POST"} -- Auto abort script if not GET or POST -- valid request; let's continue print"hello world"
-- switch off the default cache headers response:setheader"Cache-control" response:setheader"Pragma" -- check the modified time (anything up to a day old) if not request:checktime(os.time() - (60*60*24)) then return end -- lets provide the updated page print"hello world"
-- get some values custnbr = request:data("custnbr") -- get the value of custnbr name, num = request:data("name", "num") -- get two values -- display posted values for name,value in pairs(request:data()) do print(name,'=',value) end
-- display all posted values for name,value in request:datapairs() do print(name,'=',value) end
<?lsp for data in request:rawrdr() do response:write(data) end ?>
<form method="post" enctype="multipart/form-data"> <input type="text" name="Text input" /> <textarea name="Text area" cols="40" rows="3"></textarea> </form>
<form method="post" enctype="multipart/form-data"> <input type='file' size='40' name='File 1'/> <input type='file' size='40' name='File 2'/> </form>
|name -
|the name as specified in the HTML "input" type.
|fileName -
|the name and possible path of the file entered by the user. The path separator is platform dependent.
|contentType -
|the content mime type such as "text/plain". This parameter is NULL if not specified in the multipart data stream.
|contentTransferEncoding -
|the transfer encoding such as "gzip". This parameter is NULL if not specified in the multipart data stream.
|data -
|the received chunk.
The response object is a global variable in the command environment and is available to directory functions and LSP pages. The response object provides methods that can be used when sending messages to the client. Most of the response methods return nil, error-message, when an error is encountered.
function response:json(table,ret2caller) local data=ba.json.encode(table) response:reset() response:setheader("Content-Type","application/json") response:setheader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0") response:setcontentlength(#data) response:send(data) if(ret2caller) then return true end response:abort() end
This function, by default, sends a 302 (temporary redirect). Set second argument to true if you want to send a 301 permanent redirect message.
This function, by default, does not return to the caller. Set the third argument to true if you want to return control to the caller. The default is for the server to automatically roll back the call chain to prevent writing to the response data after the redirect request is sent to the client.Example:
response:sendredirect"../start.html"; -- Send a permanent redirect request response:sendredirect("http://realtimelogic.com", true);
response:setresponse(function) Installs a generic filter function response:setresponse([false]) Enables deflate compression using RFC1951 response:setresponse(true) Enables deflate compression using RFC1950setresponse() returns an object with two methods:
See the examples for more information on how to use method finalize().
local function serviceFunc(dir,func,path) local ae = request:header("Accept-Encoding") -- If requesting an LSP file and the client accepts deflate compression if path:find("%.lsp$") and ae and ae:find("deflate") then local xrsp = response:setresponse() -- Activate compression local found = func(path) -- Run the resource manager's service function if found then response:setcontenttype("text/html") xrsp:finalize(true) -- Send compressed data to client -- Above sets Content-Encoding and Content-Length before sending data return true -- LSP page (resource) found end xrsp:finalize() -- Not found, but we must clean up return false -- Resource not found end return func(path) -- Service request without using compression end -- Create an LSP application myApp = ba.create.resrdr("MyDir",serviceFunc,0, myIo) myApp:lspfilter() -- Enable LSP
In the above example, a directory function is created and inserted into the resource manager's constructor. The directory function is used as a filter. The filter function analyzes the request and enables compression if the client supports deflate compression. The resource manager's service function (func) is passed in as the second argument to the filter service function (serviceFunc). We must call this function which runs the requested LSP page. We cannot enable compression for non LSP resources so we check to see if the request is for an LSP page or not -- i.e. we check if the requested resource ends with .lsp.
Calling xrsp:finalize(true) after the resource manager's service function has rendered the response assembles all data and sends the data to the client. The default for the finalize method is to return the data and not send the data to the client. The following example shows a modified service function that fetches the compressed data and sends the data to the client using response:write.
local function serviceFunc(dir,func,path) local ae = request:header("Accept-Encoding") -- If requesting an LSP file and the client accepts deflate compression if path:find("%.lsp$") and ae and ae:find("deflate") then local xrsp = response:setresponse() -- Activate compression local found = func(path) -- Run the resource manager's service function if found then local data=xrsp:finalize() -- Fetch compressed data response:setcontenttype("text/html") response:setcontentlength(#data) response:setheader("Content-Encoding", "deflate") response:write(data) -- Write is now the standard socket write return true -- LSP page (resource) found end xrsp:finalize() -- Not found, but we must clean up return false -- Resource not found end return func(path) -- Service request without using compression end
Fetching the data by calling finalize() instead of directly sending the data by calling finalize(true) is useful in an application that implements caching. A service function may be designed such that it knows how to cache dynamically generated LSP data.
As an example, a cache can be implemented by using a table.
local function serviceFunc(dir,func,path) if pageCacheTable[path] then sendCachedPage(pageCacheTable[path]) return true -- found end -- Not in cache . .
The most common use of HTTP filters is to compress response data and the above methods are optimized for this functionality. If you have uses other than for compressing the response, a generic filter function can be installed. The following example installs a filter function by calling response:setresponse(myRespFilter).
local function serviceFunc(dir,func,path) -- If requesting an LSP page if path:find("%.lsp$") then -- Create a table for storing response data and a function to collect local dataTable={} local function myRespFilter(data) table.insert(dataTable, data) end -- Activate response filter local xrsp = response:setresponse(myRespFilter) local found = func(path) -- Run the resource manager's service function xrsp:finalize() -- Cleanup if found then local data local ae = request:header("Accept-Encoding") -- If client accepts deflate compression if ae and ae:find("deflate") then response:setheader("Content-Encoding", "deflate") data = ba.deflate(dataTable) -- Compress and assemble response data else data = table.concat(dataTable) -- Assemble response data end response:setcontenttype("text/html") response:setcontentlength(#data) response:write(data) -- Write compressed or non compressed data return true -- LSP page (resource) found end return false -- Resource not found end return func(path) -- Service request without using compression end
In the above example, the myRespFilter callback function is called when the internal web-server buffer is full. The number of times the myRespFilter callback function is called is a function of (LSP data size / internal web-server buffer size). At a minimum, the function is called once when finalize() is called. Note that the internal web-server buffer can be configured by C/C++ code at startup.
Response data is inserted into a table, which is assembled into compressed data if the client supports compression or uncompressed data if the client does not support compression.
In addition to what is shown in the above examples, the HTTP filter also works on resources either included or delegated -- i.e. response:include and response:forward. The filter works with any resource that is dynamically creating the response data such as CSP resources and CGI resources.
Send data to the client using chunk encoding, the default LSP encoding. Note: the data is added to the response buffer, if not full. The response is automatically committed if the response buffer is full.example:
<?lsp response:write"hello world" -- create a convenience function for writing data local fmt = string.format local function prt(...) response:write(...) end local function prtf(...) prt(fmt(...)) end prt("as ","many ", "strings as you like
") prtf("You can format numbers %d
", 1234) ?>
The deferred response object is a special response object created by some methods -- e.g. upload:response(). The deferred response is typically used by a response that is detached from the original client request. A deferred response should be executed in context of a thread. The deferred response object is a Lua wrapper for the "C" class HttpAsynchResp. A deferred response object has limited buffer management and the methods must be called in the following sequence:
A cookie is used for exchanging a small amount of information between a page and a web browser.
A cookie's value can uniquely identify a client, so cookies are commonly used for session management.
A cookie has a name, a single value, and optional attributes such as a comment, path and domain qualifiers, a maximum age, and a version number.
Typical usage:
cookie = request:cookie"myCookie" if not cookie then -- If no cookie set for this page -- Create a session cookie cookie = response:createcookie"myCookie" -- Active cookie i.e. send cookie to client cookie:activate() end -- This should never fail assert(cookie == request:cookie"myCookie")
The session object provides a way to identify a user across more than one page request or visit to a Web site and makes it possible to store information about that user.
The HttpSession container uses this class to create a session between an HTTP client and an HTTP server. The session persists for a specified time period, across more than one connection or page request from the user. A session usually corresponds to one user who may visit a site many times. The server can maintain a session in many ways such as using cookies or rewriting URLs.
This interface allows you to:
Variables may be assigned and retrieved from the session object. This is done using normal Lua syntax.
Any attempt to create session variables with names the same as the session methods, will result in an error.
Session variables are destroyed when the session terminates or times out. LSP session variables are not accessable from CSP pages and vice versa.
A user can create a tool that could potentially overflow the session container. The Barracuda authentication system makes sure that a session object is not created before the user is authenticated. It is therefore recommended to create a session object by using the authentication system.
  <?lsp print("
session variables
"); print("
"); session = request:session() -- returns nil/false if there is no session if session then print("we have a session ", session) session.counter = (session.counter or 0) + 1 -- count session usage of this page session:maxinactiveinterval(60); print ("id", session:id()); print ("creationtime" ,os.date("%c",session:creationtime())) print ("lastaccessedtime" ,os.date("%c",session:lastaccessedtime())) print ("maxinactiveinterval" ,session:maxinactiveinterval()) print ("usecounter" ,session:usecounter()) -- if we have any attributes print them all if session:attributes() then table.foreach(session:attributes(), print) end end print("
") ?>
local s=request:session(true) function s.onterminate() ba.thread.run(function() trace"Do the work here!" end) end
See also
Binary JSON
A library that supports JSON encoding and decoding.
Create a stream based JSON parser object. The JSON parser object functions similar to ba.json.encode, but unlike function ba.json.encode which is limited to parsing complete JSON messages, the stream based parser parses data from a stream as the data trickles in.
The JSON parser is ideal for building advanced, asynchronous, message passing protocols on any type of communication channel. The communication can, for example, be between a standalone web server and other programs, or between embedded systems that are interconnected. The JSON parser can easily be used together with the socket library, but you can also use the JSON parser in combination with your own specialized communication channels such as message queues, USB connections, serial connections, etc.
Parse a chunk of data using the JSON parser object. The second argument, if true, instructs the parser to return all assembled JSON objects as one array of objects.
Return values:
The following example shows a potential use case for the JSON parser. A specialized LSP page is designed to extract the active socket connection from the current request and morph the HTTP request into an asynchronous receive channel for JSON data. See the socket API for more information on how to use sockets. Note: see also the JSONS module.
<?lsp -- Activated when s:event(asyncReceiveCoroutine) is called below local function asyncReceiveCoroutine(s) local parser=ba.json.parser() -- variable x: multiple types, or nil on error local x,err=true,nil while x do -- While no error -- Block and wait for data x,err=s:read() if x then -- x is JSON socket data local array x, array = parser:parse(x,true) if x then -- If ok if array then -- If at least one object for _,v in ipairs(array) do -- Dispatch the parsed JSON object 'v' end end else -- Parse error err=array -- array is now error code end end end if err == "closed" then print"Socket closed" else print("Socket or JSON parser error:", err) end send=nil -- Return: exit and close connection end response:flush() -- Send HTTP response headers -- Morph HTTP request into a socket connection local s = ba.socket.req2sock(request) -- Enable asynchronous socket receive s:event(asyncReceiveCoroutine) ?>
The above code is designed to receive data. You can easily extend the code to also send asynchronous JSON data to the client side.Example 2, JSON Client:
The following example shows a basic client designed using the Barracuda Embedded Web Server HTTP client library.
local c=http.create.basic() c:request{method="GET",url="URL-TO-SERVER_RESOURCE"} -- Morph HTTP request into a socket connection local s=ba.socket.http2sock(c) local data={txt="hello"} -- The data to send s:write(ba.json.encode(data)) -- Encode and send
JSONS (JSON stream parser) is a small Lua library that simplifies the use of the JSON parser object when using the JSON parser for parsing data that trickles in on a TCP/IP connection or on a WebSocket connection. A complete IoT example using JSON for communication includes the use of the JSONS library on the server side. See the M2M LED JSON demo for more information.
To enable this library a require("JSONS") must be issued.
local js = require("JSONS")JSONS functions:
Returns a JSON Stream parser object. The following example shows how to create a JSON stream parser object:
local js = require("JSONS").create({}, socket, 2048)Parameters:
A library that provides a number of Barracuda utility and IO functions.
key: The key can be any string, but is preferably created with function ba.aeskey()
string: The string to be encrypted and converted to B64 encoding.
This function is typically used as a substitute for creating a session object. The LSP page can instead store the session state as a hidden variable in the dynamically created page returned to the browser. The following example illustrates how to encode and decode state information in a hidden variable.Encoding:
-- Data to be encoded and stored in hidden variable local stateInfo={x=10,y="Top Secret"} local data=ba.aesdecode(app.key, ba.json.encode(stateInfo))Decoding:
-- Data received via hidden variable from client local stateInfo = ba.json.decode( ba.aesdecode(app.key, request:data"MyHiddenVariable"))
len: The key length must be 16 (AES 128 bit) or 32 (AES 256 bit). The default length is set to 16.
print(ba.cmpaddr("127.0.0.1", "127.0.0.1")) -- Prints true print(ba.cmpaddr("::1", "0:0:0:0:0:0:0:1")) -- Prints true print(ba.cmpaddr("184.108.40.206","::ffff:18.104.22.168")) -- Prints true print(ba.cmpaddr("126.96.36.199","::ffff:126.96.36.199")) -- Prints false
data: The data to be compressed, which must be a string or a table of strings. The function works similarly to the Lua function table.concat when this argument is a table. The table is concatenated and compressed.
rfc1950: Optional Boolean argument, which defaults to false. The default action is to deflate data using RFC1951 -- i.e. compress without adding the ZLIB deflate header. The correct deflate method is to use RFC1950, but Internet Explorer does not seem to follow the RFC1950 specification, thus IE fails if a ZLIB header is added. All other browsers also accept RFC1951.
A table of functions for creating Barracuda objects:
{username1=user1, username2=user2} -- etc.Where user1 and user2 are tables with the following fields:
{ pwd='password', roles={'role1','rol2','etc'}, maxUsers=number, recycle=boolean, inactive=number }
The pwd field is either a string storing a password in plaintext or a Lua table encapsulating an HA1 hash.
The fields maxUsers, recycle, and inactive are optional. The roles table is required, but you can set it to an empty table if you do not plan on using authorization. The following basic example sets up a database with two users and no authorizer.
local ju=ba.create.jsonuser() ju:set{username1={pwd='pwd1',roles={}},username2={pwd='pwd2',roles={}}} dir:setauth(ba.create.authenticator(ju))
The following example sets up an authenticator and authorizer that simulates the same authentication and authorization logic as in the security C code example.
-- Setup the users, Defaults: maxusers=3,recycle=false,inactive=false local userGuest={pwd='guest',roles={'guest'},maxusers=100} local userKids={pwd='kids',roles={'guest','family'}} local userDad={pwd='dad',roles={'guest','family','dad'},recycle=true,inactive=60*60} local userMom={pwd='mom',roles={'guest','family','mom'},recycle=true,inactive=60*60} -- Create a JSON user database object and install the user database local authuser=ba.create.jsonuser() authuser:set{guest=userGuest,kids=userKids,dad=userDad,mom=userMom} -- Create a digest authenticator (using default values). local authenticator=ba.create.authenticator(authuser) -- Setup the constraints local constr1={urls={'/*'},methods={'GET'},roles={'guest'}} local constr2={urls={'/*','/family/*'},methods={'POST'},roles={'mom','dad'}} local constr3={urls={'/family/*'},methods={'GET'},roles={'family'}} local constr4={urls={'/family/mom/*','/family/dad/*'},methods={'GET'},roles={'mom','dad'}} local constr5={urls={'/family/dad/*'},methods={'POST'},roles={'dad'}} local constr6={urls={'/family/mom/*'},methods={'POST'},roles={'mom'}} local constr7={urls={'/family/kids/*'},methods={'GET','POST'},roles={'family'}} -- Note, the constraint names are not used by the authorizer. local constraints={Guest=constr1,FamilyPost=constr2,FamilyGet=constr3, Parents=constr4,Dad=constr5,Mom=constr6,Kids=constr7} -- Create the authorizer and install the constraints. local authorizer=authuser:authorizer() authorizer:set(constraints) -- Create a directory and set the authenticator and authorizer local dir=ba.create.dir() dir:setauth(authenticator,authorizer) -- Note: you must also reference (anchor) the dir so it is not garbage collected.
local function testfunc(_ENV,path) response:setdefaultheaders() response:write[[    <title>test</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
HELLO WORLD! ]] print("relative path=",path) print("absolute path=",request:uri()) response:write[[  ]] return true; -- say we are done end testdir = ba.create.dir("test") testdir:setfunc(testfunc) testdir:insert()
Output: HELLO WORLD! relative path= xyz absolute path= /test/xyz
Creates a Web File Server (WFS) directory. A Web File Server is a Lua implemented directory function that combines a WebDAV object and a Web File Manager. The Web File Server makes it possible for the same directory to serve requests from browser clients and WebDAV clients. The Web File Server directory function makes the assumption that browser clients send a "User-Agent" string containing the word "Mozilla" and WebDAV clients do not. Browser requests are delegated to the Web File Manager directory function, and WebDAV requests are delegated to the WebDAV directory function.
The WFS can be used as is or be customized for various purposes. See the Web File Manager Readme File for an introduction to the Web File Server's capabilities.
The BAROOT/bin directory includes a pre-compiled version of the wfs example server, which incorporates a WFS instance.
Note: NetIo instances are designed to interoperate with a Web File Server and will not function unless the server has a WFS instance installed in the virtual file system.
The Web File Server's integrated Web File Manager is a Lua implemented version of the Web File Manager in directory BAROOT/xrc/misc/HttpResMgr.c
The Lua implemented Web File Manager requires a number of resource files. The resource files required are the same files required by the HttpResMgr. See the HttpResMgr example for more information.
require"wfs" fs=ba.create.wfs("fs", ba.openio("root"), ".LOCK") fs:configure{tmo=2*60*60,helpuri="/my/help/",logouturi="/logout/"} fs:insert()
-- Example: harden security policy rsrdr:header{ ["content-security-policy"]= "default-src 'self'; connect-src https://mydomain.com", ["x-xss-protection"]="1; mode=block", ["x-frame-options"]="SAMEORIGIN", ["x-content-type"]="nosniff", ["Strict-Transport-Security"]="max-age=31536000; includeSubDomains", }
function uploadcallback(_ENV, upload)
_ENV - is the environment table passed into the upload object. The upload object creates a new environment table if no table was passed into the upload object.
upload - provides information about the upload by the following methods:
The callback functions:
prog - string containing the executable and optional arguments.
Starts program prog in a separated process. The function waits for the process to terminate and returns the result printed to standard out by the child process. This function is similar in functionality to io.popen, but is specifically designed for the threading design in the Barracuda Embedded Web Server. Calling ba.exec allows other threads to execute while the thread calling ba.exec waits for the child to terminate. Calling io.open blocks all other threads until the child process terminates.
This function returns the result produced by the child process on success, otherwise nil followed by an error code is returned.
This function is available on systems that support the process model such as Linux, QNX, and Windows.
See also ba.forkpty().
The I/O interface is supported on all environments, from High Level Operating Systems (HLOS) to deep embedded RTOS environments. The standard Lua I/O is also supported on all HLOS, but not RTOS environments. The standard Lua I/O can be accessed by prefixing 'io' with _G. Example: local io = _G.io.
The I/O interface provides a common set of functions for working with files stored in various media types such as data stored on a standard file system, ZIP files, and network files. The Lua I/O interface provides an interface to the C side implementation for the IoIntf. The C startup code can initialize and provide any number of I/O interfaces to the Lua code. The I/O interfaces provided by the C startup code is available to the Lua code via ba.openio(ioname). New I/O interfaces can be created by calling ba.mkio(baseio, path).
The DiskIo and the NetIo are delivered as C code and must be compiled, linked, and installed by the C startup code. Exceptions are the Windows and Linux release, which are delivered with the DiskIo precompiled. The Mako Server, the Web File Server, and the lspappmgr C source code examples show how to install the I/O interfaces and make the I/O interfaces available to Lua code. See the C side IoIntf introduction for detailed information.
The ZipIo and the NetIo may be used in embedded systems without a file system. The NetIo is used during development and the ZipIo is used for the deployed application(s). See the LspNetIo example for how to use BAS in an embedded device without a file system.
See also the Lua Io.
for name,io in pairs(ba.io()) do print(name, " : ", io:resourcetype()) end
C/C++ startup code example:
/* Register the DiskIo as "disk" */ balua_iointf(L, "disk", (IoIntf*)&diskIo);
Lua code example:
--Open the "disk" I/O interface created by the C startup code: local diskio = ba.openio("disk") --Open the "net" I/O interface created by the C startup code: local netio = ba.openio("net")
-- Create a new DiskIo instance by using the sub directory "apps" as -- the base directory for the new I/O: local appsio = ba.mkio(ba.openio("disk"), "apps/") -- Create a ZipIo by opening a ZIP file in the "disk" (DiskIo) root -- directory: local zio = ba.mkio(ba.openio("disk"), "myzip.zip") -- Create a new NetIo by using the URL http://192.168.1.100/fs/c/apps/ -- as the base path. Note: Requires that the wfs is running on 192.168.1.100. local netio = ba.mkio(ba.openio("net"), "http://192.168.1.100/fs/c/apps/") -- Open the ZIP file c:\myzip.zip on a computer, where the wfs is -- running on a Windows computer with IP address 192.168.1.100: local netzipio = ba.mkio( ba.openio("net"), "http://192.168.1.100/fs/c/myzip.zip")
This function opens a file, in the mode specified in the string mode. In case of success, it returns a new file handle.
The optional mode string can be any of the following "POSIX file" open modes:
Note: the DiskIo for most embedded RTOS ports support mode "r" and "w" only. The ZipIo supports mode "r" and the NetIo supports mode "r" and "w".
The NetIo is similar to a network file system and makes it possible for the server to access resources on another Barracuda server.
A NetIo is typically created and installed uninitialized by the C/C++ startup code. Method io:netconf() makes it possible to either configure the NetIo installed by the C/C++ startup code or to configure a NetIo clone created with with ba.mkio(). See the NetIo C documentation for more information.
All attributes are optional and you can call the method multiple times to configure the NetIo. For example, setting user and password multiple times does not affect any of the other attributes set previously.
Note: "User, pass" and "proxyuser, proxypass" should be in pairs. The password is set to the empty string "" if missing.
The NetIo must be configured before calling ba.mkio(ba.openio("net"), URL) if a proxy and/or password are required, since ba.mkio verifies the URL before creating a new NetIo. You can either configure the NetIo installed by the C/C++ code or you can make a copy by calling ba.mkio(ba.openio("net")) -- i.e. without providing a URL. Calling ba.mkio() without providing a URL creates a copy of the original I/O.
|Error Type
|Name not accepted by file system
|Not found
|Resource exists
|Directory not found
|Resource locked by file system
|Directory not empty
|Some kind of I/O error
|No space left on device
|No memory for operation
|Buf too small
|Not implemented
|AES not enabled
|ZIP not compressed
|Unknown ZIP file format
|ZLIB not installed
|Unknown AES encryption
|Resource is encrypted, but no password provided
|Wrong password provided
|Wrong password or file compromised
|AES protected file compromised
|Invalid socket con
|Gethostbyname failed
|Bind failed
|Socket write failed
|Socket read failed
|Timeout period expired before receiving data or event
|Malloc failed
|Already inserted
|Too much data
|Page not found
|Is committed
|Invalid param
|Mixing write send
|Too many includes
|Too many forwards
|Include op not valid
|Cannot resolve
|Cannot connect
|Invalid URL
|Invalid response
Parses and returns the Lua Server Page as a Lua chunk. The returned string can for example be loaded by function load().
The default is to parse the LSP page as a standalone page, unless embed is set to true. The LSP page expects the following arguments when compiled as a standalone page: page(_ENV,pathname,io,page,app), where _ENV is the command environment, pathname is typically derived from a directory functions relative path. The arguments io,page, and app are the LSP page's IO object, page table, and application table.
Function parselsp can for example be used as an alternative to response:include(). The following example shows how to use parselsp in one LSP page to include another LSP page.
<?lsp local fp,err=io:open"mypage.lsp" if fp then local data data,err = fp:read"*a" fp:close() if data then -- Convert LSP to Lua data,err = ba.parselsp(data) if data then local func -- Compile Lua code func,err = load(data,"mypage.lsp","t",_ENV) if func then local ok -- Let child use our: _ENV,io,page,app ok,err = pcall(func,_ENV,"mypage.lsp",io,page,app) end end end end ?>
-- Seed SharkSSL by connecting to remote seed generator ba.thread.run(function() -- Run the blocking HTTP request in a separate thread -- Create a HTTP object using the low level HTTP library. local http=require"httpc".create() -- Send request and required parameters -- See http://www.random.org for more information http:request{ method="GET", url="http://www.random.org/integers/", query={ num=1, col=1, min=1, max=1000000000, base=10, format="plain", rnd="new" } } if http:status() == 200 then local rnd=http:read"*a" if rnd then rnd=tonumber(rnd) if rnd then -- We received a number -- Seed SharkSSL ba.rndseed(rnd) end end end -- Seed using millisec clock. -- The HTTP response time creates a random delay. ba.rndseed(ba.clock()) end)
Function ba.session() is an alternative to method request:session(). Method request:session() can only be used within the command environment. Function ba.session() does not have this limitation and can therefore be used from any environment.
Function ba.session() can be used in three modes:
local s = request:session(true) local id = s:id() -- Returns a number suitable for local server use assert(id == ba.session(id):id())
local s = request:session(true) local id = s:id(true) -- Returns a string suitable for public use assert(id == ba.session(id,request):id(true))
The following code fragment is from the Web File Server implementation. The Web File Server code can be found in the Barracuda SDK /WebResources/rtl/.lua/ directory. The code fragment shows the authService directory service function, which is installed if an authenticator is set on the Web File Server and if the session URL is enabled.
local function authService(_ENV,relpath) local s if not request:user() then -- User is not authenticated or no session cookie. local p -- Does the relative path include a session reference? s,p=ba.session(request,relpath,true) if s then -- Yes, relpath included the session s:maxinactiveinterval(sesTmo) -- Set the new relative path relpath=p end end -- Delegate the request to the standard directory service function service(_ENV,relpath,s) end
Install a Lua error handler. The error handler is called if a Lua script should cause an exception. The callback function gets one argument, the error message. Note: All errors are sent to the Barracuda HttpTrace library, thus a Lua error handler is typically not needed during debugging.
An error handler could for example be installed in a deployed system and send the error message by using the SMTP library. Another possibility is to upload the error message to an online database by using the HTTPS client library.
local timer = ba.timer( function() -- Do something end )
-- One-shot timer example: function timeout() -- do something end -- Create a timer. The timer object must be global. t = ba.timer(timeout) -- Set the timeout to one second. t:set(1000)
-- Interval timer that never stops. function timeout() -- do something return true end -- Create a self referencing interval timer ba.timer(timeout):set(1000,true)
local function timeout() for i=1,5 do trace("Interval", i) coroutine.yield(true) end trace("Stop interval") coroutine.yield(false) end -- Create a self referencing interval timer and start the coroutine immediately. ba.timer(timeout):set(1000,true,true)
|successful -
|Boolean set to true if successful login or false on failed login.
|name -
|The (attempted) login name.
|addr -
|The user's IP address.
|The command environment is normally not needed, but can be useful in special cases.
The following example terminates all sessions:
-- Iterate all authenticated users for _,name in ipairs(ba.users()) do -- Iterate all sessions for the user for _,sesid in ipairs(ba.sessions(name)) do local s = ba.session(sesid) -- Fetch session using session ID. print(string.format("Logging out %s:%X IP address: %s",name,sesid,s:peername())) s:terminate() end end
local function myDirectoryService(_ENV,relpath) if authenticator:authenticate(request, relpath) then response:write"You are authenticated" else -- The response was sent by the -- authenticator's Response Message Handler end return true -- True means resource found and response is committed end
{constraintname1=constraint1, constraintname2=constraint2} -- etc.where constraint1 and constraint2 are tables with the following fields:
{urls={'url1','url2','etc'},methods={'GET','etc'},roles={'role1','etc'}}The constraint name is not used by the authorizer, but the authorizer requires a table and not an array; thus dummy names must be created for the constraints -- e.g. constraintname1
The HTTP directory object is returned by a number of functions such as the ba.create.xxx functions.
The Lua directory object is a wrapper for the HttpDir "C" class or any class that inherits from HttpDir such as HttpResRdr.
A directory function is the directory's service callback function which is activated by the server's virtual file system when searching for resources. All directory types have a default service function implemented in C code. The Lua code can install a new directory function that either replaces the original service function or extends the functionality of the original service function. The original "C" service function can be called from within the Lua service function by calling dir:service().
The directory function must be declared as follows:
local function myservice(_ENV,relpath)
The _ENV variable is the command environment. The relpath variable is constructed from the URL and is the relative URL path component for the directory branch.
The directory function must return true if the resource was found and a response was sent to the client. The function must return false if the resource was not found and no response was sent to the client. The virtual file system will continue its search for a suitable resource if the directory function returns false. A no return value is interpreted as returning true.
See ba.create.dir for example code.
All of the standard Lua libraries are implemented with the two exceptions that the io library is only supported when the target platform supports ANSI IO (MAC, Windows, POSIX) and the os library functions are implemented when it is appropriate on the target platform. os.exit() is not implemented on any Barracuda platform.
Platform independence is achieved by using the ba library.
When calling function print() from the command environment, print() is a function that sends response data to the client. Function print() is otherwise the standard Lua print() function. To call the standard print() from a command environment, call print() using the global scope variable -- e.g. _G.print().
Function print() differs from response:write() in that print() calls the Lua tostring() function on each parameter that is passed to print(). Function print() is useful for generating diagnostics and small amounts of text on a web page, use response:write() in preference to print().
Note: the global _G.print(), that prints to the console, may not be available in embedded systems. Use trace() as a replacement.
<?lsp print("hello", "world") ?>The above example would emit "hello\tworld\n".
A standalone executable Lua interpreter is delivered with the Barracuda Server's SDK. The executable, called blua, is found in the SDK's bin directory.
The executable blua is an enhanced version of the standard standalone executable Lua interpreter and includes many API's from the Barracuda server in addition to the original API's.
The standalone interpreter makes it easy to create standalone applications for sending (secure) E-mail, using the HTTP(S) client libraries, and creating (secure) client and server socket applications in Lua.
The extended executable includes:


text:
The Hidden Truth On Inexpensive Flower Delivery Exposed
Lilacs are a beloved, aromatic shrub that produce clusters of light-purple flowers.Word unfold quickly about hayden godfrey, a senior at sky view high faculty, giving every girl a flower Flower Discounts on thursday – the day earlier than school set free for the long valentines day weekend. And the higher the estate tax bracket, the higher the advantage of shopping for flower bonds. Ship flowers to philippines online by creating your own bouquet with flowers appreciated by the person whom you wish to gift. The flowers would not have to be the center of the picture, but can be placed round a photo or poem on the mat.
These include jurong hen park (50% low cost); flower dome and cloud forest (50% low cost, with free entry for seniors age 60 and above) at gardens by the bay; and free admission to the national orchid backyard, science centre singapore and activesg swimming pools and gyms islandwide. Your important different will swoon from our romantic anniversary flowers and items , curated with love by our skilled team. Definitely, if there ever was a flower to be named after the solar, it must be this one for its shiny butter yellow petals and the fact that the heads always appear to at all times gaze towards the solar. I always cherished orchids since i used to be a baby and i realized they are a rare but stunning flower and now i know so much extra after studying this. Perhaps that outdated baby buggy would look good with just a few potted plants nestled inside. We simply used lee's discount florist for our wedding ceremony and can't be extra thrilled with the end result.
It's doable to select a bunch consisting of the identical selection or an arrangement dominated by a sure flower sort. There's almost nowhere that 1-800-flowers would not attain across the u.s. But 1-800-flowers also sells greater than flowers: in addition they ship items like stuffed bears, gift baskets, and sweet with that very same goal in mind: to deliver their recipients some much-deserved or much-wanted cheer. The end result: gained the highest spot for locations to shop for flowers that intently resembled the orders bought online. Increasingly, the supermarkets and massive retailers are buying in bulk instantly from flower producers and storing them temporarily in their very own warehouses, thus bypassing the Inexpensive Flower Delivery wholesalers on whom the small, impartial florists should rely. Movado watches , tag heuer watches are simply a number of the brands that thewatchery has at discount prices.Ensure to visit this web site for distinctive healthy and top quality iris bulbs on the market they may look great in your yard! In 1988, the british flower business was value £79m and has remained roughly the identical ever since. In may and june, these extraordinary flowers congratulate 1000's of new graduates.
A london-primarily based public relations government representing jc flowers would not affirm whether the corporate plans to exit half or all of its stake in btg pactual. Your flowers will dwell for days in your runner when you give them a bit of water to drink. They will add that special brightness to flower packing containers, containers and patio tubs or naked edges by the hedge or driveway. These things create a residing, lasting reminder of the enjoyment shared with the happy couple that bring to mind these memories every time the plants bloom. Annually since then i add a number of plants bought at flower reveals, the grocery retailer, and nurseries. The store provided its first 25 clients a 35 to forty % discount and was handing out soda, coffee, juice and different refreshments, mckee said. In the event you happen to seek out some items by sets and are on sale, it's possible you'll as nicely buy on discount bridesmaid gifts. When deciding on a longtime flower provider so with an established firm who will guarantee their providers. Same day delivery is available in most areas if order is positioned earlier than 2pm in recipient's time zone.


text:
Black Raw Silk with Mirror work blouse
Click Image for Gallery
Raw Silk Blouse with Mirror work and pot neck back with elbow sleeves multi color mirror work.
Free Shipping
Free shipping anywhere with in India. Anywhere in the world in just 2-3 days of transit time once the product is made ready and shipped.
- Views: 4547
- Product Code: Blouse 405
- Availability: In Stock
- Ex Tax: INR 3,500.00
Available Options
Tags: Mirror Blouse, Raw silk Blouse, Black


text:
Betrayal Isn't A Wise Choice In Rick Ross "No U-Turns" Visual
Rick Ross Takes Care Of Business In "No U-Turns Video". See Jesus, See Judas. See Caesar, See Brutus. Rick Ross however is not the one to cross in his new visual for "No U-Turns". Ross is untouchable and warns traitors that if you "switch sides, better stay there". Stream below
"Photographic memories, millionaire tendencies
I still be havin' dreams of niggas killin' me
Switchin' sides, you should be happy just to be alive"


text:
Whilst I'm watching a show, a few things go through my head. Mainly mental notes about the styles, interjected with the occasional 'oooooh' when something shiny catches my eye. But as soon as I start having serious thoughts about how I'm going to snatch a dress from backstage post-show, I KNOW the collection is something special. Such was the case with Malan Breton's striking 'Omega' collection for Autumn/Winter 2018, which I gleefully ogled over from my place in Freemason's Hall.
Pointed armour-like shoulders, slick jet-black PVC, studded capes and rich, brocade-esque oriental patterning; you can't get more sumptuously dramatic. And with themes of Chinese astrology, conquest, war, famine and death, it all tied together in one theatrical display of darkness.
Models marched down the catwalk in striking power suits – one of the big trends for next season, with Breton adding his twist with sharp accented armour-like shoulders. Waists were nipped in with belts and tailoring, and a male and female model walked down arm-in-arm showing off matching, rich-blue patterned suits, almost like robes, in androgynous unity.
There was PVC aplenty, and the shinier the better, especially when teamed with a pair of fishnets. Seductive knee-high boots and long gloves also made an appearance, and with a full-length bright orange PVC dress also hitting the catwalk, one message was clear – more is more.
So how else to close such a lavish show than a dark, caped bride, complete with black, decayed bouquet, and two chest-bearing males to carry her cape? Fabulous. Start stocking up on that PVC!
By Holly Earp


text:
For my NSSS group, a few of us are doing an elfster swap. We are supposed to alter an item and send a few goodies to our partner. I saw this great tutorial at Crop Stop on using metal in the cuttlebug, so I got some and gave it a try. I used my new Tim Holtz embossing folders to emboss the metal, distressed the colored side with a sanding block and used terrifficly tacky tape to adhere the metal sheets to the can. I added a few brads to bling it up a bit and wrapped some SU twine around the top and bottom. I think this would be great for pens/pencils/
markers/scissors....Hope my partner likes it. I had fun making it.


text:
PARIS – Robby Ginepri is easy to spot at the French Open in his oh-so-American getup: black baseball cap turned backward and sleeveless T-shirt.
His game, remarkably, has the feel of someone from somewhere else. He slides across the court comfortably. He plays defense. He waits, patiently, for openings. Even more remarkably, he is into the fourth round at the clay-court Grand Slam tournament, the first man from the United States to reach that stage since Andre Agassi in 2003.
That Ginepri would beat Florent Serra of France, 6-4, 6-4, 6-4, Saturday is not necessarily newsworthy, in and of itself. Ginepri is 25 years old, ranked 88th and was a U.S. Open semifinalist in 2005; Serra is 27, ranked 94th and lost in the first or second round at each of the previous 13 major championships he entered.
Yet consider this: A week ago, Ginepri owned an 0-5 record at Roland Garros and a 6-24 career mark on clay. He was ranked 171st in January after losing in the first round of qualifying at the Australian Open.
"He is back," Serra said.
Had Ginepri lost, one day after Venus and Serena Williams were sent home, this French Open would have been only the second Grand Slam event in the 40-year history of the Open era at which no American men or women reached the fourth round. The only time it happened was at the 1973 Australian Open, where, it must be noted, zero American men or women were in the field.
"Last guy standing. It's a good feeling," said Ginepri, who shares Coach Jose Higueras with Roger Federer. "I would definitely like to have a lot of the other Americans still in the tournament, of course, but really not trying to let that weigh on my shoulders."
There are other countries finding far more success.
Despite Serra's departure, for example, five men from France reached the French Open's fourth round, something that last occurred in 1971. There also are five Russian women still around, and, coincidentally, four find themselves in the same quarter of the draw, led by No.1 Maria Sharapova.
She faces No. 13 Dinara Safina for a place in the quarterfinals; the winner will meet No. 7 Elena Dementieva or No. 11 Vera Zvonareva. All won in straight sets Saturday, as did No. 4 Svetlana Kuznetsova, the 2004 U.S. Open champion and 2006 French Open runner-up, who eliminated yet another Russian, No. 25 Nadia Petrova.
After stumbling through a pair of three-set victories, accumulating 27 double-faults along the way, Sharapova was sharper – for about a set, anyway. Her 7-6 (4), 6-0 victory over No. 32 Karin Knapp of Italy wasn't without hiccups, including nine more double-faults, two of which allowed Knapp to break when Sharapova served for the first set at 5-4.
But Sharapova's serve and other strokes grew sturdier. She hit a high-kicking service winner to get to set point in the tiebreaker, then smacked a cross-court backhand to end it, punctuating the winner with a shriek of "Yeah!" That presaged a strong finish.
"It was like my twin sister was here," Sharapova said, "and then Maria actually made her flight, and made it for the second set."
Federer, the No. 1 man, put himself in the second week at his 16th consecutive Slam by beating Mario Ancic, 6-3, 6-4, 6-2. Ancic was the last player to beat Federer at Wimbledon – back in 2002, before the Swiss star won any of his 12 major titles – but has since lost all five of their encounters.
Federer called himself "the overwhelming favorite" going into his match against one of the French Five, 55th-ranked Julien Benneteau, who celebrated his victory over Robin Soderling by tossing his shirt and sneakers into the stands. Other fourth-round matchups include No. 5 David Ferrer vs. No. 21 Radek Stepanek, and France's Gael Monfils vs. No. 28 Ivan Ljubicic, who erased a two-set deficit to stun No. 4 Nikolay Davydenko, 4-6, 2-6, 6-3, 6-2, 6-4.
If Ginepri is to reach his second Slam quarterfinal, he will have to beat 2007 Australian Open runner-up Fernando Gonzalez for the first time.


text:
Issue No. 14, Article 6/June 24, 2005
Corn Leaf Aphids
Corn leaf aphids are migratory insects that make their way into Illinois cornfields in the spring. Often, these insects go unnoticed until populations reach very high levels. Ria Barrido, Syngenta Crop Protection, reported finding corn leaf aphids in corn whorls in Champaign County on June 20.
These blue-green aphids start colonies in the whorls of corn plants. They remain in corn whorls until tassels emerge. At that time, aphids move down the plant, forming colonies on stalks and leaves and behind corn ears. Most years, populations are kept in check by natural enemies, such as lady beetles, lacewing larvae, syrphid fly maggots, and other insect predators. However, during hot, dry summers or when predators are scarce, populations can increase dramatically.
Corn leaf aphids (University of Illinois).
During the growing season, both adults and nymphs feed in the whorl, causing injury by removing water and nutrients. Damage is most severe between the late-whorl and pollination stages. Corn plants heavily infested with corn leaf aphids may wilt, curl, and show yellow discoloration. Tassels and silks may become covered with honeydew and turn sooty black as mold grows on them. If corn plants have adequate moisture, corn leaf aphids cause little damage. Stress caused by high densities of aphids is more severe during times when moisture is lacking for plants. Injury caused by the corn leaf aphid may exaggerate symptoms of drought stress.
As warm temperatures and lack of moisture continue around the state, please be aware of this insect in your cornfields and the potential for it to affect pollination.--Kelly Cook
Kelly Estes
Click here for a print-friendly version of this article


text:
Sunday, 16 November 2014
James Marsters on THAT scene
WRITER: Steven S. DeKnight
DIRECTOR: Michael Gershman
The Trio steal a pair of magic orbs which will grant their wearer super strength and invulnerability. Warren takes them for a spin in a bar macking on ladies and beating up guys...only to run in to Xander. Xan makes it out in one piece...just...and goes to tell Buffy only to find our girl, suffering from a slaying related injury, lying on the bathroom floor after having had a shocking and deeply disturbing encounter with Spike. Nevertheless Buffy sets out to confront Warren and co. and stops them from robbing an armoured truck. A fight ensues and Buffy manages to win after destroying Warren's magic orbs. But he gets away leaving Andrew and Jonathan behind. The next morning a blissfully happy Willow and Tara watch from their bedroom window as Xander appears in the back yard and reconciles with Buffy. But tragedy soon strikes when a crazed Warren suddenly appears brandishing a gun. Shots are fired, some going wild but with two of the bullets finding there targets: one in the back yard and the other in the bedroom above. And as a result things will never be the same again.
Male ego and misogyny – power, control, domination with rampant testosterone running wild. But also genuine love and friendship with good people who love and care for each other sticking together no matter what.
Warren & Spike
Script: Simply Steve DeKnight wrote a great script. It treads a fine line, a balancing act between daft and goofy and dark and disturbing. But it does so brilliantly. The character work has depth and pushes our heroes to even greater places of darkness and turmoil than before while also managing to bring them back together, to reignite the spark of genuine love and friendship between them. Well, all except for one.
Performances: across the board they are great. But special mention goes to SMG and James Marsters who have to play what is the darkest and most ghastly scene this series ever did. And they are both fabulous. Oh and Alyson Hannigan and Amber Benson are beyond cute together...right up until the end when they will break your heart.
Jet packs: Heh. The sequence where Andrew tries to escape using his hidden jet pack...only to hit the roof and collapse to the ground is hilarious. A terrific sight gag.
Saws: when Buffy searches the Trio's abandoned lair she is attacked by multiple huge circular saws requiring her to engage in some Spider-Man-like acrobatics to avoid being sliced and diced. Its a great sequence and looks very cool.
Clem: Yay! Spike's nice guy demon pal Clem shows up to be a sounding board for a confused and distraught Spike. Gotta love Clem.
Two moments: "Ask me again why I could never love you!" and "Your shirt..." If you aren't hurting inside then your heart is cold.
Warren: Oh he makes such a wonderfully evil villain. So easy to hate. And what he does in this ep arguably makes him the worst and most hated villain in all Buffydom. Kudos to Adam Busch who does a terrific job in the role.
Balls: The blatant testosterone metaphor of Warren and his pair of super powered orbs...and Buffy smashing them to defeat him. YES!!
It doesn't suck. At all. But it is one heck of a cruel episode both for the characters and for the audience. Three awful things happen in the space of forty two minutes. It is almost too much to take. Almost.
Buffy's victory over Warren, throwing his misogynistic insult right back at him before kicking his ass to the kerb. "Good night, bitch." Yeah!!
Andrew: "I don't trust that leprechaun."
Buffy: "Ask me again why I could never love you!"
Willow: "We were able to decipher pretty much everything except these."
Tara: "It isn't written in any ancient language we could identify."
Xander: "It's Klingon. They're love poems. Which has nothing to do with the insidious scheme you're about to describe."
Spike: You know, everything always used to be so clear. Slayer, vampire. Vampire kills Slayer, sucks her dry, picks his teeth with her bones. It's always been that way. I've tasted the life of two Slayers. But with Buffy... It isn't supposed to be this way! It's the chip! Steel and wires and silicon. It won't let me be a monster... and I can't be a man. I'm nothing."
Warren: "I was wondering when Super Bitch would show up."
Buffy: "You've really got a problem with strong women, don't you?"
Andrew: "I really want to get my hands on his orbs."
Warren: "Say good night, bitch."
Buffy (crushes his magic orbs and knocks him down): "Good night, bitch."
Tara: "Your shirt..."
The scenes at the amusement park were specially filmed at Six Flags Magic Mountain, 35 miles north of Los Angeles.
The following tracks were featured in Seeing Red: The Leaves by Daryll-Ann, Stranded by Alien Ant Farm and Displaced by Azure Ray.
James Marsters says to this day that the Spike assault/attempted rape of Buffy scene is the worst thing he has ever had to do in his career. He found it deeply traumatising and it left him an emotional wreck.
For the one and only time since she joined the show Amber Benson gets her name in the opening credits sequence. Kind of a sick joke considering her fate.
When Buffy explores The Trio's lair, she discovers several action figures – grimacing in particular at the one of Vampirella, a comic book superhero from the planet Drakulonn who devoted her life to destroying all vampires - and wearing very skimpy red outfits.
A painful 4.5 (out of 5)
Posted by Nick aka Puppet Angel at 12:29
Labels: amber benson, Buffy, buffy the vampire slayer, james marsters, review, sarah michelle gellar, season 6, seeing red, spike, Tara, tv show, willow
2 comments:
Bodrum EscortReplyDelete
Ortaca Escort
Muğlanın en güzel ve en sıcak escortları sizleri beklemekte hemde onlıne
Subscribe to: Post Comments (Atom)


text:
What are Chicago Real Estate Prices Going to Do?
The one question homeowners always want to ask real estate professionals is "what are home prices in Chicago going to do?" For many people, their home is by far their biggest asset. So their curiosity is understandable. For this "Ask An Expert" piece, we asked Best Chicago Properties' Associate Broker Doug Boehm and Streeterville resident to help answer this question and here's what he had to say:
There Are Two Problems In Answering The Question "What Are Chicago Home Prices Going To Do?"
The first with addressing that question is that every piece of real estate is unique. Condos in Streeterville may be going up in price while homes in North Center are going down. Even within the same neighborhood sales of high-end homes could be strong while starter homes languish on the market.
The second problem answering that question is that no one really knows. Like the stock market or the economy nobody, even highly paid professionals, has a winning track record predicting home prices.
Some Factors That Affect Home Prices That You Can Keep An Eye On
That being said, there are many factors that affect home prices that you can keep an eye on to make an informed prediction.
Currently the job market is a big factor.
While unemployment is improving slowly, the lack of jobs is one of the main reasons prices have been slow to recover. Not having a job makes it virtually impossible to buy a home. Unfortunately while the numbers have improved much of it can be accounted for by people taking part time or low paying jobs. The accountant working at Starbucks because that is all she can find may be no longer unemployed but she probably will not be a home buyer anytime soon. It will probably take a significant improvement in the jobs market, 300,000+ jobs added per month, before the housing market gains steam.
Another important factor is the supply of homes.
In the worst of the housing crises many markets had eight months or more of inventory. That is at the current sales pace it would take 8 months to sell all of the homes that are for sale. That number has been steadily dropping and is closer to 5 months for most of the country. Less inventory means fewer sellers and fewer options and bargaining power for the buyers.
Mortgage rates also play a role.
Rising rates cause monthly mortgage payments to increase. Someone with a set budget for their monthly mortgage will need to buy a less expensive home to maintain that budget as rates increase. Rates have been in a general uptrend and will probably continue to move up if the labor market improves. This should temper any price improvements created by increasing demand if more people are getting high paying jobs.
The ability to obtain a mortgage has also been a big factor in hurting home prices.
Many seemingly qualified buyers have not been able to get a mortgage. For most home buyers an inability to get a mortgage means that they are not being able to buy a home. If the mortgage market continues to loosen up it will increase home demand.
Conclusion About Chicago Real Estate Pricing Going Forward…
So in conclusion, while keeping an eye on prices is a good idea for any home owner or anyone considering buying a home in the future the best option when you become serious about buying or selling is to talk with a local real estate professional. A good local Chicago real estate professional will analyze comparable property values to find a good estimate of the fair market value of your home. Local real estate brokers are in tune with the market and utilizing their expertise can be invaluable. The amount of traffic a new Chicago listing creates can be a good indication of the current market for that neighborhood.
The chart above shows the average home prices for Chicago in 2013. Chicago home prices increased about 15 percent last year according to the Chicago Association of Realtors.
Want to know more? Feel free to touch base with Doug Boehm to get a better idea of what pricing may do in your Chicago neighborhood going forward.


text:
Some people are so talented they make me sick. Hideyuki Nagai is one of them. I've never seen better trompe l'ouil. Go to his site. He deserves Continue Reading
Tag: Illusion
Here we have a nice soothing lullaby like video to ease you into your Sunday. That is, unless you dislike having your senses ravaged and your reason Continue Reading
I've been helping some friends move. Ikea furniture reminded me of this gem. If anyone can find the original source, I'd be greatful.
The following has been floating around for a while. Have a read. Note, tough, that this is not a real study. Arocdnicg to rsceearch at Cmabrigde Uinervtisy, Continue Reading
This year's Illusion of the Year Contest winners have been announced. I'm going to present a few of my favorites over the next couple of weeks. First Continue Reading
The illusion this week is extra amazing because you can make one yourself. You can get it from Grand Illusions by following this link
Hello world. My name is Ryan and I'll be one of the regular contributors to this mad endeavour. A brief introduction: I'm Canadian, I'm a grad student, Continue Reading