2009 Overview of the Enterprise Search Market
Last Updated Apr 2009
Miles Kehoe
For the last several years we???ve presented our analysis of the enterprise search vendors, and we???re excited to present our 2009 report covering the tier 1 and tier 2 commercial vendors, open source solutions, and search-related tools and utilities.
In this year???s overview, we???ll cover the following topics:
- The State of Enterprise Search
- The DNA of Search Technology Companies
- Leading Vendor Overview
- Vendors by Market
- Search Resources
- Looking forward in 2009... and beyond
We hope you will find our analysis helpful, and will let us know how we???re doing.
Our Criteria
Our findings are based on the information we gather from customers, press, and our own insight into the marketplace. However, unlike many other analysts, our observations are also based on first-hand experience with products ???in the wild??? ??? our real-world experience and observations of the products.
Regardless of the vendor, there really is no such thing as ???bad search???. Rather, we see customers having problems with search technology that doesn???t meet their needs ??? simply the wrong solution to the problem; or a problem with the customer???s methodology.
If you look at the Forrester Wave for Enterprise Search, or at the Garner Quadrant animated over the last few years here, you see the usual suspects: Autonomy, FAST, IBM, Endeca, Google and others. When we speak at shows like the Enterprise Search Summit about search vendor selection, I point out that there is an excellent chance attendees are using one of these upper-right quadrant technologies. What makes people thing that switching from one highly ranked technology to another highly rated technology will really solve the problem. Our experience is that methodology is the problem; and the good news is you can often change your methodology and not have to spend money on a new search technology!
The State of Enterprise Search
Enterprise search ??? the technology that drives intranet and customer facing content retrieval ??? is a dynamic and growing market. Not everyone is happy with the implementation, but as we???ve said over and over in our newsletter and at conferences, that???s more a problem with methodology than technology.
That said, we see two recent trends in enterprise search beginning to escalate: High level consolidation and low end commodatization.
Consolidation
If consolidation is a sign of a maturing industry, then we can say confidently that the enterprise search space is maturing. We???ve had small acquisitions going on for years, of course ??? check out the M & A page on our web site. But in the last few years we???re started noticing an interesting trend.
For quite a while, we had search companies like Autonomy, Verity, FAST, and Endeca; they sold search. Of course, search is only useful in the context of content, and most of the search technologies could hook up to just about any kind of data source including web, file systems and content management systems. Then we had content management companies like Documentum, Stellent, Vignette, and FileNet; typically they made deals to bundle some ???bare bones??? search technology from one of the search leaders. (We have to include SharePoint in this list, even though Microsoft is not a ???content management company???).
Do you notice an interesting thing about the companies just mentioned? The search companies and the content management companies are hooking up. Autonomy, after the Verity/Ultraseek acquisition, picked up content conglomerate Interwoven. Microsoft has acquired FAST for both its SharePoint market and beyond for corporate intranet search. IBM acquired FileNet. The exceptions here are Endeca, Vignette, and Documentum, which itself was acquired by storage array giant EMC.
This trend offers great promise for companies looking to make their content easier to find ??? rather than minimal search capability, we???re seeing the stage set for really great Enterprise Search 2.0 capabilities inside of content management systems. In some ways this trend increases the importance of really great federated search, because few companies have single repositories for all content in all divisions; so being able to easily access multiple of these ???islands of content??? will be critical across the corporation.
Finally, we???re seeing fewer and fewer ???high end??? search companies for those areas that have demanding search requirements including eDiscovery, pharma and biotech research, and even intelligence. Microsoft has announced its plans to maintain FAST ESP independent of SharePoint; and Autonomy, while building a risk management suite, still has a powerful search technology at its core. But will some newcomer focus on these demanding search needs with laser focus and surprise us all? Stay tuned???
Commoditization
[Top]At the high end of the market in terms of functionality and performance, vendors continue to command prices in-line with historic averages. However, a new trend has started: free and low-cost software that, while not as robust or capable, is pretty darned good.
The open source movement certainly has contributed to this trend in many areas of the software industry. Apache Project Lucene and Solr are the best known, but there are several other excellent quality open source search toolkits. Rather than impose limitations, theses open-source programs arrive with ???Developer Packaging??? rather than the ???Enterprise Packaging??? companies expect with most enterprise applications. And, with companies like Lucid Imagination recently receiving funding, we???d expect to see more of a move towards more traditional packaging and support.
Ironically, the open source programs are not the prime movers towards search becoming a commodity. The ultimate in low-cost commercial software comes from IBM and Microsoft. Both have introduced free search products that come with Enterprise Packaging??? like the high-end commercial software, albeit with license limitations on the number of documents allowed. But the price of this enterprise software is Zero. Zip. Free.
One sign of this commoditization of enterprise search software is the recently announced ESP for SharePoint, an interim solution on the way to fully integrated FAST ESP and SharePoint/ ESP for SharePoint is priced at $25K per server, plus maintenance. Granted there is a three server minimum, but in the real world you???d want at least three servers anyway ??? perhaps a development server and two load-balanced production servers. There are limits on the connectors that are available, and it requires Microsoft eCALs; but this packaging is only the first step towards rich feature set high end search moving into the low-cost range.
The DNA of Search Technology Companies
In the last few years, most major search vendors have technology that is applicable to a poad range of applications, although it seems that most tend to focus on only a few specific industries or markets. Sometimes this happens because of market opportunity ??? other vendors have not sold aggressively into a given vertical industry, for example. Other times it???s a function of the technology???s initial design. The researchers behind nearly all of these technologies started with a world view which heavily influenced the design of the product, and often this basic ???DNA??? remains with the product forever.
Consider Verity, acquired in 2005 by Autonomy. Verity started as a research project to bid on a large government intelligence project, the Automated Message Handling System (AMHS). The intelligence community needed a product that could route incoming message traffic the appropriate General or Admiral or Colonel based on the content of the message. Humans ??? often Tech Sergeants - had been doing this for years, and Verity in its Topic product provided a way to represent the acquired knowledge of these intelligence folks in software. The requirements: High speed content classification; a rich and hierarchical security model; last in, first out results; and short index latency. All of these requirements are deep in the kernel of the original Verity product Topic, and they remained as core design principles until the acquisition by Autonomy and subsequent replacement of the K2 kernel.
What the DNA of each product gives us is a way to classify the suitability of each product for a given application, if only as a first-pass in our minds when we first talk to prospective customers. Again, this is only an initial impression, but it helps us figure out what technologies might work best in a given environment and application.
For example, suppose your intranet looks a lot like a small version of the internet: lots of HTML and PDF documents, maybe mixed in with some office documents; lots of interlinks between your content; and all of you content, even from a database, is available from a specific URL. When we talk to a prospect with this kind of environment, we start thinking that the Google Search Appliance might be a likely candidate.
Let???s say you need a search engine for selling products on-line, and relevance to you means something like ???next Monday at 8AM, a query for a 8 megapixel camera that meets the user???s specifications should return a Canon, because Canon is going to give us an extra 2 points on each product we sell until Friday night at 6PM???. While many vendors can and do work fine in applications like this, we think of Endeca pretty early on in the discussion.
One more example: You have a terabytes of content of every type ??? office, database, HTML and more ??? and you want faceted navigation, entity extraction, and highly predictable scalability - we start thinking that FAST ESP may be a good fit.
[Top]Leading Vendor Overview
We tend to think of enterprise search vendors in tiers rather than quadrants or waves. You?????? find the usual suspects in Tier 1; these are the big vendors everyone knows, and the ones that have the strongest market presence across many industries and regions. Tier 2 vendors are those who are less well known, or whose strengths have thus far been limited to specific verticals or geographic regions. Note there is nothing inherently wrong with the technology in Tier 2 companies, and no reason to believe that the technology may well be able to handle even the most stringent of environments. Please remember that John Ruskin???s famous quote on using price alone as a buying criterion applies most directly to physical goods, but we encourage you to not make enterprise decisions based solely on price!
We???ll cover the overview in four areas:
- Tier 1 Vendors
- Tier 2 Vendors
- Other Commercial Offerings
- Low-Cost and Free Solutions
- Tools for Search
Let's have a look.
This year???s Tier 1 matches last year???s list exactly, with two exceptions: First, FAST Search is now a wholly owned subsidiary of Microsoft, which includes the bonus that the latter is now a Tier 1 player; and Exalead, a niche player in the US, has entered the US market with a new US Headquarters in California and with a rich, scalable technology ??? desktop to internet.
Autonomy
While Autonomy IDOL clearly remains one of the top search kernels, the company seems to be continuing its move ???beyond search??? to include many of the applications associated with risk management and compliance. Their suite of applications and modules that work together with the IDOL core technology at the center include Aungate, Etalk, Echo, Meridio, Virage and recently ZANTAZ; and together, these place Autonomy beyond ???simply search??? into a much poader market. Read more about our Autonomy Practice on our web site.
Endeca
While Endeca has a number of enterprise, government, and lipary customers, we also think of them as the leader in eCommerce search. The only privately held company among the Tier 1 players, Endeca has built a name for itself with their Information Access platform by innovating search to support relevance based on business rules with Guided Navigation?? and Content Spotlighting???. Read more about Endeca on our site.
Exalead
The new entry into our Tier 1 list, this French company has opened a US operation to make a big push into the North American market. While we list Exalead as a challenger, feel they belong in the top tier: Their technology drives a web portal , which includes the richest of enterprise capabilities on the scale of the web.
FAST/Microsoft
The newly combined team of FAST ESP and Microsoft puts both companies in even a stronger position than last year; and they are a formidable player in search and content management. Some question whether the combination will be successful over time; but FAST???s ESP with Microsoft???s penchant to ???document, document, and document??? will pay off for new and existing FAST customers. Read about our FAST Practice on our web site.
The best known of the Tier 1 players, the Google Mini and the Google Search Appliance certainly have made strides in the enterprise. Google has put together a strong solution for the enterprise search market by providing features like database indexing and security, along with innovative features like the ???wiki results???. As with the other Tier 1 companies, we partner with Google and, in many environments, find it a pretty darned good enterprise solution. But while users may ask ???Why not just use Google???, it???s not that simple and it???s not always the best answer for every search requirement. Read about our Google Practice on our web site.
We???ve trimmed the Tier 2 list for this year, removing companies like Intellisearch, which seems to have exited the US market, and adding newcomers Attivio is the same as last year, but that doesn???t mean these companies have not been making strides. Attivio is a newcomer to the market
Attivio
A newcomer in search, Attivio combines enterprise search with traditional relational structure to facilitate queries with "SQL-like" results. Attivio uses some Lucene-based technology and has a number of former FAST employees on staff.
Dieselpoint
A solid pure-Java-based search technology, Dieselpoint Search is solid, full-featured, and a strong contender for eCommerce and enterprise search, especially for companies that need or want the flexibility of a product that is hardware neutral. DieselPoint has extensive reporting and a strong promotions module. They are also creators of the proposed Open Pipeline standard we hope other vendors will adopt.
IBM
This well-known giant has a number of search technologies, from the free IBM/Yahoo! search discussed below to mainframe engines. We think the technology they acquired from iPhrase in 2007 and marketed as IBM OmniFind Discovery Edition is among the most interesting technologies out there. One of the features we like best is the ability to integrate business rules into the query processing, and as the scalability and feature set grows it could move IBM into our Established Player category.
ISYS
ISYS is a successful Australian company with a new executive team in the United States and the ISYS:web product line. The technology is straightforward and capable, and has been quite successful marketing to companies, government agencies, and law enforcement. We recently published an interview we did with a new ISYS customer who is quite happy with his selection.
Recommind
A solid search technology for enterprise search, Recommind's MindServer is based on technology that recognizes context and concept search to deliver meaningful, high quality results. While the technology is applicable to enterprise search requirements, Recommind has enjoyed the most success among legal and eDiscovery applications.
Thunderstone
A long-established name in search, Thunderstone continues to enjoy limited success in the enterprise market. They offer a quite innovative line of products, including a search appliance which includes their TEXIS search product. Thunderstone features a relational model search technology with commit points and roll-back indexing with a rich scripting language, and seems to be a promising technology.
Vivisimo
Originally a clustering technology for federated search still available at http://www.clusty.com, Vivisimo has grown into a solid full-capability search platform with a number of key public customer sites including http://usasearch.gov and the National Lipary of Medicine http://www.nlm.nih.gov/. Vivisimo is moving into social search with Enterprise Search 2.0 methodology.
ZyLabs
An interesting vendor which shows well in other analysts??? findings, and they seem to have string presence in government and non-profit markets. Nonetheless, the do not seem to be a major enterprise player, at least in the markets we work with.
We see vendors including dtSearch, Siderean Systems, and X1 positioned as enterprise solutions, but we still see these as niche players that are not yet enjoying the enterprise audience. These are generally solid, well-established companies, so don???t disqualify them from your search until you???re sure they don???t fit your requirements.
This year we also want to mention a newcomer in search, MyRoar. Formed by technical folks who understand the financial services market, MyRoar is a natural language question machine. They claim that their technology does not need to be trained like vendors InQuira and Q-Go; we???re hopeful to do more with them this year so we can report back on our findings.
SLI Systems is a hoisted search technology that provides enterprise search for public-facing content. Their real strength is their ability to link pubic search engine rankings with your own public-facing search: think of it as enterprise search meets public SEO.
Low-cost and Free Solutions
Lucene
One of two related Apache Software Foundation search projects, Lucene is perhaps the best known of open source search toolkits. While the original Lucene was written in Java, it has been ported to virtually all major languages and platforms, and is probably on more web sites than any other technology. Large companies like IBM have invested heavily in Lucene, and I expect we'll see increasingly capable versions over the coming years.
Solr
Another Appache project, Solr, based on Lucene, provides a higher level API and more functionality than its parent including term highlighting, faceted search, and a simple administration console. The Solr toolkit, which runs in a Java servlett container such as Tomcat, lets you submit XML-structured records, a vast improvement over the low level calls in Lucene.
IBM/Yahoo
These two giants have teamed up to deliver an excellent free search platform for organizations with no more than 500,000 documents to be indexed. Packaged as the IBM Omnifind Yahoo! edition, it features a rich powser-based administrative console comparable to those in the best commercial products to control indexing, thesaurus/spelling suggestions and rudimentary search analytics. http://omnifind.ibm.yahoo.net/
Google Site Search
Google has introduced a low-cost hosted solution for public-web-based web sites called Google Site Search. Like hosted search companies like as SearchBotton.com, Google Site Search lets you add a free search to your public web content and display results with no ads and with full control over what users see. Pricing starts at $100 per year for up to 5000 web pages, and is, of course, powered by Google. http://www.google.com/sitesearch/
Search Server Express
A limited capacity version of Microsoft's Search server, Express is quite sufficient as a stand-alone search technology. The engine installs with a SQL Server Express, which limits search fo 2.5M documents, probably quite sufficient for many web and departmental applications.
There are so many categories of tools and utilities for enterprise search that sometimes it???s hard to keep them straight. Here???s a high-level view.
Federators
MuseGlobal
If you use a vendor-supplied federator, chances are good you're using MuseGlobal technology. MuseGlobal markets their products and framework - which includes over 6000 connectors - to most of the large enterprise search vendors and to companies that need to syntactic and semantic processing of multiple content feeds. Find them at www.museglobal.com/
Grokker
A San Francisco-based company that provides a combination of search result federation and results visualization, Grokker has a very cool product that lets you see visual clusters of terms from a number of sites. Grokker works with just about any search technology, and has a very cool demo on the public web site. Find Grokker on the web at http://www.grokker.com/.
Deep Web Technologies
Created by one of the earliest Verity employees, Deep Web has an impressive federation product that can create really great facet-like topics to effectively drill down into results from multiple web sites. Deep Web supports public and secure data, and handles all the details enterprises need to have. They have a number of excellent demos linked to from their home page at http://www.deepwebtech.com/.
Raritan Technologies
Based in New Jersey, Raritan has an excellent federation product which includes the ability to search directly from the research pane in the Microsoft Office suite of applications. Find them at http://www.raritantechnologies.com/.
Search Analytics and Promotion
[Top]We???d be remiss if we didn???t list our own SearchTrack product, the first to directly link great search results analytics to best bets and result boosting. Like most search-related utilities, SearchTrack logs activity to relational database systems for performance, and can work with any search vendor. You can add reporting and boosting to even the most basic search ??? call us today at +1-408-446-3460.
Vendors by Market
Based on our methodology, our experience with the vendors and their DNA, we???ve identified a handful of key markets for search technology. These, and the companies we see as leaders in each, are included in the figure below as the NIE Industry Grid for 2009.
NIE Industry Grid for 2009
|
Compliance/eDiscovery
|
eCommerce
|
Vertical Search/Public Portals
|
|
Government/Law Enforcement
|
Enterprise/Intranet
|
Customer Support
|
|
CMS Search
|
OEM/Bundled
|
Hosted
|
The order of vendors in each market is based on the position they have based again on our methodology and analysis. However, remember that just about every technology can fit ??? sometimes pretty darned well ??? in just about any industry. Sometimes this will require extra consulting or product add-ons to customize a given technology to a specific market/application: as they say in the software industry, it???s SMOP ??? a small matter of programming. Or even better, SMOM: a small matter of methodology.
Search Resources
There are a number of resources on the web and beyond for business and technology assistance on the web. Here are a few of our favorites, along with some we run or moderate.
User Forums
SearchDev.org: The independent search developer's forum. A forum on the business and technology of search.
SearchDev also has two technical forums for detailed vendor-specific questions dealing with everything from coding and scripting to problem resolution, with more in the works:
LinkedIn Groups
Enterprise Search Engine Professionals Group: A fast-growing LinkedIn group for people working in or involved with enterprise search in corporate environments worldwide. Search for it under the Groups menu.
Enterprise Search Summit Group: A new group run by Michelle Manafy at Information Today which will provide industry news and information as well as details and podcasts about upcoming EDD events.
Newsletters
Enterprise Search Newsletter: Produced by New Idea Engineering, this newsletter covers both business and technical issues of search, generally at a more detailed technical level. It covers all vendors, provides advice for improving your search, and includes Ask Dr Search who answers technical questions from subscribers.
Blogs
Enterprise Search Blog: A blog produced by New Idea Engineering that covers all topics around the business and technology of enterprise search including opinion, news, events and more.
The Noisy Channel: This insightful blog, run by Daniel Tunkelang, CTO of Endeca, has a perspective on technology of enterprise search from someone who knows search from the ground up.
Beyond Search: Run by search guru Steve Arnold, Beyond Search contains news, interviews, and opinion on the search market delivered
SearchTools: Avi Rappoport runs this blog which summarizes new content from her website http://searchtools.com/ which covers almost every search technology known to mankind!
SLI Systems Blog: Hosted search service SLI Systems provides a newsletter that talks about the kinds of problems they see in working with their customers. http://www.sli-systems.com/newsletter.php
FAST Forward Blog: A blog run by FAST Search staffed by FAST, Microsoft, and independent bloggers who write about search and IT issues at http://www.fastforwardblog.com/.
Attivio:The search vendor has a useful blog at that had good general information as well as Attivio-specific material.
Mark Logic Blog: Written by CEO Dave Kellogg, who shares interesting information about technology. A fun read, and always informative.
Vivisimo Blog: Vivisimo runs the 'Search Done Right ' blog that provides great background information on enterprise search. Like Attivio's blog, it has good information that anyone can benefit from.
Two other blogs i find most interesting are not directly related to enterprise search, but I find good value when I follow them:
Andrew McAfee, a Professor at Harvard Business School. writes about IT issues, and he always has interesting material.
John Battelle, author of 'The Search...', has an interesting blog as well, and it's always fun to follow what he's doing.
Trade Shows
Enterprise Search Summit New York: Every May, Information Today sponsors the premier show for enterprise search in New York City. If you only go to one show a year, this is the one to go to. That's also the advice we give to new vendors entering the marketplace. We'll be back again this year, speaking about how you can save money by making your existing search engine work rather than replace it. By the way, you can listen to a preview of our talk, as well as talks by other speakers including Matt Brown of Forrester and Sid Probstein of Attivio.
Search Engine Meeting: Search Engine Meeting in an interesting show run by Infonortics from the UK. In its 14th year, this year's show returns to Boston in April 27-28; see you there!
[Top]
Looking forward in 2009 - and beyond
Enterprise search is a hot field now, and the companies in the space are competing ha


