Azure… There is plenty to keep up with, just dealing with the features that have been released. With that in mind, have you enabled the preview features? Take a minute and go to your subscription account portal and have a look… https://account.windowsazure.com/PreviewFeatures
Azure Batch
Have an application or parts of an application that does processor intensive work? Hand it off to Azure Batch. Basically it pushes your code to a designated amount of VMs and processes the task in parallel.
More Info >>
Auditing for Azure SQL Database
Exactly what it sounds like… It logs events to an Azure Storage account. What are some of these events you might ask?  For a complete reference see the Audit Log Format Reference DOCX.
More Info >>
Operational Insights
Need to monitor a lot of machines? This is what Operational Insights is good at… Install an agent. It talks to Azure Operational Insights web service running in … well Azure. There is a portal where you can create all kinds of great looking dashboards and reports.
 You can with PlayReady. This is a token issuing service that allows a player to decrypt your video content. You should check this out if you’re doing anything with video… all the cool kids are using it, and it’s in my wheel house. Shoot me an email if you’d like to discuss more.
More Info >>
Azure Premium Storage
| Premium Storage Disk Type |
P10 |
P20 |
P30 |
| Disk size |
128 GB |
512 GB |
1024 GB (1 TB) |
| IOPS per disk |
500 |
2300 |
5000 |
| Throughput per disk |
100 MB |
150 MB |
200 MB |
5000 IOPS per disk!..
More Info >>
Stream Analytics
Real time data analytics allows you to analyze patterns in data streams or historical data before storing the events. Think… the backend to your IoT strategy. Not a lot of companies are thinking about their IoT strategy yet… but at Microsoft we are. This is why Gartner and other think-tanks are putting so much weight on data sciences in the coming future. You have been warned.
More Info >>
Windows Azure Files
For this you’ll run some PowerShell to create a file share in an Azure Storage account. VMs can then mount these as a network shares or you can access the share using the REST API, much like blob storage. Pretty sweet feature… one I’m using right now!
More Info >>
Billing Alert Service
If you’re the account administrator for your subscription, you can set an alert when you spend “X” amount of dollars. Not quite a billing API, but I configured a few alerts to let me know when I’ve spent different amounts of money.
More Info >>
Continue reading