{% load staticfiles %}
Notice: Docket Wrench is approaching its end of life, and will be retired on December 1st, 2015. Learn more »


Skyfire 2012
Maintaining their excellence, Team 254 came ready to uphold their reputation at FRC’s Rebound Rumble with their robot, Skyfire. As finalists at the Central Valley Regional and victors at the Silicon Valley Regional, the team showcased their skill and engineering, ending as finalists in the Curie Division at the FRC World Championship.


| I l@ve RuBoard |
Be astonished, O ye heavens, at this, and be horribly afraid…
Jeremiah 2:12
A company announces record profits, and its share price drops 20%. The financial news that night explains that the company failed to meet analysts' expectations. A child opens an expensive Christmas present and bursts into tears—it wasn't the cheap doll the child was hoping for. A project team works miracles to implement a phenomenally complex application, only to have it shunned by its users because it doesn't have a help system.
In an abstract sense, an application is successful if it correctly implements its specifications. Unfortunately, this pays only abstract bills.
In reality, the success of a project is measured by how well it meets the expectations of its users. A project that falls below their expectations is deemed a failure, no matter how good the deliverable is in absolute terms. However, like the parent of the child expecting the cheap doll, go too far and you'll be a failure, too.
Tip 69
Gently Exceed Your Users' Expectations
However, the execution of this tip requires some work.
Users initially come to you with some vision of what they want. It may be incomplete, inconsistent, or technically impossible, but it is theirs, and, like the child at Christmas, they have some emotion invested in it. You cannot just ignore it.
As your understanding of their needs develops, you'll find areas where their expectations cannot be met, or where their expectations are perhaps too conservative. Part of your role is to communicate this.  And do this throughout the development process. Never lose sight of the business problems your application is intended to solve.
Some consultants call this process "managing expectations"—actively controlling what users should hope to get from their systems. We think this is a somewhat elitist position. Our role is not to control the hopes of our users. Instead, we need to work with them to come to a common understanding of the development process and the final deliverable, along with those expectations they have not yet verbalized. If the team is communicating fluently with the outside world, this process is almost automatic; everyone should understand what's expected and how it will be built.
There are some important techniques that can be used to facilitate this process. Of these, Tracer Bullets, and Prototypes and Post-it Notes, are the most important. Both let the team construct something that the user can see. Both are ideal ways of communicating your understanding of their requirements. And both let you and your users practice communicating with each other.
If you work closely with your users, sharing their expectations and communicating what you're doing, then there will be few surprises when the project gets delivered.
This is a BAD THING. Try to surprise your users. Not scare them, mind you, but delight them.
Give them that little bit more than they were expecting. The extra bit of effort it requires to add some user-oriented feature to the system will pay for itself time and time again in goodwill.
Listen to your users as the project progresses for clues about what features would really delight them. Some things you can add relatively easily that look good to the average user include:
Balloon or ToolTip help
Keyboard shortcuts
A quick reference guide as a supplement to the user's manual
Colorization
Log file analyzers
Automated installation
Tools for checking the integrity of the system
The ability to run multiple versions of the system for training
A splash screen customized for their organization
All of these things are relatively superficial, and don't really overburden the system with feature bloat. However, each tells your users that the development team cared about producing a great system, one that was intended for real use. Just remember not to break the system adding these new features.
Sometimes the toughest critics of a project are the people who worked on it. Have you ever experienced disappointment that your own expectations weren't met by something you produced? How could that be? Maybe there's more than logic at work here.
What do your users comment on when you deliver software? Is their attention to the various areas of the application proportional to the effort you invested in each? What delights them?
| I l@ve RuBoard |


Image Gallery
Try resizing the window to see what happens when the images does not have enough room.


Here is how TransLink will refund your compass card during the bus strike
by Elana ShepertEarlier today, TransLink offered a number of suggestions for its customers who typically ride the bus or SeaBus to work, as well as a credit as a credit for monthly passholders who do not use their Compass accounts during the three-day transit strike.
The transit authority notes that customers will automatically have pro-rated Stored Value credit applied to their Compass accounts. However, they might not see them right away.
“Customers won’t see the credit until they tap in again,” notes Ben Murphy, Senior Media Relations Advisor, TransLink. “Once they do, they’ll be able to see it.”
Murphy stated that customers will be credited back the value of a day’s fare relative to the type of pass they purchased. For example, a one zone pass, which costs $98, would be divided by 30 days to get the per diem credit value. This value is roughly $3.27, which the customer would be automatically credited if they don’t use their card.
“The credits work on a daily basis, so as soon as someone taps in, they’ll be able to see the previous day’s credit.”
The ‘complete transit shutdown’ is slated to last for three days commencing Wednesday. With this in mind, Coast Mountain Bus Company and Unifor will return to the bargaining table tomorrow.
Gavin McGarrigle, Unifor’s lead negotiator, says the union is prepared to negotiate until midnight Wednesday and if no agreement is reached, a three-day strike will begin, affecting about 350,000 transit users.


| Modifier and Type | Method and Description |
|---|---|
MyFoodora |
Manager.getMyFoodora() |
static MyFoodora |
MyFoodora.loadMyFoodora() |
| Modifier and Type | Method and Description |
|---|---|
void |
Courier.acceptDeliveryCall(boolean decision,
Order waitingOrder,
MyFoodora myFoodora)
accept or refuse a delivery call for a waiting order
|
void |
FastestDeliveryPolicy.allocateCourierToOrder(MyFoodora myFoodora,
Order order)
Allocates a courier to the order according to the fastest delivery
|
void |
FairOccupationDeliveryPolicy.allocateCourierToOrder(MyFoodora myFoodora,
Order order) |
void |
DeliveryPolicy.allocateCourierToOrder(MyFoodora myFoodora,
Order order)
Allocates a courier to the order according to one of the two policy : fastest delivery or fair-occupation delivery
|
java.util.ArrayList<Order> |
Customer.getHistoryOfOrders(MyFoodora myFoodora)
gets the history of all the orders the customer made on MyFoodora
|
double |
TargetProfitPolicyServiceFee.meetTargetProfit(MyFoodora myFoodora,
double targetProfit)
Sets the service fee
based on last month income
to meet a target profit given the formula : profitForOneOrder = orderPrice * markupPercentage + serviceFee - deliveryCost
|
double |
TargetProfitPolicyMarkup.meetTargetProfit(MyFoodora myFoodora,
double targetProfit)
Sets the markup percentage
based on last month income
to meet a target profit given the formula : profitForOneOrder = orderPrice * markupPercentage + serviceFee - deliveryCost
|
double |
TargetProfitPolicyDeliveryCost.meetTargetProfit(MyFoodora myFoodora,
double targetProfit)
Sets the delivery cost
based on last month income
to meet a target profit given the formula : profitForOneOrder = orderPrice * markupPercentage + serviceFee - deliveryCost
|
double |
TargetProfitPolicy.meetTargetProfit(MyFoodora myFoodora,
double targetProfit)
compute the value of one of the profit related information (service fee, markup percentage or delivery cost) to meet a target profit
based on last month income
given the formula : profitForOneOrder = orderPrice * markupPercentage + serviceFee - deliveryCost
|
void |
UserFactory.registerUser(java.lang.String userType,
java.lang.String name,
java.lang.String surname,
java.lang.String userName,
java.lang.String password,
MyFoodora myFoodora)
register a new user in the my Foodora system
|
void |
Restaurant.setMealOfTheWeek(java.lang.String mealName,
MyFoodora myFoodora)
sets the new Meal of the week
|
void |
Manager.setMyFoodora(MyFoodora myFoodora) |
void |
Order.submit(boolean applyReduction,
MyFoodora myFoodora)
when the order is validated
we allocate a courier and put the order on his board
we increase the counter of the restaurant
we increase all the counters of the picked items
we compute the price of the order according to a eventual reduction
if necessary we add the fidelity points to the card of the customer
|
void |
Customer.submitOrder(Order order,
boolean applyReduction,
MyFoodora myFoodora)
submits the completed order to myFoodora
|
void |
User.unregister(MyFoodora myFoodora)
unregister the user from the system
|
void |
Order.validateOrderByCourier(MyFoodora myFoodora)
indicate that the courier has accepted the delivery call of this order
the order is then completed
|
| Constructor and Description |
|---|
Manager(java.lang.String name,
java.lang.String surname,
java.lang.String userName,
java.lang.String password,
MyFoodora myFoodora)
creates a manager who will manage the MyFoodora platform
|


| Top left
(two lines expression) paragraph done |
Top right |
| Bottom left | Bottom right |
Subsampling is shown there:
|
2 | ||||
| 3 dflkj lkjfl dkjldkfjl flk jflkf lkjflkj ljlf ajlfj alff h khg hgj gjg jg gjhfg fg gjh gjf jgf jgj f gjfgj kfajg | 4
gh gfh gh hg 5 |
This is "default" table - with no sizes givev:
| Hello | lkfdsjlk fj dlfj lkfj lkjflk jlfk lk fjlk elwkf lkejflek f jlekjflkj ljlk lk jlkf lefjl j flkj ljl lf lfj lfjl lj lwe lekf;eh kfejh lkh kjh kjhkj hkj hkj lkh kjh kjlh kj | shortebn formo lr lk | djsf lkjlf poer oi pjr po kpk |
| a | b | c | d |
| 1 | 2 | 3 | |
| A | B |
| Error: | Sex sells better than truth and honour | X For President is my agenda! | |
| Command: | Go out and spread the word, we shall prevail! | X |
| Error: | Sex sells better than truth and honour | X For President is my agenda! | |
| Command: | Go out and spread the word, we shall prevail! | X |
| Error: | Sex sells better than truth and honour | X For President is my agenda! | |
| Command: | Go out and spread the word, we shall prevail! | X |
| Error: |
|
X For President is my agenda! | |||||||||
| Command: | Go out and spread the word, we shall prevail! | X |
|
Really, a test! |


Imagine if I gave you instructions to go to a certain address: 1600 Pennsylvania Ave NW, Washington, DC 20500. For most of us, this address is an unfamiliar one and without GPS it would be be a pain to find out where it is. Instead, how much easier would it be if I gave you its more commonly known name "The White House"? Suddenly, everyone knows exactly where it is.
A domain name is like a nickname or a label for an address, specifically an IP address. The problem with IP addresses is they are ugly and difficult to tell apart which is where domain names come in. It's much easier to remember google.com instead of <IP_ADDRESS> (putting this in your browser will take you to google.com).
Technically speaking, no difference really. Websites with .com are most common, and therefore are most wanted. You can't own a .gov website though, unless you're part of the government. There are many other options, such as .pizza.
Generally, however much someone is willing to pay for it. A domain name like ilovecats.pizza is probably worth a dollar a year. A regular domain name like mycompanywebsite.com is generally ten dollars or more a year and a famous domain name like amazon.com is probably worth millions.
Because of domain squatting. It's the practice of people purchasing and registering commonly used domains and sitting on them for years in hopes that someone will come along and pay up to thousands of dollars for it.