--- layout: post title: "Integration Testing composed functions" description: "When you build a system from small functions that you subsequently compose, how do you know that the composition works? Integration testing is one option." date: 2015-12-21 09:05 UTC tags: [Unit Testing, F#, ASP.NET Web API] --- {% include JB/setup %}
{{ page.description }}
Despite its reputation as a niche language for scientific or finance computing, F# is a wonderful language for 'mainstream' software development. You can compose applications from small, inherently testable functions.
Once you have your functions as building blocks, you compose them. This is best done in an application's Composition Root - no different from Dependency Injection in Object-Oriented Programming.
In my (free) Build Stuff talk on Functional TDD with F# (expanded version available on Pluralsight), I demonstrate how to compose such a function:
let imp = Validate.reservation >> bind (Capacity.check 10 (SqlGateway.getReservedSeats connectionString)) >> map (SqlGateway.saveReservation connectionString)
How can you be sure that this composition is correct?
The answer to that question isn't different from its Object-Oriented counterpart. When you implement small building blocks, you can test them. Call these small building blocks units, and it should be clear that such tests are unit tests. It doesn't matter if units are (small) classes or functions.
Unit testing ought to give you confidence that each unit behaves correctly, but unit tests don't tell you how they integrate. Are there issue that only surface when units interact? Are units correctly composed?
In my experience, you can develop entire systems based exclusively on unit tests, and the final application can be stable and sturdy without the need for further testing. This depends on circumstances, though. In other cases, you need further testing to gain confidence that the application is correctly composed from its building blocks.
You can use a small set of integration tests for that.
In my Outside-In Test-Driven Development Pluralsight course, I demonstrate how to apply the GOOS approach to an HTTP API built with ASP.NET Web API. One of the techniques I describe is how to integration test the API against its HTTP boundary.
In that course, you learn how to test an API implemented in C#, but since the tests are made against the HTTP boundary, the implementation language doesn't matter. Even so, you can also write the tests themselves in F#. Here's an example that exercises the Controller that uses the above imp
function:
[<Fact; UseDatabase>] let ``Post returns success`` () = use client = createClient() let json = ReservationJson.Root("2014-10-21", "Mark Seemann"<EMAIL_ADDRESS>4) let response = client.PostAsJsonAsync("reservations", json).Result test <@ response.IsSuccessStatusCode @>
This test creates a new HttpClient object called client
. It then creates a JSON document with some reservation data, and POSTs it to the reservations resource. Finally, it verifies that the response indicated a success.
The ReservationJson type was created from a sample JSON document using the JSON Type Provider. The createClient function is a bit more involved, but follows the same recipe I describe in my course:
let createClient () = let baseAddress = Uri "http://localhost:8765" let config = new HttpSelfHostConfiguration(baseAddress) configure connStr config config.IncludeErrorDetailPolicy <- IncludeErrorDetailPolicy.Always let server = new HttpSelfHostServer(config) let client = new HttpClient(server) client.BaseAddress <- baseAddress client
The (impure) configure
function is a function defined by the application implementation. Among many other things, it creates the above imp
composition. When the test passes, you can trust that imp
is correctly composed.
You may already have noticed that the ``Post returns success`` test is course-grained and vague. It doesn't attempt to make strong assertions about the posterior state of the system; if the response indicates success, the test passes.
The reason for this is that all important behaviour is already covered by unit tests.
Specifically, it has been my experience that the most common integration issues are related to various configuration errors:
In other words: you should have a legion of unit tests covering specific behaviour, and a few integration tests covering common integration issues. You may already have recognised this principle as the Test Pyramid.
In this article, you saw an example of an integration test against an HTTP API, written in F#. The principle is universal, though. You can compose applications from units. These units can be functions written in F#, or Haskell, or Scala, or they can be classes written in C#, Java, Python, and so on. Composition can be done on functions, or on objects using Dependency Injection.
In all of these cases, you can cover the units with unit tests. Issues with composition can be screened by a few smoke tests at the integration level.


About Me
Let me tell you a few things...
BIO
Hello! I'm Shahin Hasan, a software engineer based in Bangladesh who
enjoys programming. I develop websites, web application and windows
application that provide intuitive, pixel-perfect user interfaces
with efficient and modern backends.
Shortly after graduating from SEGi University, Malaysia, Seeking an opportunity to utilize skills in developing software for an established company with a strong customer base.
At leisure time I like to talk about movies, new technologies.
My Skills
Languages I'm pretty good at
C#, Java, PHP, SQL
Languages I'm familiar with
JavaScript, Python, Ruby
Frameworks I know
.Net, VueJS, Django, NodeJS, Bootstrap, Angular
My Work History
IT System Executive @ SEGi International Bhd, Malaysia
Jun 2018 - Dec 2018
Designed and developed several computer software, web applications and modified existing software to correct errors, adapt to new hardware and improve performance. Maintained existing applications and delivered new applications. Developed and implemented a scanning component using SQL Server and reports in SQL Server Reporting Services.


On January 1st, 2005, California Assembly Bill 2628 was signed into law. It allows some hybrid cars to drive in the carpool lane, even if the vehicle has a single occupant. However, carpool lanes are funded by federal grants, and the federal government threatened to take away their funding if California allowed this law to take effect. The implementation of the law was postponed indefinitely.
The opposition to California's law was spearheaded by domestic auto manufacturers, who consider AB2628 a "buy japanese" bill. This is because domestically manufactured hybrid vehicles get far less miles-per-gallon than the Japanese hybrids, and don't satisfy the requirements of the bill.
In a positive development, the federal transportation bill which was just signed into law by El Presidento Nepotsis (nsfw), allows hybrids in federally-funded carpool lanes. The California ARB (Air Resources Board) have already updated their website, adding a number of hybrid models to the list of single-occupant vehicles that qualify as able to drive in the carpool lane.
What's the effect on hybrid-driving commuters like myself? Well, here in southern California it means that the commute might be 5-10 minutes shorter. Yay. Now it should only take 55 minutes to drive 32 miles, instead of the usual hour.
The importance of this law taking effect is not about the commute however.


"Halloween" has its firm place in the horror genre, a classic shocker that moved with the slow, creepy pace of menacing, inevitable evil. "Halloween II" is nowhere in the same league as the original, but it also has an unstoppable, menacing sense of movement - the killer moves slow and the victims are doubly scared by the menace.
"Halloween II" differs from most sequels in that it is a direct continuation of the original. The original "Halloween" ended on the night of October 31st and this sequel continues on that very same night. The wounded Laurie (Jamie Lee Curtis) is taken to a hospital while Dr. Sam Loomis (Donald Pleasance) is obsessed with tracking down this inhuman killer, known in the credits as The Shape aka Michael Myers. "I shot him six times, and he got up and walked away," admits the good doctor.
The Halloween of this town has all the hallmarks of a bloody evening waiting to happen. There are kids dressing up in Michael Myers masks, lustful doctors, kids biting into razor-sharp apples, irate dogs, and a largely nonexistent hospital staff caring for the weak Laurie who mostly sleeps and has nightmares. Laurie is taunted by Michael Myers (who may be her brother!) and teased by a lovestruck ambulance driver (Lance Guest). During this very long night, each member of the short hospital staff is murdered by Michael Myers in particularly gruesome ways, while the nearly blind Laurie manages to escape from one room to the other with a limp. And where is Loomis in all this? He is facing a court-martial back at the institution. Towards the end of the film, he finally pulls a gun on a state trooper when he realizes Michael is related to Laurie.
"Halloween II" continues the same sense of dread and menace that the original had, but the gore is accentuated making the goings-on less suspenseful than they should have been. I could have lived without seeing a syringe inserted in a woman's eyeball, or a half-naked woman scalded to death. These are not necessities. These are merely distractions considering we don't learn much about said victims. Another problem is the screenplay, which gives motivation to the snail-paced killer Michael Myers by telling us that Laurie's sibling status is the sole reason why he came back to Haddonfield! Sometimes not knowing a murderer's motives is more frightening than knowing.
If nothing else, "Halloween II" is a guilty pleasure because the ending works so well, and Curtis is believably sympathetic as Laurie (despite an obvious wig). She continues to be endlessly pursued by Michael - she hides but he finds her. Eventually, Loomis and Laurie battle Michael to a fiery finale. The film ends with Laurie escorted in an ambulance in the overcast morning day while "Mr. Sandman" plays on the soundtrack - a reminder that the nightmare is over. It is the opening scenes and the closing climax that come close to Carpenter's original, evoking a real sense of terror. "Halloween II" is worthwile if you can live through the distractions.
For more reviews, check out JERRY AT THE MOVIES at http://buffs.moviething.com/buffs/faust/
E-mail me with questions, concerns or comments at<EMAIL_ADDRESS>or at<EMAIL_ADDRESS>The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


In the 2010s, consumer electronics stores often sell GPS, automotive electronics (car stereos), vide...
P47 - Wireless Bluetooth Headphone - white
EDIFIER W830BT Bluetooth Over-ear Headphones
Macbook Pro 13 1.4GHz Quad-Core
Macbook pro-15 2.3GHz
Samsung Galaxy M31 - Android 10
POCO M2 - 6GB RAM/ 64GBROM
Walton Smart Phone Primo NH4
Canon EOS Rebel T6s DSLR Camera + 18-135mm Lens
Black - Waterproof Action Camera
Dahua IPC-HFW1320MP-AS-I1 Bullet IP Camera
Dahua IPC-HFW2231SP-S 2MP IR-30M IR Bullet
Dahua IPC-HDW1230T1P 2MP IR-30M IR Eyeball


Greetings!
As September looms over the aging, derelict month of August, the reality of the SteemSTEM/Utopian meetup is becoming, well, more real than it was before.
We thought it would, therefore, be a cool idea to relate more tangibly with the awesome people who are actually going! So I asked around and found three members (more to come!) to introduce themselves in today’s post - however, they feel like it - and if anybody has any questions about them, drop ‘em in the comments and see what you may discover there!
### First and foremost, our resident Debunker has a tale to tell:
# @egotheist
Forged in the fires of Mount Doom, there he was born. One to rule them all…oh. Wait. Wrong story.
As the tale goes, there once was a boy, foolish enough to venture forth into the mysterious depths of pseudo-science and dangerous beliefs. Misguided by his own kin, many years he was lost without proper orientation. Bought every lie he was told.
Eventually, he met a mentor who revealed the most painful of all truths to him: everything he believed so far was no more than a fairy tale. But instead of mourning about his lost purpose he gathered new strength, some would even call it a grim determination: with his mentor’s help, he melted his mind, crushed every last fake belief he once held - and forged everything anew.
Sharp like a razor, but at the same time durable like the Hulk’s green skin, the once foolish boy had now grown into a dangerous weapon, focusing only to destroy any kind of ill-belief without mercy.
Although the boy was still struggling to determine his true and final purpose in life, he found at least some fulfillment in this new fight. Whatever the future might bring, he was willing to face every obstacle and challenge which may occur - gathering both knowledge and strength along the way. As long as he lived, he would always fight.
### Next up, a poetically haunting prose about:
# @scienceangel
Born and grew up at the wrong place, at the wrong time. Dedicated the first part of her life to correct the error the statistical randomness of the universe made. The rest of her life will be therefore filled with pure hedonism and indulgence. Allies are welcome. No time to waste.
Ambitious and aspiring towards many areas of life, including science. PhD degree was only collateral. Served the purpose of a one-way ticket though.
Enjoys spending time outdoors, cannot live without regular physical activity and deep conversations with very few people she cares for in her life. Has a profound passion for traveling and discovering wonders of nature and architecture, which should always be complemented by indulgence in high quality, carefully prepared food. Because life is one and life is now, nothing comes after, just eternal darkness.
Her message to the world can be summed up in a quote of one extraordinary scientist:
By all means let’s be open-minded, but not so open-minded that our brains drop out.
Richard Dawkins
Throughout history, we were able to witness devastating consequences of extreme close-mindedness for mankind, over and over again. Caution should be taken before we lose ourselves in the other extreme end of the spectrum, if it’s not too late already.
### Finally, all about the all-out altruist and voluntary taxpayer:
# @alexdory
Born in a family of STEM enthusiasts, raised with the concept of altruism and civism.
Taught entrepreneurship since the early years, became a passionate computer enthusiast, made first money at 14 in Webdesign. Gave it all to his younger cousin to buy a computer so she can become a designer, which she later did. Likes to know how everything works, from the potato peeler to jet engines to genetics and to government policies and people.
With a degree in programming and a passion for aerospace, he started working in a startup, whose mission is to provide affordable aviation services to the developing countries. Started working with 3D engines and shaders and stepped into AutoCAD and 3ds max. Worked as a one-man-team for a few years.
Certified as an Air Traffic Controller Trainer by the company, met and made friends around the world, understanding that we are all the same, human beings with needs, emotions, goals and existential problems.
Started out to solve some of them, starting with education which is the key for a successful individual development and social/civic awakening.
Came to Steem to distribute the abundance we take for granted in some of our countries, while others only dream of the idea of it
# So there you have it!
The forces of evil have colluded to align the gravitational waves from a supernova somewhere to your left in a way that allows these three deviants to attend the SteemSTEM/Utopian meetup ONE MONTH FROM NOW.

This page is synchronized from the post: Introducing Members of the Meetup!


Alan Duvall is finally live on the web
22 Jan 2014 | By Alan DuvallIt has been a long time coming and I am happy to say I finally have a blog up on the interwebs. Now if only I could get on “the google”
Speaking of “the google”, I am challenging myself to a 90 day challenge where by I plan to conquer the first page of google with only information relating to the true “Alan Duvall” Now the interesting aspect of this challenge is that it truly ranges from 0 to 100 in terms of difficulty depending on your name. And unfortunately for me I also have to compete with a legitimate accounting business. I put my odds of succeeding at 85%. As you continue to follow me in my journey through this challenge as well as future challenges please Click To Tweet


I would like you to answer the following questions in a short answer format using Markdown.
For questions that ask for a list, use the appropriate Markdown syntax to create either ordered or unordered lists.
Use bold and italic text for emphasis in your responses.
Pandoc is the most useful
Becasue it makes converting files easy. You can go from one type of file to another with in minutes.
I don't think its diffcult to learn. It might be diffuclt to use, but we haven't spend a lot time learning github. GitHub will be wasy to use if we spend more time on it.
I would like to learn more about github.
When you are finished with the questions in file:


This is the 'hello world' example of Virtual Reality, provided by the A-Frame developers
This example showcases the rendering of 3D models
Graphical User Interfaces (GUIs) are available in Virtual Reality. This example showcases the use of the Gaze cursor that allows the user to select items.
In this example, the user must first gaze at a product and afterwards at a specific button, once the product was selected.
A-Frame opens endless posibilities of enhanging user experience. This example shows how one can project a movie onto a texture such that it can be rendered inplace of a black TV screen.
Our original content (code) is available under the MIT license.
All other content belongs to their respective authors
Andrei George FLOREA, Cătălin BUIU
Department of Automatic Control and Systems Engineering, Politehnica University of Bucharest, Splaiul Independenţei nr. 313, sector 6, RO-060042, Bucharest, Romania
Powered by W3.CSS


It appears you need to upgrade your Adobe Flash Player™.
You can install the player by following
this link
.
Once the player is installed, simply reload the site. Thank you.


I have been working on a "bit-storage" facility for datamuseum.dk, and as part of my "eat your own dog-food" policy, I converting my own personal archive (41 DVD's worth) as a test.
Along the way I passed through 2006 and found some files from the birth of Varnish 10 years ago.
This file are notes taken during a meeting in Oslo on 2nd feb 2006, which in essence consisted of Anders Berg cursing Squid for a couple of hours.
(Originally the meeting was scheduled for jan 24th but a SAS pilot strike put an end to that.)
To be honest I knew very little about web-traffic, my own homepage was written in HTML in vi(1), so I had a bit of catching up to do on that front, but the overall job was pretty simple: A program to move bytes ... fast.
It is quite interesting to see how many things we got right and where we kept thinking in the old frame of reference (ie: Squid):
Notes on Varnish
----------------
Collected 2006-02-02 to 2006-02-..
Poul-Henning Kamp
Philosophy
----------
It is not enough to deliver a technically superior piece of software,
if it is not possible for people to deploy it usefully in a sensible
way and timely fashion.
Deployment scenarios
--------------------
There are two fundamental usage scenarios for Varnish: when the
first machine is brought up to offload a struggling backend and
when a subsequent machine is brought online to help handle the load.
The first (layer of) Varnish
----------------------------
Somebodys webserver is struggling and they decide to try Varnish.
Often this will be a skunkworks operation with some random PC
purloined from wherever it wasn't being used and the Varnish "HOWTO"
in one hand.
If they do it in an orderly fashion before things reach panic proportions,
a sensible model is to setup the Varnish box, test it out from your
own browser, see that it answers correctly. Test it some more and
then add the IP# to the DNS records so that it takes 50% of the load
off the backend.
If it happens as firefighting at 3AM the backend will be moved to another
IP, the Varnish box given the main IP and things had better work real
well, really fast.
In both cases, it would be ideal if all that is necessary to tell
Varnish are two pieces of information:
Storage location
Alternatively we can offer an "auto" setting that makes
Varnish discover what is available and use what it find.
DNS or IP# of backend.
IP# is useful when the DNS settings are not quite certain
or when split DNS horizon setups are used.
Ideally this can be done on the commandline so that there is no
configuration file to edit to get going, just
varnish -d /home/varnish -s backend.example.dom
and you're off running.
A text, curses or HTML based based facility to give some instant
feedback and stats is necessary.
If circumstances are not conductive to strucured approach, it should
be possible to repeat this process and set up N independent Varnish
boxes and get some sort of relief without having to read any further
documentation.
The subsequent (layers of) Varnish
----------------------------------
This is what happens once everybody has caught their breath,
and where we start to talk about Varnish clusters.
We can assume that at this point, the already installed Varnish
machines have been configured more precisely and that people
have studied Varnish configuration to some level of detail.
When Varnish machines are put in a cluster, the administrator should
be able to consider the cluster as a unit and not have to think and
interact with the individual nodes.
Some sort of central management node or facility must exist and
it would be preferable if this was not a physical but a logical
entity so that it can follow the admin to the beach. Ideally it
would give basic functionality in any browser, even mobile phones.
The focus here is scaleability, we want to avoid per-machine
configuration if at all possible. Ideally, preconfigured hardware
can be plugged into power and net, find an address with DHCP, contact
preconfigured management node, get a configuration and start working.
But we also need to think about how we avoid a site of Varnish
machines from acting like a stampeeding horde when the power or
connectivity is brought back after a disruption. Some sort of
slow starting ("warm-up" ?) must be implemented to prevent them
from hitting all the backend with the full force.
An important aspect of cluster operations is giving a statistically
meaninful judgement of the cluster size, in particular answering
the question "would adding another machine help ?" precisely.
We should have a facility that allows the administrator to type
in a REGEXP/URL and have all the nodes answer with a checksum, age
and expiry timer for any documents they have which match. The
results should be grouped by URL and checksum.
Technical concepts
------------------
We want the central Varnish process to be that, just one process, and
we want to keep it small and efficient at all cost.
Code that will not be used for the central functionality should not
be part of the central process. For instance code to parse, validate
and interpret the (possibly) complex configuration file should be a
separate program.
Depending on the situation, the Varnish process can either invoke
this program via a pipe or receive the ready to use data structures
via a network connection.
Exported data from the Varnish process should be made as cheap as
possible, likely shared memory. That will allow us to deploy separate
processes for log-grabbing, statistics monitoring and similar
"off-duty" tasks and let the central process get on with the
important job.
Backend interaction
-------------------
We need a way to tune the backend interaction further than what the
HTTP protocol offers out of the box.
We can assume that all documents we get from the backend has an
expiry timer, if not we will set a default timer (configurable of
course).
But we need further policy than that. Amongst the questions we have
to ask are:
How long time after the expiry can we serve a cached copy
of this document while we have reason to belive the backend
can supply us with an update ?
How long time after the expiry can we serve a cached copy
of this document if the backend does not reply or is
unreachable.
If we cannot serve this document out of cache and the backend
cannot inform us, what do we serve instead (404 ? A default
document of some sort ?)
Should we just not serve this page at all if we are in a
bandwidth crush (DoS/stampede) situation ?
It may also make sense to have a "emergency detector" which triggers
when the backend is overloaded and offer a scaling factor for all
timeouts for when in such an emergency state. Something like "If
the average response time of the backend rises above 10 seconds,
multiply all expiry timers by two".
It probably also makes sense to have a bandwidth/request traffic
shaper for backend traffic to prevent any one Varnish machine from
pummeling the backend in case of attacks or misconfigured
expiry headers.
Startup/consistency
-------------------
We need to decide what to do about the cache when the Varnish
process starts. There may be a difference between it starting
first time after the machine booted and when it is subsequently
(re)started.
By far the easiest thing to do is to disregard the cache, that saves
a lot of code for locating and validating the contents, but this
carries a penalty in backend or cluster fetches whenever a node
comes up. Lets call this the "transient cache model"
The alternative is to allow persistently cached contents to be used
according to configured criteria:
Can expired contents be served if we can't contact the
backend ? (dangerous...)
Can unexpired contents be served if we can't contact the
backend ? If so, how much past the expiry ?
It is a very good question how big a fraction of the persistent
cache would be usable after typical downtimes:
After a Varnish process restart: Nearly all.
After a power-failure ? Probably at least half, but probably
not the half that contains the most busy pages.
And we need to take into consideration if validating the format and
contents of the cache might take more resources and time than getting
the content from the backend.
Off the top of my head, I would prefer the transient model any day
because of the simplicity and lack of potential consistency problems,
but if the load on the back end is intolerable this may not be
practically feasible.
The best way to decide is to carefully analyze a number of cold
starts and cache content replacement traces.
The choice we make does affect the storage management part of Varnish,
but I see that is being modular in any instance, so it may merely be
that some storage modules come up clean on any start while other
will come up with existing objects cached.
Clustering
----------
I'm somewhat torn on clustering for traffic purposes. For admin
and management: Yes, certainly, but starting to pass objects from
one machine in a cluster to another is likely to be just be a waste
of time and code.
Today one can trivially fit 1TB into a 1U machine so the partitioning
argument for cache clusters doesn't sound particularly urgent to me.
If all machines in the cluster have sufficient cache capacity, the
other remaining argument is backend offloading, that would likely
be better mitigated by implementing a 1:10 style two-layer cluster
with the second level node possibly having twice the storage of
the front row nodes.
The coordination necessary for keeping track of, or discovering in
real-time, who has a given object can easily turn into a traffic
and cpu load nightmare.
And from a performance point of view, it only reduces quality:
First we send out a discovery multicast, then we wait some amount
of time to see if a response arrives only then should we start
to ask the backend for the object. With a two-level cluster
we can ask the layer-two node right away and if it doesn't have
the object it can ask the back-end right away, no timeout is
involved in that.
Finally Consider the impact on a cluster of a "must get" object
like an IMG tag with a misspelled URL. Every hit on the front page
results in one get of the wrong URL. One machine in the cluster
ask everybody else in the cluster "do you have this URL" every
time somebody gets the frontpage.
If we implement a negative feedback protocol ("No I don't"), then
each hit on the wrong URL will result in N+1 packets (assuming multicast).
If we use a silent negative protocol the result is less severe for
the machine that got the request, but still everybody wakes up to
to find out that no, we didn't have that URL.
Negative caching can mitigate this to some extent.
Privacy
-------
Configuration data and instructions passed forth and back should
be encrypted and signed if so configured. Using PGP keys is
a very tempting and simple solution which would pave the way for
administrators typing a short ascii encoded pgp signed message
into a SMS from their Bahamas beach vacation...
Implementation ideas
--------------------
The simplest storage method mmap(2)'s a disk or file and puts
objects into the virtual memory on page aligned boundaries,
using a small struct for metadata. Data is not persistant
across reboots. Object free is incredibly cheap. Object
allocation should reuse recently freed space if at all possible.
"First free hole" is probably a good allocation strategy.
Sendfile can be used if filebacked. If nothing else disks
can be used by making a 1-file filesystem on them.
More complex storage methods are object per file and object
in database models. They are relatively trival and well
understood. May offer persistence.
Read-Only storage methods may make sense for getting hold
of static emergency contents from CD-ROM etc.
Treat each disk arm as a separate storage unit and keep track of
service time (if possible) to decide storage scheduling.
Avoid regular expressions at runtime. If config file contains
regexps, compile them into executable code and dlopen() it
into the Varnish process. Use versioning and refcounts to
do memory management on such segments.
Avoid committing transmit buffer space until we have bandwidth
estimate for client. One possible way: Send HTTP header
and time ACKs getting back, then calculate transmit buffer size
and send object. This makes DoS attacks more harmless and
mitigates traffic stampedes.
Kill all TCP connections after N seconds, nobody waits an hour
for a web-page to load.
Abuse mitigation interface to firewall/traffic shaping: Allow
the central node to put an IP/Net into traffic shaping or take
it out of traffic shaping firewall rules. Monitor/interface
process (not main Varnish process) calls script to config
firewalling.
"Warm-up" instructions can take a number of forms and we don't know
what is the most efficient or most usable. Here are some ideas:
Start at these URL's then...
... follow all links down to N levels.
... follow all links that match REGEXP no deeper than N levels down.
... follow N random links no deeper than M levels down.
... load N objects by following random links no deeper than
M levels down.
But...
... never follow any links that match REGEXP
... never pick up objects larger than N bytes
... never pick up objects older than T seconds
It makes a lot of sense to not actually implement this in the main
Varnish process, but rather supply a template perl or python script
that primes the cache by requesting the objects through Varnish.
(That would require us to listen separately on <IP_ADDRESS>
so the perlscript can get in touch with Varnish while in warm-up.)
One interesting but quite likely overengineered option in the
cluster case is if the central monitor tracks a fraction of the
requests through the logs of the running machines in the cluster,
spots the hot objects and tell the warming up varnish what objects
to get and from where.
In the cluster configuration, it is probably best to run the cluster
interaction in a separate process rather than the main Varnish
process. From Varnish to cluster info would go through the shared
memory, but we don't want to implement locking in the shmem so
some sort of back-channel (UNIX domain or UDP socket ?) is necessary.
If we have such an "supervisor" process, it could also be tasked
with restarting the varnish process if vitals signs fail: A time
stamp in the shmem or kill -0 $pid.
It may even make sense to run the "supervisor" process in stand
alone mode as well, there it can offer a HTML based interface
to the Varnish process (via shmem).
For cluster use the user would probably just pass an extra argument
when he starts up Varnish:
varnish -c $cluster_args $other_args
vs
varnish $other_args
and a "varnish" shell script will Do The Right Thing.
Shared memory
-------------
The shared memory layout needs to be thought about somewhat. On one
hand we want it to be stable enough to allow people to write programs
or scripts that inspect it, on the other hand doing it entirely in
ascii is both slow and prone to race conditions.
The various different data types in the shared memory can either be
put into one single segment(= 1 file) or into individual segments
(= multiple files). I don't think the number of small data types to
be big enough to make the latter impractical.
Storing the "big overview" data in shmem in ASCII or HTML would
allow one to point cat(1) or a browser directly at the mmaped file
with no interpretation necessary, a big plus in my book.
Similarly, if we don't update them too often, statistics could be stored
in shared memory in perl/awk friendly ascii format.
But the logfile will have to be (one or more) FIFO logs, probably at least
three in fact: Good requests, Bad requests, and exception messages.
If we decide to make logentries fixed length, we could make them ascii
so that a simple "sort -n /tmp/shmem.log" would put them in order after
a leading numeric timestamp, but it is probably better to provide a
utility to cat/tail-f the log and keep the log in a bytestring FIFO
format. Overruns should be marked in the output.
*END*
You will notice above that there is no mention of VCL, it took a couple of weeks for that particular lightning to strike.
Interestingly I know exactly where the lightning came from, and what it hit.
The timeframe was around GCC 4.0.0 which was not their best release, and I had for some time been pondering a pre-processor for the C language to make up for the ISO-C stagnation and braindamage.
I've read most of the "classic" compiler books, and probably read more compilers many people (Still to go: GIER Algol 4) but to be honest I found them far too theoretical and not very helpful from a practical compiler construction point of view.
But there is one compiler-book which takes an entirely different take: Hanson and Fraser's LCC book. which throws LEX and YACC under the truck and concentrates on compiling.
Taking their low-down approach to parsing, and emitting C code, there really isn't much compiler left to write, and I had done several interesting hacks towards my 'K' language.
The lightning rod was all the ideas Anders had for how Varnish should be able to manipulate the traffic passing through, how to decide what to cache, how long time to cache it, where to cache it and ... it sounded like a lot of very detailed code which had to be incredibly configurable.
Soon those two inspiratons collided:
Notes on Varnish
----------------
Collected 2006-02-24 to 2006-02-..
Poul-Henning Kamp
-----------------------------------------------------------------------
Policy Configuration
Policy is configured in a simple unidirectional (no loops, no goto)
programming language which is compiled into 'C' and from there binary
modules which are dlopen'ed by the main Varnish process.
The dl object contains one exported symbol, a pointer to a structure
which contains a reference count, a number of function pointers,
a couple of string variables with identifying information.
All access into the config is protected by the reference counts.
Multiple policy configurations can be loaded at the same time
but only one is the "active configuration". Loading, switching and
unloading of policy configurations happen via the managment
process.
A global config sequence number is incremented on each switch and
policy modified object attributes (ttl, cache/nocache) are all
qualified by the config-sequence under which they were calculated
and invalid if a different policy is now in effect.
-----------------------------------------------------------------------
Configuration Language
XXX: include lines.
BNF:
program: function
| program function
function: "sub" function_name compound_statement
compound_statement: "{" statements "}"
statements: /* empty */
| statement
| statements statement
statement: if_statement
| call_statement
| "finish"
| assignment_statement
| action_statement
if_statement: "if" condition compound_statement elif_parts else_part
elif_parts: /* empty */
| elif_part
| elif_parts elif_part
elif_part: "elseif" condition compound_statement
| "elsif" condition compound_statement
| "else if" condition compound_statement
else_part: /* empty */
| "else" compound_statement
call_statement: "call" function_name
assign_statement: field "=" value
field: object
field "." variable
action_statement: action arguments
arguments: /* empty */
arguments | argument
-----------------------------------------------------------------------
Sample request policy program
sub request_policy {
if (client.ip in <IP_ADDRESS>/8) {
no-cache
finish
}
if (req.url.host ~ "cnn.no$") {
rewrite s/cnn.no$/vg.no/
}
if (req.url.path ~ "cgi-bin") {
no-cache
}
if (req.useragent ~ "spider") {
no-new-cache
}
if (backend.response_time > 0.8s) {
set req.ttlfactor = 1.5
} elseif (backend.response_time > 1.5s) {
set req.ttlfactor = 2.0
} elseif (backend.response_time > 2.5s) {
set req.ttlfactor = 5.0
}
/*
* the program contains no references to
* maxage, s-maxage and expires, so the
* default handling (RFC2616) applies
*/
}
-----------------------------------------------------------------------
Sample fetch policy program
sub backends {
set backend.vg.ip = {...}
set backend.ads.ip = {...}
set backend.chat.ip = {...}
set backend.chat.timeout = 10s
set backend.chat.bandwidth = 2000 MB/s
set backend.other.ip = {...}
}
sub vg_backend {
set backend.ip = {<IP_ADDRESS>-5}
set backend.timeout = 4s
set backend.bandwidth = 2000Mb/s
}
sub fetch_policy {
if (req.url.host ~ "/vg.no$/") {
set req.backend = vg
call vg_backend
} else {
/* XXX: specify 404 page url ? */
error 404
}
if (backend.response_time > 2.0s) {
if (req.url.path ~ "/landbrugspriser/") {
error 504
}
}
fetch
if (backend.down) {
if (obj.exist) {
set obj.ttl += 10m
finish
}
switch_config ohhshit
}
if (obj.result == 404) {
error 300 "http://www.vg.no"
}
if (obj.result != 200) {
finish
}
if (obj.size > 256k) {
no-cache
} else if (obj.size > 32k && obj.ttl < 2m) {
obj.tll = 5m
}
if (backend.response_time > 2.0s) {
set ttl *= 2.0
}
}
sub prefetch_policy {
if (obj.usage < 10 && obj.ttl < 5m) {
fetch
}
}
-----------------------------------------------------------------------
Purging
When a purge request comes in, the regexp is tagged with the next
generation number and added to the tail of the list of purge regexps.
Before a sender transmits an object, it is checked against any
purge-regexps which have higher generation number than the object
and if it matches the request is sent to a fetcher and the object
purged.
If there were purge regexps with higher generation to match, but
they didn't match, the object is tagged with the current generation
number and moved to the tail of the list.
Otherwise, the object does not change generation number and is
not moved on the generation list.
New Objects are tagged with the current generation number and put
at the tail of the list.
Objects are removed from the generation list when deleted.
When a purge object has a lower generation number than the first
object on the generation list, the purge object has been completed
and will be removed. A log entry is written with number of compares
and number of hits.
-----------------------------------------------------------------------
Random notes
swap backed storage
slowstart by config-flipping
start-config has peer servers as backend
once hitrate goes above limit, management process
flips config to 'real' config.
stat-object
always URL, not regexp
management + varnish process in one binary, comms via pipe
Change from config with long expiry to short expiry, how
does the ttl drop ? (config sequence number invalidates
all calculated/modified attributes.)
Mgt process holds copy of acceptor socket -> Restart without
lost client requests.
BW limit per client IP: create shortlived object (<4sec)
to hold status. Enforce limits by delaying responses.
-----------------------------------------------------------------------
Source structure
libvarnish
library with interface facilities, for instance
functions to open&read shmem log
varnish
varnish sources in three classes
-----------------------------------------------------------------------
protocol cluster/mgt/varnish
object_query url -> TTL, size, checksum
{purge,invalidate} regexp
object_status url -> object metadata
load_config filename
switch_config configname
list_configs
unload_config
freeze # stop the clock, freezes the object store
thaw
suspend # stop acceptor accepting new requests
resume
stop # forced stop (exits) varnish process
start
restart = "stop;start"
ping $utc_time -> pong $utc_time
# cluster only
config_contents filename $inline -> compilation messages
stats [-mr] -> $data
zero stats
help
-----------------------------------------------------------------------
CLI (local)
import protocol from above
telnet localhost someport
authentication:
password $secret
secret stored in {/usr/local}/etc/varnish.secret (400 root:wheel)
-----------------------------------------------------------------------
HTML (local)
php/cgi-bin thttpd ?
(alternatively direct from C-code.)
Everything the CLI can do +
stats
popen("rrdtool");
log view
-----------------------------------------------------------------------
CLI (cluster)
import protocol from above, prefix machine/all
compound stats
accept / deny machine (?)
curses if you set termtype
-----------------------------------------------------------------------
HTML (cluster)
ditto
ditto
http://clustercontrol/purge?regexp=fslkdjfslkfdj
POST with list of regexp
authentication ? (IP access list)
-----------------------------------------------------------------------
Mail (cluster)
pgp signed emails with CLI commands
-----------------------------------------------------------------------
connection varnish -> cluster controller
Encryption
SSL
Authentication (?)
IP number checks.
varnish -c clusterid -C mycluster_ctrl.vg.no
-----------------------------------------------------------------------
Filer
/usr/local/sbin/varnish
contains mgt + varnish process.
if -C argument, open SSL to cluster controller.

Use syslog
Arguments:
-f config file
-d debug
-u uid (?)
/usr/local/sbin/varnish_logger
Logfile processor
-i shmemfile
-e regexp
-o "/var/log/varnish.%Y%m%d.traffic"
-e regexp2
-n "/var/log/varnish.%Y%m%d.exception" (NCSA format)
-e regexp3
-s syslog_level,syslogfacility
-r host:port send via TCP, prefix hostname
SIGHUP: reopen all files.
/usr/local/bin/varnish_cli
Command line tool.
/usr/local/share/varnish/etc/varnish.conf
default request + fetch + backend scripts
/usr/local/share/varnish/etc/rfc2616.conf
RFC2616 compliant handling function
/usr/local/etc/varnish.conf (optional)
request + fetch + backend scripts
/usr/local/share/varnish/etc/varnish.startup
default startup sequence
/usr/local/etc/varnish.startup (optional)
startup sequence
/usr/local/etc/varnish_cluster.conf
XXX
{/usr/local}/etc/varnish.secret
CLI password file.
-----------------------------------------------------------------------
varnish.startup
load config /foo/bar startup_conf
switch config startup_conf
!mypreloadscript
load config /foo/real real_conf
switch config real_conf
resume
A couple of days later the ideas had gel'ed:
Notes on Varnish
----------------
Collected 2006-02-26 to 2006-03-..
Poul-Henning Kamp
-----------------------------------------------------------------------
Objects available to functions in VCL
client # The client
req # The request
obj # The object from which we satisfy it
backend # The chosen supplier
-----------------------------------------------------------------------
Configuration Language
XXX: declare IP lists ?
BNF:
program: part
| program part
part: "sub" function_name compound
| "backend" backend_name compound
compound: "{" statements "}"
statements: /* empty */
| statement
| statements statement
statement: conditional
| functioncall
| "set" field value
| field "=" value
| "no_cache"
| "finish"
| "no_new_cache"
| call function_name
| fetch
| error status_code
| error status_code string(message)
| switch_config config_id
| rewrite field string(match) string(replace)
conditional: "if" condition compound elif_parts else_part
elif_parts: /* empty */
| elif_part
| elif_parts elif_part
elif_part: "elseif" condition compound
| "elsif" condition compound
| "else if" condition compound
else_part: /* empty */
| "else" compound
functioncal: "call" function_name
field: object
field "." variable
condition: '(' cond_or ')'
cond_or: cond_and
| cond_or '||' cond_and
cond_and: cond_part
| cond_and '&&' cond_part
cond_part: '!' cond_part2
| cond_part2
cond_part2: condition
| field(int) '<' number
| field(int) '<=' number
| field(int) '>' number
| field(int) '>=' number
| field(int) '=' number
| field(int) '!=' number
| field(IP) ~ ip_list
| field(string) ~ string(regexp)
-----------------------------------------------------------------------
Sample request policy program
sub request_policy {
if (client.ip in <IP_ADDRESS>/8) {
no-cache
finish
}
if (req.url.host ~ "cnn.no$") {
rewrite s/cnn.no$/vg.no/
}
if (req.url.path ~ "cgi-bin") {
no-cache
}
if (req.useragent ~ "spider") {
no-new-cache
}
if (backend.response_time > 0.8s) {
set req.ttlfactor = 1.5
} elseif (backend.response_time > 1.5s) {
set req.ttlfactor = 2.0
} elseif (backend.response_time > 2.5s) {
set req.ttlfactor = 5.0
}
/*
* the program contains no references to
* maxage, s-maxage and expires, so the
* default handling (RFC2616) applies
*/
}
-----------------------------------------------------------------------
Sample fetch policy program
sub backends {
set backend.vg.ip = {...}
set backend.ads.ip = {...}
set backend.chat.ip = {...}
set backend.chat.timeout = 10s
set backend.chat.bandwidth = 2000 MB/s
set backend.other.ip = {...}
}
sub vg_backend {
set backend.ip = {<IP_ADDRESS>-5}
set backend.timeout = 4s
set backend.bandwidth = 2000Mb/s
}
sub fetch_policy {
if (req.url.host ~ "/vg.no$/") {
set req.backend = vg
call vg_backend
} else {
/* XXX: specify 404 page url ? */
error 404
}
if (backend.response_time > 2.0s) {
if (req.url.path ~ "/landbrugspriser/") {
error 504
}
}
fetch
if (backend.down) {
if (obj.exist) {
set obj.ttl += 10m
finish
}
switch_config ohhshit
}
if (obj.result == 404) {
error 300 "http://www.vg.no"
}
if (obj.result != 200) {
finish
}
if (obj.size > 256k) {
no-cache
} else if (obj.size > 32k && obj.ttl < 2m) {
obj.tll = 5m
}
if (backend.response_time > 2.0s) {
set ttl *= 2.0
}
}
sub prefetch_policy {
if (obj.usage < 10 && obj.ttl < 5m) {
fetch
}
}
-----------------------------------------------------------------------
Purging
When a purge request comes in, the regexp is tagged with the next
generation number and added to the tail of the list of purge regexps.
Before a sender transmits an object, it is checked against any
purge-regexps which have higher generation number than the object
and if it matches the request is sent to a fetcher and the object
purged.
If there were purge regexps with higher generation to match, but
they didn't match, the object is tagged with the current generation
number and moved to the tail of the list.
Otherwise, the object does not change generation number and is
not moved on the generation list.
New Objects are tagged with the current generation number and put
at the tail of the list.
Objects are removed from the generation list when deleted.
When a purge object has a lower generation number than the first
object on the generation list, the purge object has been completed
and will be removed. A log entry is written with number of compares
and number of hits.
-----------------------------------------------------------------------
Random notes
swap backed storage
slowstart by config-flipping
start-config has peer servers as backend
once hitrate goes above limit, management process
flips config to 'real' config.
stat-object
always URL, not regexp
management + varnish process in one binary, comms via pipe
Change from config with long expiry to short expiry, how
does the ttl drop ? (config sequence number invalidates
all calculated/modified attributes.)
Mgt process holds copy of acceptor socket -> Restart without
lost client requests.
BW limit per client IP: create shortlived object (<4sec)
to hold status. Enforce limits by delaying responses.
-----------------------------------------------------------------------
Source structure
libvarnish
library with interface facilities, for instance
functions to open&read shmem log
varnish
varnish sources in three classes
-----------------------------------------------------------------------
protocol cluster/mgt/varnish
object_query url -> TTL, size, checksum
{purge,invalidate} regexp
object_status url -> object metadata
load_config filename
switch_config configname
list_configs
unload_config
freeze # stop the clock, freezes the object store
thaw
suspend # stop acceptor accepting new requests
resume
stop # forced stop (exits) varnish process
start
restart = "stop;start"
ping $utc_time -> pong $utc_time
# cluster only
config_contents filename $inline -> compilation messages
stats [-mr] -> $data
zero stats
help
-----------------------------------------------------------------------
CLI (local)
import protocol from above
telnet localhost someport
authentication:
password $secret
secret stored in {/usr/local}/etc/varnish.secret (400 root:wheel)
-----------------------------------------------------------------------
HTML (local)
php/cgi-bin thttpd ?
(alternatively direct from C-code.)
Everything the CLI can do +
stats
popen("rrdtool");
log view
-----------------------------------------------------------------------
CLI (cluster)
import protocol from above, prefix machine/all
compound stats
accept / deny machine (?)
curses if you set termtype
-----------------------------------------------------------------------
HTML (cluster)
ditto
ditto
http://clustercontrol/purge?regexp=fslkdjfslkfdj
POST with list of regexp
authentication ? (IP access list)
-----------------------------------------------------------------------
Mail (cluster)
pgp signed emails with CLI commands
-----------------------------------------------------------------------
connection varnish -> cluster controller
Encryption
SSL
Authentication (?)
IP number checks.
varnish -c clusterid -C mycluster_ctrl.vg.no
-----------------------------------------------------------------------
Filer
/usr/local/sbin/varnish
contains mgt + varnish process.
if -C argument, open SSL to cluster controller.

Use syslog
Arguments:
-f config file
-d debug
-u uid (?)
/usr/local/sbin/varnish_logger
Logfile processor
-i shmemfile
-e regexp
-o "/var/log/varnish.%Y%m%d.traffic"
-e regexp2
-n "/var/log/varnish.%Y%m%d.exception" (NCSA format)
-e regexp3
-s syslog_level,syslogfacility
-r host:port send via TCP, prefix hostname
SIGHUP: reopen all files.
/usr/local/bin/varnish_cli
Command line tool.
/usr/local/share/varnish/etc/varnish.conf
default request + fetch + backend scripts
/usr/local/share/varnish/etc/rfc2616.conf
RFC2616 compliant handling function
/usr/local/etc/varnish.conf (optional)
request + fetch + backend scripts
/usr/local/share/varnish/etc/varnish.startup
default startup sequence
/usr/local/etc/varnish.startup (optional)
startup sequence
/usr/local/etc/varnish_cluster.conf
XXX
{/usr/local}/etc/varnish.secret
CLI password file.
-----------------------------------------------------------------------
varnish.startup
load config /foo/bar startup_conf
switch config startup_conf
!mypreloadscript
load config /foo/real real_conf
switch config real_conf
resume
You'd think we'd be cookin' with gas now, and indeed we were, but now all the difficult details started to raise ugly questions, and it has never stopped since:
Questions:
* Which "Host:" do we put in the request to the backend ?
The one we got from the client ?
The ip/dns-name of the backend ?
Configurable in VCL backend declaration ?
(test with www.ing.dk)
* Construction of headers for queries to backend ?
How much do we take from client headers, how much do we make up ?
Some sites discriminate contents based on User-Agent header.
(test with www.krak.dk/www.rs-components.dk)
Cookies
* Mapping of headers from backend reply to the reply to client
Which fields come from the backend ?
Which fields are made up on the spot ? (expiry time ?)
(Static header fields can be prepended to contents in storage)
* 3xx replies from the backend
Does varnish follow a redirection or do we pass it to the client ?
Do we cache 3xx replies ?
The final bit of history I want to share is the IRC log from the first time tried to put real live traffic through Varnish.
The language is interscandinavian, but I think non-vikings can get still get the drift:
**** BEGIN LOGGING AT Thu Jul 6 12:36:48 2006
Jul 06 12:36:48 * Now talking on #varnish
Jul 06 12:36:48 * EvilDES gives channel operator status to andersb
Jul 06 12:36:53 * EvilDES gives channel operator status to phk
Jul 06 12:36:53 <andersb> hehe
Jul 06 12:36:56 <EvilDES> sånn
Jul 06 12:37:00 <andersb> Jepps, er dere klare?
Jul 06 12:37:08 <phk> Jeg har varnish oppe og køre med leonora som backend.
Jul 06 12:37:12 * EvilDES has changed the topic to: Live testing in progress!
Jul 06 12:37:16 * EvilDES sets mode +t #varnish
Jul 06 12:37:19 <andersb> Da setter jeg på trafikk
Jul 06 12:37:36 <phk> andersb: kan du starte med bare at give us trafiik i 10 sekunder eller så ?
Jul 06 12:37:49 * edward<EMAIL_ADDRESS>has joined #varnish
Jul 06 12:38:32 <andersb> hmm, først må jeg få trafikk dit.
Jul 06 12:38:55 <andersb> Har noe kommet? Eller har det blitt suprt etter /systemmeldinger/h.html som er helsefilen?
Jul 06 12:39:10 <andersb> s/suprt/spurt/
Jul 06 12:39:41 <EvilDES> ser ingenting
Jul 06 12:39:45 <phk> jeg har ikke set noget endnu...
Jul 06 12:40:35 <phk> den prøver på port 80
Jul 06 12:41:24 <andersb> okay..
Jul 06 12:41:31 <EvilDES> kan vi ikke bare kjøre varnishd på port 80?
Jul 06 12:41:46 <phk> ok, jeg ville bare helst ikke køre som root.
Jul 06 12:41:47 <andersb> Prøver den noe annet nå?
Jul 06 12:41:59 <phk> nej stadig 80.
Jul 06 12:42:03 <phk> Jeg starter varnishd som root
Jul 06 12:42:08 <EvilDES> nei, vent
Jul 06 12:42:08 <andersb> Topp
Jul 06 12:42:11 <andersb> okay
Jul 06 12:42:15 <andersb> kom det 8080 nå?
Jul 06 12:42:18 <EvilDES> sysctl reserved_port
Jul 06 12:43:04 <andersb> okay? Får dere 8080 trafikk nå?
Jul 06 12:43:08 <EvilDES> sysctl net.inet.ip.portrange.reservedhigh=79
Jul 06 12:44:41 <andersb> Okay, avventer om vi skal kjøre 8080 eller 80.
Jul 06 12:45:56 <EvilDES> starter den på port 80 som root
Jul 06 12:46:01 <phk> den kører nu
Jul 06 12:46:01 <andersb> Okay, vi har funnet ut at måten jeg satte 8080 på i lastbalanserern var feil.
Jul 06 12:46:07 <andersb> okay på 80?
Jul 06 12:46:12 <phk> vi kører
Jul 06 12:46:14 <EvilDES> ja, masse trafikk
Jul 06 12:46:29 <phk> omtrent 100 req/sec
Jul 06 12:46:37 <phk> and we're dead...
Jul 06 12:46:40 <EvilDES> stopp!
Jul 06 12:46:58 <andersb> den stopper automatisk.
Jul 06 12:47:04 <andersb> Vi kan bare kjøre det slik.
Jul 06 12:47:06 <EvilDES> tok noen sekunder
Jul 06 12:47:20 <andersb> Npr den begynner svar på 80 så vil lastbalanserern finne den fort og sende trafikk.
Jul 06 12:47:41 <EvilDES> ca 1500 connection requests kom inn før den sluttet å sende oss trafikk
Jul 06 12:47:49 <EvilDES> altså, 1500 etter at varnishd døde
Jul 06 12:48:02 <andersb> tror det er en god nok måte å gjøre det på. Så slipper vi å configge hele tiden.
Jul 06 12:48:07 <EvilDES> greit
Jul 06 12:48:11 <EvilDES> det er dine lesere :)
Jul 06 12:48:19 <andersb> ja :)
Jul 06 12:48:35 <andersb> kan sette ned retry raten litt.
Jul 06 12:49:15 <andersb> >> AS3408-2 VG Nett - Real server 21 # retry
Jul 06 12:49:16 <andersb> Current number of failure retries: 4
Jul 06 12:49:16 <andersb> Enter new number of failure retries [1-63]: 1
Jul 06 12:49:33 <andersb> ^^ before de decalres dead
Jul 06 12:49:41 <andersb> he declairs :)
Jul 06 12:51:45 <phk> I've saved the core, lets try again for another shot.
Jul 06 12:52:09 <andersb> sure :)
Jul 06 12:52:34 <andersb> When you start port 80 loadbalancer will send 8 req's for h.html then start gicing traficc
Jul 06 12:53:00 <andersb> ^^ Microsoft keyboard
Jul 06 12:53:09 <phk> ok, jeg starter
Jul 06 12:53:10 <EvilDES> you need to get a Linux keyboard
Jul 06 12:53:16 <andersb> Yeah :)
Jul 06 12:53:18 <EvilDES> woo!
Jul 06 12:53:21 <phk> boom.
Jul 06 12:53:25 <EvilDES> oops
Jul 06 12:53:35 <EvilDES> 18 connections, 77 requests
Jul 06 12:53:40 <EvilDES> that didn't last long...
Jul 06 12:54:41 <andersb> longer than me :) *rude joke
Jul 06 12:55:04 <phk> bewm
Jul 06 12:55:22 <andersb> can I follow a log?
Jul 06 12:55:39 <andersb> with: lt-varnishlog ?
Jul 06 12:56:27 <phk> samme fejl
Jul 06 12:56:38 <phk> andersb: jeg gemmer logfilerne
Jul 06 12:57:00 <phk> bewm
Jul 06 12:57:13 <andersb> phk: Jepp, men for min egen del for å se når dere skrur på etc. Da lærer jeg loadbalancer ting.
Jul 06 12:57:51 <phk> ok, samme fejl igen.
Jul 06 12:58:02 <phk> jeg foreslår vi holder en lille pause mens jeg debugger.
Jul 06 12:58:09 <andersb> sure.
Jul 06 12:58:16 <EvilDES> andersb: cd ~varnish/varnish/trunk/varnish-cache/bin/varnishlog
Jul 06 12:58:21 <EvilDES> andersb: ./varnishlog -o
Jul 06 12:58:37 <EvilDES> andersb: cd ~varnish/varnish/trunk/varnish-cache/bin/varnishstat
Jul 06 12:58:43 <EvilDES> andersb: ./varnishstat -c
Jul 06 12:58:44 <phk> eller ./varnislog -r _vlog3 -o | less
Jul 06 13:00:02 <andersb> Jeg går meg en kort tur. Straks tilbake.
Jul 06 13:01:27 <phk> vi kører igen
Jul 06 13:02:31 <phk> 2k requests
Jul 06 13:02:57 <phk> 3k
Jul 06 13:03:39 <phk> 5k
Jul 06 13:03:55 <EvilDES> ser veldig bra ut
Jul 06 13:04:06 <EvilDES> hit rate > 93%
Jul 06 13:04:13 <EvilDES> 95%
Jul 06 13:05:14 <phk> 800 objects
Jul 06 13:05:32 <EvilDES> load 0.28
Jul 06 13:05:37 <EvilDES> 0.22
Jul 06 13:05:52 <EvilDES> CPU 98.9% idle :)
Jul 06 13:06:12 <phk> 4-5 Mbit/sec
Jul 06 13:06:42 <andersb> nice :)
Jul 06 13:06:49 <andersb> vi kjører til det krasjer?
Jul 06 13:06:58 <phk> jep
Jul 06 13:07:05 <phk> du må gerne åbne lidt mere
Jul 06 13:07:20 <andersb> okay
Jul 06 13:07:41 <andersb> 3 ganger mer...

Jul 06 13:13:00 <phk> ca 50 req/sec
Jul 06 13:13:04 <EvilDES> skal vi øke?
Jul 06 13:13:14 <phk> ja, giv den det dobbelte hvis du kan
Jul 06 13:13:19 <andersb> vi startet med 1 -> 3 -> ?
Jul 06 13:13:22 <phk> 6
Jul 06 13:13:23 <andersb> 6
Jul 06 13:13:34 <andersb> done
Jul 06 13:13:42 <andersb> den hopper opp graceful.
Jul 06 13:13:54 <EvilDES> boom
Jul 06 13:14:06 <andersb> :)
Jul 06 13:14:11 <EvilDES> men ingen ytelsesproblemer
Jul 06 13:14:19 <EvilDES> bare bugs i requestparsering
Jul 06 13:14:20 <phk> kører igen
Jul 06 13:14:26 <phk> bewm
Jul 06 13:14:31 <phk> ok, vi pauser lige...
Jul 06 13:17:40 <phk> jeg har et problem med "pass" requests, det skal jeg lige have fundet inden vi går videre.
Jul 06 13:18:51 <andersb> Sure.
Jul 06 13:28:50 <phk> ok, vi prøver igen
Jul 06 13:29:09 <phk> bewm
Jul 06 13:29:35 <phk> more debugging
Jul 06 13:33:56 <phk> OK, found the/one pass-mode bug
Jul 06 13:33:58 <phk> trying again
Jul 06 13:35:23 <phk> 150 req/s 24mbit/s, still alive
Jul 06 13:37:02 <EvilDES> andersb: tror du du klarer å komme deg hit til foredraget, eller er du helt ødelagt?
Jul 06 13:37:06 <phk> andersb: giv den 50% mere trafik
Jul 06 13:39:46 <andersb> mer trafikk
Jul 06 13:39:56 <andersb> EvilDES: Nei :(( Men Stein fra VG Nett kommer.
Jul 06 13:41:25 <EvilDES> btw, har du noen data om hva load balanceren synes om varnish?
Jul 06 13:41:50 <EvilDES> jeg regner med at den følger med litt på hvor god jobb vi gjør
Jul 06 13:43:10 <phk> Jeg genstarter lige med flere workerthreads...
Jul 06 13:43:43 <phk> jeg tror 20 workerthreads var for lidt nu...
Jul 06 13:43:47 <phk> nu har den 220
Jul 06 13:44:40 <EvilDES> 2976 107.89 Client connections accepted
Jul 06 13:44:41 <EvilDES> 10748 409.57 Client requests received
Jul 06 13:44:41 <EvilDES> 9915 389.59 Cache hits
Jul 06 13:45:13 <EvilDES> det var altså 400 i sekundet :)
Jul 06 13:45:45 <phk> og ingen indlysende fejl på www.vg.no siden :-)
Jul 06 13:45:54 <phk> bewm
Jul 06 13:47:16 <EvilDES> andersb: hvor stor andel av trafikken hadde vi nå?
Jul 06 13:48:06 <EvilDES> altså, vekt i load balanceren i forhold til totalen
Jul 06 13:49:20 <phk> ok, kun 120 threads så...
Jul 06 13:50:48 <andersb> 9
Jul 06 13:52:45 <phk> andersb: 9 -> 12 ?
Jul 06 13:52:48 <EvilDES> andersb: 9 til varnish, men hvor mye er den totale vekten?
Jul 06 13:52:58 <EvilDES> har vi 1%? 5%? 10%?
Jul 06 13:54:37 <EvilDES> nå passerte vi nettopp 50000 requests uten kræsj
Jul 06 13:55:36 <phk> maskinen laver ingenting... 98.5% idle
Jul 06 13:56:21 <andersb> 12 maskiner med weight 20
Jul 06 13:56:26 <andersb> 1 med weight 40
Jul 06 13:56:29 <andersb> varnish med 9
Jul 06 13:57:01 <andersb> si fra når dere vil ha mer trafikk.
Jul 06 13:57:02 <phk> 9/289 = 3.1%
Jul 06 13:57:12 <phk> andersb: giv den 15
Jul 06 13:57:44 <andersb> gjort
Jul 06 13:59:43 <andersb> dette er morro. Jeg må si det.
Jul 06 14:00:27 <phk> 20-23 Mbit/sec steady, 200 req/sec, 92.9% idle
Jul 06 14:00:30 <phk> bewm
Jul 06 14:00:46 <EvilDES> OK
Jul 06 14:00:57 <EvilDES> jeg tror vi kan slå fast at ytelsen er som den skal være
Jul 06 14:01:33 <EvilDES> det er en del bugs, men de bør det gå an å fikse.
Jul 06 14:01:34 <andersb> Jepp :) Det så pent ut...
Jul 06 14:01:53 <phk> jeg tror ikke vi har set skyggen af hvad Varnish kan yde endnu...
Jul 06 14:01:53 <EvilDES> andersb: hvordan ligger vi an i forhold til Squid?
Jul 06 14:01:58 <andersb> pent :)
Jul 06 14:02:13 <andersb> Jeg har ikke fått SNMP opp på dene boksen, jeg burde grafe det...
Jul 06 14:02:23 <EvilDES> snmp kjører på c21
Jul 06 14:02:33 <EvilDES> tror agero satte det opp
Jul 06 14:02:36 <EvilDES> aagero
Jul 06 14:02:38 <andersb> Ja, men jeg har ikke mal i cacti for bsnmpd
Jul 06 14:02:43 <EvilDES> ah, ok
Jul 06 14:03:03 <EvilDES> men den burde støtte standard v2 mib?
Jul 06 14:03:26 <andersb> det er ikke protocoll feil :)
Jul 06 14:03:42 <andersb> Hva er byte hitratio forresetn?
Jul 06 14:03:52 <EvilDES> det tror jeg ikke vi måler
Jul 06 14:03:55 <EvilDES> enda
Jul 06 14:03:59 <phk> andersb: den har jeg ikke stats på endnu.
Jul 06 14:04:22 <phk> ok, forrige crash ligner en 4k+ HTTP header...
Jul 06 14:04:27 <phk> (eller en kodefejl)
Jul 06 14:06:03 <phk> andersb: prøv at øge vores andel til 20
Jul 06 14:06:26 <EvilDES> hvilken vekt har hver av de andre cachene?
Jul 06 14:06:49 <phk> 20 og en med 40
Jul 06 14:07:50 <andersb> gjort
Jul 06 14:08:59 <phk> 440 req/s 43mbit/s
Jul 06 14:09:17 <phk> bewm
Jul 06 14:09:18 <EvilDES> bewm
Jul 06 14:10:30 <EvilDES> oj
Jul 06 14:10:39 <EvilDES> vi var oppe over 800 req/s et øyeblikk
Jul 06 14:10:46 <phk> 60mbit/sec
Jul 06 14:10:52 <phk> og 90% idle :-)
Jul 06 14:10:59 <EvilDES> ingen swapping
Jul 06 14:11:58 <EvilDES> og vi bruker nesten ikke noe minne - 3 GB ledig fysisk RAM
Jul 06 14:13:02 <phk> ca 60 syscall / req
Jul 06 14:14:31 <andersb> nice :)
Jul 06 14:14:58 <phk> andersb: prøv at give os 40
Jul 06 14:17:26 <andersb> gjort
Jul 06 14:18:17 <phk> det ligner at trafikken falder her sidst på eftermiddagen...
Jul 06 14:19:07 <andersb> ja :)
Jul 06 14:19:43 <phk> andersb: så skal vi nok ikke øge mere, nu nærmer vi os hvad 100Mbit ethernet kan klare.
Jul 06 14:19:58 <andersb> bra :)
Jul 06 14:20:36 <phk> 42mbit/s steady
Jul 06 14:20:59 <EvilDES> 40 av 320?
Jul 06 14:21:06 <EvilDES> 12,5%
Jul 06 14:21:43 * nicholas<EMAIL_ADDRESS>has joined #varnish
Jul 06 14:22:00 <phk> det der cluster-noget bliver der da ikke brug for når vi har 87% idle
Jul 06 14:23:05 <andersb> hehe :)
Jul 06 14:24:38 <andersb> skal stille de andre ned litt for 48 er max
Jul 06 14:24:57 <phk> jeg tror ikke vi skal gå højere før vi har gigE
Jul 06 14:25:14 <andersb> 4-5MB/s
Jul 06 14:25:32 <andersb> lastbalanserer backer off på 100 Mbit
Jul 06 14:25:35 <andersb> :)
Jul 06 14:25:42 <andersb> Så vi kan kjøre nesten til taket.
Jul 06 14:26:01 <andersb> hvis det har noe poeng.
Jul 06 14:26:09 <andersb> crash :)
Jul 06 14:27:33 <phk> bewm
Jul 06 14:29:08 <andersb> Stilt inn alle på weight 5
Jul 06 14:29:17 <andersb> bortsett fra 1 som er 10
Jul 06 14:29:20 <andersb> varnish er 5
Jul 06 14:29:24 <phk> så giv os 20
Jul 06 14:29:51 <andersb> gjort
Jul 06 14:30:58 <phk> vi får kun 300 req/s
Jul 06 14:31:04 <phk> Ahh der skete noget.
Jul 06 14:32:41 <phk> ok, ved denne last bliver backend connections et problem, jeg har set dns fejl og connection refused
Jul 06 14:33:10 <phk> dns fejl
Jul 06 14:33:21 <andersb> okay, pek den mot <IP_ADDRESS>
Jul 06 14:33:28 <andersb> det er layer 2 squid cache
Jul 06 14:33:35 <andersb> morro å teste det og.
Jul 06 14:33:54 <phk> det gør jeg næste gang den falder
Jul 06 14:34:48 <phk> jeg kunne jo også bare give leonors IP# istedet... men nu kører vi imod squid
Jul 06 14:36:05 <andersb> ja, gi leonora IP det er sikkert bedre. Eller det kan jo være fint å teste mot squid og :)
Jul 06 14:39:04 <phk> nu kører vi med leonora's IP#
Jul 06 14:39:33 <phk> nu kører vi med leonora's *rigtige* IP#
Jul 06 14:41:20 <phk> Nu er vi færdige med det her 100Mbit/s ethernet, kan vi få et til ? :-)
Jul 06 14:41:42 <andersb> lol :)
Jul 06 14:42:00 <andersb> For å si det slik. Det tar ikke mange dagene før Gig switch er bestilt :)
Jul 06 14:43:05 <phk> bewm
Jul 06 14:43:13 <phk> ok, jeg synes vi skal stoppe her.
Jul 06 14:43:41 <EvilDES> jepp, foredrag om 15 min
Jul 06 14:43:57 <andersb> jepp
Jul 06 14:44:23 <andersb> disabled server
Jul 06 14:45:29 <EvilDES> dette har vært en veldig bra dag.
Jul 06 14:45:49 <EvilDES> hva skal vi finne på i morgen? skifte ut hele Squid-riggen med en enkelt Varnish-boks? ;)
Jul 06 14:45:53 <andersb> lol
Jul 06 14:46:15 * EvilDES må begynne å sette i stand til foredraget
Jul 06 14:46:17 <andersb> da må jeg har Gig switch. Eller så kan være bære med en HP maskin å koble rett på lastbal :)
Jul 06 14:46:22 <phk> kan vi ikke nøjes med en halv varnish box ?
Jul 06 14:46:41 <EvilDES> vi må ha begge halvdeler for failover
Jul 06 14:47:01 <andersb> :)
Jul 06 14:47:14 <andersb> kan faile tilbake til de andre.
Jul 06 14:47:25 <andersb> Jeg klarer ikke holde meg hjemme.
Jul 06 14:47:33 <andersb> Jeg kommer oppover om litt :)
Jul 06 14:47:39 <andersb> Ringer på.
Jul 06 14:48:19 <andersb> må gå en tur nå :)
Jul 06 14:48:29 * andersb has quit (BitchX: no additives or preservatives)
Jul 06 14:49:44 <EvilDES> http://www.des.no/varnish/
**** ENDING LOGGING AT Thu Jul 6 14:52:04 2006
phk