Hogarth Davies Lloyd is a Global Executive Search firm with offices in London, New York, Stockholm and Calgary. Established in 1995 by former banking and finance professionals, the firm has grown to become one of the pre-eminent providers of Executive Search services across Asset Management, Equities, Fixed Income, Currencies and Commodities, Investment Banking, Legal, Compliance & Regulatory, Private Banking and Wealth Management.
Hogarth Davies Lloyd is proud to work with a broad cross-section of clients including Major Global Investment Banks, Asset Managers, Hedge Funds, Sovereign Wealth Funds, Private Equity Firms, Commodity Trading Houses, Energy Companies and Major Non-Financial Corporations.
We operate a client focused approach across all projects that we undertake and we always seek to forge long-term partnerships with our clients. It is crucial for us to understand our clients' businesses, cultures, philosophies and strategies given our market facing role when engaging with and attracting the highest calibre candidates and businesses.
Hogarth Davies Lloyd has a proven and successful track record of working as a trusted adviser alongside our Financial Services clients and assisting them with everything from extensive strategic business build-outs to identifying specialists with unique skill sets to fill crucial niche roles.
We have invested significantly over the years in developing our research capabilities as well as our extensive network of industry contacts and we are frequently mandated by our clients to produce comprehensive business intelligence and market analysis documents in addition to our more traditional recruitment services.


Answer a few questions to identify which language track might be best for you
, you should check out but you leaned toward


Jagan launches anti-corruption helpline
Officials told to act on complaints within 30 days
by Staff ReporterChief Minister Y.S. Jagan Mohan Reddy on Monday launched Citizens’ Help Centre, 14400, to register complaints on corruption at his camp office on Monday. People can lodge complaints relating to corruption on this toll-free number. The process of investigation into the complaints and follow-up action will be completed in 15-30 days.
Mr. Jagan also released posters in English and Telugu to bring awareness among the public on the helpline. The main slogan on the poster reads: “Let’s join hands to eradicate corruption and the like.”
After the launch, the Chief Minister called the helpline and enquired about its functioning.
He directed the officials to complete the investigation into the complaints within the stipulated period without fail.
A promise kept
Minister for municipal administration Botcha Satyanarayana and DGP Goutham Sawang were among those present. It may be recalled that Mr. Jagan addressing the gathering after the swearing-in ceremony had announced that a call centre would be opened at the Chief Minister's Office (CMO) for the convenience of the public, who have grievances relating to graft, discrimination or on not receiving the benefits of government schemes.
This is among the several measures being taken by the Jagan Mohan Reddy government in addition to those in the party manifesto.