extra.ui
Class GridContainer
java.lang.Object
|
+--waba.ui.Control
|
+--waba.ui.Container
|
+--extra.ui.GridContainer
- public class GridContainer
- extends Container
A container that lays it's component controls out in a grid. Here's an example.
GridContainer gc=new GridContainer(2,2);
gc.add(new Button("One"));
gc.add(new Button("Two"));
gc.add(new Button("Three"));
gc.add(new Button("Four"));
gc.setRect(0,0,160,100);
add(gc);
which should give you something like:
_____________________
| | |
| One | Two |
|__________|__________|
| | |
| Three | Four |
|__________|__________|
|
Constructor Summary |
GridContainer(int gridx,
int gridy)
Construct a new container with the specified grid width and height. |
|
Method Summary |
void |
add(Control c)
Adds a control at the grid position to the left of the last one added or (0,0) if this is the first. |
void |
add(Control c,
int x,
int y)
Adds a control at the specified grid position |
Control |
get(int x,
int y)
Gets the control at the given grid position |
void |
layout()
Layout all the controls in this container. |
void |
remove(Control c)
Removes a control from this layout. |
void |
remove(int x,
int y)
Removes a control at the given grid position. |
void |
setGaps(int x,
int y)
Sets the gap between controls. |
void |
setRect(int x,
int y,
int width,
int height)
Sets the rect for this container. |
| Methods inherited from class waba.ui.Control |
addTimer, contains, createGraphics, getFontMetrics, getNext, getParent, getRect, onEvent, onPaint, postEvent, removeTimer, repaint |
layout
protected Control[][] layout
- the layout of controls
xgap
protected int xgap
ygap
protected int ygap
GridContainer
public GridContainer(int gridx,
int gridy)
- Construct a new container with the specified grid width and height.
- Parameters:
gridx
- the number of columns in the grid.gridy
- the number of rows in the grid.
setGaps
public void setGaps(int x,
int y)
- Sets the gap between controls.
- Parameters:
x
- the x gap in pixelsy
- the y gap in pixels
get
public Control get(int x,
int y)
- Gets the control at the given grid position
- Parameters:
x
- the x grid coordy
- the y grid coord
add
public void add(Control c)
- Adds a control at the grid position to the left of the last one added or (0,0) if this is the first.
If the last added was at the maximum x position, this one is added at an x pos of 0 on the next y pos down.
- Overrides:
add
in class Container
- Parameters:
c
- the control to add
add
public void add(Control c,
int x,
int y)
- Adds a control at the specified grid position
- Parameters:
x
- the x grid coordy
- the y grid coord
remove
public void remove(Control c)
- Removes a control from this layout.
- Overrides:
remove
in class Container
- Parameters:
c
- the control to remove
remove
public void remove(int x,
int y)
- Removes a control at the given grid position.
- Parameters:
x
- the x grid coordy
- the y grid coord
setRect
public void setRect(int x,
int y,
int width,
int height)
- Sets the rect for this container. Redoes the layout.
- Overrides:
setRect
in class Control
layout
public void layout()
- Layout all the controls in this container.


Hi! I’m Amanda. The “Bad Mama.” Baking is my self-care, and I’m so excited to share my kitchen with friends old and new in the Austin area. Whether you’re in the mood for something classic, extravagant, or straight up punk rock, I’ve got you covered.
Get in touch through Facebook or shoot me an email and let’s talk treats! I’ve usually got some cookies and mini cupcakes ready to go, and would love to plan your custom creation.


decrypter / encrypter for PokerStars ini files. hit the
Decrypt Directory..
button to recursively decrypt all ini files in a directory of your choice. the decrypted ini
files will be dumped as
IniName-Tc2.ini into that directory (that is postfixed
with "-Tc2"). you may encrypt all ini files again by hitting the
Encrypt button or you may select a directory to encrypt all ini files
by hitting the
Encrypt Directory.. button.
- the decrypter may stop working at any time (stars may change the encryption key for example)
- the decrypter adds some data as comment to the very begining of the decrypted files. this data
is required for reincrypting, so don't change or remove it!
- the decrypter may may not be able to decrypt files encrypted with other ini decrypters
or the other way round.


Electric Motor¶
-
class
components.motor.
Motor
(*args, **kwargs)[source]¶ This class will create an electric motor.
Returns: ParaPy Geometry of the Electric Motor
Parameters: - target_power (float) – This is the motor target power.
- browse_motors – Allows the user to easily choose amongst available motors with a GUI File-Browser.
-
__show_primitives
= None¶ A parameter for debugging, turns the visibility of miscellaneous parts ON/OFF
-
browse_motors
[source]¶ Allows the user to easily choose amongst available motors with a GUI File-Browser.
Returns: Sets the motor_name to the value chosen in the GUI Browser
-
center_of_gravity
[source]¶ Location of the motor center of gravity w.r.t the origin (Assumed to be in the middle of the motor body)
Returns: Location Tuple in SI meter Return type: Point
-
chamfer_edges
[source]¶ Rejects the line edge which will only have 2 sample_points
Returns: Edge table of circular edges of the motor-body
-
component_type
[source]¶ An identifier to be able to lump masses together. Possible entries: ‘wing’ ‘fuselage’ ‘vt’ ‘ht’ ‘ct’ ‘boom’ ‘payload’ ‘prop’ ‘battery’ ‘electronics’
Returns: Component Type
-
diameter
[source]¶ The outer diameter of the motor body
Returns: Diameter in SI meter Return type: float
-
efficiency
[source]¶ Assumed motor efficiency is at the higher-end of typical values and equal to 90% http://www.radiocontrolinfo.com/brushless-motor-efficiency/
Return type: float
-
extrude_direction
[source]¶ Defines the extrude direction as a vector of the motor-body as well as the shaft. To access this dict use the field_names: body and shaft respectively.
Return type: dict
-
internal_shape
[source]¶ Chamfers the edges of motor_body_import to better resemble the shape of RimFire engines
Returns: Motor ‘internal_shape’ Return type: ChamferedSolid
-
motor_body_import
[source]¶ Creates the motor body as an ExtrudedSolid in the direction specified in extrude_direction
Returns: Motor Body Return type: ExtrudedSolid
-
motor_circle
[source]¶ Creates the circle that is used to extrude and form the motor body
Returns: Circle used for Motor Body Extrusion Return type: Circle
-
motor_selector
[source]¶ An attribute which selects a motor based on input of target power. A tolerance of 10% is added to this value in order to allow the algorithm to select a slightly under-powered motor and utilize it’s burst power to meet the requirement. This can be set to zero in the code if desired with the variable ‘tolerance’ below. Finally, a condition is added to select the lightest motor from the list of available motors.
Returns: Name of the selected motor Return type: str
-
power
[source]¶ Pulls the corresponding field_names constant_power and burst_power from the dictionary specs. This is done to minimize the amount of characters necessary to call these parameters. Index 0 of the list is constant_power and Index 1 is burst_power.
Return type: list
-
shaft
[source]¶ Creates the motor shaft as an ExtrudedSolid in the direction specified in extrude_direction
Returns: Motor Shaft Return type: ExtrudedSolid
-
shaft_circle
[source]¶ Creates the circle that is used to extrude and form the motor shaft
Returns: Circle used for Motor Shaft Extrusion Return type: Circle
-
shaft_diameter
[source]¶ The outer diameter of the motor shaft
Returns: Diameter in SI meter Return type: float