The path on the DC/OS cluster agent nodes to store the docker credentials archive docker.tar.gz
.
Only absolute path is allowed here. Environment variable substitution is enabled for the path input. Due to
the limitation in the underlying Mesos fetcher used by Marathon, special characters that need URI escaping
and the character set {single quote ('), back slash (\), nul (\0)}, are not allowed in the path, otherwise
it will fail to load the resource before running the container.
If not specified, the plugin will generate a path specific for the build with the following pattern.
/home/<linuxAdminUser>/acs-plugin-dcos.docker/<unique-name-generated-for-the-build>
The plugin will generate the docker credentials archive with the credentials provided, and upload the archive to the given path for all the agents. You can use it to construct the URI used in your Marathon application definition.
"uris": [
"file://<filled-path>/docker.tar.gz"
]
The URI will be exposed with the environment variable $MARATHON_DOCKER_CFG_ARCHIVE_URI
. You can
use this in your Marathon application definition when the "Enable Variable Substitution in Config" option
is enabled. This helps when the upload path is not filled and generated by the build, or if the path changes
frequently.
Note that if an archive exists in the target path already, the build will overwrite that file.
Reference: Marathon: Using a Private Docker Registry


Pastanaga provides scss classes for building tables based on grid layout. Those classes are available in pastanaga-angular/src/styles/_tables.scss .
Pastanaga provides also some components and directives for building such tables more easily.
For basic tables:pa-table-header
,
pa-table-sortable-header
,
pa-table-row
, and
pa-table-row-header
pa-table-header
: directive simply wrapping table header cells. It can contain
pa-table-cell
and
pa-table-cell-menu
pa-table-row-header
: it renders as a full width row, displaying a label. Free content.
pa-table-cell
,
pa-table-cell-menu
and
table-lead-cell-multi-line
pa-table-cell-menu
: extends
pa-table-cell
component, and renders as a cell with content centered. This kind of cell is meant to wrap a
pa-button
, on which specific style is applied on hover and when active.
On mobile, there is usually not enough space to display a table with several columns. So Pastanaga provides a
component
pa-table-lead-cell-multi-line
and some directives to display the most important information of a row in one cell.
Even though it was designed with mobile tables in mind, this component can be used as a cell in any table row.
pa-table-lead-image
: directive wrapping the image to be displayed
pa-table-lead-title
: directive wrapping the title to be displayed
pa-table-lead-description
: directive wrapping the description to be displayed


Let G be a maximal plane graph. A Schnyder realizer S of G
is a partition of the internal edges of G into three sets T1, T2, T3
of directed edges, so that for each interior vertex v, the following
conditions hold :
(a) v has out-degree exactly one in each of T1, T2 and T3,
(b) the clockwise order of edges incident to v is :
outgoing T1, incoming T2, outgoing T3,
incoming T1, outgoing T2, incoming T3
(each entering block may be empty)
A triangular graph and its schnyder realizer
Embedding
Embedding
Example :
[3,2,1],
[0,2,3],
[0,3,1],
[0,1,2]
which represents this graph :


Pizza Order Form
Large:$12
Medium:$10
Small:$8
Large
Medium
Small
Toppings $1 each:
Peperoni
Ham
Bacon
Xtra Cheese
Green Peppers
Pinapple
Garlic
Chicken
Qty:
Order
Orders:


This is a Mandrill to SparkPost template translation service. From here you can translate a template from file or migrate one directly from your Mandrill account into SparkPost.
MIGRATE A TEMPLATE » TRANSLATE TEMPLATE TEXT »
`x < 10`


Coming Soon!
Ready to get started? That's great! Send us an email or connect on LinkedIn and we will get back to you as soon as possible!


I’ve been drinking Maté for about a year now, as a better alternative for coffee (which gave me stomachaches). Browsing online, as I often do, I read about another way to prepare my mate, grinding it and pouring it through a coffee filter.
I had about five “doses” left, so I grinded it all up, put it in a mug, which was filled for about a quarter with the powder, added boiling water and left it to soak for 5-10 minutes and I poured it through the coffee filter. The tea was brown instead of green-brownish and smelled very strong. I drank it all up in about a minute or so, five minutes later I felt that the caffeine started to have its effects on me. What struck me as odd was that I didn’t get a shaky sensation as I usually do, not a lot of physical energy, but my fingertips and toes started to get numb. My heart rate didn’t increase as I expected, but the strange thing was that I started to have muscular spasms: painful cramps in my shoulders and lower back as I stretched out, as I walked up the stairs my legs hurt… I can’t think of any other reason why this happened, but the mate.
I’ve never believed people claiming that they got high on mate, but I’m having second thoughts, since I felt some tickles in my toes and fingers, felt relaxed, yet alert and awake. I wasn’t really high as in another state of mind, or extremely happy, but I wasn’t quite myself either. Time did seem to pass slower, and I was more productive.
I guess all I can say is that grinded maté really is more potent, but if I take to much, there is a downside.
On the plus side, compared to coffee, a “mate overdose” doesn’t make me feel sick, nervous, sweaty and trembling, if you have the choice, choose wise, choose mate!
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


| Top |
This class contains a set of options for launching child processes, such as where its standard input and output will be directed, the argument list, the environment, and more.
While the GSubprocess class has high level functions covering popular cases, use of this class allows access to more advanced options. It can also be used to launch multiple subprocesses with a similar configuration.
GSubprocessLauncher *
g_subprocess_launcher_new (GSubprocessFlags flags
);
Creates a new GSubprocessLauncher.
The launcher is created with the default options. A copy of the environment of the calling process is made at the time of this call and will be used as the environment that the process is launched in.
Since 2.40
GSubprocess * g_subprocess_launcher_spawn (GSubprocessLauncher *self
,GError **error
,const gchar *argv0
,...
);
Creates a GSubprocess given a provided varargs list of arguments.
Since 2.40
GSubprocess * g_subprocess_launcher_spawnv (GSubprocessLauncher *self
,const gchar * const *argv
,GError **error
);
Creates a GSubprocess given a provided array of arguments.
self |
||
argv |
Command line arguments. |
[array zero-terminated=1][element-type utf8] |
error |
Error |
Since 2.40
void g_subprocess_launcher_set_environ (GSubprocessLauncher *self
,gchar **env
);
Replace the entire environment of processes launched from this launcher with the given 'environ' variable.
Typically you will build this variable by using g_listenv()
to copy
the process 'environ' and using the functions g_environ_setenv()
,
g_environ_unsetenv()
, etc.
As an alternative, you can use g_subprocess_launcher_setenv()
,
g_subprocess_launcher_unsetenv()
, etc.
All strings in this array are expected to be in the GLib file name encoding. On UNIX, this means that they can be arbitrary byte strings. On Windows, they should be in UTF-8.
Since 2.40
void g_subprocess_launcher_setenv (GSubprocessLauncher *self
,const gchar *variable
,const gchar *value
,gboolean overwrite
);
Sets the environment variable variable
in the environment of
processes launched from this launcher.
Both the variable's name and value should be in the GLib file name encoding. On UNIX, this means that they can be arbitrary byte strings. On Windows, they should be in UTF-8.
self |
||
variable |
the environment variable to set, must not contain '=' |
|
value |
the new value for the variable |
|
overwrite |
whether to change the variable if it already exists |
Since 2.40
void g_subprocess_launcher_unsetenv (GSubprocessLauncher *self
,const gchar *variable
);
Removes the environment variable variable
from the environment of
processes launched from this launcher.
The variable name should be in the GLib file name encoding. On UNIX, this means that they can be arbitrary byte strings. On Windows, they should be in UTF-8.
Since 2.40
const gchar * g_subprocess_launcher_getenv (GSubprocessLauncher *self
,const gchar *variable
);
Returns the value of the environment variable variable
in the
environment of processes launched from this launcher.
The returned string is in the GLib file name encoding. On UNIX, this means that it can be an arbitrary byte string. On Windows, it will be UTF-8.
Since 2.40
void g_subprocess_launcher_set_cwd (GSubprocessLauncher *self
,const gchar *cwd
);
Sets the current working directory that processes will be launched with.
By default processes are launched with the current working directory of the launching process at the time of launch.
Since 2.40
void g_subprocess_launcher_set_flags (GSubprocessLauncher *self
,GSubprocessFlags flags
);
Sets the flags on the launcher.
The default flags are G_SUBPROCESS_FLAGS_NONE
.
You may not set flags that specify conflicting options for how to
handle a particular stdio stream (eg: specifying both
G_SUBPROCESS_FLAGS_STDIN_PIPE
and
G_SUBPROCESS_FLAGS_STDIN_INHERIT
).
You may also not set a flag that conflicts with a previous call to a
function like g_subprocess_launcher_set_stdin_file_path()
or
g_subprocess_launcher_take_stdout_fd()
.
Since 2.40
void g_subprocess_launcher_set_stdin_file_path (GSubprocessLauncher *self
,const gchar *path
);
Sets the file path to use as the stdin for spawned processes.
If path
is NULL
then any previously given path is unset.
The file must exist or spawning the process will fail.
You may not set a stdin file path if a stdin fd is already set or if the launcher flags contain any flags directing stdin elsewhere.
This feature is only available on UNIX.
Since 2.40
void g_subprocess_launcher_take_stdin_fd (GSubprocessLauncher *self
,gint fd
);
Sets the file descriptor to use as the stdin for spawned processes.
If fd
is -1 then any previously given fd is unset.
Note that if your intention is to have the stdin of the calling
process inherited by the child then G_SUBPROCESS_FLAGS_STDIN_INHERIT
is a better way to go about doing that.
The passed fd
is noted but will not be touched in the current
process. It is therefore necessary that it be kept open by the
caller until the subprocess is spawned. The file descriptor will
also not be explicitly closed on the child side, so it must be marked
O_CLOEXEC if that's what you want.
You may not set a stdin fd if a stdin file path is already set or if the launcher flags contain any flags directing stdin elsewhere.
This feature is only available on UNIX.
Since 2.40
void g_subprocess_launcher_set_stdout_file_path (GSubprocessLauncher *self
,const gchar *path
);
Sets the file path to use as the stdout for spawned processes.
If path
is NULL
then any previously given path is unset.
The file will be created or truncated when the process is spawned, as would be the case if using '>' at the shell.
You may not set a stdout file path if a stdout fd is already set or if the launcher flags contain any flags directing stdout elsewhere.
This feature is only available on UNIX.
Since 2.40
void g_subprocess_launcher_take_stdout_fd (GSubprocessLauncher *self
,gint fd
);
Sets the file descriptor to use as the stdout for spawned processes.
If fd
is -1 then any previously given fd is unset.
Note that the default behaviour is to pass stdout through to the stdout of the parent process.
The passed fd
is noted but will not be touched in the current
process. It is therefore necessary that it be kept open by the
caller until the subprocess is spawned. The file descriptor will
also not be explicitly closed on the child side, so it must be marked
O_CLOEXEC if that's what you want.
You may not set a stdout fd if a stdout file path is already set or if the launcher flags contain any flags directing stdout elsewhere.
This feature is only available on UNIX.
Since 2.40
void g_subprocess_launcher_set_stderr_file_path (GSubprocessLauncher *self
,const gchar *path
);
Sets the file path to use as the stderr for spawned processes.
If path
is NULL
then any previously given path is unset.
The file will be created or truncated when the process is spawned, as would be the case if using '2>' at the shell.
If you want to send both stdout and stderr to the same file then use
G_SUBPROCESS_FLAGS_STDERR_MERGE
.
You may not set a stderr file path if a stderr fd is already set or if the launcher flags contain any flags directing stderr elsewhere.
This feature is only available on UNIX.
Since 2.40
void g_subprocess_launcher_take_stderr_fd (GSubprocessLauncher *self
,gint fd
);
Sets the file descriptor to use as the stderr for spawned processes.
If fd
is -1 then any previously given fd is unset.
Note that the default behaviour is to pass stderr through to the stderr of the parent process.
The passed fd
belongs to the GSubprocessLauncher. It will be
automatically closed when the launcher is finalized. The file
descriptor will also be closed on the child side when executing the
spawned process.
You may not set a stderr fd if a stderr file path is already set or if the launcher flags contain any flags directing stderr elsewhere.
This feature is only available on UNIX.
Since 2.40
void g_subprocess_launcher_take_fd (GSubprocessLauncher *self
,gint source_fd
,gint target_fd
);
Transfer an arbitrary file descriptor from parent process to the
child. This function takes "ownership" of the fd; it will be closed
in the parent when self
is freed.
By default, all file descriptors from the parent will be closed.
This function allows you to create (for example) a custom pipe()
or
socketpair()
before launching the process, and choose the target
descriptor in the child.
An example use case is GNUPG, which has a command line argument --passphrase-fd providing a file descriptor number where it expects the passphrase to be written.
void g_subprocess_launcher_set_child_setup (GSubprocessLauncher *self
,GSpawnChildSetupFunc child_setup
,gpointer user_data
,GDestroyNotify destroy_notify
);
Sets up a child setup function.
The child setup function will be called after fork()
but before
exec()
on the child's side.
destroy_notify
will not be automatically called on the child's side
of the fork()
. It will only be called when the last reference on the
GSubprocessLauncher is dropped or when a new child setup function is
given.
NULL
can be given as child_setup
to disable the functionality.
Child setup functions are only available on UNIX.
self |
||
child_setup |
a GSpawnChildSetupFunc to use as the child setup function |
|
user_data |
user data for |
|
destroy_notify |
a GDestroyNotify for |
Since 2.40


Chuck Schumer: Look out for Chinese-made over-the-counter meds
by Rachel GreenSen. Chuck Schumer on Sunday called on bargain stores to stop selling Chinese-made over-the-counter medications that may contain harmful ingredients.
The products in question include skin creams and cosmetics that can cause infections, nausea or other symptoms, according to Schumer, and which may be on the shelves of the 170 Dollar Tree and Family Dollar stores in New York City and nearby suburbs.
“You figure if you’re buying something without a prescription, it’s safe and it’s good,” said Schumer, standing outside a Dollar Tree in Harlem. “That is not necessarily the case when it comes to some of these products.
“What makes it even more serious is we don’t exactly know which ones might be dangerous because China has such poor labeling, you don’t know what they put into each of these drugs,” he said.
Representatives of Dollar Tree and Family Dollar did not immediately respond to requests for comment.


Calcoin is money that works for you, for everyone else, and for the people. Calcoin uses algorithms to increase and decrease the velocity of money. In recession, Calcoin increases the velocity of money by paying you for transactions, while during economic booms Calcoin makes transactions more expensive to prevent runaway upward movement.
The problem with current day financial architecture is that it abuses these natural cycles of the economy, short term incentives make politicians and regulators attempt to pursue upward economic growth at all costs, to help stabilize the value of the currency and the financial market, we created Cal Coin. This allows people to convert their tokens to a medium of exchange that is allowed to expand and contract to maintain inflation.
Navigate to the Features page to see what Calcoin does and how you can interact with it. For users who want a technical description feel free to browse the white paper for a technical description of the mechanics and code behind Calcoin.


--- layout: newsstory title: SOME GOOD NEWS AT LAST match: FAT Bromsgrove 2 Yeltz 5 ---
A first Trophy victory for 4 years and a little gloom has been lifted. An emphatic 5-2 victory over struggling Bromsgrove and at least we have something positive to look forward to for the rest of the season. Scorers were Crispy , Clinton Thomas (2) , one from Lyndon Rowlands and an own goal .
We're not playing for a couple of weeks, so maybe it'll give us chance to recharge our batteries, sort out a few injuries and start climbing back up the table.
LATE NEWS: We've been drawn at home to Sutton Coldfield in the next round of the FA Trophy - the match will take place on November 27. Not a bad draw at all.


Segmented skirts (either skirts which consist of four or more overlapping "petal" strips, or actual plates of armour, which come down from the waistband) are often used as a way to make a suit of armour more feminine by adding in an armoured skirt, or, conversely, to mark out one of a group of fabric skirt wearers as tougher than the rest, without breaking the theme by giving her trousers. The correct name for the segments are pteruges.
The reason for this trope is a short dress is a popular choice of outfit for an Action Girl, however, it is rather impractical and might look a bit too feminine for some characters. This trope is often used as a compromise, as it resembles, or often actually is, armour and thus it looks less feminine than a typical dress. An added bonus is that it looks more practical since the segments won't restrict the wearer's movements.
This trope is also more likely to be combined with Skirt over Slacks or Modesty Shorts compared to other dress related tropes, either to re-enforce the idea that it's part of a suit of armour or for modesty.
A Sister Trope to Battle Ballgown, Minidress of Power.
Compare Showgirl Skirt, Pimped-Out Dress, Man in a Kilt, Pretty Princess Powerhouse.
Contrast Chainmail Bikini (although this skirt can be paired with otherwise skimpy armor).
Examples:
- In Bleach, Tier Harribel gets one in her Resurrección. Her Fracción, Mila-Rose, also wears one in her unreleased form.
- Supergirl wears a red and golden armoured skirt during her Amazon training in The Supergirl from Krypton.
- All of Wonder Woman's outfits tend towards this or Leotard of Power.
- In The Legend of Wonder Woman (2016) everything Alcippe and Antiope wears has some elements of pteruges until Alcippe ends up as Diana's Spirit Advisor a state in which she wears a flowing black dress.
- In Wonder Girl Vol. 1 Hercules gives Cassie some feminine armor with pteruges that are reminiscent of his own costume claiming it to be a gift from the gods while trying to force her to accept her "destiny" as their father Zeus sees it. While she does don the new costume she rejects Herc and Zeus's attempts to control her.
- Wonder Woman (1987): Prior to the royal family mix up resulting from the events of The Contest Hippolyta often wore golden armor with gold and purple pteruges.
- Wonder Woman (Rebirth): Diana finally switches up her main costume to include navy pteruges.
- The female legionaries in Asterix and the Secret Weapon wear legionary armour that resembles miniskirts and leggings, as they're all huge, model-esque Statuesque Stunners - the similar outfit is drawn to look realistically protective, square and usually rather dumpy on the male legionaries throughout the series. The female centurion has one of these, plus a moulded centurion plate that resembles a woman's torso.
- Astrid in How to Train Your Dragon wears one, featured above. With spikes. She's as tough as any of the other characters, if not tougher. In the sequel◊, it's paired with a fur underskirt (without making her look any less tough).
- Sif's battle armour in Thor: The Dark World includes a segmented skirt made of cloth with mail underneath.
- DC Extended Universe: Diana of Themyscira/Wonder Woman (Gal Gadot) wears a short version with no pants underneath, not that she needs that much armour, with her powers.
- In Wonder Woman and Justice League, most of the Amazons wear either this or leather pants. Justified, since they are based on Roman soldiers.
- Female members of the Watch in Terry Pratchett's Discworld are generally drawn wearing armour with this, cf Captain Angua, although the text doesn't specifically say so (except for Corporal Littlebottom, the only dwarf in the Watch who is openly female, and who therefore makes a point of wearing a leather skirt).
- Journey to Chaos: All five members of Ataidar's Ordercraft Security and Compliance Team wear pteruges as part of their uniform. It's a symbolic piece of equipment that shows the four animals of Avatar Alliance's Justice Station.
- Xena: Warrior Princess tended to have these in her outfits. Her sidekick Gabrielle also wore a few.
- In Hercules: The Legendary Journeys Atalanta has a very very brief skirt like this.
- Kaamelott has the Britons using this as an insult against the Romans, seeing as they run around in dresses and big feathery hats. The Man in a Kilt trope is used for a one-time gag when the Scottish king is forced to show up at the Round Table in a blanket instead of armored pants, and declares it the national dress in order to be able to participate.
- Josie Wahlford had a "Minerva" gimmick, which of course came with large pointed skirt tassels and a strap across her shoulder, even though her low cut (not that low; this was the 1890s) leotard didn't need it to be held up.
- Fantasia has a set of red and orange ring gear designed to look like fire and its singlet ends in skirt-like tassels.
- Amazing/Awesome Kong has several sets of leather warrior skirt ring gear. They're tough enough to protect her from collisions with the spikes of the Midwest Militia\Made In Sin\Valkyrie.
- The Native Beast Nyla Rose has at least one set of ring gear like this, which she paints to give the appearance of being stained with blood(the real blood gets washed out, for sanitary reasons)
- DASH Chisako wears tassels around her hips, giving her a look that's halfway this and halfway Dangerously Short Skirt.
- WWC Tag Team Champions Doom Patrol reinforce that this look isn't just for ladies, and like to flick their "armored skirts" up in the direction of the audience and or their opponents if they get a lead while running away. Their manager Krystal de la Potra sometimes dresses the same way though, giving us another female example.
- Kimber Lee took up the segmented skirt look during her "crown jewel" gimmick.
- Pathfinder features among its light armor selection the Armored Kilt, which gives a small bonus to armor that can stack with existing light or medium armor, but carries a number of drawbacks. Notably, it increases the armor's encumbrance category by one step and is unable to be added to heavy armor. However, it still has a niche as it generally allows for higher AC on high-dexterity characters than a comparable set of standard armor. It can also be worn by arcane spellcasters without incurring a chance of their spells failing, giving a more convenient base item to enchant with defensive abilities than the traditional bracers of armour.
- In The Legend of Dragoon, Dark Action Girl Rose sports this trope as part of her armour.
- Charme the Thief from Recettear wears a black segmented skirt with many belts and pouches holding the top part in place (and a second, purple, example underneath the first). This contrasts the other female adventurers; Nagi and Tielle.
- In Titan Quest some of the armors will look this way on a female character. Justified by the setting and the fact that all armors in-game are pretty much unisex.
- The Amazon player class from Diablo II wears one.
- In Persona 4, Chie's Persona, Tomoe Gozen is represented as a female warrior wearing one of these.
- Aika from Skies of Arcadia wears a dress that follows the non-armour variant of this trope (with a large belt to hold it in place). She's the tomboy to Fina's girly-girl (doing more physical damage but having less powerful magic than her).
- Leliana from Dragon Age: Origins, although the leather straps don't overlap so much...
- The Amazonian Armor from Drakensang: the upper part is a metallic corset, the lower one is a multi-segmented leather skirt.
- Male version: Barbarians of both genders in EverQuest wear kilts. ALWAYS. If it isn't a cloth kilt, it's a leather kilt. If it isn't a leather kilt, it's a chainmail kilt. if it isn't a chain kilt, it's a platemail kilt that comes included with the greaves and breastplate.
- Female members of the Imperial Legion in The Elder Scrolls V: Skyrim qualify, predominantly Legate Rikke.
- In Ultra Street Fighter IV, Decapre's alternate costume features a skimpy version of this style.
- Aloy of Horizon Zero Dawn has this as her defining look; every single Outfit in the game has it, all with differing designs from simple ribbon-like strips all the way to scale mail armour.
- In Rusty and Co., Madeline's attire in both appearances.
- In the Whateley Universe, Fey tries out a costume with this feature in "The Turks or the Geek". Phase points out the skirt-like thing is technically called 'pteryges' from the Greek, but Phase tends to be Mister Exposition when given the chance.
- RWBY:
- Yang's from team RWBY's skirt is missing a few segments, but her shorts make up for this by having a segmented pattern around each leg. Appropriately, her fighting style and personality make her easily the most aggressive member of the team.
- Pyrrha Nikos of team JNPR's outfit resembles a Greek Hoplite. She acts like more of a "soldier" compared to JNPR's other female member, Nora.
- In Justice League Action Wonder Woman wears a blue skirt of pteruges to make her outfit more feminine and look less like a swimsuit like the most well-known version of her costume.


Structure
| Namespaces | 15 | |
| Interfaces | 6 | |
| Traits | 0 | |
| Classes | 484 | |
| Abstract Classes | 7 | (1.45%) |
| Concrete Classes | 477 | (98.55%) |
| Methods | 3508 | |
| Scope | ||
| Non-Static Methods | 3508 | (100%) |
| Static Methods | 0 | (0%) |
| Visibility | ||
| Public Method | 3473 | (99%) |
| Non-Public Methods | 35 | (1%) |
| Functions | 1 | |
| Named Functions | 0 | (0%) |
| Anonymous Functions | 1 | (100%) |
| Constants | 13 | |
| Global Constants | 0 | (0%) |
| Class Constants | 13 | (100%) |
Tests
| Classes | 0 | |
| Methods | 0 |
Size
| Lines of Code (LOC) | 62838 | |
| Comment Lines of Code (CLOC) | 40906 | (65.1%) |
| Non-Comment Lines of Code (NCLOC) | 21932 | (34.9%) |
| Logical Lines of Code (LLOC) | 5097 | (8.11%) |
| Classes | 4273 | (83.83%) |
| Average Class Length | 9 | |
| Average Method Length | 1 | |
| Functions | 0 | (0%) |
| Average Function Length | 0 | |
| Not in classes or functions | 824 | (16.17%) |
Complexity
| Cyclomatic Complexity / LLOC | 0.06 | |
| Cyclomatic Complexity / Number of Methods | 0 |
Dependencies
| Global Accesses | 0 | |
| Global Constants | 0 | (0%) |
| Global Variables | 0 | (0%) |
| Super-Global Variables | 0 | (0%) |
| Attribute Accesses | 289 | |
| Non-Static | 286 | (98.96%) |
| Static | 3 | (1.04%) |
| Method Calls | 3896 | |
| Non-Static | 3679 | (94.43%) |
| Static | 217 | (5.57%) |


Hi, I'm Ivan Jimenez
Contact
Personalize Theme
*Theme settings will be saved for
your next visit
right-column
About
Portfolio
Contact


|
Chirp SonicLib
2.1.0
|
Chirp SonicLib is a set of API functions and sensor driver routines designed to easily control Chirp ultrasonic sensors from an embedded C application. It allows an application developer to obtain ultrasonic range data from one or more devices, without needing to develop special low-level code to interact with the sensors directly.
The SonicLib API functions provide a consistent interface for an application to use Chirp sensors in various situations. This is especially important, because all Chirp sensors are completely software-defined, including the register map. The SonicLib interfaces allow an application to use different Chirp sensor firmware images, without requiring code changes. Only a single initialization parameter must be modified, and one line added to a header file, to use a new sensor firmware version.
The main documentation for the SonicLib API may be found in the soniclib.h header file. That file contains definitions of all public interfaces that applications use to interact with the sensor.
SonicLib also defines a set of board support package (BSP) functions that are specific to the hardware platform being used. The chirp_bsp.h file contains the definitions of these hardware interfaces. These interfaces allow the standard SonicLib functions to interact with the peripheral devices and other resources on the board. The BSP implementation is NOT part of SonicLib, and must be provided by the developer, board vendor, or Chirp. Contact Chirp for more information on available BSPs.
SonicLib includes internal driver functions to interact directly with the sensor. These modules are distributed as source code, to simplify integration with your embedded application and for reference only. These functions are described in the ch_driver.h header file. You should not modify these functions or call them directly from your application.
suppo rt@c hirpm icro .com
© Copyright 2016-2020, Chirp Microsystems. All rights reserved.


Hello fault-tolerant world!
My Paste title
this is the paste text
My Paste title
this is the paste text
My Paste title
this is the paste text


postman
Ping
Subscribe [ test ]
Unsubscribe [ test ]
Publish [ to test ]
recieve message from Postman...
Clear


| 1157 | (A) | Fyve thowsande feghttynge men aythir freke hade |
| 1160 | (C) | Fyfty thowsande of fyȝtynge menne . eche of hem hadde |
| 1143 | (D) | Fyfty thowsand of folk eche a freke had |
| 1120 | (E) | Fyfty þowsynd of foolk . eche of hem ladde |
| (Ex) | ---- no text ---- | |
| 1181 | (L) | XV þousand men eche freke hadde |
| (P) | ---- no text ---- | |
| 1131 | (U) | Fyfty thousand of men / ilk a freke had |
| 221 | (V) | v . Mille . of fyghtande men . aither freek hadde |


Quick Vote Records by {{ user.username }}
{% include "dashboard-functions.html" %}| Course | Vote as | Vote time | Detail |
|---|---|---|---|
| {{ vote.course.course_name_en }} | {% if vote.vote_status == True %} Up Vote {% else %} Down Vote {% endif %} | {{ vote.vote_date }} | Detail |
| No vote record |


Web-based Circuit Simulator
With inspiration, I want to learn how to develop a circuit simulator. Through documenting the process, I hope that it could serve as a useful and clear guideline on how to develop a circuit sim, too. This should not be confused with my past personal project - 'Sirkit Circuit Simulator'.
Getting Started
These instructions will get you a copy of the project up and running on your local machine for development and testing purposes.
Prerequisites
You'll need the following installed on your machine to run this project.
- Node.js [https://nodejs.org/en/]
- Node Package Manager (from Node.js' installer)
Test that you can access Node and npm from your command prompt:
node --version
npm --version
Should there be an error saying either or both of them not recognised as a command, do check your Environment Variable's PATH to ensure that the locations of Node.js and NPM are present there. Refer to this for Node, and this for NPM.
Installing
- Pull / Download the project into your machine
- Open command prompt on the project's directory
- Download and install the dependencies of this project by running
npm install
in the command prompt - Done! Hopefully nothing has crashed and burn at this point.
Running the tests
- Run
npm run live-test
in the command prompt and it should start up a chrome browser that is used to run the tests (might take a minute or two) - Tests are automatically run on code changes
- Click on the 'DEBUG' button on the top right to view the test report (needs page refresh to see changes)
To end the test, press CTRL-C
in your command prompt to end the session.
Authors
- Seck Wei Lim - Github
Acknowledgments
- Thom Wright - open source Javascript circuit simulator [link]


OpenHome is the future of streaming audio - an Open Platform providing audiophile quality hi-res digital music.
Multi-room audio. Managed Playlists. Internet streaming services. It's all here in the OpenHome audio platform. Whether you're a consumer, platform developer or audio manufacturer we have all you need to get started with OpenHome. Enjoy the ride!
-
Use
Want to try out OpenHome for yourself?
Get the app
Download our demo players for Mac, PC or Linux and enjoy audiophile quality hi-res audio. If you like to get your geek on, there's also a player for the Raspberry Pi. -
Develop
OpenHome is all about the sound, giving you the power to make high quality streaming audio products. Check out our developer site for all the info you need to get started - documentation, SDK downloads and more.
Get the code -
Customise
OpenHome gives you full control over your product features and timescales, but if you don't have the resources or experience to cover everything yourself then check out the link below to explore our engineering and support packages.
Get some help


--- subject: Ulster University Alumni and Supporters --- Alumni Benefits and Services %globals_asset_assetid:142048^as_asset:asset_metadata_Description% Get Involved Update Your Details


In this project, you'll define and train a DCGAN on a dataset of faces. Your goal is to get a generator network to generate new images of faces that look as realistic as possible!
The project will be broken down into a series of tasks from loading in data to defining and training adversarial networks.
You'll be using the CelebFaces Attributes Dataset (CelebA) to train your adversarial networks.
This dataset is more complex than the number datasets (like MNIST or SVHN) you've been working with, and so, you should prepare to define deeper networks and train them for a longer time to get good results. It is suggested that you utilize a GPU for training.
Since the project's main focus is on building the GANs, we've done some of the pre-processing for you. Each of the CelebA images has been cropped to remove parts of the image that don't include a face, then resized down to 64x64x3 NumPy images. Some sample data is show below.
If you are working locally, you can download this data by clicking here
This is a zip file that you'll need to extract in the home directory of this notebook for further loading and processing. After extracting the data, you should be left with a directory of data processed_celeba_small/
# can comment out after executing
!wget https://s3.amazonaws.com/video.udacity-data.com/topher/2018/November/5be7eb6f_processed-celeba-small/processed-celeba-small.zip
!wget https://raw.githubusercontent.com/thanakijwanavit/deep-learning-v2-pytorch/master/project-face-generation/problem_unittests.py
!rm -rf *.1
!unzip -qu processed-celeba-small.zip
data_dir = 'processed_celeba_small/'
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
import pickle as pkl
import matplotlib.pyplot as plt
import numpy as np
import problem_unittests as tests
#import helper
%matplotlib inline
The CelebA dataset contains over 200,000 celebrity images with annotations. Since you're going to be generating faces, you won't need the annotations, you'll only need the images. Note that these are color images with 3 color channels (RGB)#RGB_Images) each.
Since the project's main focus is on building the GANs, we've done some of the pre-processing for you. Each of the CelebA images has been cropped to remove parts of the image that don't include a face, then resized down to 64x64x3 NumPy images. This pre-processed dataset is a smaller subset of the very large CelebA data.
There are a few other steps that you'll need to transform this data and create a DataLoader.
get_dataloader
function, such that it satisfies these requirements:¶image_size x image_size
in the x and y dimension.To create a dataset given a directory of images, it's recommended that you use PyTorch's ImageFolder wrapper, with a root directory processed_celeba_small/
and data transformation passed in.
# necessary imports
import torch
from torchvision import datasets
from torchvision import transforms
from torch.utils.data import DataLoader
import os
def get_dataloader(batch_size, image_size, data_dir='processed_celeba_small/', num_workers = 0):
"""
Batch the neural network data using DataLoader
:param batch_size: The size of each batch; the number of images in a batch
:param img_size: The square size of the image data (x, y)
:param data_dir: Directory where image data is located
:return: DataLoader with batched data
"""
# TODO: Implement function and return a dataloader
# resize and normalize the images
transform = transforms.Compose([transforms.Resize(image_size), # resize to 128x128
transforms.ToTensor()])
# get training and test directories
image_path = './' + data_dir
celeba_image_path = os.path.join(image_path, 'celeba')
# define datasets using ImageFolder
celeba_dataset = datasets.ImageFolder(celeba_image_path, transform)
# create and return DataLoaders
celeba_loader = DataLoader(dataset=celeba_dataset, batch_size=batch_size, shuffle=True, num_workers=num_workers)
return celeba_loader
celeba_train_loader
with appropriate hyperparameters.¶Call the above function and create a dataloader to view images.
batch_size
parameterimage_size
must be 32
. Resizing the data to a smaller size will make for faster training, while still creating convincing images of faces!#  You should seen square images of somewhat-centered faces.
Note: You'll need to convert the Tensor images into a NumPy type and transpose the dimensions to correctly display an image, suggested imshow
code is below, but it may not be perfect.
# helper display function
def imshow(img):
npimg = img.numpy()
plt.imshow(np.transpose(npimg, (1, 2, 0)))
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
# obtain one batch of training images
dataiter = iter(celeba_train_loader)
images, _ = dataiter.next() # _ for no labels
# plot the images in the batch, along with the corresponding labels
fig = plt.figure(figsize=(20, 4))
plot_size=20
for idx in np.arange(plot_size):
ax = fig.add_subplot(2, plot_size/2, idx+1, xticks=[], yticks=[])
imshow(images[idx])
You need to do a bit of pre-processing; you know that the output of a tanh
activated generator will contain pixel values in a range from -1 to 1, and so, we need to rescale our training images to a range of -1 to 1. (Right now, they are in a range from 0-1.)
# TODO: Complete the scale function
def scale(x, feature_range=(-1, 1)):
''' Scale takes in an image x and returns that image, scaled
with a feature_range of pixel values from -1 to 1.
This function assumes that the input x is already scaled from 0-1.'''
# assume x is scaled to (0, 1)
# scale to feature_range and return scaled x
min, max = feature_range
x = x * (max - min) + min
return x
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
# check scaled range
# should be close to -1 to 1
img = images[0]
scaled_img = scale(img)
print('Min: ', scaled_img.min())
print('Max: ', scaled_img.max())
A GAN is comprised of two adversarial networks, a discriminator and a generator.
Your first task will be to define the discriminator. This is a convolutional classifier like you've built before, only without any maxpooling layers. To deal with this complex data, it's suggested you use a deep network with normalization. You are also allowed to create any helper functions that may be useful.
import torch.nn as nn
import torch.nn.functional as F
def conv(in_channels, out_channels, kernel_size, stride=2, padding=1, batch_norm=True):
"""Creates a convolutional layer, with optional batch normalization.
"""
layers = []
conv_layer = nn.Conv2d(in_channels=in_channels, out_channels=out_channels,
kernel_size=kernel_size, stride=stride, padding=padding, bias=False)
layers.append(conv_layer)
if batch_norm:
layers.append(nn.BatchNorm2d(out_channels))
return nn.Sequential(*layers)
class Discriminator(nn.Module):
def __init__(self, conv_dim):
"""
Initialize the Discriminator Module
:param conv_dim: The depth of the first convolutional layer
"""
super(Discriminator, self).__init__()
# complete init function
ll = [3,conv_dim,2*conv_dim,4*conv_dim,8*conv_dim]
self.cv1 = conv(ll[0],ll[1],4, batch_norm=False)
self.cv2 = conv(ll[1],ll[2],4)
self.cv3 = conv(ll[2],ll[3],4)
self.cv4 = conv(ll[3],ll[4],4)
self.cv5 = conv(ll[4],1,4, stride=1, batch_norm=False)
def forward(self, x):
"""
Forward propagation of the neural network
:param x: The input to the neural network
:return: Discriminator logits; the output of the neural network
"""
# define feedforward behavior
x = self.cv1(x)
x = F.leaky_relu(x, 0.2)
x = self.cv2(x)
x = F.leaky_relu(x, 0.2)
x = self.cv3(x)
x = F.leaky_relu(x, 0.2)
x = self.cv4(x)
x = F.leaky_relu(x, 0.2)
x = self.cv5(x)
x = torch.flatten(x,1,3)
return x
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_discriminator(Discriminator)
_input = torch.randn(1, 10, 12,34)
unfold = nn.Unfold(kernel_size=(2,3))
_output = unfold(_input)
print(_output.size())
_output = torch.flatten(_output,1,2)
print(_output.size())
The generator should upsample an input and generate a new image of the same size as our training data 32x32x3
. This should be mostly transpose convolutional layers with normalization applied to the outputs.
z_size
32x32x3
def deconv(in_channels, out_channels, kernel_size, stride=2, padding=1, batch_norm=True):
"""Creates a transpose convolutional layer, with optional batch normalization.
"""
layers = []
# append transpose conv layer
layers.append(nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride, padding, bias=False))
# optional batch norm layer
if batch_norm:
layers.append(nn.BatchNorm2d(out_channels))
return nn.Sequential(*layers)
class Generator(nn.Module):
def __init__(self, z_size, conv_dim):
"""
Initialize the Generator Module
:param z_size: The length of the input latent vector, z
:param conv_dim: The depth of the inputs to the *last* transpose convolutional layer
"""
super(Generator, self).__init__()
self.conv_dim = conv_dim
# 3. Define the decoder part of the generator
# two transpose convolutional layers and a third that looks a lot like the initial conv layer
self.fc = nn.Linear(z_size, conv_dim*4*4*4)
self.deconv1 = deconv(conv_dim*4, conv_dim*2, 4)
self.deconv2 = deconv(conv_dim*2, conv_dim, 4)
# no batch norm on last layer
self.deconv3 = deconv(conv_dim, 3, 4, batch_norm=False)
def forward(self, x):
"""
Forward propagation of the neural network
:param x: The input to the neural network
:return: A 32x32x3 Tensor image as output
"""
x = self.fc(x)
x = x.view(-1, self.conv_dim*4, 4, 4)
x = F.relu(self.deconv1(x))
x = F.relu(self.deconv2(x))
x = F.tanh(self.deconv3(x))
return x
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_generator(Generator)
To help your models converge, you should initialize the weights of the convolutional and linear layers in your model. From reading the original DCGAN paper, they say:
All weights were initialized from a zero-centered Normal distribution with standard deviation 0.02.
So, your next task will be to define a weight initialization function that does just this!
You can refer back to the lesson on weight initialization or even consult existing model code, such as that from the networks.py
file in CycleGAN Github repository to help you complete this function.
from torch.nn import init
def weights_init_normal(m):
"""
Applies initial weights to certain layers in a model .
The weights are taken from a normal distribution
with mean = 0, std dev = 0.02.
:param m: A module or layer in a network
"""
init_bias = 0.01
std = 0.02
# classname will be something like:
# `Conv`, `BatchNorm2d`, `Linear`, etc.
classname = m.__class__.__name__
# print(classname)
# TODO: Apply initial weights to convolutional and linear layers
# if "Conv" in classname:
# nn.init.normal_(m.weight.data, std=std)
# print(classname ," is initiated")
# elif "Linear" in classname:
# nn.init.normal_(m.weight.data, std=std)
# print(classname ," is initiated")
# elif "Batch" in classname:
# nn.init.normal_(m.weight.data, 1.0, init_bias)
# print(classname ," is initiated")
# else:
# pass
# torch.nn.init.xavier_normal(m.weight.data)
# m.bias.data.fill_(0.01)
isConvolution = classname.find('Conv') != -1
isLinear = classname.find('Linear') != -1
if (hasattr(m, 'weight') and isConvolution or isLinear):
init.normal_(m.weight.data, 0.0, 0.02)
Define your models' hyperparameters and instantiate the discriminator and generator from the classes defined above. Make sure you've passed in the correct input arguments.
 Here, we'll set this as a boolean variable train_on_gpu
. Later, you'll be responsible for making sure that
- Models,
- Model inputs, and
- Loss function arguments
Are moved to GPU, where appropriate.
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
import torch
# Check for a GPU
train_on_gpu = torch.cuda.is_available()
if not train_on_gpu:
print('No GPU found. Please use a GPU to train your neural network.')
else:
print('Training on GPU!')
Now we need to calculate the losses for both types of adversarial networks.
- For the discriminator, the total loss is the sum of the losses for real and fake images,
d_loss = d_real_loss + d_fake_loss
.- Remember that we want the discriminator to output 1 for real images and 0 for fake images, so we need to set up the losses to reflect that.
The generator loss will look similar only with flipped labels. The generator's goal is to get the discriminator to think its generated images are real.
You may choose to use either cross entropy or a least squares error loss to complete the following real_loss
and fake_loss
functions.
def real_loss(D_out):
'''Calculates how close discriminator outputs are to being real.
param, D_out: discriminator logits
return: real loss'''
labels = torch.ones(D_out.size(0))
labels = labels.to('cuda')
# criterion = nn.MSELoss()
criterion = nn.BCEWithLogitsLoss()
loss = criterion(D_out.squeeze(), labels)
return loss
def fake_loss(D_out):
'''Calculates how close discriminator outputs are to being fake.
param, D_out: discriminator logits
return: fake loss'''
labels = torch.zeros(D_out.size(0)).to('cuda')
# criterion = nn.MSELoss()
criterion = nn.BCEWithLogitsLoss()
loss = criterion(D_out.squeeze(), labels)
return loss
import torch.optim as optim
lr=0.0002
beta1=0.5
beta2=0.999 # default value
# Create optimizers for the discriminator D and generator G
d_optimizer = optim.Adam(D.parameters(), lr, [beta1, beta2])
g_optimizer = optim.Adam(G.parameters(), lr, [beta1, beta2])
Training will involve alternating between training the discriminator and the generator. You'll use your functions real_loss
and fake_loss
to help you calculate the discriminator losses.
You've been given some code to print out some loss statistics and save some generated "fake" samples.
Keep in mind that, if you've moved your models to GPU, you'll also have to move any model inputs to GPU.
def train(D, G, n_epochs, print_every=50):
'''Trains adversarial networks for some number of epochs
param, D: the discriminator network
param, G: the generator network
param, n_epochs: number of epochs to train for
param, print_every: when to print and record the models' losses
return: D and G losses'''
# move models to GPU
if train_on_gpu:
D.cuda()
G.cuda()
# keep track of loss and generated, "fake" samples
samples = []
losses = []
# Get some fixed data for sampling. These are images that are held
# constant throughout training, and allow us to inspect the model's performance
sample_size=16
fixed_z = np.random.uniform(-1, 1, size=(sample_size, z_size))
fixed_z = torch.from_numpy(fixed_z).float()
# move z to GPU if available
if train_on_gpu:
fixed_z = fixed_z.cuda()
# epoch training loop
for epoch in range(n_epochs):
# batch training loop
for batch_i, (real_images, _) in enumerate(celeba_train_loader):
batch_size = real_images.size(0)
real_images = scale(real_images)
# ===============================================
# YOUR CODE HERE: TRAIN THE NETWORKS
# ===============================================
d_optimizer.zero_grad()
real_images = real_images.to('cuda')
z = torch.randn(batch_size,z_size).to('cuda')
# gen fake image
dr = D(real_images)
df = D(G(z))
# 1. Train the discriminator on real and fake images
d_loss = real_loss(dr) + fake_loss(df)
d_loss.backward()
d_optimizer.step()
# 2. Train the generator with an adversarial loss
g_optimizer.zero_grad()
z = torch.randn(batch_size,z_size).to('cuda')
df2 = D(G(z))
g_loss = real_loss(df2)
g_loss.backward()
g_optimizer.step()
# ===============================================
# END OF YOUR CODE
# ===============================================
# Print some loss stats
if batch_i % print_every == 0:
# append discriminator loss and generator loss
losses.append((d_loss.item(), g_loss.item()))
# print discriminator and generator loss
print('Epoch [{:5d}/{:5d}] | d_loss: {:6.4f} | g_loss: {:6.4f}'.format(
epoch+1, n_epochs, d_loss.item(), g_loss.item()))
## AFTER EACH EPOCH##
# this code assumes your generator is named G, feel free to change the name
# generate and save sample, fake images
G.eval() # for generating samples
samples_z = G(fixed_z)
samples.append(samples_z)
G.train() # back to training mode
# Save training generator samples
with open('train_samples.pkl', 'wb') as f:
pkl.dump(samples, f)
# finally return losses
return losses
Set your number of training epochs and train your GAN!
# set number of epochs
n_epochs = 20
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
# call training func tion
losses = train(D, G, n_epochs=n_epochs)
Plot the training losses for the generator and discriminator, recorded after each epoch.
fig, ax = plt.subplots()
losses = np.array(losses)
plt.plot(losses.T[0], label='Discriminator', alpha=0.5)
plt.plot(losses.T[1], label='Generator', alpha=0.5)
plt.title("Training Losses")
plt.legend()
View samples of images from the generator, and answer a question about the strengths and weaknesses of your trained models.
# helper function for viewing a list of passed in sample images
def view_samples(epoch, samples):
fig, axes = plt.subplots(figsize=(16,4), nrows=2, ncols=8, sharey=True, sharex=True)
for ax, img in zip(axes.flatten(), samples[epoch]):
img = img.detach().cpu().numpy()
img = np.transpose(img, (1, 2, 0))
img = ((img + 1)*255 / (2)).astype(np.uint8)
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
im = ax.imshow(img.reshape((32,32,3)))
# Load samples from generator, taken while training
with open('train_samples.pkl', 'rb') as f:
samples = pkl.load(f)
_ = view_samples(-1, samples)
When you answer this question, consider the following factors:
Answer: (Write your answer in this cell)
When submitting this project, make sure to run all the cells before saving the notebook. Save the notebook file as "dlnd_face_generation.ipynb" and save it as a HTML file under "File" -> "Download as". Include the "problem_unittests.py" files in your submission.
import os
os.system('jupyter nbconvert --to html face_generation.ipynb')
os.listdir()


Class containing a Naive Bayesian classifier. More...
#include <classifier.h>
Public Member Functions | |
| std::string | classify (std::string example) |
| Method classifying a given test example. More... | |
| void | init (std::string attributes, std::string categories, std::string examples_dir, int examples_num) |
| Method for classifier initialization. More... | |
| void | loadAttributes (std::string attributes) |
| Method loading attributes from a given file. More... | |
| void | loadCategories (std::string categories) |
| Method loading categories from a given file. More... | |
| void | loadExample (std::string example) |
| Method loading an example from a given file. More... | |
Private Attributes | |
| std::map< std::string, int > | _attrib_index |
| Domains | _attribs |
| AttrDomain | _cat |
| std::map< std::string, int > | _cat_index |
| std::vector< std::string > | _cat_list |
| ExamplesTrain | _ex |
| NBint * | _nb |
Class containing a Naive Bayesian classifier.
Class contains a Naive Bayesian classifier from faif library and provides methods for creating and training the classifier and later classifyinf given examples.
Definition at line 27 of file classifier.h.
| std::string Classifier::classify | ( | std::string | example | ) |
Method classifying a given test example.
Loads the example from the given file into the internal faif::ml::NaiveBayesian<faif::ValueNominal<int>>ExampleTest object.
| example | name of the file with the test example |
Definition at line 123 of file classifier.cpp.
| void Classifier::init | ( | std::string | attributes, |
| std::string | categories, | ||
| std::string | examples_dir, | ||
| int | examples_num | ||
| ) |
Method for classifier initialization.
Initializes the classifier with given attribute list, categories and trains the classifier on a number of examples in the given directory.
| attributes | name of the file listing all attributes |
| categories | name of the file listing all categories |
| examples_dir | directory containing examples |
| examples_num | number of examples to be used (and available in the examples_dir) |
Definition at line 15 of file classifier.cpp.
| void Classifier::loadAttributes | ( | std::string | attributes | ) |
Method loading attributes from a given file.
Loads attributes from the given file into the internal faif::ml::NaiveBayesian<faif::ValueNominal<int>>Domains object.
| attributes | name of the file listing all attributes |
Definition at line 40 of file classifier.cpp.
| void Classifier::loadCategories | ( | std::string | categories | ) |
Method loading categories from a given file.
Loads categories from the given file into the internal faif::ml::NaiveBayesian<faif::ValueNominal<int>>AttrDomain object.
| categories | name of the file listing all categories |
Definition at line 67 of file classifier.cpp.
| void Classifier::loadExample | ( | std::string | example | ) |
Method loading an example from a given file.
Loads an example from the given file into the internal faif::ml::NaiveBayesian<faif::ValueNominal<int>>ExamplesTrain object.
| example | name of the file with the example |
Definition at line 97 of file classifier.cpp.
|
private |
Definition at line 41 of file classifier.h.
|
private |
Definition at line 40 of file classifier.h.
|
private |
Definition at line 39 of file classifier.h.
|
private |
Definition at line 42 of file classifier.h.
|
private |
Definition at line 43 of file classifier.h.
|
private |
Definition at line 44 of file classifier.h.
|
private |
Definition at line 45 of file classifier.h.