Either the name of an abstract type that is required by all sections this is injected in, or '!' and the name of an abstract type that should not be parent of any of the sections that this section should be injected in. This further refines the selection done by meta_inject_if_section_regexp
Either the name of an abstract type that is required by all sections this is injected in, or '!' and the name of an abstract type that should not be parent of any of the sections that this section should be injected in. This further refines the selection done by meta_inject_if_section_regexp


Active Now
Interact with the AI
Start a conversation with Quadflow...
Start a conversation with Scorpion Edge...
View Github Repo
Uriel Bitton
Check us out on behance


TRNSMT festival to announce acts using ‘treasure hunt'
Music festival TRNSMT is set to use an “interactive treasure hunt” to announce its line-up for next year.
The Glasgow-based festival has said fans will be able to log on to its website on Tuesday at 4pm for the announcement.
Music lovers will be presented with clues to who the acts will be for next year’s Glasgow Green festival, due to take place from July 10-12.
Treasure hunters will be asked to solve clues on different locations and venues, with correct answers revealing the names to the acts who will headline next year.
To take part, fans will have to go to www.trnsmtfest.com at 4pm on Tuesday.
Participants will then be in with a chance to win free tickets to the event if they share the correct answer on social media.
The festival, due to take place for the fourth time next year, was seen as a replacement for T in the Park – which ended in 2016.
Event organisers have also announced plans to hold a special “Black Friday” sale on tickets, which will give those who have signed up to the TRNSMT database a discount on three-day tickets to the festival for one week, before another tier of tickets are released in early December.
Megastars such as Stormzy, Radiohead, Lewis Capaldi and the Killers have all performed at the Glasgow festival since it was first held in 2017.


Fortune telling teacups are decorated with tasseomantic divination guides and imagery. They depict zodiac symbols, tea leaf patterns, or playing cards. This list is not comprehensive; The Mystic Tea Room has an excellent and more complete list, although without images.
Some of these cups depict racial stereotypes and slurs which were commonplace for their time, which we present here because they are, however regrettably, a part of history.
{% for cup in cups %}{{ cup.props.identifier }}
{% if cup.props.main_image %}
{% endif %}
{% if cup.props.cup_image %}
{% endif %}
{% if cup.props.saucer_image %}
{% endif %}
{% if cup.props.mark_image %}
{% endif %}
{% if cup.props.content %}{{ cup.props.content | safe }}
{% endif %}- Name
- {{ cup.props.name }}
- Maker
- {{ cup.props.maker }}
- Year
- {{ cup.props.year }}
(Source)
{% endif %} {% endfor %}


{% extends 'base.html' %}
{% import 'macros.html' as macro%}
{% import "bootstrap/wtf.html" as wtf %}
{% block styles%}
{{ super() }}
{% endblock %}
{% block content %}
{{post.post|truncate(350)}}
a blog dedicated to Spanglophiles and Spanish learners, reflecting the thinking of an English teacher living in Madrid and learning Spanish. Melissa is a British expat who has always been passionate about Spanish life and culture. Even though she spends most of her time speaking and teaching English, she took up the challenge of learning Spanish. The reason she started her blog is to help expats who, like her, have moved to a Spanish-speaking country with a basic language level. Melissa shares her reviews, life experiences, and cultural reflections about Spain and whatever else has helped her in the language learning process. Cowbells and Chocolate Event in Switzerland © Cowbells and Chocolate American expat born in Florida, Lisa has been traveling a lot with her family since very young. When she was in high school, she met a Swiss foreign exchange student and fell in love. Following a five-year long-distance relationship including a couple of holiday trips, they got married and moved to Berne. That was the beginning of Lisa's new adventure that she shares on her blog Cowbells and Chocolate. For those looking for some background information about the Swiss way of life, beyond the clichés, it's the right place to be! From traditional Swiss recipes to jokes and learning the languages, she gives you a comprehensive insight about what life looks like in Switzerland. Some people juggle geese Culture in Singapore © Some people juggle geese Moving to Singapore came as a pleasant surprise for Lucy Day, an American expat. Born it Atlanta, she went to study in Chicago where she met her now husband. They graduated together and eventually got married in the USA. A few years later, her husband was awarded a post doctoral fellowship in Singapore and this is how began a new chapter of their life. Passionate about teaching, writing, and editing, Lucy Day holds a blog called Some people juggle geese where she talks about her everyday life, places she has visited, unusual things happening as part of the local culture, not to mention her views about Singlish, the local language.


For in-person tutoring, the meeting location must not exceed 30 minutes in transit time from the corner of North Federal Blvd and West 92nd Ave. Any additional time in transit will be charged at my standard tutoring rates.
A minimum session duration of one hour is required.
Lessons must be scheduled at least the day prior.
Payment is required via secure transfer through the Venmo application. Cash is acceptable for in-person tutoring.
Please contact me for a consultation prior to scheduling your first lesson. It is free of charge and will make the process smoother for both parties.
If you’re seeking help for a specialty topic, please mention that in the consultation. For instance, I may lack the expertise in Business Calculus that I have in standard Calculus.
Students should provide as much as information they can about their status in the class to aid in monitoring their progress. This includes syllabi, class outlines, homework lists, performance in previous courses, and homework/test scores throughout the semester.
Online sessions will require webcam and microphone to use with Skype and an online whiteboard.
My rates are as follows:
In-Person: $40 per hour
Online: $30 per hour


Our new website is under process
Subscribe here to get the latest updates of our website..
© 2018 Multi-Purpose Themes. All Rights Reserved.


/**
* @ngdoc Services
* @name $q
* @description
* Decorates the $q utility with additional methods used by formFor.
* @private
* This set of helper methods, small though they are, might be worth breaking apart into their own library?
*/
var qDecorator = function($delegate) {
/**
* Similar to $q.reject, this is a convenience method to create and resolve a Promise.
* @memberof $q
* @param {Object} data Value to resolve the promise with
* @returns {Promise} A resolved promise
*/
$delegate.resolve = function(data) {
var deferred = this.defer();
deferred.resolve(data);
return deferred.promise;
};
/**
* Similar to $q.all but waits for all promises to resolve/reject before resolving/rejecting.
* @memberof $q
* @param {Array} promises Array of promises
* @returns {Promise} A promise to be resolved or rejected once all of the observed promises complete
*/
$delegate.waitForAll = function(promises) {
var deferred = this.defer();
var results = [];
var counter = 0;
var errored = false;
var udpateResult = function(key, data) {
if (!results.hasOwnProperty(key)) {
results[key] = data;
counter--;
}
checkForDone();
};
var checkForDone = function() {
if (counter === 0) {
if (errored) {
deferred.reject(results);
} else {
deferred.resolve(results);
}
}
};
angular.forEach(promises, function(promise, key) {
counter++;
promise.then(
function(data) {
udpateResult(key, data);
},
function(data) {
errored = true;
udpateResult(key, data);
});
});
checkForDone(); // Handle empty Array
return deferred.promise;
};
return $delegate;
};
angular.module('formFor').config(
function($provide) {
$provide.decorator('$q', qDecorator);
});


Recode Converter
A modern & simple audio converter for video files
FFMPEG needs to be installed first to use this app
Download More download optionsFFMPEG needs to be installed first to use this app
Download More download optionsUnfortunately, Recode Converter is not signed for now (it costs money 😔). This is why your OS warns you of the potential risks of installing an unsigned app. But don't worry, installing Recode Converter is completely safe if you download it from here or the GitHub repository.
Yes. Recode Converter is using FFMPEG to convert files but it's not installed when you install Recode Converter. You have to install FFMPEG before you use the app.
Currently the supported audio codecs are: AAC, AC3 and EAC3.
The supported OS are Windows and macOS. Linux is not supported yet but it's planned.
Yes, there is more to come! You can find details here.
Don't be shy and open an issue on GitHub to let me know what is not working or to suggest a new feature. If you are a developer you can also contribute by proposing changes with a pull request.
Of course! Help is always welcome. Recode Converter is completely open source. More details can be found on the GitHub repository.
No! Recode Converter app does not collect any personal information at all.


§707-713 Reckless endangering in the first degree. (1) A person commits the offense of reckless endangering in the first degree if the person employs widely dangerous means in a manner which recklessly places another person in danger of death or serious bodily injury or intentionally fires a firearm in a manner which recklessly places another person in danger of death or serious bodily injury.
(2) Reckless endangering in the first degree is a class C felony. [L 1972, c 9, pt of §1; am L 1978, c 215, §1; am L 1988, c 285, §1; gen ch 1992]
Case Notes
Under §701-109(4)(a) and (c), reckless endangering in the first degree under this section is an included offense of attempted murder in the second degree under §707-701.5. 94 H. 513 (App.), 17 P.3d 862 (2001).
Cited: 55 H. 531, 534, 523 P.2d 299 (1974).


Cox's Bazar
5-day tour
World's largest sea beach
Cox's Bazar, Bangladesh
29th December, 2019
2 stops
25 people
Rangamati
2-day tour
See hills, hanging bridge, boat riding
Rangamati, Bangladesh
25th November 2019
2 stops
15 people
Sylhet
3-day tour
Enjoy tea garden, visit Jaflong and many more!
Sylhet, Bangladesh
January 2020
2 stops
30 people
Chittagong
3-day tour
Visit the beautiful places of Chittagong
Chittagong, Bangladesh
22th December, 2019
3 stops
20 people
Bandarban
4-day tour
Enjoy the great adventure!
Bandarban, Chittagong
11th January, 2020
3 stops
25 people
Saint Martin
4-day tour
Enjoy the beauty of nature!
Saint Martin, Bangladesh
18th July, 2010
3 stops
30 people


in.kncsolutions.dhelm.candlepattern.multiline
Classes
BearishAbandonedBaby
BearishSidebySideWhiteLines
BullishAbandonedBaby
BullishSidebySideWhiteLines
DownsideTasukiGap
EveningDojiStar
EveningStar
MorningDojiStar
MorningStar
RisingThreeMethod
ThreeBlackCrows
ThreeInsideDown
ThreeInsideUp
ThreeOutsideDown
ThreeOutsideUp
ThreeWhiteSoldiers
UpsideTasukiGap


--- title: SwinT keywords: fastai sidebar: home_sidebar summary: "Class for creating a Swin Transformer model" description: "Class for creating a Swin Transformer model" nb_path: "01_swin.ipynb" ---
The SwinT class can be used to create a Swin Transformer model, that can be used with the fastai library.
Let's see if this class returns a sequential model :
swint_ob = SwinT('swin_base_patch4_window7_224', pretrained = False, num_classes = 2)
swin_model = swint_ob.get_model()
assert isinstance(swin_model, nn.Sequential)
Any SwinT architecture, present in the timm library, can be used with transcv.


Sorry, you need to have at least three points to make a wager.
Maybe you can complete a target?
{{ question.text }}
So you think no-one else will know this? Why not put some points of your points on the line?


{% extends "base.html" %} {% block title%}Resume{% endblock %} {% block content%}
To apply my data analysis skills, school work in quantitative research, and experience with emerging technologies to draw conclusions from data and inform U.S. poh4cy decision makers.
Python and R
SPSS and Stata
SQL
Agile Development Process
Research Design
Quantitative Analysis
Data Visualization
HTML, CSS, and JavaScript
Git
Master of Science: Government Analytics
Capstone Project on using sentiment analysis to measure media bias
May 2018
Bachelor of Arts: Psychology
Minors: Mathematics, National Security Studies, and Political Science
Graduated with Honors May 2015
Developer, Full Time
November 2017 – Present
Digital Innovation Lab Intern, Full Time
March 2017 – November 2017
Software Tester and Special Update Point Person, Full Time
March 2016 – March 2017


Being Agile means your development team collaborates closely with the end users of your product to iterate quickly and roll out value in small chunks. This allows the software product to respond quickly to changing requirements and ensure that effort developing invalid solutions is minimized as much as feasible.
The most prevalent competing methodology to Agile is Waterfall. In that approach, the development process is strictly linear from requirements collection to end user delivery. This approach is typically less-favored because of the high risk to the value of the resulting solution which grows proportionally to the scale and timeline of the project.
Scrum is a popular framework in which development progress is managed. At a high level, a development team will have recurring work cycles known as "sprints" which typically last 2-3 weeks in length. These sprints are scoped narrowly enough so that some value can be delivered to users upon sprint completion.


| AdminBundleEvents | List of constant values for events dispatched in AdminBundle. |
| AdminUserEvent | |
| AdminUserTypeEvent | |
| AdvertisementEvent | |
| CityEvent | |
| CountryEvent | |
| LanguageEvent | |
| MedicalCenterEvent | |
| NewsEvent | |
| OfferedServiceEvent | |
| TreatmentEvent | |
| TreatmentProcedureEvent |


public class StateManager
extends java.lang.Object
| Modifier and Type | Class and Description |
|---|---|
static class |
StateManager.GameState |
| Modifier and Type | Field and Description |
|---|---|
static int |
framesInCurrentSecond |
static int |
framesInLastSecond |
static Game |
game |
static StateManager.GameState |
gameState |
static int |
gm |
static Leaderboard |
leaderBoard |
static LevelEditor |
levelEditor |
static MainMenu |
mainMenu |
static FloorGrid |
map |
static MapSelectScreen |
mapSelectScreen |
static long |
nextSecond |
static SplashScreenLoading |
splashScreenLoading |
static TestScreen |
testScreen |
| Constructor and Description |
|---|
StateManager() |
| Modifier and Type | Method and Description |
|---|---|
static void |
changeMap(FloorGrid newMap) |
static void |
setGameMode(int gamemode) |
static void |
setState(StateManager.GameState state)
Sets the state of the gameState variable.
|
static void |
tick()
Executes every time the game ticks
|
public static StateManager.GameState gameState
public static MainMenu mainMenu
public static Game game
public static LevelEditor levelEditor
public static Leaderboard leaderBoard
public static TestScreen testScreen
public static SplashScreenLoading splashScreenLoading
public static MapSelectScreen mapSelectScreen
public static FloorGrid map
public static long nextSecond
public static int framesInLastSecond
public static int framesInCurrentSecond
public static int gm
public static void tick()
public static void setState(StateManager.GameState state)
public static void changeMap(FloorGrid newMap)
public static void setGameMode(int gamemode)


English mastiff kong german shephard bang shake pomsky milk bone tail. Squeak toy release release kibbles pomeranian down roll over dog toy bark, doberman pinscher dog bone bell pit bull.

Pending Adoption


--- layout: post title: Installers in NServiceBus 3.0 date: 2012-01-26 10:21:18.000000000 +01:00 categories: - NServiceBus tags: [] status: publish type: post published: true meta: _edit_last: '1' dsq_thread_id: '553094500' author: login: andreas.ohlund email<EMAIL_ADDRESS>display_name: Andreas Öhlund first_name: Andreas last_name: "Öhlund" ---
In 3.0 we introduced the concept of installers to make sure that both infrastructure and endpoint specific artifact installed and configured automatically for you if needed.
The installers comes in two flavors, infrastructure installers and regular installers. Infrastructure installers are used for things that are not specific to a given endpoint eg. RavenDB, MSMQ. Regular installers are focused on setting up things that the current endpoint is depending on eg. queues, folders, databases etc. Infrastructure installers are always invoked before regular installers. Although the installers are mainly used internally you could use the for your own purposed as well. Perhaps you need to make sure folders are created, database scripts invoked etc etc.
To create your own installer is as easy as implementing the INeedToInstallInfrastructure<T> interface. The generic parameter gives you a way to restrict your installer to a specific platform. Currently this is either Windows or Azure. If you don't care about the environment use the INeedToInstallInfrastructure interface instead. To create a regular installer you just implement the INeedToInstallSomething<T> interface again using the T to restrict it to a specific environment.
NServiceBus will scan the assemblies in the runtime directory for installers so you don't need any code to register them.
When using the NServiceBus host installers are invoked as follows:
|
Installers invoked |
||
|
Command Line parameters |
Infrastructure |
Regular |
| /install NServiceBus.Production |
√ |
√ |
| NServiceBus.Production |
× |
× |
| /install NServiceBus.Integration |
√ |
√ |
| NServiceBus.Integration |
× |
√ |
| /install NServiceBus.Lite |
√ |
√ |
| NServiceBus.Lite |
× |
√ |
As you can see the installers are controlled by both the /install command line option to the host and the current profile used. You can of course implement your own profile if you have other requirements.
When self hosting NServiceBus you have to invoke the installers manually using:
{% gist 1681872 %}
A full example can be found here.
Finally there is one final way to run the infrastructure installers. If you invoke the host with the /installInfrastructure flag the host will run only the infrastructure installers for you without requiring you to configure anything. This can be useful when you setup a new server or a developer machine since that verifies and installs the required infrastructure for NServiceBus to run. The RunMeFirst.bat included in the download is doing just that.


Translations can be uses to override dropdown native property labels. those translatable properties are required to
binding into translations
property in dropdown global level configuration (within ng-dropdown scope),
in any developer preferred language. the properties that can be configure in translations are:
Let's see how each properties are behaves on different conditions in below Useful Properties section.
As mention in the introduction, translations can be override. by default translations are initialize to it's default
pre-set values. simply bind DropdownTranslations
type of object into translations property is enough to
take the the control over translations.
Properties that can be uses with dropdown translations will be discuss in this section in more details each by each.
noDataMessage: DropdownTranslations
This configuration is uses to set a message to show in dropdown body when on no data is available to display. by
providing a value to noDataMessage
will override the default no data message.
filterPlaceholder: DropdownTranslations
This configuration is uses to customize the placeholder text for dropdown when filterable
is
enabled. translation can be override by binding filterPlaceholder
string into DropdownTranslations
type of object.
selectPlaceholder: DropdownTranslations
This configuration is uses to customize the main text on top of the dropdown (select placeholder). translation can
be override by binding selectPlaceholder
string into DropdownTranslations
type of object.
selectedOptionWrapPlaceholder: DropdownTranslations
This configuration is uses to customize text which shows to indicate the selected wrapped options count. it can be
configure by binding a filterPlaceholder
string into DropdownTranslations
type of object.
For enable selected options wrapping, it is mandatory to set selectMode
to 'multi' and
wrapDisplaySelectLimit
should be less than the available option count. for more details about wrap
display selection limit please refer Option Selection Wrap Display Select
Limit section.
Please select two or more options from the dropdown to manipulate it's usages.